appium-uiautomator2-driver 1.65.0 → 1.66.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.
package/README.md CHANGED
@@ -125,7 +125,7 @@ appium:noSign | Set it to `true` in order to skip application signing. By defaul
125
125
 
126
126
  Capability Name | Description
127
127
  --- | ---
128
- appium:skipUnlock | Whether to skip the check for lock screen presence (`true`). By default UiAutomator2 driver tries to detect if the device's screen is locked before starting the test and to unlock that (which sometimes might be unstable). Note, that this operation takes some time, so it is highly recommended to set this capability to `false` and disable screen locking on devices under test.
128
+ appium:skipUnlock | Whether to skip the check for lock screen presence (`true`). By default UiAutomator2 driver tries to detect if the device's screen is locked before starting the test and to unlock that (which sometimes might be unstable). Note, that this operation takes some time, so it is highly recommended to set this capability to `true` and disable screen locking on devices under test.
129
129
  appium:unlockType | Set one of the possible types of Android lock screens to unlock. Read the [Unlock tutorial](https://github.com/appium/appium-android-driver/blob/master/docs/UNLOCK.md) for more details.
130
130
  appium:unlockKey | Allows to set an unlock key. Read the [Unlock tutorial](https://github.com/appium/appium-android-driver/blob/master/docs/UNLOCK.md) for more details.
131
131
  appium:unlockSuccessTimeout | Maximum number of milliseconds to wait until the device is unlocked. `2000` ms by default
@@ -331,7 +331,7 @@ Scrolls the given scrollable element until an element identified by `strategy` a
331
331
 
332
332
  Name | Type | Required | Description | Example
333
333
  --- | --- | --- | --- | ---
334
- element | string | no | The identifier of the scrollable element. It is required this element is a valid scrollable container and it was located by `-android uiautomator` strategy. If this property is not provided then the first currently available scrollable view is selected for the interaction. | 123456-3456-3435-3453453
334
+ elementId | string | no | The identifier of the scrollable element. It is required this element is a valid scrollable container and it was located by `-android uiautomator` strategy. If this property is not provided then the first currently available scrollable view is selected for the interaction. | 123456-3456-3435-3453453
335
335
  strategy | string | yes | The following strategies are supported: `accessibility id` (UiSelector().description), `class name` (UiSelector().className), `-android uiautomator` (UiSelector) | 'accessibility id'
336
336
  selector | string | yes | The corresponding lookup value for the selected strategy. | 'com.mycompany:id/table'
337
337
  maxSwipes | number | no | The maximum number of swipes to perform on the target scrollable view in order to reach the destination element. In case this value is unset then it would be retrieved from the scrollable element itself (vua `getMaxSearchSwipes()` property). | 10
package/build/index.js CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
4
 
5
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
-
7
5
  Object.defineProperty(exports, "__esModule", {
8
6
  value: true
9
7
  });
@@ -11,8 +9,6 @@ exports.default = exports.startServer = exports.AndroidUiautomator2Driver = expo
11
9
 
12
10
  require("source-map-support/register");
13
11
 
14
- var _yargs = _interopRequireDefault(require("yargs"));
15
-
16
12
  var _asyncbox = require("asyncbox");
17
13
 
18
14
  var driver = _interopRequireWildcard(require("./lib/driver"));
@@ -33,8 +29,13 @@ const DEFAULT_PORT = 4884;
33
29
  exports.DEFAULT_PORT = DEFAULT_PORT;
34
30
 
35
31
  async function main() {
36
- let port = _yargs.default.argv.port || DEFAULT_PORT;
37
- let host = _yargs.default.argv.host || _yargs.default.argv.address || DEFAULT_HOST;
32
+ const getArgValue = argName => {
33
+ const argIndex = process.argv.indexOf(argName);
34
+ return argIndex > 0 ? process.argv[argIndex + 1] : null;
35
+ };
36
+
37
+ const port = parseInt(getArgValue('--port'), 10) || DEFAULT_PORT;
38
+ const host = getArgValue('--host') || DEFAULT_HOST;
38
39
  return await startServer(port, host);
39
40
  }
40
41
 
@@ -46,4 +47,4 @@ var _default = AndroidUiautomator2Driver;
46
47
  exports.default = _default;require('source-map-support').install();
47
48
 
48
49
 
49
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIiLCJkcml2ZXIiLCJzdGFydFNlcnZlciIsInNlcnZlciIsIkRFRkFVTFRfSE9TVCIsIkRFRkFVTFRfUE9SVCIsIm1haW4iLCJwb3J0IiwieWFyZ3MiLCJhcmd2IiwiaG9zdCIsImFkZHJlc3MiLCJyZXF1aXJlIiwibW9kdWxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTTtBQUFFQSxFQUFBQTtBQUFGLElBQWdDQyxNQUF0Qzs7QUFDQSxNQUFNO0FBQUVDLEVBQUFBO0FBQUYsSUFBa0JDLE1BQXhCOztBQUVPLE1BQU1DLFlBQVksR0FBRyxXQUFyQjs7QUFDQSxNQUFNQyxZQUFZLEdBQUcsSUFBckI7OztBQUVQLGVBQWVDLElBQWYsR0FBdUI7QUFDckIsTUFBSUMsSUFBSSxHQUFHQyxlQUFNQyxJQUFOLENBQVdGLElBQVgsSUFBbUJGLFlBQTlCO0FBQ0EsTUFBSUssSUFBSSxHQUFHRixlQUFNQyxJQUFOLENBQVdDLElBQVgsSUFBbUJGLGVBQU1DLElBQU4sQ0FBV0UsT0FBOUIsSUFBeUNQLFlBQXBEO0FBQ0EsU0FBTyxNQUFNRixXQUFXLENBQUNLLElBQUQsRUFBT0csSUFBUCxDQUF4QjtBQUNEOztBQUVELElBQUlFLE9BQU8sQ0FBQ04sSUFBUixLQUFpQk8sTUFBckIsRUFBNkI7QUFDM0IsMEJBQVNQLElBQVQ7QUFDRDs7ZUFHY04seUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgYXN5bmNpZnkgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgKiBhcyBkcml2ZXIgZnJvbSAnLi9saWIvZHJpdmVyJztcbmltcG9ydCAqIGFzIHNlcnZlciBmcm9tICcuL2xpYi9zZXJ2ZXInO1xuXG5cbmNvbnN0IHsgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciB9ID0gZHJpdmVyO1xuY29uc3QgeyBzdGFydFNlcnZlciB9ID0gc2VydmVyO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9IT1NUID0gJ2xvY2FsaG9zdCc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9QT1JUID0gNDg4NDtcblxuYXN5bmMgZnVuY3Rpb24gbWFpbiAoKSB7XG4gIGxldCBwb3J0ID0geWFyZ3MuYXJndi5wb3J0IHx8IERFRkFVTFRfUE9SVDtcbiAgbGV0IGhvc3QgPSB5YXJncy5hcmd2Lmhvc3QgfHwgeWFyZ3MuYXJndi5hZGRyZXNzIHx8IERFRkFVTFRfSE9TVDtcbiAgcmV0dXJuIGF3YWl0IHN0YXJ0U2VydmVyKHBvcnQsIGhvc3QpO1xufVxuXG5pZiAocmVxdWlyZS5tYWluID09PSBtb2R1bGUpIHtcbiAgYXN5bmNpZnkobWFpbik7XG59XG5cbmV4cG9ydCB7IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIsIHN0YXJ0U2VydmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyO1xuIl0sImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZVJvb3QiOiIuLiJ9
50
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIiLCJkcml2ZXIiLCJzdGFydFNlcnZlciIsInNlcnZlciIsIkRFRkFVTFRfSE9TVCIsIkRFRkFVTFRfUE9SVCIsIm1haW4iLCJnZXRBcmdWYWx1ZSIsImFyZ05hbWUiLCJhcmdJbmRleCIsInByb2Nlc3MiLCJhcmd2IiwiaW5kZXhPZiIsInBvcnQiLCJwYXJzZUludCIsImhvc3QiLCJyZXF1aXJlIiwibW9kdWxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUdBLE1BQU07QUFBRUEsRUFBQUE7QUFBRixJQUFnQ0MsTUFBdEM7O0FBQ0EsTUFBTTtBQUFFQyxFQUFBQTtBQUFGLElBQWtCQyxNQUF4Qjs7QUFFTyxNQUFNQyxZQUFZLEdBQUcsV0FBckI7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHLElBQXJCOzs7QUFFUCxlQUFlQyxJQUFmLEdBQXVCO0FBQ3JCLFFBQU1DLFdBQVcsR0FBSUMsT0FBRCxJQUFhO0FBQy9CLFVBQU1DLFFBQVEsR0FBR0MsT0FBTyxDQUFDQyxJQUFSLENBQWFDLE9BQWIsQ0FBcUJKLE9BQXJCLENBQWpCO0FBQ0EsV0FBT0MsUUFBUSxHQUFHLENBQVgsR0FBZUMsT0FBTyxDQUFDQyxJQUFSLENBQWFGLFFBQVEsR0FBRyxDQUF4QixDQUFmLEdBQTRDLElBQW5EO0FBQ0QsR0FIRDs7QUFJQSxRQUFNSSxJQUFJLEdBQUdDLFFBQVEsQ0FBQ1AsV0FBVyxDQUFDLFFBQUQsQ0FBWixFQUF3QixFQUF4QixDQUFSLElBQXVDRixZQUFwRDtBQUNBLFFBQU1VLElBQUksR0FBR1IsV0FBVyxDQUFDLFFBQUQsQ0FBWCxJQUF5QkgsWUFBdEM7QUFDQSxTQUFPLE1BQU1GLFdBQVcsQ0FBQ1csSUFBRCxFQUFPRSxJQUFQLENBQXhCO0FBQ0Q7O0FBRUQsSUFBSUMsT0FBTyxDQUFDVixJQUFSLEtBQWlCVyxNQUFyQixFQUE2QjtBQUMzQiwwQkFBU1gsSUFBVDtBQUNEOztlQUdjTix5QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptYWluXG5cbmltcG9ydCB7IGFzeW5jaWZ5IH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0ICogYXMgZHJpdmVyIGZyb20gJy4vbGliL2RyaXZlcic7XG5pbXBvcnQgKiBhcyBzZXJ2ZXIgZnJvbSAnLi9saWIvc2VydmVyJztcblxuXG5jb25zdCB7IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIgfSA9IGRyaXZlcjtcbmNvbnN0IHsgc3RhcnRTZXJ2ZXIgfSA9IHNlcnZlcjtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSE9TVCA9ICdsb2NhbGhvc3QnO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUE9SVCA9IDQ4ODQ7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4gKCkge1xuICBjb25zdCBnZXRBcmdWYWx1ZSA9IChhcmdOYW1lKSA9PiB7XG4gICAgY29uc3QgYXJnSW5kZXggPSBwcm9jZXNzLmFyZ3YuaW5kZXhPZihhcmdOYW1lKTtcbiAgICByZXR1cm4gYXJnSW5kZXggPiAwID8gcHJvY2Vzcy5hcmd2W2FyZ0luZGV4ICsgMV0gOiBudWxsO1xuICB9O1xuICBjb25zdCBwb3J0ID0gcGFyc2VJbnQoZ2V0QXJnVmFsdWUoJy0tcG9ydCcpLCAxMCkgfHwgREVGQVVMVF9QT1JUO1xuICBjb25zdCBob3N0ID0gZ2V0QXJnVmFsdWUoJy0taG9zdCcpIHx8IERFRkFVTFRfSE9TVDtcbiAgcmV0dXJuIGF3YWl0IHN0YXJ0U2VydmVyKHBvcnQsIGhvc3QpO1xufVxuXG5pZiAocmVxdWlyZS5tYWluID09PSBtb2R1bGUpIHtcbiAgYXN5bmNpZnkobWFpbik7XG59XG5cbmV4cG9ydCB7IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIsIHN0YXJ0U2VydmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyO1xuIl0sImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZVJvb3QiOiIuLiJ9
@@ -27,6 +27,10 @@ function toBool(s) {
27
27
  return _lodash.default.isString(s) ? s.toLowerCase() === 'true' : !!s;
28
28
  }
29
29
 
30
+ commands.active = async function active() {
31
+ return await this.uiautomator2.jwproxy.command('/element/active', 'GET');
32
+ };
33
+
30
34
  commands.getAttribute = async function (attribute, elementId) {
31
35
  return await this.uiautomator2.jwproxy.command(`/element/${elementId}/attribute/${attribute}`, 'GET', {});
32
36
  };
@@ -187,4 +191,4 @@ var _default = extensions;
187
191
  exports.default = _default;require('source-map-support').install();
188
192
 
189
193
 
190
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9lbGVtZW50LmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJ0b0Jvb2wiLCJzIiwiXyIsImlzU3RyaW5nIiwidG9Mb3dlckNhc2UiLCJnZXRBdHRyaWJ1dGUiLCJhdHRyaWJ1dGUiLCJlbGVtZW50SWQiLCJ1aWF1dG9tYXRvcjIiLCJqd3Byb3h5IiwiY29tbWFuZCIsImVsZW1lbnREaXNwbGF5ZWQiLCJlbGVtZW50RW5hYmxlZCIsImVsZW1lbnRTZWxlY3RlZCIsImdldE5hbWUiLCJnZXRMb2NhdGlvbiIsImxvZyIsImluZm8iLCJnZXRTaXplIiwidG91Y2hMb25nQ2xpY2siLCJlbGVtZW50IiwieCIsInkiLCJkdXJhdGlvbiIsInBhcmFtcyIsInRvdWNoRG93biIsInRvdWNoVXAiLCJ0b3VjaE1vdmUiLCJkb1NldEVsZW1lbnRWYWx1ZSIsInNldFZhbHVlSW1tZWRpYXRlIiwia2V5cyIsInRleHQiLCJpc0FycmF5Iiwiam9pbiIsInJlcGxhY2UiLCJ1bmljb2RlS2V5Ym9hcmQiLCJvcHRzIiwiZ2V0VGV4dCIsImNsaWNrIiwiZ2V0RWxlbWVudFNjcmVlbnNob3QiLCJ0YXAiLCJjb3VudCIsImFyZUNvb3JkaW5hdGVzRGVmaW5lZCIsInV0aWwiLCJoYXNWYWx1ZSIsIkVycm9yIiwiaSIsIlczQ19FTEVNRU5UX0tFWSIsImNsZWFyIiwiZ2V0RWxlbWVudFJlY3QiLCJpc1dlYkNvbnRleHQiLCJkZWJ1ZyIsImNocm9tZWRyaXZlciIsImRvd25zdHJlYW1Qcm90b2NvbCIsIlBST1RPQ09MUyIsIk1KU09OV1AiLCJ3aWR0aCIsImhlaWdodCIsIk9iamVjdCIsImFzc2lnbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxJQUFJQSxRQUFRLEdBQUcsRUFBZjtBQUFBLElBQW1CQyxPQUFPLEdBQUcsRUFBN0I7QUFBQSxJQUFpQ0MsVUFBVSxHQUFHLEVB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QjtBQUN2QmxDLG9CQUFJbUMsS0FBSixDQUFXLDhDQUE2QyxLQUFLQyxZQUFMLENBQWtCM0MsT0FBbEIsQ0FBMEI0QyxrQkFBbUIsRUFBckc7O0FBQ0EsUUFBSSxLQUFLRCxZQUFMLENBQWtCM0MsT0FBbEIsQ0FBMEI0QyxrQkFBMUIsS0FBaURDLDRCQUFVQyxPQUEvRCxFQUF3RTtBQUN0RSxZQUFNO0FBQUNsQyxRQUFBQSxDQUFEO0FBQUlDLFFBQUFBO0FBQUosVUFBUyxNQUFNLEtBQUs4QixZQUFMLENBQWtCM0MsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQW1DLFlBQVdILFNBQVUsV0FBeEQsRUFBb0UsS0FBcEUsQ0FBckI7QUFDQSxZQUFNO0FBQUNpRCxRQUFBQSxLQUFEO0FBQVFDLFFBQUFBO0FBQVIsVUFBa0IsTUFBTSxLQUFLTCxZQUFMLENBQWtCM0MsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQW1DLFlBQVdILFNBQVUsT0FBeEQsRUFBZ0UsS0FBaEUsQ0FBOUI7QUFDQSxhQUFPO0FBQUNjLFFBQUFBLENBQUQ7QUFBSUMsUUFBQUEsQ0FBSjtBQUFPa0MsUUFBQUEsS0FBUDtBQUFjQyxRQUFBQTtBQUFkLE9BQVA7QUFDRDs7QUFDRCxXQUFPLE1BQU0sS0FBS0wsWUFBTCxDQUFrQjNDLE9BQWxCLENBQTBCQyxPQUExQixDQUFtQyxZQUFXSCxTQUFVLE9BQXhELEVBQWdFLEtBQWhFLENBQWI7QUFDRDs7QUFDRCxTQUFPLE1BQU0sS0FBS0MsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQW1DLFlBQVdILFNBQVUsT0FBeEQsRUFBZ0UsS0FBaEUsQ0FBYjtBQUNELENBWEQ7O0FBYUFtRCxNQUFNLENBQUNDLE1BQVAsQ0FBYzVELFVBQWQsRUFBMEJGLFFBQTFCLEVBQW9DQyxPQUFwQztlQUVlQyxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBQUk9UT0NPTFMsIFczQ19FTEVNRU5UX0tFWSB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gdG9Cb29sIChzKSB7XG4gIHJldHVybiBfLmlzU3RyaW5nKHMpID8gKHMudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnKSA6ICEhcztcbn1cblxuY29tbWFuZHMuZ2V0QXR0cmlidXRlID0gYXN5bmMgZnVuY3Rpb24gKGF0dHJpYnV0ZSwgZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoYC9lbGVtZW50LyR7ZWxlbWVudElkfS9hdHRyaWJ1dGUvJHthdHRyaWJ1dGV9YCwgJ0dFVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLmVsZW1lbnREaXNwbGF5ZWQgPSBhc3luYyBmdW5jdGlvbiAoZWxlbWVudElkKSB7XG4gIHJldHVybiB0b0Jvb2woYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ2Rpc3BsYXllZCcsIGVsZW1lbnRJZCkpO1xufTtcblxuY29tbWFuZHMuZWxlbWVudEVuYWJsZWQgPSBhc3luYyBmdW5jdGlvbiAoZWxlbWVudElkKSB7XG4gIHJldHVybiB0b0Jvb2woYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ2VuYWJsZWQnLCBlbGVtZW50SWQpKTtcbn07XG5cbmNvbW1hbmRzLmVsZW1lbnRTZWxlY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIChlbGVtZW50SWQpIHtcbiAgcmV0dXJuIHRvQm9vbChhd2FpdCB0aGlzLmdldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnLCBlbGVtZW50SWQpKTtcbn07XG5cbmNvbW1hbmRzLmdldE5hbWUgPSBhc3luYyBmdW5jdGlvbiAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoYC9lbGVtZW50LyR7ZWxlbWVudElkfS9uYW1lYCwgJ0dFVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLmdldExvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gKGVsZW1lbnRJZCkge1xuICBsb2cuaW5mbyhgY2FsbGluZyBnZXQgbG9jYXRpb246ICR7ZWxlbWVudElkfWApO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKGAvZWxlbWVudC8ke2VsZW1lbnRJZH0vbG9jYXRpb25gLCAnR0VUJywge30pO1xufTtcblxuY29tbWFuZHMuZ2V0U2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIChlbGVtZW50SWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChgL2VsZW1lbnQvJHtlbGVtZW50SWR9L3NpemVgLCAnR0VUJywge30pO1xufTtcblxuY29tbWFuZHMudG91Y2hMb25nQ2xpY2sgPSBhc3luYyBmdW5jdGlvbiAoZWxlbWVudCwgeCwgeSwgZHVyYXRpb24pIHtcbiAgbGV0IHBhcmFtcyA9IHtlbGVtZW50LCB4LCB5LCBkdXJhdGlvbn07XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoYC90b3VjaC9sb25nY2xpY2tgLCAnUE9TVCcsIHtwYXJhbXN9KTtcbn07XG5cbmNvbW1hbmRzLnRvdWNoRG93biA9IGFzeW5jIGZ1bmN0aW9uIChlbGVtZW50LCB4LCB5KSB7XG4gIGxldCBwYXJhbXMgPSB7ZWxlbWVudCwgeCwgeX07XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoYC90b3VjaC9kb3duYCwgJ1BPU1QnLCB7cGFyYW1zfSk7XG59O1xuXG5jb21tYW5kcy50b3VjaFVwID0gYXN5bmMgZnVuY3Rpb24gKGVsZW1lbnQsIHgsIHkpIHtcbiAgbGV0IHBhcmFtcyA9IHtlbGVtZW50LCB4LCB5fTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChgL3RvdWNoL3VwYCwgJ1BPU1QnLCB7cGFyYW1zfSk7XG59O1xuXG5jb21tYW5kcy50b3VjaE1vdmUgPSBhc3luYyBmdW5jdGlvbiAoZWxlbWVudCwgeCwgeSkge1xuICBsZXQgcGFyYW1zID0ge2VsZW1lbnQsIHgsIHl9O1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKGAvdG91Y2gvbW92ZWAsICdQT1NUJywge3BhcmFtc30pO1xufTtcblxuaGVscGVycy5kb1NldEVsZW1lbnRWYWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChgL2VsZW1lbnQvJHtwYXJhbXMuZWxlbWVudElkfS92YWx1ZWAsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLnNldFZhbHVlSW1tZWRpYXRlID0gYXN5bmMgZnVuY3Rpb24gKGtleXMsIGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKGAvZWxlbWVudC8ke2VsZW1lbnRJZH0vdmFsdWVgLCAnUE9TVCcsIHtcbiAgICBlbGVtZW50SWQsXG4gICAgdGV4dDogXy5pc0FycmF5KGtleXMpID8ga2V5cy5qb2luKCcnKSA6IGtleXMsXG4gICAgcmVwbGFjZTogZmFsc2UsXG4gICAgdW5pY29kZUtleWJvYXJkOiB0aGlzLm9wdHMudW5pY29kZUtleWJvYXJkLFxuICB9KTtcbn07XG5cbmNvbW1hbmRzLmdldFRleHQgPSBhc3luYyBmdW5jdGlvbiAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoYC9lbGVtZW50LyR7ZWxlbWVudElkfS90ZXh0YCwgJ0dFVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLmNsaWNrID0gYXN5bmMgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChgL2VsZW1lbnQvJHtlbGVtZW50fS9jbGlja2AsICdQT1NUJywge2VsZW1lbnR9KTtcbn07XG5cbmNvbW1hbmRzLmdldEVsZW1lbnRTY3JlZW5zaG90ID0gYXN5bmMgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChgL2VsZW1lbnQvJHtlbGVtZW50fS9zY3JlZW5zaG90YCwgJ0dFVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLnRhcCA9IGFzeW5jIGZ1bmN0aW9uIChlbGVtZW50SWQgPSBudWxsLCB4ID0gbnVsbCwgeSA9IG51bGwsIGNvdW50ID0gMSkge1xuICBjb25zdCBhcmVDb29yZGluYXRlc0RlZmluZWQgPSB1dGlsLmhhc1ZhbHVlKHgpICYmIHV0aWwuaGFzVmFsdWUoeSk7XG4gIGlmICghdXRpbC5oYXNWYWx1ZShlbGVtZW50SWQpICYmICFhcmVDb29yZGluYXRlc0RlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVpdGhlciBlbGVtZW50IGlkIHRvIHRhcCBvciBib3RoIGFic29sdXRlIGNvb3JkaW5hdGVzIHNob3VsZCBiZSBkZWZpbmVkYCk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBpZiAodXRpbC5oYXNWYWx1ZShlbGVtZW50SWQpICYmICFhcmVDb29yZGluYXRlc0RlZmluZWQpIHtcbiAgICAgIC8vIHdlIGFyZSBlaXRoZXIgdGFwcGluZyBvbiB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudFxuICAgICAgLy8gb3IgYW4gb2Zmc2V0IGZyb20gdGhlIHRvcCBsZWZ0IGNvcm5lclxuICAgICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKGAvZWxlbWVudC8ke2VsZW1lbnRJZH0vY2xpY2tgLCAnUE9TVCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vdGFwYCwgJ1BPU1QnLCB7XG4gICAgICAgIHgsIHksXG4gICAgICAgIFtXM0NfRUxFTUVOVF9LRVldOiBlbGVtZW50SWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbW1hbmRzLmNsZWFyID0gYXN5bmMgZnVuY3Rpb24gKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKGAvZWxlbWVudC8ke2VsZW1lbnRJZH0vY2xlYXJgLCAnUE9TVCcsIHtlbGVtZW50SWR9KTtcbn07XG5cbmNvbW1hbmRzLmdldEVsZW1lbnRSZWN0ID0gYXN5bmMgZnVuY3Rpb24gKGVsZW1lbnRJZCkge1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGxvZy5kZWJ1ZyhgRGV0ZWN0ZWQgZG93bnN0cmVhbSBjaHJvbWVkcml2ZXIgcHJvdG9jb2w6ICR7dGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5kb3duc3RyZWFtUHJvdG9jb2x9YCk7XG4gICAgaWYgKHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuZG93bnN0cmVhbVByb3RvY29sID09PSBQUk9UT0NPTFMuTUpTT05XUCkge1xuICAgICAgY29uc3Qge3gsIHl9ID0gYXdhaXQgdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5jb21tYW5kKGAvZWxlbWVudC8ke2VsZW1lbnRJZH0vbG9jYXRpb25gLCAnR0VUJyk7XG4gICAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBhd2FpdCB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQoYC9lbGVtZW50LyR7ZWxlbWVudElkfS9zaXplYCwgJ0dFVCcpO1xuICAgICAgcmV0dXJuIHt4LCB5LCB3aWR0aCwgaGVpZ2h0fTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZChgL2VsZW1lbnQvJHtlbGVtZW50SWR9L3JlY3RgLCAnR0VUJyk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChgL2VsZW1lbnQvJHtlbGVtZW50SWR9L3JlY3RgLCAnR0VUJyk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZWxlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
194
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9lbGVtZW50LmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJ0b0Jvb2wiLCJzIiwiXyIsImlzU3RyaW5nIiwidG9Mb3dlckNhc2UiLCJhY3RpdmUiLCJ1aWF1dG9tYXRvcjIiLCJqd3Byb3h5IiwiY29tbWFuZCIsImdldEF0dHJpYnV0ZSIsImF0dHJpYnV0ZSIsImVsZW1lbnRJZCIsImVsZW1lbnREaXNwbGF5ZWQiLCJlbGVtZW50RW5hYmxlZCIsImVsZW1lbnRTZWxlY3RlZCIsImdldE5hbWUiLCJnZXRMb2NhdGlvbiIsImxvZyIsImluZm8iLCJnZXRTaXplIiwidG91Y2hMb25nQ2xpY2siLCJlbGVtZW50IiwieCIsInkiLCJkdXJhdGlvbiIsInBhcmFtcyIsInRvdWNoRG93biIsInRvdWNoVXAiLCJ0b3VjaE1vdmUiLCJkb1NldEVsZW1lbnRWYWx1ZSIsInNldFZhbHVlSW1tZWRpYXRlIiwia2V5cyIsInRleHQiLCJpc0FycmF5Iiwiam9pbiIsInJlcGxhY2UiLCJ1bmljb2RlS2V5Ym9hcmQiLCJvcHRzIiwiZ2V0VGV4dCIsImNsaWNrIiwiZ2V0RWxlbWVudFNjcmVlbnNob3QiLCJ0YXAiLCJjb3VudCIsImFyZUNvb3JkaW5hdGVzRGVmaW5lZCIsInV0aWwiLCJoYXNWYWx1ZSIsIkVycm9yIiwiaSIsIlczQ19FTEVNRU5UX0tFWSIsImNsZWFyIiwiZ2V0RWxlbWVudFJlY3QiLCJpc1dlYkNvbnRleHQiLCJkZWJ1ZyIsImNocm9tZWRyaXZlciIsImRvd25zdHJlYW1Qcm90b2NvbCIsIlBST1RPQ09MUyIsIk1KU09OV1AiLCJ3aWR0aCIsImhlaWdodCIsIk9iamVjdCIsImFzc2lnbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxJQUFJQSxRQUFRLEdBQUcsRUFBZjtBQUFBLElBQW1CQyxPQUFPLEdBQUcsRUFBN0I7QUFBQSxJQUFpQ0MsVUFB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Q0FBYzdELFVBQWQsRUFBMEJGLFFBQTFCLEVBQW9DQyxPQUFwQztlQUVlQyxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBQUk9UT0NPTFMsIFczQ19FTEVNRU5UX0tFWSB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gdG9Cb29sIChzKSB7XG4gIHJldHVybiBfLmlzU3RyaW5nKHMpID8gKHMudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnKSA6ICEhcztcbn1cblxuY29tbWFuZHMuYWN0aXZlID0gYXN5bmMgZnVuY3Rpb24gYWN0aXZlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2VsZW1lbnQvYWN0aXZlJywgJ0dFVCcpO1xufTtcblxuY29tbWFuZHMuZ2V0QXR0cmlidXRlID0gYXN5bmMgZnVuY3Rpb24gKGF0dHJpYnV0ZSwgZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoYC9lbGVtZW50LyR7ZWxlbWVudElkfS9hdHRyaWJ1dGUvJHthdHRyaWJ1dGV9YCwgJ0dFVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLmVsZW1lbnREaXNwbGF5ZWQgPSBhc3luYyBmdW5jdGlvbiAoZWxlbWVudElkKSB7XG4gIHJldHVybiB0b0Jvb2woYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ2Rpc3BsYXllZCcsIGVsZW1lbnRJZCkpO1xufTtcblxuY29tbWFuZHMuZWxlbWVudEVuYWJsZWQgPSBhc3luYyBmdW5jdGlvbiAoZWxlbWVudElkKSB7XG4gIHJldHVybiB0b0Jvb2woYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ2VuYWJsZWQnLCBlbGVtZW50SWQpKTtcbn07XG5cbmNvbW1hbmRzLmVsZW1lbnRTZWxlY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIChlbGVtZW50SWQpIHtcbiAgcmV0dXJuIHRvQm9vbChhd2FpdCB0aGlzLmdldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnLCBlbGVtZW50SWQpKTtcbn07XG5cbmNvbW1hbmRzLmdldE5hbWUgPSBhc3luYyBmdW5jdGlvbiAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoYC9lbGVtZW50LyR7ZWxlbWVudElkfS9uYW1lYCwgJ0dFVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLmdldExvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gKGVsZW1lbnRJZCkge1xuICBsb2cuaW5mbyhgY2FsbGluZyBnZXQgbG9jYXRpb246ICR7ZWxlbWVudElkfWApO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKGAvZWxlbWVudC8ke2VsZW1lbnRJZH0vbG9jYXRpb25gLCAnR0VUJywge30pO1xufTtcblxuY29tbWFuZHMuZ2V0U2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIChlbGVtZW50SWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChgL2VsZW1lbnQvJHtlbGVtZW50SWR9L3NpemVgLCAnR0VUJywge30pO1xufTtcblxuY29tbWFuZHMudG91Y2hMb25nQ2xpY2sgPSBhc3luYyBmdW5jdGlvbiAoZWxlbWVudCwgeCwgeSwgZHVyYXRpb24pIHtcbiAgbGV0IHBhcmFtcyA9IHtlbGVtZW50LCB4LCB5LCBkdXJhdGlvbn07XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoYC90b3VjaC9sb25nY2xpY2tgLCAnUE9TVCcsIHtwYXJhbXN9KTtcbn07XG5cbmNvbW1hbmRzLnRvdWNoRG93biA9IGFzeW5jIGZ1bmN0aW9uIChlbGVtZW50LCB4LCB5KSB7XG4gIGxldCBwYXJhbXMgPSB7ZWxlbWVudCwgeCwgeX07XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoYC90b3VjaC9kb3duYCwgJ1BPU1QnLCB7cGFyYW1zfSk7XG59O1xuXG5jb21tYW5kcy50b3VjaFVwID0gYXN5bmMgZnVuY3Rpb24gKGVsZW1lbnQsIHgsIHkpIHtcbiAgbGV0IHBhcmFtcyA9IHtlbGVtZW50LCB4LCB5fTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChgL3RvdWNoL3VwYCwgJ1BPU1QnLCB7cGFyYW1zfSk7XG59O1xuXG5jb21tYW5kcy50b3VjaE1vdmUgPSBhc3luYyBmdW5jdGlvbiAoZWxlbWVudCwgeCwgeSkge1xuICBsZXQgcGFyYW1zID0ge2VsZW1lbnQsIHgsIHl9O1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKGAvdG91Y2gvbW92ZWAsICdQT1NUJywge3BhcmFtc30pO1xufTtcblxuaGVscGVycy5kb1NldEVsZW1lbnRWYWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChgL2VsZW1lbnQvJHtwYXJhbXMuZWxlbWVudElkfS92YWx1ZWAsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLnNldFZhbHVlSW1tZWRpYXRlID0gYXN5bmMgZnVuY3Rpb24gKGtleXMsIGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKGAvZWxlbWVudC8ke2VsZW1lbnRJZH0vdmFsdWVgLCAnUE9TVCcsIHtcbiAgICBlbGVtZW50SWQsXG4gICAgdGV4dDogXy5pc0FycmF5KGtleXMpID8ga2V5cy5qb2luKCcnKSA6IGtleXMsXG4gICAgcmVwbGFjZTogZmFsc2UsXG4gICAgdW5pY29kZUtleWJvYXJkOiB0aGlzLm9wdHMudW5pY29kZUtleWJvYXJkLFxuICB9KTtcbn07XG5cbmNvbW1hbmRzLmdldFRleHQgPSBhc3luYyBmdW5jdGlvbiAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoYC9lbGVtZW50LyR7ZWxlbWVudElkfS90ZXh0YCwgJ0dFVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLmNsaWNrID0gYXN5bmMgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChgL2VsZW1lbnQvJHtlbGVtZW50fS9jbGlja2AsICdQT1NUJywge2VsZW1lbnR9KTtcbn07XG5cbmNvbW1hbmRzLmdldEVsZW1lbnRTY3JlZW5zaG90ID0gYXN5bmMgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChgL2VsZW1lbnQvJHtlbGVtZW50fS9zY3JlZW5zaG90YCwgJ0dFVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLnRhcCA9IGFzeW5jIGZ1bmN0aW9uIChlbGVtZW50SWQgPSBudWxsLCB4ID0gbnVsbCwgeSA9IG51bGwsIGNvdW50ID0gMSkge1xuICBjb25zdCBhcmVDb29yZGluYXRlc0RlZmluZWQgPSB1dGlsLmhhc1ZhbHVlKHgpICYmIHV0aWwuaGFzVmFsdWUoeSk7XG4gIGlmICghdXRpbC5oYXNWYWx1ZShlbGVtZW50SWQpICYmICFhcmVDb29yZGluYXRlc0RlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVpdGhlciBlbGVtZW50IGlkIHRvIHRhcCBvciBib3RoIGFic29sdXRlIGNvb3JkaW5hdGVzIHNob3VsZCBiZSBkZWZpbmVkYCk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBpZiAodXRpbC5oYXNWYWx1ZShlbGVtZW50SWQpICYmICFhcmVDb29yZGluYXRlc0RlZmluZWQpIHtcbiAgICAgIC8vIHdlIGFyZSBlaXRoZXIgdGFwcGluZyBvbiB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudFxuICAgICAgLy8gb3IgYW4gb2Zmc2V0IGZyb20gdGhlIHRvcCBsZWZ0IGNvcm5lclxuICAgICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKGAvZWxlbWVudC8ke2VsZW1lbnRJZH0vY2xpY2tgLCAnUE9TVCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vdGFwYCwgJ1BPU1QnLCB7XG4gICAgICAgIHgsIHksXG4gICAgICAgIFtXM0NfRUxFTUVOVF9LRVldOiBlbGVtZW50SWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbW1hbmRzLmNsZWFyID0gYXN5bmMgZnVuY3Rpb24gKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKGAvZWxlbWVudC8ke2VsZW1lbnRJZH0vY2xlYXJgLCAnUE9TVCcsIHtlbGVtZW50SWR9KTtcbn07XG5cbmNvbW1hbmRzLmdldEVsZW1lbnRSZWN0ID0gYXN5bmMgZnVuY3Rpb24gKGVsZW1lbnRJZCkge1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGxvZy5kZWJ1ZyhgRGV0ZWN0ZWQgZG93bnN0cmVhbSBjaHJvbWVkcml2ZXIgcHJvdG9jb2w6ICR7dGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5kb3duc3RyZWFtUHJvdG9jb2x9YCk7XG4gICAgaWYgKHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuZG93bnN0cmVhbVByb3RvY29sID09PSBQUk9UT0NPTFMuTUpTT05XUCkge1xuICAgICAgY29uc3Qge3gsIHl9ID0gYXdhaXQgdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5jb21tYW5kKGAvZWxlbWVudC8ke2VsZW1lbnRJZH0vbG9jYXRpb25gLCAnR0VUJyk7XG4gICAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBhd2FpdCB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQoYC9lbGVtZW50LyR7ZWxlbWVudElkfS9zaXplYCwgJ0dFVCcpO1xuICAgICAgcmV0dXJuIHt4LCB5LCB3aWR0aCwgaGVpZ2h0fTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZChgL2VsZW1lbnQvJHtlbGVtZW50SWR9L3JlY3RgLCAnR0VUJyk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChgL2VsZW1lbnQvJHtlbGVtZW50SWR9L3JlY3RgLCAnR0VUJyk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZWxlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -194,6 +194,7 @@ commands.mobileScrollBackTo = async function (opts = {}) {
194
194
  commands.mobileScroll = async function (opts = {}) {
195
195
  const {
196
196
  element,
197
+ elementId,
197
198
  strategy,
198
199
  selector,
199
200
  maxSwipes
@@ -204,8 +205,8 @@ commands.mobileScroll = async function (opts = {}) {
204
205
  }
205
206
 
206
207
  return await this.uiautomator2.jwproxy.command('/touch/scroll', 'POST', {
208
+ origin: toOrigin(elementId || element),
207
209
  params: {
208
- origin: toOrigin(element),
209
210
  strategy,
210
211
  selector,
211
212
  maxSwipes
@@ -217,4 +218,4 @@ var _default = commands;
217
218
  exports.default = _default;require('source-map-support').install();
218
219
 
219
220
 
220
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZXN0dXJlcy5qcyJdLCJuYW1lcyI6WyJjb21tYW5kcyIsInRvT3JpZ2luIiwiZWxlbWVudCIsInV0aWwiLCJ3cmFwRWxlbWVudCIsInVud3JhcEVsZW1lbnQiLCJ1bmRlZmluZWQiLCJ0b1BvaW50IiwieCIsInkiLCJfIiwiaXNGaW5pdGUiLCJ0b1JlY3QiLCJsZWZ0IiwidG9wIiwid2lkdGgiLCJoZWlnaHQiLCJzb21lIiwidiIsIm1vYmlsZUxvbmdDbGlja0dlc3R1cmUiLCJvcHRzIiwiZWxlbWVudElkIiwiZHVyYXRpb24iLCJ1aWF1dG9tYXRvcjIiLCJqd3Byb3h5IiwiY29tbWFuZCIsIm9yaWdpbiIsIm9mZnNldCIsIm1vYmlsZURvdWJsZUNsaWNrR2VzdHVyZSIsIm1vYmlsZURyYWdHZXN0dXJlIiwic3RhcnRYIiwic3RhcnRZIiwiZW5kWCIsImVuZFkiLCJzcGVlZCIsInN0YXJ0IiwiZW5kIiwibW9iaWxlRmxpbmdHZXN0dXJlIiwiZGlyZWN0aW9uIiwiYXJlYSIsIm1vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlIiwicGVyY2VudCIsIm1vYmlsZVBpbmNoT3Blbkdlc3R1cmUiLCJtb2JpbGVTd2lwZUdlc3R1cmUiLCJtb2JpbGVTY3JvbGxHZXN0dXJlIiwibW9iaWxlU2Nyb2xsQmFja1RvIiwiZWxlbWVudFRvSWQiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIm1vYmlsZVNjcm9sbCIsInN0cmF0ZWd5Iiwic2VsZWN0b3IiLCJtYXhTd2lwZXMiLCJwYXJhbXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHLEVBQWpCOztBQUdBLFNBQVNDLFFBQVQsQ0FBbUJDLE9BQW5CLEVBQTRCO0FBQzFCLFNBQU9BLE9BQU8sR0FBR0Msb0JBQUtDLFdBQUwsQ0FBaUJELG9CQUFLRSxhQUFMLENBQW1CSCxPQUFuQixDQUFqQixDQUFILEdBQW1ESSxTQUFqRTtB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LFNBQU8sTUFBTSxLQUFLekIsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQ1YsbUJBQWtCdEIsb0JBQUtFLGFBQUwsQ0FBbUJnQixTQUFuQixDQUE4QixjQUFhbEIsb0JBQUtFLGFBQUwsQ0FBbUJ5QyxXQUFuQixDQUFnQyxFQURuRixFQUNzRixNQUR0RixFQUM4RixFQUQ5RixDQUFiO0FBRUQsQ0FQRDs7QUFzQ0E5QyxRQUFRLENBQUNpRCxZQUFULEdBQXdCLGdCQUFnQjdCLElBQUksR0FBRyxFQUF2QixFQUEyQjtBQUNqRCxRQUFNO0FBQUNsQixJQUFBQSxPQUFEO0FBQVVnRCxJQUFBQSxRQUFWO0FBQW9CQyxJQUFBQSxRQUFwQjtBQUE4QkMsSUFBQUE7QUFBOUIsTUFBMkNoQyxJQUFqRDs7QUFDQSxNQUFJLENBQUM4QixRQUFELElBQWEsQ0FBQ0MsUUFBbEIsRUFBNEI7QUFDMUIsVUFBTSxJQUFJSix5QkFBT0Msb0JBQVgsQ0FBaUMsdURBQWpDLENBQU47QUFDRDs7QUFDRCxTQUFPLE1BQU0sS0FBS3pCLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyxlQUFsQyxFQUFtRCxNQUFuRCxFQUEyRDtBQUN0RTRCLElBQUFBLE1BQU0sRUFBRTtBQUNOM0IsTUFBQUEsTUFBTSxFQUFFekIsUUFBUSxDQUFDQyxPQUFELENBRFY7QUFFTmdELE1BQUFBLFFBRk07QUFFSUMsTUFBQUEsUUFGSjtBQUVjQyxNQUFBQTtBQUZkO0FBRDhELEdBQTNELENBQWI7QUFNRCxDQVhEOztlQWFlcEQsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuXG5mdW5jdGlvbiB0b09yaWdpbiAoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudCA/IHV0aWwud3JhcEVsZW1lbnQodXRpbC51bndyYXBFbGVtZW50KGVsZW1lbnQpKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdG9Qb2ludCAoeCwgeSkge1xuICByZXR1cm4gXy5pc0Zpbml0ZSh4KSAmJiBfLmlzRmluaXRlKHkpID8ge3gsIHl9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB0b1JlY3QgKGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkge1xuICBpZiAoW2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodF0uc29tZSgodikgPT4gIV8uaXNGaW5pdGUodikpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4ge2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodH07XG59XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMb25nQ2xpY2tPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBjbGlja2VkLlxuICogSWYgdGhlIGVsZW1lbnQgaXMgbWlzc2luZyB0aGVuIGJvdGggY2xpY2sgb2Zmc2V0IGNvb3JkaW5hdGVzIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCBvZmZzZXQgYXJlIHByb3ZpZGVkIHRoZW4gdGhlIGNvb3JkaW5hdGVzXG4gKiBhcmUgcGFyc2VkIGFzIHJlbGF0aXZlIG9mZnNldHMgZnJvbSB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50LlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBjbGljayBvblxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSB0byBjbGljayBvblxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBkdXJhdGlvbiBbNTAwXSAtIENsaWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy5cbiAqIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBjbGljayB0aGF0IGxhc3RzIGZvciB0aGUgZ2l2ZW4gZHVyYXRpb25cbiAqXG4gKiBAcGFyYW0gez9Mb25nQ2xpY2tPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUxvbmdDbGlja0dlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVMb25nQ2xpY2tHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICB4LCB5LFxuICAgIGR1cmF0aW9uLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9sb25nX2NsaWNrJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIG9mZnNldDogdG9Qb2ludCh4LCB5KSxcbiAgICBkdXJhdGlvbixcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERvdWJsZUNsaWNrT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgZG91YmxlIGNsaWNrZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpcyBtaXNzaW5nIHRoZW4gYm90aCBjbGljayBvZmZzZXQgY29vcmRpbmF0ZXMgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIG9mZnNldCBhcmUgcHJvdmlkZWQgdGhlbiB0aGUgY29vcmRpbmF0ZXNcbiAqIGFyZSBwYXJzZWQgYXMgcmVsYXRpdmUgb2Zmc2V0cyBmcm9tIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGVsZW1lbnQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIHRvIGRvdWJsZSBjbGljayBvblxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSB0byBkb3VibGUgY2xpY2sgb25cbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgY2xpY2sgdGhhdCBsYXN0cyBmb3IgdGhlIGdpdmVuIGR1cmF0aW9uXG4gKlxuICogQHBhcmFtIHs/RG91YmxlQ2xpY2tPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURvdWJsZUNsaWNrR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZURvdWJsZUNsaWNrR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgeCwgeSxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvZG91YmxlX2NsaWNrJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIG9mZnNldDogdG9Qb2ludCh4LCB5KSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERyYWdPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBkcmFnZ2VkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIHRoZSBzdGFydCBjb29yZGluYXRlcyBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgdGhlIHN0YXJ0IGNvb3JkaW5hdGVzIGFyZSBwcm92aWRlZCB0aGVuIHRoZXNlXG4gKiBjb29yZGluYXRlcyBhcmUgY29uc2lkZXJlZCBhcyBvZmZzZXRzIGZyb20gdGhlIHRvcCBsZWZ0IGVsZW1lbnQgY29ybmVyLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzdGFydFggLSBUaGUgeCBjb29yZGluYXRlIHdoZXJlIHRoZSBkcmFnZ2luZyBzdGFydHNcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3RhcnRZIC0gVGhlIHkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgZHJhZ2dpbmcgc3RhcnRzXG4gKiBAcHJvcGVydHkgeyFudW1iZXJ9IGVuZFggLSBUaGUgeCBjb29yZGluYXRlIHdoZXJlIHRoZSBkcmFnZ2luZyBlbmRzXG4gKiBAcHJvcGVydHkgeyFudW1iZXJ9IGVuZFkgLSBUaGUgeSBjb29yZGluYXRlIHdoZXJlIHRoZSBkcmFnZ2luZyBlbmRzXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHNwZWVkIFsyNTAwICogZGlzcGxheURlbnNpdHldIC0gVGhlIHNwZWVkIGF0IHdoaWNoIHRvIHBlcmZvcm1cbiAqIHRoaXMgZ2VzdHVyZSBpbiBwaXhlbHMgcGVyIHNlY29uZC4gVGhlIHZhbHVlIG11c3Qgbm90IGJlIG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBEcmFncyB0aGlzIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7P0RyYWdPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURyYWdHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRHJhZ0dlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIHN0YXJ0WCwgc3RhcnRZLFxuICAgIGVuZFgsIGVuZFksXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL2RyYWcnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgc3RhcnQ6IHRvUG9pbnQoc3RhcnRYLCBzdGFydFkpLFxuICAgIGVuZDogdG9Qb2ludChlbmRYLCBlbmRZKSxcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEZsaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgZmxpbmdlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlkIGlzIG1pc3NpbmcgdGhlbiBmbGluZyBib3VuZGluZyBhcmVhIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgZmxpbmcgYm91bmRpbmcgYXJlYSBhcmUgcHJvdmlkZWQgdGhlbiB0aGlzXG4gKiBhcmVhIGlzIGVmZmVjdGl2ZWx5IGlnbm9yZWQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBmbGluZyBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHRvcCAtIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgZmxpbmcgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgZmxpbmcgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBmbGluZyBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IGRpcmVjdGlvbiAtIERpcmVjdGlvbiBvZiB0aGUgZmxpbmcuXG4gKiBBY2NlcHRhYmxlIHZhbHVlcyBhcmU6IGB1cGAsIGBkb3duYCwgYGxlZnRgIGFuZCBgcmlnaHRgIChjYXNlIGluc2Vuc2l0aXZlKVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzcGVlZCBbNzUwMCAqIGRpc3BsYXlEZW5zaXR5XSAtIFRoZSBzcGVlZCBhdCB3aGljaCB0byBwZXJmb3JtIHRoaXNcbiAqIGdlc3R1cmUgaW4gcGl4ZWxzIHBlciBzZWNvbmQuIFRoZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbWluaW11bSBmbGluZ1xuICogdmVsb2NpdHkgZm9yIHRoZSBnaXZlbiB2aWV3ICg1MCBieSBkZWZhdWx0KVxuICovXG5cbi8qKlxuICogRHJhZ3MgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi5cbiAqXG4gKiBAcGFyYW0gez9GbGluZ09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBvYmplY3QgY2FuIHN0aWxsIHNjcm9sbCBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLlxuICovXG5jb21tYW5kcy5tb2JpbGVGbGluZ0dlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVGbGluZ0dlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCxcbiAgICBkaXJlY3Rpb24sXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL2ZsaW5nJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIGRpcmVjdGlvbixcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBpbmNoT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgcGluY2hlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlkIGlzIG1pc3NpbmcgdGhlbiBwaW5jaCBib3VuZGluZyBhcmVhIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgcGluY2ggYm91bmRpbmcgYXJlYSBhcmUgcHJvdmlkZWQgdGhlbiB0aGVcbiAqIGFyZWEgaXMgZWZmZWN0aXZlbHkgaWdub3JlZC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbGVmdCAtIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHBpbmNoIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBwaW5jaCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBwaW5jaCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHBpbmNoIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7IW51bWJlcn0gcGVyY2VudCAtIFRoZSBzaXplIG9mIHRoZSBwaW5jaCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHBpbmNoIGFyZWEgc2l6ZS5cbiAqIFZhbGlkIHZhbHVlcyBtdXN0IGJlIGZsb2F0IG51bWJlcnMgaW4gcmFuZ2UgMC4uMSwgd2hlcmUgMS4wIGlzIDEwMCVcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3BlZWQgWzI1MDAgKiBkaXNwbGF5RGVuc2l0eV0gLSBUaGUgc3BlZWQgYXQgd2hpY2ggdG8gcGVyZm9ybVxuICogdGhpcyBnZXN0dXJlIGluIHBpeGVscyBwZXIgc2Vjb25kLiBUaGUgdmFsdWUgbXVzdCBub3QgYmUgbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgcGluY2ggY2xvc2UgZ2VzdHVyZS5cbiAqXG4gKiBAcGFyYW0gez9QaW5jaE9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlUGluY2hDbG9zZUdlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQaW5jaENsb3NlR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL3BpbmNoX2Nsb3NlJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIHBpbmNoIG9wZW4gZ2VzdHVyZS5cbiAqXG4gKiBAcGFyYW0gez9QaW5jaE9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlUGluY2hPcGVuR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVBpbmNoT3Blbkdlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCxcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9waW5jaF9vcGVuJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTd2lwZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIHN3aXBlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlkIGlzIG1pc3NpbmcgdGhlbiBzd2lwZSBib3VuZGluZyBhcmVhIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgc3dpcGUgYm91bmRpbmcgYXJlYSBhcmUgcHJvdmlkZWQgdGhlbiB0aGVcbiAqIGFyZWEgaXMgZWZmZWN0aXZlbHkgaWdub3JlZC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbGVmdCAtIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHN3aXBlIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBzd2lwZSBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBzd2lwZSBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHN3aXBlIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gZGlyZWN0aW9uIC0gRGlyZWN0aW9uIG9mIHRoZSBzd2lwZS5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZTogYHVwYCwgYGRvd25gLCBgbGVmdGAgYW5kIGByaWdodGAgKGNhc2UgaW5zZW5zaXRpdmUpXG4gKiBAcHJvcGVydHkgeyFudW1iZXJ9IHBlcmNlbnQgLSBUaGUgc2l6ZSBvZiB0aGUgc3dpcGUgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBzd2lwZSBhcmVhIHNpemUuXG4gKiBWYWxpZCB2YWx1ZXMgbXVzdCBiZSBmbG9hdCBudW1iZXJzIGluIHJhbmdlIDAuLjEsIHdoZXJlIDEuMCBpcyAxMDAlXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHNwZWVkIFs1MDAwICogZGlzcGxheURlbnNpdHldIC0gVGhlIHNwZWVkIGF0IHdoaWNoIHRvIHBlcmZvcm0gdGhpc1xuICogZ2VzdHVyZSBpbiBwaXhlbHMgcGVyIHNlY29uZC4gVGhlIHZhbHVlIG11c3Qgbm90IGJlIG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHN3aXBlIGdlc3R1cmUuXG4gKlxuICogQHBhcmFtIHs/U3dpcGVPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN3aXBlR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN3aXBlR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIGRpcmVjdGlvbixcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9zd2lwZScsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBhcmVhOiB0b1JlY3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSxcbiAgICBkaXJlY3Rpb24sXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNjcm9sbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIHNjcm9sbGVkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIHNjcm9sbCBib3VuZGluZyBhcmVhIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgc2Nyb2xsIGJvdW5kaW5nIGFyZWEgYXJlIHByb3ZpZGVkIHRoZW4gdGhpc1xuICogYXJlYSBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgc2Nyb2xsIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgc2Nyb2xsIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgc2Nyb2xsIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gZGlyZWN0aW9uIC0gRGlyZWN0aW9uIG9mIHRoZSBzY3JvbGwuXG4gKiBBY2NlcHRhYmxlIHZhbHVlcyBhcmU6IGB1cGAsIGBkb3duYCwgYGxlZnRgIGFuZCBgcmlnaHRgIChjYXNlIGluc2Vuc2l0aXZlKVxuICogQHByb3BlcnR5IHshbnVtYmVyfSBwZXJjZW50IC0gVGhlIHNpemUgb2YgdGhlIHNjcm9sbCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHNjcm9sbGluZyBhcmVhIHNpemUuXG4gKiBWYWxpZCB2YWx1ZXMgbXVzdCBiZSBmbG9hdCBudW1iZXJzIGdyZWF0ZXIgdGhhbiB6ZXJvLCB3aGVyZSAxLjAgaXMgMTAwJVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzcGVlZCBbNTAwMCAqIGRpc3BsYXlEZW5zaXR5XSAtIFRoZSBzcGVlZCBhdCB3aGljaCB0byBwZXJmb3JtIHRoaXMgZ2VzdHVyZVxuICogaW4gcGl4ZWxzIHBlciBzZWNvbmQuIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBzY3JvbGwgZ2VzdHVyZS5cbiAqXG4gKiBAcGFyYW0gez9TY3JvbGxPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgb2JqZWN0IGNhbiBzdGlsbCBzY3JvbGwgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbi5cbiAqL1xuY29tbWFuZHMubW9iaWxlU2Nyb2xsR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNjcm9sbEdlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCxcbiAgICBkaXJlY3Rpb24sXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvc2Nyb2xsJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIGRpcmVjdGlvbixcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2Nyb2xsRWxlbWVudFRvRWxlbWVudE9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlbGVtZW50SWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHNjcm9sbGFibGUgZWxlbWVudCxcbiAqIHdoaWNoIGlzIGdvaW5nIHRvIGJlIHNjcm9sbGVkLiBJdCBpcyByZXF1aXJlZCB0aGlzIGVsZW1lbnRcbiAqIGlzIGEgdmFsaWQgc2Nyb2xsYWJsZSBjb250YWluZXIgYW5kIGl0IHdhcyBsb2NhdGVkIGJ5IGAtYW5kcm9pZCB1aWF1dG9tYXRvcmBcbiAqIHN0cmF0ZWd5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVsZW1lbnRUb0lkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpdGVtLCB3aGljaCBiZWxvbmdzXG4gKiB0byB0aGUgc2Nyb2xsYWJsZSBlbGVtZW50IGFib3ZlLCBhbmQgd2hpY2ggc2hvdWxkIGJlY29tZSB2aXNpYmxlIGFmdGVyXG4gKiB0aGUgc2Nyb2xsaW5nIG9wZXJhdGlvbiBpcyBmaW5pc2hlZC4gSXQgaXMgcmVxdWlyZWQgdGhpcyBlbGVtZW50XG4gKiB3YXMgbG9jYXRlZCBieSBgLWFuZHJvaWQgdWlhdXRvbWF0b3JgIHN0cmF0ZWd5LlxuICovXG5cbi8qKlxuICogU2Nyb2xscyB0aGUgZ2l2ZW4gc2Nyb2xsYWJsZSBlbGVtZW50IGBlbGVtZW50SWRgIHVudGlsIGBlbGVtZW50VG9JZGBcbiAqIGJlY29tZXMgdmlzaWJsZS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIHRoZSBgZWxlbWVudFRvSWRgXG4gKiBpcyBhbHJlYWR5IHZpc2libGUgaW4gdGhlIHZpZXcgcG9ydC4gT3RoZXJ3aXNlIGl0IHdvdWxkIHNjcm9sbFxuICogdG8gdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBzY3JvbGxhYmxlIGNvbnRyb2wgYW5kIHRyaWVzIHRvIHJlYWNoIHRoZSBkZXN0aW5hdGlvbiBlbGVtZW50XG4gKiBieSBzY3JvbGxpbmcgaXRzIHBhcmVudCB0byB0aGUgZW5kIHN0ZXAgYnkgc3RlcC4gVGhlIHNjcm9sbCBkaXJlY3Rpb24gKHZlcnRpY2FsIG9yIGhvcml6b250YWwpXG4gKiBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEBwYXJhbSB7U2Nyb2xsRWxlbWVudFRvRWxlbWVudE9wdHN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgc2Nyb2xsaW5nIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVNjcm9sbEJhY2tUbyA9IGFzeW5jIGZ1bmN0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnRJZCwgZWxlbWVudFRvSWR9ID0gb3B0cztcbiAgaWYgKCFlbGVtZW50SWQgfHwgIWVsZW1lbnRUb0lkKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgQm90aCBlbGVtZW50SWQgYW5kIGVsZW1lbnRUb0lkIGFyZ3VtZW50cyBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChcbiAgICBgL2FwcGl1bS9lbGVtZW50LyR7dXRpbC51bndyYXBFbGVtZW50KGVsZW1lbnRJZCl9L3Njcm9sbF90by8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50VG9JZCl9YCwgJ1BPU1QnLCB7fSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNjcm9sbE9wdHNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudCBUaGUgaWRlbnRpZmllciBvZiBhbiBlbGVtZW50LiBJdCBpcyByZXF1aXJlZCB0aGlzIGVsZW1lbnRcbiAqIGlzIGEgdmFsaWQgc2Nyb2xsYWJsZSBjb250YWluZXIgYW5kIGl0IHdhcyBsb2NhdGVkIGJ5IGAtYW5kcm9pZCB1aWF1dG9tYXRvcmBcbiAqIHN0cmF0ZWd5LiBJZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBmaXJzdCBjdXJyZW50bHkgYXZhaWxhYmxlIHNjcm9sbGFibGUgdmlld1xuICogaXMgc2VsZWN0ZWQgZm9yIHRoZSBpbnRlcmFjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gc3RyYXRlZ3kgVGhlIGZvbGxvd2luZyBzdHJhdGVnaWVzIGFyZSBzdXBwb3J0ZWQ6XG4gKiAtIGBhY2Nlc3NpYmlsaXR5IGlkYCAoVWlTZWxlY3RvcigpLmRlc2NyaXB0aW9uKVxuICogLSBgY2xhc3MgbmFtZWAgKFVpU2VsZWN0b3IoKS5jbGFzc05hbWUpXG4gKiAtIGAtYW5kcm9pZCB1aWF1dG9tYXRvcmAgKFVpU2VsZWN0b3IpXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHNlbGVjdG9yIFRoZSBjb3JyZXNwb25kaW5nIGxvb2t1cCB2YWx1ZSBmb3IgdGhlIGdpdmVuXG4gKiBzdHJhdGVneS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbWF4U3dpcGVzIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzd2lwZXMgdG8gcGVyZm9ybVxuICogb24gdGhlIHRhcmdldCBzY3JvbGxhYmxlIHZpZXcgaW4gb3JkZXIgdG8gcmVhY2ggdGhlIGRlc3RpbmF0aW9uIGVsZW1lbnQuXG4gKiBJbiBjYXNlIHRoaXMgdmFsdWUgaXMgdW5zZXQgdGhlbiBpdCB3b3VsZCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgc2Nyb2xsYWJsZVxuICogZWxlbWVudCBpdHNlbGYgKHZ1YSBgZ2V0TWF4U2VhcmNoU3dpcGVzKClgIHByb3BlcnR5KS5cbiAqL1xuXG4vKipcbiAqIFNjcm9sbHMgdGhlIGdpdmVuIHNjcm9sbGFibGUgZWxlbWVudCB1bnRpbCB0aGUgZWxlbWVudCBpZGVudGlmaWVkXG4gKiBieSBgc3RyYXRlZ3lgIGFuZCBgc2VsZWN0b3JgIGJlY29tZXMgdmlzaWJsZS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIHRoZVxuICogZGVzdGluYXRpb24gZWxlbWVudCBpcyBhbHJlYWR5IHZpc2libGUgaW4gdGhlIHZpZXcgcG9ydC4gT3RoZXJ3aXNlIGl0IHdvdWxkIHNjcm9sbFxuICogdG8gdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBzY3JvbGxhYmxlIGNvbnRyb2wgYW5kIHRyaWVzIHRvIHJlYWNoIHRoZSBkZXN0aW5hdGlvbiBlbGVtZW50XG4gKiBieSBzY3JvbGxpbmcgaXRzIHBhcmVudCB0byB0aGUgZW5kIHN0ZXAgYnkgc3RlcC4gVGhlIHNjcm9sbCBkaXJlY3Rpb24gKHZlcnRpY2FsIG9yIGhvcml6b250YWwpXG4gKiBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEBwYXJhbSB7U2Nyb2xsT3B0c30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBzY3JvbGxpbmcgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWRcbiAqL1xuY29tbWFuZHMubW9iaWxlU2Nyb2xsID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudCwgc3RyYXRlZ3ksIHNlbGVjdG9yLCBtYXhTd2lwZXN9ID0gb3B0cztcbiAgaWYgKCFzdHJhdGVneSB8fCAhc2VsZWN0b3IpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBCb3RoIHN0cmF0ZWd5IGFuZCBzZWxlY3RvciBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZGApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy90b3VjaC9zY3JvbGwnLCAnUE9TVCcsIHtcbiAgICBwYXJhbXM6IHtcbiAgICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudCksXG4gICAgICBzdHJhdGVneSwgc2VsZWN0b3IsIG1heFN3aXBlc1xuICAgIH0sXG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9nZXN0dXJlcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
221
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZXN0dXJlcy5qcyJdLCJuYW1lcyI6WyJjb21tYW5kcyIsInRvT3JpZ2luIiwiZWxlbWVudCIsInV0aWwiLCJ3cmFwRWxlbWVudCIsInVud3JhcEVsZW1lbnQiLCJ1bmRlZmluZWQiLCJ0b1BvaW50IiwieCIsInkiLCJfIiwiaXNGaW5pdGUiLCJ0b1JlY3QiLCJsZWZ0IiwidG9wIiwid2lkdGgiLCJoZWlnaHQiLCJzb21lIiwidiIsIm1vYmlsZUxvbmdDbGlja0dlc3R1cmUiLCJvcHRzIiwiZWxlbWVudElkIiwiZHVyYXRpb24iLCJ1aWF1dG9tYXRvcjIiLCJqd3Byb3h5IiwiY29tbWFuZCIsIm9yaWdpbiIsIm9mZnNldCIsIm1vYmlsZURvdWJsZUNsaWNrR2VzdHVyZSIsIm1vYmlsZURyYWdHZXN0dXJlIiwic3RhcnRYIiwic3RhcnRZIiwiZW5kWCIsImVuZFkiLCJzcGVlZCIsInN0YXJ0IiwiZW5kIiwibW9iaWxlRmxpbmdHZXN0dXJlIiwiZGlyZWN0aW9uIiwiYXJlYSIsIm1vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlIiwicGVyY2VudCIsIm1vYmlsZVBpbmNoT3Blbkdlc3R1cmUiLCJtb2JpbGVTd2lwZUdlc3R1cmUiLCJtb2JpbGVTY3JvbGxHZXN0dXJlIiwibW9iaWxlU2Nyb2xsQmFja1RvIiwiZWxlbWVudFRvSWQiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIm1vYmlsZVNjcm9sbCIsInN0cmF0ZWd5Iiwic2VsZWN0b3IiLCJtYXhTd2lwZXMiLCJwYXJhbXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHLEVBQWpCOztBQUdBLFNBQVNDLFFBQVQsQ0FBbUJDLE9BQW5CLEVBQTRCO0FBQzFCLFNBQU9BLE9BQU8sR0FBR0Msb0JBQUtDLFdBQUwsQ0FBaUJELG9CQUFLRSxhQUFMLENBQW1CSCxPQUFuQixDQUFqQixDQUFILEdBQW1ESSxTQUFqRTtBQUNEOztBQUVELFNBQVNDLE9BQVQsQ0FBa0JDLENBQWxCLEVBQXFCQyxDQUFyQixFQUF3QjtBQUN0QixTQUFPQyxnQkFBRUMsUUFBRixDQUFXSCxDQUFYLEtBQWlCRSxnQkFBRUMsUUFBRixDQUFXRixDQUFYLENBQWpCLEdBQWlDO0FBQUNELElBQUFBLENBQUQ7QUFBSUMsSUFBQUE7QUFBSixHQUFqQyxHQUEwQ0gsU0FBakQ7QUFDRDs7QUFFRCxTQUFTTSxNQUFULENBQWlCQyxJQUFqQixFQUF1QkMsR0FBdkIsRUFBNEJDLEtBQTVCLEVBQW1DQyxNQUFuQyxFQUEyQztBQUN6QyxNQUFJLENBQUNILElBQUQsRUFBT0MsR0FBUCxFQUFZQyxLQUFaLEVBQW1CQyxNQUFuQixFQUEyQkMsSUFBM0IsQ0FBaUNDLENBQUQsSUFBTyxDQUFDUixnQkFBRUMsUUFBRixDQUFXTyxDQUFYLENBQXhDLENBQUosRUFBNEQ7QUFDMUQsV0FBT1osU0FBUDtBQUNEOztBQUNELFNBQU87QUFBQ08sSUFBQUEsSUFBRDtBQUFPQyxJQUFBQSxHQUFQO0FBQVlDLElBQUFBLEtBQVo7QUFBbUJDLElBQUFBO0FBQW5CLEdBQVA7QUFDRDs7QUFxQkRoQixRQUFRLENBQUNtQixzQkFBVCxHQUFrQyxlQUFlQSxzQkFBZixDQUF1Q0MsSUFBSSxHQUFHLEVBQTlDLEVBQWtEO0FBQ2xGLFFBQU07QUFDSkMsSUFBQUEsU0FESTtBQUVKYixJQUFBQSxDQUZJO0FBRURDLElBQUFBLENBRkM7QUFHSmEsSUFBQUE7QUFISSxNQUlGRixJQUpKO0FBS0EsU0FBTyxNQUFNLEtBQUtHLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyw2QkFBbEMsRUFBaUUsTUFBakUsRUFBeUU7QUFDcEZDLElBQUFBLE1BQU0sRUFBRXpCLFFBQVEsQ0FBQ29CLFNBQUQsQ0FEb0U7QUFFcEZNLElBQUFBLE1BQU0sRUFBRXBCLE9BQU8sQ0FBQ0MsQ0FBRCxFQUFJQyxDQUFKLENBRnFFO0FBR3BGYSxJQUFBQTtBQUhvRixHQUF6RSxDQUFiO0FBS0QsQ0FYRDs7QUE2QkF0QixRQUFRLENBQUM0Qix3QkFBVCxHQUFvQyxlQUFlQSx3QkFBZixDQUF5Q1IsSUFBSSxHQUFHLEVBQWhELEVBQW9EO0FBQ3RGLFFBQU07QUFDSkMsSUFBQUEsU0FESTtBQUVKYixJQUFBQSxDQUZJO0FBRURDLElBQUFBO0FBRkMsTUFHRlcsSUFISjtBQUlBLFNBQU8sTUFBTSxLQUFLRyxZQUFMLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBMUIsQ0FBa0MsK0JBQWxDLEVBQW1FLE1BQW5FLEVBQTJFO0FBQ3RGQyxJQUFBQSxNQUFNLEVBQUV6QixRQUFRLENBQUNvQixTQUFELENBRHNFO0FBRXRGTSxJQUFBQSxNQUFNLEVBQUVwQixPQUFPLENBQUNDLENBQUQsRUFBSUMsQ0FBSjtBQUZ1RSxHQUEzRSxDQUFiO0FBSUQsQ0FURDs7QUErQkFULFFBQVEsQ0FBQzZCLGlCQUFULEdBQTZCLGVBQWVBLGlCQUFmLENBQWtDVCxJQUFJLEdBQUcsRUFBekMsRUFBNkM7QUFDeEUsUUFBTTtBQUNKQyxJQUFBQSxTQURJO0FBRUpTLElBQUFBLE1BRkk7QUFFSUMsSUFBQUEsTUFGSjtBQUdKQyxJQUFBQSxJQUhJO0FBR0VDLElBQUFBLElBSEY7QUFJSkMsSUFBQUE7QUFKSSxNQUtGZCxJQUxKO0FBTUEsU0FBTyxNQUFNLEtBQUtHLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyx1QkFBbEMsRUFBMkQsTUFBM0QsRUFBbUU7QUFDOUVDLElBQUFBLE1BQU0sRUFBRXpCLFFBQVEsQ0FBQ29CLFNBQUQsQ0FEOEQ7QUFFOUVjLElBQUFBLEtBQUssRUFBRTVCLE9BQU8sQ0FBQ3VCLE1BQUQsRUFBU0MsTUFBVCxDQUZnRTtBQUc5RUssSUFBQUEsR0FBRyxFQUFFN0IsT0FBTyxDQUFDeUIsSUFBRCxFQUFPQyxJQUFQLENBSGtFO0FBSTlFQyxJQUFBQTtBQUo4RSxHQUFuRSxDQUFiO0FBTUQsQ0FiRDs7QUF1Q0FsQyxRQUFRLENBQUNxQyxrQkFBVCxHQUE4QixlQUFlQSxrQkFBZixDQUFtQ2pCLElBQUksR0FBRyxFQUExQyxFQUE4QztBQUMxRSxRQUFNO0FBQ0pDLElBQUFBLFNBREk7QUFFSlIsSUFBQUEsSUFGSTtBQUVFQyxJQUFBQSxHQUZGO0FBRU9DLElBQUFBLEtBRlA7QUFFY0MsSUFBQUEsTUFGZDtBQUdKc0IsSUFBQUEsU0FISTtBQUlKSixJQUFBQTtBQUpJLE1BS0ZkLElBTEo7QUFNQSxTQUFPLE1BQU0sS0FBS0csWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQWtDLHdCQUFsQyxFQUE0RCxNQUE1RCxFQUFvRTtBQUMvRUMsSUFBQUEsTUFBTSxFQUFFekIsUUFBUSxDQUFDb0IsU0FBRCxDQUQrRDtBQUUvRWtCLElBQUFBLElBQUksRUFBRTNCLE1BQU0sQ0FBQ0MsSUFBRCxFQUFPQyxHQUFQLEVBQVlDLEtBQVosRUFBbUJDLE1BQW5CLENBRm1FO0FBRy9Fc0IsSUFBQUEsU0FIK0U7QUFJL0VKLElBQUFBO0FBSitFLEdBQXBFLENBQWI7QUFNRCxDQWJEOztBQXFDQWxDLFFBQVEsQ0FBQ3dDLHVCQUFULEdBQW1DLGVBQWVBLHVCQUFmLENBQXdDcEIsSUFBSSxHQUFHLEVBQS9DLEVBQW1EO0FBQ3BGLFFBQU07QUFDSkMsSUFBQUEsU0FESTtBQUVKUixJQUFBQSxJQUZJO0FBRUVDLElBQUFBLEdBRkY7QUFFT0MsSUFBQUEsS0FGUDtBQUVjQyxJQUFBQSxNQUZkO0FBR0p5QixJQUFBQSxPQUhJO0FBSUpQLElBQUFBO0FBSkksTUFLRmQsSUFMSjtBQU1BLFNBQU8sTUFBTSxLQUFLRyxZQUFMLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBMUIsQ0FBa0MsOEJBQWxDLEVBQWtFLE1BQWxFLEVBQTBFO0FBQ3JGQyxJQUFBQSxNQUFNLEVBQUV6QixRQUFRLENBQUNvQixTQUFELENBRHFFO0FBRXJGa0IsSUFBQUEsSUFBSSxFQUFFM0IsTUFBTSxDQUFDQyxJQUFELEVBQU9DLEdBQVAsRUFBWUMsS0FBWixFQUFtQkMsTUFBbkIsQ0FGeUU7QUFHckZ5QixJQUFBQSxPQUhxRjtBQUlyRlAsSUFBQUE7QUFKcUYsR0FBMUUsQ0FBYjtBQU1ELENBYkQ7O0FBcUJBbEMsUUFBUSxDQUFDMEMsc0JBQVQsR0FBa0MsZUFBZUEsc0JBQWYsQ0FBdUN0QixJQUFJLEdBQUcsRUFBOUMsRUFBa0Q7QUFDbEYsUUFBTTtBQUNKQyxJQUFBQSxTQURJO0FBRUpSLElBQUFBLElBRkk7QUFFRUMsSUFBQUEsR0FGRjtBQUVPQyxJQUFBQSxLQUZQO0FBRWNDLElBQUFBLE1BRmQ7QUFHSnlCLElBQUFBLE9BSEk7QUFJSlAsSUFBQUE7QUFKSSxNQUtGZCxJQUxKO0FBTUEsU0FBTyxNQUFNLEtBQUtHLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyw2QkFBbEMsRUFBaUUsTUFBakUsRUFBeUU7QUFDcEZDLElBQUFBLE1BQU0sRUFBRXpCLFFBQVEsQ0FBQ29CLFNBQUQsQ0FEb0U7QUFFcEZrQixJQUFBQSxJQUFJLEVBQUUzQixNQUFNLENBQUNDLElBQUQsRUFBT0MsR0FBUCxFQUFZQyxLQUFaLEVBQW1CQyxNQUFuQixDQUZ3RTtBQUdwRnlCLElBQUFBLE9BSG9GO0FBSXBGUCxJQUFBQTtBQUpvRixHQUF6RSxDQUFiO0FBTUQsQ0FiRDs7QUF1Q0FsQyxRQUFRLENBQUMyQyxrQkFBVCxHQUE4QixlQUFlQSxrQkFBZixDQUFtQ3ZCLElBQUksR0FBRyxFQUExQyxFQUE4QztBQUMxRSxRQUFNO0FBQ0pDLElBQUFBLFNBREk7QUFFSlIsSUFBQUEsSUFGSTtBQUVFQyxJQUFBQSxHQUZGO0FBRU9DLElBQUFBLEtBRlA7QUFFY0MsSUFBQUEsTUFGZDtBQUdKc0IsSUFBQUEsU0FISTtBQUlKRyxJQUFBQSxPQUpJO0FBS0pQLElBQUFBO0FBTEksTUFNRmQsSUFOSjtBQU9BLFNBQU8sTUFBTSxLQUFLRyxZQUFMLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBMUIsQ0FBa0Msd0JBQWxDLEVBQTRELE1BQTVELEVBQW9FO0FBQy9FQyxJQUFBQSxNQUFNLEVBQUV6QixRQUFRLENBQUNvQixTQUFELENBRCtEO0FBRS9Fa0IsSUFBQUEsSUFBSSxFQUFFM0IsTUFBTSxDQUFDQyxJQUFELEVBQU9DLEdBQVAsRUFBWUMsS0FBWixFQUFtQkMsTUFBbkIsQ0FGbUU7QUFHL0VzQixJQUFBQSxTQUgrRTtBQUkvRUcsSUFBQUEsT0FKK0U7QUFLL0VQLElBQUFBO0FBTCtFLEdBQXBFLENBQWI7QUFPRCxDQWZEOztBQTBDQWxDLFFBQVEsQ0FBQzRDLG1CQUFULEdBQStCLGVBQWVBLG1CQUFmLENBQW9DeEIsSUFBSSxHQUFHLEVBQTNDLEVBQStDO0FBQzVFLFFBQU07QUFDSkMsSUFBQUEsU0FESTtBQUVKUixJQUFBQSxJQUZJO0FBRUVDLElBQUFBLEdBRkY7QUFFT0MsSUFBQUEsS0FGUDtBQUVjQyxJQUFBQSxNQUZkO0FBR0pzQixJQUFBQSxTQUhJO0FBSUpHLElBQUFBLE9BSkk7QUFLSlAsSUFBQUE7QUFMSSxNQU1GZCxJQU5KO0FBT0EsU0FBTyxNQUFNLEtBQUtHLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyx5QkFBbEMsRUFBNkQsTUFBN0QsRUFBcUU7QUFDaEZDLElBQUFBLE1BQU0sRUFBRXpCLFFBQVEsQ0FBQ29CLFNBQUQsQ0FEZ0U7QUFFaEZrQixJQUFBQSxJQUFJLEVBQUUzQixNQUFNLENBQUNDLElBQUQsRUFBT0MsR0FBUCxFQUFZQyxLQUFaLEVBQW1CQyxNQUFuQixDQUZvRTtBQUdoRnNCLElBQUFBLFNBSGdGO0FBSWhGRyxJQUFBQSxPQUpnRjtBQUtoRlAsSUFBQUE7QUFMZ0YsR0FBckUsQ0FBYjtBQU9ELENBZkQ7O0FBd0NBbEMsUUFBUSxDQUFDNkMsa0JBQVQsR0FBOEIsZ0JBQWdCekIsSUFBSSxHQUFHLEVBQXZCLEVBQTJCO0FBQ3ZELFFBQU07QUFBQ0MsSUFBQUEsU0FBRDtBQUFZeUIsSUFBQUE7QUFBWixNQUEyQjFCLElBQWpDOztBQUNBLE1BQUksQ0FBQ0MsU0FBRCxJQUFjLENBQUN5QixXQUFuQixFQUFnQztBQUM5QixVQUFNLElBQUlDLHlCQUFPQyxvQkFBWCxDQUFpQywyREFBakMsQ0FBTjtBQUNEOztBQUNELFNBQU8sTUFBTSxLQUFLekIsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQ1YsbUJBQWtCdEIsb0JBQUtFLGFBQUwsQ0FBbUJnQixTQUFuQixDQUE4QixjQUFhbEIsb0JBQUtFLGFBQUwsQ0FBbUJ5QyxXQUFuQixDQUFnQyxFQURuRixFQUNzRixNQUR0RixFQUM4RixFQUQ5RixDQUFiO0FBRUQsQ0FQRDs7QUFzQ0E5QyxRQUFRLENBQUNpRCxZQUFULEdBQXdCLGdCQUFnQjdCLElBQUksR0FBRyxFQUF2QixFQUEyQjtBQUNqRCxRQUFNO0FBQ0psQixJQUFBQSxPQURJO0FBQ0ttQixJQUFBQSxTQURMO0FBRUo2QixJQUFBQSxRQUZJO0FBRU1DLElBQUFBLFFBRk47QUFFZ0JDLElBQUFBO0FBRmhCLE1BR0ZoQyxJQUhKOztBQUlBLE1BQUksQ0FBQzhCLFFBQUQsSUFBYSxDQUFDQyxRQUFsQixFQUE0QjtBQUMxQixVQUFNLElBQUlKLHlCQUFPQyxvQkFBWCxDQUFpQyx1REFBakMsQ0FBTjtBQUNEOztBQUNELFNBQU8sTUFBTSxLQUFLekIsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQWtDLGVBQWxDLEVBQW1ELE1BQW5ELEVBQTJEO0FBQ3RFQyxJQUFBQSxNQUFNLEVBQUV6QixRQUFRLENBQUNvQixTQUFTLElBQUluQixPQUFkLENBRHNEO0FBRXRFbUQsSUFBQUEsTUFBTSxFQUFFO0FBQUNILE1BQUFBLFFBQUQ7QUFBV0MsTUFBQUEsUUFBWDtBQUFxQkMsTUFBQUE7QUFBckI7QUFGOEQsR0FBM0QsQ0FBYjtBQUlELENBWkQ7O2VBY2VwRCxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG5cbmZ1bmN0aW9uIHRvT3JpZ2luIChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50ID8gdXRpbC53cmFwRWxlbWVudCh1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCkpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB0b1BvaW50ICh4LCB5KSB7XG4gIHJldHVybiBfLmlzRmluaXRlKHgpICYmIF8uaXNGaW5pdGUoeSkgPyB7eCwgeX0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHRvUmVjdCAobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSB7XG4gIGlmIChbbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0XS5zb21lKCh2KSA9PiAhXy5pc0Zpbml0ZSh2KSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7bGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0fTtcbn1cblxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExvbmdDbGlja09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNsaWNrZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpcyBtaXNzaW5nIHRoZW4gYm90aCBjbGljayBvZmZzZXQgY29vcmRpbmF0ZXMgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIG9mZnNldCBhcmUgcHJvdmlkZWQgdGhlbiB0aGUgY29vcmRpbmF0ZXNcbiAqIGFyZSBwYXJzZWQgYXMgcmVsYXRpdmUgb2Zmc2V0cyBmcm9tIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGVsZW1lbnQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIHRvIGNsaWNrIG9uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGNsaWNrIG9uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGR1cmF0aW9uIFs1MDBdIC0gQ2xpY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLlxuICogVGhlIHZhbHVlIG11c3Qgbm90IGJlIG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtcyBhIGNsaWNrIHRoYXQgbGFzdHMgZm9yIHRoZSBnaXZlbiBkdXJhdGlvblxuICpcbiAqIEBwYXJhbSB7P0xvbmdDbGlja09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlTG9uZ0NsaWNrR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUxvbmdDbGlja0dlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIHgsIHksXG4gICAgZHVyYXRpb24sXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL2xvbmdfY2xpY2snLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgb2Zmc2V0OiB0b1BvaW50KHgsIHkpLFxuICAgIGR1cmF0aW9uLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRG91YmxlQ2xpY2tPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBkb3VibGUgY2xpY2tlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlzIG1pc3NpbmcgdGhlbiBib3RoIGNsaWNrIG9mZnNldCBjb29yZGluYXRlcyBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgb2Zmc2V0IGFyZSBwcm92aWRlZCB0aGVuIHRoZSBjb29yZGluYXRlc1xuICogYXJlIHBhcnNlZCBhcyByZWxhdGl2ZSBvZmZzZXRzIGZyb20gdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gZG91YmxlIGNsaWNrIG9uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGRvdWJsZSBjbGljayBvblxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBjbGljayB0aGF0IGxhc3RzIGZvciB0aGUgZ2l2ZW4gZHVyYXRpb25cbiAqXG4gKiBAcGFyYW0gez9Eb3VibGVDbGlja09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlRG91YmxlQ2xpY2tHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRG91YmxlQ2xpY2tHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICB4LCB5LFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9kb3VibGVfY2xpY2snLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgb2Zmc2V0OiB0b1BvaW50KHgsIHkpLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRHJhZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIGRyYWdnZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpZCBpcyBtaXNzaW5nIHRoZW4gdGhlIHN0YXJ0IGNvb3JkaW5hdGVzIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgc3RhcnQgY29vcmRpbmF0ZXMgYXJlIHByb3ZpZGVkIHRoZW4gdGhlc2VcbiAqIGNvb3JkaW5hdGVzIGFyZSBjb25zaWRlcmVkIGFzIG9mZnNldHMgZnJvbSB0aGUgdG9wIGxlZnQgZWxlbWVudCBjb3JuZXIuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHN0YXJ0WCAtIFRoZSB4IGNvb3JkaW5hdGUgd2hlcmUgdGhlIGRyYWdnaW5nIHN0YXJ0c1xuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzdGFydFkgLSBUaGUgeSBjb29yZGluYXRlIHdoZXJlIHRoZSBkcmFnZ2luZyBzdGFydHNcbiAqIEBwcm9wZXJ0eSB7IW51bWJlcn0gZW5kWCAtIFRoZSB4IGNvb3JkaW5hdGUgd2hlcmUgdGhlIGRyYWdnaW5nIGVuZHNcbiAqIEBwcm9wZXJ0eSB7IW51bWJlcn0gZW5kWSAtIFRoZSB5IGNvb3JkaW5hdGUgd2hlcmUgdGhlIGRyYWdnaW5nIGVuZHNcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3BlZWQgWzI1MDAgKiBkaXNwbGF5RGVuc2l0eV0gLSBUaGUgc3BlZWQgYXQgd2hpY2ggdG8gcGVyZm9ybVxuICogdGhpcyBnZXN0dXJlIGluIHBpeGVscyBwZXIgc2Vjb25kLiBUaGUgdmFsdWUgbXVzdCBub3QgYmUgbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIERyYWdzIHRoaXMgb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uXG4gKlxuICogQHBhcmFtIHs/RHJhZ09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlRHJhZ0dlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEcmFnR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgc3RhcnRYLCBzdGFydFksXG4gICAgZW5kWCwgZW5kWSxcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvZHJhZycsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBzdGFydDogdG9Qb2ludChzdGFydFgsIHN0YXJ0WSksXG4gICAgZW5kOiB0b1BvaW50KGVuZFgsIGVuZFkpLFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRmxpbmdPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBmbGluZ2VkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIGZsaW5nIGJvdW5kaW5nIGFyZWEgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIHRoZSBmbGluZyBib3VuZGluZyBhcmVhIGFyZSBwcm92aWRlZCB0aGVuIHRoaXNcbiAqIGFyZWEgaXMgZWZmZWN0aXZlbHkgaWdub3JlZC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbGVmdCAtIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIGZsaW5nIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBmbGluZyBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBmbGluZyBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIGZsaW5nIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gZGlyZWN0aW9uIC0gRGlyZWN0aW9uIG9mIHRoZSBmbGluZy5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZTogYHVwYCwgYGRvd25gLCBgbGVmdGAgYW5kIGByaWdodGAgKGNhc2UgaW5zZW5zaXRpdmUpXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHNwZWVkIFs3NTAwICogZGlzcGxheURlbnNpdHldIC0gVGhlIHNwZWVkIGF0IHdoaWNoIHRvIHBlcmZvcm0gdGhpc1xuICogZ2VzdHVyZSBpbiBwaXhlbHMgcGVyIHNlY29uZC4gVGhlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBtaW5pbXVtIGZsaW5nXG4gKiB2ZWxvY2l0eSBmb3IgdGhlIGdpdmVuIHZpZXcgKDUwIGJ5IGRlZmF1bHQpXG4gKi9cblxuLyoqXG4gKiBEcmFncyB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7P0ZsaW5nT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIG9iamVjdCBjYW4gc3RpbGwgc2Nyb2xsIGluIHRoZSBnaXZlbiBkaXJlY3Rpb24uXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUZsaW5nR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUZsaW5nR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIGRpcmVjdGlvbixcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvZmxpbmcnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgYXJlYTogdG9SZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCksXG4gICAgZGlyZWN0aW9uLFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGluY2hPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBwaW5jaGVkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIHBpbmNoIGJvdW5kaW5nIGFyZWEgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIHRoZSBwaW5jaCBib3VuZGluZyBhcmVhIGFyZSBwcm92aWRlZCB0aGVuIHRoZVxuICogYXJlYSBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcGluY2ggYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0b3AgLSBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHBpbmNoIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHBpbmNoIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgcGluY2ggYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHshbnVtYmVyfSBwZXJjZW50IC0gVGhlIHNpemUgb2YgdGhlIHBpbmNoIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgcGluY2ggYXJlYSBzaXplLlxuICogVmFsaWQgdmFsdWVzIG11c3QgYmUgZmxvYXQgbnVtYmVycyBpbiByYW5nZSAwLi4xLCB3aGVyZSAxLjAgaXMgMTAwJVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzcGVlZCBbMjUwMCAqIGRpc3BsYXlEZW5zaXR5XSAtIFRoZSBzcGVlZCBhdCB3aGljaCB0byBwZXJmb3JtXG4gKiB0aGlzIGdlc3R1cmUgaW4gcGl4ZWxzIHBlciBzZWNvbmQuIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBwaW5jaCBjbG9zZSBnZXN0dXJlLlxuICpcbiAqIEBwYXJhbSB7P1BpbmNoT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVQaW5jaENsb3NlR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvcGluY2hfY2xvc2UnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgYXJlYTogdG9SZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCksXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgcGluY2ggb3BlbiBnZXN0dXJlLlxuICpcbiAqIEBwYXJhbSB7P1BpbmNoT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVQaW5jaE9wZW5HZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUGluY2hPcGVuR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL3BpbmNoX29wZW4nLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgYXJlYTogdG9SZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCksXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3aXBlT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgc3dpcGVkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIHN3aXBlIGJvdW5kaW5nIGFyZWEgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIHRoZSBzd2lwZSBib3VuZGluZyBhcmVhIGFyZSBwcm92aWRlZCB0aGVuIHRoZVxuICogYXJlYSBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgc3dpcGUgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0b3AgLSBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHN3aXBlIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHN3aXBlIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgc3dpcGUgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHshc3RyaW5nfSBkaXJlY3Rpb24gLSBEaXJlY3Rpb24gb2YgdGhlIHN3aXBlLlxuICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlOiBgdXBgLCBgZG93bmAsIGBsZWZ0YCBhbmQgYHJpZ2h0YCAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAqIEBwcm9wZXJ0eSB7IW51bWJlcn0gcGVyY2VudCAtIFRoZSBzaXplIG9mIHRoZSBzd2lwZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHN3aXBlIGFyZWEgc2l6ZS5cbiAqIFZhbGlkIHZhbHVlcyBtdXN0IGJlIGZsb2F0IG51bWJlcnMgaW4gcmFuZ2UgMC4uMSwgd2hlcmUgMS4wIGlzIDEwMCVcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3BlZWQgWzUwMDAgKiBkaXNwbGF5RGVuc2l0eV0gLSBUaGUgc3BlZWQgYXQgd2hpY2ggdG8gcGVyZm9ybSB0aGlzXG4gKiBnZXN0dXJlIGluIHBpeGVscyBwZXIgc2Vjb25kLiBUaGUgdmFsdWUgbXVzdCBub3QgYmUgbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgc3dpcGUgZ2VzdHVyZS5cbiAqXG4gKiBAcGFyYW0gez9Td2lwZU9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlU3dpcGVHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3dpcGVHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsXG4gICAgZGlyZWN0aW9uLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL3N3aXBlJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIGRpcmVjdGlvbixcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2Nyb2xsT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgc2Nyb2xsZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpZCBpcyBtaXNzaW5nIHRoZW4gc2Nyb2xsIGJvdW5kaW5nIGFyZWEgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYSBhcmUgcHJvdmlkZWQgdGhlbiB0aGlzXG4gKiBhcmVhIGlzIGVmZmVjdGl2ZWx5IGlnbm9yZWQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0b3AgLSBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHNjcm9sbCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHshc3RyaW5nfSBkaXJlY3Rpb24gLSBEaXJlY3Rpb24gb2YgdGhlIHNjcm9sbC5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZTogYHVwYCwgYGRvd25gLCBgbGVmdGAgYW5kIGByaWdodGAgKGNhc2UgaW5zZW5zaXRpdmUpXG4gKiBAcHJvcGVydHkgeyFudW1iZXJ9IHBlcmNlbnQgLSBUaGUgc2l6ZSBvZiB0aGUgc2Nyb2xsIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgc2Nyb2xsaW5nIGFyZWEgc2l6ZS5cbiAqIFZhbGlkIHZhbHVlcyBtdXN0IGJlIGZsb2F0IG51bWJlcnMgZ3JlYXRlciB0aGFuIHplcm8sIHdoZXJlIDEuMCBpcyAxMDAlXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHNwZWVkIFs1MDAwICogZGlzcGxheURlbnNpdHldIC0gVGhlIHNwZWVkIGF0IHdoaWNoIHRvIHBlcmZvcm0gdGhpcyBnZXN0dXJlXG4gKiBpbiBwaXhlbHMgcGVyIHNlY29uZC4gVGhlIHZhbHVlIG11c3Qgbm90IGJlIG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHNjcm9sbCBnZXN0dXJlLlxuICpcbiAqIEBwYXJhbSB7P1Njcm9sbE9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBvYmplY3QgY2FuIHN0aWxsIHNjcm9sbCBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLlxuICovXG5jb21tYW5kcy5tb2JpbGVTY3JvbGxHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2Nyb2xsR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIGRpcmVjdGlvbixcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9zY3JvbGwnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgYXJlYTogdG9SZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCksXG4gICAgZGlyZWN0aW9uLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTY3JvbGxFbGVtZW50VG9FbGVtZW50T3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGVsZW1lbnRJZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2Nyb2xsYWJsZSBlbGVtZW50LFxuICogd2hpY2ggaXMgZ29pbmcgdG8gYmUgc2Nyb2xsZWQuIEl0IGlzIHJlcXVpcmVkIHRoaXMgZWxlbWVudFxuICogaXMgYSB2YWxpZCBzY3JvbGxhYmxlIGNvbnRhaW5lciBhbmQgaXQgd2FzIGxvY2F0ZWQgYnkgYC1hbmRyb2lkIHVpYXV0b21hdG9yYFxuICogc3RyYXRlZ3kuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZWxlbWVudFRvSWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGl0ZW0sIHdoaWNoIGJlbG9uZ3NcbiAqIHRvIHRoZSBzY3JvbGxhYmxlIGVsZW1lbnQgYWJvdmUsIGFuZCB3aGljaCBzaG91bGQgYmVjb21lIHZpc2libGUgYWZ0ZXJcbiAqIHRoZSBzY3JvbGxpbmcgb3BlcmF0aW9uIGlzIGZpbmlzaGVkLiBJdCBpcyByZXF1aXJlZCB0aGlzIGVsZW1lbnRcbiAqIHdhcyBsb2NhdGVkIGJ5IGAtYW5kcm9pZCB1aWF1dG9tYXRvcmAgc3RyYXRlZ3kuXG4gKi9cblxuLyoqXG4gKiBTY3JvbGxzIHRoZSBnaXZlbiBzY3JvbGxhYmxlIGVsZW1lbnQgYGVsZW1lbnRJZGAgdW50aWwgYGVsZW1lbnRUb0lkYFxuICogYmVjb21lcyB2aXNpYmxlLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgdGhlIGBlbGVtZW50VG9JZGBcbiAqIGlzIGFscmVhZHkgdmlzaWJsZSBpbiB0aGUgdmlldyBwb3J0LiBPdGhlcndpc2UgaXQgd291bGQgc2Nyb2xsXG4gKiB0byB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIHNjcm9sbGFibGUgY29udHJvbCBhbmQgdHJpZXMgdG8gcmVhY2ggdGhlIGRlc3RpbmF0aW9uIGVsZW1lbnRcbiAqIGJ5IHNjcm9sbGluZyBpdHMgcGFyZW50IHRvIHRoZSBlbmQgc3RlcCBieSBzdGVwLiBUaGUgc2Nyb2xsIGRpcmVjdGlvbiAodmVydGljYWwgb3IgaG9yaXpvbnRhbClcbiAqIGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQHBhcmFtIHtTY3JvbGxFbGVtZW50VG9FbGVtZW50T3B0c30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBzY3JvbGxpbmcgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWRcbiAqL1xuY29tbWFuZHMubW9iaWxlU2Nyb2xsQmFja1RvID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudElkLCBlbGVtZW50VG9JZH0gPSBvcHRzO1xuICBpZiAoIWVsZW1lbnRJZCB8fCAhZWxlbWVudFRvSWQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBCb3RoIGVsZW1lbnRJZCBhbmQgZWxlbWVudFRvSWQgYXJndW1lbnRzIG11c3QgYmUgcHJvdmlkZWRgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKFxuICAgIGAvYXBwaXVtL2VsZW1lbnQvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudElkKX0vc2Nyb2xsX3RvLyR7dXRpbC51bndyYXBFbGVtZW50KGVsZW1lbnRUb0lkKX1gLCAnUE9TVCcsIHt9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2Nyb2xsT3B0c1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgVGhlIGlkZW50aWZpZXIgb2YgYW4gZWxlbWVudC4gSXQgaXMgcmVxdWlyZWQgdGhpcyBlbGVtZW50XG4gKiBpcyBhIHZhbGlkIHNjcm9sbGFibGUgY29udGFpbmVyIGFuZCBpdCB3YXMgbG9jYXRlZCBieSBgLWFuZHJvaWQgdWlhdXRvbWF0b3JgXG4gKiBzdHJhdGVneS4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBub3QgcHJvdmlkZWQgdGhlbiB0aGUgZmlyc3QgY3VycmVudGx5IGF2YWlsYWJsZSBzY3JvbGxhYmxlIHZpZXdcbiAqIGlzIHNlbGVjdGVkIGZvciB0aGUgaW50ZXJhY3Rpb24uXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHN0cmF0ZWd5IFRoZSBmb2xsb3dpbmcgc3RyYXRlZ2llcyBhcmUgc3VwcG9ydGVkOlxuICogLSBgYWNjZXNzaWJpbGl0eSBpZGAgKFVpU2VsZWN0b3IoKS5kZXNjcmlwdGlvbilcbiAqIC0gYGNsYXNzIG5hbWVgIChVaVNlbGVjdG9yKCkuY2xhc3NOYW1lKVxuICogLSBgLWFuZHJvaWQgdWlhdXRvbWF0b3JgIChVaVNlbGVjdG9yKVxuICogQHByb3BlcnR5IHshc3RyaW5nfSBzZWxlY3RvciBUaGUgY29ycmVzcG9uZGluZyBsb29rdXAgdmFsdWUgZm9yIHRoZSBnaXZlblxuICogc3RyYXRlZ3kuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IG1heFN3aXBlcyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dpcGVzIHRvIHBlcmZvcm1cbiAqIG9uIHRoZSB0YXJnZXQgc2Nyb2xsYWJsZSB2aWV3IGluIG9yZGVyIHRvIHJlYWNoIHRoZSBkZXN0aW5hdGlvbiBlbGVtZW50LlxuICogSW4gY2FzZSB0aGlzIHZhbHVlIGlzIHVuc2V0IHRoZW4gaXQgd291bGQgYmUgcmV0cmlldmVkIGZyb20gdGhlIHNjcm9sbGFibGVcbiAqIGVsZW1lbnQgaXRzZWxmICh2dWEgYGdldE1heFNlYXJjaFN3aXBlcygpYCBwcm9wZXJ0eSkuXG4gKi9cblxuLyoqXG4gKiBTY3JvbGxzIHRoZSBnaXZlbiBzY3JvbGxhYmxlIGVsZW1lbnQgdW50aWwgdGhlIGVsZW1lbnQgaWRlbnRpZmllZFxuICogYnkgYHN0cmF0ZWd5YCBhbmQgYHNlbGVjdG9yYCBiZWNvbWVzIHZpc2libGUuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseSBpZiB0aGVcbiAqIGRlc3RpbmF0aW9uIGVsZW1lbnQgaXMgYWxyZWFkeSB2aXNpYmxlIGluIHRoZSB2aWV3IHBvcnQuIE90aGVyd2lzZSBpdCB3b3VsZCBzY3JvbGxcbiAqIHRvIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgc2Nyb2xsYWJsZSBjb250cm9sIGFuZCB0cmllcyB0byByZWFjaCB0aGUgZGVzdGluYXRpb24gZWxlbWVudFxuICogYnkgc2Nyb2xsaW5nIGl0cyBwYXJlbnQgdG8gdGhlIGVuZCBzdGVwIGJ5IHN0ZXAuIFRoZSBzY3JvbGwgZGlyZWN0aW9uICh2ZXJ0aWNhbCBvciBob3Jpem9udGFsKVxuICogaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBAcGFyYW0ge1Njcm9sbE9wdHN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgc2Nyb2xsaW5nIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVNjcm9sbCA9IGFzeW5jIGZ1bmN0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnQsIGVsZW1lbnRJZCwgLy8gYGVsZW1lbnRgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgZWxlbWVudElkYCBpbnN0ZWFkXG4gICAgc3RyYXRlZ3ksIHNlbGVjdG9yLCBtYXhTd2lwZXNcbiAgfSA9IG9wdHM7XG4gIGlmICghc3RyYXRlZ3kgfHwgIXNlbGVjdG9yKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgQm90aCBzdHJhdGVneSBhbmQgc2VsZWN0b3IgYXJndW1lbnRzIG11c3QgYmUgcHJvdmlkZWRgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvdG91Y2gvc2Nyb2xsJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQgfHwgZWxlbWVudCksXG4gICAgcGFyYW1zOiB7c3RyYXRlZ3ksIHNlbGVjdG9yLCBtYXhTd2lwZXN9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZ2VzdHVyZXMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -51,6 +51,7 @@ const DEVICE_PORT_ALLOCATION_GUARD = _appiumSupport.util.getLockFileGuard(_path.
51
51
 
52
52
  const DEVICE_PORT = 6790;
53
53
  const MJPEG_SERVER_DEVICE_PORT = 7810;
54
+ const LOCALHOST_IP4 = '127.0.0.1';
54
55
  const NO_PROXY = [['GET', new RegExp('^/session/(?!.*/)')], ['GET', new RegExp('^/session/[^/]+/alert_[^/]+')], ['GET', new RegExp('^/session/[^/]+/alert/[^/]+')], ['GET', new RegExp('^/session/[^/]+/appium/[^/]+/current_activity')], ['GET', new RegExp('^/session/[^/]+/appium/[^/]+/current_package')], ['GET', new RegExp('^/session/[^/]+/appium/app/[^/]+')], ['GET', new RegExp('^/session/[^/]+/appium/device/[^/]+')], ['GET', new RegExp('^/session/[^/]+/appium/settings')], ['GET', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/contexts')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/attribute')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/displayed')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/enabled')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/location_in_view')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/name')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/screenshot')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/selected')], ['GET', new RegExp('^/session/[^/]+/ime/[^/]+')], ['GET', new RegExp('^/session/[^/]+/location')], ['GET', new RegExp('^/session/[^/]+/log/types')], ['GET', new RegExp('^/session/[^/]+/network_connection')], ['GET', new RegExp('^/session/[^/]+/screenshot')], ['GET', new RegExp('^/session/[^/]+/timeouts')], ['GET', new RegExp('^/session/[^/]+/url')], ['POST', new RegExp('^/session/[^/]+/[^/]+_alert$')], ['POST', new RegExp('^/session/[^/]+/actions')], ['POST', new RegExp('^/session/[^/]+/alert/[^/]+')], ['POST', new RegExp('^/session/[^/]+/app/[^/]')], ['POST', new RegExp('^/session/[^/]+/appium/[^/]+/start_activity')], ['POST', new RegExp('^/session/[^/]+/appium/app/[^/]+')], ['POST', new RegExp('^/session/[^/]+/appium/compare_images')], ['POST', new RegExp('^/session/[^/]+/appium/device/(?!set_clipboard)[^/]+')], ['POST', new RegExp('^/session/[^/]+/appium/element/[^/]+/replace_value')], ['POST', new RegExp('^/session/[^/]+/appium/element/[^/]+/value')], ['POST', new RegExp('^/session/[^/]+/appium/getPerformanceData')], ['POST', new RegExp('^/session/[^/]+/appium/performanceData/types')], ['POST', new RegExp('^/session/[^/]+/appium/settings')], ['POST', new RegExp('^/session/[^/]+/appium/execute_driver')], ['POST', new RegExp('^/session/[^/]+/appium/start_recording_screen')], ['POST', new RegExp('^/session/[^/]+/appium/stop_recording_screen')], ['POST', new RegExp('^/session/[^/]+/appium/.*event')], ['POST', new RegExp('^/session/[^/]+/context')], ['POST', new RegExp('^/session/[^/]+/element')], ['POST', new RegExp('^/session/[^/]+/ime/[^/]+')], ['POST', new RegExp('^/session/[^/]+/keys')], ['POST', new RegExp('^/session/[^/]+/location')], ['POST', new RegExp('^/session/[^/]+/log')], ['POST', new RegExp('^/session/[^/]+/network_connection')], ['POST', new RegExp('^/session/[^/]+/timeouts')], ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')], ['POST', new RegExp('^/session/[^/]+/touch/perform')], ['POST', new RegExp('^/session/[^/]+/url')], ['POST', new RegExp('^/session/[^/]+/execute')], ['POST', new RegExp('^/session/[^/]+/execute_async')], ['GET', new RegExp('^/session/[^/]+/window/rect')], ['POST', new RegExp('^/session/[^/]+/execute/async')], ['POST', new RegExp('^/session/[^/]+/execute/sync')]];
55
56
  const CHROME_NO_PROXY = [['GET', new RegExp('^/session/[^/]+/appium')], ['GET', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/rect')], ['GET', new RegExp('^/session/[^/]+/log/types$')], ['GET', new RegExp('^/session/[^/]+/orientation')], ['POST', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/context')], ['POST', new RegExp('^/session/[^/]+/log$')], ['POST', new RegExp('^/session/[^/]+/orientation')], ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')], ['POST', new RegExp('^/session/[^/]+/touch/perform')], ['POST', new RegExp('^/session/[^/]+/execute$')], ['POST', new RegExp('^/session/[^/]+/execute/sync')]];
56
57
  const MEMOIZED_FUNCTIONS = ['getStatusBarHeight', 'getDevicePixelRatio'];
@@ -195,6 +196,10 @@ class AndroidUiautomator2Driver extends _appiumBaseDriver.BaseDriver {
195
196
  const forwardPort = async localPort => {
196
197
  _logger.default.debug(`Forwarding UiAutomator2 Server port ${DEVICE_PORT} to local port ${localPort}`);
197
198
 
199
+ if ((await (0, _portscanner.checkPortStatus)(localPort, LOCALHOST_IP4)) === 'open') {
200
+ _logger.default.errorAndThrow(`UiAutomator2 Server cannot start because the local port #${localPort} is busy. ` + `Make sure the port you provide via 'systemPort' capability is not occupied. ` + `This situation might often be a result of an inaccurate sessions management, e.g. ` + `old automation sessions on the same device must always be closed before starting new ones.`);
201
+ }
202
+
198
203
  await this.adb.forwardPort(localPort, DEVICE_PORT);
199
204
  };
200
205
 
@@ -348,7 +353,7 @@ class AndroidUiautomator2Driver extends _appiumBaseDriver.BaseDriver {
348
353
 
349
354
  async initUiAutomator2Server() {
350
355
  const uiautomator2Opts = {
351
- host: this.opts.remoteAdbHost || this.opts.host || '127.0.0.1',
356
+ host: this.opts.remoteAdbHost || this.opts.host || LOCALHOST_IP4,
352
357
  systemPort: this.opts.systemPort,
353
358
  devicePort: DEVICE_PORT,
354
359
  adb: this.adb,
@@ -636,4 +641,4 @@ var _default = AndroidUiautomator2Driver;
636
641
  exports.default = _default;require('source-map-support').install();
637
642
 
638
643
 
639
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiaGVscGVycyIsIk9iamVjdCIsImFzc2lnbiIsInVpYXV0b21hdG9yMkhlbHBlcnMiLCJhbmRyb2lkSGVscGVycyIsIkRFVklDRV9QT1JUX1JBTkdFIiwiREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCIsInV0aWwiLCJnZXRMb2NrRmlsZUd1YXJkIiwicGF0aCIsInJlc29sdmUiLCJvcyIsInRtcGRpciIsInRpbWVvdXQiLCJ0cnlSZWNvdmVyeSIsIkRFVklDRV9QT1JUIiwiTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUIiwiTk9fUFJPWFkiLCJSZWdFeHAiLCJDSFJPTUVfTk9fUFJPWFkiLCJNRU1PSVpFRF9GVU5DVElPTlMiLCJBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIiwiQmFzZURyaXZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsInNoZWxsIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJ1aWF1dG9tYXRvcjIiLCJqd3BQcm94eUFjdGl2ZSIsImRlZmF1bHRJTUUiLCJqd3BQcm94eUF2b2lkIiwiYXBrU3RyaW5ncyIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwiYWxsb3dJbnZpc2libGVFbGVtZW50cyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJmbiIsIl8iLCJtZW1vaXplIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJjcmVhdGVTZXNzaW9uIiwiYXJncyIsInNlc3Npb25JZCIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImRlZmF1bHRPcHRzIiwiZnVsbFJlc2V0IiwiYXV0b0xhdW5jaCIsImFkYlBvcnQiLCJERUZBVUxUX0FEQl9QT1JUIiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiZGVmYXVsdHMiLCJpc0Nocm9tZVNlc3Npb24iLCJsb2dnZXIiLCJpbmZvIiwicGtnIiwiYWN0aXZpdHkiLCJnZXRDaHJvbWVQa2ciLCJicm93c2VyTmFtZSIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsInJlYm9vdCIsInNldEF2ZEZyb21DYXBhYmlsaXRpZXMiLCJhcHAiLCJjb25maWd1cmVBcHAiLCJBUEtfRVhURU5TSU9OIiwiQVBLU19FWFRFTlNJT04iLCJjaGVja0FwcFByZXNlbnQiLCJzdGFydFVpQXV0b21hdG9yMlNlc3Npb24iLCJmaWxsRGV2aWNlRGV0YWlscyIsIm1qcGVnU2NyZWVuc2hvdFVybCIsIm1qcGVnU3RyZWFtIiwibWpwZWciLCJNSnBlZ1N0cmVhbSIsInN0YXJ0IiwiZSIsImRlbGV0ZVNlc3Npb24iLCJwaXhlbFJhdGlvIiwiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsInN0YXRCYXJIZWlnaHQiLCJnZXRTdGF0dXNCYXJIZWlnaHQiLCJ2aWV3cG9ydFJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJkcml2ZXJEYXRhIiwiZ2V0U2Vzc2lvbiIsInNlc3Npb25EYXRhIiwiZGVidWciLCJ1aWEyRGF0YSIsImp3cHJveHkiLCJjb21tYW5kIiwiaXNFbXVsYXRvciIsImFkYiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImFsbG9jYXRlU3lzdGVtUG9ydCIsImZvcndhcmRQb3J0IiwibG9jYWxQb3J0Iiwic3lzdGVtUG9ydCIsIl9oYXNTeXN0ZW1Qb3J0SW5DYXBzIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsInJlbGVhc2VTeXN0ZW1Qb3J0IiwicmVtb3ZlUG9ydEZvcndhcmQiLCJhbGxvY2F0ZU1qcGVnU2VydmVyUG9ydCIsIm1qcGVnU2VydmVyUG9ydCIsInJlbGVhc2VNanBlZ1NlcnZlclBvcnQiLCJ1ZGlkIiwiZW1Qb3J0IiwiZ2V0RGV2aWNlSW5mb0Zyb21DYXBzIiwiY3JlYXRlQURCIiwiYXBpTGV2ZWwiLCJnZXRBcGlMZXZlbCIsInNldEhpZGRlbkFwaVBvbGljeSIsImlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yIiwiaGFzVmFsdWUiLCJncHNFbmFibGVkIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsIndhcm4iLCJhcHBJbmZvIiwiZ2V0TGF1bmNoSW5mbyIsImN1ckRldmljZUlkIiwiZGV2aWNlVURJRCIsImluaXREZXZpY2UiLCJpbml0VWlBdXRvbWF0b3IyU2VydmVyIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsImlzQW5pbWF0aW9uT24iLCJzZXRBbmltYXRpb25TdGF0ZSIsIl93YXNXaW5kb3dBbmltYXRpb25EaXNhYmxlZCIsImluaXRBVVQiLCJzdGFydFNlc3Npb24iLCJhZGREZXZpY2VJbmZvVG9DYXBzIiwic2tpcFVubG9jayIsInVubG9jayIsInN0YXJ0Q2hyb21lU2Vzc2lvbiIsImVuc3VyZUFwcFN0YXJ0cyIsIm9yaWVudGF0aW9uIiwic2V0T3JpZW50YXRpb24iLCJhdXRvV2VidmlldyIsInZpZXdOYW1lIiwiZGVmYXVsdFdlYnZpZXdOYW1lIiwiYXV0b1dlYnZpZXdUaW1lb3V0Iiwic2V0Q29udGV4dCIsImFwaVZlcnNpb24iLCJtYW51ZmFjdHVyZXIiLCJtb2RlbCIsInJlYWxEaXNwbGF5U2l6ZSIsImRpc3BsYXlEZW5zaXR5IiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsImRldmljZUFwaUxldmVsIiwicGFyc2VJbnQiLCJkZXZpY2VTY3JlZW5TaXplIiwiZGV2aWNlU2NyZWVuRGVuc2l0eSIsImRldmljZU1vZGVsIiwiZGV2aWNlTWFudWZhY3R1cmVyIiwidWlhdXRvbWF0b3IyT3B0cyIsImhvc3QiLCJyZW1vdGVBZGJIb3N0IiwiZGV2aWNlUG9ydCIsImFwayIsInRtcERpciIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicmVhZFRpbWVvdXQiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCIsIlVpQXV0b21hdG9yMlNlcnZlciIsInByb3h5UmVxUmVzIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsImluc3RhbGxTZXJ2ZXJBcGsiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCIsImFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJzdGRlcnIiLCJtZXNzYWdlIiwidW5pbnN0YWxsT3RoZXJQYWNrYWdlcyIsInBhcnNlQXJyYXkiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwibWFwIiwiaW5zdGFsbE90aGVyQXBrcyIsIm5vU2lnbiIsImNoZWNrQXBrQ2VydCIsInJlcXVpcmVEZWZhdWx0Q2VydCIsInNpZ25BcHAiLCJza2lwVW5pbnN0YWxsIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbEFwayIsImZhc3RSZXNldCIsInJlc2V0QXBwIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJhbmRyb2lkQ292ZXJhZ2UiLCJzdGFydEFwcCIsImFjdGlvbiIsImludGVudEFjdGlvbiIsImNhdGVnb3J5IiwiaW50ZW50Q2F0ZWdvcnkiLCJmbGFncyIsImludGVudEZsYWdzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsIndhaXRGb3JMYXVuY2giLCJhcHBXYWl0Rm9yTGF1bmNoIiwid2FpdER1cmF0aW9uIiwiYXBwV2FpdER1cmF0aW9uIiwib3B0aW9uYWxJbnRlbnRBcmd1bWVudHMiLCJzdG9wQXBwIiwiZG9udFN0b3BBcHBPblJlc2V0IiwicmV0cnkiLCJ1c2VyIiwidXNlclByb2ZpbGUiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwiaWduIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwibW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyIsInN0b3BDaHJvbWVkcml2ZXJQcm94aWVzIiwiZXJyIiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsInNldElNRSIsImVuZEFuZHJvaWRDb3ZlcmFnZSIsImFuZHJvaWRDb3ZlcmFnZUVuZEludGVudCIsImJyb2FkY2FzdCIsImZvcmNlU3RvcCIsInN0b3BMb2djYXQiLCJlcnJvciIsInNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kiLCJhdmROYW1lIiwia2lsbEVtdWxhdG9yIiwic3RvcCIsImZzIiwiZXhpc3RzIiwid3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QiLCJ3cmFwcGVkIiwicmVzdGFydCIsInByb3h5QWN0aXZlIiwiY2FuUHJveHkiLCJnZXRQcm94eUF2b2lkTGlzdCIsIm5hdGl2ZVdlYlNjcmVlbnNob3QiLCJpc0Nocm9tZUJyb3dzZXIiLCJjbWQiLCJ0b1BhaXJzIiwiYW5kcm9pZENvbW1hbmRzIiwicHJvdG90eXBlIiwiY29tbWFuZHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsT0FBTyxHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYyxFQUFkLEVBQWtCQyxnQkFBbEIsRUFBdUNDLG1DQUF2QyxDQUFoQjtBQUlBLE1BQU1DLGlCQUFpQixHQUFHLENBQUMsSUFBRCxFQUFPLElBQVAsQ0FBMUI7O0FBSUEsTUFBTUMsNEJBQTRCLEdBQUdDLG9CQUFLQyxnQkFBTCxDQUNuQ0MsY0FBS0MsT0FB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RUFBUyxJQUFJQSxNQUFKLENBQVcsdUNBQVgsQ0FBVCxDQS9CZSxFQWdDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsc0RBQVgsQ0FBVCxDQWhDZSxFQWlDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsb0RBQVgsQ0FBVCxDQWpDZSxFQWtDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsNENBQVgsQ0FBVCxDQWxDZSxFQW1DZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMkNBQVgsQ0FBVCxDQW5DZSxFQW9DZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsOENBQVgsQ0FBVCxDQXBDZSxFQXFDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsaUNBQVgsQ0FBVCxDQXJDZSxFQXNDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsdUNBQVgsQ0FBVCxDQXRDZSxFQXVDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsK0NBQVgsQ0FBVCxDQXZDZSxFQXdDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsOENBQVgsQ0FBVCxDQXhDZSxFQXlDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsZ0NBQVgsQ0FBVCxDQXpDZSxFQTBDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBVCxDQTFDZSxFQTJDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBVCxDQTNDZSxFQTRDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMkJBQVgsQ0FBVCxDQTVDZSxFQTZDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsc0JBQVgsQ0FBVCxDQTdDZSxFQThDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMEJBQVgsQ0FBVCxDQTlDZSxFQStDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcscUJBQVgsQ0FBVCxDQS9D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QUQsRUFBTS9OLEVBQU4sQ0FBVCxJQUFzQkMsZ0JBQUUrTixPQUFGLENBQVVDLG9DQUFWLENBQXRCLEVBQWtEO0FBQ2hEdFAsRUFBQUEseUJBQXlCLENBQUN1UCxTQUExQixDQUFvQ0gsR0FBcEMsSUFBMkMvTixFQUEzQztBQUNEOztBQUdELEtBQUssSUFBSSxDQUFDK04sR0FBRCxFQUFNL04sRUFBTixDQUFULElBQXNCQyxnQkFBRStOLE9BQUYsQ0FBVUcsY0FBVixDQUF0QixFQUEyQztBQUN6Q3hQLEVBQUFBLHlCQUF5QixDQUFDdVAsU0FBMUIsQ0FBb0NILEdBQXBDLElBQTJDL04sRUFBM0M7QUFDRDs7ZUFHY3JCLHlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJhc2VEcml2ZXIsIERldmljZVNldHRpbmdzIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcbmltcG9ydCB7IFVpQXV0b21hdG9yMlNlcnZlciwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQgfSBmcm9tICcuL3VpYXV0b21hdG9yMic7XG5pbXBvcnQgeyBmcywgdXRpbCwgbWpwZWcgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgY29tbWFuZHMgZnJvbSAnLi9jb21tYW5kcy9pbmRleCc7XG5pbXBvcnQgeyBERUZBVUxUX0FEQl9QT1JUIH0gZnJvbSAnYXBwaXVtLWFkYic7XG5pbXBvcnQgdWlhdXRvbWF0b3IySGVscGVycyBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgYW5kcm9pZEhlbHBlcnMsIGFuZHJvaWRDb21tYW5kcywgU0VUVElOR1NfSEVMUEVSX1BLR19JRCB9IGZyb20gJ2FwcGl1bS1hbmRyb2lkLWRyaXZlcic7XG5pbXBvcnQgZGVzaXJlZENhcENvbnN0cmFpbnRzIGZyb20gJy4vZGVzaXJlZC1jYXBzJztcbmltcG9ydCB7IGZpbmRBUG9ydE5vdEluVXNlIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQVBLX0VYVEVOU0lPTiwgQVBLU19FWFRFTlNJT04gfSBmcm9tICcuL2V4dGVuc2lvbnMnO1xuXG5cbmNvbnN0IGhlbHBlcnMgPSBPYmplY3QuYXNzaWduKHt9LCB1aWF1dG9tYXRvcjJIZWxwZXJzLCBhbmRyb2lkSGVscGVycyk7XG5cbi8vIFRoZSByYW5nZSBvZiBwb3J0cyB3ZSBjYW4gdXNlIG9uIHRoZSBzeXN0ZW0gZm9yIGNvbW11bmljYXRpbmcgdG8gdGhlXG4vLyBVaUF1dG9tYXRvcjIgSFRUUCBzZXJ2ZXIgb24gdGhlIGRldmljZVxuY29uc3QgREVWSUNFX1BPUlRfUkFOR0UgPSBbODIwMCwgODI5OV07XG5cbi8vIFRoZSBndWFyZCBpcyBuZWVkZWQgdG8gYXZvaWQgZHluYW1pYyBzeXN0ZW0gcG9ydCBhbGxvY2F0aW9uIGNvbmZsaWN0cyBmb3Jcbi8vIHBhcmFsbGVsIGRyaXZlciBzZXNzaW9uc1xuY29uc3QgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCA9IHV0aWwuZ2V0TG9ja0ZpbGVHdWFyZChcbiAgcGF0aC5yZXNvbHZlKG9zLnRtcGRpcigpLCAndWlhMl9kZXZpY2VfcG9ydF9ndWFyZCcpLFxuICB7dGltZW91dDogMjUsIHRyeVJlY292ZXJ5OiB0cnVlfVxuKTtcblxuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IFVpQXV0b21hdG9yMiBsaXN0ZW5zIHRvIG9uIHRoZSBkZXZpY2UuIFdlIHdpbGwgZm9yd2FyZFxuLy8gb25lIG9mIHRoZSBwb3J0cyBhYm92ZSBvbiB0aGUgc3lzdGVtIHRvIHRoaXMgcG9ydCBvbiB0aGUgZGV2aWNlLlxuY29uc3QgREVWSUNFX1BPUlQgPSA2NzkwO1xuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IHRoZSBVaUF1dG9tYXRvcjIgTUpQRUcgc2VydmVyIGxpc3RlbnMgdG8gb24gdGhlIGRldmljZS5cbi8vIFdlIHdpbGwgZm9yd2FyZCBvbmUgb2YgdGhlIHBvcnRzIGFib3ZlIG9uIHRoZSBzeXN0ZW0gdG8gdGhpcyBwb3J0IG9uIHRoZVxuLy8gZGV2aWNlLlxuY29uc3QgTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUID0gNzgxMDtcblxuLy8gTk9fUFJPWFkgY29udGFpbnMgdGhlIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBVaUF1dG9tYXRvcjIgc2VydmVyLlxuLy8gVE9ETzogIEFkZCB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gVWlBdXRvbWF0b3IyIHNlcnZlci5cbi8vIFRPRE86IE5lZWQgdG8gc2VncmVnYXRlIHRoZSBwYXRocyBiZXR0ZXIgd2F5IHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hlcmV2ZXIgYXBwbGljYWJsZS5cbi8vIChOb3Qgc2VncmVnYXRpbmcgcmlnaHQgYXdheSBiZWNhdXNlIG1vcmUgcGF0aHMgdG8gYmUgYWRkZWQgaW4gdGhlIE5PX1BST1hZIGxpc3QpXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vKD8hLiovKScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnRfW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FsZXJ0L1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvY3VycmVudF9hY3Rpdml0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL2N1cnJlbnRfcGFja2FnZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9hdHRyaWJ1dGUnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZGlzcGxheWVkJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2VuYWJsZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvbG9jYXRpb25faW5fdmlldycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9uYW1lJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3NjcmVlbnNob3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvc2VsZWN0ZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9jYXRpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZy90eXBlcycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zY3JlZW5zaG90JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90aW1lb3V0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdXJsJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvW14vXStfYWxlcnQkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWN0aW9ucycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FsZXJ0L1teL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwL1teL10nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvc3RhcnRfYWN0aXZpdHknKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL1teL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2NvbXBhcmVfaW1hZ2VzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS8oPyFzZXRfY2xpcGJvYXJkKVteL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2VsZW1lbnQvW14vXSsvcmVwbGFjZV92YWx1ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9lbGVtZW50L1teL10rL3ZhbHVlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2dldFBlcmZvcm1hbmNlRGF0YScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9wZXJmb3JtYW5jZURhdGEvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc2V0dGluZ3MnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZXhlY3V0ZV9kcml2ZXInKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RhcnRfcmVjb3JkaW5nX3NjcmVlbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zdG9wX3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vLipldmVudCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsva2V5cycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvY2F0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcblxuICAvLyBNSlNPTldQIGNvbW1hbmRzXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZV9hc3luYycpXSxcbiAgLy8gVzNDIGNvbW1hbmRzXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3dpbmRvdy9yZWN0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbl07XG5cbi8vIFRoaXMgaXMgYSBzZXQgb2YgbWV0aG9kcyBhbmQgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIENocm9tZWRyaXZlci5cbmNvbnN0IENIUk9NRV9OT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3JlY3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZy90eXBlcyQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZyQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9vcmllbnRhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL211bHRpL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9wZXJmb3JtJyldLFxuXG4gIC8vIHRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIG1vYmlsZTogY29tbWFuZHMgd29ya2luZyBpbiB3ZWIgY29udGV4dFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZSQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG5dO1xuXG5jb25zdCBNRU1PSVpFRF9GVU5DVElPTlMgPSBbXG4gICdnZXRTdGF0dXNCYXJIZWlnaHQnLFxuICAnZ2V0RGV2aWNlUGl4ZWxSYXRpbycsXG5dO1xuXG5jbGFzcyBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30sIHNob3VsZFZhbGlkYXRlQ2FwcyA9IHRydWUpIHtcbiAgICAvLyBgc2hlbGxgIG92ZXJ3cml0ZXMgYWRiLnNoZWxsLCBzbyByZW1vdmVcbiAgICBkZWxldGUgb3B0cy5zaGVsbDtcblxuICAgIHN1cGVyKG9wdHMsIHNob3VsZFZhbGlkYXRlQ2Fwcyk7XG4gICAgdGhpcy5sb2NhdG9yU3RyYXRlZ2llcyA9IFtcbiAgICAgICd4cGF0aCcsXG4gICAgICAnaWQnLFxuICAgICAgJ2NsYXNzIG5hbWUnLFxuICAgICAgJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgICAgJ2NzcyBzZWxlY3RvcicsXG4gICAgICAnLWFuZHJvaWQgdWlhdXRvbWF0b3InXG4gICAgXTtcbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDYXBDb25zdHJhaW50cztcbiAgICB0aGlzLnVpYXV0b21hdG9yMiA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGVmYXVsdElNRSA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgdGhpcy5hcGtTdHJpbmdzID0ge307IC8vIG1hcCBvZiBsYW5ndWFnZSAtPiBzdHJpbmdzIG9ialxuXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2UsIGFsbG93SW52aXNpYmxlRWxlbWVudHM6IGZhbHNlfSxcbiAgICAgICAgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIC8vIGhhbmRsZSB3ZWJ2aWV3IG1lY2hhbmljcyBmcm9tIEFuZHJvaWREcml2ZXJcbiAgICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVycyA9IHt9O1xuXG4gICAgLy8gbWVtb2l6ZSBmdW5jdGlvbnMgaGVyZSwgc28gdGhhdCB0aGV5IGFyZSBkb25lIG9uIGEgcGVyLWluc3RhbmNlIGJhc2lzXG4gICAgZm9yIChjb25zdCBmbiBvZiBNRU1PSVpFRF9GVU5DVElPTlMpIHtcbiAgICAgIHRoaXNbZm5dID0gXy5tZW1vaXplKHRoaXNbZm5dKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlRGVzaXJlZENhcHMoY2FwcykgJiYgYW5kcm9pZEhlbHBlcnMudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IHRoaXMuY2FwcyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiV2UncmUgZ29pbmcgdG8gcnVuIGEgQ2hyb21lLWJhc2VkIHNlc3Npb25cIik7XG4gICAgICAgIGxldCB7cGtnLCBhY3Rpdml0eX0gPSBoZWxwZXJzLmdldENocm9tZVBrZyh0aGlzLm9wdHMuYnJvd3Nlck5hbWUpO1xuICAgICAgICB0aGlzLm9wdHMuYXBwUGFja2FnZSA9IHRoaXMuY2Fwcy5hcHBQYWNrYWdlID0gcGtnO1xuICAgICAgICB0aGlzLm9wdHMuYXBwQWN0aXZpdHkgPSB0aGlzLmNhcHMuYXBwQWN0aXZpdHkgPSBhY3Rpdml0eTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYENocm9tZS10eXBlIHBhY2thZ2UgYW5kIGFjdGl2aXR5IGFyZSAke3BrZ30gYW5kICR7YWN0aXZpdHl9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICAgIHRoaXMuc2V0QXZkRnJvbUNhcGFiaWxpdGllcyhjYXBzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgICAgLy8gZmluZCBhbmQgY29weSwgb3IgZG93bmxvYWQgYW5kIHVuemlwIGFuIGFwcCB1cmwgb3IgcGF0aFxuICAgICAgICB0aGlzLm9wdHMuYXBwID0gYXdhaXQgdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcCh0aGlzLm9wdHMuYXBwLCBbQVBLX0VYVEVOU0lPTiwgQVBLU19FWFRFTlNJT05dKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcFByZXNlbnQoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgICAgLy8gdGhlIGFwcCBpc24ndCBhbiBhY3R1YWwgYXBwIGZpbGUgYnV0IHJhdGhlciBzb21ldGhpbmcgd2Ugd2FudCB0b1xuICAgICAgICAvLyBhc3N1bWUgaXMgb24gdGhlIGRldmljZSBhbmQganVzdCBsYXVuY2ggdmlhIHRoZSBhcHBQYWNrYWdlXG4gICAgICAgIGxvZ2dlci5pbmZvKGBTdGFydGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nIGRpcmVjdGx5IG9uIHRoZSBkZXZpY2VgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBOZWl0aGVyICdhcHAnIG5vciAnYXBwUGFja2FnZScgd2FzIHNldC4gU3RhcnRpbmcgVWlBdXRvbWF0b3IyIGAgK1xuICAgICAgICAgICd3aXRob3V0IHRoZSB0YXJnZXQgYXBwbGljYXRpb24nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0cy5hZGJQb3J0ID0gdGhpcy5vcHRzLmFkYlBvcnQgfHwgREVGQVVMVF9BREJfUE9SVDtcblxuICAgICAgYXdhaXQgdGhpcy5zdGFydFVpQXV0b21hdG9yMlNlc3Npb24oKTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsbERldmljZURldGFpbHMoKTtcbiAgICAgIGlmICh0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBTdGFydGluZyBNSlBFRyBzdHJlYW0gcmVhZGluZyBVUkw6ICcke3RoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmx9J2ApO1xuICAgICAgICB0aGlzLm1qcGVnU3RyZWFtID0gbmV3IG1qcGVnLk1KcGVnU3RyZWFtKHRoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmwpO1xuICAgICAgICBhd2FpdCB0aGlzLm1qcGVnU3RyZWFtLnN0YXJ0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW3Nlc3Npb25JZCwgdGhpcy5jYXBzXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZmlsbERldmljZURldGFpbHMgKCkge1xuICAgIHRoaXMuY2Fwcy5waXhlbFJhdGlvID0gYXdhaXQgdGhpcy5nZXREZXZpY2VQaXhlbFJhdGlvKCk7XG4gICAgdGhpcy5jYXBzLnN0YXRCYXJIZWlnaHQgPSBhd2FpdCB0aGlzLmdldFN0YXR1c0JhckhlaWdodCgpO1xuICAgIHRoaXMuY2Fwcy52aWV3cG9ydFJlY3QgPSBhd2FpdCB0aGlzLmdldFZpZXdQb3J0UmVjdCgpO1xuICB9XG5cbiAgZ2V0IGRyaXZlckRhdGEgKCkge1xuICAgIC8vIFRPRE8gZmlsbCBvdXQgcmVzb3VyY2UgaW5mbyBoZXJlXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgYXN5bmMgZ2V0U2Vzc2lvbiAoKSB7XG4gICAgbGV0IHNlc3Npb25EYXRhID0gYXdhaXQgc3VwZXIuZ2V0U2Vzc2lvbigpO1xuICAgIGxvZ2dlci5kZWJ1ZygnR2V0dGluZyBzZXNzaW9uIGRldGFpbHMgZnJvbSBzZXJ2ZXIgdG8gbWl4IGluJyk7XG4gICAgbGV0IHVpYTJEYXRhID0gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvJywgJ0dFVCcsIHt9KTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc2Vzc2lvbkRhdGEsIHVpYTJEYXRhKTtcbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdhdmQgbmFtZSBkZWZpbmVkLCBpZ25vcmluZyBkZXZpY2UgbmFtZSBhbmQgcGxhdGZvcm0gdmVyc2lvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNhcHMuZGV2aWNlTmFtZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnYXZkIG9yIGRldmljZU5hbWUgc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlcycpO1xuICAgICAgfVxuICAgICAgaWYgKCFjYXBzLnBsYXRmb3JtVmVyc2lvbikge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlU3lzdGVtUG9ydCAoKSB7XG4gICAgY29uc3QgZm9yd2FyZFBvcnQgPSBhc3luYyAobG9jYWxQb3J0KSA9PiB7XG4gICAgICBsb2dnZXIuZGVidWcoYEZvcndhcmRpbmcgVWlBdXRvbWF0b3IyIFNlcnZlciBwb3J0ICR7REVWSUNFX1BPUlR9IHRvIGxvY2FsIHBvcnQgJHtsb2NhbFBvcnR9YCk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydChsb2NhbFBvcnQsIERFVklDRV9QT1JUKTtcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KSB7XG4gICAgICB0aGlzLl9oYXNTeXN0ZW1Qb3J0SW5DYXBzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBhd2FpdCBmb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgfVxuXG4gICAgYXdhaXQgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBbc3RhcnRQb3J0LCBlbmRQb3J0XSA9IERFVklDRV9QT1JUX1JBTkdFO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5vcHRzLnN5c3RlbVBvcnQgPSBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShzdGFydFBvcnQsIGVuZFBvcnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgYW55IGZyZWUgcG9ydCBpbiByYW5nZSAke3N0YXJ0UG9ydH0uLiR7ZW5kUG9ydH19LiBgICtcbiAgICAgICAgICBgUGxlYXNlIHNldCB0aGUgYXZhaWxhYmxlIHBvcnQgbnVtYmVyIGJ5IHByb3ZpZGluZyB0aGUgc3lzdGVtUG9ydCBjYXBhYmlsaXR5IG9yIGAgK1xuICAgICAgICAgIGBkb3VibGUgY2hlY2sgdGhlIHByb2Nlc3NlcyB0aGF0IGFyZSBsb2NraW5nIHBvcnRzIHdpdGhpbiB0aGlzIHJhbmdlIGFuZCB0ZXJtaW5hdGUgYCArXG4gICAgICAgICAgYHRoZXNlIHdoaWNoIGFyZSBub3QgbmVlZGVkIGFueW1vcmVgKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGZvcndhcmRQb3J0KHRoaXMub3B0cy5zeXN0ZW1Qb3J0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VTeXN0ZW1Qb3J0ICgpIHtcbiAgICBpZiAoIXRoaXMub3B0cy5zeXN0ZW1Qb3J0IHx8ICF0aGlzLmFkYikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9oYXNTeXN0ZW1Qb3J0SW5DYXBzKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQoYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLnN5c3RlbVBvcnQpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhbGxvY2F0ZU1qcGVnU2VydmVyUG9ydCAoKSB7XG4gICAgaWYgKHRoaXMub3B0cy5tanBlZ1NlcnZlclBvcnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcndhcmRQb3J0KHRoaXMub3B0cy5tanBlZ1NlcnZlclBvcnQsIE1KUEVHX1NFUlZFUl9ERVZJQ0VfUE9SVCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVsZWFzZU1qcGVnU2VydmVyUG9ydCAoKSB7XG4gICAgaWYgKHRoaXMub3B0cy5tanBlZ1NlcnZlclBvcnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5tanBlZ1NlcnZlclBvcnQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VWlBdXRvbWF0b3IyU2Vzc2lvbiAoKSB7XG4gICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICBsZXQge3VkaWQsIGVtUG9ydH0gPSBhd2FpdCBoZWxwZXJzLmdldERldmljZUluZm9Gcm9tQ2Fwcyh0aGlzLm9wdHMpO1xuICAgIHRoaXMub3B0cy51ZGlkID0gdWRpZDtcbiAgICB0aGlzLm9wdHMuZW1Qb3J0ID0gZW1Qb3J0O1xuXG4gICAgLy8gbm93IHRoYXQgd2Uga25vdyBvdXIgamF2YSB2ZXJzaW9uIGFuZCBkZXZpY2UgaW5mbywgd2UgY2FuIGNyZWF0ZSBvdXJcbiAgICAvLyBBREIgaW5zdGFuY2VcbiAgICB0aGlzLmFkYiA9IGF3YWl0IGFuZHJvaWRIZWxwZXJzLmNyZWF0ZUFEQih0aGlzLm9wdHMpO1xuXG4gICAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuXG4gICAgaWYgKGFwaUxldmVsIDwgMjEpIHtcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KCdVSUF1dG9tYXRvcjIgaXMgb25seSBzdXBwb3J0ZWQgc2luY2UgQW5kcm9pZCA1LjAgKExvbGxpcG9wKS4gJyArXG4gICAgICAgICdZb3UgY291bGQgc3RpbGwgdXNlIG90aGVyIHN1cHBvcnRlZCBiYWNrZW5kcyBpbiBvcmRlciB0byBhdXRvbWF0ZSBvbGRlciBBbmRyb2lkIHZlcnNpb25zLicpO1xuICAgIH1cblxuICAgIGlmIChhcGlMZXZlbCA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgIGxvZ2dlci5pbmZvKCdSZWxheGluZyBoaWRkZW4gYXBpIHBvbGljeScpO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0SGlkZGVuQXBpUG9saWN5KCcxJywgISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgdG8gZW5hYmxlL2Rpc2FibGUgZ3BzIGJlZm9yZSBydW5uaW5nIHRoZSBhcHBsaWNhdGlvblxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5ncHNFbmFibGVkKSkge1xuICAgICAgaWYgKHRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gJHt0aGlzLm9wdHMuZ3BzRW5hYmxlZCA/ICdlbmFibGUnIDogJ2Rpc2FibGUnfSBncHMgbG9jYXRpb24gcHJvdmlkZXJgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIudG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlcih0aGlzLm9wdHMuZ3BzRW5hYmxlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIud2FybihgU29ycnkhICdncHNFbmFibGVkJyBjYXBhYmlsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnNgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXQgYXBwUGFja2FnZSBldCBhbCBmcm9tIG1hbmlmZXN0IGlmIG5lY2Vzc2FyeVxuICAgIGNvbnN0IGFwcEluZm8gPSBhd2FpdCBoZWxwZXJzLmdldExhdW5jaEluZm8odGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgLy8gYW5kIGdldCBpdCBvbnRvIG91ciAnb3B0cycgb2JqZWN0IHNvIHdlIHVzZSBpdCBmcm9tIG5vdyBvblxuICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRzLCBhcHBJbmZvIHx8IHt9KTtcblxuICAgIC8vIHNldCBhY3R1YWwgZGV2aWNlIG5hbWUsIHVkaWQsIHBsYXRmb3JtIHZlcnNpb24sIHNjcmVlbiBzaXplLCBzY3JlZW4gZGVuc2l0eSwgbW9kZWwgYW5kIG1hbnVmYWN0dXJlciBkZXRhaWxzXG4gICAgdGhpcy5jYXBzLmRldmljZU5hbWUgPSB0aGlzLmFkYi5jdXJEZXZpY2VJZDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlVURJRCA9IHRoaXMub3B0cy51ZGlkO1xuXG4gICAgLy8gc3RhcnQgYW4gYXZkLCBzZXQgdGhlIGxhbmd1YWdlL2xvY2FsZSwgcGljayBhbiBlbXVsYXRvciwgZXRjLi4uXG4gICAgLy8gVE9ETyB3aXRoIG11bHRpcGxlIGRldmljZXMgd2UnbGwgbmVlZCB0byBwYXJhbWV0ZXJpemUgdGhpc1xuICAgIHRoaXMuZGVmYXVsdElNRSA9IGF3YWl0IGhlbHBlcnMuaW5pdERldmljZSh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcblxuICAgIC8vIFByZXBhcmUgdGhlIGRldmljZSBieSBmb3J3YXJkaW5nIHRoZSBVaUF1dG9tYXRvcjIgcG9ydFxuICAgIC8vIFRoaXMgY2FsbCBtdXRhdGVzIHRoaXMub3B0cy5zeXN0ZW1Qb3J0IGlmIGl0IGlzIG5vdCBzZXQgZXhwbGljaXRseVxuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVTeXN0ZW1Qb3J0KCk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgVWlBdXRvbWF0b3IyIE1KUEVHIHNlcnZlciBwb3J0IChpZlxuICAgIC8vIGFwcGxpY2FibGUpXG4gICAgYXdhaXQgdGhpcy5hbGxvY2F0ZU1qcGVnU2VydmVyUG9ydCgpO1xuXG4gICAgLy8gc2V0IHVwIHRoZSBtb2RpZmllZCBVaUF1dG9tYXRvcjIgc2VydmVyIGV0Y1xuICAgIGF3YWl0IHRoaXMuaW5pdFVpQXV0b21hdG9yMlNlcnZlcigpO1xuXG4gICAgLy8gU2hvdWxkIGJlIGFmdGVyIGluc3RhbGxpbmcgaW8uYXBwaXVtLnNldHRpbmdzIGluIGhlbHBlcnMuaW5pdERldmljZVxuICAgIGlmICh0aGlzLm9wdHMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiAmJiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDI2KSkgeyAvLyBBUEkgbGV2ZWwgMjYgaXMgQW5kcm9pZCA4LjAuXG4gICAgICAvLyBHcmFudGluZyBhbmRyb2lkLnBlcm1pc3Npb24uU0VUX0FOSU1BVElPTl9TQ0FMRSBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIGFuaW1hdGlvbnMgdW5kZXIgQVBJIGxldmVsIDI2XG4gICAgICAvLyBSZWFkIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL3B1bGwvMTE2NDAjaXNzdWVjb21tZW50LTQzODI2MDQ3N1xuICAgICAgLy8gYC0tbm8td2luZG93LWFuaW1hdGlvbmAgd29ya3Mgb3ZlciBBbmRyb2lkIDggdG8gZGlzYWJsZSBhbGwgb2YgYW5pbWF0aW9uc1xuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmlzQW5pbWF0aW9uT24oKSkge1xuICAgICAgICBsb2dnZXIuaW5mbygnRGlzYWJsaW5nIGFuaW1hdGlvbiB2aWEgaW8uYXBwaXVtLnNldHRpbmdzJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1dpbmRvdyBhbmltYXRpb24gaXMgYWxyZWFkeSBkaXNhYmxlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCB1cCBhcHAgdW5kZXIgdGVzdFxuICAgIC8vIHByZXBhcmUgb3VyIGFjdHVhbCBBVVQsIGdldCBpdCBvbiB0aGUgZGV2aWNlLCBldGMuLi5cbiAgICBhd2FpdCB0aGlzLmluaXRBVVQoKTtcblxuICAgIC8vIEFkZGluZyBBVVQgcGFja2FnZSBuYW1lIGluIHRoZSBjYXBhYmlsaXRpZXMgaWYgcGFja2FnZSBuYW1lIG5vdCBleGlzdCBpbiBjYXBzXG4gICAgaWYgKCF0aGlzLmNhcHMuYXBwUGFja2FnZSAmJiBhcHBJbmZvKSB7XG4gICAgICB0aGlzLmNhcHMuYXBwUGFja2FnZSA9IGFwcEluZm8uYXBwUGFja2FnZTtcbiAgICB9XG5cbiAgICAvLyBsYXVuY2ggVWlBdXRvbWF0b3IyIGFuZCB3YWl0IHRpbGwgaXRzIG9ubGluZSBhbmQgd2UgaGF2ZSBhIHNlc3Npb25cbiAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5zdGFydFNlc3Npb24odGhpcy5jYXBzKTtcblxuICAgIGF3YWl0IHRoaXMuYWRkRGV2aWNlSW5mb1RvQ2FwcygpO1xuXG4gICAgLy8gVW5sb2NrIHRoZSBkZXZpY2UgYWZ0ZXIgdGhlIHNlc3Npb24gaXMgc3RhcnRlZC5cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5sb2NrKSB7XG4gICAgICAvLyB1bmxvY2sgdGhlIGRldmljZSB0byBwcmVwYXJlIGl0IGZvciB0ZXN0aW5nXG4gICAgICBhd2FpdCBoZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwgdGhpcy5jYXBzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKGAnc2tpcFVubG9jaycgY2FwYWJpbGl0eSBzZXQsIHNvIHNraXBwaW5nIGRldmljZSB1bmxvY2tgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0Nocm9tZVNlc3Npb24pIHsgLy8gc3RhcnQgYSBjaHJvbWVkcml2ZXIgc2Vzc2lvblxuICAgICAgYXdhaXQgdGhpcy5zdGFydENocm9tZVNlc3Npb24odGhpcyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdHMuYXV0b0xhdW5jaCAmJiB0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVBcHBTdGFydHMoKTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgaW5pdGlhbCBvcmllbnRhdGlvbiBpcyByZXF1ZXN0ZWQsIHNldCBpdFxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5vcmllbnRhdGlvbikpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgU2V0dGluZyBpbml0aWFsIG9yaWVudGF0aW9uIHRvICcke3RoaXMub3B0cy5vcmllbnRhdGlvbn0nYCk7XG4gICAgICBhd2FpdCB0aGlzLnNldE9yaWVudGF0aW9uKHRoaXMub3B0cy5vcmllbnRhdGlvbik7XG4gICAgfVxuXG4gICAgLy8gaWYgd2Ugd2FudCB0byBpbW1lZGlhdGVseSBnZXQgaW50byBhIHdlYnZpZXcsIHNldCBvdXIgY29udGV4dFxuICAgIC8vIGFwcHJvcHJpYXRlbHlcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBjb25zdCB2aWV3TmFtZSA9IHRoaXMuZGVmYXVsdFdlYnZpZXdOYW1lKCk7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCB8fCAyMDAwO1xuICAgICAgbG9nZ2VyLmluZm8oYFNldHRpbmcgYXV0byB3ZWJ2aWV3IHRvIGNvbnRleHQgJyR7dmlld05hbWV9JyB3aXRoIHRpbWVvdXQgJHt0aW1lb3V0fW1zYCk7XG4gICAgICBhd2FpdCByZXRyeUludGVydmFsKHRpbWVvdXQgLyA1MDAsIDUwMCwgdGhpcy5zZXRDb250ZXh0LmJpbmQodGhpcyksIHZpZXdOYW1lKTtcbiAgICB9XG5cbiAgICAvLyBub3cgdGhhdCBldmVyeXRoaW5nIGhhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseSwgdHVybiBvbiBwcm94eWluZyBzbyBhbGxcbiAgICAvLyBzdWJzZXF1ZW50IHNlc3Npb24gcmVxdWVzdHMgZ28gc3RyYWlnaHQgdG8vZnJvbSB1aWF1dG9tYXRvcjJcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGFkZERldmljZUluZm9Ub0NhcHMgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFwaVZlcnNpb24sXG4gICAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgICBtYW51ZmFjdHVyZXIsXG4gICAgICBtb2RlbCxcbiAgICAgIHJlYWxEaXNwbGF5U2l6ZSxcbiAgICAgIGRpc3BsYXlEZW5zaXR5LFxuICAgIH0gPSBhd2FpdCB0aGlzLm1vYmlsZUdldERldmljZUluZm8oKTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlQXBpTGV2ZWwgPSBwYXJzZUludChhcGlWZXJzaW9uLCAxMCk7XG4gICAgdGhpcy5jYXBzLnBsYXRmb3JtVmVyc2lvbiA9IHBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuU2l6ZSA9IHJlYWxEaXNwbGF5U2l6ZTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuRGVuc2l0eSA9IGRpc3BsYXlEZW5zaXR5O1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNYW51ZmFjdHVyZXIgPSBtYW51ZmFjdHVyZXI7XG4gIH1cblxuICBhc3luYyBpbml0VWlBdXRvbWF0b3IyU2VydmVyICgpIHtcbiAgICAvLyBicm9rZW4gb3V0IGZvciByZWFkYWJpbGl0eVxuICAgIGNvbnN0IHVpYXV0b21hdG9yMk9wdHMgPSB7XG4gICAgICBob3N0OiB0aGlzLm9wdHMucmVtb3RlQWRiSG9zdCB8fCB0aGlzLm9wdHMuaG9zdCB8fCAnMTI3LjAuMC4xJyxcbiAgICAgIHN5c3RlbVBvcnQ6IHRoaXMub3B0cy5zeXN0ZW1Qb3J0LFxuICAgICAgZGV2aWNlUG9ydDogREVWSUNFX1BPUlQsXG4gICAgICBhZGI6IHRoaXMuYWRiLFxuICAgICAgYXBrOiB0aGlzLm9wdHMuYXBwLFxuICAgICAgdG1wRGlyOiB0aGlzLm9wdHMudG1wRGlyLFxuICAgICAgYXBwUGFja2FnZTogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICBhcHBBY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbjogISF0aGlzLm9wdHMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICAgIGRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlOiB0aGlzLm9wdHMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UsXG4gICAgICByZWFkVGltZW91dDogdGhpcy5vcHRzLnVpYXV0b21hdG9yMlNlcnZlclJlYWRUaW1lb3V0LFxuICAgIH07XG4gICAgLy8gbm93IHRoYXQgd2UgaGF2ZSBwYWNrYWdlIGFuZCBhY3Rpdml0eSwgd2UgY2FuIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZlxuICAgIC8vIHVpYXV0b21hdG9yMiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBvcHRpb25zXG4gICAgdGhpcy51aWF1dG9tYXRvcjIgPSBuZXcgVWlBdXRvbWF0b3IyU2VydmVyKHVpYXV0b21hdG9yMk9wdHMpO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLnVpYXV0b21hdG9yMi5wcm94eVJlcVJlcy5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcblxuICAgIGlmICh0aGlzLm9wdHMuc2tpcFNlcnZlckluc3RhbGxhdGlvbikge1xuICAgICAgbG9nZ2VyLmluZm8oYCdza2lwU2VydmVySW5zdGFsbGF0aW9uJyBpcyBzZXQuIFNraXBwaW5nIFVJQXV0b21hdG9yMiBzZXJ2ZXIgaW5zdGFsbGF0aW9uLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5pbnN0YWxsU2VydmVyQXBrKHRoaXMub3B0cy51aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QoXG4gICAgICAgICAgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQsXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDYW5ub3QgYWRkIHNlcnZlciBwYWNrYWdlcyB0byB0aGUgRG96ZSB3aGl0ZWxpc3QuIE9yaWdpbmFsIGVycm9yOiBgICtcbiAgICAgICAgICAoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdEFVVCAoKSB7XG4gICAgLy8gVW5pbnN0YWxsIGFueSB1bmluc3RhbGxPdGhlclBhY2thZ2VzIHdoaWNoIHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyhcbiAgICAgICAgdGhpcy5hZGIsXG4gICAgICAgIGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyksXG4gICAgICAgIFtTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCBhbnkgXCJvdGhlckFwcHNcIiB0aGF0IHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLm90aGVyQXBwcykge1xuICAgICAgbGV0IG90aGVyQXBwcztcbiAgICAgIHRyeSB7XG4gICAgICAgIG90aGVyQXBwcyA9IGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMub3RoZXJBcHBzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcIm90aGVyQXBwc1wiIGNhcGFiaWxpdHk6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgb3RoZXJBcHBzID0gYXdhaXQgQi5hbGwob3RoZXJBcHBzXG4gICAgICAgIC5tYXAoKGFwcCkgPT4gdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcChhcHAsIFtBUEtfRVhURU5TSU9OLCBBUEtTX0VYVEVOU0lPTl0pKSk7XG4gICAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxPdGhlckFwa3Mob3RoZXJBcHBzLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgaWYgKCF0aGlzLm9wdHMubm9TaWduXG4gICAgICAgICYmICFhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQodGhpcy5vcHRzLmFwcCwgdGhpcy5vcHRzLmFwcFBhY2thZ2UsIHtcbiAgICAgICAgICByZXF1aXJlRGVmYXVsdENlcnQ6IGZhbHNlLFxuICAgICAgICB9KSkge1xuICAgICAgICBhd2FpdCBoZWxwZXJzLnNpZ25BcHAodGhpcy5hZGIsIHRoaXMub3B0cy5hcHApO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgaGVscGVycy5pbnN0YWxsQXBrKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnRnVsbCByZXNldCByZXF1aXJlcyBhbiBhcHAgY2FwYWJpbGl0eSwgdXNlIGZhc3RSZXNldCBpZiBhcHAgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0ICYmIHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZW5zdXJlQXBwU3RhcnRzICgpIHtcbiAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBhY3Rpdml0eSBhbmQgcGFja2FnZSB0byB3YWl0IGZvclxuICAgIGNvbnN0IGFwcFdhaXRQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlIHx8IHRoaXMub3B0cy5hcHBQYWNrYWdlO1xuICAgIGNvbnN0IGFwcFdhaXRBY3Rpdml0eSA9IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHkgfHwgdGhpcy5vcHRzLmFwcEFjdGl2aXR5O1xuXG4gICAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfS8ke3RoaXMub3B0cy5hcHBBY3Rpdml0eX0gYCArXG4gICAgICBgYW5kIHdhaXRpbmcgZm9yICcke2FwcFdhaXRQYWNrYWdlfS8ke2FwcFdhaXRBY3Rpdml0eX0nYCk7XG5cbiAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgbG9nZ2VyLmluZm8oYGFuZHJvaWRDb3ZlcmFnZSBpcyBjb25maWd1cmVkLiBgICtcbiAgICAgICAgYCBTdGFydGluZyBpbnN0cnVtZW50YXRpb24gb2YgJyR7dGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZX0nLi4uYCk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5hbmRyb2lkQ292ZXJhZ2UodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSwgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKHtcbiAgICAgICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgICAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgICAgc3RvcEFwcDogIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQsXG4gICAgICAgIHJldHJ5OiB0cnVlLFxuICAgICAgICB1c2VyOiB0aGlzLm9wdHMudXNlclByb2ZpbGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRGVsZXRpbmcgVWlBdXRvbWF0b3IyIHNlc3Npb24nKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgaWYgKHRoaXMudWlhdXRvbWF0b3IyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBzdG9wIENocm9tZURyaXZlciBwcm94aWVzOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuandwUHJveHlBY3RpdmUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5kZWxldGVTZXNzaW9uKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcHJveHkgZGVsZXRlU2Vzc2lvbiB0byBVaUF1dG9tYXRvcjI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuYWRiKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJiB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXNldHRpbmcgSU1FIHRvICcke3RoaXMuZGVmYXVsdElNRX0nYCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0SU1FKHRoaXMuZGVmYXVsdElNRSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcmVzZXQgSU1FOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgICBsb2dnZXIuaW5mbygnU2h1dHRpbmcgZG93biB0aGUgYWRiIHByb2Nlc3Mgb2YgaW5zdHJ1bWVudGF0aW9uLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmVuZEFuZHJvaWRDb3ZlcmFnZSgpO1xuICAgICAgICAvLyBVc2UgdGhpcyBicm9hZGNhc3QgaW50ZW50IHRvIG5vdGlmeSBpdCdzIHRpbWUgdG8gZHVtcCBjb3ZlcmFnZSB0byBmaWxlXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50KSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFNlbmRpbmcgaW50ZW50IGJyb2FkY2FzdCAnJHt0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50fScgYXQgdGhlIGVuZCBvZiBpbnN0cnVtZW50aW5nLmApO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmJyb2FkY2FzdCh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIud2FybignTm8gYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50IGlzIGNvbmZpZ3VyZWQgaW4gY2Fwcy4gUG9zc2libHkgeW91IGNhbm5vdCBnZXQgY292ZXJhZ2UgZmlsZS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gZm9yY2Ugc3RvcCBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2FwYWJpbGl0eSAnZnVsbFJlc2V0JyBzZXQgdG8gJ3RydWUnLCBVbmluc3RhbGxpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9J2ApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byB1bmluc3RhbGwgYXBwOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhpcyB2YWx1ZSBjYW4gYmUgdHJ1ZSBpZiB0ZXN0IHRhcmdldCBkZXZpY2UgaXMgPD0gMjZcbiAgICAgIGlmICh0aGlzLl93YXNXaW5kb3dBbmltYXRpb25EaXNhYmxlZCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnUmVzdG9yaW5nIHdpbmRvdyBhbmltYXRpb24gc3RhdGUnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zdG9wTG9nY2F0KCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VTeXN0ZW1Qb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHJlbW92ZSBzeXN0ZW0gcG9ydCBmb3J3YXJkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIC8vIElnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHJlbW92ZSBNSlBFRyBzZXJ2ZXIgcG9ydCBmb3J3YXJkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIC8vIElnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2xvc2luZyBlbXVsYXRvciAnJHthdmROYW1lfSdgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5raWxsRW11bGF0b3IoYXZkTmFtZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gY2xvc2UgZW11bGF0b3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMubWpwZWdTdHJlYW0pIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdDbG9zaW5nIE1KUEVHIHN0cmVhbScpO1xuICAgICAgdGhpcy5tanBlZ1N0cmVhbS5zdG9wKCk7XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdDaGVja2luZyB3aGV0aGVyIGFwcCBpcyBhY3R1YWxseSBwcmVzZW50Jyk7XG4gICAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHRoaXMub3B0cy5hcHApKSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBmaW5kIGFwcCBhcGsgYXQgJyR7dGhpcy5vcHRzLmFwcH0nYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25TZXR0aW5nc1VwZGF0ZSAoKSB7XG4gICAgLy8gaW50ZW50aW9uYWxseSBkbyBub3RoaW5nIGhlcmUsIHNpbmNlIGNvbW1hbmRzLnVwZGF0ZVNldHRpbmdzIHByb3hpZXNcbiAgICAvLyBzZXR0aW5ncyB0byB0aGUgdWlhdXRvMiBzZXJ2ZXIgYWxyZWFkeVxuICB9XG5cbiAgLy8gTmVlZCB0byBvdmVycmlkZSBhbmRyb2lkLWRyaXZlcidzIHZlcnNpb24gb2YgdGhpcyBzaW5jZSB3ZSBkb24ndCBhY3R1YWxseVxuICAvLyBoYXZlIGEgYm9vdHN0cmFwOyBpbnN0ZWFkIHdlIGp1c3QgcmVzdGFydCBhZGIgYW5kIHJlLWZvcndhcmQgdGhlIFVpQXV0b21hdG9yMlxuICAvLyBwb3J0XG4gIGFzeW5jIHdyYXBCb290c3RyYXBEaXNjb25uZWN0ICh3cmFwcGVkKSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlU3lzdGVtUG9ydCgpO1xuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQoKTtcbiAgfVxuXG4gIHByb3h5QWN0aXZlIChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5wcm94eUFjdGl2ZShzZXNzaW9uSWQpO1xuXG4gICAgLy8gd2UgYWx3YXlzIGhhdmUgYW4gYWN0aXZlIHByb3h5IHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuY2FuUHJveHkoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGNhbiBhbHdheXMgcHJveHkgdG8gdGhlIHVpYXV0b21hdG9yMiBzZXJ2ZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5nZXRQcm94eUF2b2lkTGlzdChzZXNzaW9uSWQpO1xuICAgIC8vIHdlIGFyZSBtYWludGFpbmluZyB0d28gc2V0cyBvZiBOT19QUk9YWSBsaXN0cywgb25lIGZvciBjaHJvbWVkcml2ZXIoQ0hST01FX05PX1BST1hZKVxuICAgIC8vIGFuZCBvbmUgZm9yIHVpYXV0b21hdG9yMihOT19QUk9YWSksIGJhc2VkIG9uIGN1cnJlbnQgY29udGV4dCB3aWxsIHJldHVybiByZWxhdGVkIE5PX1BST1hZIGxpc3RcbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLmNocm9tZWRyaXZlcikpIHtcbiAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgd2VidmlldyhjaHJvbWVkcml2ZXIpLCB0aGVuIHJldHVybiBDSFJPTUVfTk9fUFJPWFkgbGlzdFxuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gQ0hST01FX05PX1BST1hZO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBOT19QUk9YWTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5uYXRpdmVXZWJTY3JlZW5zaG90KSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBbLi4udGhpcy5qd3BQcm94eUF2b2lkLCBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zY3JlZW5zaG90JyldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgZ2V0IGlzQ2hyb21lU2Vzc2lvbiAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gIH1cbn1cblxuLy8gZmlyc3QgYWRkIHRoZSBhbmRyb2lkLWRyaXZlciBjb21tYW5kcyB3aGljaCB3ZSB3aWxsIGZhbGwgYmFjayB0b1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhhbmRyb2lkQ29tbWFuZHMpKSB7XG4gIEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIucHJvdG90eXBlW2NtZF0gPSBmbjtcbn1cblxuLy8gdGhlbiBvdmVyd3JpdGUgd2l0aCBhbnkgdWlhdXRvbWF0b3IyLXNwZWNpZmljIGNvbW1hbmRzXG5mb3IgKGxldCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGNvbW1hbmRzKSkge1xuICBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbmV4cG9ydCB7IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXI7XG4iXSwiZmlsZSI6ImxpYi9kcml2ZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
644
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiaGVscGVycyIsIk9iamVjdCIsImFzc2lnbiIsInVpYXV0b21hdG9yMkhlbHBlcnMiLCJhbmRyb2lkSGVscGVycyIsIkRFVklDRV9QT1JUX1JBTkdFIiwiREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCIsInV0aWwiLCJnZXRMb2NrRmlsZUd1YXJkIiwicGF0aCIsInJlc29sdmUiLCJvcyIsInRtcGRpciIsInRpbWVvdXQiLCJ0cnlSZWNvdmVyeSIsIkRFVklDRV9QT1JUIiwiTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUIiwiTE9DQUxIT1NUX0lQNCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiTUVNT0laRURfRlVOQ1RJT05TIiwiQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJzaG91bGRWYWxpZGF0ZUNhcHMiLCJzaGVsbCIsImxvY2F0b3JTdHJhdGVnaWVzIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwidWlhdXRvbWF0b3IyIiwiandwUHJveHlBY3RpdmUiLCJkZWZhdWx0SU1FIiwiandwUHJveHlBdm9pZCIsImFwa1N0cmluZ3MiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwiaWdub3JlVW5pbXBvcnRhbnRWaWV3cyIsImFsbG93SW52aXNpYmxlRWxlbWVudHMiLCJvblNldHRpbmdzVXBkYXRlIiwiYmluZCIsImNocm9tZWRyaXZlciIsInNlc3Npb25DaHJvbWVkcml2ZXJzIiwiZm4iLCJfIiwibWVtb2l6ZSIsInZhbGlkYXRlRGVzaXJlZENhcHMiLCJjYXBzIiwiY3JlYXRlU2Vzc2lvbiIsImFyZ3MiLCJzZXNzaW9uSWQiLCJzZXJ2ZXJEZXRhaWxzIiwicGxhdGZvcm0iLCJ3ZWJTdG9yYWdlRW5hYmxlZCIsInRha2VzU2NyZWVuc2hvdCIsImphdmFzY3JpcHRFbmFibGVkIiwiZGF0YWJhc2VFbmFibGVkIiwibmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkIiwibG9jYXRpb25Db250ZXh0RW5hYmxlZCIsIndhcm5pbmdzIiwiZGVzaXJlZCIsImN1ckNvbnRleHQiLCJkZWZhdWx0Q29udGV4dE5hbWUiLCJkZWZhdWx0T3B0cyIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImFuZHJvaWRJbnN0YWxsVGltZW91dCIsImRlZmF1bHRzIiwiaXNDaHJvbWVTZXNzaW9uIiwibG9nZ2VyIiwiaW5mbyIsInBrZyIsImFjdGl2aXR5IiwiZ2V0Q2hyb21lUGtnIiwiYnJvd3Nlck5hbWUiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwiYXBwIiwiY29uZmlndXJlQXBwIiwiQVBLX0VYVEVOU0lPTiIsIkFQS1NfRVhURU5TSU9OIiwiY2hlY2tBcHBQcmVzZW50Iiwic3RhcnRVaUF1dG9tYXRvcjJTZXNzaW9uIiwiZmlsbERldmljZURldGFpbHMiLCJtanBlZ1NjcmVlbnNob3RVcmwiLCJtanBlZ1N0cmVhbSIsIm1qcGVnIiwiTUpwZWdTdHJlYW0iLCJzdGFydCIsImUiLCJkZWxldGVTZXNzaW9uIiwicGl4ZWxSYXRpbyIsImdldERldmljZVBpeGVsUmF0aW8iLCJzdGF0QmFySGVpZ2h0IiwiZ2V0U3RhdHVzQmFySGVpZ2h0Iiwidmlld3BvcnRSZWN0IiwiZ2V0Vmlld1BvcnRSZWN0IiwiZHJpdmVyRGF0YSIsImdldFNlc3Npb24iLCJzZXNzaW9uRGF0YSIsImRlYnVnIiwidWlhMkRhdGEiLCJqd3Byb3h5IiwiY29tbWFuZCIsImlzRW11bGF0b3IiLCJhZGIiLCJhdmQiLCJkZXZpY2VOYW1lIiwiZXJyb3JBbmRUaHJvdyIsInBsYXRmb3JtVmVyc2lvbiIsImF2ZERldmljZSIsInJlcGxhY2UiLCJhbGxvY2F0ZVN5c3RlbVBvcnQiLCJmb3J3YXJkUG9ydCIsImxvY2FsUG9ydCIsInN5c3RlbVBvcnQiLCJfaGFzU3lzdGVtUG9ydEluQ2FwcyIsInN0YXJ0UG9ydCIsImVuZFBvcnQiLCJyZWxlYXNlU3lzdGVtUG9ydCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQiLCJtanBlZ1NlcnZlclBvcnQiLCJyZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0IiwidWRpZCIsImVtUG9ydCIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsImNyZWF0ZUFEQiIsImFwaUxldmVsIiwiZ2V0QXBpTGV2ZWwiLCJzZXRIaWRkZW5BcGlQb2xpY3kiLCJpZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvciIsImhhc1ZhbHVlIiwiZ3BzRW5hYmxlZCIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJ3YXJuIiwiYXBwSW5mbyIsImdldExhdW5jaEluZm8iLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJpbml0RGV2aWNlIiwiaW5pdFVpQXV0b21hdG9yMlNlcnZlciIsImRpc2FibGVXaW5kb3dBbmltYXRpb24iLCJpc0FuaW1hdGlvbk9uIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJfd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQiLCJpbml0QVVUIiwic3RhcnRTZXNzaW9uIiwiYWRkRGV2aWNlSW5mb1RvQ2FwcyIsInNraXBVbmxvY2siLCJ1bmxvY2siLCJzdGFydENocm9tZVNlc3Npb24iLCJlbnN1cmVBcHBTdGFydHMiLCJvcmllbnRhdGlvbiIsInNldE9yaWVudGF0aW9uIiwiYXV0b1dlYnZpZXciLCJ2aWV3TmFtZSIsImRlZmF1bHRXZWJ2aWV3TmFtZSIsImF1dG9XZWJ2aWV3VGltZW91dCIsInNldENvbnRleHQiLCJhcGlWZXJzaW9uIiwibWFudWZhY3R1cmVyIiwibW9kZWwiLCJyZWFsRGlzcGxheVNpemUiLCJkaXNwbGF5RGVuc2l0eSIsIm1vYmlsZUdldERldmljZUluZm8iLCJkZXZpY2VBcGlMZXZlbCIsInBhcnNlSW50IiwiZGV2aWNlU2NyZWVuU2l6ZSIsImRldmljZVNjcmVlbkRlbnNpdHkiLCJkZXZpY2VNb2RlbCIsImRldmljZU1hbnVmYWN0dXJlciIsInVpYXV0b21hdG9yMk9wdHMiLCJob3N0IiwicmVtb3RlQWRiSG9zdCIsImRldmljZVBvcnQiLCJhcGsiLCJ0bXBEaXIiLCJkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSIsInJlYWRUaW1lb3V0IiwidWlhdXRvbWF0b3IyU2VydmVyUmVhZFRpbWVvdXQiLCJVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJwcm94eVJlcVJlcyIsInNraXBTZXJ2ZXJJbnN0YWxsYXRpb24iLCJpbnN0YWxsU2VydmVyQXBrIiwidWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwiU0VSVkVSX1BBQ0tBR0VfSUQiLCJTRVJWRVJfVEVTVF9QQUNLQUdFX0lEIiwic3RkZXJyIiwibWVzc2FnZSIsInVuaW5zdGFsbE90aGVyUGFja2FnZXMiLCJwYXJzZUFycmF5Iiwib3RoZXJBcHBzIiwiQiIsImFsbCIsIm1hcCIsImluc3RhbGxPdGhlckFwa3MiLCJub1NpZ24iLCJjaGVja0Fwa0NlcnQiLCJyZXF1aXJlRGVmYXVsdENlcnQiLCJzaWduQXBwIiwic2tpcFVuaW5zdGFsbCIsInVuaW5zdGFsbEFwayIsImluc3RhbGxBcGsiLCJmYXN0UmVzZXQiLCJyZXNldEFwcCIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5IiwiYW5kcm9pZENvdmVyYWdlIiwic3RhcnRBcHAiLCJhY3Rpb24iLCJpbnRlbnRBY3Rpb24iLCJjYXRlZ29yeSIsImludGVudENhdGVnb3J5IiwiZmxhZ3MiLCJpbnRlbnRGbGFncyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJ3YWl0Rm9yTGF1bmNoIiwiYXBwV2FpdEZvckxhdW5jaCIsIndhaXREdXJhdGlvbiIsImFwcFdhaXREdXJhdGlvbiIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic3RvcEFwcCIsImRvbnRTdG9wQXBwT25SZXNldCIsInJldHJ5IiwidXNlciIsInVzZXJQcm9maWxlIiwiaXNFbXB0eSIsIl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzIiwic3RvcFJlY29yZGluZ1NjcmVlbiIsImlnbiIsInJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyIsInNlcnZlciIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJzdG9wQ2hyb21lZHJpdmVyUHJveGllcyIsImVyciIsInVuaWNvZGVLZXlib2FyZCIsInJlc2V0S2V5Ym9hcmQiLCJzZXRJTUUiLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJhbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQiLCJicm9hZGNhc3QiLCJmb3JjZVN0b3AiLCJzdG9wTG9nY2F0IiwiZXJyb3IiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IiwiYXZkTmFtZSIsImtpbGxFbXVsYXRvciIsInN0b3AiLCJmcyIsImV4aXN0cyIsIndyYXBCb290c3RyYXBEaXNjb25uZWN0Iiwid3JhcHBlZCIsInJlc3RhcnQiLCJwcm94eUFjdGl2ZSIsImNhblByb3h5IiwiZ2V0UHJveHlBdm9pZExpc3QiLCJuYXRpdmVXZWJTY3JlZW5zaG90IiwiaXNDaHJvbWVCcm93c2VyIiwiY21kIiwidG9QYWlycyIsImFuZHJvaWRDb21tYW5kcyIsInByb3RvdHlwZSIsImNvbW1hbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLE9BQU8sR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQkMsZ0JBQWxCLEVBQXVDQyxtQ0FBdkMsQ0FBaEI7QUFJQSxNQUFNQyxpQkFBaUIsR0FBRyxDQUFDLElBQUQsRUFBTyxJQUFQLENBQTFCOztBQUlBLE1BQU1DLDRCQUE0QixHQUFHQyxvQkFBS0MsZ0JBQUws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LElBQUlkLE1BQUosQ0FBVyw0QkFBWCxDQUFSLENBQXhCLENBQXJCO0FBQ0Q7O0FBRUQsV0FBTyxLQUFLYyxhQUFaO0FBQ0Q7O0FBRWtCLE1BQWZxQyxlQUFlLEdBQUk7QUFDckIsV0FBT3RFLE9BQU8sQ0FBQ3lRLGVBQVIsQ0FBd0IsS0FBS2hQLElBQUwsQ0FBVW1ELFdBQWxDLENBQVA7QUFDRDs7QUFubUJnRDs7OztBQXVtQm5ELEtBQUssSUFBSSxDQUFDOEwsR0FBRCxFQUFNL04sRUFBTixDQUFULElBQXNCQyxnQkFBRStOLE9BQUYsQ0FBVUMsb0NBQVYsQ0FBdEIsRUFBa0Q7QUFDaER0UCxFQUFBQSx5QkFBeUIsQ0FBQ3VQLFNBQTFCLENBQW9DSCxHQUFwQyxJQUEyQy9OLEVBQTNDO0FBQ0Q7O0FBR0QsS0FBSyxJQUFJLENBQUMrTixHQUFELEVBQU0vTixFQUFOLENBQVQsSUFBc0JDLGdCQUFFK04sT0FBRixDQUFVRyxjQUFWLENBQXRCLEVBQTJDO0FBQ3pDeFAsRUFBQUEseUJBQXlCLENBQUN1UCxTQUExQixDQUFvQ0gsR0FBcEMsSUFBMkMvTixFQUEzQztBQUNEOztlQUdjckIseUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQmFzZURyaXZlciwgRGV2aWNlU2V0dGluZ3MgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuaW1wb3J0IHtcbiAgVWlBdXRvbWF0b3IyU2VydmVyLCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRFxufSBmcm9tICcuL3VpYXV0b21hdG9yMic7XG5pbXBvcnQgeyBmcywgdXRpbCwgbWpwZWcgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgY29tbWFuZHMgZnJvbSAnLi9jb21tYW5kcy9pbmRleCc7XG5pbXBvcnQgeyBERUZBVUxUX0FEQl9QT1JUIH0gZnJvbSAnYXBwaXVtLWFkYic7XG5pbXBvcnQgdWlhdXRvbWF0b3IySGVscGVycyBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgYW5kcm9pZEhlbHBlcnMsIGFuZHJvaWRDb21tYW5kcywgU0VUVElOR1NfSEVMUEVSX1BLR19JRFxufSBmcm9tICdhcHBpdW0tYW5kcm9pZC1kcml2ZXInO1xuaW1wb3J0IGRlc2lyZWRDYXBDb25zdHJhaW50cyBmcm9tICcuL2Rlc2lyZWQtY2Fwcyc7XG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSwgY2hlY2tQb3J0U3RhdHVzIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQVBLX0VYVEVOU0lPTiwgQVBLU19FWFRFTlNJT04gfSBmcm9tICcuL2V4dGVuc2lvbnMnO1xuXG5cbmNvbnN0IGhlbHBlcnMgPSBPYmplY3QuYXNzaWduKHt9LCB1aWF1dG9tYXRvcjJIZWxwZXJzLCBhbmRyb2lkSGVscGVycyk7XG5cbi8vIFRoZSByYW5nZSBvZiBwb3J0cyB3ZSBjYW4gdXNlIG9uIHRoZSBzeXN0ZW0gZm9yIGNvbW11bmljYXRpbmcgdG8gdGhlXG4vLyBVaUF1dG9tYXRvcjIgSFRUUCBzZXJ2ZXIgb24gdGhlIGRldmljZVxuY29uc3QgREVWSUNFX1BPUlRfUkFOR0UgPSBbODIwMCwgODI5OV07XG5cbi8vIFRoZSBndWFyZCBpcyBuZWVkZWQgdG8gYXZvaWQgZHluYW1pYyBzeXN0ZW0gcG9ydCBhbGxvY2F0aW9uIGNvbmZsaWN0cyBmb3Jcbi8vIHBhcmFsbGVsIGRyaXZlciBzZXNzaW9uc1xuY29uc3QgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCA9IHV0aWwuZ2V0TG9ja0ZpbGVHdWFyZChcbiAgcGF0aC5yZXNvbHZlKG9zLnRtcGRpcigpLCAndWlhMl9kZXZpY2VfcG9ydF9ndWFyZCcpLFxuICB7dGltZW91dDogMjUsIHRyeVJlY292ZXJ5OiB0cnVlfVxuKTtcblxuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IFVpQXV0b21hdG9yMiBsaXN0ZW5zIHRvIG9uIHRoZSBkZXZpY2UuIFdlIHdpbGwgZm9yd2FyZFxuLy8gb25lIG9mIHRoZSBwb3J0cyBhYm92ZSBvbiB0aGUgc3lzdGVtIHRvIHRoaXMgcG9ydCBvbiB0aGUgZGV2aWNlLlxuY29uc3QgREVWSUNFX1BPUlQgPSA2NzkwO1xuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IHRoZSBVaUF1dG9tYXRvcjIgTUpQRUcgc2VydmVyIGxpc3RlbnMgdG8gb24gdGhlIGRldmljZS5cbi8vIFdlIHdpbGwgZm9yd2FyZCBvbmUgb2YgdGhlIHBvcnRzIGFib3ZlIG9uIHRoZSBzeXN0ZW0gdG8gdGhpcyBwb3J0IG9uIHRoZVxuLy8gZGV2aWNlLlxuY29uc3QgTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUID0gNzgxMDtcblxuY29uc3QgTE9DQUxIT1NUX0lQNCA9ICcxMjcuMC4wLjEnO1xuXG4vLyBOT19QUk9YWSBjb250YWlucyB0aGUgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIFVpQXV0b21hdG9yMiBzZXJ2ZXIuXG4vLyBUT0RPOiAgQWRkIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBVaUF1dG9tYXRvcjIgc2VydmVyLlxuLy8gVE9ETzogTmVlZCB0byBzZWdyZWdhdGUgdGhlIHBhdGhzIGJldHRlciB3YXkgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucyB3aGVyZXZlciBhcHBsaWNhYmxlLlxuLy8gKE5vdCBzZWdyZWdhdGluZyByaWdodCBhd2F5IGJlY2F1c2UgbW9yZSBwYXRocyB0byBiZSBhZGRlZCBpbiB0aGUgTk9fUFJPWFkgbGlzdClcbmNvbnN0IE5PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi8oPyEuKi8pJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hbGVydF9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnQvW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9bXi9dKy9jdXJyZW50X2FjdGl2aXR5JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvY3VycmVudF9wYWNrYWdlJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc2V0dGluZ3MnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2F0dHJpYnV0ZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9kaXNwbGF5ZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZW5hYmxlZCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9sb2NhdGlvbl9pbl92aWV3JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL25hbWUnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvc2NyZWVuc2hvdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9zZWxlY3RlZCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9uZXR3b3JrX2Nvbm5lY3Rpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NjcmVlbnNob3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9bXi9dK19hbGVydCQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hY3Rpb25zJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnQvW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHAvW14vXScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9bXi9dKy9zdGFydF9hY3Rpdml0eScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vY29tcGFyZV9pbWFnZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlLyg/IXNldF9jbGlwYm9hcmQpW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZWxlbWVudC9bXi9dKy9yZXBsYWNlX3ZhbHVlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2VsZW1lbnQvW14vXSsvdmFsdWUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZ2V0UGVyZm9ybWFuY2VEYXRhJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3BlcmZvcm1hbmNlRGF0YS90eXBlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zZXR0aW5ncycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9leGVjdXRlX2RyaXZlcicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zdGFydF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0b3BfcmVjb3JkaW5nX3NjcmVlbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS8uKmV2ZW50JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9pbWUvW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9rZXlzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9jYXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9uZXR3b3JrX2Nvbm5lY3Rpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90aW1lb3V0cycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL211bHRpL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdXJsJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlX2FzeW5jJyldLFxuICAvLyBXM0MgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvd2luZG93L3JlY3QnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL2FzeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuXTtcblxuLy8gVGhpcyBpcyBhIHNldCBvZiBtZXRob2RzIGFuZCBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gQ2hyb21lZHJpdmVyLlxuY29uc3QgQ0hST01FX05PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvcmVjdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG5cbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gbWFrZSB0aGUgbW9iaWxlOiBjb21tYW5kcyB3b3JraW5nIGluIHdlYiBjb250ZXh0XG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbl07XG5cbmNvbnN0IE1FTU9JWkVEX0ZVTkNUSU9OUyA9IFtcbiAgJ2dldFN0YXR1c0JhckhlaWdodCcsXG4gICdnZXREZXZpY2VQaXhlbFJhdGlvJyxcbl07XG5cbmNsYXNzIEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIgZXh0ZW5kcyBCYXNlRHJpdmVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSwgc2hvdWxkVmFsaWRhdGVDYXBzID0gdHJ1ZSkge1xuICAgIC8vIGBzaGVsbGAgb3ZlcndyaXRlcyBhZGIuc2hlbGwsIHNvIHJlbW92ZVxuICAgIGRlbGV0ZSBvcHRzLnNoZWxsO1xuXG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcbiAgICB0aGlzLmxvY2F0b3JTdHJhdGVnaWVzID0gW1xuICAgICAgJ3hwYXRoJyxcbiAgICAgICdpZCcsXG4gICAgICAnY2xhc3MgbmFtZScsXG4gICAgICAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgICAnY3NzIHNlbGVjdG9yJyxcbiAgICAgICctYW5kcm9pZCB1aWF1dG9tYXRvcidcbiAgICBdO1xuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENhcENvbnN0cmFpbnRzO1xuICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5kZWZhdWx0SU1FID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBOT19QUk9YWTtcbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTsgLy8gbWFwIG9mIGxhbmd1YWdlIC0+IHN0cmluZ3Mgb2JqXG5cbiAgICB0aGlzLnNldHRpbmdzID0gbmV3IERldmljZVNldHRpbmdzKHtpZ25vcmVVbmltcG9ydGFudFZpZXdzOiBmYWxzZSwgYWxsb3dJbnZpc2libGVFbGVtZW50czogZmFsc2V9LFxuICAgICAgICB0aGlzLm9uU2V0dGluZ3NVcGRhdGUuYmluZCh0aGlzKSk7XG4gICAgLy8gaGFuZGxlIHdlYnZpZXcgbWVjaGFuaWNzIGZyb20gQW5kcm9pZERyaXZlclxuICAgIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzID0ge307XG5cbiAgICAvLyBtZW1vaXplIGZ1bmN0aW9ucyBoZXJlLCBzbyB0aGF0IHRoZXkgYXJlIGRvbmUgb24gYSBwZXItaW5zdGFuY2UgYmFzaXNcbiAgICBmb3IgKGNvbnN0IGZuIG9mIE1FTU9JWkVEX0ZVTkNUSU9OUykge1xuICAgICAgdGhpc1tmbl0gPSBfLm1lbW9pemUodGhpc1tmbl0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlRGVzaXJlZENhcHMgKGNhcHMpIHtcbiAgICByZXR1cm4gc3VwZXIudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKSAmJiBhbmRyb2lkSGVscGVycy52YWxpZGF0ZURlc2lyZWRDYXBzKGNhcHMpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2Vzc2lvbiAoLi4uYXJncykge1xuICAgIHRyeSB7XG4gICAgICAvLyBUT0RPIGhhbmRsZSBvdGhlclNlc3Npb25EYXRhIGZvciBtdWx0aXBsZSBzZXNzaW9uc1xuICAgICAgbGV0IFtzZXNzaW9uSWQsIGNhcHNdID0gYXdhaXQgc3VwZXIuY3JlYXRlU2Vzc2lvbiguLi5hcmdzKTtcblxuICAgICAgbGV0IHNlcnZlckRldGFpbHMgPSB7XG4gICAgICAgIHBsYXRmb3JtOiAnTElOVVgnLFxuICAgICAgICB3ZWJTdG9yYWdlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRha2VzU2NyZWVuc2hvdDogdHJ1ZSxcbiAgICAgICAgamF2YXNjcmlwdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGRhdGFiYXNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIG5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbG9jYXRpb25Db250ZXh0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHdhcm5pbmdzOiB7fSxcbiAgICAgICAgZGVzaXJlZDogdGhpcy5jYXBzLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5jYXBzID0gT2JqZWN0LmFzc2lnbihzZXJ2ZXJEZXRhaWxzLCB0aGlzLmNhcHMpO1xuXG4gICAgICB0aGlzLmN1ckNvbnRleHQgPSB0aGlzLmRlZmF1bHRDb250ZXh0TmFtZSgpO1xuXG4gICAgICBsZXQgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgIGZ1bGxSZXNldDogZmFsc2UsXG4gICAgICAgIGF1dG9MYXVuY2g6IHRydWUsXG4gICAgICAgIGFkYlBvcnQ6IERFRkFVTFRfQURCX1BPUlQsXG4gICAgICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dDogOTAwMDBcbiAgICAgIH07XG4gICAgICBfLmRlZmF1bHRzKHRoaXMub3B0cywgZGVmYXVsdE9wdHMpO1xuXG4gICAgICBpZiAodGhpcy5pc0Nocm9tZVNlc3Npb24pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJXZSdyZSBnb2luZyB0byBydW4gYSBDaHJvbWUtYmFzZWQgc2Vzc2lvblwiKTtcbiAgICAgICAgbGV0IHtwa2csIGFjdGl2aXR5fSA9IGhlbHBlcnMuZ2V0Q2hyb21lUGtnKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gICAgICAgIHRoaXMub3B0cy5hcHBQYWNrYWdlID0gdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBwa2c7XG4gICAgICAgIHRoaXMub3B0cy5hcHBBY3Rpdml0eSA9IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICAgICAgICBsb2dnZXIuaW5mbyhgQ2hyb21lLXR5cGUgcGFja2FnZSBhbmQgYWN0aXZpdHkgYXJlICR7cGtnfSBhbmQgJHthY3Rpdml0eX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgdGhpcy5zZXRBdmRGcm9tQ2FwYWJpbGl0aWVzKGNhcHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgICAvLyBmaW5kIGFuZCBjb3B5LCBvciBkb3dubG9hZCBhbmQgdW56aXAgYW4gYXBwIHVybCBvciBwYXRoXG4gICAgICAgIHRoaXMub3B0cy5hcHAgPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKHRoaXMub3B0cy5hcHAsIFtBUEtfRVhURU5TSU9OLCBBUEtTX0VYVEVOU0lPTl0pO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwUHJlc2VudCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgICAvLyB0aGUgYXBwIGlzbid0IGFuIGFjdHVhbCBhcHAgZmlsZSBidXQgcmF0aGVyIHNvbWV0aGluZyB3ZSB3YW50IHRvXG4gICAgICAgIC8vIGFzc3VtZSBpcyBvbiB0aGUgZGV2aWNlIGFuZCBqdXN0IGxhdW5jaCB2aWEgdGhlIGFwcFBhY2thZ2VcbiAgICAgICAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScgZGlyZWN0bHkgb24gdGhlIGRldmljZWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYE5laXRoZXIgJ2FwcCcgbm9yICdhcHBQYWNrYWdlJyB3YXMgc2V0LiBTdGFydGluZyBVaUF1dG9tYXRvcjIgYCArXG4gICAgICAgICAgJ3dpdGhvdXQgdGhlIHRhcmdldCBhcHBsaWNhdGlvbicpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VWlBdXRvbWF0b3IyU2Vzc2lvbigpO1xuICAgICAgYXdhaXQgdGhpcy5maWxsRGV2aWNlRGV0YWlscygpO1xuICAgICAgaWYgKHRoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmwpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nIE1KUEVHIHN0cmVhbSByZWFkaW5nIFVSTDogJyR7dGhpcy5vcHRzLm1qcGVnU2NyZWVuc2hvdFVybH0nYCk7XG4gICAgICAgIHRoaXMubWpwZWdTdHJlYW0gPSBuZXcgbWpwZWcuTUpwZWdTdHJlYW0odGhpcy5vcHRzLm1qcGVnU2NyZWVuc2hvdFVybCk7XG4gICAgICAgIGF3YWl0IHRoaXMubWpwZWdTdHJlYW0uc3RhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCB0aGlzLmNhcHNdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmaWxsRGV2aWNlRGV0YWlscyAoKSB7XG4gICAgdGhpcy5jYXBzLnBpeGVsUmF0aW8gPSBhd2FpdCB0aGlzLmdldERldmljZVBpeGVsUmF0aW8oKTtcbiAgICB0aGlzLmNhcHMuc3RhdEJhckhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0U3RhdHVzQmFySGVpZ2h0KCk7XG4gICAgdGhpcy5jYXBzLnZpZXdwb3J0UmVjdCA9IGF3YWl0IHRoaXMuZ2V0Vmlld1BvcnRSZWN0KCk7XG4gIH1cblxuICBnZXQgZHJpdmVyRGF0YSAoKSB7XG4gICAgLy8gVE9ETyBmaWxsIG91dCByZXNvdXJjZSBpbmZvIGhlcmVcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBhc3luYyBnZXRTZXNzaW9uICgpIHtcbiAgICBsZXQgc2Vzc2lvbkRhdGEgPSBhd2FpdCBzdXBlci5nZXRTZXNzaW9uKCk7XG4gICAgbG9nZ2VyLmRlYnVnKCdHZXR0aW5nIHNlc3Npb24gZGV0YWlscyBmcm9tIHNlcnZlciB0byBtaXggaW4nKTtcbiAgICBsZXQgdWlhMkRhdGEgPSBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy8nLCAnR0VUJywge30pO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzZXNzaW9uRGF0YSwgdWlhMkRhdGEpO1xuICB9XG5cbiAgaXNFbXVsYXRvciAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNFbXVsYXRvcih0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgfVxuXG4gIHNldEF2ZEZyb21DYXBhYmlsaXRpZXMgKGNhcHMpIHtcbiAgICBpZiAodGhpcy5vcHRzLmF2ZCkge1xuICAgICAgbG9nZ2VyLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KCdhdmQgb3IgZGV2aWNlTmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWNhcHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KCdhdmQgb3IgcGxhdGZvcm1WZXJzaW9uIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZWQnKTtcbiAgICAgIH1cbiAgICAgIGxldCBhdmREZXZpY2UgPSBjYXBzLmRldmljZU5hbWUucmVwbGFjZSgvW15hLXpBLVowLTlfLl0vZywgJy0nKTtcbiAgICAgIHRoaXMub3B0cy5hdmQgPSBgJHthdmREZXZpY2V9X18ke2NhcHMucGxhdGZvcm1WZXJzaW9ufWA7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWxsb2NhdGVTeXN0ZW1Qb3J0ICgpIHtcbiAgICBjb25zdCBmb3J3YXJkUG9ydCA9IGFzeW5jIChsb2NhbFBvcnQpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRm9yd2FyZGluZyBVaUF1dG9tYXRvcjIgU2VydmVyIHBvcnQgJHtERVZJQ0VfUE9SVH0gdG8gbG9jYWwgcG9ydCAke2xvY2FsUG9ydH1gKTtcbiAgICAgIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKGxvY2FsUG9ydCwgTE9DQUxIT1NUX0lQNCkpID09PSAnb3BlbicpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYFVpQXV0b21hdG9yMiBTZXJ2ZXIgY2Fubm90IHN0YXJ0IGJlY2F1c2UgdGhlIGxvY2FsIHBvcnQgIyR7bG9jYWxQb3J0fSBpcyBidXN5LiBgICtcbiAgICAgICAgICBgTWFrZSBzdXJlIHRoZSBwb3J0IHlvdSBwcm92aWRlIHZpYSAnc3lzdGVtUG9ydCcgY2FwYWJpbGl0eSBpcyBub3Qgb2NjdXBpZWQuIGAgK1xuICAgICAgICAgIGBUaGlzIHNpdHVhdGlvbiBtaWdodCBvZnRlbiBiZSBhIHJlc3VsdCBvZiBhbiBpbmFjY3VyYXRlIHNlc3Npb25zIG1hbmFnZW1lbnQsIGUuZy4gYCArXG4gICAgICAgICAgYG9sZCBhdXRvbWF0aW9uIHNlc3Npb25zIG9uIHRoZSBzYW1lIGRldmljZSBtdXN0IGFsd2F5cyBiZSBjbG9zZWQgYmVmb3JlIHN0YXJ0aW5nIG5ldyBvbmVzLmApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yd2FyZFBvcnQobG9jYWxQb3J0LCBERVZJQ0VfUE9SVCk7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdHMuc3lzdGVtUG9ydCkge1xuICAgICAgdGhpcy5faGFzU3lzdGVtUG9ydEluQ2FwcyA9IHRydWU7XG4gICAgICByZXR1cm4gYXdhaXQgZm9yd2FyZFBvcnQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH1cblxuICAgIGF3YWl0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgW3N0YXJ0UG9ydCwgZW5kUG9ydF0gPSBERVZJQ0VfUE9SVF9SQU5HRTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMub3B0cy5zeXN0ZW1Qb3J0ID0gYXdhaXQgZmluZEFQb3J0Tm90SW5Vc2Uoc3RhcnRQb3J0LCBlbmRQb3J0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coXG4gICAgICAgICAgYENhbm5vdCBmaW5kIGFueSBmcmVlIHBvcnQgaW4gcmFuZ2UgJHtzdGFydFBvcnR9Li4ke2VuZFBvcnR9fS4gYCArXG4gICAgICAgICAgYFBsZWFzZSBzZXQgdGhlIGF2YWlsYWJsZSBwb3J0IG51bWJlciBieSBwcm92aWRpbmcgdGhlIHN5c3RlbVBvcnQgY2FwYWJpbGl0eSBvciBgICtcbiAgICAgICAgICBgZG91YmxlIGNoZWNrIHRoZSBwcm9jZXNzZXMgdGhhdCBhcmUgbG9ja2luZyBwb3J0cyB3aXRoaW4gdGhpcyByYW5nZSBhbmQgdGVybWluYXRlIGAgK1xuICAgICAgICAgIGB0aGVzZSB3aGljaCBhcmUgbm90IG5lZWRlZCBhbnltb3JlYCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBmb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZWxlYXNlU3lzdGVtUG9ydCAoKSB7XG4gICAgaWYgKCF0aGlzLm9wdHMuc3lzdGVtUG9ydCB8fCAhdGhpcy5hZGIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faGFzU3lzdGVtUG9ydEluQ2Fwcykge1xuICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBERVZJQ0VfUE9SVF9BTExPQ0FUSU9OX0dVQVJEKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQgKCkge1xuICAgIGlmICh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydCh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0LCBNSlBFR19TRVJWRVJfREVWSUNFX1BPUlQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VNanBlZ1NlcnZlclBvcnQgKCkge1xuICAgIGlmICh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFVpQXV0b21hdG9yMlNlc3Npb24gKCkge1xuICAgIC8vIGdldCBkZXZpY2UgdWRpZCBmb3IgdGhpcyBzZXNzaW9uXG4gICAgbGV0IHt1ZGlkLCBlbVBvcnR9ID0gYXdhaXQgaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHModGhpcy5vcHRzKTtcbiAgICB0aGlzLm9wdHMudWRpZCA9IHVkaWQ7XG4gICAgdGhpcy5vcHRzLmVtUG9ydCA9IGVtUG9ydDtcblxuICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgb3VyIGphdmEgdmVyc2lvbiBhbmQgZGV2aWNlIGluZm8sIHdlIGNhbiBjcmVhdGUgb3VyXG4gICAgLy8gQURCIGluc3RhbmNlXG4gICAgdGhpcy5hZGIgPSBhd2FpdCBhbmRyb2lkSGVscGVycy5jcmVhdGVBREIodGhpcy5vcHRzKTtcblxuICAgIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcblxuICAgIGlmIChhcGlMZXZlbCA8IDIxKSB7XG4gICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnVUlBdXRvbWF0b3IyIGlzIG9ubHkgc3VwcG9ydGVkIHNpbmNlIEFuZHJvaWQgNS4wIChMb2xsaXBvcCkuICcgK1xuICAgICAgICAnWW91IGNvdWxkIHN0aWxsIHVzZSBvdGhlciBzdXBwb3J0ZWQgYmFja2VuZHMgaW4gb3JkZXIgdG8gYXV0b21hdGUgb2xkZXIgQW5kcm9pZCB2ZXJzaW9ucy4nKTtcbiAgICB9XG5cbiAgICBpZiAoYXBpTGV2ZWwgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICBsb2dnZXIuaW5mbygnUmVsYXhpbmcgaGlkZGVuIGFwaSBwb2xpY3knKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEhpZGRlbkFwaVBvbGljeSgnMScsICEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIHRvIGVuYWJsZS9kaXNhYmxlIGdwcyBiZWZvcmUgcnVubmluZyB0aGUgYXBwbGljYXRpb25cbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMuZ3BzRW5hYmxlZCkpIHtcbiAgICAgIGlmICh0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvICR7dGhpcy5vcHRzLmdwc0VuYWJsZWQgPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ30gZ3BzIGxvY2F0aW9uIHByb3ZpZGVyYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIodGhpcy5vcHRzLmdwc0VuYWJsZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFNvcnJ5ISAnZ3BzRW5hYmxlZCcgY2FwYWJpbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBjb25zdCBhcHBJbmZvID0gYXdhaXQgaGVscGVycy5nZXRMYXVuY2hJbmZvKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIC8vIGFuZCBnZXQgaXQgb250byBvdXIgJ29wdHMnIG9iamVjdCBzbyB3ZSB1c2UgaXQgZnJvbSBub3cgb25cbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0cywgYXBwSW5mbyB8fCB7fSk7XG5cbiAgICAvLyBzZXQgYWN0dWFsIGRldmljZSBuYW1lLCB1ZGlkLCBwbGF0Zm9ybSB2ZXJzaW9uLCBzY3JlZW4gc2l6ZSwgc2NyZWVuIGRlbnNpdHksIG1vZGVsIGFuZCBtYW51ZmFjdHVyZXIgZGV0YWlsc1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VOYW1lID0gdGhpcy5hZGIuY3VyRGV2aWNlSWQ7XG4gICAgdGhpcy5jYXBzLmRldmljZVVESUQgPSB0aGlzLm9wdHMudWRpZDtcblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICB0aGlzLmRlZmF1bHRJTUUgPSBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgVWlBdXRvbWF0b3IyIHBvcnRcbiAgICAvLyBUaGlzIGNhbGwgbXV0YXRlcyB0aGlzLm9wdHMuc3lzdGVtUG9ydCBpZiBpdCBpcyBub3Qgc2V0IGV4cGxpY2l0bHlcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlU3lzdGVtUG9ydCgpO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgZGV2aWNlIGJ5IGZvcndhcmRpbmcgdGhlIFVpQXV0b21hdG9yMiBNSlBFRyBzZXJ2ZXIgcG9ydCAoaWZcbiAgICAvLyBhcHBsaWNhYmxlKVxuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQoKTtcblxuICAgIC8vIHNldCB1cCB0aGUgbW9kaWZpZWQgVWlBdXRvbWF0b3IyIHNlcnZlciBldGNcbiAgICBhd2FpdCB0aGlzLmluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIoKTtcblxuICAgIC8vIFNob3VsZCBiZSBhZnRlciBpbnN0YWxsaW5nIGlvLmFwcGl1bS5zZXR0aW5ncyBpbiBoZWxwZXJzLmluaXREZXZpY2VcbiAgICBpZiAodGhpcy5vcHRzLmRpc2FibGVXaW5kb3dBbmltYXRpb24gJiYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyNikpIHsgLy8gQVBJIGxldmVsIDI2IGlzIEFuZHJvaWQgOC4wLlxuICAgICAgLy8gR3JhbnRpbmcgYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9BTklNQVRJT05fU0NBTEUgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBhbmltYXRpb25zIHVuZGVyIEFQSSBsZXZlbCAyNlxuICAgICAgLy8gUmVhZCBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9wdWxsLzExNjQwI2lzc3VlY29tbWVudC00MzgyNjA0NzdcbiAgICAgIC8vIGAtLW5vLXdpbmRvdy1hbmltYXRpb25gIHdvcmtzIG92ZXIgQW5kcm9pZCA4IHRvIGRpc2FibGUgYWxsIG9mIGFuaW1hdGlvbnNcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0Rpc2FibGluZyBhbmltYXRpb24gdmlhIGlvLmFwcGl1bS5zZXR0aW5ncycpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBbmltYXRpb25TdGF0ZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdXaW5kb3cgYW5pbWF0aW9uIGlzIGFscmVhZHkgZGlzYWJsZWQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgYXBwIHVuZGVyIHRlc3RcbiAgICAvLyBwcmVwYXJlIG91ciBhY3R1YWwgQVVULCBnZXQgaXQgb24gdGhlIGRldmljZSwgZXRjLi4uXG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvLyBBZGRpbmcgQVVUIHBhY2thZ2UgbmFtZSBpbiB0aGUgY2FwYWJpbGl0aWVzIGlmIHBhY2thZ2UgbmFtZSBub3QgZXhpc3QgaW4gY2Fwc1xuICAgIGlmICghdGhpcy5jYXBzLmFwcFBhY2thZ2UgJiYgYXBwSW5mbykge1xuICAgICAgdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBhcHBJbmZvLmFwcFBhY2thZ2U7XG4gICAgfVxuXG4gICAgLy8gbGF1bmNoIFVpQXV0b21hdG9yMiBhbmQgd2FpdCB0aWxsIGl0cyBvbmxpbmUgYW5kIHdlIGhhdmUgYSBzZXNzaW9uXG4gICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuc3RhcnRTZXNzaW9uKHRoaXMuY2Fwcyk7XG5cbiAgICBhd2FpdCB0aGlzLmFkZERldmljZUluZm9Ub0NhcHMoKTtcblxuICAgIC8vIFVubG9jayB0aGUgZGV2aWNlIGFmdGVyIHRoZSBzZXNzaW9uIGlzIHN0YXJ0ZWQuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVubG9jaykge1xuICAgICAgLy8gdW5sb2NrIHRoZSBkZXZpY2UgdG8gcHJlcGFyZSBpdCBmb3IgdGVzdGluZ1xuICAgICAgYXdhaXQgaGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHRoaXMuY2Fwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgJ3NraXBVbmxvY2snIGNhcGFiaWxpdHkgc2V0LCBzbyBza2lwcGluZyBkZXZpY2UgdW5sb2NrYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7IC8vIHN0YXJ0IGEgY2hyb21lZHJpdmVyIHNlc3Npb25cbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmF1dG9MYXVuY2ggJiYgdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQXBwU3RhcnRzKCk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGluaXRpYWwgb3JpZW50YXRpb24gaXMgcmVxdWVzdGVkLCBzZXQgaXRcbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMub3JpZW50YXRpb24pKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYFNldHRpbmcgaW5pdGlhbCBvcmllbnRhdGlvbiB0byAnJHt0aGlzLm9wdHMub3JpZW50YXRpb259J2ApO1xuICAgICAgYXdhaXQgdGhpcy5zZXRPcmllbnRhdGlvbih0aGlzLm9wdHMub3JpZW50YXRpb24pO1xuICAgIH1cblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gaW1tZWRpYXRlbHkgZ2V0IGludG8gYSB3ZWJ2aWV3LCBzZXQgb3VyIGNvbnRleHRcbiAgICAvLyBhcHByb3ByaWF0ZWx5XG4gICAgaWYgKHRoaXMub3B0cy5hdXRvV2Vidmlldykge1xuICAgICAgY29uc3Qgdmlld05hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICAgICAgY29uc3QgdGltZW91dCA9IHRoaXMub3B0cy5hdXRvV2Vidmlld1RpbWVvdXQgfHwgMjAwMDtcbiAgICAgIGxvZ2dlci5pbmZvKGBTZXR0aW5nIGF1dG8gd2VidmlldyB0byBjb250ZXh0ICcke3ZpZXdOYW1lfScgd2l0aCB0aW1lb3V0ICR7dGltZW91dH1tc2ApO1xuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIHRoaXMuc2V0Q29udGV4dC5iaW5kKHRoaXMpLCB2aWV3TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gbm93IHRoYXQgZXZlcnl0aGluZyBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHksIHR1cm4gb24gcHJveHlpbmcgc28gYWxsXG4gICAgLy8gc3Vic2VxdWVudCBzZXNzaW9uIHJlcXVlc3RzIGdvIHN0cmFpZ2h0IHRvL2Zyb20gdWlhdXRvbWF0b3IyXG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG4gIH1cblxuICBhc3luYyBhZGREZXZpY2VJbmZvVG9DYXBzICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgICAgbWFudWZhY3R1cmVyLFxuICAgICAgbW9kZWwsXG4gICAgICByZWFsRGlzcGxheVNpemUsXG4gICAgICBkaXNwbGF5RGVuc2l0eSxcbiAgICB9ID0gYXdhaXQgdGhpcy5tb2JpbGVHZXREZXZpY2VJbmZvKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZUFwaUxldmVsID0gcGFyc2VJbnQoYXBpVmVyc2lvbiwgMTApO1xuICAgIHRoaXMuY2Fwcy5wbGF0Zm9ybVZlcnNpb24gPSBwbGF0Zm9ybVZlcnNpb247XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlblNpemUgPSByZWFsRGlzcGxheVNpemU7XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlbkRlbnNpdHkgPSBkaXNwbGF5RGVuc2l0eTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTWFudWZhY3R1cmVyID0gbWFudWZhY3R1cmVyO1xuICB9XG5cbiAgYXN5bmMgaW5pdFVpQXV0b21hdG9yMlNlcnZlciAoKSB7XG4gICAgLy8gYnJva2VuIG91dCBmb3IgcmVhZGFiaWxpdHlcbiAgICBjb25zdCB1aWF1dG9tYXRvcjJPcHRzID0ge1xuICAgICAgaG9zdDogdGhpcy5vcHRzLnJlbW90ZUFkYkhvc3QgfHwgdGhpcy5vcHRzLmhvc3QgfHwgTE9DQUxIT1NUX0lQNCxcbiAgICAgIHN5c3RlbVBvcnQ6IHRoaXMub3B0cy5zeXN0ZW1Qb3J0LFxuICAgICAgZGV2aWNlUG9ydDogREVWSUNFX1BPUlQsXG4gICAgICBhZGI6IHRoaXMuYWRiLFxuICAgICAgYXBrOiB0aGlzLm9wdHMuYXBwLFxuICAgICAgdG1wRGlyOiB0aGlzLm9wdHMudG1wRGlyLFxuICAgICAgYXBwUGFja2FnZTogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICBhcHBBY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbjogISF0aGlzLm9wdHMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICAgIGRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlOiB0aGlzLm9wdHMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UsXG4gICAgICByZWFkVGltZW91dDogdGhpcy5vcHRzLnVpYXV0b21hdG9yMlNlcnZlclJlYWRUaW1lb3V0LFxuICAgIH07XG4gICAgLy8gbm93IHRoYXQgd2UgaGF2ZSBwYWNrYWdlIGFuZCBhY3Rpdml0eSwgd2UgY2FuIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZlxuICAgIC8vIHVpYXV0b21hdG9yMiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBvcHRpb25zXG4gICAgdGhpcy51aWF1dG9tYXRvcjIgPSBuZXcgVWlBdXRvbWF0b3IyU2VydmVyKHVpYXV0b21hdG9yMk9wdHMpO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLnVpYXV0b21hdG9yMi5wcm94eVJlcVJlcy5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcblxuICAgIGlmICh0aGlzLm9wdHMuc2tpcFNlcnZlckluc3RhbGxhdGlvbikge1xuICAgICAgbG9nZ2VyLmluZm8oYCdza2lwU2VydmVySW5zdGFsbGF0aW9uJyBpcyBzZXQuIFNraXBwaW5nIFVJQXV0b21hdG9yMiBzZXJ2ZXIgaW5zdGFsbGF0aW9uLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5pbnN0YWxsU2VydmVyQXBrKHRoaXMub3B0cy51aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QoXG4gICAgICAgICAgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQsXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDYW5ub3QgYWRkIHNlcnZlciBwYWNrYWdlcyB0byB0aGUgRG96ZSB3aGl0ZWxpc3QuIE9yaWdpbmFsIGVycm9yOiBgICtcbiAgICAgICAgICAoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdEFVVCAoKSB7XG4gICAgLy8gVW5pbnN0YWxsIGFueSB1bmluc3RhbGxPdGhlclBhY2thZ2VzIHdoaWNoIHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyhcbiAgICAgICAgdGhpcy5hZGIsXG4gICAgICAgIGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyksXG4gICAgICAgIFtTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCBhbnkgXCJvdGhlckFwcHNcIiB0aGF0IHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLm90aGVyQXBwcykge1xuICAgICAgbGV0IG90aGVyQXBwcztcbiAgICAgIHRyeSB7XG4gICAgICAgIG90aGVyQXBwcyA9IGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMub3RoZXJBcHBzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcIm90aGVyQXBwc1wiIGNhcGFiaWxpdHk6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgb3RoZXJBcHBzID0gYXdhaXQgQi5hbGwob3RoZXJBcHBzXG4gICAgICAgIC5tYXAoKGFwcCkgPT4gdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcChhcHAsIFtBUEtfRVhURU5TSU9OLCBBUEtTX0VYVEVOU0lPTl0pKSk7XG4gICAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxPdGhlckFwa3Mob3RoZXJBcHBzLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgaWYgKCF0aGlzLm9wdHMubm9TaWduXG4gICAgICAgICYmICFhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQodGhpcy5vcHRzLmFwcCwgdGhpcy5vcHRzLmFwcFBhY2thZ2UsIHtcbiAgICAgICAgICByZXF1aXJlRGVmYXVsdENlcnQ6IGZhbHNlLFxuICAgICAgICB9KSkge1xuICAgICAgICBhd2FpdCBoZWxwZXJzLnNpZ25BcHAodGhpcy5hZGIsIHRoaXMub3B0cy5hcHApO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgaGVscGVycy5pbnN0YWxsQXBrKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnRnVsbCByZXNldCByZXF1aXJlcyBhbiBhcHAgY2FwYWJpbGl0eSwgdXNlIGZhc3RSZXNldCBpZiBhcHAgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0ICYmIHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZW5zdXJlQXBwU3RhcnRzICgpIHtcbiAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBhY3Rpdml0eSBhbmQgcGFja2FnZSB0byB3YWl0IGZvclxuICAgIGNvbnN0IGFwcFdhaXRQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlIHx8IHRoaXMub3B0cy5hcHBQYWNrYWdlO1xuICAgIGNvbnN0IGFwcFdhaXRBY3Rpdml0eSA9IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHkgfHwgdGhpcy5vcHRzLmFwcEFjdGl2aXR5O1xuXG4gICAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfS8ke3RoaXMub3B0cy5hcHBBY3Rpdml0eX0gYCArXG4gICAgICBgYW5kIHdhaXRpbmcgZm9yICcke2FwcFdhaXRQYWNrYWdlfS8ke2FwcFdhaXRBY3Rpdml0eX0nYCk7XG5cbiAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgbG9nZ2VyLmluZm8oYGFuZHJvaWRDb3ZlcmFnZSBpcyBjb25maWd1cmVkLiBgICtcbiAgICAgICAgYCBTdGFydGluZyBpbnN0cnVtZW50YXRpb24gb2YgJyR7dGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZX0nLi4uYCk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5hbmRyb2lkQ292ZXJhZ2UodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSwgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKHtcbiAgICAgICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgICAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgICAgc3RvcEFwcDogIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQsXG4gICAgICAgIHJldHJ5OiB0cnVlLFxuICAgICAgICB1c2VyOiB0aGlzLm9wdHMudXNlclByb2ZpbGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRGVsZXRpbmcgVWlBdXRvbWF0b3IyIHNlc3Npb24nKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgaWYgKHRoaXMudWlhdXRvbWF0b3IyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBzdG9wIENocm9tZURyaXZlciBwcm94aWVzOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuandwUHJveHlBY3RpdmUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5kZWxldGVTZXNzaW9uKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcHJveHkgZGVsZXRlU2Vzc2lvbiB0byBVaUF1dG9tYXRvcjI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuYWRiKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJiB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXNldHRpbmcgSU1FIHRvICcke3RoaXMuZGVmYXVsdElNRX0nYCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0SU1FKHRoaXMuZGVmYXVsdElNRSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcmVzZXQgSU1FOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgICBsb2dnZXIuaW5mbygnU2h1dHRpbmcgZG93biB0aGUgYWRiIHByb2Nlc3Mgb2YgaW5zdHJ1bWVudGF0aW9uLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmVuZEFuZHJvaWRDb3ZlcmFnZSgpO1xuICAgICAgICAvLyBVc2UgdGhpcyBicm9hZGNhc3QgaW50ZW50IHRvIG5vdGlmeSBpdCdzIHRpbWUgdG8gZHVtcCBjb3ZlcmFnZSB0byBmaWxlXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50KSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFNlbmRpbmcgaW50ZW50IGJyb2FkY2FzdCAnJHt0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50fScgYXQgdGhlIGVuZCBvZiBpbnN0cnVtZW50aW5nLmApO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmJyb2FkY2FzdCh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIud2FybignTm8gYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50IGlzIGNvbmZpZ3VyZWQgaW4gY2Fwcy4gUG9zc2libHkgeW91IGNhbm5vdCBnZXQgY292ZXJhZ2UgZmlsZS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gZm9yY2Ugc3RvcCBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2FwYWJpbGl0eSAnZnVsbFJlc2V0JyBzZXQgdG8gJ3RydWUnLCBVbmluc3RhbGxpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9J2ApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byB1bmluc3RhbGwgYXBwOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhpcyB2YWx1ZSBjYW4gYmUgdHJ1ZSBpZiB0ZXN0IHRhcmdldCBkZXZpY2UgaXMgPD0gMjZcbiAgICAgIGlmICh0aGlzLl93YXNXaW5kb3dBbmltYXRpb25EaXNhYmxlZCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnUmVzdG9yaW5nIHdpbmRvdyBhbmltYXRpb24gc3RhdGUnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zdG9wTG9nY2F0KCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VTeXN0ZW1Qb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHJlbW92ZSBzeXN0ZW0gcG9ydCBmb3J3YXJkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIC8vIElnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHJlbW92ZSBNSlBFRyBzZXJ2ZXIgcG9ydCBmb3J3YXJkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIC8vIElnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2xvc2luZyBlbXVsYXRvciAnJHthdmROYW1lfSdgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5raWxsRW11bGF0b3IoYXZkTmFtZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gY2xvc2UgZW11bGF0b3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMubWpwZWdTdHJlYW0pIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdDbG9zaW5nIE1KUEVHIHN0cmVhbScpO1xuICAgICAgdGhpcy5tanBlZ1N0cmVhbS5zdG9wKCk7XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdDaGVja2luZyB3aGV0aGVyIGFwcCBpcyBhY3R1YWxseSBwcmVzZW50Jyk7XG4gICAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHRoaXMub3B0cy5hcHApKSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBmaW5kIGFwcCBhcGsgYXQgJyR7dGhpcy5vcHRzLmFwcH0nYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25TZXR0aW5nc1VwZGF0ZSAoKSB7XG4gICAgLy8gaW50ZW50aW9uYWxseSBkbyBub3RoaW5nIGhlcmUsIHNpbmNlIGNvbW1hbmRzLnVwZGF0ZVNldHRpbmdzIHByb3hpZXNcbiAgICAvLyBzZXR0aW5ncyB0byB0aGUgdWlhdXRvMiBzZXJ2ZXIgYWxyZWFkeVxuICB9XG5cbiAgLy8gTmVlZCB0byBvdmVycmlkZSBhbmRyb2lkLWRyaXZlcidzIHZlcnNpb24gb2YgdGhpcyBzaW5jZSB3ZSBkb24ndCBhY3R1YWxseVxuICAvLyBoYXZlIGEgYm9vdHN0cmFwOyBpbnN0ZWFkIHdlIGp1c3QgcmVzdGFydCBhZGIgYW5kIHJlLWZvcndhcmQgdGhlIFVpQXV0b21hdG9yMlxuICAvLyBwb3J0XG4gIGFzeW5jIHdyYXBCb290c3RyYXBEaXNjb25uZWN0ICh3cmFwcGVkKSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlU3lzdGVtUG9ydCgpO1xuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQoKTtcbiAgfVxuXG4gIHByb3h5QWN0aXZlIChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5wcm94eUFjdGl2ZShzZXNzaW9uSWQpO1xuXG4gICAgLy8gd2UgYWx3YXlzIGhhdmUgYW4gYWN0aXZlIHByb3h5IHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuY2FuUHJveHkoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGNhbiBhbHdheXMgcHJveHkgdG8gdGhlIHVpYXV0b21hdG9yMiBzZXJ2ZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5nZXRQcm94eUF2b2lkTGlzdChzZXNzaW9uSWQpO1xuICAgIC8vIHdlIGFyZSBtYWludGFpbmluZyB0d28gc2V0cyBvZiBOT19QUk9YWSBsaXN0cywgb25lIGZvciBjaHJvbWVkcml2ZXIoQ0hST01FX05PX1BST1hZKVxuICAgIC8vIGFuZCBvbmUgZm9yIHVpYXV0b21hdG9yMihOT19QUk9YWSksIGJhc2VkIG9uIGN1cnJlbnQgY29udGV4dCB3aWxsIHJldHVybiByZWxhdGVkIE5PX1BST1hZIGxpc3RcbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLmNocm9tZWRyaXZlcikpIHtcbiAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgd2VidmlldyhjaHJvbWVkcml2ZXIpLCB0aGVuIHJldHVybiBDSFJPTUVfTk9fUFJPWFkgbGlzdFxuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gQ0hST01FX05PX1BST1hZO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBOT19QUk9YWTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5uYXRpdmVXZWJTY3JlZW5zaG90KSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBbLi4udGhpcy5qd3BQcm94eUF2b2lkLCBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zY3JlZW5zaG90JyldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgZ2V0IGlzQ2hyb21lU2Vzc2lvbiAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gIH1cbn1cblxuLy8gZmlyc3QgYWRkIHRoZSBhbmRyb2lkLWRyaXZlciBjb21tYW5kcyB3aGljaCB3ZSB3aWxsIGZhbGwgYmFjayB0b1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhhbmRyb2lkQ29tbWFuZHMpKSB7XG4gIEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIucHJvdG90eXBlW2NtZF0gPSBmbjtcbn1cblxuLy8gdGhlbiBvdmVyd3JpdGUgd2l0aCBhbnkgdWlhdXRvbWF0b3IyLXNwZWNpZmljIGNvbW1hbmRzXG5mb3IgKGxldCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGNvbW1hbmRzKSkge1xuICBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbmV4cG9ydCB7IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXI7XG4iXSwiZmlsZSI6ImxpYi9kcml2ZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -349,12 +349,14 @@ class UiAutomator2Server {
349
349
  url: `http://${this.host}:${this.systemPort}/wd/hub/sessions`,
350
350
  timeout: 500
351
351
  })).data;
352
- const activeSessionIds = value.map(sess => sess.id);
352
+ const activeSessionIds = value.map(({
353
+ id
354
+ }) => id).filter(Boolean);
353
355
 
354
356
  if (activeSessionIds.length) {
355
357
  _logger.default.debug(`The following obsolete sessions are still running: ${JSON.stringify(activeSessionIds)}`);
356
358
 
357
- _logger.default.debug('Cleaning up the obsolete sessions');
359
+ _logger.default.debug(`Cleaning up ${_appiumSupport.util.pluralize('obsolete session', activeSessionIds.length, true)}`);
358
360
 
359
361
  await _bluebird.default.all(activeSessionIds.map(id => _axios.default.delete(`http://${this.host}:${this.systemPort}/wd/hub/session/${id}`)));
360
362
  await _bluebird.default.delay(1000);
@@ -385,4 +387,4 @@ var _default = UiAutomator2Server;
385
387
  exports.default = _default;require('source-map-support').install();
386
388
 
387
389
 
388
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91aWF1dG9tYXRvcjIuanMiXSwibmFtZXMiOlsiUkVRRF9QQVJBTVMiLCJTRVJWRVJfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfSU5TVEFMTF9SRVRSSUVTIiwiU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJJTlNUUlVNRU5UQVRJT05fVEFSR0VUIiwiaW5zdHJ1bWVudGF0aW9uTG9nZ2VyIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiVUlBMlByb3h5IiwiSldQcm94eSIsInByb3h5Q29tbWFuZCIsInVybCIsIm1ldGhvZCIsImJvZHkiLCJkaWRJbnN0cnVtZW50YXRpb25FeGl0IiwiZXJyb3JzIiwiSW52YWxpZENvbnRleHRFcnJvciIsIlVpQXV0b21hdG9yMlNlcnZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInJlcSIsInV0aWwiLCJoYXNWYWx1ZSIsIkVycm9yIiwiZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UiLCJwcm94eU9wdHMiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInN5c3RlbVBvcnQiLCJrZWVwQWxpdmUiLCJyZWFkVGltZW91dCIsInRpbWVvdXQiLCJqd3Byb3h5IiwicHJveHlSZXFSZXMiLCJiaW5kIiwiaW5zdGFsbFNlcnZlckFwayIsImluc3RhbGxUaW1lb3V0IiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwicGFja2FnZUluZm9zTWFwcGVyIiwiYXBwUGF0aCIsImFwcElkIiwiaGVscGVycyIsImlzV3JpdGVhYmxlIiwibG9nIiwiaW5mbyIsImRzdFBhdGgiLCJwYXRoIiwicmVzb2x2ZSIsImJhc2VuYW1lIiwiZnMiLCJjb3B5RmlsZSIsInBhY2thZ2VzSW5mbyIsIkIiLCJhbGwiLCJtYXAiLCJhcGtQYXRoIiwidGVzdEFwa1BhdGgiLCJzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyIsInNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyIsImlzQXBwSW5zdGFsbGVkIiwiYWRiIiwiY2hlY2tBcGtDZXJ0Iiwic2lnbkFwcCIsImFwcFN0YXRlIiwiZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUiLCJkZWJ1ZyIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQiLCJORVdFUl9WRVJTSU9OX0lOU1RBTExFRCIsImluY2x1ZGVzIiwiTk9UX0lOU1RBTExFRCIsInVuaW5zdGFsbEFwayIsImVyciIsIndhcm4iLCJtZXNzYWdlIiwiaW5zdGFsbCIsIm5vSW5jcmVtZW50YWwiLCJyZXBsYWNlIiwidGltZW91dENhcE5hbWUiLCJyaW1yYWYiLCJ2ZXJpZnlTZXJ2aWNlc0F2YWlsYWJpbGl0eSIsImlzUG1TZXJ2aWNlQXZhaWxhYmxlIiwicG1PdXRwdXQiLCJwbUVycm9yIiwic2hlbGwiLCJlIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImVycm9yIiwibGluZSIsInNwbGl0Iiwic3RhcnRTZXNzaW9uIiwiY2FwcyIsImNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsInNlcnZlclZlcnNpb24iLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0IiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwicmV0cmllcyIsIm1heFJldHJpZXMiLCJkZWxheUJldHdlZW5SZXRyaWVzIiwic3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzIiwiY29tbWFuZCIsImVycm9yQW5kVGhyb3ciLCJkZWxheSIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwiY2FwYWJpbGl0aWVzIiwiZmlyc3RNYXRjaCIsImFsd2F5c01hdGNoIiwiY21kIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsInB1c2giLCJfIiwiaXNCb29sZWFuIiwiaW5zdHJ1bWVudGF0aW9uUHJvY2VzcyIsImNyZWF0ZVN1YlByb2Nlc3MiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsIm91dHB1dCIsInRyaW0iLCJjb2RlIiwiZGVsZXRlU2Vzc2lvbiIsInN0cmljdENsZWFudXAiLCJ2YWx1ZSIsImRhdGEiLCJhY3RpdmVTZXNzaW9uSWRzIiwic2VzcyIsImlkIiwibGVuZ3RoIiwiSlNPTiIsInN0cmluZ2lmeSIsImF4aW9zIiwiZGVsZXRlIiwiZm9yY2VTdG9wIiwiaWdub3JlIiwia2lsbFByb2Nlc3Nlc0J5TmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxXQUFXLEdBQUcsQ0FBQyxLQUFELEVBQVEsUUFBUixFQUFrQixNQUFsQixFQUEwQixZQUExQixFQUF3QyxZQUF4QyxFQUFzRCx3QkFBdEQsQ0FBcEI7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxLQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLEVBQS9CO0FBQ0EsTUFBTUMsdUJBQXVCLEdBQUcsS0FBaEM7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRywrQkFBMUI7O0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUksR0FBRUQsaUJBQWtCLE9BQXBEOztBQUNBLE1BQU1FLHNCQUFzQixHQUFJLEdBQUVELHNCQUF1QiwwQ0FBekQ7OztBQUNBLE1BQU1FLHFCQUFxQixHQUFHQyxzQkFBT0MsU0FBUCxDQUFpQixpQkFBakIsQ0FBOUI7O0FBRUEsTUFBTUMsU0FBTixTQUF3QkMseUJBQXhCLENBQWdDO0FBQ1osUUFBWkMsWUFBWSxDQUFFQyxHQUFGLEVBQU9DLE1BQVAsRUFBZUMsSUFBSSxHQUFHLElBQXRCLEVBQTRCO0FBQzVDLFFBQUksS0FBS0Msc0JBQVQsRUFBaUM7QUFDL0IsWUFBTSxJQUFJQyx5QkFBT0MsbUJBQVgsQ0FDSCxJQUFHSixNQUFPLElBQUdELEdBQUkscURBQWxCLEdBQ0EsaUVBREEsR0FFQSxnRUFISSxDQUFOO0FBSUQ7O0FBQ0QsV0FBTyxNQUFNLE1BQU1ELFlBQU4sQ0FB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SUFBSSxDQUFDQyxFQUF6QixDQUF6Qjs7QUFDQSxVQUFJRixnQkFBZ0IsQ0FBQ0csTUFBckIsRUFBNkI7QUFDM0IzRix3QkFBSXNCLEtBQUosQ0FBVyxzREFBcURzRSxJQUFJLENBQUNDLFNBQUwsQ0FBZUwsZ0JBQWYsQ0FBaUMsRUFBakc7O0FBQ0F4Rix3QkFBSXNCLEtBQUosQ0FBVSxtQ0FBVjs7QUFDQSxjQUFNYixrQkFBRUMsR0FBRixDQUFNOEUsZ0JBQWdCLENBQUM3RSxHQUFqQixDQUFzQitFLEVBQUQsSUFDL0JJLGVBQU1DLE1BQU4sQ0FBYyxVQUFTLEtBQUtsSCxJQUFLLElBQUcsS0FBS0UsVUFBVyxtQkFBa0IyRyxFQUFHLEVBQXpFLENBRFUsQ0FBTixDQUFOO0FBSUEsY0FBTWpGLGtCQUFFdUQsS0FBRixDQUFRLElBQVIsQ0FBTjtBQUNELE9BUkQsTUFRTztBQUNMaEUsd0JBQUlzQixLQUFKLENBQVUseUNBQVY7QUFDRDtBQUNGLEtBakJELENBaUJFLE9BQU9vQixDQUFQLEVBQVU7QUFDVjFDLHNCQUFJc0IsS0FBSixDQUFXLDRDQUEyQ29CLENBQUMsQ0FBQ1gsT0FBUSxHQUFoRTtBQUNEOztBQUVELFFBQUk7QUFDRixZQUFNLEtBQUtkLEdBQUwsQ0FBUytFLFNBQVQsQ0FBbUIzSSxzQkFBbkIsQ0FBTjtBQUNELEtBRkQsQ0FFRSxPQUFPNEksTUFBUCxFQUFlLENBQUU7O0FBQ25CLFFBQUksQ0FBQ1osYUFBTCxFQUFvQjtBQUNsQjtBQUNEOztBQUVELFFBQUk7QUFDRixZQUFNLEtBQUtwRSxHQUFMLENBQVNpRixtQkFBVCxDQUE2QixhQUE3QixDQUFOO0FBQ0QsS0FGRCxDQUVFLE9BQU9ELE1BQVAsRUFBZSxDQUFFO0FBQ3BCOztBQTFTc0I7OztlQThTVjlILGtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEpXUHJveHksIGVycm9ycyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBTRVJWRVJfQVBLX1BBVEggYXMgYXBrUGF0aCwgVEVTVF9BUEtfUEFUSCBhcyB0ZXN0QXBrUGF0aCwgdmVyc2lvbiBhcyBzZXJ2ZXJWZXJzaW9uIH0gZnJvbSAnYXBwaXVtLXVpYXV0b21hdG9yMi1zZXJ2ZXInO1xuaW1wb3J0IHsgdXRpbCwgbG9nZ2VyLCB0ZW1wRGlyLCBmcywgdGltaW5nIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuY29uc3QgUkVRRF9QQVJBTVMgPSBbJ2FkYicsICd0bXBEaXInLCAnaG9zdCcsICdzeXN0ZW1Qb3J0JywgJ2RldmljZVBvcnQnLCAnZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiddO1xuY29uc3QgU0VSVkVSX0xBVU5DSF9USU1FT1VUID0gMzAwMDA7XG5jb25zdCBTRVJWRVJfSU5TVEFMTF9SRVRSSUVTID0gMjA7XG5jb25zdCBTRVJWSUNFU19MQVVOQ0hfVElNRU9VVCA9IDMwMDAwO1xuY29uc3QgU0VSVkVSX1BBQ0tBR0VfSUQgPSAnaW8uYXBwaXVtLnVpYXV0b21hdG9yMi5zZXJ2ZXInO1xuY29uc3QgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCA9IGAke1NFUlZFUl9QQUNLQUdFX0lEfS50ZXN0YDtcbmNvbnN0IElOU1RSVU1FTlRBVElPTl9UQVJHRVQgPSBgJHtTRVJWRVJfVEVTVF9QQUNLQUdFX0lEfS9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXJgO1xuY29uc3QgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyID0gbG9nZ2VyLmdldExvZ2dlcignSW5zdHJ1bWVudGF0aW9uJyk7XG5cbmNsYXNzIFVJQTJQcm94eSBleHRlbmRzIEpXUHJveHkge1xuICBhc3luYyBwcm94eUNvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5ID0gbnVsbCkge1xuICAgIGlmICh0aGlzLmRpZEluc3RydW1lbnRhdGlvbkV4aXQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZENvbnRleHRFcnJvcihcbiAgICAgICAgYCcke21ldGhvZH0gJHt1cmx9JyBjYW5ub3QgYmUgcHJveGllZCB0byBVaUF1dG9tYXRvcjIgc2VydmVyIGJlY2F1c2UgYCArXG4gICAgICAgICd0aGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcgKHByb2JhYmx5IGNyYXNoZWQpLiAnICtcbiAgICAgICAgJ0NoZWNrIHRoZSBzZXJ2ZXIgbG9nIGFuZC9vciB0aGUgbG9nY2F0IG91dHB1dCBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBzdXBlci5wcm94eUNvbW1hbmQodXJsLCBtZXRob2QsIGJvZHkpO1xuICB9XG59XG5cbmNsYXNzIFVpQXV0b21hdG9yMlNlcnZlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30pIHtcbiAgICBmb3IgKGxldCByZXEgb2YgUkVRRF9QQVJBTVMpIHtcbiAgICAgIGlmICghb3B0cyB8fCAhdXRpbC5oYXNWYWx1ZShvcHRzW3JlcV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT3B0aW9uICcke3JlcX0nIGlzIHJlcXVpcmVkIWApO1xuICAgICAgfVxuICAgICAgdGhpc1tyZXFdID0gb3B0c1tyZXFdO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlID0gb3B0cy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTtcbiAgICBjb25zdCBwcm94eU9wdHMgPSB7XG4gICAgICBzZXJ2ZXI6IHRoaXMuaG9zdCxcbiAgICAgIHBvcnQ6IHRoaXMuc3lzdGVtUG9ydCxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9O1xuICAgIGlmIChvcHRzLnJlYWRUaW1lb3V0ICYmIG9wdHMucmVhZFRpbWVvdXQgPiAwKSB7XG4gICAgICBwcm94eU9wdHMudGltZW91dCA9IG9wdHMucmVhZFRpbWVvdXQ7XG4gICAgfVxuICAgIHRoaXMuandwcm94eSA9IG5ldyBVSUEyUHJveHkocHJveHlPcHRzKTtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGxzIHRoZSBhcGtzIG9uIHRvIHRoZSBkZXZpY2Ugb3IgZW11bGF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YWxsVGltZW91dCAtIEluc3RhbGxhdGlvbiB0aW1lb3V0XG4gICAqL1xuICBhc3luYyBpbnN0YWxsU2VydmVyQXBrIChpbnN0YWxsVGltZW91dCA9IFNFUlZFUl9JTlNUQUxMX1JFVFJJRVMgKiAxMDAwKSB7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIGNvbnN0IHBhY2thZ2VJbmZvc01hcHBlciA9IGFzeW5jICh7YXBwUGF0aCwgYXBwSWR9KSA9PiB7XG4gICAgICBpZiAoYXdhaXQgaGVscGVycy5pc1dyaXRlYWJsZShhcHBQYXRoKSkge1xuICAgICAgICByZXR1cm4geyBhcHBQYXRoLCBhcHBJZCB9O1xuICAgICAgfVxuXG4gICAgICBsb2cuaW5mbyhgU2VydmVyIHBhY2thZ2UgYXQgJyR7YXBwUGF0aH0nIGlzIG5vdCB3cml0ZWFibGUuIGAgK1xuICAgICAgICBgV2lsbCBjb3B5IGl0IGludG8gdGhlIHRlbXBvcmFyeSBsb2NhdGlvbiBhdCAnJHt0bXBSb290fScgYXMgYSB3b3JrYXJvdW5kLiBgICtcbiAgICAgICAgYENvbnNpZGVyIG1ha2luZyB0aGlzIGZpbGUgd3JpdGVhYmxlIG1hbnVhbGx5IGluIG9yZGVyIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHNlc3Npb24gc3RhcnR1cC5gKTtcbiAgICAgIGNvbnN0IGRzdFBhdGggPSBwYXRoLnJlc29sdmUodG1wUm9vdCwgcGF0aC5iYXNlbmFtZShhcHBQYXRoKSk7XG4gICAgICBhd2FpdCBmcy5jb3B5RmlsZShhcHBQYXRoLCBkc3RQYXRoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFwcFBhdGg6IGRzdFBhdGgsXG4gICAgICAgIGFwcElkLFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VzSW5mbyA9IGF3YWl0IEIuYWxsKEIubWFwKFtcbiAgICAgICAge1xuICAgICAgICAgIGFwcFBhdGg6IGFwa1BhdGgsXG4gICAgICAgICAgYXBwSWQ6IFNFUlZFUl9QQUNLQUdFX0lELFxuICAgICAgICB9LCB7XG4gICAgICAgICAgYXBwUGF0aDogdGVzdEFwa1BhdGgsXG4gICAgICAgICAgYXBwSWQ6IFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQsXG4gICAgICAgIH0sXG4gICAgICBdLCBwYWNrYWdlSW5mb3NNYXBwZXIpKTtcblxuICAgICAgbGV0IHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzID0gZmFsc2U7XG4gICAgICBsZXQgc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IHthcHBJZCwgYXBwUGF0aH0gb2YgcGFja2FnZXNJbmZvKSB7XG4gICAgICAgIGlmIChhcHBJZCA9PT0gU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCkge1xuICAgICAgICAgIGNvbnN0IGlzQXBwSW5zdGFsbGVkID0gYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQoYXBwSWQpO1xuXG4gICAgICAgICAgLy8gVGhlcmUgaXMgbm8gcG9pbnQgaW4gZ2V0dGluZyB0aGUgc3RhdGUgZm9yIHRlc3Qgc2VydmVyLFxuICAgICAgICAgIC8vIHNpbmNlIGl0IGRvZXMgbm90IGNvbnRhaW4gdmVyc2lvbiBpbmZvXG4gICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQoYXBwUGF0aCwgYXBwSWQpKSB7XG4gICAgICAgICAgICBhd2FpdCBoZWxwZXJzLnNpZ25BcHAodGhpcy5hZGIsIGFwcFBhdGgpO1xuICAgICAgICAgICAgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCBpc0FwcEluc3RhbGxlZDtcbiAgICAgICAgICAgIHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFpc0FwcEluc3RhbGxlZCkge1xuICAgICAgICAgICAgc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcHBTdGF0ZSA9IGF3YWl0IHRoaXMuYWRiLmdldEFwcGxpY2F0aW9uSW5zdGFsbFN0YXRlKGFwcFBhdGgsIGFwcElkKTtcbiAgICAgICAgbG9nLmRlYnVnKGAke2FwcElkfSBpbnN0YWxsYXRpb24gc3RhdGU6ICR7YXBwU3RhdGV9YCk7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQoYXBwUGF0aCwgYXBwSWQpKSB7XG4gICAgICAgICAgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCBbXG4gICAgICAgICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5PTERFUl9WRVJTSU9OX0lOU1RBTExFRCxcbiAgICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5FV0VSX1ZFUlNJT05fSU5TVEFMTEVELFxuICAgICAgICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGhlbHBlcnMuc2lnbkFwcCh0aGlzLmFkYiwgYXBwUGF0aCk7XG4gICAgICAgICAgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCAhW1xuICAgICAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRCxcbiAgICAgICAgICBdLmluY2x1ZGVzKGFwcFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgW1xuICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQsXG4gICAgICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYFNlcnZlciBwYWNrYWdlcyBhcmUgJHtzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPyAnJyA6ICdub3QgJ31nb2luZyB0byBiZSAocmUpaW5zdGFsbGVkYCk7XG4gICAgICBpZiAoc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzICYmIHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzKSB7XG4gICAgICAgIGxvZy5pbmZvKCdGdWxsIHBhY2thZ2VzIHJlaW5zdGFsbCBpcyBnb2luZyB0byBiZSBwZXJmb3JtZWQnKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qge2FwcElkLCBhcHBQYXRofSBvZiBwYWNrYWdlc0luZm8pIHtcbiAgICAgICAgaWYgKHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayhhcHBJZCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2cud2FybihgRXJyb3IgdW5pbnN0YWxsaW5nICcke2FwcElkfSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5pbnN0YWxsKGFwcFBhdGgsIHtcbiAgICAgICAgICAgIG5vSW5jcmVtZW50YWw6IHRydWUsXG4gICAgICAgICAgICByZXBsYWNlOiB0cnVlLFxuICAgICAgICAgICAgdGltZW91dDogaW5zdGFsbFRpbWVvdXQsXG4gICAgICAgICAgICB0aW1lb3V0Q2FwTmFtZTogJ3VpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnZlcmlmeVNlcnZpY2VzQXZhaWxhYmlsaXR5KCk7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlTZXJ2aWNlc0F2YWlsYWJpbGl0eSAoKSB7XG4gICAgbG9nLmRlYnVnKGBXYWl0aW5nIHVwIHRvICR7U0VSVklDRVNfTEFVTkNIX1RJTUVPVVR9bXMgZm9yIHNlcnZpY2VzIHRvIGJlIGF2YWlsYWJsZWApO1xuICAgIGxldCBpc1BtU2VydmljZUF2YWlsYWJsZSA9IGZhbHNlO1xuICAgIGxldCBwbU91dHB1dCA9ICcnO1xuICAgIGxldCBwbUVycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghaXNQbVNlcnZpY2VBdmFpbGFibGUpIHtcbiAgICAgICAgICBwbUVycm9yID0gbnVsbDtcbiAgICAgICAgICBwbU91dHB1dCA9ICcnO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwbU91dHB1dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdpbnN0cnVtZW50YXRpb24nXSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcG1FcnJvciA9IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwbU91dHB1dC5pbmNsdWRlcygnQ291bGQgbm90IGFjY2VzcyB0aGUgUGFja2FnZSBNYW5hZ2VyJykpIHtcbiAgICAgICAgICAgIHBtRXJyb3IgPSBuZXcgRXJyb3IoYFByb2JsZW0gcnVubmluZyBQYWNrYWdlIE1hbmFnZXI6ICR7cG1PdXRwdXR9YCk7XG4gICAgICAgICAgICBwbU91dHB1dCA9ICcnOyAvLyByZW1vdmUgb3V0cHV0LCBzbyBpdCBpcyBub3QgcHJpbnRlZCBiZWxvd1xuICAgICAgICAgIH0gZWxzZSBpZiAocG1PdXRwdXQuaW5jbHVkZXMoSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCkpIHtcbiAgICAgICAgICAgIHBtT3V0cHV0ID0gJyc7IC8vIHJlbW92ZSBvdXRwdXQsIHNvIGl0IGlzIG5vdCBwcmludGVkIGJlbG93XG4gICAgICAgICAgICBsb2cuZGVidWcoYEluc3RydW1lbnRhdGlvbiB0YXJnZXQgJyR7SU5TVFJVTUVOVEFUSU9OX1RBUkdFVH0nIGlzIGF2YWlsYWJsZWApO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXNcbiAgICAgICAgICAgIGlzUG1TZXJ2aWNlQXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFwbUVycm9yKSB7XG4gICAgICAgICAgICBwbUVycm9yID0gbmV3IEVycm9yKCdUaGUgaW5zdHJ1bWVudGF0aW9uIHRhcmdldCBpcyBub3QgbGlzdGVkIGJ5IFBhY2thZ2UgTWFuYWdlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNQbVNlcnZpY2VBdmFpbGFibGU7XG4gICAgICB9LCB7XG4gICAgICAgIHdhaXRNczogU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQsXG4gICAgICAgIGludGVydmFsTXM6IDEwMDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvcihgVW5hYmxlIHRvIGZpbmQgaW5zdHJ1bWVudGF0aW9uIHRhcmdldCAnJHtJTlNUUlVNRU5UQVRJT05fVEFSR0VUfSc6ICR7KHBtRXJyb3IgfHwge30pLm1lc3NhZ2V9YCk7XG4gICAgICBpZiAocG1PdXRwdXQpIHtcbiAgICAgICAgbG9nLmRlYnVnKCdBdmFpbGFibGUgdGFyZ2V0czonKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHBtT3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgICAgICR7bGluZS5yZXBsYWNlKCdpbnN0cnVtZW50YXRpb246JywgJycpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXNzaW9uIChjYXBzKSB7XG4gICAgYXdhaXQgdGhpcy5jbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycygpO1xuICAgIGlmIChjYXBzLnNraXBTZXJ2ZXJJbnN0YWxsYXRpb24pIHtcbiAgICAgIGxvZy5pbmZvKGAnc2tpcFNlcnZlckluc3RhbGxhdGlvbicgaXMgc2V0LiBBdHRlbXB0aW5nIHRvIHVzZSBVSUF1dG9tYXRvcjIgc2VydmVyIGZyb20gdGhlIGRldmljZWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbyhgU3RhcnRpbmcgVUlBdXRvbWF0b3IyIHNlcnZlciAke3NlcnZlclZlcnNpb259YCk7XG4gICAgICBsb2cuaW5mbyhgVXNpbmcgVUlBdXRvbWF0b3IyIHNlcnZlciBmcm9tICcke2Fwa1BhdGh9JyBhbmQgdGVzdCBmcm9tICcke3Rlc3RBcGtQYXRofSdgKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lb3V0ID0gY2Fwcy51aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0IHx8IFNFUlZFUl9MQVVOQ0hfVElNRU9VVDtcbiAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgIGxldCByZXRyaWVzID0gMDtcbiAgICBjb25zdCBtYXhSZXRyaWVzID0gMjtcbiAgICBjb25zdCBkZWxheUJldHdlZW5SZXRyaWVzID0gMzAwMDtcbiAgICB3aGlsZSAocmV0cmllcyA8IG1heFJldHJpZXMpIHtcbiAgICAgIGxvZy5pbmZvKGBXYWl0aW5nIHVwIHRvICR7dGltZW91dH1tcyBmb3IgVWlBdXRvbWF0b3IyIHRvIGJlIG9ubGluZS4uLmApO1xuICAgICAgdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQgPSBmYWxzZTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzKCk7XG4gICAgICBpZiAoIXRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gc2hvcnQgY2lyY3VpdCB0byByZXRyeSBvciBmYWlsIGZhc3RcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHdhaXRNczogdGltZW91dCxcbiAgICAgICAgICAgIGludGVydmFsTXM6IDEwMDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgY2Fubm90IGJlIGluaXRpYWxpemVkIHdpdGhpbiAke3RpbWVvdXR9bXMgdGltZW91dC4gYFxuICAgICAgICAgICAgKyAnTWFrZSBzdXJlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGRvZXMgbm90IGNyYXNoIGFuZCBpbnZlc3RpZ2F0ZSB0aGUgbG9nY2F0IG91dHB1dC4gJ1xuICAgICAgICAgICAgKyBgWW91IGNvdWxkIGFsc28gdHJ5IHRvIGluY3JlYXNlIHRoZSB2YWx1ZSBvZiAndWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCcgY2FwYWJpbGl0eWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXRyaWVzKys7XG4gICAgICBpZiAocmV0cmllcyA+PSBtYXhSZXRyaWVzKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KCdUaGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgY2Fubm90IGJlIGluaXRpYWxpemVkLiAnXG4gICAgICAgICAgKyAnTWFrZSBzdXJlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGRvZXMgbm90IGNyYXNoIGFuZCBpbnZlc3RpZ2F0ZSB0aGUgbG9nY2F0IG91dHB1dC4nKTtcbiAgICAgIH1cbiAgICAgIGxvZy53YXJuKGBUaGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgaGFzIGJlZW4gdW5leHBlY3RlZGx5IHRlcm1pbmF0ZWQuIGBcbiAgICAgICAgKyBgUmV0cnlpbmcgVWlBdXRvbWF0b3IyIHN0YXJ0dXAgKCMke3JldHJpZXN9IG9mICR7bWF4UmV0cmllcyAtIDF9KWApO1xuICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyh0cnVlKTtcbiAgICAgIGF3YWl0IEIuZGVsYXkoZGVsYXlCZXR3ZWVuUmV0cmllcyk7XG4gICAgfVxuXG4gICAgbG9nLmRlYnVnKGBUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIHRvb2sgYFxuICAgICAgKyBgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3Nlc3Npb24nLCAnUE9TVCcsIHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICBmaXJzdE1hdGNoOiBbY2Fwc10sXG4gICAgICAgIGFsd2F5c01hdGNoOiB7fSxcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcyAoKSB7XG4gICAgY29uc3QgY21kID0gWydhbScsICdpbnN0cnVtZW50JywgJy13J107XG4gICAgaWYgKHRoaXMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbikge1xuICAgICAgY21kLnB1c2goJy0tbm8td2luZG93LWFuaW1hdGlvbicpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Jvb2xlYW4odGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSkpIHtcbiAgICAgIGNtZC5wdXNoKCctZScsICdESVNBQkxFX1NVUFBSRVNTX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMnLCB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlKTtcbiAgICB9XG4gICAgLy8gRGlzYWJsZSBHb29nbGUgYW5hbHl0aWNzIHRvIHByZXZlbnQgcG9zc2libGUgZmF0YWwgZXhjZXB0aW9uXG4gICAgY21kLnB1c2goJy1lJywgJ2Rpc2FibGVBbmFseXRpY3MnLCB0cnVlKTtcbiAgICBjbWQucHVzaChJTlNUUlVNRU5UQVRJT05fVEFSR0VUKTtcbiAgICBjb25zdCBpbnN0cnVtZW50YXRpb25Qcm9jZXNzID0gdGhpcy5hZGIuY3JlYXRlU3ViUHJvY2VzcyhbJ3NoZWxsJywgLi4uY21kXSk7XG4gICAgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBfLnRyaW0oc3Rkb3V0IHx8IHN0ZGVycik7XG4gICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgIGluc3RydW1lbnRhdGlvbkxvZ2dlci5kZWJ1ZyhvdXRwdXQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGluc3RydW1lbnRhdGlvblByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyLmRlYnVnKGBUaGUgcHJvY2VzcyBoYXMgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCk7XG4gICAgICB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCA9IHRydWU7XG4gICAgfSk7XG4gICAgYXdhaXQgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5zdGFydCgwKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIGxvZy5kZWJ1ZygnRGVsZXRpbmcgVWlBdXRvbWF0b3IyIHNlcnZlciBzZXNzaW9uJyk7XG4gICAgLy8gcmVseSBvbiBqd3Byb3h5J3MgaW50ZWxsaWdlbmNlIHRvIGtub3cgd2hhdCB3ZSdyZSB0YWxraW5nIGFib3V0IGFuZFxuICAgIC8vIGRlbGV0ZSB0aGUgY3VycmVudCBzZXNzaW9uXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvJywgJ0RFTEVURScpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oYERpZCBub3QgZ2V0IGNvbmZpcm1hdGlvbiBVaUF1dG9tYXRvcjIgZGVsZXRlU2Vzc2lvbiB3b3JrZWQ7IGAgK1xuICAgICAgICAgIGBFcnJvciB3YXM6ICR7ZXJyfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzIChzdHJpY3RDbGVhbnVwID0gZmFsc2UpIHtcbiAgICBsb2cuZGVidWcoYFBlcmZvcm1pbmcgJHtzdHJpY3RDbGVhbnVwID8gJ3N0cmljdCcgOiAnc2hhbGxvdyd9IGNsZWFudXAgb2YgYXV0b21hdGlvbiBsZWZ0b3ZlcnNgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7dmFsdWV9ID0gKGF3YWl0IGF4aW9zKHtcbiAgICAgICAgdXJsOiBgaHR0cDovLyR7dGhpcy5ob3N0fToke3RoaXMuc3lzdGVtUG9ydH0vd2QvaHViL3Nlc3Npb25zYCxcbiAgICAgICAgdGltZW91dDogNTAwLFxuICAgICAgfSkpLmRhdGE7XG4gICAgICBjb25zdCBhY3RpdmVTZXNzaW9uSWRzID0gdmFsdWUubWFwKChzZXNzKSA9PiBzZXNzLmlkKTtcbiAgICAgIGlmIChhY3RpdmVTZXNzaW9uSWRzLmxlbmd0aCkge1xuICAgICAgICBsb2cuZGVidWcoYFRoZSBmb2xsb3dpbmcgb2Jzb2xldGUgc2Vzc2lvbnMgYXJlIHN0aWxsIHJ1bm5pbmc6ICR7SlNPTi5zdHJpbmdpZnkoYWN0aXZlU2Vzc2lvbklkcyl9YCk7XG4gICAgICAgIGxvZy5kZWJ1ZygnQ2xlYW5pbmcgdXAgdGhlIG9ic29sZXRlIHNlc3Npb25zJyk7XG4gICAgICAgIGF3YWl0IEIuYWxsKGFjdGl2ZVNlc3Npb25JZHMubWFwKChpZCkgPT5cbiAgICAgICAgICBheGlvcy5kZWxldGUoYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3dkL2h1Yi9zZXNzaW9uLyR7aWR9YClcbiAgICAgICAgKSk7XG4gICAgICAgIC8vIExldCBhbGwgc2Vzc2lvbnMgdG8gYmUgcHJvcGVybHkgdGVybWluYXRlZCBiZWZvcmUgY29udGludWluZ1xuICAgICAgICBhd2FpdCBCLmRlbGF5KDEwMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmRlYnVnKCdObyBvYnNvbGV0ZSBzZXNzaW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoYE5vIG9ic29sZXRlIHNlc3Npb25zIGhhdmUgYmVlbiBkZXRlY3RlZCAoJHtlLm1lc3NhZ2V9KWApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AoU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCk7XG4gICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICAgIGlmICghc3RyaWN0Q2xlYW51cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTA3NDlcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIua2lsbFByb2Nlc3Nlc0J5TmFtZSgndWlhdXRvbWF0b3InKTtcbiAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gIH1cbn1cblxuZXhwb3J0IHsgVWlBdXRvbWF0b3IyU2VydmVyLCBJTlNUUlVNRU5UQVRJT05fVEFSR0VULCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCB9O1xuZXhwb3J0IGRlZmF1bHQgVWlBdXRvbWF0b3IyU2VydmVyO1xuIl0sImZpbGUiOiJsaWIvdWlhdXRvbWF0b3IyLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
390
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91aWF1dG9tYXRvcjIuanMiXSwibmFtZXMiOlsiUkVRRF9QQVJBTVMiLCJTRVJWRVJfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfSU5TVEFMTF9SRVRSSUVTIiwiU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJJTlNUUlVNRU5UQVRJT05fVEFSR0VUIiwiaW5zdHJ1bWVudGF0aW9uTG9nZ2VyIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiVUlBMlByb3h5IiwiSldQcm94eSIsInByb3h5Q29tbWFuZCIsInVybCIsIm1ldGhvZCIsImJvZHkiLCJkaWRJbnN0cnVtZW50YXRpb25FeGl0IiwiZXJyb3JzIiwiSW52YWxpZENvbnRleHRFcnJvciIsIlVpQXV0b21hdG9yMlNlcnZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInJlcSIsInV0aWwiLCJoYXNWYWx1ZSIsIkVycm9yIiwiZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UiLCJwcm94eU9wdHMiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInN5c3RlbVBvcnQiLCJrZWVwQWxpdmUiLCJyZWFkVGltZW91dCIsInRpbWVvdXQiLCJqd3Byb3h5IiwicHJveHlSZXFSZXMiLCJiaW5kIiwiaW5zdGFsbFNlcnZlckFwayIsImluc3RhbGxUaW1lb3V0IiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwicGFja2FnZUluZm9zTWFwcGVyIiwiYXBwUGF0aCIsImFwcElkIiwiaGVscGVycyIsImlzV3JpdGVhYmxlIiwibG9nIiwiaW5mbyIsImRzdFBhdGgiLCJwYXRoIiwicmVzb2x2ZSIsImJhc2VuYW1lIiwiZnMiLCJjb3B5RmlsZSIsInBhY2thZ2VzSW5mbyIsIkIiLCJhbGwiLCJtYXAiLCJhcGtQYXRoIiwidGVzdEFwa1BhdGgiLCJzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyIsInNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyIsImlzQXBwSW5zdGFsbGVkIiwiYWRiIiwiY2hlY2tBcGtDZXJ0Iiwic2lnbkFwcCIsImFwcFN0YXRlIiwiZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUiLCJkZWJ1ZyIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQiLCJORVdFUl9WRVJTSU9OX0lOU1RBTExFRCIsImluY2x1ZGVzIiwiTk9UX0lOU1RBTExFRCIsInVuaW5zdGFsbEFwayIsImVyciIsIndhcm4iLCJtZXNzYWdlIiwiaW5zdGFsbCIsIm5vSW5jcmVtZW50YWwiLCJyZXBsYWNlIiwidGltZW91dENhcE5hbWUiLCJyaW1yYWYiLCJ2ZXJpZnlTZXJ2aWNlc0F2YWlsYWJpbGl0eSIsImlzUG1TZXJ2aWNlQXZhaWxhYmxlIiwicG1PdXRwdXQiLCJwbUVycm9yIiwic2hlbGwiLCJlIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImVycm9yIiwibGluZSIsInNwbGl0Iiwic3RhcnRTZXNzaW9uIiwiY2FwcyIsImNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsInNlcnZlclZlcnNpb24iLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0IiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwicmV0cmllcyIsIm1heFJldHJpZXMiLCJkZWxheUJldHdlZW5SZXRyaWVzIiwic3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzIiwiY29tbWFuZCIsImVycm9yQW5kVGhyb3ciLCJkZWxheSIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwiY2FwYWJpbGl0aWVzIiwiZmlyc3RNYXRjaCIsImFsd2F5c01hdGNoIiwiY21kIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsInB1c2giLCJfIiwiaXNCb29sZWFuIiwiaW5zdHJ1bWVudGF0aW9uUHJvY2VzcyIsImNyZWF0ZVN1YlByb2Nlc3MiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsIm91dHB1dCIsInRyaW0iLCJjb2RlIiwiZGVsZXRlU2Vzc2lvbiIsInN0cmljdENsZWFudXAiLCJ2YWx1ZSIsImRhdGEiLCJhY3RpdmVTZXNzaW9uSWRzIiwiaWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwibGVuZ3RoIiwiSlNPTiIsInN0cmluZ2lmeSIsInBsdXJhbGl6ZSIsImF4aW9zIiwiZGVsZXRlIiwiZm9yY2VTdG9wIiwiaWdub3JlIiwia2lsbFByb2Nlc3Nlc0J5TmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxXQUFXLEdBQUcsQ0FBQyxLQUFELEVBQVEsUUFBUixFQUFrQixNQUFsQixFQUEwQixZQUExQixFQUF3QyxZQUF4QyxFQUFzRCx3QkFBdEQsQ0FBcEI7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxLQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLEVBQS9CO0FBQ0EsTUFBTUMsdUJBQXVCLEdBQUcsS0FBaEM7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRywrQkFBMUI7O0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUksR0FBRUQsaUJBQWtCLE9BQXBEOztBQUNBLE1BQU1FLHNCQUFzQixHQUFJLEdBQUVELHNCQUF1QiwwQ0FBekQ7OztBQUNBLE1BQU1FLHFCQUFxQixHQUFHQyxzQkFBT0MsU0FBUCxDQUFpQixpQkFBakIsQ0FBOUI7O0FBRUEsTUFBTUMsU0FBTixTQUF3QkMseUJBQXhCLENBQWdDO0FBQ1osUUFBWkMsWUFBWSxDQUFFQyxHQUFGLEVBQU9DLE1BQVAsRUFBZUMsSUFBSSxHQUFHLElBQXRCLEVBQTRCO0FBQzVDLFFBQUksS0FBS0Msc0JBQVQsRUFBaUM7QUFDL0IsWUFBTSxJQUFJQyx5QkFBT0MsbUJBQVgsQ0FDSCxJQUFHSixNQUFPLElBQUdELEdBQUkscURBQWxCLEdBQ0EsaUVBREEsR0FFQSxnRUFISSxDQUFOO0FBSUQ7O0FBQ0Qs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OFNWaEksa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSldQcm94eSwgZXJyb3JzIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7XG4gIFNFUlZFUl9BUEtfUEFUSCBhcyBhcGtQYXRoLFxuICBURVNUX0FQS19QQVRIIGFzIHRlc3RBcGtQYXRoLFxuICB2ZXJzaW9uIGFzIHNlcnZlclZlcnNpb25cbn0gZnJvbSAnYXBwaXVtLXVpYXV0b21hdG9yMi1zZXJ2ZXInO1xuaW1wb3J0IHtcbiAgdXRpbCwgbG9nZ2VyLCB0ZW1wRGlyLCBmcywgdGltaW5nXG59IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBoZWxwZXJzIGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmNvbnN0IFJFUURfUEFSQU1TID0gWydhZGInLCAndG1wRGlyJywgJ2hvc3QnLCAnc3lzdGVtUG9ydCcsICdkZXZpY2VQb3J0JywgJ2Rpc2FibGVXaW5kb3dBbmltYXRpb24nXTtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVCA9IDMwMDAwO1xuY29uc3QgU0VSVkVSX0lOU1RBTExfUkVUUklFUyA9IDIwO1xuY29uc3QgU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQgPSAzMDAwMDtcbmNvbnN0IFNFUlZFUl9QQUNLQUdFX0lEID0gJ2lvLmFwcGl1bS51aWF1dG9tYXRvcjIuc2VydmVyJztcbmNvbnN0IFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQgPSBgJHtTRVJWRVJfUEFDS0FHRV9JRH0udGVzdGA7XG5jb25zdCBJTlNUUlVNRU5UQVRJT05fVEFSR0VUID0gYCR7U0VSVkVSX1RFU1RfUEFDS0FHRV9JRH0vYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyYDtcbmNvbnN0IGluc3RydW1lbnRhdGlvbkxvZ2dlciA9IGxvZ2dlci5nZXRMb2dnZXIoJ0luc3RydW1lbnRhdGlvbicpO1xuXG5jbGFzcyBVSUEyUHJveHkgZXh0ZW5kcyBKV1Byb3h5IHtcbiAgYXN5bmMgcHJveHlDb21tYW5kICh1cmwsIG1ldGhvZCwgYm9keSA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRDb250ZXh0RXJyb3IoXG4gICAgICAgIGAnJHttZXRob2R9ICR7dXJsfScgY2Fubm90IGJlIHByb3hpZWQgdG8gVWlBdXRvbWF0b3IyIHNlcnZlciBiZWNhdXNlIGAgK1xuICAgICAgICAndGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGlzIG5vdCBydW5uaW5nIChwcm9iYWJseSBjcmFzaGVkKS4gJyArXG4gICAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBhbmQvb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlscycpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIucHJveHlDb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxufVxuXG5jbGFzcyBVaUF1dG9tYXRvcjJTZXJ2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgZm9yIChsZXQgcmVxIG9mIFJFUURfUEFSQU1TKSB7XG4gICAgICBpZiAoIW9wdHMgfHwgIXV0aWwuaGFzVmFsdWUob3B0c1tyZXFdKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wdGlvbiAnJHtyZXF9JyBpcyByZXF1aXJlZCFgKTtcbiAgICAgIH1cbiAgICAgIHRoaXNbcmVxXSA9IG9wdHNbcmVxXTtcbiAgICB9XG4gICAgdGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSA9IG9wdHMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2U7XG4gICAgY29uc3QgcHJveHlPcHRzID0ge1xuICAgICAgc2VydmVyOiB0aGlzLmhvc3QsXG4gICAgICBwb3J0OiB0aGlzLnN5c3RlbVBvcnQsXG4gICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgfTtcbiAgICBpZiAob3B0cy5yZWFkVGltZW91dCAmJiBvcHRzLnJlYWRUaW1lb3V0ID4gMCkge1xuICAgICAgcHJveHlPcHRzLnRpbWVvdXQgPSBvcHRzLnJlYWRUaW1lb3V0O1xuICAgIH1cbiAgICB0aGlzLmp3cHJveHkgPSBuZXcgVUlBMlByb3h5KHByb3h5T3B0cyk7XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuandwcm94eS5wcm94eVJlcVJlcy5iaW5kKHRoaXMuandwcm94eSk7XG4gICAgdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxscyB0aGUgYXBrcyBvbiB0byB0aGUgZGV2aWNlIG9yIGVtdWxhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5zdGFsbFRpbWVvdXQgLSBJbnN0YWxsYXRpb24gdGltZW91dFxuICAgKi9cbiAgYXN5bmMgaW5zdGFsbFNlcnZlckFwayAoaW5zdGFsbFRpbWVvdXQgPSBTRVJWRVJfSU5TVEFMTF9SRVRSSUVTICogMTAwMCkge1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBjb25zdCBwYWNrYWdlSW5mb3NNYXBwZXIgPSBhc3luYyAoe2FwcFBhdGgsIGFwcElkfSkgPT4ge1xuICAgICAgaWYgKGF3YWl0IGhlbHBlcnMuaXNXcml0ZWFibGUoYXBwUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHsgYXBwUGF0aCwgYXBwSWQgfTtcbiAgICAgIH1cblxuICAgICAgbG9nLmluZm8oYFNlcnZlciBwYWNrYWdlIGF0ICcke2FwcFBhdGh9JyBpcyBub3Qgd3JpdGVhYmxlLiBgICtcbiAgICAgICAgYFdpbGwgY29weSBpdCBpbnRvIHRoZSB0ZW1wb3JhcnkgbG9jYXRpb24gYXQgJyR7dG1wUm9vdH0nIGFzIGEgd29ya2Fyb3VuZC4gYCArXG4gICAgICAgIGBDb25zaWRlciBtYWtpbmcgdGhpcyBmaWxlIHdyaXRlYWJsZSBtYW51YWxseSBpbiBvcmRlciB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiBzZXNzaW9uIHN0YXJ0dXAuYCk7XG4gICAgICBjb25zdCBkc3RQYXRoID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsIHBhdGguYmFzZW5hbWUoYXBwUGF0aCkpO1xuICAgICAgYXdhaXQgZnMuY29weUZpbGUoYXBwUGF0aCwgZHN0UGF0aCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcHBQYXRoOiBkc3RQYXRoLFxuICAgICAgICBhcHBJZCxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYWNrYWdlc0luZm8gPSBhd2FpdCBCLmFsbChCLm1hcChbXG4gICAgICAgIHtcbiAgICAgICAgICBhcHBQYXRoOiBhcGtQYXRoLFxuICAgICAgICAgIGFwcElkOiBTRVJWRVJfUEFDS0FHRV9JRCxcbiAgICAgICAgfSwge1xuICAgICAgICAgIGFwcFBhdGg6IHRlc3RBcGtQYXRoLFxuICAgICAgICAgIGFwcElkOiBTRVJWRVJfVEVTVF9QQUNLQUdFX0lELFxuICAgICAgICB9LFxuICAgICAgXSwgcGFja2FnZUluZm9zTWFwcGVyKSk7XG5cbiAgICAgIGxldCBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IGZhbHNlO1xuICAgICAgbGV0IHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCB7YXBwSWQsIGFwcFBhdGh9IG9mIHBhY2thZ2VzSW5mbykge1xuICAgICAgICBpZiAoYXBwSWQgPT09IFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQpIHtcbiAgICAgICAgICBjb25zdCBpc0FwcEluc3RhbGxlZCA9IGF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKGFwcElkKTtcblxuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHBvaW50IGluIGdldHRpbmcgdGhlIHN0YXRlIGZvciB0ZXN0IHNlcnZlcixcbiAgICAgICAgICAvLyBzaW5jZSBpdCBkb2VzIG5vdCBjb250YWluIHZlcnNpb24gaW5mb1xuICAgICAgICAgIGlmICghYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KGFwcFBhdGgsIGFwcElkKSkge1xuICAgICAgICAgICAgYXdhaXQgaGVscGVycy5zaWduQXBwKHRoaXMuYWRiLCBhcHBQYXRoKTtcbiAgICAgICAgICAgIHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzID0gc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgaXNBcHBJbnN0YWxsZWQ7XG4gICAgICAgICAgICBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghaXNBcHBJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgIHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXBwU3RhdGUgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcHBsaWNhdGlvbkluc3RhbGxTdGF0ZShhcHBQYXRoLCBhcHBJZCk7XG4gICAgICAgIGxvZy5kZWJ1ZyhgJHthcHBJZH0gaW5zdGFsbGF0aW9uIHN0YXRlOiAke2FwcFN0YXRlfWApO1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KGFwcFBhdGgsIGFwcElkKSkge1xuICAgICAgICAgIHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzID0gc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgW1xuICAgICAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQsXG4gICAgICAgICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5ORVdFUl9WRVJTSU9OX0lOU1RBTExFRCxcbiAgICAgICAgICBdLmluY2x1ZGVzKGFwcFN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBoZWxwZXJzLnNpZ25BcHAodGhpcy5hZGIsIGFwcFBhdGgpO1xuICAgICAgICAgIHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzID0gc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgIVtcbiAgICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQsXG4gICAgICAgICAgXS5pbmNsdWRlcyhhcHBTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzID0gc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzIHx8IHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzIHx8IFtcbiAgICAgICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5OT1RfSU5TVEFMTEVELFxuICAgICAgICBdLmluY2x1ZGVzKGFwcFN0YXRlKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGBTZXJ2ZXIgcGFja2FnZXMgYXJlICR7c2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzID8gJycgOiAnbm90ICd9Z29pbmcgdG8gYmUgKHJlKWluc3RhbGxlZGApO1xuICAgICAgaWYgKHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyAmJiBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcykge1xuICAgICAgICBsb2cuaW5mbygnRnVsbCBwYWNrYWdlcyByZWluc3RhbGwgaXMgZ29pbmcgdG8gYmUgcGVyZm9ybWVkJyk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHthcHBJZCwgYXBwUGF0aH0gb2YgcGFja2FnZXNJbmZvKSB7XG4gICAgICAgIGlmIChzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsoYXBwSWQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nLndhcm4oYEVycm9yIHVuaW5zdGFsbGluZyAnJHthcHBJZH0nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIuaW5zdGFsbChhcHBQYXRoLCB7XG4gICAgICAgICAgICBub0luY3JlbWVudGFsOiB0cnVlLFxuICAgICAgICAgICAgcmVwbGFjZTogdHJ1ZSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IGluc3RhbGxUaW1lb3V0LFxuICAgICAgICAgICAgdGltZW91dENhcE5hbWU6ICd1aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy52ZXJpZnlTZXJ2aWNlc0F2YWlsYWJpbGl0eSgpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5U2VydmljZXNBdmFpbGFiaWxpdHkgKCkge1xuICAgIGxvZy5kZWJ1ZyhgV2FpdGluZyB1cCB0byAke1NFUlZJQ0VTX0xBVU5DSF9USU1FT1VUfW1zIGZvciBzZXJ2aWNlcyB0byBiZSBhdmFpbGFibGVgKTtcbiAgICBsZXQgaXNQbVNlcnZpY2VBdmFpbGFibGUgPSBmYWxzZTtcbiAgICBsZXQgcG1PdXRwdXQgPSAnJztcbiAgICBsZXQgcG1FcnJvciA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIWlzUG1TZXJ2aWNlQXZhaWxhYmxlKSB7XG4gICAgICAgICAgcG1FcnJvciA9IG51bGw7XG4gICAgICAgICAgcG1PdXRwdXQgPSAnJztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcG1PdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ3BtJywgJ2xpc3QnLCAnaW5zdHJ1bWVudGF0aW9uJ10pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHBtRXJyb3IgPSBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocG1PdXRwdXQuaW5jbHVkZXMoJ0NvdWxkIG5vdCBhY2Nlc3MgdGhlIFBhY2thZ2UgTWFuYWdlcicpKSB7XG4gICAgICAgICAgICBwbUVycm9yID0gbmV3IEVycm9yKGBQcm9ibGVtIHJ1bm5pbmcgUGFja2FnZSBNYW5hZ2VyOiAke3BtT3V0cHV0fWApO1xuICAgICAgICAgICAgcG1PdXRwdXQgPSAnJzsgLy8gcmVtb3ZlIG91dHB1dCwgc28gaXQgaXMgbm90IHByaW50ZWQgYmVsb3dcbiAgICAgICAgICB9IGVsc2UgaWYgKHBtT3V0cHV0LmluY2x1ZGVzKElOU1RSVU1FTlRBVElPTl9UQVJHRVQpKSB7XG4gICAgICAgICAgICBwbU91dHB1dCA9ICcnOyAvLyByZW1vdmUgb3V0cHV0LCBzbyBpdCBpcyBub3QgcHJpbnRlZCBiZWxvd1xuICAgICAgICAgICAgbG9nLmRlYnVnKGBJbnN0cnVtZW50YXRpb24gdGFyZ2V0ICcke0lOU1RSVU1FTlRBVElPTl9UQVJHRVR9JyBpcyBhdmFpbGFibGVgKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzXG4gICAgICAgICAgICBpc1BtU2VydmljZUF2YWlsYWJsZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICghcG1FcnJvcikge1xuICAgICAgICAgICAgcG1FcnJvciA9IG5ldyBFcnJvcignVGhlIGluc3RydW1lbnRhdGlvbiB0YXJnZXQgaXMgbm90IGxpc3RlZCBieSBQYWNrYWdlIE1hbmFnZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzUG1TZXJ2aWNlQXZhaWxhYmxlO1xuICAgICAgfSwge1xuICAgICAgICB3YWl0TXM6IFNFUlZJQ0VTX0xBVU5DSF9USU1FT1VULFxuICAgICAgICBpbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cuZXJyb3IoYFVuYWJsZSB0byBmaW5kIGluc3RydW1lbnRhdGlvbiB0YXJnZXQgJyR7SU5TVFJVTUVOVEFUSU9OX1RBUkdFVH0nOiAkeyhwbUVycm9yIHx8IHt9KS5tZXNzYWdlfWApO1xuICAgICAgaWYgKHBtT3V0cHV0KSB7XG4gICAgICAgIGxvZy5kZWJ1ZygnQXZhaWxhYmxlIHRhcmdldHM6Jyk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBwbU91dHB1dC5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgICBsb2cuZGVidWcoYCAgICAke2xpbmUucmVwbGFjZSgnaW5zdHJ1bWVudGF0aW9uOicsICcnKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0U2Vzc2lvbiAoY2Fwcykge1xuICAgIGF3YWl0IHRoaXMuY2xlYW51cEF1dG9tYXRpb25MZWZ0b3ZlcnMoKTtcbiAgICBpZiAoY2Fwcy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICBsb2cuaW5mbyhgJ3NraXBTZXJ2ZXJJbnN0YWxsYXRpb24nIGlzIHNldC4gQXR0ZW1wdGluZyB0byB1c2UgVUlBdXRvbWF0b3IyIHNlcnZlciBmcm9tIHRoZSBkZXZpY2VgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmluZm8oYFN0YXJ0aW5nIFVJQXV0b21hdG9yMiBzZXJ2ZXIgJHtzZXJ2ZXJWZXJzaW9ufWApO1xuICAgICAgbG9nLmluZm8oYFVzaW5nIFVJQXV0b21hdG9yMiBzZXJ2ZXIgZnJvbSAnJHthcGtQYXRofScgYW5kIHRlc3QgZnJvbSAnJHt0ZXN0QXBrUGF0aH0nYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGltZW91dCA9IGNhcHMudWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCB8fCBTRVJWRVJfTEFVTkNIX1RJTUVPVVQ7XG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICBsZXQgcmV0cmllcyA9IDA7XG4gICAgY29uc3QgbWF4UmV0cmllcyA9IDI7XG4gICAgY29uc3QgZGVsYXlCZXR3ZWVuUmV0cmllcyA9IDMwMDA7XG4gICAgd2hpbGUgKHJldHJpZXMgPCBtYXhSZXRyaWVzKSB7XG4gICAgICBsb2cuaW5mbyhgV2FpdGluZyB1cCB0byAke3RpbWVvdXR9bXMgZm9yIFVpQXV0b21hdG9yMiB0byBiZSBvbmxpbmUuLi5gKTtcbiAgICAgIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0ID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcygpO1xuICAgICAgaWYgKCF0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIHNob3J0IGNpcmN1aXQgdG8gcmV0cnkgb3IgZmFpbCBmYXN0XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB3YWl0TXM6IHRpbWVvdXQsXG4gICAgICAgICAgICBpbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGNhbm5vdCBiZSBpbml0aWFsaXplZCB3aXRoaW4gJHt0aW1lb3V0fW1zIHRpbWVvdXQuIGBcbiAgICAgICAgICAgICsgJ01ha2Ugc3VyZSB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBkb2VzIG5vdCBjcmFzaCBhbmQgaW52ZXN0aWdhdGUgdGhlIGxvZ2NhdCBvdXRwdXQuICdcbiAgICAgICAgICAgICsgYFlvdSBjb3VsZCBhbHNvIHRyeSB0byBpbmNyZWFzZSB0aGUgdmFsdWUgb2YgJ3VpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQnIGNhcGFiaWxpdHlgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmV0cmllcysrO1xuICAgICAgaWYgKHJldHJpZXMgPj0gbWF4UmV0cmllcykge1xuICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdygnVGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGNhbm5vdCBiZSBpbml0aWFsaXplZC4gJ1xuICAgICAgICAgICsgJ01ha2Ugc3VyZSB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBkb2VzIG5vdCBjcmFzaCBhbmQgaW52ZXN0aWdhdGUgdGhlIGxvZ2NhdCBvdXRwdXQuJyk7XG4gICAgICB9XG4gICAgICBsb2cud2FybihgVGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGhhcyBiZWVuIHVuZXhwZWN0ZWRseSB0ZXJtaW5hdGVkLiBgXG4gICAgICAgICsgYFJldHJ5aW5nIFVpQXV0b21hdG9yMiBzdGFydHVwICgjJHtyZXRyaWVzfSBvZiAke21heFJldHJpZXMgLSAxfSlgKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cEF1dG9tYXRpb25MZWZ0b3ZlcnModHJ1ZSk7XG4gICAgICBhd2FpdCBCLmRlbGF5KGRlbGF5QmV0d2VlblJldHJpZXMpO1xuICAgIH1cblxuICAgIGxvZy5kZWJ1ZyhgVGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyB0b29rIGBcbiAgICAgICsgYCR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zZXNzaW9uJywgJ1BPU1QnLCB7XG4gICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgZmlyc3RNYXRjaDogW2NhcHNdLFxuICAgICAgICBhbHdheXNNYXRjaDoge30sXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzdGFydEluc3RydW1lbnRhdGlvblByb2Nlc3MgKCkge1xuICAgIGNvbnN0IGNtZCA9IFsnYW0nLCAnaW5zdHJ1bWVudCcsICctdyddO1xuICAgIGlmICh0aGlzLmRpc2FibGVXaW5kb3dBbmltYXRpb24pIHtcbiAgICAgIGNtZC5wdXNoKCctLW5vLXdpbmRvdy1hbmltYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKF8uaXNCb29sZWFuKHRoaXMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UpKSB7XG4gICAgICBjbWQucHVzaCgnLWUnLCAnRElTQUJMRV9TVVBQUkVTU19BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTJywgdGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSk7XG4gICAgfVxuICAgIC8vIERpc2FibGUgR29vZ2xlIGFuYWx5dGljcyB0byBwcmV2ZW50IHBvc3NpYmxlIGZhdGFsIGV4Y2VwdGlvblxuICAgIGNtZC5wdXNoKCctZScsICdkaXNhYmxlQW5hbHl0aWNzJywgdHJ1ZSk7XG4gICAgY21kLnB1c2goSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCk7XG4gICAgY29uc3QgaW5zdHJ1bWVudGF0aW9uUHJvY2VzcyA9IHRoaXMuYWRiLmNyZWF0ZVN1YlByb2Nlc3MoWydzaGVsbCcsIC4uLmNtZF0pO1xuICAgIGluc3RydW1lbnRhdGlvblByb2Nlc3Mub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gXy50cmltKHN0ZG91dCB8fCBzdGRlcnIpO1xuICAgICAgaWYgKG91dHB1dCkge1xuICAgICAgICBpbnN0cnVtZW50YXRpb25Mb2dnZXIuZGVidWcob3V0cHV0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpbnN0cnVtZW50YXRpb25Qcm9jZXNzLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgIGluc3RydW1lbnRhdGlvbkxvZ2dlci5kZWJ1ZyhgVGhlIHByb2Nlc3MgaGFzIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApO1xuICAgICAgdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQgPSB0cnVlO1xuICAgIH0pO1xuICAgIGF3YWl0IGluc3RydW1lbnRhdGlvblByb2Nlc3Muc3RhcnQoMCk7XG4gIH1cblxuICBhc3luYyBkZWxldGVTZXNzaW9uICgpIHtcbiAgICBsb2cuZGVidWcoJ0RlbGV0aW5nIFVpQXV0b21hdG9yMiBzZXJ2ZXIgc2Vzc2lvbicpO1xuICAgIC8vIHJlbHkgb24gandwcm94eSdzIGludGVsbGlnZW5jZSB0byBrbm93IHdoYXQgd2UncmUgdGFsa2luZyBhYm91dCBhbmRcbiAgICAvLyBkZWxldGUgdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnLycsICdERUxFVEUnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBEaWQgbm90IGdldCBjb25maXJtYXRpb24gVWlBdXRvbWF0b3IyIGRlbGV0ZVNlc3Npb24gd29ya2VkOyBgICtcbiAgICAgICAgICBgRXJyb3Igd2FzOiAke2Vycn1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyAoc3RyaWN0Q2xlYW51cCA9IGZhbHNlKSB7XG4gICAgbG9nLmRlYnVnKGBQZXJmb3JtaW5nICR7c3RyaWN0Q2xlYW51cCA/ICdzdHJpY3QnIDogJ3NoYWxsb3cnfSBjbGVhbnVwIG9mIGF1dG9tYXRpb24gbGVmdG92ZXJzYCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qge3ZhbHVlfSA9IChhd2FpdCBheGlvcyh7XG4gICAgICAgIHVybDogYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3dkL2h1Yi9zZXNzaW9uc2AsXG4gICAgICAgIHRpbWVvdXQ6IDUwMCxcbiAgICAgIH0pKS5kYXRhO1xuICAgICAgY29uc3QgYWN0aXZlU2Vzc2lvbklkcyA9IHZhbHVlLm1hcCgoe2lkfSkgPT4gaWQpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGlmIChhY3RpdmVTZXNzaW9uSWRzLmxlbmd0aCkge1xuICAgICAgICBsb2cuZGVidWcoYFRoZSBmb2xsb3dpbmcgb2Jzb2xldGUgc2Vzc2lvbnMgYXJlIHN0aWxsIHJ1bm5pbmc6ICR7SlNPTi5zdHJpbmdpZnkoYWN0aXZlU2Vzc2lvbklkcyl9YCk7XG4gICAgICAgIGxvZy5kZWJ1ZyhgQ2xlYW5pbmcgdXAgJHt1dGlsLnBsdXJhbGl6ZSgnb2Jzb2xldGUgc2Vzc2lvbicsIGFjdGl2ZVNlc3Npb25JZHMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICAgICAgYXdhaXQgQi5hbGwoYWN0aXZlU2Vzc2lvbklkc1xuICAgICAgICAgIC5tYXAoKGlkKSA9PiBheGlvcy5kZWxldGUoYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3dkL2h1Yi9zZXNzaW9uLyR7aWR9YCkpXG4gICAgICAgICk7XG4gICAgICAgIC8vIExldCBhbGwgc2Vzc2lvbnMgdG8gYmUgcHJvcGVybHkgdGVybWluYXRlZCBiZWZvcmUgY29udGludWluZ1xuICAgICAgICBhd2FpdCBCLmRlbGF5KDEwMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmRlYnVnKCdObyBvYnNvbGV0ZSBzZXNzaW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoYE5vIG9ic29sZXRlIHNlc3Npb25zIGhhdmUgYmVlbiBkZXRlY3RlZCAoJHtlLm1lc3NhZ2V9KWApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AoU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCk7XG4gICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICAgIGlmICghc3RyaWN0Q2xlYW51cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTA3NDlcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIua2lsbFByb2Nlc3Nlc0J5TmFtZSgndWlhdXRvbWF0b3InKTtcbiAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gIH1cbn1cblxuZXhwb3J0IHsgVWlBdXRvbWF0b3IyU2VydmVyLCBJTlNUUlVNRU5UQVRJT05fVEFSR0VULCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCB9O1xuZXhwb3J0IGRlZmF1bHQgVWlBdXRvbWF0b3IyU2VydmVyO1xuIl0sImZpbGUiOiJsaWIvdWlhdXRvbWF0b3IyLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
package/index.js CHANGED
@@ -1,6 +1,5 @@
1
1
  // transpile:main
2
2
 
3
- import yargs from 'yargs';
4
3
  import { asyncify } from 'asyncbox';
5
4
  import * as driver from './lib/driver';
6
5
  import * as server from './lib/server';
@@ -13,8 +12,12 @@ export const DEFAULT_HOST = 'localhost';
13
12
  export const DEFAULT_PORT = 4884;
14
13
 
15
14
  async function main () {
16
- let port = yargs.argv.port || DEFAULT_PORT;
17
- let host = yargs.argv.host || yargs.argv.address || DEFAULT_HOST;
15
+ const getArgValue = (argName) => {
16
+ const argIndex = process.argv.indexOf(argName);
17
+ return argIndex > 0 ? process.argv[argIndex + 1] : null;
18
+ };
19
+ const port = parseInt(getArgValue('--port'), 10) || DEFAULT_PORT;
20
+ const host = getArgValue('--host') || DEFAULT_HOST;
18
21
  return await startServer(port, host);
19
22
  }
20
23
 
package/lib/.DS_Store ADDED
Binary file
@@ -9,6 +9,10 @@ function toBool (s) {
9
9
  return _.isString(s) ? (s.toLowerCase() === 'true') : !!s;
10
10
  }
11
11
 
12
+ commands.active = async function active () {
13
+ return await this.uiautomator2.jwproxy.command('/element/active', 'GET');
14
+ };
15
+
12
16
  commands.getAttribute = async function (attribute, elementId) {
13
17
  return await this.uiautomator2.jwproxy.command(`/element/${elementId}/attribute/${attribute}`, 'GET', {});
14
18
  };
@@ -328,7 +328,7 @@ commands.mobileScrollBackTo = async function (opts = {}) {
328
328
 
329
329
  /**
330
330
  * @typedef {Object} ScrollOpts
331
- * @property {?string} element The identifier of an element. It is required this element
331
+ * @property {?string} elementId The identifier of an element. It is required this element
332
332
  * is a valid scrollable container and it was located by `-android uiautomator`
333
333
  * strategy. If this property is not provided then the first currently available scrollable view
334
334
  * is selected for the interaction.
@@ -356,15 +356,16 @@ commands.mobileScrollBackTo = async function (opts = {}) {
356
356
  * @throws {Error} if the scrolling operation cannot be performed
357
357
  */
358
358
  commands.mobileScroll = async function (opts = {}) {
359
- const {element, strategy, selector, maxSwipes} = opts;
359
+ const {
360
+ element, elementId, // `element` is deprecated, use `elementId` instead
361
+ strategy, selector, maxSwipes
362
+ } = opts;
360
363
  if (!strategy || !selector) {
361
364
  throw new errors.InvalidArgumentError(`Both strategy and selector arguments must be provided`);
362
365
  }
363
366
  return await this.uiautomator2.jwproxy.command('/touch/scroll', 'POST', {
364
- params: {
365
- origin: toOrigin(element),
366
- strategy, selector, maxSwipes
367
- },
367
+ origin: toOrigin(elementId || element),
368
+ params: {strategy, selector, maxSwipes},
368
369
  });
369
370
  };
370
371
 
package/lib/driver.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import _ from 'lodash';
2
2
  import { BaseDriver, DeviceSettings } from 'appium-base-driver';
3
- import { UiAutomator2Server, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID } from './uiautomator2';
3
+ import {
4
+ UiAutomator2Server, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID
5
+ } from './uiautomator2';
4
6
  import { fs, util, mjpeg } from 'appium-support';
5
7
  import { retryInterval } from 'asyncbox';
6
8
  import B from 'bluebird';
@@ -8,9 +10,11 @@ import logger from './logger';
8
10
  import commands from './commands/index';
9
11
  import { DEFAULT_ADB_PORT } from 'appium-adb';
10
12
  import uiautomator2Helpers from './helpers';
11
- import { androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID } from 'appium-android-driver';
13
+ import {
14
+ androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID
15
+ } from 'appium-android-driver';
12
16
  import desiredCapConstraints from './desired-caps';
13
- import { findAPortNotInUse } from 'portscanner';
17
+ import { findAPortNotInUse, checkPortStatus } from 'portscanner';
14
18
  import os from 'os';
15
19
  import path from 'path';
16
20
  import { APK_EXTENSION, APKS_EXTENSION } from './extensions';
@@ -37,6 +41,8 @@ const DEVICE_PORT = 6790;
37
41
  // device.
38
42
  const MJPEG_SERVER_DEVICE_PORT = 7810;
39
43
 
44
+ const LOCALHOST_IP4 = '127.0.0.1';
45
+
40
46
  // NO_PROXY contains the paths that we never want to proxy to UiAutomator2 server.
41
47
  // TODO: Add the list of paths that we never want to proxy to UiAutomator2 server.
42
48
  // TODO: Need to segregate the paths better way using regular expressions wherever applicable.
@@ -274,6 +280,12 @@ class AndroidUiautomator2Driver extends BaseDriver {
274
280
  async allocateSystemPort () {
275
281
  const forwardPort = async (localPort) => {
276
282
  logger.debug(`Forwarding UiAutomator2 Server port ${DEVICE_PORT} to local port ${localPort}`);
283
+ if ((await checkPortStatus(localPort, LOCALHOST_IP4)) === 'open') {
284
+ logger.errorAndThrow(`UiAutomator2 Server cannot start because the local port #${localPort} is busy. ` +
285
+ `Make sure the port you provide via 'systemPort' capability is not occupied. ` +
286
+ `This situation might often be a result of an inaccurate sessions management, e.g. ` +
287
+ `old automation sessions on the same device must always be closed before starting new ones.`);
288
+ }
277
289
  await this.adb.forwardPort(localPort, DEVICE_PORT);
278
290
  };
279
291
 
@@ -459,7 +471,7 @@ class AndroidUiautomator2Driver extends BaseDriver {
459
471
  async initUiAutomator2Server () {
460
472
  // broken out for readability
461
473
  const uiautomator2Opts = {
462
- host: this.opts.remoteAdbHost || this.opts.host || '127.0.0.1',
474
+ host: this.opts.remoteAdbHost || this.opts.host || LOCALHOST_IP4,
463
475
  systemPort: this.opts.systemPort,
464
476
  devicePort: DEVICE_PORT,
465
477
  adb: this.adb,
@@ -2,8 +2,14 @@ import _ from 'lodash';
2
2
  import { JWProxy, errors } from 'appium-base-driver';
3
3
  import { waitForCondition } from 'asyncbox';
4
4
  import log from './logger';
5
- import { SERVER_APK_PATH as apkPath, TEST_APK_PATH as testApkPath, version as serverVersion } from 'appium-uiautomator2-server';
6
- import { util, logger, tempDir, fs, timing } from 'appium-support';
5
+ import {
6
+ SERVER_APK_PATH as apkPath,
7
+ TEST_APK_PATH as testApkPath,
8
+ version as serverVersion
9
+ } from 'appium-uiautomator2-server';
10
+ import {
11
+ util, logger, tempDir, fs, timing
12
+ } from 'appium-support';
7
13
  import B from 'bluebird';
8
14
  import helpers from './helpers';
9
15
  import axios from 'axios';
@@ -302,13 +308,13 @@ class UiAutomator2Server {
302
308
  url: `http://${this.host}:${this.systemPort}/wd/hub/sessions`,
303
309
  timeout: 500,
304
310
  })).data;
305
- const activeSessionIds = value.map((sess) => sess.id);
311
+ const activeSessionIds = value.map(({id}) => id).filter(Boolean);
306
312
  if (activeSessionIds.length) {
307
313
  log.debug(`The following obsolete sessions are still running: ${JSON.stringify(activeSessionIds)}`);
308
- log.debug('Cleaning up the obsolete sessions');
309
- await B.all(activeSessionIds.map((id) =>
310
- axios.delete(`http://${this.host}:${this.systemPort}/wd/hub/session/${id}`)
311
- ));
314
+ log.debug(`Cleaning up ${util.pluralize('obsolete session', activeSessionIds.length, true)}`);
315
+ await B.all(activeSessionIds
316
+ .map((id) => axios.delete(`http://${this.host}:${this.systemPort}/wd/hub/session/${id}`))
317
+ );
312
318
  // Let all sessions to be properly terminated before continuing
313
319
  await B.delay(1000);
314
320
  } else {
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "automated testing",
8
8
  "android"
9
9
  ],
10
- "version": "1.65.0",
10
+ "version": "1.66.2",
11
11
  "author": "appium",
12
12
  "license": "Apache-2.0",
13
13
  "repository": {
@@ -46,7 +46,7 @@
46
46
  "appium-base-driver": "^7.0.0",
47
47
  "appium-chromedriver": "^4.23.1",
48
48
  "appium-support": "^2.49.0",
49
- "appium-uiautomator2-server": "^4.20.0",
49
+ "appium-uiautomator2-server": "^4.23.0",
50
50
  "asyncbox": "^2.3.1",
51
51
  "axios": "^0.x",
52
52
  "bluebird": "^3.5.1",
@@ -54,8 +54,7 @@
54
54
  "lodash": "^4.17.4",
55
55
  "portscanner": "2.2.0",
56
56
  "source-map-support": "^0.5.5",
57
- "teen_process": "^1.3.1",
58
- "yargs": "^16.0.0"
57
+ "teen_process": "^1.3.1"
59
58
  },
60
59
  "scripts": {
61
60
  "prepare": "rimraf build && gulp prepublish",
@@ -90,13 +89,13 @@
90
89
  "eslint-config-appium": "^4.0.1",
91
90
  "gps-demo-app": "^2.1.1",
92
91
  "gulp": "^4.0.0",
93
- "mocha": "^8.2.1",
92
+ "mocha": "^9.0.0",
94
93
  "mocha-junit-reporter": "^2.0.0",
95
94
  "mocha-multi-reporters": "^1.1.7",
96
95
  "pngjs": "^6.0.0",
97
96
  "pre-commit": "^1.2.2",
98
97
  "rimraf": "^3.0.0",
99
- "sinon": "^10.0.0",
98
+ "sinon": "^11.0.0",
100
99
  "unzipper": "^0.10.0",
101
100
  "wd": "^1.10.3",
102
101
  "xmldom": "^0.x",