appium-ios-device 2.4.12 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +51 -27
  3. package/build/index.js +8 -1
  4. package/build/lib/afc/index.js +1 -1
  5. package/build/lib/afc/index.js.map +1 -1
  6. package/build/lib/base-service.js +1 -1
  7. package/build/lib/base-service.js.map +1 -1
  8. package/build/lib/instrument/headers.js +1 -1
  9. package/build/lib/instrument/headers.js.map +1 -1
  10. package/build/lib/instrument/index.js +20 -5
  11. package/build/lib/instrument/index.js.map +1 -1
  12. package/build/lib/instrument/transformer/nskeyed.js +122 -34
  13. package/build/lib/instrument/transformer/nskeyed.js.map +1 -1
  14. package/build/lib/lockdown/index.js +1 -1
  15. package/build/lib/lockdown/index.js.map +1 -1
  16. package/build/lib/syslog/index.js +1 -1
  17. package/build/lib/syslog/index.js.map +1 -1
  18. package/build/lib/usbmux/index.js +1 -1
  19. package/build/lib/usbmux/index.js.map +1 -1
  20. package/build/lib/utilities.js +1 -1
  21. package/build/lib/utilities.js.map +1 -1
  22. package/build/lib/webinspector/index.js +1 -1
  23. package/build/lib/webinspector/index.js.map +1 -1
  24. package/build/lib/xctest.js +236 -0
  25. package/build/lib/xctest.js.map +1 -0
  26. package/index.js +1 -0
  27. package/lib/afc/index.js +1 -2
  28. package/lib/base-service.js +3 -0
  29. package/lib/instrument/headers.js +1 -1
  30. package/lib/instrument/index.js +28 -10
  31. package/lib/instrument/transformer/nskeyed.js +194 -78
  32. package/lib/lockdown/index.js +2 -2
  33. package/lib/syslog/index.js +1 -2
  34. package/lib/usbmux/index.js +8 -8
  35. package/lib/utilities.js +8 -8
  36. package/lib/webinspector/index.js +2 -3
  37. package/lib/xctest.js +285 -0
  38. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [2.5.0](https://github.com/appium/appium-ios-device/compare/v2.4.12...v2.5.0) (2023-04-14)
2
+
3
+
4
+ ### Features
5
+
6
+ * add xctest class which can be used to start WDA ([#110](https://github.com/appium/appium-ios-device/issues/110)) ([f3740fd](https://github.com/appium/appium-ios-device/commit/f3740fd6a9ea83c9df34a50c97e56abc69fea077))
7
+
1
8
  ## [2.4.12](https://github.com/appium/appium-ios-device/compare/v2.4.11...v2.4.12) (2023-04-07)
2
9
 
3
10
 
package/README.md CHANGED
@@ -1,46 +1,70 @@
1
- appium-ios-device
2
- ===================
1
+ # appium-ios-device
3
2
 
4
3
  [![NPM version](http://img.shields.io/npm/v/appium-ios-device.svg)](https://npmjs.org/package/appium-ios-device)
5
4
  [![Downloads](http://img.shields.io/npm/dm/appium-ios-device.svg)](https://npmjs.org/package/appium-ios-device)
6
5
 
7
6
  [![Release](https://github.com/appium/appium-ios-device/actions/workflows/publish.js.yml/badge.svg)](https://github.com/appium/appium-ios-device/actions/workflows/publish.js.yml)
8
7
 
9
- Appium API for dealing with iOS devices. This is mainly a rewrite of libimobiledevice in nodejs. The APIs allow Appium to talk directly to the phone over usbmuxd
8
+ Appium API for dealing with iOS devices. This is mainly a rewrite of libimobiledevice in Node.js. The APIs allow Appium to talk directly to the phone over usbmuxd.
10
9
 
11
10
  More information can be found at the links below:
11
+
12
12
  * [libimobiledevice](https://github.com/libimobiledevice/libimobiledevice)
13
13
  * [iPhone Wiki](https://www.theiphonewiki.com/)
14
14
 
15
- *Note*: Issue tracking for this repo has been disabled. Please use the [main Appium issue tracker](https://github.com/appium/appium/issues) instead.
15
+ > **Note**
16
+ > This module is used and tested by [appium-xcuitest-driver](https://github.com/appium/appium-xcuitest-driver), which expects macOS as the host paltform with Xcode.
17
+ > Some features may only work partially on other platforms.
18
+
19
+ ## Usage
20
+
21
+ This module should be used over the `utilities` and `services` modules or exported classes in documents due to the complexity of iOS communication. When a new services is implemented, it should be added and made available over the `services` module.
16
22
 
17
23
  ### Methods
18
24
 
19
- - `utilities.getConnectedDevices`
20
- - `utilities.getOSVersion`
21
- - `utilities.getDeviceTime`
22
- - `utilities.getDeviceName`
23
- - `utilities.getDeviceInfo`
24
- - `utilities.startLockdownSession`
25
- - `utilities.connectPort`
26
- - `utilities.connectPortSSL`
27
- - `services.startSyslogService`
28
- - `services.startWebInspectorService`
29
- - `services.startInstallationProxyService`
30
- - `services.startSimulateLocationService`
31
- - `services.startAfcService`
32
- - `services.startNotificationProxyService`
33
- - `services.startHouseArrestService`
34
- - `services.startInstrumentService`
35
- - `services.startTestmanagerdService`
36
- - `services.startMCInstallService`
37
-
38
- ### Usage
39
-
40
- This module should be used over the `utilities` and `services` modules due to the complexity of iOS communication. When a new services is implemented, it should be added and made available over the `services` module
25
+ * `utilities.getConnectedDevices`
26
+ * `utilities.getOSVersion`
27
+ * `utilities.getDeviceTime`
28
+ * `utilities.getDeviceName`
29
+ * `utilities.getDeviceInfo`
30
+ * `utilities.startLockdownSession`
31
+ * `utilities.connectPort`
32
+ * `utilities.connectPortSSL`
33
+ * `services.startSyslogService`
34
+ * `services.startWebInspectorService`
35
+ * `services.startInstallationProxyService`
36
+ * `services.startSimulateLocationService`
37
+ * `services.startAfcService`
38
+ * `services.startNotificationProxyService`
39
+ * `services.startHouseArrestService`
40
+ * `services.startInstrumentService`
41
+ * `services.startTestmanagerdService`
42
+ * `services.startMCInstallService`
43
+
44
+ ### Classes
45
+
46
+ * `Xctest`
47
+ * Allows invoking pre-installed xctest app from iOS devices. No Xcode installation is required.
48
+ This class simulates the procedure which Xcode uses to invoke xctests.
49
+ * `new Xctest(udid, xctestBundleId, targetBundleId, opts)`
50
+ * `udid` - `string` Device udid.
51
+ * `xctestBundleId` - `string` - Bundle Id of xctest app on device. The app must be installed on device.
52
+ * `targetBundleId` - `string` - Test target bundle id. `null` by default.
53
+ * `opts` - optional addition options to specific XCTestConfiguration and app launch env.
54
+ * `conf` - properties to override in XCTestConfiguration.
55
+ * `productModuleName` - `string | null`
56
+ * `targetApplicationArguments` - `string[] | null`
57
+ * `testsToRun` - `string[] | null`
58
+ * `testsToSkip` - `string[] | null`
59
+ * `env` - `object` - key-value pairs to append in xctest app environment
60
+ * `xctest.start()`
61
+ * Start xctest process. If this method has been called before and the `stop()` method has not been called, calling this again would return directly.
62
+ * **Throws**: If xctest bundle id invalid or not installed.
63
+ * `xctest.stop()`
64
+ * Stop xctest process.
41
65
 
42
66
  ## Test
43
67
 
44
- ```
68
+ ``` shell
45
69
  npm test
46
70
  ```
package/build/index.js CHANGED
@@ -22,6 +22,12 @@ Object.defineProperty(exports, "Usbmux", {
22
22
  return _usbmux.default;
23
23
  }
24
24
  });
25
+ Object.defineProperty(exports, "Xctest", {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _xctest.Xctest;
29
+ }
30
+ });
25
31
  exports.utilities = exports.services = exports.default = void 0;
26
32
  require("source-map-support/register");
27
33
  var _usbmux = _interopRequireDefault(require("./lib/usbmux"));
@@ -31,8 +37,9 @@ var services = _interopRequireWildcard(require("./lib/services"));
31
37
  exports.services = services;
32
38
  var _instrument = require("./lib/instrument");
33
39
  var _testmanagerd = require("./lib/testmanagerd");
40
+ var _xctest = require("./lib/xctest");
34
41
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
35
42
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
36
43
  var _default = _usbmux.default;
37
44
  exports.default = _default;
38
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdXNibXV4IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJ1dGlsaXRpZXMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsImV4cG9ydHMiLCJzZXJ2aWNlcyIsIl9pbnN0cnVtZW50IiwiX3Rlc3RtYW5hZ2VyZCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJfZGVmYXVsdCIsIlVzYm11eCJdLCJzb3VyY2VzIjpbIi4uL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmF1bHQgYXMgVXNibXV4IH0gZnJvbSAnLi9saWIvdXNibXV4JztcbmltcG9ydCAqIGFzIHV0aWxpdGllcyBmcm9tICcuL2xpYi91dGlsaXRpZXMnO1xuaW1wb3J0ICogYXMgc2VydmljZXMgZnJvbSAnLi9saWIvc2VydmljZXMnO1xuXG5leHBvcnQgeyBVc2JtdXgsIHV0aWxpdGllcywgc2VydmljZXMgfTtcbmV4cG9ydCB7IElOU1RSVU1FTlRfQ0hBTk5FTCB9IGZyb20gJy4vbGliL2luc3RydW1lbnQnO1xuZXhwb3J0IHsgVEVTVE1BTkFHRVJEX0NIQU5ORUwgfSBmcm9tICcuL2xpYi90ZXN0bWFuYWdlcmQnO1xuZXhwb3J0IGRlZmF1bHQgVXNibXV4O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQUE2Q0csT0FBQSxDQUFBRixTQUFBLEdBQUFBLFNBQUE7QUFDN0MsSUFBQUcsUUFBQSxHQUFBRix1QkFBQSxDQUFBRixPQUFBO0FBQTJDRyxPQUFBLENBQUFDLFFBQUEsR0FBQUEsUUFBQTtBQUczQyxJQUFBQyxXQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxhQUFBLEdBQUFOLE9BQUE7QUFBMEQsU0FBQU8seUJBQUFDLFdBQUEsZUFBQUMsT0FBQSxrQ0FBQUMsaUJBQUEsT0FBQUQsT0FBQSxRQUFBRSxnQkFBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLFdBQUEsV0FBQUEsV0FBQSxHQUFBRyxnQkFBQSxHQUFBRCxpQkFBQSxLQUFBRixXQUFBO0FBQUEsU0FBQU4sd0JBQUFVLEdBQUEsRUFBQUosV0FBQSxTQUFBQSxXQUFBLElBQUFJLEdBQUEsSUFBQUEsR0FBQSxDQUFBQyxVQUFBLFdBQUFELEdBQUEsUUFBQUEsR0FBQSxvQkFBQUEsR0FBQSx3QkFBQUEsR0FBQSw0QkFBQUUsT0FBQSxFQUFBRixHQUFBLFVBQUFHLEtBQUEsR0FBQVIsd0JBQUEsQ0FBQUMsV0FBQSxPQUFBTyxLQUFBLElBQUFBLEtBQUEsQ0FBQUMsR0FBQSxDQUFBSixHQUFBLFlBQUFHLEtBQUEsQ0FBQUUsR0FBQSxDQUFBTCxHQUFBLFNBQUFNLE1BQUEsV0FBQUMscUJBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEsQ0FBQUUsd0JBQUEsV0FBQUMsR0FBQSxJQUFBWCxHQUFBLFFBQUFXLEdBQUEsa0JBQUFILE1BQUEsQ0FBQUksU0FBQSxDQUFBQyxjQUFBLENBQUFDLElBQUEsQ0FBQWQsR0FBQSxFQUFBVyxHQUFBLFNBQUFJLElBQUEsR0FBQVIscUJBQUEsR0FBQUMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBVixHQUFBLEVBQUFXLEdBQUEsY0FBQUksSUFBQSxLQUFBQSxJQUFBLENBQUFWLEdBQUEsSUFBQVUsSUFBQSxDQUFBQyxHQUFBLEtBQUFSLE1BQUEsQ0FBQUMsY0FBQSxDQUFBSCxNQUFBLEVBQUFLLEdBQUEsRUFBQUksSUFBQSxZQUFBVCxNQUFBLENBQUFLLEdBQUEsSUFBQVgsR0FBQSxDQUFBVyxHQUFBLFNBQUFMLE1BQUEsQ0FBQUosT0FBQSxHQUFBRixHQUFBLE1BQUFHLEtBQUEsSUFBQUEsS0FBQSxDQUFBYSxHQUFBLENBQUFoQixHQUFBLEVBQUFNLE1BQUEsWUFBQUEsTUFBQTtBQUFBLElBQUFXLFFBQUEsR0FDM0NDLGVBQU07QUFBQTNCLE9BQUEsQ0FBQVcsT0FBQSxHQUFBZSxRQUFBIn0=
45
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdXNibXV4IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJ1dGlsaXRpZXMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsImV4cG9ydHMiLCJzZXJ2aWNlcyIsIl9pbnN0cnVtZW50IiwiX3Rlc3RtYW5hZ2VyZCIsIl94Y3Rlc3QiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiX2RlZmF1bHQiLCJVc2JtdXgiXSwic291cmNlcyI6WyIuLi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZhdWx0IGFzIFVzYm11eCB9IGZyb20gJy4vbGliL3VzYm11eCc7XG5pbXBvcnQgKiBhcyB1dGlsaXRpZXMgZnJvbSAnLi9saWIvdXRpbGl0aWVzJztcbmltcG9ydCAqIGFzIHNlcnZpY2VzIGZyb20gJy4vbGliL3NlcnZpY2VzJztcblxuZXhwb3J0IHsgVXNibXV4LCB1dGlsaXRpZXMsIHNlcnZpY2VzIH07XG5leHBvcnQgeyBJTlNUUlVNRU5UX0NIQU5ORUwgfSBmcm9tICcuL2xpYi9pbnN0cnVtZW50JztcbmV4cG9ydCB7IFRFU1RNQU5BR0VSRF9DSEFOTkVMIH0gZnJvbSAnLi9saWIvdGVzdG1hbmFnZXJkJztcbmV4cG9ydCB7IFhjdGVzdCB9IGZyb20gJy4vbGliL3hjdGVzdCc7XG5leHBvcnQgZGVmYXVsdCBVc2JtdXg7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBQyx1QkFBQSxDQUFBRixPQUFBO0FBQTZDRyxPQUFBLENBQUFGLFNBQUEsR0FBQUEsU0FBQTtBQUM3QyxJQUFBRyxRQUFBLEdBQUFGLHVCQUFBLENBQUFGLE9BQUE7QUFBMkNHLE9BQUEsQ0FBQUMsUUFBQSxHQUFBQSxRQUFBO0FBRzNDLElBQUFDLFdBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLGFBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLE9BQUEsR0FBQVAsT0FBQTtBQUFzQyxTQUFBUSx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBUCx3QkFBQVcsR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLG9CQUFBQSxHQUFBLHdCQUFBQSxHQUFBLDRCQUFBRSxPQUFBLEVBQUFGLEdBQUEsVUFBQUcsS0FBQSxHQUFBUix3QkFBQSxDQUFBQyxXQUFBLE9BQUFPLEtBQUEsSUFBQUEsS0FBQSxDQUFBQyxHQUFBLENBQUFKLEdBQUEsWUFBQUcsS0FBQSxDQUFBRSxHQUFBLENBQUFMLEdBQUEsU0FBQU0sTUFBQSxXQUFBQyxxQkFBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxHQUFBLElBQUFYLEdBQUEsUUFBQVcsR0FBQSxrQkFBQUgsTUFBQSxDQUFBSSxTQUFBLENBQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBZCxHQUFBLEVBQUFXLEdBQUEsU0FBQUksSUFBQSxHQUFBUixxQkFBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFWLEdBQUEsRUFBQVcsR0FBQSxjQUFBSSxJQUFBLEtBQUFBLElBQUEsQ0FBQVYsR0FBQSxJQUFBVSxJQUFBLENBQUFDLEdBQUEsS0FBQVIsTUFBQSxDQUFBQyxjQUFBLENBQUFILE1BQUEsRUFBQUssR0FBQSxFQUFBSSxJQUFBLFlBQUFULE1BQUEsQ0FBQUssR0FBQSxJQUFBWCxHQUFBLENBQUFXLEdBQUEsU0FBQUwsTUFBQSxDQUFBSixPQUFBLEdBQUFGLEdBQUEsTUFBQUcsS0FBQSxJQUFBQSxLQUFBLENBQUFhLEdBQUEsQ0FBQWhCLEdBQUEsRUFBQU0sTUFBQSxZQUFBQSxNQUFBO0FBQUEsSUFBQVcsUUFBQSxHQUN2QkMsZUFBTTtBQUFBNUIsT0FBQSxDQUFBWSxPQUFBLEdBQUFlLFFBQUEifQ==
@@ -288,4 +288,4 @@ class FileInfo {
288
288
  }
289
289
  var _default = AfcService;
290
290
  exports.default = _default;
291
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGVuZ3RoQmFzZWRTcGxpdHRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3Byb3RvY29sIiwiX3N0cmVhbXMiLCJfYWZjZW5jb2RlciIsIl9hZmNkZWNvZGVyIiwiX2NvbnN0YW50cyIsIl9ibHVlYmlyZCIsIl9wYXRoIiwiX2xvZGFzaCIsIl9iYXNlU2VydmljZSIsIkFGQ19TRVJWSUNFX05BTUUiLCJleHBvcnRzIiwiTUFYX0ZSQU1FX1NJWkUiLCJNQiIsIk5VTExfREVMSU1JVEVSX0NPREUiLCJJR05PUkVEX1BBVEhTIiwiQWZjU2VydmljZSIsIkJhc2VTZXJ2aWNlU29ja2V0IiwiY29uc3RydWN0b3IiLCJzb2NrZXRDbGllbnQiLCJfc3BsaXR0ZXIiLCJMZW5ndGhCYXNlZFNwbGl0dGVyIiwicmVhZGFibGVTdHJlYW0iLCJsaXR0bGVFbmRpYW4iLCJtYXhGcmFtZUxlbmd0aCIsImxlbmd0aEZpZWxkT2Zmc2V0IiwibGVuZ3RoRmllbGRMZW5ndGgiLCJsZW5ndGhBZGp1c3RtZW50IiwiX2RlY29kZXIiLCJBZmNEZWNvZGVyIiwiX3NvY2tldENsaWVudCIsInBpcGUiLCJfZW5jb2RlciIsIkFmY0VuY29kZXIiLCJfYXNzaWduQ2xpZW50RmFpbHVyZUhhbmRsZXJzIiwiX3Jlc3BvbnNlQ2FsbGJhY2tzIiwiX3BhY2tldE51bWJlciIsIm9uIiwiX2hhbmRsZURhdGEiLCJiaW5kIiwiZGF0YSIsImNiIiwicGFja2V0TnVtYmVyIiwiXyIsIm5vb3AiLCJjcmVhdGVEaXJlY3RvcnkiLCJwYXRoIiwicmVzcG9uc2UiLCJfY3JlYXRlUGFja2V0UHJvbWlzZSIsIm9wQ29kZSIsIk9wZXJhdGlvbnMiLCJNQUtFX0RJUiIsImhlYWRlclBheWxvYWQiLCJCdWZmZXIiLCJmcm9tIiwid3JpdGUiLCJyZXMiLCJfY2hlY2tTdGF0dXMiLCJkZWxldGVEaXJlY3RvcnkiLCJSRU1PVkVfUEFUSF9BTkRfQ09OVEVOVFMiLCJsaXN0RGlyZWN0b3J5IiwiUkVBRF9ESVIiLCJEQVRBIiwiX3BhcnNlQXJyYXkiLCJjb250ZW50Iiwib3BlbkZpbGUiLCJtb2RlIiwicGF0aFBheWxvYWQiLCJmaWxlTW9kZVBheWxvYWQiLCJhbGxvYyIsIndyaXRlVUludDMyTEUiLCJGSUxFX09QRU4iLCJjb25jYXQiLCJGSUxFX09QRU5fUkVTIiwicmVhZFVJbnQzMkxFIiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJmaWxlUGF0aCIsIm9wdHMiLCJmaWxlSGFuZGxlIiwiRmlsZU1vZGVzIiwidyIsIkFmY1dyaXRhYmxlRmlsZVN0cmVhbSIsImNyZWF0ZVJlYWRTdHJlYW0iLCJvcHRpb25zIiwiciIsIkFmY1JlYWRhYmxlRmlsZVN0cmVhbSIsImNsb3NlRmlsZUhhbmRsZSIsIkZJTEVfQ0xPU0UiLCJ3cml0ZUZpbGUiLCJidWZmZXIiLCJGSUxFX1dSSVRFIiwicmVhZEZpbGUiLCJsZW5ndGgiLCJGSUxFX1JFQUQiLCJnZXRGaWxlSW5mbyIsIkdFVF9GSUxFX0lORk8iLCJGaWxlSW5mbyIsIl9wYXJzZU9iamVjdCIsIndhbGtEaXIiLCJkaXIiLCJyZWN1cnNpdmUiLCJvblBhdGgiLCJmaWxlIiwiaW5jbHVkZXMiLCJyZWxhdGl2ZVBhdGgiLCJwb3NpeCIsImpvaW4iLCJmaWxlSW5mbyIsImlzRGlyZWN0b3J5IiwiU1RBVFVTIiwiRXJyb3IiLCJvcGVyYXRpb25Db2RlIiwiaXNFbXB0eSIsIkVycm9ycyIsIlNVQ0NFU1MiLCJlcnJvckNvZGUiLCJpdGVtcyIsInN0YXJ0IiwiZW5kIiwiaXRlbSIsInRvU3RyaW5nIiwicHVzaCIsImN1cnJlbnRLZXkiLCJpc05pbCIsIm1lc3NhZ2UiLCJ0aW1lb3V0IiwiQiIsInJlc29sdmUiLCJyZWplY3QiLCJzZXRUaW1lb3V0Iiwic3Rfc2l6ZSIsInN0X2Jsb2NrcyIsInN0X25saW5rIiwic3RfaWZtdCIsInN0X210aW1lIiwic3RfYmlydGh0aW1lIiwic2l6ZSIsInBhcnNlSW50IiwiYmxvY2tzIiwibmxpbmsiLCJpZm10IiwibXRpbWVNcyIsImJpcnRodGltZU1zIiwiaXNGaWxlIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2FmYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBMZW5ndGhCYXNlZFNwbGl0dGVyIGZyb20gJy4uL3V0aWwvdHJhbnNmb3JtZXIvbGVuZ3RoLWJhc2VkLXNwbGl0dGVyJztcbmltcG9ydCB7IE9wZXJhdGlvbnMsIG9wZXJhdGlvbkNvZGUsIEVycm9ycywgZXJyb3JDb2RlLCBGaWxlTW9kZXMgfSBmcm9tICcuL3Byb3RvY29sJztcbmltcG9ydCB7IEFmY1dyaXRhYmxlRmlsZVN0cmVhbSwgQWZjUmVhZGFibGVGaWxlU3RyZWFtIH0gZnJvbSAnLi9zdHJlYW1zJztcbmltcG9ydCBBZmNFbmNvZGVyIGZyb20gJy4vdHJhbnNmb3JtZXIvYWZjZW5jb2Rlcic7XG5pbXBvcnQgQWZjRGVjb2RlciBmcm9tICcuL3RyYW5zZm9ybWVyL2FmY2RlY29kZXInO1xuaW1wb3J0IHsgTUIgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQmFzZVNlcnZpY2VTb2NrZXQgfSBmcm9tICcuLi9iYXNlLXNlcnZpY2UnO1xuXG5cbmNvbnN0IEFGQ19TRVJWSUNFX05BTUUgPSAnY29tLmFwcGxlLmFmYyc7XG5jb25zdCBNQVhfRlJBTUVfU0laRSA9IDEgKiBNQjtcblxuY29uc3QgTlVMTF9ERUxJTUlURVJfQ09ERSA9IDB4MDA7XG5jb25zdCBJR05PUkVEX1BBVEhTID0gWycuJywgJy4uJ107XG5cbmNsYXNzIEFmY1NlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZVNvY2tldCB7XG4gIGNvbnN0cnVjdG9yIChzb2NrZXRDbGllbnQpIHtcbiAgICBzdXBlcihzb2NrZXRDbGllbnQpO1xuXG4gICAgdGhpcy5fc3BsaXR0ZXIgPSBuZXcgTGVuZ3RoQmFzZWRTcGxpdHRlcih7XG4gICAgICByZWFkYWJsZVN0cmVhbTogc29ja2V0Q2xpZW50LFxuICAgICAgbGl0dGxlRW5kaWFuOiB0cnVlLFxuICAgICAgbWF4RnJhbWVMZW5ndGg6IE1BWF9GUkFNRV9TSVpFLFxuICAgICAgbGVuZ3RoRmllbGRPZmZzZXQ6IDgsXG4gICAgICBsZW5ndGhGaWVsZExlbmd0aDogOCxcbiAgICAgIGxlbmd0aEFkanVzdG1lbnQ6IC04LFxuICAgIH0pO1xuICAgIHRoaXMuX2RlY29kZXIgPSBuZXcgQWZjRGVjb2RlcigpO1xuICAgIHRoaXMuX3NvY2tldENsaWVudC5waXBlKHRoaXMuX3NwbGl0dGVyKS5waXBlKHRoaXMuX2RlY29kZXIpO1xuXG4gICAgdGhpcy5fZW5jb2RlciA9IG5ldyBBZmNFbmNvZGVyKCk7XG4gICAgdGhpcy5fZW5jb2Rlci5waXBlKHRoaXMuX3NvY2tldENsaWVudCk7XG4gICAgdGhpcy5fYXNzaWduQ2xpZW50RmFpbHVyZUhhbmRsZXJzKHRoaXMuX2VuY29kZXIpO1xuXG4gICAgdGhpcy5fcmVzcG9uc2VDYWxsYmFja3MgPSB7fTtcblxuICAgIHRoaXMuX3BhY2tldE51bWJlciA9IDA7XG4gICAgdGhpcy5fZGVjb2Rlci5vbignZGF0YScsIHRoaXMuX2hhbmRsZURhdGEuYmluZCh0aGlzKSk7XG4gIH1cblxuICBfaGFuZGxlRGF0YSAoZGF0YSkge1xuICAgIGNvbnN0IGNiID0gdGhpcy5fcmVzcG9uc2VDYWxsYmFja3NbZGF0YS5wYWNrZXROdW1iZXJdIHx8IF8ubm9vcDtcbiAgICBjYihkYXRhKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by1jYWxsYmFja3NcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIGFuIGFscmVhZHkgZXhpc3RpbmcgZGlyZWN0b3J5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIGluIHVuaXggZm9ybWF0XG4gICAqL1xuICBhc3luYyBjcmVhdGVEaXJlY3RvcnkgKHBhdGgpIHtcbiAgICBjb25zdCB7cGFja2V0TnVtYmVyLCByZXNwb25zZX0gPSB0aGlzLl9jcmVhdGVQYWNrZXRQcm9taXNlKGBDcmVhdGUgZGlyZWN0b3J5ICcke3BhdGh9J2ApO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIG9wQ29kZTogT3BlcmF0aW9ucy5NQUtFX0RJUixcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQ6IEJ1ZmZlci5mcm9tKHBhdGgpXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhcmUgZGlyZWN0b3J5IGNvbXBsZXRlbHkgZXZlbiBpdCBoYXMgY29udGVudCBpbnNpZGUuIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgJ3JtIC1yIHtwYXRofSdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZURpcmVjdG9yeSAocGF0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYERlbGV0ZSBkaXJlY3RvcnkgJyR7cGF0aH0nYCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgb3BDb2RlOiBPcGVyYXRpb25zLlJFTU9WRV9QQVRIX0FORF9DT05URU5UUyxcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQ6IEJ1ZmZlci5mcm9tKHBhdGgpXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgYSBkaXJlY3RvcnkncyBjb250ZW50cyBhbmQgcmV0dXJucyB0aGVtIGluIGFuIGFycmF5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIGluIHVuaXggZm9ybWF0XG4gICAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fVxuICAgKi9cbiAgYXN5bmMgbGlzdERpcmVjdG9yeSAocGF0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYExpc3QgZGlyZWN0b3J5ICcke3BhdGh9J2ApO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIG9wQ29kZTogT3BlcmF0aW9ucy5SRUFEX0RJUixcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQ6IEJ1ZmZlci5mcm9tKHBhdGgpXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIGlmIChyZXMub3BDb2RlICE9PSBPcGVyYXRpb25zLkRBVEEpIHtcbiAgICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3BhcnNlQXJyYXkocmVzLmNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgZmlsZSBhbmQgY3JlYXRlcyBhIGZpbGUgaGFuZGxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIGluIHVuaXggZm9ybWF0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtb2RlIFRoZSBmaWxlIG1vZGUgdGhhdCB3aWxsIGJlIHVzZWRcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgYXN5bmMgb3BlbkZpbGUgKHBhdGgsIG1vZGUpIHtcbiAgICBjb25zdCB7cGFja2V0TnVtYmVyLCByZXNwb25zZX0gPSB0aGlzLl9jcmVhdGVQYWNrZXRQcm9taXNlKGBPcGVuIGZpbGUgJyR7cGF0aH0nYCk7XG5cbiAgICBjb25zdCBwYXRoUGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHBhdGgpO1xuICAgIGNvbnN0IGZpbGVNb2RlUGF5bG9hZCA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICBmaWxlTW9kZVBheWxvYWQud3JpdGVVSW50MzJMRShtb2RlLCAwKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBvcENvZGU6IE9wZXJhdGlvbnMuRklMRV9PUEVOLFxuICAgICAgcGFja2V0TnVtYmVyLFxuICAgICAgaGVhZGVyUGF5bG9hZDogQnVmZmVyLmNvbmNhdChbZmlsZU1vZGVQYXlsb2FkLCBwYXRoUGF5bG9hZF0pXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIGlmIChyZXMub3BDb2RlICE9PSBPcGVyYXRpb25zLkZJTEVfT1BFTl9SRVMpIHtcbiAgICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5oZWFkZXJQYXlsb2FkLnJlYWRVSW50MzJMRSgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhIGZpbGUgYW5kIGNyZWF0ZXMgYSBub2RlanMgd3JpdGUgc3RyZWFtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCBUaGUgcGF0aCBpbiB1bml4IGZvcm1hdFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyBUaGUgcmVndWxhciBvcHRpb25zIHRoYXQgYXJlIHBhc3NlZCB0byBhIFN0cmVhbS5Xcml0YWJsZVxuICAgKiBAcmV0dXJuIHtBZmNXcml0YWJsZUZpbGVTdHJlYW19XG4gICAqL1xuICBhc3luYyBjcmVhdGVXcml0ZVN0cmVhbSAoZmlsZVBhdGgsIG9wdHMpIHtcbiAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgdGhpcy5vcGVuRmlsZShmaWxlUGF0aCwgRmlsZU1vZGVzLncpO1xuICAgIHJldHVybiBuZXcgQWZjV3JpdGFibGVGaWxlU3RyZWFtKGZpbGVIYW5kbGUsIHRoaXMsIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgZmlsZSBhbmQgY3JlYXRlcyBhIG5vZGVqcyByZWFkIHN0cmVhbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgVGhlIHJlZ3VsYXIgb3B0aW9ucyB0aGF0IGFyZSBwYXNzZWQgdG8gYSBTdHJlYW0uUmVhZGFibGVcbiAgICogQHJldHVybiB7QWZjUmVhZGFibGVGaWxlU3RyZWFtfVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlUmVhZFN0cmVhbSAoZmlsZVBhdGgsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgdGhpcy5vcGVuRmlsZShmaWxlUGF0aCwgRmlsZU1vZGVzLnIpO1xuICAgIHJldHVybiBuZXcgQWZjUmVhZGFibGVGaWxlU3RyZWFtKGZpbGVIYW5kbGUsIHRoaXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgZmlsZSBoYW5kbGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGZpbGVIYW5kbGUgdGhlIGZpbGUgaGFuZGxlIHRvIGJlIGNsb3NlZFxuICAgKi9cbiAgYXN5bmMgY2xvc2VGaWxlSGFuZGxlIChmaWxlSGFuZGxlKSB7XG4gICAgY29uc3Qge3BhY2tldE51bWJlciwgcmVzcG9uc2V9ID0gdGhpcy5fY3JlYXRlUGFja2V0UHJvbWlzZShgQ2xvc2UgZmlsZSBoYW5kbGUgJyR7ZmlsZUhhbmRsZX0nYCk7XG5cbiAgICBjb25zdCBmaWxlTW9kZVBheWxvYWQgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgZmlsZU1vZGVQYXlsb2FkLndyaXRlVUludDMyTEUoZmlsZUhhbmRsZSwgMCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgb3BDb2RlOiBPcGVyYXRpb25zLkZJTEVfQ0xPU0UsXG4gICAgICBwYWNrZXROdW1iZXIsXG4gICAgICBoZWFkZXJQYXlsb2FkOiBmaWxlTW9kZVBheWxvYWRcbiAgICB9O1xuICAgIHRoaXMuX2VuY29kZXIud3JpdGUoZGF0YSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgcmVzcG9uc2U7XG4gICAgdGhpcy5fY2hlY2tTdGF0dXMocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIGJ1ZmZlciBpbnRvIHRoZSBnaXZlbiBmaWxlIGhhbmRsZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZmlsZUhhbmRsZSBUaGUgZmlsZSBoYW5kbGUgdG8gYmUgdXNlZFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdGhhdCB3aWxsIGJlIHdyaXR0ZW5cbiAgICovXG4gIGFzeW5jIHdyaXRlRmlsZSAoZmlsZUhhbmRsZSwgYnVmZmVyKSB7XG4gICAgY29uc3Qge3BhY2tldE51bWJlciwgcmVzcG9uc2V9ID0gdGhpcy5fY3JlYXRlUGFja2V0UHJvbWlzZShgV3JpdGUgdG8gZmlsZSBoYW5kbGUgJyR7ZmlsZUhhbmRsZX0nYCk7XG5cbiAgICBjb25zdCBoZWFkZXJQYXlsb2FkID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIGhlYWRlclBheWxvYWQud3JpdGVVSW50MzJMRShmaWxlSGFuZGxlLCAwKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBvcENvZGU6IE9wZXJhdGlvbnMuRklMRV9XUklURSxcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQsXG4gICAgICBjb250ZW50OiBidWZmZXJcbiAgICB9O1xuICAgIHRoaXMuX2VuY29kZXIud3JpdGUoZGF0YSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgcmVzcG9uc2U7XG4gICAgdGhpcy5fY2hlY2tTdGF0dXMocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGEgY2VydGFpbiBsZW5ndGggb2YgYnVmZmVyIGZyb20gdGhlIGZpbGUgaGFuZGxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmaWxlSGFuZGxlIFRoZSBmaWxlIGhhbmRsZSB0byBiZSB1c2VkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIGxlbmd0aCB0aGF0IHdhbnRzIHRvIGJlIHJlYWQgZnJvbSB0aGUgZmlsZSBoYW5kbGVcbiAgICogQHJldHVybiB7QnVmZmVyfVxuICAgKi9cbiAgYXN5bmMgcmVhZEZpbGUgKGZpbGVIYW5kbGUsIGxlbmd0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYFJlYWQgZnJvbSBmaWxlIGhhbmRsZSAnJHtmaWxlSGFuZGxlfSdgKTtcblxuICAgIGNvbnN0IGhlYWRlclBheWxvYWQgPSBCdWZmZXIuYWxsb2MoMTYpO1xuICAgIGhlYWRlclBheWxvYWQud3JpdGVVSW50MzJMRShmaWxlSGFuZGxlLCAwKTtcbiAgICBoZWFkZXJQYXlsb2FkLndyaXRlVUludDMyTEUobGVuZ3RoLCA4KTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBvcENvZGU6IE9wZXJhdGlvbnMuRklMRV9SRUFELFxuICAgICAgcGFja2V0TnVtYmVyLFxuICAgICAgaGVhZGVyUGF5bG9hZFxuICAgIH07XG4gICAgdGhpcy5fZW5jb2Rlci53cml0ZShkYXRhKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCByZXNwb25zZTtcbiAgICBpZiAocmVzLm9wQ29kZSAhPT0gT3BlcmF0aW9ucy5EQVRBKSB7XG4gICAgICB0aGlzLl9jaGVja1N0YXR1cyhyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLmNvbnRlbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIGluZm8gb2YgdGhlIGdpdmVuIHBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICogQHJldHVybiB7RmlsZUluZm99XG4gICAqL1xuICBhc3luYyBnZXRGaWxlSW5mbyAocGF0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYEdldCBmaWxlIGluZm8gJyR7cGF0aH0nYCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgb3BDb2RlOiBPcGVyYXRpb25zLkdFVF9GSUxFX0lORk8sXG4gICAgICBwYWNrZXROdW1iZXIsXG4gICAgICBoZWFkZXJQYXlsb2FkOiBCdWZmZXIuZnJvbShwYXRoKVxuICAgIH07XG4gICAgdGhpcy5fZW5jb2Rlci53cml0ZShkYXRhKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCByZXNwb25zZTtcbiAgICBpZiAocmVzLm9wQ29kZSAhPT0gT3BlcmF0aW9ucy5EQVRBKSB7XG4gICAgICB0aGlzLl9jaGVja1N0YXR1cyhyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZpbGVJbmZvKHRoaXMuX3BhcnNlT2JqZWN0KHJlcy5jb250ZW50KSk7XG4gIH1cblxuICAvKiogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgZGlyZWN0b3J5IHdhbGtpbmdcbiAgICogQG5hbWUgV2Fsa0RpckNhbGxiYWNrXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gaXRlbVBhdGggVGhlIHBhdGggb2YgdGhlIGZpbGUgb3IgZm9sZGVyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNEaXJlY3RvcnkgU2hvd3MgaWYgaXQgaXMgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlXG4gICovXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkaXIgVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICogQHBhcmFtIHtib29sZWFufSByZWN1cnNpdmUgU2V0cyB3aGV0aGVyIHRvIGZvbGxvdyBzdWIgZGlyZWN0b3JpZXMgb3Igbm90XG4gICAqIEBwYXJhbSB7V2Fsa0RpckNhbGxiYWNrfSBvblBhdGggVGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgbmV3IHBhdGggaXMgZm91bmRcbiAgICovXG4gIGFzeW5jIHdhbGtEaXIgKGRpciwgcmVjdXJzaXZlLCBvblBhdGgpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgdGhpcy5saXN0RGlyZWN0b3J5KGRpcikpIHtcbiAgICAgIGlmIChJR05PUkVEX1BBVEhTLmluY2x1ZGVzKGZpbGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpciwgZmlsZSk7XG4gICAgICBjb25zdCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0RmlsZUluZm8ocmVsYXRpdmVQYXRoKTtcbiAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gZmlsZUluZm8uaXNEaXJlY3RvcnkoKTtcbiAgICAgIGF3YWl0IG9uUGF0aChyZWxhdGl2ZVBhdGgsIGlzRGlyZWN0b3J5KTtcbiAgICAgIGlmIChpc0RpcmVjdG9yeSAmJiByZWN1cnNpdmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy53YWxrRGlyKHJlbGF0aXZlUGF0aCwgcmVjdXJzaXZlLCBvblBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jaGVja1N0YXR1cyAocmVzKSB7XG4gICAgaWYgKHJlcy5vcENvZGUgIT09IE9wZXJhdGlvbnMuU1RBVFVTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgcmVzcG9uc2UgJHtvcGVyYXRpb25Db2RlKHJlcy5vcENvZGUpfWApO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHJlcy5oZWFkZXJQYXlsb2FkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdIZWFkZXIgcGF5bG9hZCBjYW5ub3QgYmUgZW1wdHkgZm9yIGEgc3RhdHVzIHJlc3BvbnNlJyk7XG4gICAgfVxuICAgIGlmIChyZXMuaGVhZGVyUGF5bG9hZFswXSAhPT0gRXJyb3JzLlNVQ0NFU1MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCByZXNwb25zZSAke2Vycm9yQ29kZShyZXMuaGVhZGVyUGF5bG9hZFswXSl9YCk7XG4gICAgfVxuICB9XG5cbiAgX3BhcnNlQXJyYXkgKGJ1ZmZlcikge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBmb3IgKGxldCBlbmQgPSAwOyBlbmQgPCBidWZmZXIubGVuZ3RoOyBlbmQrKykge1xuICAgICAgaWYgKGJ1ZmZlcltlbmRdICE9PSBOVUxMX0RFTElNSVRFUl9DT0RFKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbSA9IGJ1ZmZlci50b1N0cmluZygndXRmOCcsIHN0YXJ0LCBlbmQpO1xuICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIC8vIFdlIHNraXAgdGhlIG51bGwgZGVsaW1ldGVyXG4gICAgICBzdGFydCA9IGVuZCArIDE7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIF9wYXJzZU9iamVjdCAoYnVmZmVyKSB7XG4gICAgY29uc3QgaXRlbXMgPSB7fTtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBjdXJyZW50S2V5O1xuICAgIGZvciAobGV0IGVuZCA9IDA7IGVuZCA8IGJ1ZmZlci5sZW5ndGg7IGVuZCsrKSB7XG4gICAgICBpZiAoYnVmZmVyW2VuZF0gIT09IE5VTExfREVMSU1JVEVSX0NPREUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtID0gYnVmZmVyLnRvU3RyaW5nKCd1dGY4Jywgc3RhcnQsIGVuZCk7XG4gICAgICBpZiAoXy5pc05pbChjdXJyZW50S2V5KSkge1xuICAgICAgICBjdXJyZW50S2V5ID0gaXRlbTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1zW2N1cnJlbnRLZXldID0gaXRlbTtcbiAgICAgICAgY3VycmVudEtleSA9IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBXZSBza2lwIHRoZSBudWxsIGRlbGltZXRlclxuICAgICAgc3RhcnQgPSBlbmQgKyAxO1xuICAgIH1cbiAgICBpZiAoY3VycmVudEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgY29ycmVjdGx5ICR7YnVmZmVyfS4gUGxlYXNlIGludmVzdGlnYXRlYCk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIF9jcmVhdGVQYWNrZXRQcm9taXNlIChtZXNzYWdlLCB0aW1lb3V0ID0gMTAwMDApIHtcbiAgICBjb25zdCBwYWNrZXROdW1iZXIgPSB0aGlzLl9wYWNrZXROdW1iZXIrKztcbiAgICBjb25zdCByZXNwb25zZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3BhY2tldE51bWJlcl0gPSByZXNvbHZlO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5pc2ggdGhlIG9wZXJhdGlvbiAnJHttZXNzYWdlfScuIEZhaWxlZCB0byByZWNlaXZlIGFueSBkYXRhIHdpdGhpbiB0aGUgJHt0aW1lb3V0fW1zIHRpbWVvdXRgKSk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge3BhY2tldE51bWJlciwgcmVzcG9uc2V9O1xuICB9XG59XG5cbmNsYXNzIEZpbGVJbmZvIHtcbiAgY29uc3RydWN0b3IgKHtzdF9zaXplLCBzdF9ibG9ja3MsIHN0X25saW5rLCBzdF9pZm10LCBzdF9tdGltZSwgc3RfYmlydGh0aW1lfSkge1xuICAgIHRoaXMuc2l6ZSA9IHBhcnNlSW50KHN0X3NpemUsIDEwKTtcbiAgICB0aGlzLmJsb2NrcyA9IHBhcnNlSW50KHN0X2Jsb2NrcywgMTApO1xuICAgIHRoaXMubmxpbmsgPSBwYXJzZUludChzdF9ubGluaywgMTApO1xuICAgIHRoaXMuaWZtdCA9IHN0X2lmbXQ7XG4gICAgLy8gbnMgdG8gbXNcbiAgICB0aGlzLm10aW1lTXMgPSBwYXJzZUludChzdF9tdGltZSwgMTApIC8gMTAwMDAwMDtcbiAgICAvLyBucyB0byBtc1xuICAgIHRoaXMuYmlydGh0aW1lTXMgPSBwYXJzZUludChzdF9iaXJ0aHRpbWUsIDEwKSAvIDEwMDAwMDA7XG4gIH1cblxuICBpc0RpcmVjdG9yeSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWZtdCA9PT0gJ1NfSUZESVInO1xuICB9XG5cbiAgaXNGaWxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5pZm10ID09PSAnU19JRlJFRyc7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQWZjU2VydmljZTtcbmV4cG9ydCB7IEFmY1NlcnZpY2UsIEFGQ19TRVJWSUNFX05BTUUgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFDQSxJQUFBQSxvQkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsV0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksV0FBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sU0FBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU8sS0FBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsT0FBQSxHQUFBVCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVMsWUFBQSxHQUFBVCxPQUFBO0FBR0EsTUFBTVUsZ0JBQWdCLEdBQUcsZUFBZTtBQUFDQyxPQUFBLENBQUFELGdCQUFBLEdBQUFBLGdCQUFBO0FBQ3pDLE1BQU1FLGNBQWMsR0FBRyxDQUFDLEdBQUdDLGFBQUU7QUFFN0IsTUFBTUMsbUJBQW1CLEdBQUcsSUFBSTtBQUNoQyxNQUFNQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFB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
291
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGVuZ3RoQmFzZWRTcGxpdHRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3Byb3RvY29sIiwiX3N0cmVhbXMiLCJfYWZjZW5jb2RlciIsIl9hZmNkZWNvZGVyIiwiX2NvbnN0YW50cyIsIl9ibHVlYmlyZCIsIl9wYXRoIiwiX2xvZGFzaCIsIl9iYXNlU2VydmljZSIsIkFGQ19TRVJWSUNFX05BTUUiLCJleHBvcnRzIiwiTUFYX0ZSQU1FX1NJWkUiLCJNQiIsIk5VTExfREVMSU1JVEVSX0NPREUiLCJJR05PUkVEX1BBVEhTIiwiQWZjU2VydmljZSIsIkJhc2VTZXJ2aWNlU29ja2V0IiwiY29uc3RydWN0b3IiLCJzb2NrZXRDbGllbnQiLCJfc3BsaXR0ZXIiLCJMZW5ndGhCYXNlZFNwbGl0dGVyIiwicmVhZGFibGVTdHJlYW0iLCJsaXR0bGVFbmRpYW4iLCJtYXhGcmFtZUxlbmd0aCIsImxlbmd0aEZpZWxkT2Zmc2V0IiwibGVuZ3RoRmllbGRMZW5ndGgiLCJsZW5ndGhBZGp1c3RtZW50IiwiX2RlY29kZXIiLCJBZmNEZWNvZGVyIiwiX3NvY2tldENsaWVudCIsInBpcGUiLCJfZW5jb2RlciIsIkFmY0VuY29kZXIiLCJfYXNzaWduQ2xpZW50RmFpbHVyZUhhbmRsZXJzIiwiX3Jlc3BvbnNlQ2FsbGJhY2tzIiwiX3BhY2tldE51bWJlciIsIm9uIiwiX2hhbmRsZURhdGEiLCJiaW5kIiwiZGF0YSIsImNiIiwicGFja2V0TnVtYmVyIiwiXyIsIm5vb3AiLCJjcmVhdGVEaXJlY3RvcnkiLCJwYXRoIiwicmVzcG9uc2UiLCJfY3JlYXRlUGFja2V0UHJvbWlzZSIsIm9wQ29kZSIsIk9wZXJhdGlvbnMiLCJNQUtFX0RJUiIsImhlYWRlclBheWxvYWQiLCJCdWZmZXIiLCJmcm9tIiwid3JpdGUiLCJyZXMiLCJfY2hlY2tTdGF0dXMiLCJkZWxldGVEaXJlY3RvcnkiLCJSRU1PVkVfUEFUSF9BTkRfQ09OVEVOVFMiLCJsaXN0RGlyZWN0b3J5IiwiUkVBRF9ESVIiLCJEQVRBIiwiX3BhcnNlQXJyYXkiLCJjb250ZW50Iiwib3BlbkZpbGUiLCJtb2RlIiwicGF0aFBheWxvYWQiLCJmaWxlTW9kZVBheWxvYWQiLCJhbGxvYyIsIndyaXRlVUludDMyTEUiLCJGSUxFX09QRU4iLCJjb25jYXQiLCJGSUxFX09QRU5fUkVTIiwicmVhZFVJbnQzMkxFIiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJmaWxlUGF0aCIsIm9wdHMiLCJmaWxlSGFuZGxlIiwiRmlsZU1vZGVzIiwidyIsIkFmY1dyaXRhYmxlRmlsZVN0cmVhbSIsImNyZWF0ZVJlYWRTdHJlYW0iLCJvcHRpb25zIiwiciIsIkFmY1JlYWRhYmxlRmlsZVN0cmVhbSIsImNsb3NlRmlsZUhhbmRsZSIsIkZJTEVfQ0xPU0UiLCJ3cml0ZUZpbGUiLCJidWZmZXIiLCJGSUxFX1dSSVRFIiwicmVhZEZpbGUiLCJsZW5ndGgiLCJGSUxFX1JFQUQiLCJnZXRGaWxlSW5mbyIsIkdFVF9GSUxFX0lORk8iLCJGaWxlSW5mbyIsIl9wYXJzZU9iamVjdCIsIndhbGtEaXIiLCJkaXIiLCJyZWN1cnNpdmUiLCJvblBhdGgiLCJmaWxlIiwiaW5jbHVkZXMiLCJyZWxhdGl2ZVBhdGgiLCJwb3NpeCIsImpvaW4iLCJmaWxlSW5mbyIsImlzRGlyZWN0b3J5IiwiU1RBVFVTIiwiRXJyb3IiLCJvcGVyYXRpb25Db2RlIiwiaXNFbXB0eSIsIkVycm9ycyIsIlNVQ0NFU1MiLCJlcnJvckNvZGUiLCJpdGVtcyIsInN0YXJ0IiwiZW5kIiwiaXRlbSIsInRvU3RyaW5nIiwicHVzaCIsImN1cnJlbnRLZXkiLCJpc05pbCIsIm1lc3NhZ2UiLCJ0aW1lb3V0IiwiQiIsInJlc29sdmUiLCJyZWplY3QiLCJzZXRUaW1lb3V0Iiwic3Rfc2l6ZSIsInN0X2Jsb2NrcyIsInN0X25saW5rIiwic3RfaWZtdCIsInN0X210aW1lIiwic3RfYmlydGh0aW1lIiwic2l6ZSIsInBhcnNlSW50IiwiYmxvY2tzIiwibmxpbmsiLCJpZm10IiwibXRpbWVNcyIsImJpcnRodGltZU1zIiwiaXNGaWxlIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2FmYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBMZW5ndGhCYXNlZFNwbGl0dGVyIGZyb20gJy4uL3V0aWwvdHJhbnNmb3JtZXIvbGVuZ3RoLWJhc2VkLXNwbGl0dGVyJztcbmltcG9ydCB7IE9wZXJhdGlvbnMsIG9wZXJhdGlvbkNvZGUsIEVycm9ycywgZXJyb3JDb2RlLCBGaWxlTW9kZXMgfSBmcm9tICcuL3Byb3RvY29sJztcbmltcG9ydCB7IEFmY1dyaXRhYmxlRmlsZVN0cmVhbSwgQWZjUmVhZGFibGVGaWxlU3RyZWFtIH0gZnJvbSAnLi9zdHJlYW1zJztcbmltcG9ydCBBZmNFbmNvZGVyIGZyb20gJy4vdHJhbnNmb3JtZXIvYWZjZW5jb2Rlcic7XG5pbXBvcnQgQWZjRGVjb2RlciBmcm9tICcuL3RyYW5zZm9ybWVyL2FmY2RlY29kZXInO1xuaW1wb3J0IHsgTUIgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQmFzZVNlcnZpY2VTb2NrZXQgfSBmcm9tICcuLi9iYXNlLXNlcnZpY2UnO1xuXG5cbmNvbnN0IEFGQ19TRVJWSUNFX05BTUUgPSAnY29tLmFwcGxlLmFmYyc7XG5jb25zdCBNQVhfRlJBTUVfU0laRSA9IDEgKiBNQjtcblxuY29uc3QgTlVMTF9ERUxJTUlURVJfQ09ERSA9IDB4MDA7XG5jb25zdCBJR05PUkVEX1BBVEhTID0gWycuJywgJy4uJ107XG5cbmNsYXNzIEFmY1NlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZVNvY2tldCB7XG4gIGNvbnN0cnVjdG9yIChzb2NrZXRDbGllbnQpIHtcbiAgICBzdXBlcihzb2NrZXRDbGllbnQpO1xuXG4gICAgdGhpcy5fc3BsaXR0ZXIgPSBuZXcgTGVuZ3RoQmFzZWRTcGxpdHRlcih7XG4gICAgICByZWFkYWJsZVN0cmVhbTogc29ja2V0Q2xpZW50LFxuICAgICAgbGl0dGxlRW5kaWFuOiB0cnVlLFxuICAgICAgbWF4RnJhbWVMZW5ndGg6IE1BWF9GUkFNRV9TSVpFLFxuICAgICAgbGVuZ3RoRmllbGRPZmZzZXQ6IDgsXG4gICAgICBsZW5ndGhGaWVsZExlbmd0aDogOCxcbiAgICAgIGxlbmd0aEFkanVzdG1lbnQ6IC04LFxuICAgIH0pO1xuICAgIHRoaXMuX2RlY29kZXIgPSBuZXcgQWZjRGVjb2RlcigpO1xuICAgIHRoaXMuX3NvY2tldENsaWVudC5waXBlKHRoaXMuX3NwbGl0dGVyKS5waXBlKHRoaXMuX2RlY29kZXIpO1xuXG4gICAgdGhpcy5fZW5jb2RlciA9IG5ldyBBZmNFbmNvZGVyKCk7XG4gICAgdGhpcy5fZW5jb2Rlci5waXBlKHRoaXMuX3NvY2tldENsaWVudCk7XG4gICAgdGhpcy5fYXNzaWduQ2xpZW50RmFpbHVyZUhhbmRsZXJzKHRoaXMuX2VuY29kZXIpO1xuXG4gICAgdGhpcy5fcmVzcG9uc2VDYWxsYmFja3MgPSB7fTtcblxuICAgIHRoaXMuX3BhY2tldE51bWJlciA9IDA7XG4gICAgdGhpcy5fZGVjb2Rlci5vbignZGF0YScsIHRoaXMuX2hhbmRsZURhdGEuYmluZCh0aGlzKSk7XG4gIH1cblxuICBfaGFuZGxlRGF0YSAoZGF0YSkge1xuICAgIGNvbnN0IGNiID0gdGhpcy5fcmVzcG9uc2VDYWxsYmFja3NbZGF0YS5wYWNrZXROdW1iZXJdIHx8IF8ubm9vcDtcbiAgICBjYihkYXRhKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by1jYWxsYmFja3NcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIGFuIGFscmVhZHkgZXhpc3RpbmcgZGlyZWN0b3J5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIGluIHVuaXggZm9ybWF0XG4gICAqL1xuICBhc3luYyBjcmVhdGVEaXJlY3RvcnkgKHBhdGgpIHtcbiAgICBjb25zdCB7cGFja2V0TnVtYmVyLCByZXNwb25zZX0gPSB0aGlzLl9jcmVhdGVQYWNrZXRQcm9taXNlKGBDcmVhdGUgZGlyZWN0b3J5ICcke3BhdGh9J2ApO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIG9wQ29kZTogT3BlcmF0aW9ucy5NQUtFX0RJUixcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQ6IEJ1ZmZlci5mcm9tKHBhdGgpXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhcmUgZGlyZWN0b3J5IGNvbXBsZXRlbHkgZXZlbiBpdCBoYXMgY29udGVudCBpbnNpZGUuIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgJ3JtIC1yIHtwYXRofSdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZURpcmVjdG9yeSAocGF0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYERlbGV0ZSBkaXJlY3RvcnkgJyR7cGF0aH0nYCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgb3BDb2RlOiBPcGVyYXRpb25zLlJFTU9WRV9QQVRIX0FORF9DT05URU5UUyxcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQ6IEJ1ZmZlci5mcm9tKHBhdGgpXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgYSBkaXJlY3RvcnkncyBjb250ZW50cyBhbmQgcmV0dXJucyB0aGVtIGluIGFuIGFycmF5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIGluIHVuaXggZm9ybWF0XG4gICAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fVxuICAgKi9cbiAgYXN5bmMgbGlzdERpcmVjdG9yeSAocGF0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYExpc3QgZGlyZWN0b3J5ICcke3BhdGh9J2ApO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIG9wQ29kZTogT3BlcmF0aW9ucy5SRUFEX0RJUixcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQ6IEJ1ZmZlci5mcm9tKHBhdGgpXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIGlmIChyZXMub3BDb2RlICE9PSBPcGVyYXRpb25zLkRBVEEpIHtcbiAgICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3BhcnNlQXJyYXkocmVzLmNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgZmlsZSBhbmQgY3JlYXRlcyBhIGZpbGUgaGFuZGxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIGluIHVuaXggZm9ybWF0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtb2RlIFRoZSBmaWxlIG1vZGUgdGhhdCB3aWxsIGJlIHVzZWRcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgYXN5bmMgb3BlbkZpbGUgKHBhdGgsIG1vZGUpIHtcbiAgICBjb25zdCB7cGFja2V0TnVtYmVyLCByZXNwb25zZX0gPSB0aGlzLl9jcmVhdGVQYWNrZXRQcm9taXNlKGBPcGVuIGZpbGUgJyR7cGF0aH0nYCk7XG5cbiAgICBjb25zdCBwYXRoUGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHBhdGgpO1xuICAgIGNvbnN0IGZpbGVNb2RlUGF5bG9hZCA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICBmaWxlTW9kZVBheWxvYWQud3JpdGVVSW50MzJMRShtb2RlLCAwKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBvcENvZGU6IE9wZXJhdGlvbnMuRklMRV9PUEVOLFxuICAgICAgcGFja2V0TnVtYmVyLFxuICAgICAgaGVhZGVyUGF5bG9hZDogQnVmZmVyLmNvbmNhdChbZmlsZU1vZGVQYXlsb2FkLCBwYXRoUGF5bG9hZF0pXG4gICAgfTtcbiAgICB0aGlzLl9lbmNvZGVyLndyaXRlKGRhdGEpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlO1xuICAgIGlmIChyZXMub3BDb2RlICE9PSBPcGVyYXRpb25zLkZJTEVfT1BFTl9SRVMpIHtcbiAgICAgIHRoaXMuX2NoZWNrU3RhdHVzKHJlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5oZWFkZXJQYXlsb2FkLnJlYWRVSW50MzJMRSgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhIGZpbGUgYW5kIGNyZWF0ZXMgYSBub2RlanMgd3JpdGUgc3RyZWFtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCBUaGUgcGF0aCBpbiB1bml4IGZvcm1hdFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyBUaGUgcmVndWxhciBvcHRpb25zIHRoYXQgYXJlIHBhc3NlZCB0byBhIFN0cmVhbS5Xcml0YWJsZVxuICAgKiBAcmV0dXJuIHtBZmNXcml0YWJsZUZpbGVTdHJlYW19XG4gICAqL1xuICBhc3luYyBjcmVhdGVXcml0ZVN0cmVhbSAoZmlsZVBhdGgsIG9wdHMpIHtcbiAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgdGhpcy5vcGVuRmlsZShmaWxlUGF0aCwgRmlsZU1vZGVzLncpO1xuICAgIHJldHVybiBuZXcgQWZjV3JpdGFibGVGaWxlU3RyZWFtKGZpbGVIYW5kbGUsIHRoaXMsIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgZmlsZSBhbmQgY3JlYXRlcyBhIG5vZGVqcyByZWFkIHN0cmVhbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgVGhlIHJlZ3VsYXIgb3B0aW9ucyB0aGF0IGFyZSBwYXNzZWQgdG8gYSBTdHJlYW0uUmVhZGFibGVcbiAgICogQHJldHVybiB7QWZjUmVhZGFibGVGaWxlU3RyZWFtfVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlUmVhZFN0cmVhbSAoZmlsZVBhdGgsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgdGhpcy5vcGVuRmlsZShmaWxlUGF0aCwgRmlsZU1vZGVzLnIpO1xuICAgIHJldHVybiBuZXcgQWZjUmVhZGFibGVGaWxlU3RyZWFtKGZpbGVIYW5kbGUsIHRoaXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgZmlsZSBoYW5kbGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGZpbGVIYW5kbGUgdGhlIGZpbGUgaGFuZGxlIHRvIGJlIGNsb3NlZFxuICAgKi9cbiAgYXN5bmMgY2xvc2VGaWxlSGFuZGxlIChmaWxlSGFuZGxlKSB7XG4gICAgY29uc3Qge3BhY2tldE51bWJlciwgcmVzcG9uc2V9ID0gdGhpcy5fY3JlYXRlUGFja2V0UHJvbWlzZShgQ2xvc2UgZmlsZSBoYW5kbGUgJyR7ZmlsZUhhbmRsZX0nYCk7XG5cbiAgICBjb25zdCBmaWxlTW9kZVBheWxvYWQgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgZmlsZU1vZGVQYXlsb2FkLndyaXRlVUludDMyTEUoZmlsZUhhbmRsZSwgMCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgb3BDb2RlOiBPcGVyYXRpb25zLkZJTEVfQ0xPU0UsXG4gICAgICBwYWNrZXROdW1iZXIsXG4gICAgICBoZWFkZXJQYXlsb2FkOiBmaWxlTW9kZVBheWxvYWRcbiAgICB9O1xuICAgIHRoaXMuX2VuY29kZXIud3JpdGUoZGF0YSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgcmVzcG9uc2U7XG4gICAgdGhpcy5fY2hlY2tTdGF0dXMocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIGJ1ZmZlciBpbnRvIHRoZSBnaXZlbiBmaWxlIGhhbmRsZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZmlsZUhhbmRsZSBUaGUgZmlsZSBoYW5kbGUgdG8gYmUgdXNlZFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdGhhdCB3aWxsIGJlIHdyaXR0ZW5cbiAgICovXG4gIGFzeW5jIHdyaXRlRmlsZSAoZmlsZUhhbmRsZSwgYnVmZmVyKSB7XG4gICAgY29uc3Qge3BhY2tldE51bWJlciwgcmVzcG9uc2V9ID0gdGhpcy5fY3JlYXRlUGFja2V0UHJvbWlzZShgV3JpdGUgdG8gZmlsZSBoYW5kbGUgJyR7ZmlsZUhhbmRsZX0nYCk7XG5cbiAgICBjb25zdCBoZWFkZXJQYXlsb2FkID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIGhlYWRlclBheWxvYWQud3JpdGVVSW50MzJMRShmaWxlSGFuZGxlLCAwKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBvcENvZGU6IE9wZXJhdGlvbnMuRklMRV9XUklURSxcbiAgICAgIHBhY2tldE51bWJlcixcbiAgICAgIGhlYWRlclBheWxvYWQsXG4gICAgICBjb250ZW50OiBidWZmZXJcbiAgICB9O1xuICAgIHRoaXMuX2VuY29kZXIud3JpdGUoZGF0YSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgcmVzcG9uc2U7XG4gICAgdGhpcy5fY2hlY2tTdGF0dXMocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGEgY2VydGFpbiBsZW5ndGggb2YgYnVmZmVyIGZyb20gdGhlIGZpbGUgaGFuZGxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmaWxlSGFuZGxlIFRoZSBmaWxlIGhhbmRsZSB0byBiZSB1c2VkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIGxlbmd0aCB0aGF0IHdhbnRzIHRvIGJlIHJlYWQgZnJvbSB0aGUgZmlsZSBoYW5kbGVcbiAgICogQHJldHVybiB7QnVmZmVyfVxuICAgKi9cbiAgYXN5bmMgcmVhZEZpbGUgKGZpbGVIYW5kbGUsIGxlbmd0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYFJlYWQgZnJvbSBmaWxlIGhhbmRsZSAnJHtmaWxlSGFuZGxlfSdgKTtcblxuICAgIGNvbnN0IGhlYWRlclBheWxvYWQgPSBCdWZmZXIuYWxsb2MoMTYpO1xuICAgIGhlYWRlclBheWxvYWQud3JpdGVVSW50MzJMRShmaWxlSGFuZGxlLCAwKTtcbiAgICBoZWFkZXJQYXlsb2FkLndyaXRlVUludDMyTEUobGVuZ3RoLCA4KTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBvcENvZGU6IE9wZXJhdGlvbnMuRklMRV9SRUFELFxuICAgICAgcGFja2V0TnVtYmVyLFxuICAgICAgaGVhZGVyUGF5bG9hZFxuICAgIH07XG4gICAgdGhpcy5fZW5jb2Rlci53cml0ZShkYXRhKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCByZXNwb25zZTtcbiAgICBpZiAocmVzLm9wQ29kZSAhPT0gT3BlcmF0aW9ucy5EQVRBKSB7XG4gICAgICB0aGlzLl9jaGVja1N0YXR1cyhyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLmNvbnRlbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIGluZm8gb2YgdGhlIGdpdmVuIHBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICogQHJldHVybiB7RmlsZUluZm99XG4gICAqL1xuICBhc3luYyBnZXRGaWxlSW5mbyAocGF0aCkge1xuICAgIGNvbnN0IHtwYWNrZXROdW1iZXIsIHJlc3BvbnNlfSA9IHRoaXMuX2NyZWF0ZVBhY2tldFByb21pc2UoYEdldCBmaWxlIGluZm8gJyR7cGF0aH0nYCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgb3BDb2RlOiBPcGVyYXRpb25zLkdFVF9GSUxFX0lORk8sXG4gICAgICBwYWNrZXROdW1iZXIsXG4gICAgICBoZWFkZXJQYXlsb2FkOiBCdWZmZXIuZnJvbShwYXRoKVxuICAgIH07XG4gICAgdGhpcy5fZW5jb2Rlci53cml0ZShkYXRhKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCByZXNwb25zZTtcbiAgICBpZiAocmVzLm9wQ29kZSAhPT0gT3BlcmF0aW9ucy5EQVRBKSB7XG4gICAgICB0aGlzLl9jaGVja1N0YXR1cyhyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZpbGVJbmZvKHRoaXMuX3BhcnNlT2JqZWN0KHJlcy5jb250ZW50KSk7XG4gIH1cblxuICAvKiogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgZGlyZWN0b3J5IHdhbGtpbmdcbiAgICogQGNhbGxiYWNrIFdhbGtEaXJDYWxsYmFja1xuICAgKiBAcGFyYW0ge3N0cmluZ30gaXRlbVBhdGggVGhlIHBhdGggb2YgdGhlIGZpbGUgb3IgZm9sZGVyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNEaXJlY3RvcnkgU2hvd3MgaWYgaXQgaXMgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlXG4gICovXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkaXIgVGhlIHBhdGggaW4gdW5peCBmb3JtYXRcbiAgICogQHBhcmFtIHtib29sZWFufSByZWN1cnNpdmUgU2V0cyB3aGV0aGVyIHRvIGZvbGxvdyBzdWIgZGlyZWN0b3JpZXMgb3Igbm90XG4gICAqIEBwYXJhbSB7V2Fsa0RpckNhbGxiYWNrfSBvblBhdGggVGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgbmV3IHBhdGggaXMgZm91bmRcbiAgICovXG4gIGFzeW5jIHdhbGtEaXIgKGRpciwgcmVjdXJzaXZlLCBvblBhdGgpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgdGhpcy5saXN0RGlyZWN0b3J5KGRpcikpIHtcbiAgICAgIGlmIChJR05PUkVEX1BBVEhTLmluY2x1ZGVzKGZpbGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpciwgZmlsZSk7XG4gICAgICBjb25zdCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0RmlsZUluZm8ocmVsYXRpdmVQYXRoKTtcbiAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gZmlsZUluZm8uaXNEaXJlY3RvcnkoKTtcbiAgICAgIGF3YWl0IG9uUGF0aChyZWxhdGl2ZVBhdGgsIGlzRGlyZWN0b3J5KTtcbiAgICAgIGlmIChpc0RpcmVjdG9yeSAmJiByZWN1cnNpdmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy53YWxrRGlyKHJlbGF0aXZlUGF0aCwgcmVjdXJzaXZlLCBvblBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jaGVja1N0YXR1cyAocmVzKSB7XG4gICAgaWYgKHJlcy5vcENvZGUgIT09IE9wZXJhdGlvbnMuU1RBVFVTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgcmVzcG9uc2UgJHtvcGVyYXRpb25Db2RlKHJlcy5vcENvZGUpfWApO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHJlcy5oZWFkZXJQYXlsb2FkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdIZWFkZXIgcGF5bG9hZCBjYW5ub3QgYmUgZW1wdHkgZm9yIGEgc3RhdHVzIHJlc3BvbnNlJyk7XG4gICAgfVxuICAgIGlmIChyZXMuaGVhZGVyUGF5bG9hZFswXSAhPT0gRXJyb3JzLlNVQ0NFU1MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCByZXNwb25zZSAke2Vycm9yQ29kZShyZXMuaGVhZGVyUGF5bG9hZFswXSl9YCk7XG4gICAgfVxuICB9XG5cbiAgX3BhcnNlQXJyYXkgKGJ1ZmZlcikge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBmb3IgKGxldCBlbmQgPSAwOyBlbmQgPCBidWZmZXIubGVuZ3RoOyBlbmQrKykge1xuICAgICAgaWYgKGJ1ZmZlcltlbmRdICE9PSBOVUxMX0RFTElNSVRFUl9DT0RFKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbSA9IGJ1ZmZlci50b1N0cmluZygndXRmOCcsIHN0YXJ0LCBlbmQpO1xuICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIC8vIFdlIHNraXAgdGhlIG51bGwgZGVsaW1ldGVyXG4gICAgICBzdGFydCA9IGVuZCArIDE7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIF9wYXJzZU9iamVjdCAoYnVmZmVyKSB7XG4gICAgY29uc3QgaXRlbXMgPSB7fTtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBjdXJyZW50S2V5O1xuICAgIGZvciAobGV0IGVuZCA9IDA7IGVuZCA8IGJ1ZmZlci5sZW5ndGg7IGVuZCsrKSB7XG4gICAgICBpZiAoYnVmZmVyW2VuZF0gIT09IE5VTExfREVMSU1JVEVSX0NPREUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtID0gYnVmZmVyLnRvU3RyaW5nKCd1dGY4Jywgc3RhcnQsIGVuZCk7XG4gICAgICBpZiAoXy5pc05pbChjdXJyZW50S2V5KSkge1xuICAgICAgICBjdXJyZW50S2V5ID0gaXRlbTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1zW2N1cnJlbnRLZXldID0gaXRlbTtcbiAgICAgICAgY3VycmVudEtleSA9IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBXZSBza2lwIHRoZSBudWxsIGRlbGltZXRlclxuICAgICAgc3RhcnQgPSBlbmQgKyAxO1xuICAgIH1cbiAgICBpZiAoY3VycmVudEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgY29ycmVjdGx5ICR7YnVmZmVyfS4gUGxlYXNlIGludmVzdGlnYXRlYCk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIF9jcmVhdGVQYWNrZXRQcm9taXNlIChtZXNzYWdlLCB0aW1lb3V0ID0gMTAwMDApIHtcbiAgICBjb25zdCBwYWNrZXROdW1iZXIgPSB0aGlzLl9wYWNrZXROdW1iZXIrKztcbiAgICBjb25zdCByZXNwb25zZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3BhY2tldE51bWJlcl0gPSByZXNvbHZlO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5pc2ggdGhlIG9wZXJhdGlvbiAnJHttZXNzYWdlfScuIEZhaWxlZCB0byByZWNlaXZlIGFueSBkYXRhIHdpdGhpbiB0aGUgJHt0aW1lb3V0fW1zIHRpbWVvdXRgKSk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge3BhY2tldE51bWJlciwgcmVzcG9uc2V9O1xuICB9XG59XG5cbmNsYXNzIEZpbGVJbmZvIHtcbiAgY29uc3RydWN0b3IgKHtzdF9zaXplLCBzdF9ibG9ja3MsIHN0X25saW5rLCBzdF9pZm10LCBzdF9tdGltZSwgc3RfYmlydGh0aW1lfSkge1xuICAgIHRoaXMuc2l6ZSA9IHBhcnNlSW50KHN0X3NpemUsIDEwKTtcbiAgICB0aGlzLmJsb2NrcyA9IHBhcnNlSW50KHN0X2Jsb2NrcywgMTApO1xuICAgIHRoaXMubmxpbmsgPSBwYXJzZUludChzdF9ubGluaywgMTApO1xuICAgIHRoaXMuaWZtdCA9IHN0X2lmbXQ7XG4gICAgLy8gbnMgdG8gbXNcbiAgICB0aGlzLm10aW1lTXMgPSBwYXJzZUludChzdF9tdGltZSwgMTApIC8gMTAwMDAwMDtcbiAgICAvLyBucyB0byBtc1xuICAgIHRoaXMuYmlydGh0aW1lTXMgPSBwYXJzZUludChzdF9iaXJ0aHRpbWUsIDEwKSAvIDEwMDAwMDA7XG4gIH1cblxuICBpc0RpcmVjdG9yeSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWZtdCA9PT0gJ1NfSUZESVInO1xuICB9XG5cbiAgaXNGaWxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5pZm10ID09PSAnU19JRlJFRyc7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQWZjU2VydmljZTtcbmV4cG9ydCB7IEFmY1NlcnZpY2UsIEFGQ19TRVJWSUNFX05BTUUgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFDQSxJQUFBQSxvQkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsV0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksV0FBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sU0FBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU8sS0FBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsT0FBQSxHQUFBVCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVMsWUFBQSxHQUFBVCxPQUFBO0FBR0EsTUFBTVUsZ0JBQWdCLEdBQUcsZUFBZTtBQUFDQyxPQUFBLENBQUFELGdCQUFBLEdBQUFBLGdCQUFBO0FBQ3pDLE1BQU1FLGNBQWMsR0FBRyxDQUFDLEdBQUdDLGFBQUU7QUFFN0IsTUFBTUMsbUJBQW1CLEdBQUcsSUFBSTtBQUNoQyxNQUFNQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO0FBRWpD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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_lengthBasedSplitter","_interopRequireDefault","require","_protocol","_streams","_afcencoder","_afcdecoder","_constants","_bluebird","_path","_lodash","_baseService","AFC_SERVICE_NAME","exports","MAX_FRAME_SIZE","MB","NULL_DELIMITER_CODE","IGNORED_PATHS","AfcService","BaseServiceSocket","constructor","socketClient","_splitter","LengthBasedSplitter","readableStream","littleEndian","maxFrameLength","lengthFieldOffset","lengthFieldLength","lengthAdjustment","_decoder","AfcDecoder","_socketClient","pipe","_encoder","AfcEncoder","_assignClientFailureHandlers","_responseCallbacks","_packetNumber","on","_handleData","bind","data","cb","packetNumber","_","noop","createDirectory","path","response","_createPacketPromise","opCode","Operations","MAKE_DIR","headerPayload","Buffer","from","write","res","_checkStatus","deleteDirectory","REMOVE_PATH_AND_CONTENTS","listDirectory","READ_DIR","DATA","_parseArray","content","openFile","mode","pathPayload","fileModePayload","alloc","writeUInt32LE","FILE_OPEN","concat","FILE_OPEN_RES","readUInt32LE","createWriteStream","filePath","opts","fileHandle","FileModes","w","AfcWritableFileStream","createReadStream","options","r","AfcReadableFileStream","closeFileHandle","FILE_CLOSE","writeFile","buffer","FILE_WRITE","readFile","length","FILE_READ","getFileInfo","GET_FILE_INFO","FileInfo","_parseObject","walkDir","dir","recursive","onPath","file","includes","relativePath","posix","join","fileInfo","isDirectory","STATUS","Error","operationCode","isEmpty","Errors","SUCCESS","errorCode","items","start","end","item","toString","push","currentKey","isNil","message","timeout","B","resolve","reject","setTimeout","st_size","st_blocks","st_nlink","st_ifmt","st_mtime","st_birthtime","size","parseInt","blocks","nlink","ifmt","mtimeMs","birthtimeMs","isFile","_default","default"],"sources":["../../../lib/afc/index.js"],"sourcesContent":["\nimport LengthBasedSplitter from '../util/transformer/length-based-splitter';\nimport { Operations, operationCode, Errors, errorCode, FileModes } from './protocol';\nimport { AfcWritableFileStream, AfcReadableFileStream } from './streams';\nimport AfcEncoder from './transformer/afcencoder';\nimport AfcDecoder from './transformer/afcdecoder';\nimport { MB } from '../constants';\nimport B from 'bluebird';\nimport path from 'path';\nimport _ from 'lodash';\nimport { BaseServiceSocket } from '../base-service';\n\n\nconst AFC_SERVICE_NAME = 'com.apple.afc';\nconst MAX_FRAME_SIZE = 1 * MB;\n\nconst NULL_DELIMITER_CODE = 0x00;\nconst IGNORED_PATHS = ['.', '..'];\n\nclass AfcService extends BaseServiceSocket {\n constructor (socketClient) {\n super(socketClient);\n\n this._splitter = new LengthBasedSplitter({\n readableStream: socketClient,\n littleEndian: true,\n maxFrameLength: MAX_FRAME_SIZE,\n lengthFieldOffset: 8,\n lengthFieldLength: 8,\n lengthAdjustment: -8,\n });\n this._decoder = new AfcDecoder();\n this._socketClient.pipe(this._splitter).pipe(this._decoder);\n\n this._encoder = new AfcEncoder();\n this._encoder.pipe(this._socketClient);\n this._assignClientFailureHandlers(this._encoder);\n\n this._responseCallbacks = {};\n\n this._packetNumber = 0;\n this._decoder.on('data', this._handleData.bind(this));\n }\n\n _handleData (data) {\n const cb = this._responseCallbacks[data.packetNumber] || _.noop;\n cb(data); // eslint-disable-line promise/prefer-await-to-callbacks\n }\n\n /**\n * Creates a directory relative to an already existing directory\n * @param {string} path The path in unix format\n */\n async createDirectory (path) {\n const {packetNumber, response} = this._createPacketPromise(`Create directory '${path}'`);\n\n const data = {\n opCode: Operations.MAKE_DIR,\n packetNumber,\n headerPayload: Buffer.from(path)\n };\n this._encoder.write(data);\n const res = await response;\n this._checkStatus(res);\n }\n\n /**\n * Deletes are directory completely even it has content inside. This is an implementation of 'rm -r {path}'\n * @param {string} path The path in unix format\n */\n async deleteDirectory (path) {\n const {packetNumber, response} = this._createPacketPromise(`Delete directory '${path}'`);\n\n const data = {\n opCode: Operations.REMOVE_PATH_AND_CONTENTS,\n packetNumber,\n headerPayload: Buffer.from(path)\n };\n this._encoder.write(data);\n const res = await response;\n this._checkStatus(res);\n }\n\n /**\n * Lists a directory's contents and returns them in an array\n * @param {string} path The path in unix format\n * @return {Array.<string>}\n */\n async listDirectory (path) {\n const {packetNumber, response} = this._createPacketPromise(`List directory '${path}'`);\n\n const data = {\n opCode: Operations.READ_DIR,\n packetNumber,\n headerPayload: Buffer.from(path)\n };\n this._encoder.write(data);\n const res = await response;\n if (res.opCode !== Operations.DATA) {\n this._checkStatus(res);\n }\n\n return this._parseArray(res.content);\n }\n\n /**\n * Opens a file and creates a file handle\n * @param {string} path The path in unix format\n * @param {number} mode The file mode that will be used\n * @return {number}\n */\n async openFile (path, mode) {\n const {packetNumber, response} = this._createPacketPromise(`Open file '${path}'`);\n\n const pathPayload = Buffer.from(path);\n const fileModePayload = Buffer.alloc(8);\n fileModePayload.writeUInt32LE(mode, 0);\n\n const data = {\n opCode: Operations.FILE_OPEN,\n packetNumber,\n headerPayload: Buffer.concat([fileModePayload, pathPayload])\n };\n this._encoder.write(data);\n const res = await response;\n if (res.opCode !== Operations.FILE_OPEN_RES) {\n this._checkStatus(res);\n }\n\n return res.headerPayload.readUInt32LE(0);\n }\n\n /**\n * Opens a file and creates a nodejs write stream\n * @param {string} filePath The path in unix format\n * @param {Object} opts The regular options that are passed to a Stream.Writable\n * @return {AfcWritableFileStream}\n */\n async createWriteStream (filePath, opts) {\n const fileHandle = await this.openFile(filePath, FileModes.w);\n return new AfcWritableFileStream(fileHandle, this, opts);\n }\n\n /**\n * Opens a file and creates a nodejs read stream\n * @param {string} filePath The path in unix format\n * @param {Object} opts The regular options that are passed to a Stream.Readable\n * @return {AfcReadableFileStream}\n */\n async createReadStream (filePath, options) {\n const fileHandle = await this.openFile(filePath, FileModes.r);\n return new AfcReadableFileStream(fileHandle, this, options);\n }\n\n /**\n * Closes the file handle\n * @param {number} fileHandle the file handle to be closed\n */\n async closeFileHandle (fileHandle) {\n const {packetNumber, response} = this._createPacketPromise(`Close file handle '${fileHandle}'`);\n\n const fileModePayload = Buffer.alloc(8);\n fileModePayload.writeUInt32LE(fileHandle, 0);\n\n const data = {\n opCode: Operations.FILE_CLOSE,\n packetNumber,\n headerPayload: fileModePayload\n };\n this._encoder.write(data);\n const res = await response;\n this._checkStatus(res);\n }\n\n /**\n * Writes the buffer into the given file handle\n * @param {number} fileHandle The file handle to be used\n * @param {Buffer} buffer The buffer that will be written\n */\n async writeFile (fileHandle, buffer) {\n const {packetNumber, response} = this._createPacketPromise(`Write to file handle '${fileHandle}'`);\n\n const headerPayload = Buffer.alloc(8);\n headerPayload.writeUInt32LE(fileHandle, 0);\n\n const data = {\n opCode: Operations.FILE_WRITE,\n packetNumber,\n headerPayload,\n content: buffer\n };\n this._encoder.write(data);\n const res = await response;\n this._checkStatus(res);\n }\n\n /**\n * Read a certain length of buffer from the file handle\n * @param {number} fileHandle The file handle to be used\n * @param {number} length The length that wants to be read from the file handle\n * @return {Buffer}\n */\n async readFile (fileHandle, length) {\n const {packetNumber, response} = this._createPacketPromise(`Read from file handle '${fileHandle}'`);\n\n const headerPayload = Buffer.alloc(16);\n headerPayload.writeUInt32LE(fileHandle, 0);\n headerPayload.writeUInt32LE(length, 8);\n\n const data = {\n opCode: Operations.FILE_READ,\n packetNumber,\n headerPayload\n };\n this._encoder.write(data);\n const res = await response;\n if (res.opCode !== Operations.DATA) {\n this._checkStatus(res);\n }\n return res.content;\n }\n\n /**\n * Get the file info of the given path\n * @param {string} path The path in unix format\n * @return {FileInfo}\n */\n async getFileInfo (path) {\n const {packetNumber, response} = this._createPacketPromise(`Get file info '${path}'`);\n\n const data = {\n opCode: Operations.GET_FILE_INFO,\n packetNumber,\n headerPayload: Buffer.from(path)\n };\n this._encoder.write(data);\n const res = await response;\n if (res.opCode !== Operations.DATA) {\n this._checkStatus(res);\n }\n return new FileInfo(this._parseObject(res.content));\n }\n\n /** The callback function which will be called during the directory walking\n * @name WalkDirCallback\n * @function\n * @param {string} itemPath The path of the file or folder\n * @param {boolean} isDirectory Shows if it is a directory or a file\n */\n\n /**\n *\n * @param {string} dir The path in unix format\n * @param {boolean} recursive Sets whether to follow sub directories or not\n * @param {WalkDirCallback} onPath The callback to be called when a new path is found\n */\n async walkDir (dir, recursive, onPath) {\n for (const file of await this.listDirectory(dir)) {\n if (IGNORED_PATHS.includes(file)) {\n continue;\n }\n const relativePath = path.posix.join(dir, file);\n const fileInfo = await this.getFileInfo(relativePath);\n const isDirectory = fileInfo.isDirectory();\n await onPath(relativePath, isDirectory);\n if (isDirectory && recursive) {\n await this.walkDir(relativePath, recursive, onPath);\n }\n }\n }\n\n _checkStatus (res) {\n if (res.opCode !== Operations.STATUS) {\n throw new Error(`Unexpected response ${operationCode(res.opCode)}`);\n }\n if (_.isEmpty(res.headerPayload)) {\n throw new Error('Header payload cannot be empty for a status response');\n }\n if (res.headerPayload[0] !== Errors.SUCCESS) {\n throw new Error(`Unexpected response ${errorCode(res.headerPayload[0])}`);\n }\n }\n\n _parseArray (buffer) {\n const items = [];\n let start = 0;\n for (let end = 0; end < buffer.length; end++) {\n if (buffer[end] !== NULL_DELIMITER_CODE) {\n continue;\n }\n const item = buffer.toString('utf8', start, end);\n items.push(item);\n // We skip the null delimeter\n start = end + 1;\n }\n return items;\n }\n\n _parseObject (buffer) {\n const items = {};\n let start = 0;\n let currentKey;\n for (let end = 0; end < buffer.length; end++) {\n if (buffer[end] !== NULL_DELIMITER_CODE) {\n continue;\n }\n const item = buffer.toString('utf8', start, end);\n if (_.isNil(currentKey)) {\n currentKey = item;\n } else {\n items[currentKey] = item;\n currentKey = null;\n }\n // We skip the null delimeter\n start = end + 1;\n }\n if (currentKey) {\n throw new Error(`Failed to parse correctly ${buffer}. Please investigate`);\n }\n return items;\n }\n\n _createPacketPromise (message, timeout = 10000) {\n const packetNumber = this._packetNumber++;\n const response = new B((resolve, reject) => {\n this._responseCallbacks[packetNumber] = resolve;\n setTimeout(function () {\n reject(new Error(`Could not finish the operation '${message}'. Failed to receive any data within the ${timeout}ms timeout`));\n }, timeout);\n });\n return {packetNumber, response};\n }\n}\n\nclass FileInfo {\n constructor ({st_size, st_blocks, st_nlink, st_ifmt, st_mtime, st_birthtime}) {\n this.size = parseInt(st_size, 10);\n this.blocks = parseInt(st_blocks, 10);\n this.nlink = parseInt(st_nlink, 10);\n this.ifmt = st_ifmt;\n // ns to ms\n this.mtimeMs = parseInt(st_mtime, 10) / 1000000;\n // ns to ms\n this.birthtimeMs = parseInt(st_birthtime, 10) / 1000000;\n }\n\n isDirectory () {\n return this.ifmt === 'S_IFDIR';\n }\n\n isFile () {\n return this.ifmt === 'S_IFREG';\n }\n}\n\nexport default AfcService;\nexport { AfcService, AFC_SERVICE_NAME };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["_lengthBasedSplitter","_interopRequireDefault","require","_protocol","_streams","_afcencoder","_afcdecoder","_constants","_bluebird","_path","_lodash","_baseService","AFC_SERVICE_NAME","exports","MAX_FRAME_SIZE","MB","NULL_DELIMITER_CODE","IGNORED_PATHS","AfcService","BaseServiceSocket","constructor","socketClient","_splitter","LengthBasedSplitter","readableStream","littleEndian","maxFrameLength","lengthFieldOffset","lengthFieldLength","lengthAdjustment","_decoder","AfcDecoder","_socketClient","pipe","_encoder","AfcEncoder","_assignClientFailureHandlers","_responseCallbacks","_packetNumber","on","_handleData","bind","data","cb","packetNumber","_","noop","createDirectory","path","response","_createPacketPromise","opCode","Operations","MAKE_DIR","headerPayload","Buffer","from","write","res","_checkStatus","deleteDirectory","REMOVE_PATH_AND_CONTENTS","listDirectory","READ_DIR","DATA","_parseArray","content","openFile","mode","pathPayload","fileModePayload","alloc","writeUInt32LE","FILE_OPEN","concat","FILE_OPEN_RES","readUInt32LE","createWriteStream","filePath","opts","fileHandle","FileModes","w","AfcWritableFileStream","createReadStream","options","r","AfcReadableFileStream","closeFileHandle","FILE_CLOSE","writeFile","buffer","FILE_WRITE","readFile","length","FILE_READ","getFileInfo","GET_FILE_INFO","FileInfo","_parseObject","walkDir","dir","recursive","onPath","file","includes","relativePath","posix","join","fileInfo","isDirectory","STATUS","Error","operationCode","isEmpty","Errors","SUCCESS","errorCode","items","start","end","item","toString","push","currentKey","isNil","message","timeout","B","resolve","reject","setTimeout","st_size","st_blocks","st_nlink","st_ifmt","st_mtime","st_birthtime","size","parseInt","blocks","nlink","ifmt","mtimeMs","birthtimeMs","isFile","_default","default"],"sources":["../../../lib/afc/index.js"],"sourcesContent":["\nimport LengthBasedSplitter from '../util/transformer/length-based-splitter';\nimport { Operations, operationCode, Errors, errorCode, FileModes } from './protocol';\nimport { AfcWritableFileStream, AfcReadableFileStream } from './streams';\nimport AfcEncoder from './transformer/afcencoder';\nimport AfcDecoder from './transformer/afcdecoder';\nimport { MB } from '../constants';\nimport B from 'bluebird';\nimport path from 'path';\nimport _ from 'lodash';\nimport { BaseServiceSocket } from '../base-service';\n\n\nconst AFC_SERVICE_NAME = 'com.apple.afc';\nconst MAX_FRAME_SIZE = 1 * MB;\n\nconst NULL_DELIMITER_CODE = 0x00;\nconst IGNORED_PATHS = ['.', '..'];\n\nclass AfcService extends BaseServiceSocket {\n constructor (socketClient) {\n super(socketClient);\n\n this._splitter = new LengthBasedSplitter({\n readableStream: socketClient,\n littleEndian: true,\n maxFrameLength: MAX_FRAME_SIZE,\n lengthFieldOffset: 8,\n lengthFieldLength: 8,\n lengthAdjustment: -8,\n });\n this._decoder = new AfcDecoder();\n this._socketClient.pipe(this._splitter).pipe(this._decoder);\n\n this._encoder = new AfcEncoder();\n this._encoder.pipe(this._socketClient);\n this._assignClientFailureHandlers(this._encoder);\n\n this._responseCallbacks = {};\n\n this._packetNumber = 0;\n this._decoder.on('data', this._handleData.bind(this));\n }\n\n _handleData (data) {\n const cb = this._responseCallbacks[data.packetNumber] || _.noop;\n cb(data); // eslint-disable-line promise/prefer-await-to-callbacks\n }\n\n /**\n * Creates a directory relative to an already existing directory\n * @param {string} path The path in unix format\n */\n async createDirectory (path) {\n const {packetNumber, response} = this._createPacketPromise(`Create directory '${path}'`);\n\n const data = {\n opCode: Operations.MAKE_DIR,\n packetNumber,\n headerPayload: Buffer.from(path)\n };\n this._encoder.write(data);\n const res = await response;\n this._checkStatus(res);\n }\n\n /**\n * Deletes are directory completely even it has content inside. This is an implementation of 'rm -r {path}'\n * @param {string} path The path in unix format\n */\n async deleteDirectory (path) {\n const {packetNumber, response} = this._createPacketPromise(`Delete directory '${path}'`);\n\n const data = {\n opCode: Operations.REMOVE_PATH_AND_CONTENTS,\n packetNumber,\n headerPayload: Buffer.from(path)\n };\n this._encoder.write(data);\n const res = await response;\n this._checkStatus(res);\n }\n\n /**\n * Lists a directory's contents and returns them in an array\n * @param {string} path The path in unix format\n * @return {Array.<string>}\n */\n async listDirectory (path) {\n const {packetNumber, response} = this._createPacketPromise(`List directory '${path}'`);\n\n const data = {\n opCode: Operations.READ_DIR,\n packetNumber,\n headerPayload: Buffer.from(path)\n };\n this._encoder.write(data);\n const res = await response;\n if (res.opCode !== Operations.DATA) {\n this._checkStatus(res);\n }\n\n return this._parseArray(res.content);\n }\n\n /**\n * Opens a file and creates a file handle\n * @param {string} path The path in unix format\n * @param {number} mode The file mode that will be used\n * @return {number}\n */\n async openFile (path, mode) {\n const {packetNumber, response} = this._createPacketPromise(`Open file '${path}'`);\n\n const pathPayload = Buffer.from(path);\n const fileModePayload = Buffer.alloc(8);\n fileModePayload.writeUInt32LE(mode, 0);\n\n const data = {\n opCode: Operations.FILE_OPEN,\n packetNumber,\n headerPayload: Buffer.concat([fileModePayload, pathPayload])\n };\n this._encoder.write(data);\n const res = await response;\n if (res.opCode !== Operations.FILE_OPEN_RES) {\n this._checkStatus(res);\n }\n\n return res.headerPayload.readUInt32LE(0);\n }\n\n /**\n * Opens a file and creates a nodejs write stream\n * @param {string} filePath The path in unix format\n * @param {Object} opts The regular options that are passed to a Stream.Writable\n * @return {AfcWritableFileStream}\n */\n async createWriteStream (filePath, opts) {\n const fileHandle = await this.openFile(filePath, FileModes.w);\n return new AfcWritableFileStream(fileHandle, this, opts);\n }\n\n /**\n * Opens a file and creates a nodejs read stream\n * @param {string} filePath The path in unix format\n * @param {Object} opts The regular options that are passed to a Stream.Readable\n * @return {AfcReadableFileStream}\n */\n async createReadStream (filePath, options) {\n const fileHandle = await this.openFile(filePath, FileModes.r);\n return new AfcReadableFileStream(fileHandle, this, options);\n }\n\n /**\n * Closes the file handle\n * @param {number} fileHandle the file handle to be closed\n */\n async closeFileHandle (fileHandle) {\n const {packetNumber, response} = this._createPacketPromise(`Close file handle '${fileHandle}'`);\n\n const fileModePayload = Buffer.alloc(8);\n fileModePayload.writeUInt32LE(fileHandle, 0);\n\n const data = {\n opCode: Operations.FILE_CLOSE,\n packetNumber,\n headerPayload: fileModePayload\n };\n this._encoder.write(data);\n const res = await response;\n this._checkStatus(res);\n }\n\n /**\n * Writes the buffer into the given file handle\n * @param {number} fileHandle The file handle to be used\n * @param {Buffer} buffer The buffer that will be written\n */\n async writeFile (fileHandle, buffer) {\n const {packetNumber, response} = this._createPacketPromise(`Write to file handle '${fileHandle}'`);\n\n const headerPayload = Buffer.alloc(8);\n headerPayload.writeUInt32LE(fileHandle, 0);\n\n const data = {\n opCode: Operations.FILE_WRITE,\n packetNumber,\n headerPayload,\n content: buffer\n };\n this._encoder.write(data);\n const res = await response;\n this._checkStatus(res);\n }\n\n /**\n * Read a certain length of buffer from the file handle\n * @param {number} fileHandle The file handle to be used\n * @param {number} length The length that wants to be read from the file handle\n * @return {Buffer}\n */\n async readFile (fileHandle, length) {\n const {packetNumber, response} = this._createPacketPromise(`Read from file handle '${fileHandle}'`);\n\n const headerPayload = Buffer.alloc(16);\n headerPayload.writeUInt32LE(fileHandle, 0);\n headerPayload.writeUInt32LE(length, 8);\n\n const data = {\n opCode: Operations.FILE_READ,\n packetNumber,\n headerPayload\n };\n this._encoder.write(data);\n const res = await response;\n if (res.opCode !== Operations.DATA) {\n this._checkStatus(res);\n }\n return res.content;\n }\n\n /**\n * Get the file info of the given path\n * @param {string} path The path in unix format\n * @return {FileInfo}\n */\n async getFileInfo (path) {\n const {packetNumber, response} = this._createPacketPromise(`Get file info '${path}'`);\n\n const data = {\n opCode: Operations.GET_FILE_INFO,\n packetNumber,\n headerPayload: Buffer.from(path)\n };\n this._encoder.write(data);\n const res = await response;\n if (res.opCode !== Operations.DATA) {\n this._checkStatus(res);\n }\n return new FileInfo(this._parseObject(res.content));\n }\n\n /** The callback function which will be called during the directory walking\n * @callback WalkDirCallback\n * @param {string} itemPath The path of the file or folder\n * @param {boolean} isDirectory Shows if it is a directory or a file\n */\n\n /**\n *\n * @param {string} dir The path in unix format\n * @param {boolean} recursive Sets whether to follow sub directories or not\n * @param {WalkDirCallback} onPath The callback to be called when a new path is found\n */\n async walkDir (dir, recursive, onPath) {\n for (const file of await this.listDirectory(dir)) {\n if (IGNORED_PATHS.includes(file)) {\n continue;\n }\n const relativePath = path.posix.join(dir, file);\n const fileInfo = await this.getFileInfo(relativePath);\n const isDirectory = fileInfo.isDirectory();\n await onPath(relativePath, isDirectory);\n if (isDirectory && recursive) {\n await this.walkDir(relativePath, recursive, onPath);\n }\n }\n }\n\n _checkStatus (res) {\n if (res.opCode !== Operations.STATUS) {\n throw new Error(`Unexpected response ${operationCode(res.opCode)}`);\n }\n if (_.isEmpty(res.headerPayload)) {\n throw new Error('Header payload cannot be empty for a status response');\n }\n if (res.headerPayload[0] !== Errors.SUCCESS) {\n throw new Error(`Unexpected response ${errorCode(res.headerPayload[0])}`);\n }\n }\n\n _parseArray (buffer) {\n const items = [];\n let start = 0;\n for (let end = 0; end < buffer.length; end++) {\n if (buffer[end] !== NULL_DELIMITER_CODE) {\n continue;\n }\n const item = buffer.toString('utf8', start, end);\n items.push(item);\n // We skip the null delimeter\n start = end + 1;\n }\n return items;\n }\n\n _parseObject (buffer) {\n const items = {};\n let start = 0;\n let currentKey;\n for (let end = 0; end < buffer.length; end++) {\n if (buffer[end] !== NULL_DELIMITER_CODE) {\n continue;\n }\n const item = buffer.toString('utf8', start, end);\n if (_.isNil(currentKey)) {\n currentKey = item;\n } else {\n items[currentKey] = item;\n currentKey = null;\n }\n // We skip the null delimeter\n start = end + 1;\n }\n if (currentKey) {\n throw new Error(`Failed to parse correctly ${buffer}. Please investigate`);\n }\n return items;\n }\n\n _createPacketPromise (message, timeout = 10000) {\n const packetNumber = this._packetNumber++;\n const response = new B((resolve, reject) => {\n this._responseCallbacks[packetNumber] = resolve;\n setTimeout(function () {\n reject(new Error(`Could not finish the operation '${message}'. Failed to receive any data within the ${timeout}ms timeout`));\n }, timeout);\n });\n return {packetNumber, response};\n }\n}\n\nclass FileInfo {\n constructor ({st_size, st_blocks, st_nlink, st_ifmt, st_mtime, st_birthtime}) {\n this.size = parseInt(st_size, 10);\n this.blocks = parseInt(st_blocks, 10);\n this.nlink = parseInt(st_nlink, 10);\n this.ifmt = st_ifmt;\n // ns to ms\n this.mtimeMs = parseInt(st_mtime, 10) / 1000000;\n // ns to ms\n this.birthtimeMs = parseInt(st_birthtime, 10) / 1000000;\n }\n\n isDirectory () {\n return this.ifmt === 'S_IFDIR';\n }\n\n isFile () {\n return this.ifmt === 'S_IFREG';\n }\n}\n\nexport default AfcService;\nexport { AfcService, AFC_SERVICE_NAME };\n"],"mappings":"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"}
@@ -30,4 +30,4 @@ class BaseServicePlist {
30
30
  }
31
31
  }
32
32
  exports.BaseServicePlist = BaseServicePlist;
33
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCYXNlU2VydmljZVNvY2tldCIsImNvbnN0cnVjdG9yIiwic29ja2V0Q2xpZW50IiwiX3NvY2tldENsaWVudCIsIl9hc3NpZ25DbGllbnRGYWlsdXJlSGFuZGxlcnMiLCJzb3VyY2VTdHJlYW1zIiwiZXZ0Iiwib25jZSIsIm1hcCIsInMiLCJ1bnBpcGUiLCJjbG9zZSIsImRlc3Ryb3llZCIsImVuZCIsImV4cG9ydHMiLCJCYXNlU2VydmljZVBsaXN0IiwicGxpc3RTZXJ2aWNlIiwiX3BsaXN0U2VydmljZSJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9iYXNlLXNlcnZpY2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgQmFzZVNlcnZpY2VTb2NrZXQge1xuICBjb25zdHJ1Y3RvciAoc29ja2V0Q2xpZW50KSB7XG4gICAgdGhpcy5fc29ja2V0Q2xpZW50ID0gc29ja2V0Q2xpZW50O1xuICB9XG5cbiAgX2Fzc2lnbkNsaWVudEZhaWx1cmVIYW5kbGVycyAoLi4uc291cmNlU3RyZWFtcykge1xuICAgIGZvciAoY29uc3QgZXZ0IGluIFsnY2xvc2UnLCAnZW5kJ10pIHtcbiAgICAgIHRoaXMuX3NvY2tldENsaWVudC5vbmNlKGV2dCxcbiAgICAgICAgKCkgPT4gc291cmNlU3RyZWFtcy5tYXAoKHMpID0+IHMudW5waXBlKHRoaXMuX3NvY2tldENsaWVudCkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHBob25lXG4gICAqL1xuICBjbG9zZSAoKSB7XG4gICAgaWYgKCF0aGlzLl9zb2NrZXRDbGllbnQuZGVzdHJveWVkKSB7XG4gICAgICB0aGlzLl9zb2NrZXRDbGllbnQuZW5kKCk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEJhc2VTZXJ2aWNlUGxpc3Qge1xuICBjb25zdHJ1Y3RvciAocGxpc3RTZXJ2aWNlKSB7XG4gICAgdGhpcy5fcGxpc3RTZXJ2aWNlID0gcGxpc3RTZXJ2aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgdW5kZXJseWluZyBzb2NrZXQgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBwaG9uZVxuICAgKi9cbiAgY2xvc2UgKCkge1xuICAgIHRoaXMuX3BsaXN0U2VydmljZS5jbG9zZSgpO1xuICB9XG59XG5cblxuZXhwb3J0IHsgQmFzZVNlcnZpY2VTb2NrZXQsIEJhc2VTZXJ2aWNlUGxpc3QgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLE1BQU1BLGlCQUFpQixDQUFDO0VBQ3RCQyxXQUFXQSxDQUFFQyxZQUFZLEVBQUU7SUFDekIsSUFBSSxDQUFDQyxhQUFhLEdBQUdELFlBQVk7RUFDbkM7RUFFQUUsNEJBQTRCQSxDQUFFLEdBQUdDLGFBQWEsRUFBRTtJQUM5QyxLQUFLLE1BQU1DLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRTtNQUNsQyxJQUFJLENBQUNILGFBQWEsQ0FBQ0ksSUFBSSxDQUFDRCxHQUFHLEVBQ3pCLE1BQU1ELGFBQWEsQ0FBQ0csR0FBRyxDQUFFQyxDQUFDLElBQUtBLENBQUMsQ0FBQ0MsTUFBTSxDQUFDLElBQUksQ0FBQ1AsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUNqRTtFQUNGO0VBS0FRLEtBQUtBLENBQUEsRUFBSTtJQUNQLElBQUksQ0FBQyxJQUFJLENBQUNSLGFBQWEsQ0FBQ1MsU0FBUyxFQUFFO01BQ2pDLElBQUksQ0FBQ1QsYUFBYSxDQUFDVSxHQUFHLEVBQUU7SUFDMUI7RUFDRjtBQUNGO0FBQUNDLE9BQUEsQ0FBQWQsaUJBQUEsR0FBQUEsaUJBQUE7QUFFRCxNQUFNZSxnQkFBZ0IsQ0FBQztFQUNyQmQsV0FBV0EsQ0FBRWUsWUFBWSxFQUFFO0lBQ3pCLElBQUksQ0FBQ0MsYUFBYSxHQUFHRCxZQUFZO0VBQ25DO0VBS0FMLEtBQUtBLENBQUEsRUFBSTtJQUNQLElBQUksQ0FBQ00sYUFBYSxDQUFDTixLQUFLLEVBQUU7RUFDNUI7QUFDRjtBQUFDRyxPQUFBLENBQUFDLGdCQUFBLEdBQUFBLGdCQUFBIn0=
33
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCYXNlU2VydmljZVNvY2tldCIsImNvbnN0cnVjdG9yIiwic29ja2V0Q2xpZW50IiwiX3NvY2tldENsaWVudCIsIl9hc3NpZ25DbGllbnRGYWlsdXJlSGFuZGxlcnMiLCJzb3VyY2VTdHJlYW1zIiwiZXZ0Iiwib25jZSIsIm1hcCIsInMiLCJ1bnBpcGUiLCJjbG9zZSIsImRlc3Ryb3llZCIsImVuZCIsImV4cG9ydHMiLCJCYXNlU2VydmljZVBsaXN0IiwicGxpc3RTZXJ2aWNlIiwiX3BsaXN0U2VydmljZSJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9iYXNlLXNlcnZpY2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgQmFzZVNlcnZpY2VTb2NrZXQge1xuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoJ25ldCcpLlNvY2tldH0gc29ja2V0Q2xpZW50XG4gICAqL1xuICBjb25zdHJ1Y3RvciAoc29ja2V0Q2xpZW50KSB7XG4gICAgdGhpcy5fc29ja2V0Q2xpZW50ID0gc29ja2V0Q2xpZW50O1xuICB9XG5cbiAgX2Fzc2lnbkNsaWVudEZhaWx1cmVIYW5kbGVycyAoLi4uc291cmNlU3RyZWFtcykge1xuICAgIGZvciAoY29uc3QgZXZ0IGluIFsnY2xvc2UnLCAnZW5kJ10pIHtcbiAgICAgIHRoaXMuX3NvY2tldENsaWVudC5vbmNlKGV2dCxcbiAgICAgICAgKCkgPT4gc291cmNlU3RyZWFtcy5tYXAoKHMpID0+IHMudW5waXBlKHRoaXMuX3NvY2tldENsaWVudCkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHBob25lXG4gICAqL1xuICBjbG9zZSAoKSB7XG4gICAgaWYgKCF0aGlzLl9zb2NrZXRDbGllbnQuZGVzdHJveWVkKSB7XG4gICAgICB0aGlzLl9zb2NrZXRDbGllbnQuZW5kKCk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEJhc2VTZXJ2aWNlUGxpc3Qge1xuICBjb25zdHJ1Y3RvciAocGxpc3RTZXJ2aWNlKSB7XG4gICAgdGhpcy5fcGxpc3RTZXJ2aWNlID0gcGxpc3RTZXJ2aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgdW5kZXJseWluZyBzb2NrZXQgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBwaG9uZVxuICAgKi9cbiAgY2xvc2UgKCkge1xuICAgIHRoaXMuX3BsaXN0U2VydmljZS5jbG9zZSgpO1xuICB9XG59XG5cblxuZXhwb3J0IHsgQmFzZVNlcnZpY2VTb2NrZXQsIEJhc2VTZXJ2aWNlUGxpc3QgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLE1BQU1BLGlCQUFpQixDQUFDO0VBSXRCQyxXQUFXQSxDQUFFQyxZQUFZLEVBQUU7SUFDekIsSUFBSSxDQUFDQyxhQUFhLEdBQUdELFlBQVk7RUFDbkM7RUFFQUUsNEJBQTRCQSxDQUFFLEdBQUdDLGFBQWEsRUFBRTtJQUM5QyxLQUFLLE1BQU1DLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRTtNQUNsQyxJQUFJLENBQUNILGFBQWEsQ0FBQ0ksSUFBSSxDQUFDRCxHQUFHLEVBQ3pCLE1BQU1ELGFBQWEsQ0FBQ0csR0FBRyxDQUFFQyxDQUFDLElBQUtBLENBQUMsQ0FBQ0MsTUFBTSxDQUFDLElBQUksQ0FBQ1AsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUNqRTtFQUNGO0VBS0FRLEtBQUtBLENBQUEsRUFBSTtJQUNQLElBQUksQ0FBQyxJQUFJLENBQUNSLGFBQWEsQ0FBQ1MsU0FBUyxFQUFFO01BQ2pDLElBQUksQ0FBQ1QsYUFBYSxDQUFDVSxHQUFHLEVBQUU7SUFDMUI7RUFDRjtBQUNGO0FBQUNDLE9BQUEsQ0FBQWQsaUJBQUEsR0FBQUEsaUJBQUE7QUFFRCxNQUFNZSxnQkFBZ0IsQ0FBQztFQUNyQmQsV0FBV0EsQ0FBRWUsWUFBWSxFQUFFO0lBQ3pCLElBQUksQ0FBQ0MsYUFBYSxHQUFHRCxZQUFZO0VBQ25DO0VBS0FMLEtBQUtBLENBQUEsRUFBSTtJQUNQLElBQUksQ0FBQ00sYUFBYSxDQUFDTixLQUFLLEVBQUU7RUFDNUI7QUFDRjtBQUFDRyxPQUFBLENBQUFDLGdCQUFBLEdBQUFBLGdCQUFBIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"base-service.js","names":["BaseServiceSocket","constructor","socketClient","_socketClient","_assignClientFailureHandlers","sourceStreams","evt","once","map","s","unpipe","close","destroyed","end","exports","BaseServicePlist","plistService","_plistService"],"sources":["../../lib/base-service.js"],"sourcesContent":["class BaseServiceSocket {\n constructor (socketClient) {\n this._socketClient = socketClient;\n }\n\n _assignClientFailureHandlers (...sourceStreams) {\n for (const evt in ['close', 'end']) {\n this._socketClient.once(evt,\n () => sourceStreams.map((s) => s.unpipe(this._socketClient)));\n }\n }\n\n /**\n * Closes the underlying socket communicating with the phone\n */\n close () {\n if (!this._socketClient.destroyed) {\n this._socketClient.end();\n }\n }\n}\n\nclass BaseServicePlist {\n constructor (plistService) {\n this._plistService = plistService;\n }\n\n /**\n * Closes the underlying socket communicating with the phone\n */\n close () {\n this._plistService.close();\n }\n}\n\n\nexport { BaseServiceSocket, BaseServicePlist };\n"],"mappings":";;;;;;;AAAA,MAAMA,iBAAiB,CAAC;EACtBC,WAAWA,CAAEC,YAAY,EAAE;IACzB,IAAI,CAACC,aAAa,GAAGD,YAAY;EACnC;EAEAE,4BAA4BA,CAAE,GAAGC,aAAa,EAAE;IAC9C,KAAK,MAAMC,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;MAClC,IAAI,CAACH,aAAa,CAACI,IAAI,CAACD,GAAG,EACzB,MAAMD,aAAa,CAACG,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,MAAM,CAAC,IAAI,CAACP,aAAa,CAAC,CAAC,CAAC;IACjE;EACF;EAKAQ,KAAKA,CAAA,EAAI;IACP,IAAI,CAAC,IAAI,CAACR,aAAa,CAACS,SAAS,EAAE;MACjC,IAAI,CAACT,aAAa,CAACU,GAAG,EAAE;IAC1B;EACF;AACF;AAACC,OAAA,CAAAd,iBAAA,GAAAA,iBAAA;AAED,MAAMe,gBAAgB,CAAC;EACrBd,WAAWA,CAAEe,YAAY,EAAE;IACzB,IAAI,CAACC,aAAa,GAAGD,YAAY;EACnC;EAKAL,KAAKA,CAAA,EAAI;IACP,IAAI,CAACM,aAAa,CAACN,KAAK,EAAE;EAC5B;AACF;AAACG,OAAA,CAAAC,gBAAA,GAAAA,gBAAA"}
1
+ {"version":3,"file":"base-service.js","names":["BaseServiceSocket","constructor","socketClient","_socketClient","_assignClientFailureHandlers","sourceStreams","evt","once","map","s","unpipe","close","destroyed","end","exports","BaseServicePlist","plistService","_plistService"],"sources":["../../lib/base-service.js"],"sourcesContent":["class BaseServiceSocket {\n /**\n * @param {import('net').Socket} socketClient\n */\n constructor (socketClient) {\n this._socketClient = socketClient;\n }\n\n _assignClientFailureHandlers (...sourceStreams) {\n for (const evt in ['close', 'end']) {\n this._socketClient.once(evt,\n () => sourceStreams.map((s) => s.unpipe(this._socketClient)));\n }\n }\n\n /**\n * Closes the underlying socket communicating with the phone\n */\n close () {\n if (!this._socketClient.destroyed) {\n this._socketClient.end();\n }\n }\n}\n\nclass BaseServicePlist {\n constructor (plistService) {\n this._plistService = plistService;\n }\n\n /**\n * Closes the underlying socket communicating with the phone\n */\n close () {\n this._plistService.close();\n }\n}\n\n\nexport { BaseServiceSocket, BaseServicePlist };\n"],"mappings":";;;;;;;AAAA,MAAMA,iBAAiB,CAAC;EAItBC,WAAWA,CAAEC,YAAY,EAAE;IACzB,IAAI,CAACC,aAAa,GAAGD,YAAY;EACnC;EAEAE,4BAA4BA,CAAE,GAAGC,aAAa,EAAE;IAC9C,KAAK,MAAMC,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;MAClC,IAAI,CAACH,aAAa,CAACI,IAAI,CAACD,GAAG,EACzB,MAAMD,aAAa,CAACG,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,MAAM,CAAC,IAAI,CAACP,aAAa,CAAC,CAAC,CAAC;IACjE;EACF;EAKAQ,KAAKA,CAAA,EAAI;IACP,IAAI,CAAC,IAAI,CAACR,aAAa,CAACS,SAAS,EAAE;MACjC,IAAI,CAACT,aAAa,CAACU,GAAG,EAAE;IAC1B;EACF;AACF;AAACC,OAAA,CAAAd,iBAAA,GAAAA,iBAAA;AAED,MAAMe,gBAAgB,CAAC;EACrBd,WAAWA,CAAEe,YAAY,EAAE;IACzB,IAAI,CAACC,aAAa,GAAGD,YAAY;EACnC;EAKAL,KAAKA,CAAA,EAAI;IACP,IAAI,CAACM,aAAa,CAACN,KAAK,EAAE;EAC5B;AACF;AAACG,OAAA,CAAAC,gBAAA,GAAAA,gBAAA"}
@@ -299,4 +299,4 @@ class DTXMessage {
299
299
  }
300
300
  }
301
301
  exports.DTXMessage = DTXMessage;
302
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbnNrZXllZCIsInJlcXVpcmUiLCJfYnBsaXN0UGFyc2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9sb2Rhc2giLCJEVFhfTUVTU0FHRV9QQVlMT0FEX0hFQURFUl9MRU5HVEgiLCJleHBvcnRzIiwiRFRYX01FU1NBR0VfSEVBREVSX0xFTkdUSCIsIkRUWF9NRVNTQUdFX0hFQURFUl9NQUdJQyIsIkRUWF9NRVNTQUdFX0hFQURFUl9NQUdJQ19MRU4iLCJEVFhfTUVTU0FHRV9BVVhfSEVBREVSIiwiRFRYX0FVWElMSUFSWV9NQUdJQyIsIkZMQUdfVFlQRVMiLCJPYmplY3QiLCJmcmVlemUiLCJwdXNoIiwicmVjdiIsInNlbmQiLCJyZXBseSIsIkFVWF9UWVBFUyIsIlRleHQiLCJOU0tleWVkIiwiVUludDMyTEUiLCJCaWdVSW50NjRMRSIsIkJpZ0ludDY0TEUiLCJEVFhNZXNzYWdlSGVhZGVyIiwiYnVpbGQiLCJkYXRhIiwibWVzc2FnZUhlYWRlciIsIkJ1ZmZlciIsImFsbG9jIiwid3JpdGVVSW50MzJMRSIsIndyaXRlVUludDE2TEUiLCJwYXlsb2FkTGVuZ3RoIiwiaWRlbnRpZmllciIsImNvbnZlcnNhdGlvbkluZGV4IiwiY2hhbm5lbENvZGUiLCJleHBlY3RzUmVwbHkiLCJwYXJzZSIsImhlYWRlckJ1ZmZlciIsIm1hZ2ljIiwicmVhZFVJbnQzMkxFIiwiaGVhZGVyTGVuZ3RoIiwiZnJhZ21lbnRJZCIsInJlYWRVSW50MTZMRSIsImZyYWdtZW50Q291bnQiLCJjaGFubmVsIiwiRFRYTWVzc2FnZVBheWxvYWRIZWFkZXIiLCJmbGFncyIsImF1eExlbmd0aCIsIndyaXRlQmlnVUludDY0TEUiLCJ0b3RhbExlbmd0aCIsInJlYWRCaWdJbnQ2NExFIiwiRFRYTWVzc2FnZUF1eCIsImNvbnN0cnVjdG9yIiwiRFRYTWVzc2FnZUF1eEJ1ZmZlciIsImdldEJ5dGVzIiwibWVzc2FnZUF1eCIsImJ1ZiIsImFyZyIsImNvbmNhdCIsIl8iLCJpc051bWJlciIsImFwcGVuZEludCIsImFwcGVuZExvbmciLCJhcHBlbmRPYmplY3QiLCJwYXlsb2FkSGVhZGVyIiwiY3Vyc29yIiwibGVuZ3RoIiwibSIsIkVycm9yIiwidHlwZSIsInN0ckxlbiIsInNsaWNlIiwiYXJjaGl2ZWRfZGF0YSIsInVuYXJjaGl2ZSIsInJlYWRCaWdVSW50NjRMRSIsIkluc3RydW1lbnRSUENQYXJzZUVycm9yIiwiX2J1ZiIsInZhbHVlIiwiYXBwZW5kU2lnbmVkSW50Iiwid3JpdGVJbnQzMkxFIiwiYXBwZW5kU2lnbmVkTG9uZyIsIndyaXRlQmlnSW50NjRMRSIsImFyY2hpdmUiLCJidWYyIiwib3V0IiwiRFRYTWVzc2FnZSIsIm9wdHMiLCJzZWxlY3RvciIsIl9tZXNzYWdlSGVhZGVyIiwidW5kZWZpbmVkIiwiX3BheWxvYWRIZWFkZXIiLCJfaWRlbnRpZmllciIsIl9jaGFubmVsQ29kZSIsIl9leHBlY3RzUmVwbHkiLCJfc2VsZWN0b3IiLCJfY29udmVyc2F0aW9uSW5kZXgiLCJfZmxhZ3MiLCJhdXhpbGlhcmllcyIsIl90aGlzJF9tZXNzYWdlSGVhZGVyIiwiX3RoaXMkX21lc3NhZ2VIZWFkZXIyIiwiX3RoaXMkX21lc3NhZ2VIZWFkZXIzIiwiX3RoaXMkX21lc3NhZ2VIZWFkZXI0Iiwic2VsIiwiYXV4IiwiQmlnSW50IiwiaGVhZGVyQnVmIiwicGF5bG9hZEJ1ZiIsInJldCIsImZ1biIsInBsaXN0bGliIiwicGFyc2VCdWZmZXIiLCJlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2luc3RydW1lbnQvaGVhZGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FyY2hpdmUsIHVuYXJjaGl2ZX0gZnJvbSAnLi90cmFuc2Zvcm1lci9uc2tleWVkJztcbmltcG9ydCBwbGlzdGxpYiBmcm9tICdicGxpc3QtcGFyc2VyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmNvbnN0IERUWF9NRVNTQUdFX1BBWUxPQURfSEVBREVSX0xFTkdUSCA9IDE2O1xuY29uc3QgRFRYX01FU1NBR0VfSEVBREVSX0xFTkdUSCA9IDMyO1xuY29uc3QgRFRYX01FU1NBR0VfSEVBREVSX01BR0lDID0gMHgxRjNENUI3OTtcbmNvbnN0IERUWF9NRVNTQUdFX0hFQURFUl9NQUdJQ19MRU4gPSA0O1xuY29uc3QgRFRYX01FU1NBR0VfQVVYX0hFQURFUiA9IDB4MDFGMDtcbmNvbnN0IERUWF9BVVhJTElBUllfTUFHSUMgPSAweGE7XG5cbmNvbnN0IEZMQUdfVFlQRVMgPSBPYmplY3QuZnJlZXplKHtcbiAgcHVzaDogMCxcbiAgcmVjdjogMSxcbiAgc2VuZDogMixcbiAgcmVwbHk6IDNcbn0pO1xuXG5jb25zdCBBVVhfVFlQRVMgPSBPYmplY3QuZnJlZXplKHtcbiAgVGV4dDogMSxcbiAgTlNLZXllZDogMixcbiAgVUludDMyTEU6IDMsXG4gIEJpZ1VJbnQ2NExFOiA0LFxuICBCaWdJbnQ2NExFOiA2XG59KTtcblxuLyoqXG4gKiBEVFhNZXNzYWdlSGVhZGVyIGxlbmd0aCAzMlxuICogc3RydWN0IERUWE1lc3NhZ2VIZWFkZXIge1xuICogICAgIHUzMiBtYWdpYyBEVFhfTUVTU0FHRV9IRUFERVJfTUFHSUNcbiAqICAgICB1MzIgaGVhZGVyTGVuZ3RoXG4gKiAgICAgdTE2IGZyYWdtZW50SWQgICBwYWNrZXQgbnVtYmVyXG4gKiAgICAgdTE2IGZyYWdtZW50Q291bnQgIHBhY2tldHMgdG90YWwgbnVtYmVyXG4gKiAgICAgdTMyIHBheWxvYWRMZW5ndGhcbiAqICAgICB1MzIgaWRlbnRpZmllclxuICogICAgIHUzMiBjb252ZXJzYXRpb25JbmRleFxuICogICAgIHUzMiBjaGFubmVsXG4gKiAgICAgdTMyIGV4cGVjdHNSZXBseVxuICogICAgIH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERUWE1lc3NhZ2VPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gaWRlbnRpZmllciBwYWNrZXQgdHJhbnNtaXNzaW9uIHNlcXVlbmNlLCB0aGlzIHZhbHVlIGlzIGluY3JlbWVudGVkIGZvciBlYWNoIHJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjaGFubmVsQ29kZSB0aGUgZGF0YSB0cmFuc21pc3Npb24gb2YgdGhlIHNlcnZpY2Ugd2lsbCB1c2UgdGhpcyBjaGFubmVsIGNvZGUuXG4gKiBFYWNoIHNlcnZpY2UgaGFzIGEgc2VwYXJhdGUgY2hhbm5lbFxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBwYXlsb2FkTGVuZ3RoIERUWE1lc3NhZ2VBdXhCdWZmZXIubGVuZ3RoKG51bGxhYmxlKSArIHNlbGVjdG9yQnVmZmVyLmxlbmd0aChudWxsYWJsZSlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZXhwZWN0c1JlcGx5IGlmIHRydWUgcmVwbHkgYSBhY2sgbWVzc2FnZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvbnZlcnNhdGlvbkluZGV4ICByYXcgZGF0YSArMSBpbmRpY2F0ZSBhIHJlcGx5IG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBmbGFncyBtZXNzYWdlIHN0YXR1c1xuICovXG5cbmNsYXNzIERUWE1lc3NhZ2VIZWFkZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtEVFhNZXNzYWdlT3B0aW9uc30gZGF0YVxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSBEVFhNZXNzYWdlSGVhZGVyQnVmZmVyXG4gICAqL1xuICBzdGF0aWMgYnVpbGQgKGRhdGEpIHtcbiAgICBjb25zdCBtZXNzYWdlSGVhZGVyID0gQnVmZmVyLmFsbG9jKERUWF9NRVNTQUdFX0hFQURFUl9MRU5HVEgpO1xuICAgIG1lc3NhZ2VIZWFkZXIud3JpdGVVSW50MzJMRShEVFhfTUVTU0FHRV9IRUFERVJfTUFHSUMsIDApO1xuICAgIG1lc3NhZ2VIZWFkZXIud3JpdGVVSW50MzJMRShEVFhfTUVTU0FHRV9IRUFERVJfTEVOR1RILCA0KTtcbiAgICBtZXNzYWdlSGVhZGVyLndyaXRlVUludDE2TEUoMCwgOCk7XG4gICAgbWVzc2FnZUhlYWRlci53cml0ZVVJbnQxNkxFKDEsIDEwKTtcbiAgICBtZXNzYWdlSGVhZGVyLndyaXRlVUludDMyTEUoZGF0YS5wYXlsb2FkTGVuZ3RoLCAxMik7XG4gICAgbWVzc2FnZUhlYWRlci53cml0ZVVJbnQzMkxFKGRhdGEuaWRlbnRpZmllciwgMTYpO1xuICAgIG1lc3NhZ2VIZWFkZXIud3JpdGVVSW50MzJMRShkYXRhLmNvbnZlcnNhdGlvbkluZGV4LCAyMCk7XG4gICAgbWVzc2FnZUhlYWRlci53cml0ZVVJbnQzMkxFKGRhdGEuY2hhbm5lbENvZGUsIDI0KTtcbiAgICBtZXNzYWdlSGVhZGVyLndyaXRlVUludDMyTEUoZGF0YS5leHBlY3RzUmVwbHksIDI4KTtcbiAgICByZXR1cm4gbWVzc2FnZUhlYWRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gaGVhZGVyQnVmZmVyIERUWE1lc3NhZ2VIZWFkZXJCdWZmZXJcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBwYXJzZSAoaGVhZGVyQnVmZmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1hZ2ljOiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDApLFxuICAgICAgaGVhZGVyTGVuZ3RoOiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDQpLFxuICAgICAgZnJhZ21lbnRJZDogaGVhZGVyQnVmZmVyLnJlYWRVSW50MTZMRSg4KSxcbiAgICAgIGZyYWdtZW50Q291bnQ6IGhlYWRlckJ1ZmZlci5yZWFkVUludDE2TEUoMTApLFxuICAgICAgcGF5bG9hZExlbmd0aDogaGVhZGVyQnVmZmVyLnJlYWRVSW50MzJMRSgxMiksXG4gICAgICBpZGVudGlmaWVyOiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDE2KSxcbiAgICAgIGNvbnZlcnNhdGlvbkluZGV4OiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDIwKSxcbiAgICAgIGNoYW5uZWw6IGhlYWRlckJ1ZmZlci5yZWFkVUludDMyTEUoMjQpLFxuICAgICAgZXhwZWN0c1JlcGx5OiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDI4KSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogRFRYTWVzc2FnZVBheWxvYWRIZWFkZXIgbGVuZ3RoIDE2XG4gKiBzdHJ1Y3QgRFRYTWVzc2FnZUhlYWRlciB7XG4gKiAgICAgdTMyIGZsYWdzIEZMQUdfVFlQRVNcbiAqICAgICB1MzIgYXV4TGVuZ3RoXG4gKiAgICAgdTY0IHRvdGFsTGVuZ3RoXG4gKiAgICAgfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRFRYTWVzc2FnZVBheWxvYWRIZWFkZXJPYmplY3RcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBmbGFncyBtZXNzYWdlIHN0YXR1c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGF1eExlbmd0aCBEVFhNZXNzYWdlQXV4QnVmZmVyLmxlbmd0aChudWxsYWJsZSlcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSB0b3RhbExlbmd0aCBEVFhNZXNzYWdlQXV4QnVmZmVyLmxlbmd0aChudWxsYWJsZSkgKyBzZWxlY3RvckJ1ZmZlci5sZW5ndGhcbiAqL1xuY2xhc3MgRFRYTWVzc2FnZVBheWxvYWRIZWFkZXIge1xuICAvKipcbiAgICogQHBhcmFtIGRhdGEge0RUWE1lc3NhZ2VQYXlsb2FkSGVhZGVyT2JqZWN0fVxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSBEVFhNZXNzYWdlUGF5bG9hZEhlYWRlckJ1ZmZlclxuICAgKi9cbiAgc3RhdGljIGJ1aWxkIChkYXRhKSB7XG4gICAgY29uc3QgbWVzc2FnZUhlYWRlciA9IEJ1ZmZlci5hbGxvYyhEVFhfTUVTU0FHRV9QQVlMT0FEX0hFQURFUl9MRU5HVEgpO1xuICAgIG1lc3NhZ2VIZWFkZXIud3JpdGVVSW50MzJMRShkYXRhLmZsYWdzLCAwKTtcbiAgICBtZXNzYWdlSGVhZGVyLndyaXRlVUludDMyTEUoZGF0YS5hdXhMZW5ndGgsIDQpO1xuICAgIG1lc3NhZ2VIZWFkZXIud3JpdGVCaWdVSW50NjRMRShkYXRhLnRvdGFsTGVuZ3RoLCA4KTtcbiAgICByZXR1cm4gbWVzc2FnZUhlYWRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gaGVhZGVyQnVmZmVyXG4gICAqIEByZXR1cm5zIHtEVFhNZXNzYWdlUGF5bG9hZEhlYWRlck9iamVjdH1cbiAgICovXG4gIHN0YXRpYyBwYXJzZSAoaGVhZGVyQnVmZmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZsYWdzOiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDApLFxuICAgICAgYXV4TGVuZ3RoOiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDQpLFxuICAgICAgdG90YWxMZW5ndGg6IGhlYWRlckJ1ZmZlci5yZWFkQmlnSW50NjRMRSg4KVxuICAgIH07XG4gIH1cbn1cblxuXG5jbGFzcyBEVFhNZXNzYWdlQXV4IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55W10gfCBEVFhNZXNzYWdlQXV4QnVmZmVyfSBkYXRhXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoZGF0YSA9IFtdKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKUyBBcnJheSB0byBBcHBsZSBOU0tleWVkIEJ1ZmZlclxuICAgKiBAcmV0dXJucyB7QnVmZmVyfVxuICAgKi9cbiAgYnVpbGQgKCkge1xuICAgIGlmICh0aGlzLmRhdGEgaW5zdGFuY2VvZiBEVFhNZXNzYWdlQXV4QnVmZmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhLmdldEJ5dGVzKCk7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VBdXggPSBuZXcgRFRYTWVzc2FnZUF1eEJ1ZmZlcigpO1xuICAgIGxldCBidWYgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5kYXRhKSB7XG4gICAgICBpZiAoYXJnIGluc3RhbmNlb2YgRFRYTWVzc2FnZUF1eEJ1ZmZlcikge1xuICAgICAgICBidWYgPSBCdWZmZXIuY29uY2F0KFtidWYsIGFyZy5nZXRCeXRlcygpXSk7XG4gICAgICB9IGVsc2UgaWYgKF8uaXNOdW1iZXIoYXJnKSkge1xuICAgICAgICBtZXNzYWdlQXV4LmFwcGVuZEludChhcmcpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnID09ICdiaWdpbnQnKSB7XG4gICAgICAgIG1lc3NhZ2VBdXguYXBwZW5kTG9uZyhhcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVzc2FnZUF1eC5hcHBlbmRPYmplY3QoYXJnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2J1ZiwgbWVzc2FnZUF1eC5nZXRCeXRlcygpXSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIG5za2V5ZWQgQnVmZmVyIGludG8ganMgYXJyYXlcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWRlckJ1ZmZlclxuICAgKiBAcGFyYW0ge0RUWE1lc3NhZ2VQYXlsb2FkSGVhZGVyT2JqZWN0fSBwYXlsb2FkSGVhZGVyXG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIHN0YXRpYyBwYXJzZSAoaGVhZGVyQnVmZmVyLCBwYXlsb2FkSGVhZGVyKSB7XG4gICAgbGV0IGN1cnNvciA9IDA7XG4gICAgY29uc3QgZGF0YSA9IFtdO1xuICAgIGNvbnN0IGxlbmd0aCA9IGhlYWRlckJ1ZmZlci5yZWFkQmlnSW50NjRMRSg4KTtcbiAgICBjdXJzb3IgKz0gMTY7XG4gICAgd2hpbGUgKGN1cnNvciA8PSBsZW5ndGgpIHtcbiAgICAgIGlmIChwYXlsb2FkSGVhZGVyLmZsYWdzICE9PSBGTEFHX1RZUEVTLnB1c2gpIHtcbiAgICAgICAgY29uc3QgbSA9IGhlYWRlckJ1ZmZlci5yZWFkVUludDMyTEUoY3Vyc29yKTtcbiAgICAgICAgY3Vyc29yICs9IDQ7XG4gICAgICAgIGlmIChtICE9PSBEVFhfQVVYSUxJQVJZX01BR0lDKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbmNvcnJlY3QgYXV4aWxpYXJ5IG1hZ2ljOiAke219YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHR5cGUgPSBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKGN1cnNvcik7XG4gICAgICBjdXJzb3IgKz0gNDtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIEFVWF9UWVBFUy5UZXh0OiB7XG4gICAgICAgICAgY29uc3Qgc3RyTGVuID0gaGVhZGVyQnVmZmVyLnJlYWRVSW50MzJMRShjdXJzb3IpO1xuICAgICAgICAgIGN1cnNvciArPSA0O1xuICAgICAgICAgIGRhdGEucHVzaChoZWFkZXJCdWZmZXIuc2xpY2UoY3Vyc29yLCBjdXJzb3IgKyBzdHJMZW4pKTtcbiAgICAgICAgICBjdXJzb3IgKz0gc3RyTGVuO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgQVVYX1RZUEVTLk5TS2V5ZWQ6IHtcbiAgICAgICAgICBjb25zdCBzdHJMZW4gPSBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKGN1cnNvcik7XG4gICAgICAgICAgY3Vyc29yICs9IDQ7XG4gICAgICAgICAgY29uc3QgYXJjaGl2ZWRfZGF0YSA9IGhlYWRlckJ1ZmZlci5zbGljZShjdXJzb3IsIGN1cnNvciArIHN0ckxlbik7XG4gICAgICAgICAgZGF0YS5wdXNoKHVuYXJjaGl2ZShhcmNoaXZlZF9kYXRhKSk7XG4gICAgICAgICAgY3Vyc29yICs9IHN0ckxlbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIEFVWF9UWVBFUy5VSW50MzJMRTpcbiAgICAgICAgICBkYXRhLnB1c2goaGVhZGVyQnVmZmVyLnJlYWRVSW50MzJMRShjdXJzb3IpKTtcbiAgICAgICAgICBjdXJzb3IgKz0gNDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBVVhfVFlQRVMuQmlnVUludDY0TEU6XG4gICAgICAgICAgZGF0YS5wdXNoKGhlYWRlckJ1ZmZlci5yZWFkQmlnVUludDY0TEUoY3Vyc29yKSk7XG4gICAgICAgICAgY3Vyc29yICs9IDg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQVVYX1RZUEVTLkJpZ0ludDY0TEU6XG4gICAgICAgICAgZGF0YS5wdXNoKGhlYWRlckJ1ZmZlci5yZWFkQmlnSW50NjRMRShjdXJzb3IpKTtcbiAgICAgICAgICBjdXJzb3IgKz0gODtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHlwZSAke3R5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG59XG5cbmNsYXNzIEluc3RydW1lbnRSUENQYXJzZUVycm9yIHtcbiAgY29uc3RydWN0b3IgKGRhdGEpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICB9XG59XG5cbmNsYXNzIERUWE1lc3NhZ2VBdXhCdWZmZXIge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5fYnVmID0gQnVmZmVyLmFsbG9jKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgKi9cbiAgYXBwZW5kSW50ICh2YWx1ZSkge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5hbGxvYygxMik7XG4gICAgYnVmLndyaXRlVUludDMyTEUoRFRYX0FVWElMSUFSWV9NQUdJQywgMCk7XG4gICAgYnVmLndyaXRlVUludDMyTEUoMywgNCk7XG4gICAgYnVmLndyaXRlVUludDMyTEUodmFsdWUsIDgpO1xuICAgIHRoaXMuX2J1ZiA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZiwgYnVmXSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtiaWdpbnR9IHZhbHVlXG4gICAqL1xuICBhcHBlbmRMb25nICh2YWx1ZSkge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5hbGxvYygxNik7XG4gICAgYnVmLndyaXRlVUludDMyTEUoRFRYX0FVWElMSUFSWV9NQUdJQywgMCk7XG4gICAgYnVmLndyaXRlVUludDMyTEUoNCwgNCk7XG4gICAgYnVmLndyaXRlQmlnVUludDY0TEUodmFsdWUsIDgpO1xuICAgIHRoaXMuX2J1ZiA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZiwgYnVmXSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqL1xuICBhcHBlbmRTaWduZWRJbnQgKHZhbHVlKSB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmFsbG9jKDEyKTtcbiAgICBidWYud3JpdGVVSW50MzJMRShEVFhfQVVYSUxJQVJZX01BR0lDLCAwKTtcbiAgICBidWYud3JpdGVVSW50MzJMRSgzLCA0KTtcbiAgICBidWYud3JpdGVJbnQzMkxFKHZhbHVlLCA4KTtcbiAgICB0aGlzLl9idWYgPSBCdWZmZXIuY29uY2F0KFt0aGlzLl9idWYsIGJ1Zl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YmlnaW50fSB2YWx1ZVxuICAgKi9cbiAgYXBwZW5kU2lnbmVkTG9uZyAodmFsdWUpIHtcbiAgICBjb25zdCBidWYgPSBCdWZmZXIuYWxsb2MoMTYpO1xuICAgIGJ1Zi53cml0ZVVJbnQzMkxFKERUWF9BVVhJTElBUllfTUFHSUMsIDApO1xuICAgIGJ1Zi53cml0ZVVJbnQzMkxFKDYsIDQpO1xuICAgIGJ1Zi53cml0ZUJpZ0ludDY0TEUodmFsdWUsIDgpO1xuICAgIHRoaXMuX2J1ZiA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZiwgYnVmXSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlXG4gICAqL1xuICBhcHBlbmRPYmplY3QgKHZhbHVlKSB7XG4gICAgY29uc3QgYnVmID0gYXJjaGl2ZSh2YWx1ZSk7XG4gICAgY29uc3QgYnVmMiA9IEJ1ZmZlci5hbGxvYygxMik7XG4gICAgYnVmMi53cml0ZVVJbnQzMkxFKERUWF9BVVhJTElBUllfTUFHSUMsIDApO1xuICAgIGJ1ZjIud3JpdGVVSW50MzJMRSgyLCA0KTtcbiAgICBidWYyLndyaXRlVUludDMyTEUoYnVmLmxlbmd0aCwgOCk7XG4gICAgdGhpcy5fYnVmID0gQnVmZmVyLmNvbmNhdChbdGhpcy5fYnVmLCBidWYyLCBidWZdKTtcbiAgfVxuXG4gIGdldEJ5dGVzICgpIHtcbiAgICBjb25zdCBvdXQgPSBCdWZmZXIuYWxsb2MoMTYpO1xuICAgIG91dC53cml0ZVVJbnQzMkxFKERUWF9NRVNTQUdFX0FVWF9IRUFERVIsIDApO1xuICAgIG91dC53cml0ZVVJbnQzMkxFKHRoaXMuX2J1Zi5sZW5ndGgsIDgpO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtvdXQsIHRoaXMuX2J1Zl0pO1xuICB9XG59XG5cblxuXG5jbGFzcyBEVFhNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7RFRYTWVzc2FnZU9wdGlvbnN9IG9wdHNcbiAgICovXG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBpZGVudGlmaWVyLFxuICAgICAgY2hhbm5lbENvZGUsXG4gICAgICBzZWxlY3RvcixcbiAgICAgIGV4cGVjdHNSZXBseSxcbiAgICAgIGNvbnZlcnNhdGlvbkluZGV4ID0gMCxcbiAgICAgIGZsYWdzID0gRkxBR19UWVBFUy5zZW5kXG4gICAgfSA9IG9wdHM7XG4gICAgdGhpcy5fbWVzc2FnZUhlYWRlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9wYXlsb2FkSGVhZGVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2lkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMuX2NoYW5uZWxDb2RlID0gY2hhbm5lbENvZGU7XG4gICAgdGhpcy5fZXhwZWN0c1JlcGx5ID0gZXhwZWN0c1JlcGx5O1xuICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgdGhpcy5fY29udmVyc2F0aW9uSW5kZXggPSBjb252ZXJzYXRpb25JbmRleDtcbiAgICB0aGlzLl9mbGFncyA9IGZsYWdzO1xuICAgIHRoaXMuYXV4aWxpYXJpZXMgPSBuZXcgRFRYTWVzc2FnZUF1eCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBEVFhNZXNzYWdlSGVhZGVyIGlkZW50aWZpZXIuIFBhY2tldCB0cmFuc21pc3Npb24gc2VxdWVuY2VcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldCBpZGVudGlmaWVyICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUhlYWRlcj8uaWRlbnRpZmllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgRFRYTWVzc2FnZUhlYWRlciBjaGFubmVsQ29kZS5cbiAgICogUGFja2V0IHRyYW5zbWlzc2lvbiBjaGFubmVsQ29kZS4gVXNlIHRoaXMgdmFsdWUgdG8gZGlzdGluZ3Vpc2ggd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgY2hhbm5lbHNcbiAgICogY2FsbCB0aGlzIG1ldGhvZCBgSW5zdHJ1bWVudFNlcnZpY2UucmVnaXN0ZXJDaGFubmVsQ2FsbGJhY2tgIGdldCB0aGUgY2hhbm5lbCBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgY2hhbm5lbENvZGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlSGVhZGVyPy5jaGFubmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBEVFhNZXNzYWdlSGVhZGVyIGV4cGVjdHNSZXBseS4gV2hldGhlciB0byBuZWVkIGFjayBtZXNzYWdlXG4gICAqIGlmIGV4cGVjdHNSZXBseSBpcyB0cnVlIG11c3QgcmVwbHkgYWNrIG1lc3NhZ2VcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgZXhwZWN0c1JlcGx5ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUhlYWRlcj8uZXhwZWN0c1JlcGx5O1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwgdGhpcyBtZXRob2QgYEluc3RydW1lbnRTZXJ2aWNlLnJlZ2lzdGVyU2VsZWN0b3JDYWxsYmFja2AgZ2V0IHRoZSBzZWxlY3RvciBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHsqfSBVbmtub3duIGRhdGFcbiAgICovXG4gIGdldCBzZWxlY3RvciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBzZXQgc2VsZWN0b3IgKGRhdGEpIHtcbiAgICB0aGlzLl9zZWxlY3RvciA9IGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IERUWE1lc3NhZ2VIZWFkZXIgY29udmVyc2F0aW9uSW5kZXhcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldCBjb252ZXJzYXRpb25JbmRleCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VIZWFkZXI/LmNvbnZlcnNhdGlvbkluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIERUWE1lc3NhZ2UgQnVmZmVyOiBEVFhNZXNzYWdlSGVhZGVyICsgUGF5bG9hZEhlYWRlciArIERUWE1lc3NhZ2VBdXhCdWZmZXIobnVsbGFibGUpICsgc2VsZWN0b3IobnVsbGFibGUpXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9XG4gICAqL1xuICBidWlsZCAoKSB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5fc2VsZWN0b3IgPyBhcmNoaXZlKHRoaXMuX3NlbGVjdG9yKSA6IEJ1ZmZlci5hbGxvYygwKTtcbiAgICBjb25zdCBhdXggPSB0aGlzLmF1eGlsaWFyaWVzLmJ1aWxkKCk7XG4gICAgY29uc3QgcGF5bG9hZEhlYWRlciA9IERUWE1lc3NhZ2VQYXlsb2FkSGVhZGVyLmJ1aWxkKHtcbiAgICAgIGZsYWdzOiB0aGlzLl9mbGFncyxcbiAgICAgIGF1eExlbmd0aDogYXV4Lmxlbmd0aCxcbiAgICAgIC8vIG5lZWQgdG8gY29udmVydCB0byBiaWdpbnQgaW4gYW55IGNhc2VcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgdG90YWxMZW5ndGg6IEJpZ0ludChhdXgubGVuZ3RoICsgc2VsLmxlbmd0aCksXG4gICAgfSk7XG5cbiAgICBjb25zdCBtZXNzYWdlSGVhZGVyID0gRFRYTWVzc2FnZUhlYWRlci5idWlsZCh7XG4gICAgICBwYXlsb2FkTGVuZ3RoOiBEVFhfTUVTU0FHRV9QQVlMT0FEX0hFQURFUl9MRU5HVEggKyBhdXgubGVuZ3RoICsgc2VsLmxlbmd0aCxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuX2lkZW50aWZpZXIsXG4gICAgICBjb252ZXJzYXRpb25JbmRleDogdGhpcy5fY29udmVyc2F0aW9uSW5kZXgsXG4gICAgICBjaGFubmVsQ29kZTogdGhpcy5fY2hhbm5lbENvZGUsXG4gICAgICBleHBlY3RzUmVwbHk6IHRoaXMuX2V4cGVjdHNSZXBseVxuICAgIH0pO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFttZXNzYWdlSGVhZGVyLCBwYXlsb2FkSGVhZGVyLCBhdXgsIHNlbF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBEVFggYnVmZmVyIGludG8gYW4ganMgb2JqZWN0LiBSZXR1cm5lZCBpbiBEVFhEZWNvZGVyIFN0cmVhbS5UcmFuc2Zvcm1cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWRlckJ1ZiAgRFRYTWVzc2FnZUhlYWRlciBidWZmZXJcbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWRCdWYgIFBheWxvYWRIZWFkZXJCdWZmZXIgKyBEVFhNZXNzYWdlQXV4QnVmZmVyKG51bGxhYmxlKSArIHNlbGVjdG9yQnVmZmVyKG51bGxhYmxlKVxuICAgKiBAcmV0dXJucyB7RFRYTWVzc2FnZX1cbiAgICovXG4gIHN0YXRpYyBwYXJzZSAoaGVhZGVyQnVmLCBwYXlsb2FkQnVmKSB7XG4gICAgbGV0IGN1cnNvciA9IDA7XG4gICAgY29uc3QgcmV0ID0gbmV3IERUWE1lc3NhZ2UoKTtcbiAgICByZXQuX21lc3NhZ2VIZWFkZXIgPSBEVFhNZXNzYWdlSGVhZGVyLnBhcnNlKGhlYWRlckJ1Zik7XG4gICAgaWYgKHJldC5fbWVzc2FnZUhlYWRlci5wYXlsb2FkTGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICByZXQuX3BheWxvYWRIZWFkZXIgPSBEVFhNZXNzYWdlUGF5bG9hZEhlYWRlci5wYXJzZShwYXlsb2FkQnVmLnNsaWNlKGN1cnNvciwgRFRYX01FU1NBR0VfUEFZTE9BRF9IRUFERVJfTEVOR1RIKSk7XG4gICAgY3Vyc29yICs9IERUWF9NRVNTQUdFX1BBWUxPQURfSEVBREVSX0xFTkdUSDtcbiAgICAvLyB0b3RhbExlbmd0aCBpcyBiaWdpbnQgdXNlIDBuXG4gICAgaWYgKHJldC5fcGF5bG9hZEhlYWRlci50b3RhbExlbmd0aCA9PT0gMG4pIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlmIChyZXQuX3BheWxvYWRIZWFkZXIuYXV4TGVuZ3RoID4gMCkge1xuICAgICAgcmV0LmF1eGlsaWFyaWVzID0gRFRYTWVzc2FnZUF1eC5wYXJzZShwYXlsb2FkQnVmLnNsaWNlKGN1cnNvciwgY3Vyc29yICsgcmV0Ll9wYXlsb2FkSGVhZGVyLmF1eExlbmd0aCksIHJldC5fcGF5bG9hZEhlYWRlcik7XG4gICAgICBjdXJzb3IgKz0gcmV0Ll9wYXlsb2FkSGVhZGVyLmF1eExlbmd0aDtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gcGF5bG9hZEJ1Zi5zbGljZShjdXJzb3IsIGN1cnNvciArIHBheWxvYWRCdWYubGVuZ3RoKTtcbiAgICByZXQuc2VsZWN0b3IgPSBkYXRhO1xuICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgZnVuIG9mIFt1bmFyY2hpdmUsIHBsaXN0bGliLnBhcnNlQnVmZmVyXSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldC5zZWxlY3RvciA9IGZ1bihkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldC5zZWxlY3RvciA9IG5ldyBJbnN0cnVtZW50UlBDUGFyc2VFcnJvcihkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG5cbmV4cG9ydCB7IERUWE1lc3NhZ2VIZWFkZXIsIERUWE1lc3NhZ2VQYXlsb2FkSGVhZGVyLCBEVFhNZXNzYWdlQXV4QnVmZmVyLCBEVFhNZXNzYWdlQXV4LCBEVFhNZXNzYWdlLFxuICBEVFhfTUVTU0FHRV9QQVlMT0FEX0hFQURFUl9MRU5HVEgsIERUWF9NRVNTQUdFX0hFQURFUl9MRU5HVEgsIERUWF9NRVNTQUdFX0hFQURFUl9NQUdJQywgRFRYX01FU1NBR0VfSEVBREVSX01BR0lDX0xFTixcbiAgRkxBR19UWVBFU307XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsUUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsYUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBRUEsTUFBTUksaUNBQWlDLEdBQUcsRUFBRTtBQUFDQyxPQUFBLENBQUFELGlDQUFBLEdBQUFBLGlDQUFBO0FBQzdDLE1BQU1FLHlCQUF5QixHQUFHLEVBQUU7QUFBQ0QsT0FBQSxDQUFBQyx5QkFBQSxHQUFBQSx5QkFBQTtBQUNyQyxNQUFNQyx3QkFBd0IsR0FBRyxVQUFVO0FBQUNGLE9BQUEsQ0FBQUUsd0JBQUEsR0FBQUEsd0JBQUE7QUFDNUMsTUFBTUMsNEJBQTRCLEdBQUcsQ0FBQztBQUFDSCxPQUFBLENBQUFHLDRCQUFBLEdBQUFBLDRCQUFBO0FBQ3ZDLE1BQU1DLHNCQUFzQixHQUFHLE1BQU07QUFDckMsTUFBTUMsbUJBQW1CLEdBQUcsR0FBRztBQUUvQixNQUFNQyxVQUFVLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDO0VBQy9CQyxJQUFJLEVBQUUsQ0FBQztFQUNQQyxJQUFJLEVBQUUsQ0FBQztFQUNQQyxJQUFJLEVBQUUsQ0FBQztFQUNQQyxLQUFLLEVBQUU7QUFDVCxDQUFDLENBQUM7QUFBQ1osT0FBQSxDQUFBTSxVQUFBLEdBQUFBLFVBQUE7QUFFSCxNQUFNTyxTQUFTLEdBQUdOLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDO0VBQzlCTSxJQUFJLEVBQUUsQ0FBQztFQUNQQyxPQUFPLEVBQUUsQ0FBQztFQUNWQyxRQUFR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
302
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbnNrZXllZCIsInJlcXVpcmUiLCJfYnBsaXN0UGFyc2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9sb2Rhc2giLCJEVFhfTUVTU0FHRV9QQVlMT0FEX0hFQURFUl9MRU5HVEgiLCJleHBvcnRzIiwiRFRYX01FU1NBR0VfSEVBREVSX0xFTkdUSCIsIkRUWF9NRVNTQUdFX0hFQURFUl9NQUdJQyIsIkRUWF9NRVNTQUdFX0hFQURFUl9NQUdJQ19MRU4iLCJEVFhfTUVTU0FHRV9BVVhfSEVBREVSIiwiRFRYX0FVWElMSUFSWV9NQUdJQyIsIkZMQUdfVFlQRVMiLCJPYmplY3QiLCJmcmVlemUiLCJwdXNoIiwicmVjdiIsInNlbmQiLCJyZXBseSIsIkFVWF9UWVBFUyIsIlRleHQiLCJOU0tleWVkIiwiVUludDMyTEUiLCJCaWdVSW50NjRMRSIsIkJpZ0ludDY0TEUiLCJEVFhNZXNzYWdlSGVhZGVyIiwiYnVpbGQiLCJkYXRhIiwibWVzc2FnZUhlYWRlciIsIkJ1ZmZlciIsImFsbG9jIiwid3JpdGVVSW50MzJMRSIsIndyaXRlVUludDE2TEUiLCJwYXlsb2FkTGVuZ3RoIiwiaWRlbnRpZmllciIsImNvbnZlcnNhdGlvbkluZGV4IiwiY2hhbm5lbENvZGUiLCJleHBlY3RzUmVwbHkiLCJwYXJzZSIsImhlYWRlckJ1ZmZlciIsIm1hZ2ljIiwicmVhZFVJbnQzMkxFIiwiaGVhZGVyTGVuZ3RoIiwiZnJhZ21lbnRJZCIsInJlYWRVSW50MTZMRSIsImZyYWdtZW50Q291bnQiLCJjaGFubmVsIiwiRFRYTWVzc2FnZVBheWxvYWRIZWFkZXIiLCJmbGFncyIsImF1eExlbmd0aCIsIndyaXRlQmlnVUludDY0TEUiLCJ0b3RhbExlbmd0aCIsInJlYWRCaWdJbnQ2NExFIiwiRFRYTWVzc2FnZUF1eCIsImNvbnN0cnVjdG9yIiwiRFRYTWVzc2FnZUF1eEJ1ZmZlciIsImdldEJ5dGVzIiwibWVzc2FnZUF1eCIsImJ1ZiIsImFyZyIsImNvbmNhdCIsIl8iLCJpc051bWJlciIsImFwcGVuZEludCIsImFwcGVuZExvbmciLCJhcHBlbmRPYmplY3QiLCJwYXlsb2FkSGVhZGVyIiwiY3Vyc29yIiwibGVuZ3RoIiwibSIsIkVycm9yIiwidHlwZSIsInN0ckxlbiIsInNsaWNlIiwiYXJjaGl2ZWRfZGF0YSIsInVuYXJjaGl2ZSIsInJlYWRCaWdVSW50NjRMRSIsIkluc3RydW1lbnRSUENQYXJzZUVycm9yIiwiX2J1ZiIsInZhbHVlIiwiYXBwZW5kU2lnbmVkSW50Iiwid3JpdGVJbnQzMkxFIiwiYXBwZW5kU2lnbmVkTG9uZyIsIndyaXRlQmlnSW50NjRMRSIsImFyY2hpdmUiLCJidWYyIiwib3V0IiwiRFRYTWVzc2FnZSIsIm9wdHMiLCJzZWxlY3RvciIsIl9tZXNzYWdlSGVhZGVyIiwidW5kZWZpbmVkIiwiX3BheWxvYWRIZWFkZXIiLCJfaWRlbnRpZmllciIsIl9jaGFubmVsQ29kZSIsIl9leHBlY3RzUmVwbHkiLCJfc2VsZWN0b3IiLCJfY29udmVyc2F0aW9uSW5kZXgiLCJfZmxhZ3MiLCJhdXhpbGlhcmllcyIsIl90aGlzJF9tZXNzYWdlSGVhZGVyIiwiX3RoaXMkX21lc3NhZ2VIZWFkZXIyIiwiX3RoaXMkX21lc3NhZ2VIZWFkZXIzIiwiX3RoaXMkX21lc3NhZ2VIZWFkZXI0Iiwic2VsIiwiYXV4IiwiQmlnSW50IiwiaGVhZGVyQnVmIiwicGF5bG9hZEJ1ZiIsInJldCIsImZ1biIsInBsaXN0bGliIiwicGFyc2VCdWZmZXIiLCJlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2luc3RydW1lbnQvaGVhZGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FyY2hpdmUsIHVuYXJjaGl2ZX0gZnJvbSAnLi90cmFuc2Zvcm1lci9uc2tleWVkJztcbmltcG9ydCBwbGlzdGxpYiBmcm9tICdicGxpc3QtcGFyc2VyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmNvbnN0IERUWF9NRVNTQUdFX1BBWUxPQURfSEVBREVSX0xFTkdUSCA9IDE2O1xuY29uc3QgRFRYX01FU1NBR0VfSEVBREVSX0xFTkdUSCA9IDMyO1xuY29uc3QgRFRYX01FU1NBR0VfSEVBREVSX01BR0lDID0gMHgxRjNENUI3OTtcbmNvbnN0IERUWF9NRVNTQUdFX0hFQURFUl9NQUdJQ19MRU4gPSA0O1xuY29uc3QgRFRYX01FU1NBR0VfQVVYX0hFQURFUiA9IDB4MDFGMDtcbmNvbnN0IERUWF9BVVhJTElBUllfTUFHSUMgPSAweGE7XG5cbmNvbnN0IEZMQUdfVFlQRVMgPSBPYmplY3QuZnJlZXplKHtcbiAgcHVzaDogMCxcbiAgcmVjdjogMSxcbiAgc2VuZDogMixcbiAgcmVwbHk6IDNcbn0pO1xuXG5jb25zdCBBVVhfVFlQRVMgPSBPYmplY3QuZnJlZXplKHtcbiAgVGV4dDogMSxcbiAgTlNLZXllZDogMixcbiAgVUludDMyTEU6IDMsXG4gIEJpZ1VJbnQ2NExFOiA0LFxuICBCaWdJbnQ2NExFOiA2XG59KTtcblxuLyoqXG4gKiBEVFhNZXNzYWdlSGVhZGVyIGxlbmd0aCAzMlxuICogc3RydWN0IERUWE1lc3NhZ2VIZWFkZXIge1xuICogICAgIHUzMiBtYWdpYyBEVFhfTUVTU0FHRV9IRUFERVJfTUFHSUNcbiAqICAgICB1MzIgaGVhZGVyTGVuZ3RoXG4gKiAgICAgdTE2IGZyYWdtZW50SWQgICBwYWNrZXQgbnVtYmVyXG4gKiAgICAgdTE2IGZyYWdtZW50Q291bnQgIHBhY2tldHMgdG90YWwgbnVtYmVyXG4gKiAgICAgdTMyIHBheWxvYWRMZW5ndGhcbiAqICAgICB1MzIgaWRlbnRpZmllclxuICogICAgIHUzMiBjb252ZXJzYXRpb25JbmRleFxuICogICAgIHUzMiBjaGFubmVsXG4gKiAgICAgdTMyIGV4cGVjdHNSZXBseVxuICogICAgIH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERUWE1lc3NhZ2VPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gaWRlbnRpZmllciBwYWNrZXQgdHJhbnNtaXNzaW9uIHNlcXVlbmNlLCB0aGlzIHZhbHVlIGlzIGluY3JlbWVudGVkIGZvciBlYWNoIHJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjaGFubmVsQ29kZSB0aGUgZGF0YSB0cmFuc21pc3Npb24gb2YgdGhlIHNlcnZpY2Ugd2lsbCB1c2UgdGhpcyBjaGFubmVsIGNvZGUuXG4gKiBFYWNoIHNlcnZpY2UgaGFzIGEgc2VwYXJhdGUgY2hhbm5lbFxuICogQHByb3BlcnR5IHtudW1iZXI/fSBwYXlsb2FkTGVuZ3RoIERUWE1lc3NhZ2VBdXhCdWZmZXIubGVuZ3RoKG51bGxhYmxlKSArIHNlbGVjdG9yQnVmZmVyLmxlbmd0aChudWxsYWJsZSlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZXhwZWN0c1JlcGx5IGlmIHRydWUgcmVwbHkgYSBhY2sgbWVzc2FnZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvbnZlcnNhdGlvbkluZGV4ICByYXcgZGF0YSArMSBpbmRpY2F0ZSBhIHJlcGx5IG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBmbGFncyBtZXNzYWdlIHN0YXR1c1xuICovXG5cbmNsYXNzIERUWE1lc3NhZ2VIZWFkZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtEVFhNZXNzYWdlT3B0aW9uc30gZGF0YVxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSBEVFhNZXNzYWdlSGVhZGVyQnVmZmVyXG4gICAqL1xuICBzdGF0aWMgYnVpbGQgKGRhdGEpIHtcbiAgICBjb25zdCBtZXNzYWdlSGVhZGVyID0gQnVmZmVyLmFsbG9jKERUWF9NRVNTQUdFX0hFQURFUl9MRU5HVEgpO1xuICAgIG1lc3NhZ2VIZWFkZXIud3JpdGVVSW50MzJMRShEVFhfTUVTU0FHRV9IRUFERVJfTUFHSUMsIDApO1xuICAgIG1lc3NhZ2VIZWFkZXIud3JpdGVVSW50MzJMRShEVFhfTUVTU0FHRV9IRUFERVJfTEVOR1RILCA0KTtcbiAgICBtZXNzYWdlSGVhZGVyLndyaXRlVUludDE2TEUoMCwgOCk7XG4gICAgbWVzc2FnZUhlYWRlci53cml0ZVVJbnQxNkxFKDEsIDEwKTtcbiAgICBtZXNzYWdlSGVhZGVyLndyaXRlVUludDMyTEUoZGF0YS5wYXlsb2FkTGVuZ3RoLCAxMik7XG4gICAgbWVzc2FnZUhlYWRlci53cml0ZVVJbnQzMkxFKGRhdGEuaWRlbnRpZmllciwgMTYpO1xuICAgIG1lc3NhZ2VIZWFkZXIud3JpdGVVSW50MzJMRShkYXRhLmNvbnZlcnNhdGlvbkluZGV4LCAyMCk7XG4gICAgbWVzc2FnZUhlYWRlci53cml0ZVVJbnQzMkxFKGRhdGEuY2hhbm5lbENvZGUsIDI0KTtcbiAgICBtZXNzYWdlSGVhZGVyLndyaXRlVUludDMyTEUoZGF0YS5leHBlY3RzUmVwbHksIDI4KTtcbiAgICByZXR1cm4gbWVzc2FnZUhlYWRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gaGVhZGVyQnVmZmVyIERUWE1lc3NhZ2VIZWFkZXJCdWZmZXJcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBwYXJzZSAoaGVhZGVyQnVmZmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1hZ2ljOiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDApLFxuICAgICAgaGVhZGVyTGVuZ3RoOiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDQpLFxuICAgICAgZnJhZ21lbnRJZDogaGVhZGVyQnVmZmVyLnJlYWRVSW50MTZMRSg4KSxcbiAgICAgIGZyYWdtZW50Q291bnQ6IGhlYWRlckJ1ZmZlci5yZWFkVUludDE2TEUoMTApLFxuICAgICAgcGF5bG9hZExlbmd0aDogaGVhZGVyQnVmZmVyLnJlYWRVSW50MzJMRSgxMiksXG4gICAgICBpZGVudGlmaWVyOiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDE2KSxcbiAgICAgIGNvbnZlcnNhdGlvbkluZGV4OiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDIwKSxcbiAgICAgIGNoYW5uZWw6IGhlYWRlckJ1ZmZlci5yZWFkVUludDMyTEUoMjQpLFxuICAgICAgZXhwZWN0c1JlcGx5OiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDI4KSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogRFRYTWVzc2FnZVBheWxvYWRIZWFkZXIgbGVuZ3RoIDE2XG4gKiBzdHJ1Y3QgRFRYTWVzc2FnZUhlYWRlciB7XG4gKiAgICAgdTMyIGZsYWdzIEZMQUdfVFlQRVNcbiAqICAgICB1MzIgYXV4TGVuZ3RoXG4gKiAgICAgdTY0IHRvdGFsTGVuZ3RoXG4gKiAgICAgfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRFRYTWVzc2FnZVBheWxvYWRIZWFkZXJPYmplY3RcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBmbGFncyBtZXNzYWdlIHN0YXR1c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGF1eExlbmd0aCBEVFhNZXNzYWdlQXV4QnVmZmVyLmxlbmd0aChudWxsYWJsZSlcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSB0b3RhbExlbmd0aCBEVFhNZXNzYWdlQXV4QnVmZmVyLmxlbmd0aChudWxsYWJsZSkgKyBzZWxlY3RvckJ1ZmZlci5sZW5ndGhcbiAqL1xuY2xhc3MgRFRYTWVzc2FnZVBheWxvYWRIZWFkZXIge1xuICAvKipcbiAgICogQHBhcmFtIGRhdGEge0RUWE1lc3NhZ2VQYXlsb2FkSGVhZGVyT2JqZWN0fVxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSBEVFhNZXNzYWdlUGF5bG9hZEhlYWRlckJ1ZmZlclxuICAgKi9cbiAgc3RhdGljIGJ1aWxkIChkYXRhKSB7XG4gICAgY29uc3QgbWVzc2FnZUhlYWRlciA9IEJ1ZmZlci5hbGxvYyhEVFhfTUVTU0FHRV9QQVlMT0FEX0hFQURFUl9MRU5HVEgpO1xuICAgIG1lc3NhZ2VIZWFkZXIud3JpdGVVSW50MzJMRShkYXRhLmZsYWdzLCAwKTtcbiAgICBtZXNzYWdlSGVhZGVyLndyaXRlVUludDMyTEUoZGF0YS5hdXhMZW5ndGgsIDQpO1xuICAgIG1lc3NhZ2VIZWFkZXIud3JpdGVCaWdVSW50NjRMRShkYXRhLnRvdGFsTGVuZ3RoLCA4KTtcbiAgICByZXR1cm4gbWVzc2FnZUhlYWRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gaGVhZGVyQnVmZmVyXG4gICAqIEByZXR1cm5zIHtEVFhNZXNzYWdlUGF5bG9hZEhlYWRlck9iamVjdH1cbiAgICovXG4gIHN0YXRpYyBwYXJzZSAoaGVhZGVyQnVmZmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZsYWdzOiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDApLFxuICAgICAgYXV4TGVuZ3RoOiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDQpLFxuICAgICAgdG90YWxMZW5ndGg6IGhlYWRlckJ1ZmZlci5yZWFkQmlnSW50NjRMRSg4KVxuICAgIH07XG4gIH1cbn1cblxuXG5jbGFzcyBEVFhNZXNzYWdlQXV4IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55W10gfCBEVFhNZXNzYWdlQXV4QnVmZmVyfSBkYXRhXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoZGF0YSA9IFtdKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKUyBBcnJheSB0byBBcHBsZSBOU0tleWVkIEJ1ZmZlclxuICAgKiBAcmV0dXJucyB7QnVmZmVyfVxuICAgKi9cbiAgYnVpbGQgKCkge1xuICAgIGlmICh0aGlzLmRhdGEgaW5zdGFuY2VvZiBEVFhNZXNzYWdlQXV4QnVmZmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhLmdldEJ5dGVzKCk7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VBdXggPSBuZXcgRFRYTWVzc2FnZUF1eEJ1ZmZlcigpO1xuICAgIGxldCBidWYgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5kYXRhKSB7XG4gICAgICBpZiAoYXJnIGluc3RhbmNlb2YgRFRYTWVzc2FnZUF1eEJ1ZmZlcikge1xuICAgICAgICBidWYgPSBCdWZmZXIuY29uY2F0KFtidWYsIGFyZy5nZXRCeXRlcygpXSk7XG4gICAgICB9IGVsc2UgaWYgKF8uaXNOdW1iZXIoYXJnKSkge1xuICAgICAgICBtZXNzYWdlQXV4LmFwcGVuZEludChhcmcpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnID09ICdiaWdpbnQnKSB7XG4gICAgICAgIG1lc3NhZ2VBdXguYXBwZW5kTG9uZyhhcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVzc2FnZUF1eC5hcHBlbmRPYmplY3QoYXJnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2J1ZiwgbWVzc2FnZUF1eC5nZXRCeXRlcygpXSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIG5za2V5ZWQgQnVmZmVyIGludG8ganMgYXJyYXlcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWRlckJ1ZmZlclxuICAgKiBAcGFyYW0ge0RUWE1lc3NhZ2VQYXlsb2FkSGVhZGVyT2JqZWN0fSBwYXlsb2FkSGVhZGVyXG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIHN0YXRpYyBwYXJzZSAoaGVhZGVyQnVmZmVyLCBwYXlsb2FkSGVhZGVyKSB7XG4gICAgbGV0IGN1cnNvciA9IDA7XG4gICAgY29uc3QgZGF0YSA9IFtdO1xuICAgIGNvbnN0IGxlbmd0aCA9IGhlYWRlckJ1ZmZlci5yZWFkQmlnSW50NjRMRSg4KTtcbiAgICBjdXJzb3IgKz0gMTY7XG4gICAgd2hpbGUgKGN1cnNvciA8PSBsZW5ndGgpIHtcbiAgICAgIGlmIChwYXlsb2FkSGVhZGVyLmZsYWdzICE9PSBGTEFHX1RZUEVTLnB1c2gpIHtcbiAgICAgICAgY29uc3QgbSA9IGhlYWRlckJ1ZmZlci5yZWFkVUludDMyTEUoY3Vyc29yKTtcbiAgICAgICAgY3Vyc29yICs9IDQ7XG4gICAgICAgIGlmIChtICE9PSBEVFhfQVVYSUxJQVJZX01BR0lDKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbmNvcnJlY3QgYXV4aWxpYXJ5IG1hZ2ljOiAke219YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHR5cGUgPSBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKGN1cnNvcik7XG4gICAgICBjdXJzb3IgKz0gNDtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIEFVWF9UWVBFUy5UZXh0OiB7XG4gICAgICAgICAgY29uc3Qgc3RyTGVuID0gaGVhZGVyQnVmZmVyLnJlYWRVSW50MzJMRShjdXJzb3IpO1xuICAgICAgICAgIGN1cnNvciArPSA0O1xuICAgICAgICAgIGRhdGEucHVzaChoZWFkZXJCdWZmZXIuc2xpY2UoY3Vyc29yLCBjdXJzb3IgKyBzdHJMZW4pKTtcbiAgICAgICAgICBjdXJzb3IgKz0gc3RyTGVuO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgQVVYX1RZUEVTLk5TS2V5ZWQ6IHtcbiAgICAgICAgICBjb25zdCBzdHJMZW4gPSBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKGN1cnNvcik7XG4gICAgICAgICAgY3Vyc29yICs9IDQ7XG4gICAgICAgICAgY29uc3QgYXJjaGl2ZWRfZGF0YSA9IGhlYWRlckJ1ZmZlci5zbGljZShjdXJzb3IsIGN1cnNvciArIHN0ckxlbik7XG4gICAgICAgICAgZGF0YS5wdXNoKHVuYXJjaGl2ZShhcmNoaXZlZF9kYXRhKSk7XG4gICAgICAgICAgY3Vyc29yICs9IHN0ckxlbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIEFVWF9UWVBFUy5VSW50MzJMRTpcbiAgICAgICAgICBkYXRhLnB1c2goaGVhZGVyQnVmZmVyLnJlYWRVSW50MzJMRShjdXJzb3IpKTtcbiAgICAgICAgICBjdXJzb3IgKz0gNDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBVVhfVFlQRVMuQmlnVUludDY0TEU6XG4gICAgICAgICAgZGF0YS5wdXNoKGhlYWRlckJ1ZmZlci5yZWFkQmlnVUludDY0TEUoY3Vyc29yKSk7XG4gICAgICAgICAgY3Vyc29yICs9IDg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQVVYX1RZUEVTLkJpZ0ludDY0TEU6XG4gICAgICAgICAgZGF0YS5wdXNoKGhlYWRlckJ1ZmZlci5yZWFkQmlnSW50NjRMRShjdXJzb3IpKTtcbiAgICAgICAgICBjdXJzb3IgKz0gODtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHlwZSAke3R5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG59XG5cbmNsYXNzIEluc3RydW1lbnRSUENQYXJzZUVycm9yIHtcbiAgY29uc3RydWN0b3IgKGRhdGEpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICB9XG59XG5cbmNsYXNzIERUWE1lc3NhZ2VBdXhCdWZmZXIge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5fYnVmID0gQnVmZmVyLmFsbG9jKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgKi9cbiAgYXBwZW5kSW50ICh2YWx1ZSkge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5hbGxvYygxMik7XG4gICAgYnVmLndyaXRlVUludDMyTEUoRFRYX0FVWElMSUFSWV9NQUdJQywgMCk7XG4gICAgYnVmLndyaXRlVUludDMyTEUoMywgNCk7XG4gICAgYnVmLndyaXRlVUludDMyTEUodmFsdWUsIDgpO1xuICAgIHRoaXMuX2J1ZiA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZiwgYnVmXSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtiaWdpbnR9IHZhbHVlXG4gICAqL1xuICBhcHBlbmRMb25nICh2YWx1ZSkge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5hbGxvYygxNik7XG4gICAgYnVmLndyaXRlVUludDMyTEUoRFRYX0FVWElMSUFSWV9NQUdJQywgMCk7XG4gICAgYnVmLndyaXRlVUludDMyTEUoNCwgNCk7XG4gICAgYnVmLndyaXRlQmlnVUludDY0TEUodmFsdWUsIDgpO1xuICAgIHRoaXMuX2J1ZiA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZiwgYnVmXSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqL1xuICBhcHBlbmRTaWduZWRJbnQgKHZhbHVlKSB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmFsbG9jKDEyKTtcbiAgICBidWYud3JpdGVVSW50MzJMRShEVFhfQVVYSUxJQVJZX01BR0lDLCAwKTtcbiAgICBidWYud3JpdGVVSW50MzJMRSgzLCA0KTtcbiAgICBidWYud3JpdGVJbnQzMkxFKHZhbHVlLCA4KTtcbiAgICB0aGlzLl9idWYgPSBCdWZmZXIuY29uY2F0KFt0aGlzLl9idWYsIGJ1Zl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YmlnaW50fSB2YWx1ZVxuICAgKi9cbiAgYXBwZW5kU2lnbmVkTG9uZyAodmFsdWUpIHtcbiAgICBjb25zdCBidWYgPSBCdWZmZXIuYWxsb2MoMTYpO1xuICAgIGJ1Zi53cml0ZVVJbnQzMkxFKERUWF9BVVhJTElBUllfTUFHSUMsIDApO1xuICAgIGJ1Zi53cml0ZVVJbnQzMkxFKDYsIDQpO1xuICAgIGJ1Zi53cml0ZUJpZ0ludDY0TEUodmFsdWUsIDgpO1xuICAgIHRoaXMuX2J1ZiA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZiwgYnVmXSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlXG4gICAqL1xuICBhcHBlbmRPYmplY3QgKHZhbHVlKSB7XG4gICAgY29uc3QgYnVmID0gYXJjaGl2ZSh2YWx1ZSk7XG4gICAgY29uc3QgYnVmMiA9IEJ1ZmZlci5hbGxvYygxMik7XG4gICAgYnVmMi53cml0ZVVJbnQzMkxFKERUWF9BVVhJTElBUllfTUFHSUMsIDApO1xuICAgIGJ1ZjIud3JpdGVVSW50MzJMRSgyLCA0KTtcbiAgICBidWYyLndyaXRlVUludDMyTEUoYnVmLmxlbmd0aCwgOCk7XG4gICAgdGhpcy5fYnVmID0gQnVmZmVyLmNvbmNhdChbdGhpcy5fYnVmLCBidWYyLCBidWZdKTtcbiAgfVxuXG4gIGdldEJ5dGVzICgpIHtcbiAgICBjb25zdCBvdXQgPSBCdWZmZXIuYWxsb2MoMTYpO1xuICAgIG91dC53cml0ZVVJbnQzMkxFKERUWF9NRVNTQUdFX0FVWF9IRUFERVIsIDApO1xuICAgIG91dC53cml0ZVVJbnQzMkxFKHRoaXMuX2J1Zi5sZW5ndGgsIDgpO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtvdXQsIHRoaXMuX2J1Zl0pO1xuICB9XG59XG5cblxuXG5jbGFzcyBEVFhNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7RFRYTWVzc2FnZU9wdGlvbnN9IG9wdHNcbiAgICovXG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBpZGVudGlmaWVyLFxuICAgICAgY2hhbm5lbENvZGUsXG4gICAgICBzZWxlY3RvcixcbiAgICAgIGV4cGVjdHNSZXBseSxcbiAgICAgIGNvbnZlcnNhdGlvbkluZGV4ID0gMCxcbiAgICAgIGZsYWdzID0gRkxBR19UWVBFUy5zZW5kXG4gICAgfSA9IG9wdHM7XG4gICAgdGhpcy5fbWVzc2FnZUhlYWRlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9wYXlsb2FkSGVhZGVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2lkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMuX2NoYW5uZWxDb2RlID0gY2hhbm5lbENvZGU7XG4gICAgdGhpcy5fZXhwZWN0c1JlcGx5ID0gZXhwZWN0c1JlcGx5O1xuICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgdGhpcy5fY29udmVyc2F0aW9uSW5kZXggPSBjb252ZXJzYXRpb25JbmRleDtcbiAgICB0aGlzLl9mbGFncyA9IGZsYWdzO1xuICAgIHRoaXMuYXV4aWxpYXJpZXMgPSBuZXcgRFRYTWVzc2FnZUF1eCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBEVFhNZXNzYWdlSGVhZGVyIGlkZW50aWZpZXIuIFBhY2tldCB0cmFuc21pc3Npb24gc2VxdWVuY2VcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldCBpZGVudGlmaWVyICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUhlYWRlcj8uaWRlbnRpZmllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgRFRYTWVzc2FnZUhlYWRlciBjaGFubmVsQ29kZS5cbiAgICogUGFja2V0IHRyYW5zbWlzc2lvbiBjaGFubmVsQ29kZS4gVXNlIHRoaXMgdmFsdWUgdG8gZGlzdGluZ3Vpc2ggd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgY2hhbm5lbHNcbiAgICogY2FsbCB0aGlzIG1ldGhvZCBgSW5zdHJ1bWVudFNlcnZpY2UucmVnaXN0ZXJDaGFubmVsQ2FsbGJhY2tgIGdldCB0aGUgY2hhbm5lbCBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgY2hhbm5lbENvZGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlSGVhZGVyPy5jaGFubmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBEVFhNZXNzYWdlSGVhZGVyIGV4cGVjdHNSZXBseS4gV2hldGhlciB0byBuZWVkIGFjayBtZXNzYWdlXG4gICAqIGlmIGV4cGVjdHNSZXBseSBpcyB0cnVlIG11c3QgcmVwbHkgYWNrIG1lc3NhZ2VcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgZXhwZWN0c1JlcGx5ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUhlYWRlcj8uZXhwZWN0c1JlcGx5O1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwgdGhpcyBtZXRob2QgYEluc3RydW1lbnRTZXJ2aWNlLnJlZ2lzdGVyU2VsZWN0b3JDYWxsYmFja2AgZ2V0IHRoZSBzZWxlY3RvciBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHsqfSBVbmtub3duIGRhdGFcbiAgICovXG4gIGdldCBzZWxlY3RvciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBzZXQgc2VsZWN0b3IgKGRhdGEpIHtcbiAgICB0aGlzLl9zZWxlY3RvciA9IGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IERUWE1lc3NhZ2VIZWFkZXIgY29udmVyc2F0aW9uSW5kZXhcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldCBjb252ZXJzYXRpb25JbmRleCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VIZWFkZXI/LmNvbnZlcnNhdGlvbkluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIERUWE1lc3NhZ2UgQnVmZmVyOiBEVFhNZXNzYWdlSGVhZGVyICsgUGF5bG9hZEhlYWRlciArIERUWE1lc3NhZ2VBdXhCdWZmZXIobnVsbGFibGUpICsgc2VsZWN0b3IobnVsbGFibGUpXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9XG4gICAqL1xuICBidWlsZCAoKSB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5fc2VsZWN0b3IgPyBhcmNoaXZlKHRoaXMuX3NlbGVjdG9yKSA6IEJ1ZmZlci5hbGxvYygwKTtcbiAgICBjb25zdCBhdXggPSB0aGlzLmF1eGlsaWFyaWVzLmJ1aWxkKCk7XG4gICAgY29uc3QgcGF5bG9hZEhlYWRlciA9IERUWE1lc3NhZ2VQYXlsb2FkSGVhZGVyLmJ1aWxkKHtcbiAgICAgIGZsYWdzOiB0aGlzLl9mbGFncyxcbiAgICAgIGF1eExlbmd0aDogYXV4Lmxlbmd0aCxcbiAgICAgIC8vIG5lZWQgdG8gY29udmVydCB0byBiaWdpbnQgaW4gYW55IGNhc2VcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgdG90YWxMZW5ndGg6IEJpZ0ludChhdXgubGVuZ3RoICsgc2VsLmxlbmd0aCksXG4gICAgfSk7XG5cbiAgICBjb25zdCBtZXNzYWdlSGVhZGVyID0gRFRYTWVzc2FnZUhlYWRlci5idWlsZCh7XG4gICAgICBwYXlsb2FkTGVuZ3RoOiBEVFhfTUVTU0FHRV9QQVlMT0FEX0hFQURFUl9MRU5HVEggKyBhdXgubGVuZ3RoICsgc2VsLmxlbmd0aCxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuX2lkZW50aWZpZXIsXG4gICAgICBjb252ZXJzYXRpb25JbmRleDogdGhpcy5fY29udmVyc2F0aW9uSW5kZXgsXG4gICAgICBjaGFubmVsQ29kZTogdGhpcy5fY2hhbm5lbENvZGUsXG4gICAgICBleHBlY3RzUmVwbHk6IHRoaXMuX2V4cGVjdHNSZXBseVxuICAgIH0pO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFttZXNzYWdlSGVhZGVyLCBwYXlsb2FkSGVhZGVyLCBhdXgsIHNlbF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBEVFggYnVmZmVyIGludG8gYW4ganMgb2JqZWN0LiBSZXR1cm5lZCBpbiBEVFhEZWNvZGVyIFN0cmVhbS5UcmFuc2Zvcm1cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWRlckJ1ZiAgRFRYTWVzc2FnZUhlYWRlciBidWZmZXJcbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWRCdWYgIFBheWxvYWRIZWFkZXJCdWZmZXIgKyBEVFhNZXNzYWdlQXV4QnVmZmVyKG51bGxhYmxlKSArIHNlbGVjdG9yQnVmZmVyKG51bGxhYmxlKVxuICAgKiBAcmV0dXJucyB7RFRYTWVzc2FnZX1cbiAgICovXG4gIHN0YXRpYyBwYXJzZSAoaGVhZGVyQnVmLCBwYXlsb2FkQnVmKSB7XG4gICAgbGV0IGN1cnNvciA9IDA7XG4gICAgY29uc3QgcmV0ID0gbmV3IERUWE1lc3NhZ2UoKTtcbiAgICByZXQuX21lc3NhZ2VIZWFkZXIgPSBEVFhNZXNzYWdlSGVhZGVyLnBhcnNlKGhlYWRlckJ1Zik7XG4gICAgaWYgKHJldC5fbWVzc2FnZUhlYWRlci5wYXlsb2FkTGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICByZXQuX3BheWxvYWRIZWFkZXIgPSBEVFhNZXNzYWdlUGF5bG9hZEhlYWRlci5wYXJzZShwYXlsb2FkQnVmLnNsaWNlKGN1cnNvciwgRFRYX01FU1NBR0VfUEFZTE9BRF9IRUFERVJfTEVOR1RIKSk7XG4gICAgY3Vyc29yICs9IERUWF9NRVNTQUdFX1BBWUxPQURfSEVBREVSX0xFTkdUSDtcbiAgICAvLyB0b3RhbExlbmd0aCBpcyBiaWdpbnQgdXNlIDBuXG4gICAgaWYgKHJldC5fcGF5bG9hZEhlYWRlci50b3RhbExlbmd0aCA9PT0gMG4pIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlmIChyZXQuX3BheWxvYWRIZWFkZXIuYXV4TGVuZ3RoID4gMCkge1xuICAgICAgcmV0LmF1eGlsaWFyaWVzID0gRFRYTWVzc2FnZUF1eC5wYXJzZShwYXlsb2FkQnVmLnNsaWNlKGN1cnNvciwgY3Vyc29yICsgcmV0Ll9wYXlsb2FkSGVhZGVyLmF1eExlbmd0aCksIHJldC5fcGF5bG9hZEhlYWRlcik7XG4gICAgICBjdXJzb3IgKz0gcmV0Ll9wYXlsb2FkSGVhZGVyLmF1eExlbmd0aDtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gcGF5bG9hZEJ1Zi5zbGljZShjdXJzb3IsIGN1cnNvciArIHBheWxvYWRCdWYubGVuZ3RoKTtcbiAgICByZXQuc2VsZWN0b3IgPSBkYXRhO1xuICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgZnVuIG9mIFt1bmFyY2hpdmUsIHBsaXN0bGliLnBhcnNlQnVmZmVyXSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldC5zZWxlY3RvciA9IGZ1bihkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldC5zZWxlY3RvciA9IG5ldyBJbnN0cnVtZW50UlBDUGFyc2VFcnJvcihkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG5cbmV4cG9ydCB7IERUWE1lc3NhZ2VIZWFkZXIsIERUWE1lc3NhZ2VQYXlsb2FkSGVhZGVyLCBEVFhNZXNzYWdlQXV4QnVmZmVyLCBEVFhNZXNzYWdlQXV4LCBEVFhNZXNzYWdlLFxuICBEVFhfTUVTU0FHRV9QQVlMT0FEX0hFQURFUl9MRU5HVEgsIERUWF9NRVNTQUdFX0hFQURFUl9MRU5HVEgsIERUWF9NRVNTQUdFX0hFQURFUl9NQUdJQywgRFRYX01FU1NBR0VfSEVBREVSX01BR0lDX0xFTixcbiAgRkxBR19UWVBFU307XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsUUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsYUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBRUEsTUFBTUksaUNBQWlDLEdBQUcsRUFBRTtBQUFDQyxPQUFBLENBQUFELGlDQUFBLEdBQUFBLGlDQUFBO0FBQzdDLE1BQU1FLHlCQUF5QixHQUFHLEVBQUU7QUFBQ0QsT0FBQSxDQUFBQyx5QkFBQSxHQUFBQSx5QkFBQTtBQUNyQyxNQUFNQyx3QkFBd0IsR0FBRyxVQUFVO0FBQUNGLE9BQUEsQ0FBQUUsd0JBQUEsR0FBQUEsd0JBQUE7QUFDNUMsTUFBTUMsNEJBQTRCLEdBQUcsQ0FBQztBQUFDSCxPQUFBLENBQUFHLDRCQUFBLEdBQUFBLDRCQUFBO0FBQ3ZDLE1BQU1DLHNCQUFzQixHQUFHLE1BQU07QUFDckMsTUFBTUMsbUJBQW1CLEdBQUcsR0FBRztBQUUvQixNQUFNQyxVQUFVLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDO0VBQy9CQyxJQUFJLEVBQUUsQ0FBQztFQUNQQyxJQUFJLEVBQUUsQ0FBQztFQUNQQyxJQUFJLEVBQUUsQ0FBQztFQUNQQyxLQUFLLEVBQUU7QUFDVCxDQUFDLENBQUM7QUFBQ1osT0FBQSxDQUFBTSxVQUFBLEdBQUFBLFVBQUE7QUFFSCxNQUFNTyxTQUFTLEdBQUdOLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDO0VBQzlCTSxJQUFJLEVBQUUsQ0FBQztFQUNQQyxPQUFPLEVBQUUsQ0FBQztFQUNWQyxRQUFR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