appium-uiautomator2-driver 2.25.2 → 2.26.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [2.26.0](https://github.com/appium/appium-uiautomator2-driver/compare/v2.25.3...v2.26.0) (2023-06-11)
2
+
3
+
4
+ ### Features
5
+
6
+ * Add extensions for scheduled actions ([#616](https://github.com/appium/appium-uiautomator2-driver/issues/616)) ([3e1c24d](https://github.com/appium/appium-uiautomator2-driver/commit/3e1c24da84d7bc2084b32addad305575c252f43b))
7
+
8
+ ## [2.25.3](https://github.com/appium/appium-uiautomator2-driver/compare/v2.25.2...v2.25.3) (2023-06-08)
9
+
10
+
11
+ ### Miscellaneous Chores
12
+
13
+ * add logging for mjpeg broadcast request ([#622](https://github.com/appium/appium-uiautomator2-driver/issues/622)) ([da64bf5](https://github.com/appium/appium-uiautomator2-driver/commit/da64bf5ba2ed1ea95a6c2292d9ea557bd8229f4f))
14
+
1
15
  ## [2.25.2](https://github.com/appium/appium-uiautomator2-driver/compare/v2.25.1...v2.25.2) (2023-06-02)
2
16
 
3
17
 
package/README.md CHANGED
@@ -48,7 +48,7 @@ appium:printPageSourceOnFindFailure | Enforces the server to dump the actual XML
48
48
 
49
49
  Capability Name | Description
50
50
  --- | ---
51
- appium:systemPort | The number of the port the UiAutomator2 server is listening on. By default the first free port from 8200..8299 range is selected. It is recommended to set this value if you are running [parallel tests](#parallel-tests) on the same machine.
51
+ appium:systemPort | The number of the port on the host machine used for the UiAutomator2 server. By default the first free port from 8200..8299 range is selected. It is recommended to set this value if you are running [parallel tests](#parallel-tests) on the same machine.
52
52
  appium:skipServerInstallation | Skip the UiAutomator2 Server component installation on the device under test and all the related checks if set to `true`. This could help to speed up the session startup if you know for sure the correct server version is installed on the device. In case the server is not installed or an incorrect version of it is installed then you may get an unexpected error later. `false` by default
53
53
  appium:uiautomator2ServerLaunchTimeout | The maximum number of milliseconds to wait util UiAutomator2Server is listening on the device. `30000` ms by default
54
54
  appium:uiautomator2ServerInstallTimeout | The maximum number of milliseconds to wait util UiAutomator2Server is installed on the device. `20000` ms by default
@@ -82,7 +82,7 @@ appium:otherApps | Allows to set one or more comma-separated paths to Android pa
82
82
  appium:uninstallOtherPackages | Allows to set one or more comma-separated package identifiers to be uninstalled from the device before a test starts
83
83
  appium:allowTestPackages | If set to `true` then it would be possible to use packages built with the test flag for the automated testing (literally adds `-t` flag to the `adb install` command). `false` by default
84
84
  appium:remoteAppsCacheLimit | Sets the maximum amount of application packages to be cached on the device under test. This is needed for devices that don't support streamed installs (Android 7 and below), because ADB must push app packages to the device first in order to install them, which takes some time. Setting this capability to zero disables apps caching. `10` by default.
85
- appium:enforceAppInstall | If set to `true` then the application under test is always reinstalled even if a newer version of it already exists on the device under test. `false` by default
85
+ appium:enforceAppInstall | If set to `true` then the application under test is always reinstalled even if a newer version of it already exists on the device under test. This capability has no effect if `appium:noReset` is set to `true`. `false` by default
86
86
 
87
87
  ### App Localization
88
88
 
@@ -96,7 +96,7 @@ appium:locale | Sets the locale for the app under test. See https://developer.an
96
96
 
97
97
  Capability Name | Description
98
98
  --- | ---
99
- appium:adbPort | Number of the port where ADB is running. `5037` by default
99
+ appium:adbPort | Number of the port on the host machine where ADB is running. `5037` by default
100
100
  appium:remoteAdbHost | Address of the host where ADB is running (the value of `-H` ADB command line option). Unset by default
101
101
  appium:adbExecTimeout | Maximum number of milliseconds to wait until single ADB command is executed. `20000` ms by default
102
102
  appium:clearDeviceLogsOnStart | If set to `true` then UiAutomator2 deletes all the existing logs in the device buffer before starting a new test
@@ -147,7 +147,7 @@ appium:unlockSuccessTimeout | Maximum number of milliseconds to wait until the d
147
147
 
148
148
  Capability Name | Description
149
149
  --- | ---
150
- appium:mjpegServerPort | The number of the port UiAutomator2 server starts the MJPEG server on. If not provided then the screenshots broadcasting service on the remote device does not get exposed to a local port (e.g. no adb port forwarding is happening)
150
+ appium:mjpegServerPort | The number of the port on the host machine that UiAutomator2 server starts the MJPEG server on. If not provided then the screenshots broadcasting service on the remote device does not get exposed to a local port (e.g. no adb port forwarding is happening)
151
151
  appium:mjpegScreenshotUrl | The URL of a service that provides realtime device screenshots in MJPEG format. If provided then the actual command to retrieve a screenshot will be requesting pictures from this service rather than directly from the server
152
152
 
153
153
  ### Web Context
@@ -256,14 +256,14 @@ which allows you to avoid possible issues with such sessions silently running/ex
256
256
 
257
257
  ## Settings API
258
258
 
259
- UiAutomator2 driver supports Appium [Settings API](https://appium.io/docs/en/advanced-concepts/settings/).
259
+ UiAutomator2 driver supports Appium [Settings API](https://appium.io/docs/en/latest/guides/settings/).
260
260
  Along with the common settings the following driver-specific settings are currently available:
261
261
 
262
262
  Name | Type | Description
263
263
  --- | --- | ---
264
264
  actionAcknowledgmentTimeout | long | Maximum number of milliseconds to wait for an acknowledgment of generic uiautomator actions, such as clicks, text setting, and menu presses. The acknowledgment is an[AccessibilityEvent](http://developer.android.com/reference/android/view/accessibility/AccessibilityEvent.html") corresponding to an action, that lets the framework determine if the action was successful. Generally, this timeout should not be modified. `3000` ms by default
265
265
  allowInvisibleElements | boolean | Whether to include elements that are not visible to the user (e. g. whose `displayed` attribute is `false`) to the XML source tree. `false` by default
266
- ignoreUnimportantViews | boolean | Enables or disables layout hierarchy compression. If compression is enabled, the layout hierarchy derived from the Acessibility framework will only contain nodes that are important for uiautomator testing. Any unnecessary surrounding layout nodes that make viewing and searching the hierarchy inefficient are removed. `true` by default
266
+ ignoreUnimportantViews | boolean | Enables or disables layout hierarchy compression. If compression is enabled, the layout hierarchy derived from the Acessibility framework will only contain nodes that are important for uiautomator testing. Any unnecessary surrounding layout nodes that make viewing and searching the hierarchy inefficient are removed. `false` by default
267
267
  elementResponseAttributes | string | Comma-separated list of element attribute names to be included into findElement response. By default only element UUID is present there, but it is also possible to add the following items: `name`, `text`, `rect`, `enabled`, `displayed`, `selected`, `attribute/<element_attribute_name>`. It is required that `shouldUseCompactResponses` setting is set to `false` in order for this one to apply.
268
268
  enableMultiWindows | boolean | Whether to include all windows that the user can interact with (for example an on-screen keyboard) while building the XML page source (`true`). By default it is `false` and only the single active application window is included to the page source.
269
269
  enableTopmostWindowFromActivePackage | boolean | Whether to limit the window with the highest Z-order from the active package for interactions and page source retrieval. By default it is `false` and the active application window, which may not necessarily have this order, is included to the page source.
@@ -278,8 +278,8 @@ shutdownOnPowerDisconnect | boolean | Whether to shutdown the server if the devi
278
278
  simpleBoundsCalculation | boolean | Whether to calculate element bounds as absolute values (`true`) or check if the element is covered by other elements and thus partially hidden (`false`, the default behaviour). Setting this setting to `true` helps to improve the performance of XML page source generation, but decreases bounds preciseness. Use with care.
279
279
  trackScrollEvents | boolean | Whether to apply scroll events tracking (`true`, the default value), so the server could calculate the value of `contentSize` attribute. Having this setting enabled may add delays to all scrolling actions.
280
280
  wakeLockTimeout | long | The timeout in milliseconds of wake lock that UiAutomator2 server acquires by default to prevent the device under test going to sleep while an automated test is running. By default the server acquires the lock for 24 hours. Setting this value to zero forces the server to release the wake lock.
281
- serverPort | int | The port number to start UiAutomator2 server on. Do not mix this with the `systemPort`, because this port is being acquired on the remote device under test rather than on the host machine. Must be in range 1024..65535. `6790` by default
282
- mjpegServerPort | int | The port number on the remote device to start MJPEG screenshots broadcaster on. Must be in range 1024..65535. `7810` by default
281
+ serverPort | int | The number of the port on the remote device to start UiAutomator2 server on. Do not mix this with `systemPort`, which is acquired on the host machine. Must be in range 1024..65535. `6790` by default
282
+ mjpegServerPort | int | The number of the port on the remote device to start MJPEG screenshots broadcaster on. Must be in range 1024..65535. `7810` by default
283
283
  mjpegServerFramerate | int | The maximum count of screenshots per second taken by the MJPEG screenshots broadcaster. Must be in range 1..60. `10` by default
284
284
  mjpegScalingFactor | int | The percentage value used to apply downscaling on the screenshots generated by the MJPEG screenshots broadcaster. Must be in range 1..100. `50` is by default, which means that screenshots are downscaled to the half of their original size keeping their original proportions.
285
285
  mjpegServerScreenshotQuality | int | The percentage value used to apply lossy JPEG compression on the screenshots generated by the MJPEG screenshots broadcaster. Must be in range 1..100. `50` is by default, which means that screenshots are compressed to the half of their original quality.
@@ -1355,6 +1355,11 @@ component | string | no | The name of the tile component. It is only required fo
1355
1355
 
1356
1356
  The actual downstream command output. It depends on the selected command and might be empty.
1357
1357
 
1358
+ ### mobile: scheduleAction
1359
+ ### mobile: unscheduleAction
1360
+ ### mobile: getActionHistory
1361
+
1362
+ These extensions allow to deal with short-living UI elements. Read [the documentation on Scheduled Actions](docs/scheduled-actions.md) for more details and code examples.
1358
1363
 
1359
1364
  ## Applications Management
1360
1365
 
@@ -181,6 +181,7 @@ class AndroidUiautomator2Driver extends _driver.BaseDriver {
181
181
  }
182
182
  async allocateMjpegServerPort() {
183
183
  if (this.opts.mjpegServerPort) {
184
+ this.log.debug(`MJPEG broadcasting requested, forwarding MJPEG server port ${MJPEG_SERVER_DEVICE_PORT} ` + `to local port ${this.opts.mjpegServerPort}`);
184
185
  await this.adb.forwardPort(this.opts.mjpegServerPort, MJPEG_SERVER_DEVICE_PORT);
185
186
  }
186
187
  }
@@ -517,4 +518,4 @@ for (let [cmd, fn] of _lodash.default.toPairs(_index.default)) {
517
518
  }
518
519
  var _default = AndroidUiautomator2Driver;
519
520
  exports.default = _default;
520
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX3VpYXV0b21hdG9yIiwiX21ldGhvZE1hcCIsIl9zdXBwb3J0IiwiX2FzeW5jYm94IiwiX2JsdWViaXJkIiwiX2luZGV4IiwiX2FwcGl1bUFkYiIsIl9oZWxwZXJzIiwiX2FwcGl1bUFuZHJvaWREcml2ZXIiLCJfZGVzaXJlZENhcHMiLCJfcG9ydHNjYW5uZXIiLCJfb3MiLCJfcGF0aCIsIl9leHRlbnNpb25zIiwiaGVscGVycyIsIk9iamVjdCIsImFzc2lnbiIsInVpYXV0b21hdG9yMkhlbHBlcnMiLCJhbmRyb2lkSGVscGVycyIsIkRFVklDRV9QT1JUX1JBTkdFIiwiREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCIsInV0aWwiLCJnZXRMb2NrRmlsZUd1YXJkIiwicGF0aCIsInJlc29sdmUiLCJvcyIsInRtcGRpciIsInRpbWVvdXQiLCJ0cnlSZWNvdmVyeSIsIkRFVklDRV9QT1JUIiwiTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUIiwiTE9DQUxIT1NUX0lQNCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiTUVNT0laRURfRlVOQ1RJT05TIiwiQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciIsIkJhc2VEcml2ZXIiLCJuZXdNZXRob2RNYXAiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJzaG91bGRWYWxpZGF0ZUNhcHMiLCJzaGVsbCIsImxvY2F0b3JTdHJhdGVnaWVzIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwidWlhdXRvbWF0b3IyIiwiandwUHJveHlBY3RpdmUiLCJqd3BQcm94eUF2b2lkIiwiYXBrU3RyaW5ncyIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwiYWxsb3dJbnZpc2libGVFbGVtZW50cyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJmbiIsIl8iLCJtZW1vaXplIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJjcmVhdGVTZXNzaW9uIiwiYXJncyIsInNlc3Npb25JZCIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImRlZmF1bHRPcHRzIiwiZnVsbFJlc2V0IiwiYXV0b0xhdW5jaCIsImFkYlBvcnQiLCJERUZBVUxUX0FEQl9QT1JUIiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiZGVmYXVsdHMiLCJpc0Nocm9tZVNlc3Npb24iLCJsb2ciLCJpbmZvIiwicGtnIiwiYWN0aXZpdHkiLCJnZXRDaHJvbWVQa2ciLCJicm93c2VyTmFtZSIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsInJlYm9vdCIsInNldEF2ZEZyb21DYXBhYmlsaXRpZXMiLCJhcHAiLCJjb25maWd1cmVBcHAiLCJBUEtfRVhURU5TSU9OIiwiQVBLU19FWFRFTlNJT04iLCJjaGVja0FwcFByZXNlbnQiLCJzdGFydFVpQXV0b21hdG9yMlNlc3Npb24iLCJmaWxsRGV2aWNlRGV0YWlscyIsIm1qcGVnU2NyZWVuc2hvdFVybCIsIm1qcGVnU3RyZWFtIiwibWpwZWciLCJNSnBlZ1N0cmVhbSIsInN0YXJ0IiwiZSIsImRlbGV0ZVNlc3Npb24iLCJwaXhlbFJhdGlvIiwiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsInN0YXRCYXJIZWlnaHQiLCJnZXRTdGF0dXNCYXJIZWlnaHQiLCJ2aWV3cG9ydFJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJkcml2ZXJEYXRhIiwiZ2V0U2Vzc2lvbiIsInNlc3Npb25EYXRhIiwiZGVidWciLCJ1aWEyRGF0YSIsImp3cHJveHkiLCJjb21tYW5kIiwiaXNFbXVsYXRvciIsImFkYiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImFsbG9jYXRlU3lzdGVtUG9ydCIsImZvcndhcmRQb3J0IiwibG9jYWxQb3J0IiwiY2hlY2tQb3J0U3RhdHVzIiwic3lzdGVtUG9ydCIsIl9oYXNTeXN0ZW1Qb3J0SW5DYXBzIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwicmVsZWFzZVN5c3RlbVBvcnQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0IiwibWpwZWdTZXJ2ZXJQb3J0IiwicmVsZWFzZU1qcGVnU2VydmVyUG9ydCIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJjcmVhdGVBREIiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwic2V0SGlkZGVuQXBpUG9saWN5IiwiaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IiLCJoYXNWYWx1ZSIsImdwc0VuYWJsZWQiLCJ0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIiwid2FybiIsImFwcEluZm8iLCJnZXRMYXVuY2hJbmZvIiwiY3VyRGV2aWNlSWQiLCJkZXZpY2VVRElEIiwiaW5pdERldmljZSIsImluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwiaXNBbmltYXRpb25PbiIsInNldEFuaW1hdGlvblN0YXRlIiwiX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkIiwiaW5pdEFVVCIsInN0YXJ0U2Vzc2lvbiIsImFkZERldmljZUluZm9Ub0NhcHMiLCJza2lwVW5sb2NrIiwidW5sb2NrIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwiZW5zdXJlQXBwU3RhcnRzIiwib3JpZW50YXRpb24iLCJzZXRPcmllbnRhdGlvbiIsImF1dG9XZWJ2aWV3Iiwidmlld05hbWUiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJhdXRvV2Vidmlld1RpbWVvdXQiLCJyZXRyeUludGVydmFsIiwic2V0Q29udGV4dCIsImFwaVZlcnNpb24iLCJtYW51ZmFjdHVyZXIiLCJtb2RlbCIsInJlYWxEaXNwbGF5U2l6ZSIsImRpc3BsYXlEZW5zaXR5IiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsImRldmljZUFwaUxldmVsIiwicGFyc2VJbnQiLCJkZXZpY2VTY3JlZW5TaXplIiwiZGV2aWNlU2NyZWVuRGVuc2l0eSIsImRldmljZU1vZGVsIiwiZGV2aWNlTWFudWZhY3R1cmVyIiwidWlhdXRvbWF0b3IyT3B0cyIsImhvc3QiLCJyZW1vdGVBZGJIb3N0IiwiZGV2aWNlUG9ydCIsImFwayIsInRtcERpciIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicmVhZFRpbWVvdXQiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCIsIlVpQXV0b21hdG9yMlNlcnZlciIsInByb3h5UmVxUmVzIiwicHJveHlDb21tYW5kIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsImluc3RhbGxTZXJ2ZXJBcGsiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCIsImFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJzdGRlcnIiLCJtZXNzYWdlIiwidW5pbnN0YWxsT3RoZXJQYWNrYWdlcyIsInBhcnNlQXJyYXkiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwibWFwIiwiaW5zdGFsbE90aGVyQXBrcyIsIm5vUmVzZXQiLCJpc0FwcEluc3RhbGxlZCIsIm5vU2lnbiIsImNoZWNrQXBrQ2VydCIsInJlcXVpcmVEZWZhdWx0Q2VydCIsInNpZ25BcHAiLCJza2lwVW5pbnN0YWxsIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbEFwayIsImZhc3RSZXNldCIsInJlc2V0QXBwIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJhbmRyb2lkQ292ZXJhZ2UiLCJmb3JjZUFwcExhdW5jaCIsInByb2Nlc3NFeGlzdHMiLCJzdGFydEFwcCIsImFjdGlvbiIsImludGVudEFjdGlvbiIsImNhdGVnb3J5IiwiaW50ZW50Q2F0ZWdvcnkiLCJmbGFncyIsImludGVudEZsYWdzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsIndhaXRGb3JMYXVuY2giLCJhcHBXYWl0Rm9yTGF1bmNoIiwid2FpdER1cmF0aW9uIiwiYXBwV2FpdER1cmF0aW9uIiwib3B0aW9uYWxJbnRlbnRBcmd1bWVudHMiLCJzdG9wQXBwIiwiZG9udFN0b3BBcHBPblJlc2V0IiwicmV0cnkiLCJ1c2VyIiwidXNlclByb2ZpbGUiLCJzY3JlZW5SZWNvcmRpbmdTdG9wVGFza3MiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwibW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwibW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsIl9zY3JlZW5TdHJlYW1pbmdQcm9wcyIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzdG9wQ2hyb21lZHJpdmVyUHJveGllcyIsImVyciIsInRhc2siLCJpZ24iLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJhbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQiLCJicm9hZGNhc3QiLCJzaG91bGRUZXJtaW5hdGVBcHAiLCJmb3JjZVN0b3AiLCJzdG9wTG9nY2F0IiwiZXJyb3IiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IiwiYXZkTmFtZSIsImtpbGxFbXVsYXRvciIsInN0b3AiLCJmcyIsImV4aXN0cyIsIndyYXBCb290c3RyYXBEaXNjb25uZWN0Iiwid3JhcHBlZCIsInJlc3RhcnQiLCJwcm94eUFjdGl2ZSIsImNhblByb3h5IiwiZ2V0UHJveHlBdm9pZExpc3QiLCJuYXRpdmVXZWJTY3JlZW5zaG90IiwiaXNDaHJvbWVCcm93c2VyIiwiZXhwb3J0cyIsImNtZCIsInRvUGFpcnMiLCJhbmRyb2lkQ29tbWFuZHMiLCJwcm90b3R5cGUiLCJjb21tYW5kcyIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJhc2VEcml2ZXIsIERldmljZVNldHRpbmdzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQge1xuICBVaUF1dG9tYXRvcjJTZXJ2ZXIsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEXG59IGZyb20gJy4vdWlhdXRvbWF0b3IyJztcbmltcG9ydCB7IG5ld01ldGhvZE1hcCB9IGZyb20gJy4vbWV0aG9kLW1hcCc7XG5pbXBvcnQgeyBmcywgdXRpbCwgbWpwZWcgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMvaW5kZXgnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHVpYXV0b21hdG9yMkhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGFuZHJvaWRIZWxwZXJzLCBhbmRyb2lkQ29tbWFuZHMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIH0gZnJvbSAnYXBwaXVtLWFuZHJvaWQtZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ2FwQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UsIGNoZWNrUG9ydFN0YXR1cyB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OIH0gZnJvbSAnLi9leHRlbnNpb25zJztcblxuXG5jb25zdCBoZWxwZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdWlhdXRvbWF0b3IySGVscGVycywgYW5kcm9pZEhlbHBlcnMpO1xuXG4vLyBUaGUgcmFuZ2Ugb2YgcG9ydHMgd2UgY2FuIHVzZSBvbiB0aGUgc3lzdGVtIGZvciBjb21tdW5pY2F0aW5nIHRvIHRoZVxuLy8gVWlBdXRvbWF0b3IyIEhUVFAgc2VydmVyIG9uIHRoZSBkZXZpY2VcbmNvbnN0IERFVklDRV9QT1JUX1JBTkdFID0gWzgyMDAsIDgyOTldO1xuXG4vLyBUaGUgZ3VhcmQgaXMgbmVlZGVkIHRvIGF2b2lkIGR5bmFtaWMgc3lzdGVtIHBvcnQgYWxsb2NhdGlvbiBjb25mbGljdHMgZm9yXG4vLyBwYXJhbGxlbCBkcml2ZXIgc2Vzc2lvbnNcbmNvbnN0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQoXG4gIHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ3VpYTJfZGV2aWNlX3BvcnRfZ3VhcmQnKSxcbiAge3RpbWVvdXQ6IDI1LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5cbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCBVaUF1dG9tYXRvcjIgbGlzdGVucyB0byBvbiB0aGUgZGV2aWNlLiBXZSB3aWxsIGZvcndhcmRcbi8vIG9uZSBvZiB0aGUgcG9ydHMgYWJvdmUgb24gdGhlIHN5c3RlbSB0byB0aGlzIHBvcnQgb24gdGhlIGRldmljZS5cbmNvbnN0IERFVklDRV9QT1JUID0gNjc5MDtcbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCB0aGUgVWlBdXRvbWF0b3IyIE1KUEVHIHNlcnZlciBsaXN0ZW5zIHRvIG9uIHRoZSBkZXZpY2UuXG4vLyBXZSB3aWxsIGZvcndhcmQgb25lIG9mIHRoZSBwb3J0cyBhYm92ZSBvbiB0aGUgc3lzdGVtIHRvIHRoaXMgcG9ydCBvbiB0aGVcbi8vIGRldmljZS5cbmNvbnN0IE1KUEVHX1NFUlZFUl9ERVZJQ0VfUE9SVCA9IDc4MTA7XG5cbmNvbnN0IExPQ0FMSE9TVF9JUDQgPSAnMTI3LjAuMC4xJztcblxuLy8gTk9fUFJPWFkgY29udGFpbnMgdGhlIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBVaUF1dG9tYXRvcjIgc2VydmVyLlxuLy8gVE9ETzogIEFkZCB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gVWlBdXRvbWF0b3IyIHNlcnZlci5cbi8vIFRPRE86IE5lZWQgdG8gc2VncmVnYXRlIHRoZSBwYXRocyBiZXR0ZXIgd2F5IHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hlcmV2ZXIgYXBwbGljYWJsZS5cbi8vIChOb3Qgc2VncmVnYXRpbmcgcmlnaHQgYXdheSBiZWNhdXNlIG1vcmUgcGF0aHMgdG8gYmUgYWRkZWQgaW4gdGhlIE5PX1BST1hZIGxpc3QpXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vKD8hLiovKScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnRfW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FsZXJ0L1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvY3VycmVudF9hY3Rpdml0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL2N1cnJlbnRfcGFja2FnZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9hdHRyaWJ1dGUnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZGlzcGxheWVkJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2VuYWJsZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvbG9jYXRpb25faW5fdmlldycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9uYW1lJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3NjcmVlbnNob3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvc2VsZWN0ZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9jYXRpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL1teL10rX2FsZXJ0JCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FjdGlvbnMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hbGVydC9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcC9bXi9dJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL3N0YXJ0X2FjdGl2aXR5JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9jb21wYXJlX2ltYWdlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvKD8hc2V0X2NsaXBib2FyZClbXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9lbGVtZW50L1teL10rL3JlcGxhY2VfdmFsdWUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZWxlbWVudC9bXi9dKy92YWx1ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9nZXRQZXJmb3JtYW5jZURhdGEnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vcGVyZm9ybWFuY2VEYXRhL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2V4ZWN1dGVfZHJpdmVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0YXJ0X3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RvcF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtLy4qZXZlbnQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2tleXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZV9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZycpXSxcbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy93aW5kb3cvcmVjdCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvYXN5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZycpXSxcbl07XG5cbi8vIFRoaXMgaXMgYSBzZXQgb2YgbWV0aG9kcyBhbmQgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIENocm9tZWRyaXZlci5cbmNvbnN0IENIUk9NRV9OT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3JlY3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG5cbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gbWFrZSB0aGUgbW9iaWxlOiBjb21tYW5kcyB3b3JraW5nIGluIHdlYiBjb250ZXh0XG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcblxuICAvLyBNSlNPTldQIGNvbW1hbmRzXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZy90eXBlcyQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2ckJyldLFxuICAvLyBXM0MgY29tbWFuZHNcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cvdHlwZXMkJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2ckJyldLFxuXTtcblxuY29uc3QgTUVNT0laRURfRlVOQ1RJT05TID0gW1xuICAnZ2V0U3RhdHVzQmFySGVpZ2h0JyxcbiAgJ2dldERldmljZVBpeGVsUmF0aW8nLFxuXTtcblxuY2xhc3MgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuXG4gIHN0YXRpYyBuZXdNZXRob2RNYXAgPSBuZXdNZXRob2RNYXA7XG5cbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSwgc2hvdWxkVmFsaWRhdGVDYXBzID0gdHJ1ZSkge1xuICAgIC8vIGBzaGVsbGAgb3ZlcndyaXRlcyBhZGIuc2hlbGwsIHNvIHJlbW92ZVxuICAgIGRlbGV0ZSBvcHRzLnNoZWxsO1xuXG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcbiAgICB0aGlzLmxvY2F0b3JTdHJhdGVnaWVzID0gW1xuICAgICAgJ3hwYXRoJyxcbiAgICAgICdpZCcsXG4gICAgICAnY2xhc3MgbmFtZScsXG4gICAgICAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgICAnY3NzIHNlbGVjdG9yJyxcbiAgICAgICctYW5kcm9pZCB1aWF1dG9tYXRvcidcbiAgICBdO1xuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENhcENvbnN0cmFpbnRzO1xuICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgdGhpcy5hcGtTdHJpbmdzID0ge307IC8vIG1hcCBvZiBsYW5ndWFnZSAtPiBzdHJpbmdzIG9ialxuXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2UsIGFsbG93SW52aXNpYmxlRWxlbWVudHM6IGZhbHNlfSxcbiAgICAgICAgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIC8vIGhhbmRsZSB3ZWJ2aWV3IG1lY2hhbmljcyBmcm9tIEFuZHJvaWREcml2ZXJcbiAgICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVycyA9IHt9O1xuXG4gICAgLy8gbWVtb2l6ZSBmdW5jdGlvbnMgaGVyZSwgc28gdGhhdCB0aGV5IGFyZSBkb25lIG9uIGEgcGVyLWluc3RhbmNlIGJhc2lzXG4gICAgZm9yIChjb25zdCBmbiBvZiBNRU1PSVpFRF9GVU5DVElPTlMpIHtcbiAgICAgIHRoaXNbZm5dID0gXy5tZW1vaXplKHRoaXNbZm5dKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlRGVzaXJlZENhcHMoY2FwcykgJiYgYW5kcm9pZEhlbHBlcnMudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IHRoaXMuY2FwcyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oXCJXZSdyZSBnb2luZyB0byBydW4gYSBDaHJvbWUtYmFzZWQgc2Vzc2lvblwiKTtcbiAgICAgICAgbGV0IHtwa2csIGFjdGl2aXR5fSA9IGhlbHBlcnMuZ2V0Q2hyb21lUGtnKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gICAgICAgIHRoaXMub3B0cy5hcHBQYWNrYWdlID0gdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBwa2c7XG4gICAgICAgIHRoaXMub3B0cy5hcHBBY3Rpdml0eSA9IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBDaHJvbWUtdHlwZSBwYWNrYWdlIGFuZCBhY3Rpdml0eSBhcmUgJHtwa2d9IGFuZCAke2FjdGl2aXR5fWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgIC8vIGZpbmQgYW5kIGNvcHksIG9yIGRvd25sb2FkIGFuZCB1bnppcCBhbiBhcHAgdXJsIG9yIHBhdGhcbiAgICAgICAgdGhpcy5vcHRzLmFwcCA9IGF3YWl0IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAodGhpcy5vcHRzLmFwcCwgW0FQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBQcmVzZW50KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIC8vIHRoZSBhcHAgaXNuJ3QgYW4gYWN0dWFsIGFwcCBmaWxlIGJ1dCByYXRoZXIgc29tZXRoaW5nIHdlIHdhbnQgdG9cbiAgICAgICAgLy8gYXNzdW1lIGlzIG9uIHRoZSBkZXZpY2UgYW5kIGp1c3QgbGF1bmNoIHZpYSB0aGUgYXBwUGFja2FnZVxuICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdGFydGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nIGRpcmVjdGx5IG9uIHRoZSBkZXZpY2VgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYE5laXRoZXIgJ2FwcCcgbm9yICdhcHBQYWNrYWdlJyB3YXMgc2V0LiBTdGFydGluZyBVaUF1dG9tYXRvcjIgYCArXG4gICAgICAgICAgJ3dpdGhvdXQgdGhlIHRhcmdldCBhcHBsaWNhdGlvbicpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VWlBdXRvbWF0b3IyU2Vzc2lvbigpO1xuICAgICAgYXdhaXQgdGhpcy5maWxsRGV2aWNlRGV0YWlscygpO1xuICAgICAgaWYgKHRoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmwpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgTUpQRUcgc3RyZWFtIHJlYWRpbmcgVVJMOiAnJHt0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsfSdgKTtcbiAgICAgICAgdGhpcy5tanBlZ1N0cmVhbSA9IG5ldyBtanBlZy5NSnBlZ1N0cmVhbSh0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsKTtcbiAgICAgICAgYXdhaXQgdGhpcy5tanBlZ1N0cmVhbS5zdGFydCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtzZXNzaW9uSWQsIHRoaXMuY2Fwc107XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZpbGxEZXZpY2VEZXRhaWxzICgpIHtcbiAgICB0aGlzLmNhcHMucGl4ZWxSYXRpbyA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO1xuICAgIHRoaXMuY2Fwcy5zdGF0QmFySGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRTdGF0dXNCYXJIZWlnaHQoKTtcbiAgICB0aGlzLmNhcHMudmlld3BvcnRSZWN0ID0gYXdhaXQgdGhpcy5nZXRWaWV3UG9ydFJlY3QoKTtcbiAgfVxuXG4gIGdldCBkcml2ZXJEYXRhICgpIHtcbiAgICAvLyBUT0RPIGZpbGwgb3V0IHJlc291cmNlIGluZm8gaGVyZVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGFzeW5jIGdldFNlc3Npb24gKCkge1xuICAgIGxldCBzZXNzaW9uRGF0YSA9IGF3YWl0IHN1cGVyLmdldFNlc3Npb24oKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnR2V0dGluZyBzZXNzaW9uIGRldGFpbHMgZnJvbSBzZXJ2ZXIgdG8gbWl4IGluJyk7XG4gICAgbGV0IHVpYTJEYXRhID0gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvJywgJ0dFVCcsIHt9KTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc2Vzc2lvbkRhdGEsIHVpYTJEYXRhKTtcbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlU3lzdGVtUG9ydCAoKSB7XG4gICAgY29uc3QgZm9yd2FyZFBvcnQgPSBhc3luYyAobG9jYWxQb3J0KSA9PiB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBVaUF1dG9tYXRvcjIgU2VydmVyIHBvcnQgJHtERVZJQ0VfUE9SVH0gdG8gbG9jYWwgcG9ydCAke2xvY2FsUG9ydH1gKTtcbiAgICAgIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKGxvY2FsUG9ydCwgTE9DQUxIT1NUX0lQNCkpID09PSAnb3BlbicpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVWlBdXRvbWF0b3IyIFNlcnZlciBjYW5ub3Qgc3RhcnQgYmVjYXVzZSB0aGUgbG9jYWwgcG9ydCAjJHtsb2NhbFBvcnR9IGlzIGJ1c3kuIGAgK1xuICAgICAgICAgIGBNYWtlIHN1cmUgdGhlIHBvcnQgeW91IHByb3ZpZGUgdmlhICdzeXN0ZW1Qb3J0JyBjYXBhYmlsaXR5IGlzIG5vdCBvY2N1cGllZC4gYCArXG4gICAgICAgICAgYFRoaXMgc2l0dWF0aW9uIG1pZ2h0IG9mdGVuIGJlIGEgcmVzdWx0IG9mIGFuIGluYWNjdXJhdGUgc2Vzc2lvbnMgbWFuYWdlbWVudCwgZS5nLiBgICtcbiAgICAgICAgICBgb2xkIGF1dG9tYXRpb24gc2Vzc2lvbnMgb24gdGhlIHNhbWUgZGV2aWNlIG11c3QgYWx3YXlzIGJlIGNsb3NlZCBiZWZvcmUgc3RhcnRpbmcgbmV3IG9uZXMuYCk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydChsb2NhbFBvcnQsIERFVklDRV9QT1JUKTtcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KSB7XG4gICAgICB0aGlzLl9oYXNTeXN0ZW1Qb3J0SW5DYXBzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBhd2FpdCBmb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgfVxuXG4gICAgYXdhaXQgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBbc3RhcnRQb3J0LCBlbmRQb3J0XSA9IERFVklDRV9QT1JUX1JBTkdFO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5vcHRzLnN5c3RlbVBvcnQgPSBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShzdGFydFBvcnQsIGVuZFBvcnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KFxuICAgICAgICAgIGBDYW5ub3QgZmluZCBhbnkgZnJlZSBwb3J0IGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fX0uIGAgK1xuICAgICAgICAgIGBQbGVhc2Ugc2V0IHRoZSBhdmFpbGFibGUgcG9ydCBudW1iZXIgYnkgcHJvdmlkaW5nIHRoZSBzeXN0ZW1Qb3J0IGNhcGFiaWxpdHkgb3IgYCArXG4gICAgICAgICAgYGRvdWJsZSBjaGVjayB0aGUgcHJvY2Vzc2VzIHRoYXQgYXJlIGxvY2tpbmcgcG9ydHMgd2l0aGluIHRoaXMgcmFuZ2UgYW5kIHRlcm1pbmF0ZSBgICtcbiAgICAgICAgICBgdGhlc2Ugd2hpY2ggYXJlIG5vdCBuZWVkZWQgYW55bW9yZWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgZm9yd2FyZFBvcnQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVsZWFzZVN5c3RlbVBvcnQgKCkge1xuICAgIGlmICghdGhpcy5vcHRzLnN5c3RlbVBvcnQgfHwgIXRoaXMuYWRiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2hhc1N5c3RlbVBvcnRJbkNhcHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMuc3lzdGVtUG9ydCkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yd2FyZFBvcnQodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCwgTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRVaUF1dG9tYXRvcjJTZXNzaW9uICgpIHtcbiAgICAvLyBnZXQgZGV2aWNlIHVkaWQgZm9yIHRoaXMgc2Vzc2lvblxuICAgIGxldCB7dWRpZCwgZW1Qb3J0fSA9IGF3YWl0IGhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzKHRoaXMub3B0cyk7XG4gICAgdGhpcy5vcHRzLnVkaWQgPSB1ZGlkO1xuICAgIHRoaXMub3B0cy5lbVBvcnQgPSBlbVBvcnQ7XG5cbiAgICAvLyBub3cgdGhhdCB3ZSBrbm93IG91ciBqYXZhIHZlcnNpb24gYW5kIGRldmljZSBpbmZvLCB3ZSBjYW4gY3JlYXRlIG91clxuICAgIC8vIEFEQiBpbnN0YW5jZVxuICAgIHRoaXMuYWRiID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMuY3JlYXRlQURCKHRoaXMub3B0cyk7XG5cbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG5cbiAgICBpZiAoYXBpTGV2ZWwgPCAyMSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnVUlBdXRvbWF0b3IyIGlzIG9ubHkgc3VwcG9ydGVkIHNpbmNlIEFuZHJvaWQgNS4wIChMb2xsaXBvcCkuICcgK1xuICAgICAgICAnWW91IGNvdWxkIHN0aWxsIHVzZSBvdGhlciBzdXBwb3J0ZWQgYmFja2VuZHMgaW4gb3JkZXIgdG8gYXV0b21hdGUgb2xkZXIgQW5kcm9pZCB2ZXJzaW9ucy4nKTtcbiAgICB9XG5cbiAgICBpZiAoYXBpTGV2ZWwgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICB0aGlzLmxvZy5pbmZvKCdSZWxheGluZyBoaWRkZW4gYXBpIHBvbGljeScpO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0SGlkZGVuQXBpUG9saWN5KCcxJywgISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgdG8gZW5hYmxlL2Rpc2FibGUgZ3BzIGJlZm9yZSBydW5uaW5nIHRoZSBhcHBsaWNhdGlvblxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5ncHNFbmFibGVkKSkge1xuICAgICAgaWYgKHRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFRyeWluZyB0byAke3RoaXMub3B0cy5ncHNFbmFibGVkID8gJ2VuYWJsZScgOiAnZGlzYWJsZSd9IGdwcyBsb2NhdGlvbiBwcm92aWRlcmApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyKHRoaXMub3B0cy5ncHNFbmFibGVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFNvcnJ5ISAnZ3BzRW5hYmxlZCcgY2FwYWJpbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBjb25zdCBhcHBJbmZvID0gYXdhaXQgaGVscGVycy5nZXRMYXVuY2hJbmZvKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIC8vIGFuZCBnZXQgaXQgb250byBvdXIgJ29wdHMnIG9iamVjdCBzbyB3ZSB1c2UgaXQgZnJvbSBub3cgb25cbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0cywgYXBwSW5mbyB8fCB7fSk7XG5cbiAgICAvLyBzZXQgYWN0dWFsIGRldmljZSBuYW1lLCB1ZGlkLCBwbGF0Zm9ybSB2ZXJzaW9uLCBzY3JlZW4gc2l6ZSwgc2NyZWVuIGRlbnNpdHksIG1vZGVsIGFuZCBtYW51ZmFjdHVyZXIgZGV0YWlsc1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VOYW1lID0gdGhpcy5hZGIuY3VyRGV2aWNlSWQ7XG4gICAgdGhpcy5jYXBzLmRldmljZVVESUQgPSB0aGlzLm9wdHMudWRpZDtcblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgVWlBdXRvbWF0b3IyIHBvcnRcbiAgICAvLyBUaGlzIGNhbGwgbXV0YXRlcyB0aGlzLm9wdHMuc3lzdGVtUG9ydCBpZiBpdCBpcyBub3Qgc2V0IGV4cGxpY2l0bHlcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlU3lzdGVtUG9ydCgpO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgZGV2aWNlIGJ5IGZvcndhcmRpbmcgdGhlIFVpQXV0b21hdG9yMiBNSlBFRyBzZXJ2ZXIgcG9ydCAoaWZcbiAgICAvLyBhcHBsaWNhYmxlKVxuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQoKTtcblxuICAgIC8vIHNldCB1cCB0aGUgbW9kaWZpZWQgVWlBdXRvbWF0b3IyIHNlcnZlciBldGNcbiAgICBhd2FpdCB0aGlzLmluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIoKTtcblxuICAgIC8vIFNob3VsZCBiZSBhZnRlciBpbnN0YWxsaW5nIGlvLmFwcGl1bS5zZXR0aW5ncyBpbiBoZWxwZXJzLmluaXREZXZpY2VcbiAgICBpZiAodGhpcy5vcHRzLmRpc2FibGVXaW5kb3dBbmltYXRpb24gJiYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyNikpIHsgLy8gQVBJIGxldmVsIDI2IGlzIEFuZHJvaWQgOC4wLlxuICAgICAgLy8gR3JhbnRpbmcgYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9BTklNQVRJT05fU0NBTEUgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBhbmltYXRpb25zIHVuZGVyIEFQSSBsZXZlbCAyNlxuICAgICAgLy8gUmVhZCBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9wdWxsLzExNjQwI2lzc3VlY29tbWVudC00MzgyNjA0NzdcbiAgICAgIC8vIGAtLW5vLXdpbmRvdy1hbmltYXRpb25gIHdvcmtzIG92ZXIgQW5kcm9pZCA4IHRvIGRpc2FibGUgYWxsIG9mIGFuaW1hdGlvbnNcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRGlzYWJsaW5nIGFuaW1hdGlvbiB2aWEgaW8uYXBwaXVtLnNldHRpbmdzJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnV2luZG93IGFuaW1hdGlvbiBpcyBhbHJlYWR5IGRpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIGFwcCB1bmRlciB0ZXN0XG4gICAgLy8gcHJlcGFyZSBvdXIgYWN0dWFsIEFVVCwgZ2V0IGl0IG9uIHRoZSBkZXZpY2UsIGV0Yy4uLlxuICAgIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuXG4gICAgLy8gQWRkaW5nIEFVVCBwYWNrYWdlIG5hbWUgaW4gdGhlIGNhcGFiaWxpdGllcyBpZiBwYWNrYWdlIG5hbWUgbm90IGV4aXN0IGluIGNhcHNcbiAgICBpZiAoIXRoaXMuY2Fwcy5hcHBQYWNrYWdlICYmIGFwcEluZm8pIHtcbiAgICAgIHRoaXMuY2Fwcy5hcHBQYWNrYWdlID0gYXBwSW5mby5hcHBQYWNrYWdlO1xuICAgIH1cblxuICAgIC8vIGxhdW5jaCBVaUF1dG9tYXRvcjIgYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLnN0YXJ0U2Vzc2lvbih0aGlzLmNhcHMpO1xuXG4gICAgYXdhaXQgdGhpcy5hZGREZXZpY2VJbmZvVG9DYXBzKCk7XG5cbiAgICAvLyBVbmxvY2sgdGhlIGRldmljZSBhZnRlciB0aGUgc2Vzc2lvbiBpcyBzdGFydGVkLlxuICAgIGlmICghdGhpcy5vcHRzLnNraXBVbmxvY2spIHtcbiAgICAgIC8vIHVubG9jayB0aGUgZGV2aWNlIHRvIHByZXBhcmUgaXQgZm9yIHRlc3RpbmdcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgJ3NraXBVbmxvY2snIGNhcGFiaWxpdHkgc2V0LCBzbyBza2lwcGluZyBkZXZpY2UgdW5sb2NrYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7IC8vIHN0YXJ0IGEgY2hyb21lZHJpdmVyIHNlc3Npb25cbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmF1dG9MYXVuY2ggJiYgdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQXBwU3RhcnRzKCk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGluaXRpYWwgb3JpZW50YXRpb24gaXMgcmVxdWVzdGVkLCBzZXQgaXRcbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMub3JpZW50YXRpb24pKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBpbml0aWFsIG9yaWVudGF0aW9uIHRvICcke3RoaXMub3B0cy5vcmllbnRhdGlvbn0nYCk7XG4gICAgICBhd2FpdCB0aGlzLnNldE9yaWVudGF0aW9uKHRoaXMub3B0cy5vcmllbnRhdGlvbik7XG4gICAgfVxuXG4gICAgLy8gaWYgd2Ugd2FudCB0byBpbW1lZGlhdGVseSBnZXQgaW50byBhIHdlYnZpZXcsIHNldCBvdXIgY29udGV4dFxuICAgIC8vIGFwcHJvcHJpYXRlbHlcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBjb25zdCB2aWV3TmFtZSA9IHRoaXMuZGVmYXVsdFdlYnZpZXdOYW1lKCk7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCB8fCAyMDAwO1xuICAgICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyBhdXRvIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcbiAgICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwodGltZW91dCAvIDUwMCwgNTAwLCB0aGlzLnNldENvbnRleHQuYmluZCh0aGlzKSwgdmlld05hbWUpO1xuICAgIH1cblxuICAgIC8vIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCB0dXJuIG9uIHByb3h5aW5nIHNvIGFsbFxuICAgIC8vIHN1YnNlcXVlbnQgc2Vzc2lvbiByZXF1ZXN0cyBnbyBzdHJhaWdodCB0by9mcm9tIHVpYXV0b21hdG9yMlxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgYWRkRGV2aWNlSW5mb1RvQ2FwcyAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXBpVmVyc2lvbixcbiAgICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICAgIG1hbnVmYWN0dXJlcixcbiAgICAgIG1vZGVsLFxuICAgICAgcmVhbERpc3BsYXlTaXplLFxuICAgICAgZGlzcGxheURlbnNpdHksXG4gICAgfSA9IGF3YWl0IHRoaXMubW9iaWxlR2V0RGV2aWNlSW5mbygpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VBcGlMZXZlbCA9IHBhcnNlSW50KGFwaVZlcnNpb24sIDEwKTtcbiAgICB0aGlzLmNhcHMucGxhdGZvcm1WZXJzaW9uID0gcGxhdGZvcm1WZXJzaW9uO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5TaXplID0gcmVhbERpc3BsYXlTaXplO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5EZW5zaXR5ID0gZGlzcGxheURlbnNpdHk7XG4gICAgdGhpcy5jYXBzLmRldmljZU1vZGVsID0gbW9kZWw7XG4gICAgdGhpcy5jYXBzLmRldmljZU1hbnVmYWN0dXJlciA9IG1hbnVmYWN0dXJlcjtcbiAgfVxuXG4gIGFzeW5jIGluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIgKCkge1xuICAgIC8vIGJyb2tlbiBvdXQgZm9yIHJlYWRhYmlsaXR5XG4gICAgY29uc3QgdWlhdXRvbWF0b3IyT3B0cyA9IHtcbiAgICAgIGhvc3Q6IHRoaXMub3B0cy5yZW1vdGVBZGJIb3N0IHx8IHRoaXMub3B0cy5ob3N0IHx8IExPQ0FMSE9TVF9JUDQsXG4gICAgICBzeXN0ZW1Qb3J0OiB0aGlzLm9wdHMuc3lzdGVtUG9ydCxcbiAgICAgIGRldmljZVBvcnQ6IERFVklDRV9QT1JULFxuICAgICAgYWRiOiB0aGlzLmFkYixcbiAgICAgIGFwazogdGhpcy5vcHRzLmFwcCxcbiAgICAgIHRtcERpcjogdGhpcy5vcHRzLnRtcERpcixcbiAgICAgIGFwcFBhY2thZ2U6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgYXBwQWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgIGRpc2FibGVXaW5kb3dBbmltYXRpb246ICEhdGhpcy5vcHRzLmRpc2FibGVXaW5kb3dBbmltYXRpb24sXG4gICAgICBkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTogdGhpcy5vcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlLFxuICAgICAgcmVhZFRpbWVvdXQ6IHRoaXMub3B0cy51aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCxcbiAgICB9O1xuICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgcGFja2FnZSBhbmQgYWN0aXZpdHksIHdlIGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2ZcbiAgICAvLyB1aWF1dG9tYXRvcjIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgb3B0aW9uc1xuICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbmV3IFVpQXV0b21hdG9yMlNlcnZlcih0aGlzLmxvZywgdWlhdXRvbWF0b3IyT3B0cyk7XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMudWlhdXRvbWF0b3IyLnByb3h5UmVxUmVzLmJpbmQodGhpcy51aWF1dG9tYXRvcjIpO1xuICAgIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy51aWF1dG9tYXRvcjIucHJveHlDb21tYW5kLmJpbmQodGhpcy51aWF1dG9tYXRvcjIpO1xuXG4gICAgaWYgKHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGAnc2tpcFNlcnZlckluc3RhbGxhdGlvbicgaXMgc2V0LiBTa2lwcGluZyBVSUF1dG9tYXRvcjIgc2VydmVyIGluc3RhbGxhdGlvbi5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuaW5zdGFsbFNlcnZlckFwayh0aGlzLm9wdHMudWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0KFxuICAgICAgICAgIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lELFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgYWRkIHNlcnZlciBwYWNrYWdlcyB0byB0aGUgRG96ZSB3aGl0ZWxpc3QuIE9yaWdpbmFsIGVycm9yOiBgICtcbiAgICAgICAgICAoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdEFVVCAoKSB7XG4gICAgLy8gVW5pbnN0YWxsIGFueSB1bmluc3RhbGxPdGhlclBhY2thZ2VzIHdoaWNoIHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyhcbiAgICAgICAgdGhpcy5hZGIsXG4gICAgICAgIGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyksXG4gICAgICAgIFtTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCBhbnkgXCJvdGhlckFwcHNcIiB0aGF0IHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLm90aGVyQXBwcykge1xuICAgICAgbGV0IG90aGVyQXBwcztcbiAgICAgIHRyeSB7XG4gICAgICAgIG90aGVyQXBwcyA9IGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMub3RoZXJBcHBzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IHBhcnNlIFwib3RoZXJBcHBzXCIgY2FwYWJpbGl0eTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBvdGhlckFwcHMgPSBhd2FpdCBCLmFsbChvdGhlckFwcHNcbiAgICAgICAgLm1hcCgoYXBwKSA9PiB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcCwgW0FQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OXSkpKTtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbE90aGVyQXBrcyhvdGhlckFwcHMsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgJiYgIShhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZCh0aGlzLm9wdHMuYXBwUGFja2FnZSkpXG4gICAgICAgICAgfHwgIXRoaXMub3B0cy5ub1Jlc2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRzLm5vU2lnbiAmJiAhYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KHRoaXMub3B0cy5hcHAsIHRoaXMub3B0cy5hcHBQYWNrYWdlLCB7XG4gICAgICAgICAgcmVxdWlyZURlZmF1bHRDZXJ0OiBmYWxzZSxcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICBhd2FpdCBoZWxwZXJzLnNpZ25BcHAodGhpcy5hZGIsIHRoaXMub3B0cy5hcHApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5vcHRzLnNraXBVbmluc3RhbGwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEFwayh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdub1Jlc2V0IGhhcyBiZWVuIHJlcXVlc3RlZCBhbmQgdGhlIGFwcCBpcyBhbHJlYWR5IGluc3RhbGxlZC4gRG9pbmcgbm90aGluZycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdGdWxsIHJlc2V0IHJlcXVpcmVzIGFuIGFwcCBjYXBhYmlsaXR5LCB1c2UgZmFzdFJlc2V0IGlmIGFwcCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBhcHAgY2FwYWJpbGl0eS4gQXNzdW1pbmcgaXQgaXMgYWxyZWFkeSBvbiB0aGUgZGV2aWNlJyk7XG4gICAgICBpZiAodGhpcy5vcHRzLmZhc3RSZXNldCAmJiB0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0QXBwKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGVuc3VyZUFwcFN0YXJ0cyAoKSB7XG4gICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYW4gYWN0aXZpdHkgYW5kIHBhY2thZ2UgdG8gd2FpdCBmb3JcbiAgICBjb25zdCBhcHBXYWl0UGFja2FnZSA9IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSB8fCB0aGlzLm9wdHMuYXBwUGFja2FnZTtcbiAgICBjb25zdCBhcHBXYWl0QWN0aXZpdHkgPSB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5IHx8IHRoaXMub3B0cy5hcHBBY3Rpdml0eTtcblxuICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfS8ke3RoaXMub3B0cy5hcHBBY3Rpdml0eX0gYCArXG4gICAgICBgYW5kIHdhaXRpbmcgZm9yICcke2FwcFdhaXRQYWNrYWdlfS8ke2FwcFdhaXRBY3Rpdml0eX0nYCk7XG5cbiAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgYW5kcm9pZENvdmVyYWdlIGlzIGNvbmZpZ3VyZWQuIGAgK1xuICAgICAgICBgIFN0YXJ0aW5nIGluc3RydW1lbnRhdGlvbiBvZiAnJHt0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlfScuLi5gKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmFuZHJvaWRDb3ZlcmFnZSh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlLCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ICYmICF0aGlzLm9wdHMuZm9yY2VBcHBMYXVuY2hcbiAgICAgICAgJiYgYXdhaXQgdGhpcy5hZGIucHJvY2Vzc0V4aXN0cyh0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYCcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCBub1Jlc2V0IGlzIGVuYWJsZWQuIGAgK1xuICAgICAgICBgU2V0IGZvcmNlQXBwTGF1bmNoIGNhcGFiaWxpdHkgdG8gdHJ1ZSBpZiB0aGUgYXBwIG11c3QgYmUgZm9yY2VmdWxseSByZXN0YXJ0ZWQgb24gc2Vzc2lvbiBzdGFydHVwLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcCh7XG4gICAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgIGFjdGlvbjogdGhpcy5vcHRzLmludGVudEFjdGlvbiB8fCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgICAgY2F0ZWdvcnk6IHRoaXMub3B0cy5pbnRlbnRDYXRlZ29yeSB8fCAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyB8fCAnMHgxMDIwMDAwMCcsIC8vIEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBGTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEXG4gICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICB3YWl0QWN0aXZpdHk6IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHksXG4gICAgICB3YWl0Rm9yTGF1bmNoOiB0aGlzLm9wdHMuYXBwV2FpdEZvckxhdW5jaCxcbiAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzOiB0aGlzLm9wdHMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsXG4gICAgICBzdG9wQXBwOiB0aGlzLm9wdHMuZm9yY2VBcHBMYXVuY2ggfHwgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQsXG4gICAgICByZXRyeTogdHJ1ZSxcbiAgICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdEZWxldGluZyBVaUF1dG9tYXRvcjIgc2Vzc2lvbicpO1xuXG4gICAgY29uc3Qgc2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzID0gW2FzeW5jICgpID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcFJlY29yZGluZ1NjcmVlbigpO1xuICAgICAgfVxuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLm1vYmlsZUlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZygpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZygpO1xuICAgICAgfVxuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcoKTtcbiAgICAgIH1cbiAgICB9XTtcblxuICAgIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyh0aGlzLnNlcnZlciwgdGhpcy5zZXNzaW9uSWQpO1xuXG4gICAgaWYgKHRoaXMudWlhdXRvbWF0b3IyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHN0b3AgQ2hyb21lRHJpdmVyIHByb3hpZXM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5qd3BQcm94eUFjdGl2ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHByb3h5IGRlbGV0ZVNlc3Npb24gdG8gVWlBdXRvbWF0b3IyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnVpYXV0b21hdG9yMiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgYXdhaXQgQi5hbGwoc2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzLm1hcCgodGFzaykgPT4ge1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgICB9KSgpO1xuICAgICAgfSkpO1xuXG4gICAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdTaHV0dGluZyBkb3duIHRoZSBhZGIgcHJvY2VzcyBvZiBpbnN0cnVtZW50YXRpb24uLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuZW5kQW5kcm9pZENvdmVyYWdlKCk7XG4gICAgICAgIC8vIFVzZSB0aGlzIGJyb2FkY2FzdCBpbnRlbnQgdG8gbm90aWZ5IGl0J3MgdGltZSB0byBkdW1wIGNvdmVyYWdlIHRvIGZpbGVcbiAgICAgICAgaWYgKHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBTZW5kaW5nIGludGVudCBicm9hZGNhc3QgJyR7dGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZUVuZEludGVudH0nIGF0IHRoZSBlbmQgb2YgaW5zdHJ1bWVudGluZy5gKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3QodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZUVuZEludGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybignTm8gYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50IGlzIGNvbmZpZ3VyZWQgaW4gY2Fwcy4gUG9zc2libHkgeW91IGNhbm5vdCBnZXQgY292ZXJhZ2UgZmlsZS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgKCghdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCAmJiAhdGhpcy5vcHRzLm5vUmVzZXQpXG4gICAgICAgICAgICB8fCAodGhpcy5vcHRzLm5vUmVzZXQgJiYgdGhpcy5vcHRzLnNob3VsZFRlcm1pbmF0ZUFwcCkpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gZm9yY2Ugc3RvcCBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBDYXBhYmlsaXR5ICdmdWxsUmVzZXQnIHNldCB0byAndHJ1ZScsIFVuaW5zdGFsbGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nYCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gdW5pbnN0YWxsIGFwcDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgdmFsdWUgY2FuIGJlIHRydWUgaWYgdGVzdCB0YXJnZXQgZGV2aWNlIGlzIDw9IDI2XG4gICAgICBpZiAodGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVzdG9yaW5nIHdpbmRvdyBhbmltYXRpb24gc3RhdGUnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zdG9wTG9nY2F0KCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VTeXN0ZW1Qb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcmVtb3ZlIHN5c3RlbSBwb3J0IGZvcndhcmQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgLy8gSWdub3JlLCB0aGlzIGJsb2NrIHdpbGwgYWxzbyBiZSBjYWxsZWQgd2hlbiB3ZSBmYWxsIGluIGNhdGNoIGJsb2NrXG4gICAgICAgIC8vIGFuZCBiZWZvcmUgZXZlbiBwb3J0IGZvcndhcmQuXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VNanBlZ1NlcnZlclBvcnQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byByZW1vdmUgTUpQRUcgc2VydmVyIHBvcnQgZm9yd2FyZDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAvLyBJZ25vcmUsIHRoaXMgYmxvY2sgd2lsbCBhbHNvIGJlIGNhbGxlZCB3aGVuIHdlIGZhbGwgaW4gY2F0Y2ggYmxvY2tcbiAgICAgICAgLy8gYW5kIGJlZm9yZSBldmVuIHBvcnQgZm9yd2FyZC5cbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBDbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIGNsb3NlIGVtdWxhdG9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLm1qcGVnU3RyZWFtKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdDbG9zaW5nIE1KUEVHIHN0cmVhbScpO1xuICAgICAgdGhpcy5tanBlZ1N0cmVhbS5zdG9wKCk7XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgYXBwIGlzIGFjdHVhbGx5IHByZXNlbnQnKTtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5vcHRzLmFwcCkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBhcHAgYXBrIGF0ICcke3RoaXMub3B0cy5hcHB9J2ApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKCkge1xuICAgIC8vIGludGVudGlvbmFsbHkgZG8gbm90aGluZyBoZXJlLCBzaW5jZSBjb21tYW5kcy51cGRhdGVTZXR0aW5ncyBwcm94aWVzXG4gICAgLy8gc2V0dGluZ3MgdG8gdGhlIHVpYXV0bzIgc2VydmVyIGFscmVhZHlcbiAgfVxuXG4gIC8vIE5lZWQgdG8gb3ZlcnJpZGUgYW5kcm9pZC1kcml2ZXIncyB2ZXJzaW9uIG9mIHRoaXMgc2luY2Ugd2UgZG9uJ3QgYWN0dWFsbHlcbiAgLy8gaGF2ZSBhIGJvb3RzdHJhcDsgaW5zdGVhZCB3ZSBqdXN0IHJlc3RhcnQgYWRiIGFuZCByZS1mb3J3YXJkIHRoZSBVaUF1dG9tYXRvcjJcbiAgLy8gcG9ydFxuICBhc3luYyB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICAgIGF3YWl0IHdyYXBwZWQoKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5yZXN0YXJ0KCk7XG4gICAgYXdhaXQgdGhpcy5hbGxvY2F0ZVN5c3RlbVBvcnQoKTtcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0KCk7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGFsd2F5cyBoYXZlIGFuIGFjdGl2ZSBwcm94eSB0byB0aGUgVWlBdXRvbWF0b3IyIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB3ZSBjYW4gYWx3YXlzIHByb3h5IHRvIHRoZSB1aWF1dG9tYXRvcjIgc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRQcm94eUF2b2lkTGlzdCAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuZ2V0UHJveHlBdm9pZExpc3Qoc2Vzc2lvbklkKTtcbiAgICAvLyB3ZSBhcmUgbWFpbnRhaW5pbmcgdHdvIHNldHMgb2YgTk9fUFJPWFkgbGlzdHMsIG9uZSBmb3IgY2hyb21lZHJpdmVyKENIUk9NRV9OT19QUk9YWSlcbiAgICAvLyBhbmQgb25lIGZvciB1aWF1dG9tYXRvcjIoTk9fUFJPWFkpLCBiYXNlZCBvbiBjdXJyZW50IGNvbnRleHQgd2lsbCByZXR1cm4gcmVsYXRlZCBOT19QUk9YWSBsaXN0XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5jaHJvbWVkcml2ZXIpKSB7XG4gICAgICAvLyBpZiB0aGUgY3VycmVudCBjb250ZXh0IGlzIHdlYnZpZXcoY2hyb21lZHJpdmVyKSwgdGhlbiByZXR1cm4gQ0hST01FX05PX1BST1hZIGxpc3RcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IENIUk9NRV9OT19QUk9YWTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdHMubmF0aXZlV2ViU2NyZWVuc2hvdCkge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gWy4uLnRoaXMuandwUHJveHlBdm9pZCwgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuandwUHJveHlBdm9pZDtcbiAgfVxuXG4gIGdldCBpc0Nocm9tZVNlc3Npb24gKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzQ2hyb21lQnJvd3Nlcih0aGlzLm9wdHMuYnJvd3Nlck5hbWUpO1xuICB9XG59XG5cbi8vIGZpcnN0IGFkZCB0aGUgYW5kcm9pZC1kcml2ZXIgY29tbWFuZHMgd2hpY2ggd2Ugd2lsbCBmYWxsIGJhY2sgdG9cbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoYW5kcm9pZENvbW1hbmRzKSkge1xuICBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbi8vIHRoZW4gb3ZlcndyaXRlIHdpdGggYW55IHVpYXV0b21hdG9yMi1zcGVjaWZpYyBjb21tYW5kc1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhjb21tYW5kcykpIHtcbiAgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xufVxuXG5leHBvcnQgeyBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFlBQUEsR0FBQUYsT0FBQTtBQUdBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFFBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFNBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFNBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtB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LENBQUMsQ0FBQyxFQUM3RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsK0NBQStDLENBQUMsQ0FBQyxFQUNyRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsOENBQThDLENBQUMsQ0FBQyxFQUNwRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxFQUN0RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxFQUMvQyxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxFQUMvQyxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxFQUNqRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxFQUM1QyxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxFQUNoRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxFQUMxRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxFQUNoRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMscUNBQXFDLENBQUMsQ0FBQyxFQUMzRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQyxFQUNyRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUczQyxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxFQUNoRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxFQUMvQyxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQyxFQUNyRCxDQUFDLE1BQU0sRUFBRSxJQUFJ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
521
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX3VpYXV0b21hdG9yIiwiX21ldGhvZE1hcCIsIl9zdXBwb3J0IiwiX2FzeW5jYm94IiwiX2JsdWViaXJkIiwiX2luZGV4IiwiX2FwcGl1bUFkYiIsIl9oZWxwZXJzIiwiX2FwcGl1bUFuZHJvaWREcml2ZXIiLCJfZGVzaXJlZENhcHMiLCJfcG9ydHNjYW5uZXIiLCJfb3MiLCJfcGF0aCIsIl9leHRlbnNpb25zIiwiaGVscGVycyIsIk9iamVjdCIsImFzc2lnbiIsInVpYXV0b21hdG9yMkhlbHBlcnMiLCJhbmRyb2lkSGVscGVycyIsIkRFVklDRV9QT1JUX1JBTkdFIiwiREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCIsInV0aWwiLCJnZXRMb2NrRmlsZUd1YXJkIiwicGF0aCIsInJlc29sdmUiLCJvcyIsInRtcGRpciIsInRpbWVvdXQiLCJ0cnlSZWNvdmVyeSIsIkRFVklDRV9QT1JUIiwiTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUIiwiTE9DQUxIT1NUX0lQNCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiTUVNT0laRURfRlVOQ1RJT05TIiwiQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciIsIkJhc2VEcml2ZXIiLCJuZXdNZXRob2RNYXAiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJzaG91bGRWYWxpZGF0ZUNhcHMiLCJzaGVsbCIsImxvY2F0b3JTdHJhdGVnaWVzIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwidWlhdXRvbWF0b3IyIiwiandwUHJveHlBY3RpdmUiLCJqd3BQcm94eUF2b2lkIiwiYXBrU3RyaW5ncyIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwiYWxsb3dJbnZpc2libGVFbGVtZW50cyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJmbiIsIl8iLCJtZW1vaXplIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJjcmVhdGVTZXNzaW9uIiwiYXJncyIsInNlc3Npb25JZCIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImRlZmF1bHRPcHRzIiwiZnVsbFJlc2V0IiwiYXV0b0xhdW5jaCIsImFkYlBvcnQiLCJERUZBVUxUX0FEQl9QT1JUIiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiZGVmYXVsdHMiLCJpc0Nocm9tZVNlc3Npb24iLCJsb2ciLCJpbmZvIiwicGtnIiwiYWN0aXZpdHkiLCJnZXRDaHJvbWVQa2ciLCJicm93c2VyTmFtZSIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsInJlYm9vdCIsInNldEF2ZEZyb21DYXBhYmlsaXRpZXMiLCJhcHAiLCJjb25maWd1cmVBcHAiLCJBUEtfRVhURU5TSU9OIiwiQVBLU19FWFRFTlNJT04iLCJjaGVja0FwcFByZXNlbnQiLCJzdGFydFVpQXV0b21hdG9yMlNlc3Npb24iLCJmaWxsRGV2aWNlRGV0YWlscyIsIm1qcGVnU2NyZWVuc2hvdFVybCIsIm1qcGVnU3RyZWFtIiwibWpwZWciLCJNSnBlZ1N0cmVhbSIsInN0YXJ0IiwiZSIsImRlbGV0ZVNlc3Npb24iLCJwaXhlbFJhdGlvIiwiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsInN0YXRCYXJIZWlnaHQiLCJnZXRTdGF0dXNCYXJIZWlnaHQiLCJ2aWV3cG9ydFJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJkcml2ZXJEYXRhIiwiZ2V0U2Vzc2lvbiIsInNlc3Npb25EYXRhIiwiZGVidWciLCJ1aWEyRGF0YSIsImp3cHJveHkiLCJjb21tYW5kIiwiaXNFbXVsYXRvciIsImFkYiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImFsbG9jYXRlU3lzdGVtUG9ydCIsImZvcndhcmRQb3J0IiwibG9jYWxQb3J0IiwiY2hlY2tQb3J0U3RhdHVzIiwic3lzdGVtUG9ydCIsIl9oYXNTeXN0ZW1Qb3J0SW5DYXBzIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwicmVsZWFzZVN5c3RlbVBvcnQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0IiwibWpwZWdTZXJ2ZXJQb3J0IiwicmVsZWFzZU1qcGVnU2VydmVyUG9ydCIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJjcmVhdGVBREIiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwic2V0SGlkZGVuQXBpUG9saWN5IiwiaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IiLCJoYXNWYWx1ZSIsImdwc0VuYWJsZWQiLCJ0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIiwid2FybiIsImFwcEluZm8iLCJnZXRMYXVuY2hJbmZvIiwiY3VyRGV2aWNlSWQiLCJkZXZpY2VVRElEIiwiaW5pdERldmljZSIsImluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwiaXNBbmltYXRpb25PbiIsInNldEFuaW1hdGlvblN0YXRlIiwiX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkIiwiaW5pdEFVVCIsInN0YXJ0U2Vzc2lvbiIsImFkZERldmljZUluZm9Ub0NhcHMiLCJza2lwVW5sb2NrIiwidW5sb2NrIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwiZW5zdXJlQXBwU3RhcnRzIiwib3JpZW50YXRpb24iLCJzZXRPcmllbnRhdGlvbiIsImF1dG9XZWJ2aWV3Iiwidmlld05hbWUiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJhdXRvV2Vidmlld1RpbWVvdXQiLCJyZXRyeUludGVydmFsIiwic2V0Q29udGV4dCIsImFwaVZlcnNpb24iLCJtYW51ZmFjdHVyZXIiLCJtb2RlbCIsInJlYWxEaXNwbGF5U2l6ZSIsImRpc3BsYXlEZW5zaXR5IiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsImRldmljZUFwaUxldmVsIiwicGFyc2VJbnQiLCJkZXZpY2VTY3JlZW5TaXplIiwiZGV2aWNlU2NyZWVuRGVuc2l0eSIsImRldmljZU1vZGVsIiwiZGV2aWNlTWFudWZhY3R1cmVyIiwidWlhdXRvbWF0b3IyT3B0cyIsImhvc3QiLCJyZW1vdGVBZGJIb3N0IiwiZGV2aWNlUG9ydCIsImFwayIsInRtcERpciIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicmVhZFRpbWVvdXQiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCIsIlVpQXV0b21hdG9yMlNlcnZlciIsInByb3h5UmVxUmVzIiwicHJveHlDb21tYW5kIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsImluc3RhbGxTZXJ2ZXJBcGsiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCIsImFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJzdGRlcnIiLCJtZXNzYWdlIiwidW5pbnN0YWxsT3RoZXJQYWNrYWdlcyIsInBhcnNlQXJyYXkiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwibWFwIiwiaW5zdGFsbE90aGVyQXBrcyIsIm5vUmVzZXQiLCJpc0FwcEluc3RhbGxlZCIsIm5vU2lnbiIsImNoZWNrQXBrQ2VydCIsInJlcXVpcmVEZWZhdWx0Q2VydCIsInNpZ25BcHAiLCJza2lwVW5pbnN0YWxsIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbEFwayIsImZhc3RSZXNldCIsInJlc2V0QXBwIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJhbmRyb2lkQ292ZXJhZ2UiLCJmb3JjZUFwcExhdW5jaCIsInByb2Nlc3NFeGlzdHMiLCJzdGFydEFwcCIsImFjdGlvbiIsImludGVudEFjdGlvbiIsImNhdGVnb3J5IiwiaW50ZW50Q2F0ZWdvcnkiLCJmbGFncyIsImludGVudEZsYWdzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsIndhaXRGb3JMYXVuY2giLCJhcHBXYWl0Rm9yTGF1bmNoIiwid2FpdER1cmF0aW9uIiwiYXBwV2FpdER1cmF0aW9uIiwib3B0aW9uYWxJbnRlbnRBcmd1bWVudHMiLCJzdG9wQXBwIiwiZG9udFN0b3BBcHBPblJlc2V0IiwicmV0cnkiLCJ1c2VyIiwidXNlclByb2ZpbGUiLCJzY3JlZW5SZWNvcmRpbmdTdG9wVGFza3MiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwibW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwibW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsIl9zY3JlZW5TdHJlYW1pbmdQcm9wcyIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzdG9wQ2hyb21lZHJpdmVyUHJveGllcyIsImVyciIsInRhc2siLCJpZ24iLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJhbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQiLCJicm9hZGNhc3QiLCJzaG91bGRUZXJtaW5hdGVBcHAiLCJmb3JjZVN0b3AiLCJzdG9wTG9nY2F0IiwiZXJyb3IiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IiwiYXZkTmFtZSIsImtpbGxFbXVsYXRvciIsInN0b3AiLCJmcyIsImV4aXN0cyIsIndyYXBCb290c3RyYXBEaXNjb25uZWN0Iiwid3JhcHBlZCIsInJlc3RhcnQiLCJwcm94eUFjdGl2ZSIsImNhblByb3h5IiwiZ2V0UHJveHlBdm9pZExpc3QiLCJuYXRpdmVXZWJTY3JlZW5zaG90IiwiaXNDaHJvbWVCcm93c2VyIiwiZXhwb3J0cyIsImNtZCIsInRvUGFpcnMiLCJhbmRyb2lkQ29tbWFuZHMiLCJwcm90b3R5cGUiLCJjb21tYW5kcyIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJhc2VEcml2ZXIsIERldmljZVNldHRpbmdzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQge1xuICBVaUF1dG9tYXRvcjJTZXJ2ZXIsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEXG59IGZyb20gJy4vdWlhdXRvbWF0b3IyJztcbmltcG9ydCB7IG5ld01ldGhvZE1hcCB9IGZyb20gJy4vbWV0aG9kLW1hcCc7XG5pbXBvcnQgeyBmcywgdXRpbCwgbWpwZWcgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMvaW5kZXgnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHVpYXV0b21hdG9yMkhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGFuZHJvaWRIZWxwZXJzLCBhbmRyb2lkQ29tbWFuZHMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIH0gZnJvbSAnYXBwaXVtLWFuZHJvaWQtZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ2FwQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UsIGNoZWNrUG9ydFN0YXR1cyB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OIH0gZnJvbSAnLi9leHRlbnNpb25zJztcblxuXG5jb25zdCBoZWxwZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdWlhdXRvbWF0b3IySGVscGVycywgYW5kcm9pZEhlbHBlcnMpO1xuXG4vLyBUaGUgcmFuZ2Ugb2YgcG9ydHMgd2UgY2FuIHVzZSBvbiB0aGUgc3lzdGVtIGZvciBjb21tdW5pY2F0aW5nIHRvIHRoZVxuLy8gVWlBdXRvbWF0b3IyIEhUVFAgc2VydmVyIG9uIHRoZSBkZXZpY2VcbmNvbnN0IERFVklDRV9QT1JUX1JBTkdFID0gWzgyMDAsIDgyOTldO1xuXG4vLyBUaGUgZ3VhcmQgaXMgbmVlZGVkIHRvIGF2b2lkIGR5bmFtaWMgc3lzdGVtIHBvcnQgYWxsb2NhdGlvbiBjb25mbGljdHMgZm9yXG4vLyBwYXJhbGxlbCBkcml2ZXIgc2Vzc2lvbnNcbmNvbnN0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQoXG4gIHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ3VpYTJfZGV2aWNlX3BvcnRfZ3VhcmQnKSxcbiAge3RpbWVvdXQ6IDI1LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5cbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCBVaUF1dG9tYXRvcjIgbGlzdGVucyB0byBvbiB0aGUgZGV2aWNlLiBXZSB3aWxsIGZvcndhcmRcbi8vIG9uZSBvZiB0aGUgcG9ydHMgYWJvdmUgb24gdGhlIHN5c3RlbSB0byB0aGlzIHBvcnQgb24gdGhlIGRldmljZS5cbmNvbnN0IERFVklDRV9QT1JUID0gNjc5MDtcbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCB0aGUgVWlBdXRvbWF0b3IyIE1KUEVHIHNlcnZlciBsaXN0ZW5zIHRvIG9uIHRoZSBkZXZpY2UuXG4vLyBXZSB3aWxsIGZvcndhcmQgb25lIG9mIHRoZSBwb3J0cyBhYm92ZSBvbiB0aGUgc3lzdGVtIHRvIHRoaXMgcG9ydCBvbiB0aGVcbi8vIGRldmljZS5cbmNvbnN0IE1KUEVHX1NFUlZFUl9ERVZJQ0VfUE9SVCA9IDc4MTA7XG5cbmNvbnN0IExPQ0FMSE9TVF9JUDQgPSAnMTI3LjAuMC4xJztcblxuLy8gTk9fUFJPWFkgY29udGFpbnMgdGhlIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBVaUF1dG9tYXRvcjIgc2VydmVyLlxuLy8gVE9ETzogIEFkZCB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gVWlBdXRvbWF0b3IyIHNlcnZlci5cbi8vIFRPRE86IE5lZWQgdG8gc2VncmVnYXRlIHRoZSBwYXRocyBiZXR0ZXIgd2F5IHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hlcmV2ZXIgYXBwbGljYWJsZS5cbi8vIChOb3Qgc2VncmVnYXRpbmcgcmlnaHQgYXdheSBiZWNhdXNlIG1vcmUgcGF0aHMgdG8gYmUgYWRkZWQgaW4gdGhlIE5PX1BST1hZIGxpc3QpXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vKD8hLiovKScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnRfW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FsZXJ0L1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvY3VycmVudF9hY3Rpdml0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL2N1cnJlbnRfcGFja2FnZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9hdHRyaWJ1dGUnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZGlzcGxheWVkJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2VuYWJsZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvbG9jYXRpb25faW5fdmlldycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9uYW1lJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3NjcmVlbnNob3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvc2VsZWN0ZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9jYXRpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL1teL10rX2FsZXJ0JCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FjdGlvbnMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hbGVydC9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcC9bXi9dJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL3N0YXJ0X2FjdGl2aXR5JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9jb21wYXJlX2ltYWdlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvKD8hc2V0X2NsaXBib2FyZClbXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9lbGVtZW50L1teL10rL3JlcGxhY2VfdmFsdWUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZWxlbWVudC9bXi9dKy92YWx1ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9nZXRQZXJmb3JtYW5jZURhdGEnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vcGVyZm9ybWFuY2VEYXRhL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2V4ZWN1dGVfZHJpdmVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0YXJ0X3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RvcF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtLy4qZXZlbnQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2tleXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZV9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZycpXSxcbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy93aW5kb3cvcmVjdCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvYXN5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZycpXSxcbl07XG5cbi8vIFRoaXMgaXMgYSBzZXQgb2YgbWV0aG9kcyBhbmQgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIENocm9tZWRyaXZlci5cbmNvbnN0IENIUk9NRV9OT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3JlY3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG5cbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gbWFrZSB0aGUgbW9iaWxlOiBjb21tYW5kcyB3b3JraW5nIGluIHdlYiBjb250ZXh0XG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcblxuICAvLyBNSlNPTldQIGNvbW1hbmRzXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZy90eXBlcyQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2ckJyldLFxuICAvLyBXM0MgY29tbWFuZHNcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cvdHlwZXMkJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2ckJyldLFxuXTtcblxuY29uc3QgTUVNT0laRURfRlVOQ1RJT05TID0gW1xuICAnZ2V0U3RhdHVzQmFySGVpZ2h0JyxcbiAgJ2dldERldmljZVBpeGVsUmF0aW8nLFxuXTtcblxuY2xhc3MgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuXG4gIHN0YXRpYyBuZXdNZXRob2RNYXAgPSBuZXdNZXRob2RNYXA7XG5cbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSwgc2hvdWxkVmFsaWRhdGVDYXBzID0gdHJ1ZSkge1xuICAgIC8vIGBzaGVsbGAgb3ZlcndyaXRlcyBhZGIuc2hlbGwsIHNvIHJlbW92ZVxuICAgIGRlbGV0ZSBvcHRzLnNoZWxsO1xuXG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcbiAgICB0aGlzLmxvY2F0b3JTdHJhdGVnaWVzID0gW1xuICAgICAgJ3hwYXRoJyxcbiAgICAgICdpZCcsXG4gICAgICAnY2xhc3MgbmFtZScsXG4gICAgICAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgICAnY3NzIHNlbGVjdG9yJyxcbiAgICAgICctYW5kcm9pZCB1aWF1dG9tYXRvcidcbiAgICBdO1xuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENhcENvbnN0cmFpbnRzO1xuICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgdGhpcy5hcGtTdHJpbmdzID0ge307IC8vIG1hcCBvZiBsYW5ndWFnZSAtPiBzdHJpbmdzIG9ialxuXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2UsIGFsbG93SW52aXNpYmxlRWxlbWVudHM6IGZhbHNlfSxcbiAgICAgICAgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIC8vIGhhbmRsZSB3ZWJ2aWV3IG1lY2hhbmljcyBmcm9tIEFuZHJvaWREcml2ZXJcbiAgICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVycyA9IHt9O1xuXG4gICAgLy8gbWVtb2l6ZSBmdW5jdGlvbnMgaGVyZSwgc28gdGhhdCB0aGV5IGFyZSBkb25lIG9uIGEgcGVyLWluc3RhbmNlIGJhc2lzXG4gICAgZm9yIChjb25zdCBmbiBvZiBNRU1PSVpFRF9GVU5DVElPTlMpIHtcbiAgICAgIHRoaXNbZm5dID0gXy5tZW1vaXplKHRoaXNbZm5dKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlRGVzaXJlZENhcHMoY2FwcykgJiYgYW5kcm9pZEhlbHBlcnMudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IHRoaXMuY2FwcyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oXCJXZSdyZSBnb2luZyB0byBydW4gYSBDaHJvbWUtYmFzZWQgc2Vzc2lvblwiKTtcbiAgICAgICAgbGV0IHtwa2csIGFjdGl2aXR5fSA9IGhlbHBlcnMuZ2V0Q2hyb21lUGtnKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gICAgICAgIHRoaXMub3B0cy5hcHBQYWNrYWdlID0gdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBwa2c7XG4gICAgICAgIHRoaXMub3B0cy5hcHBBY3Rpdml0eSA9IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBDaHJvbWUtdHlwZSBwYWNrYWdlIGFuZCBhY3Rpdml0eSBhcmUgJHtwa2d9IGFuZCAke2FjdGl2aXR5fWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgIC8vIGZpbmQgYW5kIGNvcHksIG9yIGRvd25sb2FkIGFuZCB1bnppcCBhbiBhcHAgdXJsIG9yIHBhdGhcbiAgICAgICAgdGhpcy5vcHRzLmFwcCA9IGF3YWl0IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAodGhpcy5vcHRzLmFwcCwgW0FQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBQcmVzZW50KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIC8vIHRoZSBhcHAgaXNuJ3QgYW4gYWN0dWFsIGFwcCBmaWxlIGJ1dCByYXRoZXIgc29tZXRoaW5nIHdlIHdhbnQgdG9cbiAgICAgICAgLy8gYXNzdW1lIGlzIG9uIHRoZSBkZXZpY2UgYW5kIGp1c3QgbGF1bmNoIHZpYSB0aGUgYXBwUGFja2FnZVxuICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdGFydGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nIGRpcmVjdGx5IG9uIHRoZSBkZXZpY2VgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYE5laXRoZXIgJ2FwcCcgbm9yICdhcHBQYWNrYWdlJyB3YXMgc2V0LiBTdGFydGluZyBVaUF1dG9tYXRvcjIgYCArXG4gICAgICAgICAgJ3dpdGhvdXQgdGhlIHRhcmdldCBhcHBsaWNhdGlvbicpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VWlBdXRvbWF0b3IyU2Vzc2lvbigpO1xuICAgICAgYXdhaXQgdGhpcy5maWxsRGV2aWNlRGV0YWlscygpO1xuICAgICAgaWYgKHRoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmwpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgTUpQRUcgc3RyZWFtIHJlYWRpbmcgVVJMOiAnJHt0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsfSdgKTtcbiAgICAgICAgdGhpcy5tanBlZ1N0cmVhbSA9IG5ldyBtanBlZy5NSnBlZ1N0cmVhbSh0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsKTtcbiAgICAgICAgYXdhaXQgdGhpcy5tanBlZ1N0cmVhbS5zdGFydCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtzZXNzaW9uSWQsIHRoaXMuY2Fwc107XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZpbGxEZXZpY2VEZXRhaWxzICgpIHtcbiAgICB0aGlzLmNhcHMucGl4ZWxSYXRpbyA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO1xuICAgIHRoaXMuY2Fwcy5zdGF0QmFySGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRTdGF0dXNCYXJIZWlnaHQoKTtcbiAgICB0aGlzLmNhcHMudmlld3BvcnRSZWN0ID0gYXdhaXQgdGhpcy5nZXRWaWV3UG9ydFJlY3QoKTtcbiAgfVxuXG4gIGdldCBkcml2ZXJEYXRhICgpIHtcbiAgICAvLyBUT0RPIGZpbGwgb3V0IHJlc291cmNlIGluZm8gaGVyZVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGFzeW5jIGdldFNlc3Npb24gKCkge1xuICAgIGxldCBzZXNzaW9uRGF0YSA9IGF3YWl0IHN1cGVyLmdldFNlc3Npb24oKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnR2V0dGluZyBzZXNzaW9uIGRldGFpbHMgZnJvbSBzZXJ2ZXIgdG8gbWl4IGluJyk7XG4gICAgbGV0IHVpYTJEYXRhID0gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvJywgJ0dFVCcsIHt9KTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc2Vzc2lvbkRhdGEsIHVpYTJEYXRhKTtcbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlU3lzdGVtUG9ydCAoKSB7XG4gICAgY29uc3QgZm9yd2FyZFBvcnQgPSBhc3luYyAobG9jYWxQb3J0KSA9PiB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBVaUF1dG9tYXRvcjIgU2VydmVyIHBvcnQgJHtERVZJQ0VfUE9SVH0gdG8gbG9jYWwgcG9ydCAke2xvY2FsUG9ydH1gKTtcbiAgICAgIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKGxvY2FsUG9ydCwgTE9DQUxIT1NUX0lQNCkpID09PSAnb3BlbicpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVWlBdXRvbWF0b3IyIFNlcnZlciBjYW5ub3Qgc3RhcnQgYmVjYXVzZSB0aGUgbG9jYWwgcG9ydCAjJHtsb2NhbFBvcnR9IGlzIGJ1c3kuIGAgK1xuICAgICAgICAgIGBNYWtlIHN1cmUgdGhlIHBvcnQgeW91IHByb3ZpZGUgdmlhICdzeXN0ZW1Qb3J0JyBjYXBhYmlsaXR5IGlzIG5vdCBvY2N1cGllZC4gYCArXG4gICAgICAgICAgYFRoaXMgc2l0dWF0aW9uIG1pZ2h0IG9mdGVuIGJlIGEgcmVzdWx0IG9mIGFuIGluYWNjdXJhdGUgc2Vzc2lvbnMgbWFuYWdlbWVudCwgZS5nLiBgICtcbiAgICAgICAgICBgb2xkIGF1dG9tYXRpb24gc2Vzc2lvbnMgb24gdGhlIHNhbWUgZGV2aWNlIG11c3QgYWx3YXlzIGJlIGNsb3NlZCBiZWZvcmUgc3RhcnRpbmcgbmV3IG9uZXMuYCk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydChsb2NhbFBvcnQsIERFVklDRV9QT1JUKTtcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KSB7XG4gICAgICB0aGlzLl9oYXNTeXN0ZW1Qb3J0SW5DYXBzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBhd2FpdCBmb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgfVxuXG4gICAgYXdhaXQgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBbc3RhcnRQb3J0LCBlbmRQb3J0XSA9IERFVklDRV9QT1JUX1JBTkdFO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5vcHRzLnN5c3RlbVBvcnQgPSBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShzdGFydFBvcnQsIGVuZFBvcnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KFxuICAgICAgICAgIGBDYW5ub3QgZmluZCBhbnkgZnJlZSBwb3J0IGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fX0uIGAgK1xuICAgICAgICAgIGBQbGVhc2Ugc2V0IHRoZSBhdmFpbGFibGUgcG9ydCBudW1iZXIgYnkgcHJvdmlkaW5nIHRoZSBzeXN0ZW1Qb3J0IGNhcGFiaWxpdHkgb3IgYCArXG4gICAgICAgICAgYGRvdWJsZSBjaGVjayB0aGUgcHJvY2Vzc2VzIHRoYXQgYXJlIGxvY2tpbmcgcG9ydHMgd2l0aGluIHRoaXMgcmFuZ2UgYW5kIHRlcm1pbmF0ZSBgICtcbiAgICAgICAgICBgdGhlc2Ugd2hpY2ggYXJlIG5vdCBuZWVkZWQgYW55bW9yZWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgZm9yd2FyZFBvcnQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVsZWFzZVN5c3RlbVBvcnQgKCkge1xuICAgIGlmICghdGhpcy5vcHRzLnN5c3RlbVBvcnQgfHwgIXRoaXMuYWRiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2hhc1N5c3RlbVBvcnRJbkNhcHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMuc3lzdGVtUG9ydCkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYE1KUEVHIGJyb2FkY2FzdGluZyByZXF1ZXN0ZWQsIGZvcndhcmRpbmcgTUpQRUcgc2VydmVyIHBvcnQgJHtNSlBFR19TRVJWRVJfREVWSUNFX1BPUlR9IGAgK1xuICAgICAgICBgdG8gbG9jYWwgcG9ydCAke3RoaXMub3B0cy5tanBlZ1NlcnZlclBvcnR9YCk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydCh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0LCBNSlBFR19TRVJWRVJfREVWSUNFX1BPUlQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VNanBlZ1NlcnZlclBvcnQgKCkge1xuICAgIGlmICh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFVpQXV0b21hdG9yMlNlc3Npb24gKCkge1xuICAgIC8vIGdldCBkZXZpY2UgdWRpZCBmb3IgdGhpcyBzZXNzaW9uXG4gICAgbGV0IHt1ZGlkLCBlbVBvcnR9ID0gYXdhaXQgaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHModGhpcy5vcHRzKTtcbiAgICB0aGlzLm9wdHMudWRpZCA9IHVkaWQ7XG4gICAgdGhpcy5vcHRzLmVtUG9ydCA9IGVtUG9ydDtcblxuICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgb3VyIGphdmEgdmVyc2lvbiBhbmQgZGV2aWNlIGluZm8sIHdlIGNhbiBjcmVhdGUgb3VyXG4gICAgLy8gQURCIGluc3RhbmNlXG4gICAgdGhpcy5hZGIgPSBhd2FpdCBhbmRyb2lkSGVscGVycy5jcmVhdGVBREIodGhpcy5vcHRzKTtcblxuICAgIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcblxuICAgIGlmIChhcGlMZXZlbCA8IDIxKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdVSUF1dG9tYXRvcjIgaXMgb25seSBzdXBwb3J0ZWQgc2luY2UgQW5kcm9pZCA1LjAgKExvbGxpcG9wKS4gJyArXG4gICAgICAgICdZb3UgY291bGQgc3RpbGwgdXNlIG90aGVyIHN1cHBvcnRlZCBiYWNrZW5kcyBpbiBvcmRlciB0byBhdXRvbWF0ZSBvbGRlciBBbmRyb2lkIHZlcnNpb25zLicpO1xuICAgIH1cblxuICAgIGlmIChhcGlMZXZlbCA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgIHRoaXMubG9nLmluZm8oJ1JlbGF4aW5nIGhpZGRlbiBhcGkgcG9saWN5Jyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRIaWRkZW5BcGlQb2xpY3koJzEnLCAhIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSB0byBlbmFibGUvZGlzYWJsZSBncHMgYmVmb3JlIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uXG4gICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5vcHRzLmdwc0VuYWJsZWQpKSB7XG4gICAgICBpZiAodGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgVHJ5aW5nIHRvICR7dGhpcy5vcHRzLmdwc0VuYWJsZWQgPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ30gZ3BzIGxvY2F0aW9uIHByb3ZpZGVyYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIodGhpcy5vcHRzLmdwc0VuYWJsZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgU29ycnkhICdncHNFbmFibGVkJyBjYXBhYmlsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnNgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXQgYXBwUGFja2FnZSBldCBhbCBmcm9tIG1hbmlmZXN0IGlmIG5lY2Vzc2FyeVxuICAgIGNvbnN0IGFwcEluZm8gPSBhd2FpdCBoZWxwZXJzLmdldExhdW5jaEluZm8odGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgLy8gYW5kIGdldCBpdCBvbnRvIG91ciAnb3B0cycgb2JqZWN0IHNvIHdlIHVzZSBpdCBmcm9tIG5vdyBvblxuICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRzLCBhcHBJbmZvIHx8IHt9KTtcblxuICAgIC8vIHNldCBhY3R1YWwgZGV2aWNlIG5hbWUsIHVkaWQsIHBsYXRmb3JtIHZlcnNpb24sIHNjcmVlbiBzaXplLCBzY3JlZW4gZGVuc2l0eSwgbW9kZWwgYW5kIG1hbnVmYWN0dXJlciBkZXRhaWxzXG4gICAgdGhpcy5jYXBzLmRldmljZU5hbWUgPSB0aGlzLmFkYi5jdXJEZXZpY2VJZDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlVURJRCA9IHRoaXMub3B0cy51ZGlkO1xuXG4gICAgLy8gc3RhcnQgYW4gYXZkLCBzZXQgdGhlIGxhbmd1YWdlL2xvY2FsZSwgcGljayBhbiBlbXVsYXRvciwgZXRjLi4uXG4gICAgLy8gVE9ETyB3aXRoIG11bHRpcGxlIGRldmljZXMgd2UnbGwgbmVlZCB0byBwYXJhbWV0ZXJpemUgdGhpc1xuICAgIGF3YWl0IGhlbHBlcnMuaW5pdERldmljZSh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcblxuICAgIC8vIFByZXBhcmUgdGhlIGRldmljZSBieSBmb3J3YXJkaW5nIHRoZSBVaUF1dG9tYXRvcjIgcG9ydFxuICAgIC8vIFRoaXMgY2FsbCBtdXRhdGVzIHRoaXMub3B0cy5zeXN0ZW1Qb3J0IGlmIGl0IGlzIG5vdCBzZXQgZXhwbGljaXRseVxuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVTeXN0ZW1Qb3J0KCk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgVWlBdXRvbWF0b3IyIE1KUEVHIHNlcnZlciBwb3J0IChpZlxuICAgIC8vIGFwcGxpY2FibGUpXG4gICAgYXdhaXQgdGhpcy5hbGxvY2F0ZU1qcGVnU2VydmVyUG9ydCgpO1xuXG4gICAgLy8gc2V0IHVwIHRoZSBtb2RpZmllZCBVaUF1dG9tYXRvcjIgc2VydmVyIGV0Y1xuICAgIGF3YWl0IHRoaXMuaW5pdFVpQXV0b21hdG9yMlNlcnZlcigpO1xuXG4gICAgLy8gU2hvdWxkIGJlIGFmdGVyIGluc3RhbGxpbmcgaW8uYXBwaXVtLnNldHRpbmdzIGluIGhlbHBlcnMuaW5pdERldmljZVxuICAgIGlmICh0aGlzLm9wdHMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiAmJiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDI2KSkgeyAvLyBBUEkgbGV2ZWwgMjYgaXMgQW5kcm9pZCA4LjAuXG4gICAgICAvLyBHcmFudGluZyBhbmRyb2lkLnBlcm1pc3Npb24uU0VUX0FOSU1BVElPTl9TQ0FMRSBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIGFuaW1hdGlvbnMgdW5kZXIgQVBJIGxldmVsIDI2XG4gICAgICAvLyBSZWFkIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL3B1bGwvMTE2NDAjaXNzdWVjb21tZW50LTQzODI2MDQ3N1xuICAgICAgLy8gYC0tbm8td2luZG93LWFuaW1hdGlvbmAgd29ya3Mgb3ZlciBBbmRyb2lkIDggdG8gZGlzYWJsZSBhbGwgb2YgYW5pbWF0aW9uc1xuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmlzQW5pbWF0aW9uT24oKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdEaXNhYmxpbmcgYW5pbWF0aW9uIHZpYSBpby5hcHBpdW0uc2V0dGluZ3MnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUoZmFsc2UpO1xuICAgICAgICB0aGlzLl93YXNXaW5kb3dBbmltYXRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdXaW5kb3cgYW5pbWF0aW9uIGlzIGFscmVhZHkgZGlzYWJsZWQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgYXBwIHVuZGVyIHRlc3RcbiAgICAvLyBwcmVwYXJlIG91ciBhY3R1YWwgQVVULCBnZXQgaXQgb24gdGhlIGRldmljZSwgZXRjLi4uXG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvLyBBZGRpbmcgQVVUIHBhY2thZ2UgbmFtZSBpbiB0aGUgY2FwYWJpbGl0aWVzIGlmIHBhY2thZ2UgbmFtZSBub3QgZXhpc3QgaW4gY2Fwc1xuICAgIGlmICghdGhpcy5jYXBzLmFwcFBhY2thZ2UgJiYgYXBwSW5mbykge1xuICAgICAgdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBhcHBJbmZvLmFwcFBhY2thZ2U7XG4gICAgfVxuXG4gICAgLy8gbGF1bmNoIFVpQXV0b21hdG9yMiBhbmQgd2FpdCB0aWxsIGl0cyBvbmxpbmUgYW5kIHdlIGhhdmUgYSBzZXNzaW9uXG4gICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuc3RhcnRTZXNzaW9uKHRoaXMuY2Fwcyk7XG5cbiAgICBhd2FpdCB0aGlzLmFkZERldmljZUluZm9Ub0NhcHMoKTtcblxuICAgIC8vIFVubG9jayB0aGUgZGV2aWNlIGFmdGVyIHRoZSBzZXNzaW9uIGlzIHN0YXJ0ZWQuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVubG9jaykge1xuICAgICAgLy8gdW5sb2NrIHRoZSBkZXZpY2UgdG8gcHJlcGFyZSBpdCBmb3IgdGVzdGluZ1xuICAgICAgYXdhaXQgaGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHRoaXMuY2Fwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGAnc2tpcFVubG9jaycgY2FwYWJpbGl0eSBzZXQsIHNvIHNraXBwaW5nIGRldmljZSB1bmxvY2tgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0Nocm9tZVNlc3Npb24pIHsgLy8gc3RhcnQgYSBjaHJvbWVkcml2ZXIgc2Vzc2lvblxuICAgICAgYXdhaXQgdGhpcy5zdGFydENocm9tZVNlc3Npb24odGhpcyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdHMuYXV0b0xhdW5jaCAmJiB0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVBcHBTdGFydHMoKTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgaW5pdGlhbCBvcmllbnRhdGlvbiBpcyByZXF1ZXN0ZWQsIHNldCBpdFxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5vcmllbnRhdGlvbikpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGluaXRpYWwgb3JpZW50YXRpb24gdG8gJyR7dGhpcy5vcHRzLm9yaWVudGF0aW9ufSdgKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0T3JpZW50YXRpb24odGhpcy5vcHRzLm9yaWVudGF0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSB3YW50IHRvIGltbWVkaWF0ZWx5IGdldCBpbnRvIGEgd2Vidmlldywgc2V0IG91ciBjb250ZXh0XG4gICAgLy8gYXBwcm9wcmlhdGVseVxuICAgIGlmICh0aGlzLm9wdHMuYXV0b1dlYnZpZXcpIHtcbiAgICAgIGNvbnN0IHZpZXdOYW1lID0gdGhpcy5kZWZhdWx0V2Vidmlld05hbWUoKTtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLm9wdHMuYXV0b1dlYnZpZXdUaW1lb3V0IHx8IDIwMDA7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBTZXR0aW5nIGF1dG8gd2VidmlldyB0byBjb250ZXh0ICcke3ZpZXdOYW1lfScgd2l0aCB0aW1lb3V0ICR7dGltZW91dH1tc2ApO1xuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIHRoaXMuc2V0Q29udGV4dC5iaW5kKHRoaXMpLCB2aWV3TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gbm93IHRoYXQgZXZlcnl0aGluZyBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHksIHR1cm4gb24gcHJveHlpbmcgc28gYWxsXG4gICAgLy8gc3Vic2VxdWVudCBzZXNzaW9uIHJlcXVlc3RzIGdvIHN0cmFpZ2h0IHRvL2Zyb20gdWlhdXRvbWF0b3IyXG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG4gIH1cblxuICBhc3luYyBhZGREZXZpY2VJbmZvVG9DYXBzICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgICAgbWFudWZhY3R1cmVyLFxuICAgICAgbW9kZWwsXG4gICAgICByZWFsRGlzcGxheVNpemUsXG4gICAgICBkaXNwbGF5RGVuc2l0eSxcbiAgICB9ID0gYXdhaXQgdGhpcy5tb2JpbGVHZXREZXZpY2VJbmZvKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZUFwaUxldmVsID0gcGFyc2VJbnQoYXBpVmVyc2lvbiwgMTApO1xuICAgIHRoaXMuY2Fwcy5wbGF0Zm9ybVZlcnNpb24gPSBwbGF0Zm9ybVZlcnNpb247XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlblNpemUgPSByZWFsRGlzcGxheVNpemU7XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlbkRlbnNpdHkgPSBkaXNwbGF5RGVuc2l0eTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTWFudWZhY3R1cmVyID0gbWFudWZhY3R1cmVyO1xuICB9XG5cbiAgYXN5bmMgaW5pdFVpQXV0b21hdG9yMlNlcnZlciAoKSB7XG4gICAgLy8gYnJva2VuIG91dCBmb3IgcmVhZGFiaWxpdHlcbiAgICBjb25zdCB1aWF1dG9tYXRvcjJPcHRzID0ge1xuICAgICAgaG9zdDogdGhpcy5vcHRzLnJlbW90ZUFkYkhvc3QgfHwgdGhpcy5vcHRzLmhvc3QgfHwgTE9DQUxIT1NUX0lQNCxcbiAgICAgIHN5c3RlbVBvcnQ6IHRoaXMub3B0cy5zeXN0ZW1Qb3J0LFxuICAgICAgZGV2aWNlUG9ydDogREVWSUNFX1BPUlQsXG4gICAgICBhZGI6IHRoaXMuYWRiLFxuICAgICAgYXBrOiB0aGlzLm9wdHMuYXBwLFxuICAgICAgdG1wRGlyOiB0aGlzLm9wdHMudG1wRGlyLFxuICAgICAgYXBwUGFja2FnZTogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICBhcHBBY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbjogISF0aGlzLm9wdHMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICAgIGRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlOiB0aGlzLm9wdHMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UsXG4gICAgICByZWFkVGltZW91dDogdGhpcy5vcHRzLnVpYXV0b21hdG9yMlNlcnZlclJlYWRUaW1lb3V0LFxuICAgIH07XG4gICAgLy8gbm93IHRoYXQgd2UgaGF2ZSBwYWNrYWdlIGFuZCBhY3Rpdml0eSwgd2UgY2FuIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZlxuICAgIC8vIHVpYXV0b21hdG9yMiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBvcHRpb25zXG4gICAgdGhpcy51aWF1dG9tYXRvcjIgPSBuZXcgVWlBdXRvbWF0b3IyU2VydmVyKHRoaXMubG9nLCB1aWF1dG9tYXRvcjJPcHRzKTtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy51aWF1dG9tYXRvcjIucHJveHlSZXFSZXMuYmluZCh0aGlzLnVpYXV0b21hdG9yMik7XG4gICAgdGhpcy5wcm94eUNvbW1hbmQgPSB0aGlzLnVpYXV0b21hdG9yMi5wcm94eUNvbW1hbmQuYmluZCh0aGlzLnVpYXV0b21hdG9yMik7XG5cbiAgICBpZiAodGhpcy5vcHRzLnNraXBTZXJ2ZXJJbnN0YWxsYXRpb24pIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYCdza2lwU2VydmVySW5zdGFsbGF0aW9uJyBpcyBzZXQuIFNraXBwaW5nIFVJQXV0b21hdG9yMiBzZXJ2ZXIgaW5zdGFsbGF0aW9uLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5pbnN0YWxsU2VydmVyQXBrKHRoaXMub3B0cy51aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QoXG4gICAgICAgICAgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQsXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCBhZGQgc2VydmVyIHBhY2thZ2VzIHRvIHRoZSBEb3plIHdoaXRlbGlzdC4gT3JpZ2luYWwgZXJyb3I6IGAgK1xuICAgICAgICAgIChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBpbml0QVVUICgpIHtcbiAgICAvLyBVbmluc3RhbGwgYW55IHVuaW5zdGFsbE90aGVyUGFja2FnZXMgd2hpY2ggd2VyZSBzcGVjaWZpZWQgaW4gY2Fwc1xuICAgIGlmICh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcykge1xuICAgICAgYXdhaXQgaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzKFxuICAgICAgICB0aGlzLmFkYixcbiAgICAgICAgaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSxcbiAgICAgICAgW1NFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIGFueSBcIm90aGVyQXBwc1wiIHRoYXQgd2VyZSBzcGVjaWZpZWQgaW4gY2Fwc1xuICAgIGlmICh0aGlzLm9wdHMub3RoZXJBcHBzKSB7XG4gICAgICBsZXQgb3RoZXJBcHBzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgb3RoZXJBcHBzID0gaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy5vdGhlckFwcHMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgcGFyc2UgXCJvdGhlckFwcHNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIG90aGVyQXBwcyA9IGF3YWl0IEIuYWxsKG90aGVyQXBwc1xuICAgICAgICAubWFwKChhcHApID0+IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAoYXBwLCBbQVBLX0VYVEVOU0lPTiwgQVBLU19FWFRFTlNJT05dKSkpO1xuICAgICAgYXdhaXQgaGVscGVycy5pbnN0YWxsT3RoZXJBcGtzKG90aGVyQXBwcywgdGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgIGlmICh0aGlzLm9wdHMubm9SZXNldCAmJiAhKGF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKHRoaXMub3B0cy5hcHBQYWNrYWdlKSlcbiAgICAgICAgICB8fCAhdGhpcy5vcHRzLm5vUmVzZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdHMubm9TaWduICYmICFhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQodGhpcy5vcHRzLmFwcCwgdGhpcy5vcHRzLmFwcFBhY2thZ2UsIHtcbiAgICAgICAgICByZXF1aXJlRGVmYXVsdENlcnQ6IGZhbHNlLFxuICAgICAgICB9KSkge1xuICAgICAgICAgIGF3YWl0IGhlbHBlcnMuc2lnbkFwcCh0aGlzLmFkYiwgdGhpcy5vcHRzLmFwcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgaGVscGVycy5pbnN0YWxsQXBrKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ25vUmVzZXQgaGFzIGJlZW4gcmVxdWVzdGVkIGFuZCB0aGUgYXBwIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBEb2luZyBub3RoaW5nJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0KSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ0Z1bGwgcmVzZXQgcmVxdWlyZXMgYW4gYXBwIGNhcGFiaWxpdHksIHVzZSBmYXN0UmVzZXQgaWYgYXBwIGlzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0ICYmIHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZW5zdXJlQXBwU3RhcnRzICgpIHtcbiAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBhY3Rpdml0eSBhbmQgcGFja2FnZSB0byB3YWl0IGZvclxuICAgIGNvbnN0IGFwcFdhaXRQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlIHx8IHRoaXMub3B0cy5hcHBQYWNrYWdlO1xuICAgIGNvbnN0IGFwcFdhaXRBY3Rpdml0eSA9IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHkgfHwgdGhpcy5vcHRzLmFwcEFjdGl2aXR5O1xuXG4gICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9LyR7dGhpcy5vcHRzLmFwcEFjdGl2aXR5fSBgICtcbiAgICAgIGBhbmQgd2FpdGluZyBmb3IgJyR7YXBwV2FpdFBhY2thZ2V9LyR7YXBwV2FpdEFjdGl2aXR5fSdgKTtcblxuICAgIGlmICh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBhbmRyb2lkQ292ZXJhZ2UgaXMgY29uZmlndXJlZC4gYCArXG4gICAgICAgIGAgU3RhcnRpbmcgaW5zdHJ1bWVudGF0aW9uIG9mICcke3RoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2V9Jy4uLmApO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuYW5kcm9pZENvdmVyYWdlKHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2UsIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgJiYgIXRoaXMub3B0cy5mb3JjZUFwcExhdW5jaFxuICAgICAgICAmJiBhd2FpdCB0aGlzLmFkYi5wcm9jZXNzRXhpc3RzKHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9JyBpcyBhbHJlYWR5IHJ1bm5pbmcgYW5kIG5vUmVzZXQgaXMgZW5hYmxlZC4gYCArXG4gICAgICAgIGBTZXQgZm9yY2VBcHBMYXVuY2ggY2FwYWJpbGl0eSB0byB0cnVlIGlmIHRoZSBhcHAgbXVzdCBiZSBmb3JjZWZ1bGx5IHJlc3RhcnRlZCBvbiBzZXNzaW9uIHN0YXJ0dXAuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKHtcbiAgICAgIHBrZzogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICBhY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uIHx8ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTicsXG4gICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5IHx8ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzIHx8ICcweDEwMjAwMDAwJywgLy8gRkxBR19BQ1RJVklUWV9ORVdfVEFTSyB8IEZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERURcbiAgICAgIHdhaXRQa2c6IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSxcbiAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgIHdhaXRGb3JMYXVuY2g6IHRoaXMub3B0cy5hcHBXYWl0Rm9yTGF1bmNoLFxuICAgICAgd2FpdER1cmF0aW9uOiB0aGlzLm9wdHMuYXBwV2FpdER1cmF0aW9uLFxuICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgIHN0b3BBcHA6IHRoaXMub3B0cy5mb3JjZUFwcExhdW5jaCB8fCAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCxcbiAgICAgIHJldHJ5OiB0cnVlLFxuICAgICAgdXNlcjogdGhpcy5vcHRzLnVzZXJQcm9maWxlLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0RlbGV0aW5nIFVpQXV0b21hdG9yMiBzZXNzaW9uJyk7XG5cbiAgICBjb25zdCBzY3JlZW5SZWNvcmRpbmdTdG9wVGFza3MgPSBbYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcykpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9wUmVjb3JkaW5nU2NyZWVuKCk7XG4gICAgICB9XG4gICAgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGF3YWl0IHRoaXMubW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb2JpbGVTdG9wTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nKCk7XG4gICAgICB9XG4gICAgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuICAgICAgfVxuICAgIH1dO1xuXG4gICAgYXdhaXQgYW5kcm9pZEhlbHBlcnMucmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzKHRoaXMuc2VydmVyLCB0aGlzLnNlc3Npb25JZCk7XG5cbiAgICBpZiAodGhpcy51aWF1dG9tYXRvcjIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcENocm9tZWRyaXZlclByb3hpZXMoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gc3RvcCBDaHJvbWVEcml2ZXIgcHJveGllczogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmp3cFByb3h5QWN0aXZlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcHJveHkgZGVsZXRlU2Vzc2lvbiB0byBVaUF1dG9tYXRvcjI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuYWRiKSB7XG4gICAgICBhd2FpdCBCLmFsbChzY3JlZW5SZWNvcmRpbmdTdG9wVGFza3MubWFwKCh0YXNrKSA9PiB7XG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRhc2soKTtcbiAgICAgICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICAgIH0pKCk7XG4gICAgICB9KSk7XG5cbiAgICAgIGlmICh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1NodXR0aW5nIGRvd24gdGhlIGFkYiBwcm9jZXNzIG9mIGluc3RydW1lbnRhdGlvbi4uLicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5lbmRBbmRyb2lkQ292ZXJhZ2UoKTtcbiAgICAgICAgLy8gVXNlIHRoaXMgYnJvYWRjYXN0IGludGVudCB0byBub3RpZnkgaXQncyB0aW1lIHRvIGR1bXAgY292ZXJhZ2UgdG8gZmlsZVxuICAgICAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZUVuZEludGVudCkge1xuICAgICAgICAgIHRoaXMubG9nLmluZm8oYFNlbmRpbmcgaW50ZW50IGJyb2FkY2FzdCAnJHt0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50fScgYXQgdGhlIGVuZCBvZiBpbnN0cnVtZW50aW5nLmApO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmJyb2FkY2FzdCh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKCdObyBhbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQgaXMgY29uZmlndXJlZCBpbiBjYXBzLiBQb3NzaWJseSB5b3UgY2Fubm90IGdldCBjb3ZlcmFnZSBmaWxlLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ2hyb21lU2Vzc2lvbiAmJiAoKCF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0ICYmICF0aGlzLm9wdHMubm9SZXNldClcbiAgICAgICAgICAgIHx8ICh0aGlzLm9wdHMubm9SZXNldCAmJiB0aGlzLm9wdHMuc2hvdWxkVGVybWluYXRlQXBwKSkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byBmb3JjZSBzdG9wIGFwcDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgJiYgIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYENhcGFiaWxpdHkgJ2Z1bGxSZXNldCcgc2V0IHRvICd0cnVlJywgVW5pbnN0YWxsaW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfSdgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byB1bmluc3RhbGwgYXBwOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhpcyB2YWx1ZSBjYW4gYmUgdHJ1ZSBpZiB0ZXN0IHRhcmdldCBkZXZpY2UgaXMgPD0gMjZcbiAgICAgIGlmICh0aGlzLl93YXNXaW5kb3dBbmltYXRpb25EaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdSZXN0b3Jpbmcgd2luZG93IGFuaW1hdGlvbiBzdGF0ZScpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBbmltYXRpb25TdGF0ZSh0cnVlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYWRiLnN0b3BMb2djYXQoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVsZWFzZVN5c3RlbVBvcnQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byByZW1vdmUgc3lzdGVtIHBvcnQgZm9yd2FyZDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAvLyBJZ25vcmUsIHRoaXMgYmxvY2sgd2lsbCBhbHNvIGJlIGNhbGxlZCB3aGVuIHdlIGZhbGwgaW4gY2F0Y2ggYmxvY2tcbiAgICAgICAgLy8gYW5kIGJlZm9yZSBldmVuIHBvcnQgZm9yd2FyZC5cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVsZWFzZU1qcGVnU2VydmVyUG9ydCgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHJlbW92ZSBNSlBFRyBzZXJ2ZXIgcG9ydCBmb3J3YXJkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIC8vIElnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVzdG9yaW5nIGhpZGRlbiBhcGkgcG9saWN5IHRvIHRoZSBkZXZpY2UgZGVmYXVsdCBjb25maWd1cmF0aW9uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3koISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICBsZXQgYXZkTmFtZSA9IHRoaXMub3B0cy5hdmQucmVwbGFjZSgnQCcsICcnKTtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYENsb3NpbmcgZW11bGF0b3IgJyR7YXZkTmFtZX0nYCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIua2lsbEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gY2xvc2UgZW11bGF0b3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMubWpwZWdTdHJlYW0pIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ0Nsb3NpbmcgTUpQRUcgc3RyZWFtJyk7XG4gICAgICB0aGlzLm1qcGVnU3RyZWFtLnN0b3AoKTtcbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlU2Vzc2lvbigpO1xuICB9XG5cbiAgYXN5bmMgY2hlY2tBcHBQcmVzZW50ICgpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnQ2hlY2tpbmcgd2hldGhlciBhcHAgaXMgYWN0dWFsbHkgcHJlc2VudCcpO1xuICAgIGlmICghKGF3YWl0IGZzLmV4aXN0cyh0aGlzLm9wdHMuYXBwKSkpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBmaW5kIGFwcCBhcGsgYXQgJyR7dGhpcy5vcHRzLmFwcH0nYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25TZXR0aW5nc1VwZGF0ZSAoKSB7XG4gICAgLy8gaW50ZW50aW9uYWxseSBkbyBub3RoaW5nIGhlcmUsIHNpbmNlIGNvbW1hbmRzLnVwZGF0ZVNldHRpbmdzIHByb3hpZXNcbiAgICAvLyBzZXR0aW5ncyB0byB0aGUgdWlhdXRvMiBzZXJ2ZXIgYWxyZWFkeVxuICB9XG5cbiAgLy8gTmVlZCB0byBvdmVycmlkZSBhbmRyb2lkLWRyaXZlcidzIHZlcnNpb24gb2YgdGhpcyBzaW5jZSB3ZSBkb24ndCBhY3R1YWxseVxuICAvLyBoYXZlIGEgYm9vdHN0cmFwOyBpbnN0ZWFkIHdlIGp1c3QgcmVzdGFydCBhZGIgYW5kIHJlLWZvcndhcmQgdGhlIFVpQXV0b21hdG9yMlxuICAvLyBwb3J0XG4gIGFzeW5jIHdyYXBCb290c3RyYXBEaXNjb25uZWN0ICh3cmFwcGVkKSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlU3lzdGVtUG9ydCgpO1xuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQoKTtcbiAgfVxuXG4gIHByb3h5QWN0aXZlIChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5wcm94eUFjdGl2ZShzZXNzaW9uSWQpO1xuXG4gICAgLy8gd2UgYWx3YXlzIGhhdmUgYW4gYWN0aXZlIHByb3h5IHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuY2FuUHJveHkoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGNhbiBhbHdheXMgcHJveHkgdG8gdGhlIHVpYXV0b21hdG9yMiBzZXJ2ZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5nZXRQcm94eUF2b2lkTGlzdChzZXNzaW9uSWQpO1xuICAgIC8vIHdlIGFyZSBtYWludGFpbmluZyB0d28gc2V0cyBvZiBOT19QUk9YWSBsaXN0cywgb25lIGZvciBjaHJvbWVkcml2ZXIoQ0hST01FX05PX1BST1hZKVxuICAgIC8vIGFuZCBvbmUgZm9yIHVpYXV0b21hdG9yMihOT19QUk9YWSksIGJhc2VkIG9uIGN1cnJlbnQgY29udGV4dCB3aWxsIHJldHVybiByZWxhdGVkIE5PX1BST1hZIGxpc3RcbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLmNocm9tZWRyaXZlcikpIHtcbiAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgd2VidmlldyhjaHJvbWVkcml2ZXIpLCB0aGVuIHJldHVybiBDSFJPTUVfTk9fUFJPWFkgbGlzdFxuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gQ0hST01FX05PX1BST1hZO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBOT19QUk9YWTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5uYXRpdmVXZWJTY3JlZW5zaG90KSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBbLi4udGhpcy5qd3BQcm94eUF2b2lkLCBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zY3JlZW5zaG90JyldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgZ2V0IGlzQ2hyb21lU2Vzc2lvbiAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gIH1cbn1cblxuLy8gZmlyc3QgYWRkIHRoZSBhbmRyb2lkLWRyaXZlciBjb21tYW5kcyB3aGljaCB3ZSB3aWxsIGZhbGwgYmFjayB0b1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhhbmRyb2lkQ29tbWFuZHMpKSB7XG4gIEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIucHJvdG90eXBlW2NtZF0gPSBmbjtcbn1cblxuLy8gdGhlbiBvdmVyd3JpdGUgd2l0aCBhbnkgdWlhdXRvbWF0b3IyLXNwZWNpZmljIGNvbW1hbmRzXG5mb3IgKGxldCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGNvbW1hbmRzKSkge1xuICBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbmV4cG9ydCB7IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0Es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LEVBQzdELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEVBQ2hELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQ3pELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLEVBQ2pELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQzFDLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLEVBQ3BELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ25ELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQ2hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDLEVBQ25FLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLEVBQ3hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLEVBQzdELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxzREFBc0QsQ0FBQyxDQUFDLEVBQzVFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvREFBb0QsQ0FBQyxDQUFDLEVBQzFFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDLEVBQ2xFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FB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
@@ -1 +1 @@
1
- {"version":3,"file":"driver.js","names":["_lodash","_interopRequireDefault","require","_driver","_uiautomator","_methodMap","_support","_asyncbox","_bluebird","_index","_appiumAdb","_helpers","_appiumAndroidDriver","_desiredCaps","_portscanner","_os","_path","_extensions","helpers","Object","assign","uiautomator2Helpers","androidHelpers","DEVICE_PORT_RANGE","DEVICE_PORT_ALLOCATION_GUARD","util","getLockFileGuard","path","resolve","os","tmpdir","timeout","tryRecovery","DEVICE_PORT","MJPEG_SERVER_DEVICE_PORT","LOCALHOST_IP4","NO_PROXY","RegExp","CHROME_NO_PROXY","MEMOIZED_FUNCTIONS","AndroidUiautomator2Driver","BaseDriver","newMethodMap","constructor","opts","shouldValidateCaps","shell","locatorStrategies","desiredCapConstraints","uiautomator2","jwpProxyActive","jwpProxyAvoid","apkStrings","settings","DeviceSettings","ignoreUnimportantViews","allowInvisibleElements","onSettingsUpdate","bind","chromedriver","sessionChromedrivers","fn","_","memoize","validateDesiredCaps","caps","createSession","args","sessionId","serverDetails","platform","webStorageEnabled","takesScreenshot","javascriptEnabled","databaseEnabled","networkConnectionEnabled","locationContextEnabled","warnings","desired","curContext","defaultContextName","defaultOpts","fullReset","autoLaunch","adbPort","DEFAULT_ADB_PORT","androidInstallTimeout","defaults","isChromeSession","log","info","pkg","activity","getChromePkg","browserName","appPackage","appActivity","reboot","setAvdFromCapabilities","app","configureApp","APK_EXTENSION","APKS_EXTENSION","checkAppPresent","startUiAutomator2Session","fillDeviceDetails","mjpegScreenshotUrl","mjpegStream","mjpeg","MJpegStream","start","e","deleteSession","pixelRatio","getDevicePixelRatio","statBarHeight","getStatusBarHeight","viewportRect","getViewPortRect","driverData","getSession","sessionData","debug","uia2Data","jwproxy","command","isEmulator","adb","avd","deviceName","errorAndThrow","platformVersion","avdDevice","replace","allocateSystemPort","forwardPort","localPort","checkPortStatus","systemPort","_hasSystemPortInCaps","startPort","endPort","findAPortNotInUse","releaseSystemPort","removePortForward","allocateMjpegServerPort","mjpegServerPort","releaseMjpegServerPort","udid","emPort","getDeviceInfoFromCaps","createADB","apiLevel","getApiLevel","setHiddenApiPolicy","ignoreHiddenApiPolicyError","hasValue","gpsEnabled","toggleGPSLocationProvider","warn","appInfo","getLaunchInfo","curDeviceId","deviceUDID","initDevice","initUiAutomator2Server","disableWindowAnimation","isAnimationOn","setAnimationState","_wasWindowAnimationDisabled","initAUT","startSession","addDeviceInfoToCaps","skipUnlock","unlock","startChromeSession","ensureAppStarts","orientation","setOrientation","autoWebview","viewName","defaultWebviewName","autoWebviewTimeout","retryInterval","setContext","apiVersion","manufacturer","model","realDisplaySize","displayDensity","mobileGetDeviceInfo","deviceApiLevel","parseInt","deviceScreenSize","deviceScreenDensity","deviceModel","deviceManufacturer","uiautomator2Opts","host","remoteAdbHost","devicePort","apk","tmpDir","disableSuppressAccessibilityService","readTimeout","uiautomator2ServerReadTimeout","UiAutomator2Server","proxyReqRes","proxyCommand","skipServerInstallation","installServerApk","uiautomator2ServerInstallTimeout","addToDeviceIdleWhitelist","SETTINGS_HELPER_PKG_ID","SERVER_PACKAGE_ID","SERVER_TEST_PACKAGE_ID","stderr","message","uninstallOtherPackages","parseArray","otherApps","B","all","map","installOtherApks","noReset","isAppInstalled","noSign","checkApkCert","requireDefaultCert","signApp","skipUninstall","uninstallApk","installApk","fastReset","resetApp","appWaitPackage","appWaitActivity","androidCoverage","forceAppLaunch","processExists","startApp","action","intentAction","category","intentCategory","flags","intentFlags","waitPkg","waitActivity","waitForLaunch","appWaitForLaunch","waitDuration","appWaitDuration","optionalIntentArguments","stopApp","dontStopAppOnReset","retry","user","userProfile","screenRecordingStopTasks","isEmpty","_screenRecordingProperties","stopRecordingScreen","mobileIsMediaProjectionRecordingRunning","mobileStopMediaProjectionRecording","_screenStreamingProps","mobileStopScreenStreaming","removeAllSessionWebSocketHandlers","server","stopChromedriverProxies","err","task","ign","endAndroidCoverage","androidCoverageEndIntent","broadcast","shouldTerminateApp","forceStop","stopLogcat","error","setDefaultHiddenApiPolicy","avdName","killEmulator","stop","fs","exists","wrapBootstrapDisconnect","wrapped","restart","proxyActive","canProxy","getProxyAvoidList","nativeWebScreenshot","isChromeBrowser","exports","cmd","toPairs","androidCommands","prototype","commands","_default","default"],"sources":["../../lib/driver.js"],"sourcesContent":["import _ from 'lodash';\nimport { BaseDriver, DeviceSettings } from 'appium/driver';\nimport {\n UiAutomator2Server, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID\n} from './uiautomator2';\nimport { newMethodMap } from './method-map';\nimport { fs, util, mjpeg } from 'appium/support';\nimport { retryInterval } from 'asyncbox';\nimport B from 'bluebird';\nimport commands from './commands/index';\nimport { DEFAULT_ADB_PORT } from 'appium-adb';\nimport uiautomator2Helpers from './helpers';\nimport { androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID, } from 'appium-android-driver';\nimport desiredCapConstraints from './desired-caps';\nimport { findAPortNotInUse, checkPortStatus } from 'portscanner';\nimport os from 'os';\nimport path from 'path';\nimport { APK_EXTENSION, APKS_EXTENSION } from './extensions';\n\n\nconst helpers = Object.assign({}, uiautomator2Helpers, androidHelpers);\n\n// The range of ports we can use on the system for communicating to the\n// UiAutomator2 HTTP server on the device\nconst DEVICE_PORT_RANGE = [8200, 8299];\n\n// The guard is needed to avoid dynamic system port allocation conflicts for\n// parallel driver sessions\nconst DEVICE_PORT_ALLOCATION_GUARD = util.getLockFileGuard(\n path.resolve(os.tmpdir(), 'uia2_device_port_guard'),\n {timeout: 25, tryRecovery: true}\n);\n\n// This is the port that UiAutomator2 listens to on the device. We will forward\n// one of the ports above on the system to this port on the device.\nconst DEVICE_PORT = 6790;\n// This is the port that the UiAutomator2 MJPEG server listens to on the device.\n// We will forward one of the ports above on the system to this port on the\n// device.\nconst MJPEG_SERVER_DEVICE_PORT = 7810;\n\nconst LOCALHOST_IP4 = '127.0.0.1';\n\n// NO_PROXY contains the paths that we never want to proxy to UiAutomator2 server.\n// TODO: Add the list of paths that we never want to proxy to UiAutomator2 server.\n// TODO: Need to segregate the paths better way using regular expressions wherever applicable.\n// (Not segregating right away because more paths to be added in the NO_PROXY list)\nconst NO_PROXY = [\n ['GET', new RegExp('^/session/(?!.*/)')],\n ['GET', new RegExp('^/session/[^/]+/alert_[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/alert/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/appium/[^/]+/current_activity')],\n ['GET', new RegExp('^/session/[^/]+/appium/[^/]+/current_package')],\n ['GET', new RegExp('^/session/[^/]+/appium/app/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/appium/settings')],\n ['GET', new RegExp('^/session/[^/]+/context')],\n ['GET', new RegExp('^/session/[^/]+/contexts')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/attribute')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/displayed')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/enabled')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/location_in_view')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/name')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/screenshot')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/selected')],\n ['GET', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/location')],\n ['GET', new RegExp('^/session/[^/]+/network_connection')],\n ['GET', new RegExp('^/session/[^/]+/screenshot')],\n ['GET', new RegExp('^/session/[^/]+/timeouts')],\n ['GET', new RegExp('^/session/[^/]+/url')],\n ['POST', new RegExp('^/session/[^/]+/[^/]+_alert$')],\n ['POST', new RegExp('^/session/[^/]+/actions')],\n ['POST', new RegExp('^/session/[^/]+/alert/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/app/[^/]')],\n ['POST', new RegExp('^/session/[^/]+/appium/[^/]+/start_activity')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/appium/compare_images')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/(?!set_clipboard)[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/appium/element/[^/]+/replace_value')],\n ['POST', new RegExp('^/session/[^/]+/appium/element/[^/]+/value')],\n ['POST', new RegExp('^/session/[^/]+/appium/getPerformanceData')],\n ['POST', new RegExp('^/session/[^/]+/appium/performanceData/types')],\n ['POST', new RegExp('^/session/[^/]+/appium/settings')],\n ['POST', new RegExp('^/session/[^/]+/appium/execute_driver')],\n ['POST', new RegExp('^/session/[^/]+/appium/start_recording_screen')],\n ['POST', new RegExp('^/session/[^/]+/appium/stop_recording_screen')],\n ['POST', new RegExp('^/session/[^/]+/appium/.*event')],\n ['POST', new RegExp('^/session/[^/]+/context')],\n ['POST', new RegExp('^/session/[^/]+/element')],\n ['POST', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/keys')],\n ['POST', new RegExp('^/session/[^/]+/location')],\n ['POST', new RegExp('^/session/[^/]+/network_connection')],\n ['POST', new RegExp('^/session/[^/]+/timeouts')],\n ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')],\n ['POST', new RegExp('^/session/[^/]+/touch/perform')],\n ['POST', new RegExp('^/session/[^/]+/url')],\n\n // MJSONWP commands\n ['GET', new RegExp('^/session/[^/]+/log/types')],\n ['POST', new RegExp('^/session/[^/]+/execute')],\n ['POST', new RegExp('^/session/[^/]+/execute_async')],\n ['POST', new RegExp('^/session/[^/]+/log')],\n // W3C commands\n // For Selenium v4 (W3C does not have this route)\n ['GET', new RegExp('^/session/[^/]+/se/log/types')],\n ['GET', new RegExp('^/session/[^/]+/window/rect')],\n ['POST', new RegExp('^/session/[^/]+/execute/async')],\n ['POST', new RegExp('^/session/[^/]+/execute/sync')],\n // For Selenium v4 (W3C does not have this route)\n ['POST', new RegExp('^/session/[^/]+/se/log')],\n];\n\n// This is a set of methods and paths that we never want to proxy to Chromedriver.\nconst CHROME_NO_PROXY = [\n ['GET', new RegExp('^/session/[^/]+/appium')],\n ['GET', new RegExp('^/session/[^/]+/context')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/rect')],\n ['GET', new RegExp('^/session/[^/]+/orientation')],\n ['POST', new RegExp('^/session/[^/]+/appium')],\n ['POST', new RegExp('^/session/[^/]+/context')],\n ['POST', new RegExp('^/session/[^/]+/orientation')],\n ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')],\n ['POST', new RegExp('^/session/[^/]+/touch/perform')],\n\n // this is needed to make the mobile: commands working in web context\n ['POST', new RegExp('^/session/[^/]+/execute$')],\n ['POST', new RegExp('^/session/[^/]+/execute/sync')],\n\n // MJSONWP commands\n ['GET', new RegExp('^/session/[^/]+/log/types$')],\n ['POST', new RegExp('^/session/[^/]+/log$')],\n // W3C commands\n // For Selenium v4 (W3C does not have this route)\n ['GET', new RegExp('^/session/[^/]+/se/log/types$')],\n // For Selenium v4 (W3C does not have this route)\n ['POST', new RegExp('^/session/[^/]+/se/log$')],\n];\n\nconst MEMOIZED_FUNCTIONS = [\n 'getStatusBarHeight',\n 'getDevicePixelRatio',\n];\n\nclass AndroidUiautomator2Driver extends BaseDriver {\n\n static newMethodMap = newMethodMap;\n\n constructor (opts = {}, shouldValidateCaps = true) {\n // `shell` overwrites adb.shell, so remove\n delete opts.shell;\n\n super(opts, shouldValidateCaps);\n this.locatorStrategies = [\n 'xpath',\n 'id',\n 'class name',\n 'accessibility id',\n 'css selector',\n '-android uiautomator'\n ];\n this.desiredCapConstraints = desiredCapConstraints;\n this.uiautomator2 = null;\n this.jwpProxyActive = false;\n this.jwpProxyAvoid = NO_PROXY;\n this.apkStrings = {}; // map of language -> strings obj\n\n this.settings = new DeviceSettings({ignoreUnimportantViews: false, allowInvisibleElements: false},\n this.onSettingsUpdate.bind(this));\n // handle webview mechanics from AndroidDriver\n this.chromedriver = null;\n this.sessionChromedrivers = {};\n\n // memoize functions here, so that they are done on a per-instance basis\n for (const fn of MEMOIZED_FUNCTIONS) {\n this[fn] = _.memoize(this[fn]);\n }\n }\n\n validateDesiredCaps (caps) {\n return super.validateDesiredCaps(caps) && androidHelpers.validateDesiredCaps(caps);\n }\n\n async createSession (...args) {\n try {\n // TODO handle otherSessionData for multiple sessions\n let [sessionId, caps] = await super.createSession(...args);\n\n let serverDetails = {\n platform: 'LINUX',\n webStorageEnabled: false,\n takesScreenshot: true,\n javascriptEnabled: true,\n databaseEnabled: false,\n networkConnectionEnabled: true,\n locationContextEnabled: false,\n warnings: {},\n desired: this.caps,\n };\n\n this.caps = Object.assign(serverDetails, this.caps);\n\n this.curContext = this.defaultContextName();\n\n let defaultOpts = {\n fullReset: false,\n autoLaunch: true,\n adbPort: DEFAULT_ADB_PORT,\n androidInstallTimeout: 90000\n };\n _.defaults(this.opts, defaultOpts);\n\n if (this.isChromeSession) {\n this.log.info(\"We're going to run a Chrome-based session\");\n let {pkg, activity} = helpers.getChromePkg(this.opts.browserName);\n this.opts.appPackage = this.caps.appPackage = pkg;\n this.opts.appActivity = this.caps.appActivity = activity;\n this.log.info(`Chrome-type package and activity are ${pkg} and ${activity}`);\n }\n\n if (this.opts.reboot) {\n this.setAvdFromCapabilities(caps);\n }\n\n if (this.opts.app) {\n // find and copy, or download and unzip an app url or path\n this.opts.app = await this.helpers.configureApp(this.opts.app, [APK_EXTENSION, APKS_EXTENSION]);\n await this.checkAppPresent();\n } else if (this.opts.appPackage) {\n // the app isn't an actual app file but rather something we want to\n // assume is on the device and just launch via the appPackage\n this.log.info(`Starting '${this.opts.appPackage}' directly on the device`);\n } else {\n this.log.info(`Neither 'app' nor 'appPackage' was set. Starting UiAutomator2 ` +\n 'without the target application');\n }\n this.opts.adbPort = this.opts.adbPort || DEFAULT_ADB_PORT;\n\n await this.startUiAutomator2Session();\n await this.fillDeviceDetails();\n if (this.opts.mjpegScreenshotUrl) {\n this.log.info(`Starting MJPEG stream reading URL: '${this.opts.mjpegScreenshotUrl}'`);\n this.mjpegStream = new mjpeg.MJpegStream(this.opts.mjpegScreenshotUrl);\n await this.mjpegStream.start();\n }\n return [sessionId, this.caps];\n } catch (e) {\n await this.deleteSession();\n throw e;\n }\n }\n\n async fillDeviceDetails () {\n this.caps.pixelRatio = await this.getDevicePixelRatio();\n this.caps.statBarHeight = await this.getStatusBarHeight();\n this.caps.viewportRect = await this.getViewPortRect();\n }\n\n get driverData () {\n // TODO fill out resource info here\n return {};\n }\n\n async getSession () {\n let sessionData = await super.getSession();\n this.log.debug('Getting session details from server to mix in');\n let uia2Data = await this.uiautomator2.jwproxy.command('/', 'GET', {});\n return Object.assign({}, sessionData, uia2Data);\n }\n\n isEmulator () {\n return helpers.isEmulator(this.adb, this.opts);\n }\n\n setAvdFromCapabilities (caps) {\n if (this.opts.avd) {\n this.log.info('avd name defined, ignoring device name and platform version');\n } else {\n if (!caps.deviceName) {\n this.log.errorAndThrow('avd or deviceName should be specified when reboot option is enables');\n }\n if (!caps.platformVersion) {\n this.log.errorAndThrow('avd or platformVersion should be specified when reboot option is enabled');\n }\n let avdDevice = caps.deviceName.replace(/[^a-zA-Z0-9_.]/g, '-');\n this.opts.avd = `${avdDevice}__${caps.platformVersion}`;\n }\n }\n\n async allocateSystemPort () {\n const forwardPort = async (localPort) => {\n this.log.debug(`Forwarding UiAutomator2 Server port ${DEVICE_PORT} to local port ${localPort}`);\n if ((await checkPortStatus(localPort, LOCALHOST_IP4)) === 'open') {\n this.log.errorAndThrow(`UiAutomator2 Server cannot start because the local port #${localPort} is busy. ` +\n `Make sure the port you provide via 'systemPort' capability is not occupied. ` +\n `This situation might often be a result of an inaccurate sessions management, e.g. ` +\n `old automation sessions on the same device must always be closed before starting new ones.`);\n }\n await this.adb.forwardPort(localPort, DEVICE_PORT);\n };\n\n if (this.opts.systemPort) {\n this._hasSystemPortInCaps = true;\n return await forwardPort(this.opts.systemPort);\n }\n\n await DEVICE_PORT_ALLOCATION_GUARD(async () => {\n const [startPort, endPort] = DEVICE_PORT_RANGE;\n try {\n this.opts.systemPort = await findAPortNotInUse(startPort, endPort);\n } catch (e) {\n this.log.errorAndThrow(\n `Cannot find any free port in range ${startPort}..${endPort}}. ` +\n `Please set the available port number by providing the systemPort capability or ` +\n `double check the processes that are locking ports within this range and terminate ` +\n `these which are not needed anymore`);\n }\n await forwardPort(this.opts.systemPort);\n });\n }\n\n async releaseSystemPort () {\n if (!this.opts.systemPort || !this.adb) {\n return;\n }\n\n if (this._hasSystemPortInCaps) {\n await this.adb.removePortForward(this.opts.systemPort);\n } else {\n await DEVICE_PORT_ALLOCATION_GUARD(async () => await this.adb.removePortForward(this.opts.systemPort));\n }\n }\n\n async allocateMjpegServerPort () {\n if (this.opts.mjpegServerPort) {\n await this.adb.forwardPort(this.opts.mjpegServerPort, MJPEG_SERVER_DEVICE_PORT);\n }\n }\n\n async releaseMjpegServerPort () {\n if (this.opts.mjpegServerPort) {\n await this.adb.removePortForward(this.opts.mjpegServerPort);\n }\n }\n\n async startUiAutomator2Session () {\n // get device udid for this session\n let {udid, emPort} = await helpers.getDeviceInfoFromCaps(this.opts);\n this.opts.udid = udid;\n this.opts.emPort = emPort;\n\n // now that we know our java version and device info, we can create our\n // ADB instance\n this.adb = await androidHelpers.createADB(this.opts);\n\n const apiLevel = await this.adb.getApiLevel();\n\n if (apiLevel < 21) {\n this.log.errorAndThrow('UIAutomator2 is only supported since Android 5.0 (Lollipop). ' +\n 'You could still use other supported backends in order to automate older Android versions.');\n }\n\n if (apiLevel >= 28) { // Android P\n this.log.info('Relaxing hidden api policy');\n await this.adb.setHiddenApiPolicy('1', !!this.opts.ignoreHiddenApiPolicyError);\n }\n\n // check if we have to enable/disable gps before running the application\n if (util.hasValue(this.opts.gpsEnabled)) {\n if (this.isEmulator()) {\n this.log.info(`Trying to ${this.opts.gpsEnabled ? 'enable' : 'disable'} gps location provider`);\n await this.adb.toggleGPSLocationProvider(this.opts.gpsEnabled);\n } else {\n this.log.warn(`Sorry! 'gpsEnabled' capability is only available for emulators`);\n }\n }\n\n // get appPackage et al from manifest if necessary\n const appInfo = await helpers.getLaunchInfo(this.adb, this.opts);\n // and get it onto our 'opts' object so we use it from now on\n Object.assign(this.opts, appInfo || {});\n\n // set actual device name, udid, platform version, screen size, screen density, model and manufacturer details\n this.caps.deviceName = this.adb.curDeviceId;\n this.caps.deviceUDID = this.opts.udid;\n\n // start an avd, set the language/locale, pick an emulator, etc...\n // TODO with multiple devices we'll need to parameterize this\n await helpers.initDevice(this.adb, this.opts);\n\n // Prepare the device by forwarding the UiAutomator2 port\n // This call mutates this.opts.systemPort if it is not set explicitly\n await this.allocateSystemPort();\n\n // Prepare the device by forwarding the UiAutomator2 MJPEG server port (if\n // applicable)\n await this.allocateMjpegServerPort();\n\n // set up the modified UiAutomator2 server etc\n await this.initUiAutomator2Server();\n\n // Should be after installing io.appium.settings in helpers.initDevice\n if (this.opts.disableWindowAnimation && (await this.adb.getApiLevel() < 26)) { // API level 26 is Android 8.0.\n // Granting android.permission.SET_ANIMATION_SCALE is necessary to handle animations under API level 26\n // Read https://github.com/appium/appium/pull/11640#issuecomment-438260477\n // `--no-window-animation` works over Android 8 to disable all of animations\n if (await this.adb.isAnimationOn()) {\n this.log.info('Disabling animation via io.appium.settings');\n await this.adb.setAnimationState(false);\n this._wasWindowAnimationDisabled = true;\n } else {\n this.log.info('Window animation is already disabled');\n }\n }\n\n // set up app under test\n // prepare our actual AUT, get it on the device, etc...\n await this.initAUT();\n\n // Adding AUT package name in the capabilities if package name not exist in caps\n if (!this.caps.appPackage && appInfo) {\n this.caps.appPackage = appInfo.appPackage;\n }\n\n // launch UiAutomator2 and wait till its online and we have a session\n await this.uiautomator2.startSession(this.caps);\n\n await this.addDeviceInfoToCaps();\n\n // Unlock the device after the session is started.\n if (!this.opts.skipUnlock) {\n // unlock the device to prepare it for testing\n await helpers.unlock(this, this.adb, this.caps);\n } else {\n this.log.debug(`'skipUnlock' capability set, so skipping device unlock`);\n }\n\n if (this.isChromeSession) { // start a chromedriver session\n await this.startChromeSession(this);\n } else if (this.opts.autoLaunch && this.opts.appPackage) {\n await this.ensureAppStarts();\n }\n\n // if the initial orientation is requested, set it\n if (util.hasValue(this.opts.orientation)) {\n this.log.debug(`Setting initial orientation to '${this.opts.orientation}'`);\n await this.setOrientation(this.opts.orientation);\n }\n\n // if we want to immediately get into a webview, set our context\n // appropriately\n if (this.opts.autoWebview) {\n const viewName = this.defaultWebviewName();\n const timeout = this.opts.autoWebviewTimeout || 2000;\n this.log.info(`Setting auto webview to context '${viewName}' with timeout ${timeout}ms`);\n await retryInterval(timeout / 500, 500, this.setContext.bind(this), viewName);\n }\n\n // now that everything has started successfully, turn on proxying so all\n // subsequent session requests go straight to/from uiautomator2\n this.jwpProxyActive = true;\n }\n\n async addDeviceInfoToCaps () {\n const {\n apiVersion,\n platformVersion,\n manufacturer,\n model,\n realDisplaySize,\n displayDensity,\n } = await this.mobileGetDeviceInfo();\n this.caps.deviceApiLevel = parseInt(apiVersion, 10);\n this.caps.platformVersion = platformVersion;\n this.caps.deviceScreenSize = realDisplaySize;\n this.caps.deviceScreenDensity = displayDensity;\n this.caps.deviceModel = model;\n this.caps.deviceManufacturer = manufacturer;\n }\n\n async initUiAutomator2Server () {\n // broken out for readability\n const uiautomator2Opts = {\n host: this.opts.remoteAdbHost || this.opts.host || LOCALHOST_IP4,\n systemPort: this.opts.systemPort,\n devicePort: DEVICE_PORT,\n adb: this.adb,\n apk: this.opts.app,\n tmpDir: this.opts.tmpDir,\n appPackage: this.opts.appPackage,\n appActivity: this.opts.appActivity,\n disableWindowAnimation: !!this.opts.disableWindowAnimation,\n disableSuppressAccessibilityService: this.opts.disableSuppressAccessibilityService,\n readTimeout: this.opts.uiautomator2ServerReadTimeout,\n };\n // now that we have package and activity, we can create an instance of\n // uiautomator2 with the appropriate options\n this.uiautomator2 = new UiAutomator2Server(this.log, uiautomator2Opts);\n this.proxyReqRes = this.uiautomator2.proxyReqRes.bind(this.uiautomator2);\n this.proxyCommand = this.uiautomator2.proxyCommand.bind(this.uiautomator2);\n\n if (this.opts.skipServerInstallation) {\n this.log.info(`'skipServerInstallation' is set. Skipping UIAutomator2 server installation.`);\n } else {\n await this.uiautomator2.installServerApk(this.opts.uiautomator2ServerInstallTimeout);\n try {\n await this.adb.addToDeviceIdleWhitelist(\n SETTINGS_HELPER_PKG_ID, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID,\n );\n } catch (e) {\n this.log.warn(`Cannot add server packages to the Doze whitelist. Original error: ` +\n (e.stderr || e.message));\n }\n }\n }\n\n async initAUT () {\n // Uninstall any uninstallOtherPackages which were specified in caps\n if (this.opts.uninstallOtherPackages) {\n await helpers.uninstallOtherPackages(\n this.adb,\n helpers.parseArray(this.opts.uninstallOtherPackages),\n [SETTINGS_HELPER_PKG_ID, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID]\n );\n }\n\n // Install any \"otherApps\" that were specified in caps\n if (this.opts.otherApps) {\n let otherApps;\n try {\n otherApps = helpers.parseArray(this.opts.otherApps);\n } catch (e) {\n this.log.errorAndThrow(`Could not parse \"otherApps\" capability: ${e.message}`);\n }\n otherApps = await B.all(otherApps\n .map((app) => this.helpers.configureApp(app, [APK_EXTENSION, APKS_EXTENSION])));\n await helpers.installOtherApks(otherApps, this.adb, this.opts);\n }\n\n if (this.opts.app) {\n if (this.opts.noReset && !(await this.adb.isAppInstalled(this.opts.appPackage))\n || !this.opts.noReset) {\n if (!this.opts.noSign && !await this.adb.checkApkCert(this.opts.app, this.opts.appPackage, {\n requireDefaultCert: false,\n })) {\n await helpers.signApp(this.adb, this.opts.app);\n }\n if (!this.opts.skipUninstall) {\n await this.adb.uninstallApk(this.opts.appPackage);\n }\n await helpers.installApk(this.adb, this.opts);\n } else {\n this.log.debug('noReset has been requested and the app is already installed. Doing nothing');\n }\n } else {\n if (this.opts.fullReset) {\n this.log.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');\n }\n this.log.debug('No app capability. Assuming it is already on the device');\n if (this.opts.fastReset && this.opts.appPackage) {\n await helpers.resetApp(this.adb, this.opts);\n }\n }\n }\n\n async ensureAppStarts () {\n // make sure we have an activity and package to wait for\n const appWaitPackage = this.opts.appWaitPackage || this.opts.appPackage;\n const appWaitActivity = this.opts.appWaitActivity || this.opts.appActivity;\n\n this.log.info(`Starting '${this.opts.appPackage}/${this.opts.appActivity} ` +\n `and waiting for '${appWaitPackage}/${appWaitActivity}'`);\n\n if (this.caps.androidCoverage) {\n this.log.info(`androidCoverage is configured. ` +\n ` Starting instrumentation of '${this.caps.androidCoverage}'...`);\n await this.adb.androidCoverage(this.caps.androidCoverage, appWaitPackage, appWaitActivity);\n return;\n }\n if (this.opts.noReset && !this.opts.forceAppLaunch\n && await this.adb.processExists(this.opts.appPackage)) {\n this.log.info(`'${this.opts.appPackage}' is already running and noReset is enabled. ` +\n `Set forceAppLaunch capability to true if the app must be forcefully restarted on session startup.`);\n return;\n }\n await this.adb.startApp({\n pkg: this.opts.appPackage,\n activity: this.opts.appActivity,\n action: this.opts.intentAction || 'android.intent.action.MAIN',\n category: this.opts.intentCategory || 'android.intent.category.LAUNCHER',\n flags: this.opts.intentFlags || '0x10200000', // FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\n waitPkg: this.opts.appWaitPackage,\n waitActivity: this.opts.appWaitActivity,\n waitForLaunch: this.opts.appWaitForLaunch,\n waitDuration: this.opts.appWaitDuration,\n optionalIntentArguments: this.opts.optionalIntentArguments,\n stopApp: this.opts.forceAppLaunch || !this.opts.dontStopAppOnReset,\n retry: true,\n user: this.opts.userProfile,\n });\n }\n\n async deleteSession () {\n this.log.debug('Deleting UiAutomator2 session');\n\n const screenRecordingStopTasks = [async () => {\n if (!_.isEmpty(this._screenRecordingProperties)) {\n await this.stopRecordingScreen();\n }\n }, async () => {\n if (await this.mobileIsMediaProjectionRecordingRunning()) {\n await this.mobileStopMediaProjectionRecording();\n }\n }, async () => {\n if (!_.isEmpty(this._screenStreamingProps)) {\n await this.mobileStopScreenStreaming();\n }\n }];\n\n await androidHelpers.removeAllSessionWebSocketHandlers(this.server, this.sessionId);\n\n if (this.uiautomator2) {\n try {\n await this.stopChromedriverProxies();\n } catch (err) {\n this.log.warn(`Unable to stop ChromeDriver proxies: ${err.message}`);\n }\n if (this.jwpProxyActive) {\n try {\n await this.uiautomator2.deleteSession();\n } catch (err) {\n this.log.warn(`Unable to proxy deleteSession to UiAutomator2: ${err.message}`);\n }\n }\n this.uiautomator2 = null;\n }\n this.jwpProxyActive = false;\n\n if (this.adb) {\n await B.all(screenRecordingStopTasks.map((task) => {\n (async () => {\n try {\n await task();\n } catch (ign) {}\n })();\n }));\n\n if (this.caps.androidCoverage) {\n this.log.info('Shutting down the adb process of instrumentation...');\n await this.adb.endAndroidCoverage();\n // Use this broadcast intent to notify it's time to dump coverage to file\n if (this.caps.androidCoverageEndIntent) {\n this.log.info(`Sending intent broadcast '${this.caps.androidCoverageEndIntent}' at the end of instrumenting.`);\n await this.adb.broadcast(this.caps.androidCoverageEndIntent);\n } else {\n this.log.warn('No androidCoverageEndIntent is configured in caps. Possibly you cannot get coverage file.');\n }\n }\n if (this.opts.appPackage) {\n if (!this.isChromeSession && ((!this.opts.dontStopAppOnReset && !this.opts.noReset)\n || (this.opts.noReset && this.opts.shouldTerminateApp))) {\n try {\n await this.adb.forceStop(this.opts.appPackage);\n } catch (err) {\n this.log.warn(`Unable to force stop app: ${err.message}`);\n }\n }\n if (this.opts.fullReset && !this.opts.skipUninstall) {\n this.log.debug(`Capability 'fullReset' set to 'true', Uninstalling '${this.opts.appPackage}'`);\n try {\n await this.adb.uninstallApk(this.opts.appPackage);\n } catch (err) {\n this.log.warn(`Unable to uninstall app: ${err.message}`);\n }\n }\n }\n // This value can be true if test target device is <= 26\n if (this._wasWindowAnimationDisabled) {\n this.log.info('Restoring window animation state');\n await this.adb.setAnimationState(true);\n }\n await this.adb.stopLogcat();\n try {\n await this.releaseSystemPort();\n } catch (error) {\n this.log.warn(`Unable to remove system port forward: ${error.message}`);\n // Ignore, this block will also be called when we fall in catch block\n // and before even port forward.\n }\n try {\n await this.releaseMjpegServerPort();\n } catch (error) {\n this.log.warn(`Unable to remove MJPEG server port forward: ${error.message}`);\n // Ignore, this block will also be called when we fall in catch block\n // and before even port forward.\n }\n\n if (await this.adb.getApiLevel() >= 28) { // Android P\n this.log.info('Restoring hidden api policy to the device default configuration');\n await this.adb.setDefaultHiddenApiPolicy(!!this.opts.ignoreHiddenApiPolicyError);\n }\n\n if (this.opts.reboot) {\n let avdName = this.opts.avd.replace('@', '');\n this.log.debug(`Closing emulator '${avdName}'`);\n try {\n await this.adb.killEmulator(avdName);\n } catch (err) {\n this.log.warn(`Unable to close emulator: ${err.message}`);\n }\n }\n }\n if (this.mjpegStream) {\n this.log.info('Closing MJPEG stream');\n this.mjpegStream.stop();\n }\n await super.deleteSession();\n }\n\n async checkAppPresent () {\n this.log.debug('Checking whether app is actually present');\n if (!(await fs.exists(this.opts.app))) {\n this.log.errorAndThrow(`Could not find app apk at '${this.opts.app}'`);\n }\n }\n\n async onSettingsUpdate () {\n // intentionally do nothing here, since commands.updateSettings proxies\n // settings to the uiauto2 server already\n }\n\n // Need to override android-driver's version of this since we don't actually\n // have a bootstrap; instead we just restart adb and re-forward the UiAutomator2\n // port\n async wrapBootstrapDisconnect (wrapped) {\n await wrapped();\n await this.adb.restart();\n await this.allocateSystemPort();\n await this.allocateMjpegServerPort();\n }\n\n proxyActive (sessionId) {\n super.proxyActive(sessionId);\n\n // we always have an active proxy to the UiAutomator2 server\n return true;\n }\n\n canProxy (sessionId) {\n super.canProxy(sessionId);\n\n // we can always proxy to the uiautomator2 server\n return true;\n }\n\n getProxyAvoidList (sessionId) {\n super.getProxyAvoidList(sessionId);\n // we are maintaining two sets of NO_PROXY lists, one for chromedriver(CHROME_NO_PROXY)\n // and one for uiautomator2(NO_PROXY), based on current context will return related NO_PROXY list\n if (util.hasValue(this.chromedriver)) {\n // if the current context is webview(chromedriver), then return CHROME_NO_PROXY list\n this.jwpProxyAvoid = CHROME_NO_PROXY;\n } else {\n this.jwpProxyAvoid = NO_PROXY;\n }\n if (this.opts.nativeWebScreenshot) {\n this.jwpProxyAvoid = [...this.jwpProxyAvoid, ['GET', new RegExp('^/session/[^/]+/screenshot')]];\n }\n\n return this.jwpProxyAvoid;\n }\n\n get isChromeSession () {\n return helpers.isChromeBrowser(this.opts.browserName);\n }\n}\n\n// first add the android-driver commands which we will fall back to\nfor (let [cmd, fn] of _.toPairs(androidCommands)) {\n AndroidUiautomator2Driver.prototype[cmd] = fn;\n}\n\n// then overwrite with any uiautomator2-specific commands\nfor (let [cmd, fn] of _.toPairs(commands)) {\n AndroidUiautomator2Driver.prototype[cmd] = fn;\n}\n\nexport { AndroidUiautomator2Driver };\nexport default AndroidUiautomator2Driver;\n"],"mappings":"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"}
1
+ {"version":3,"file":"driver.js","names":["_lodash","_interopRequireDefault","require","_driver","_uiautomator","_methodMap","_support","_asyncbox","_bluebird","_index","_appiumAdb","_helpers","_appiumAndroidDriver","_desiredCaps","_portscanner","_os","_path","_extensions","helpers","Object","assign","uiautomator2Helpers","androidHelpers","DEVICE_PORT_RANGE","DEVICE_PORT_ALLOCATION_GUARD","util","getLockFileGuard","path","resolve","os","tmpdir","timeout","tryRecovery","DEVICE_PORT","MJPEG_SERVER_DEVICE_PORT","LOCALHOST_IP4","NO_PROXY","RegExp","CHROME_NO_PROXY","MEMOIZED_FUNCTIONS","AndroidUiautomator2Driver","BaseDriver","newMethodMap","constructor","opts","shouldValidateCaps","shell","locatorStrategies","desiredCapConstraints","uiautomator2","jwpProxyActive","jwpProxyAvoid","apkStrings","settings","DeviceSettings","ignoreUnimportantViews","allowInvisibleElements","onSettingsUpdate","bind","chromedriver","sessionChromedrivers","fn","_","memoize","validateDesiredCaps","caps","createSession","args","sessionId","serverDetails","platform","webStorageEnabled","takesScreenshot","javascriptEnabled","databaseEnabled","networkConnectionEnabled","locationContextEnabled","warnings","desired","curContext","defaultContextName","defaultOpts","fullReset","autoLaunch","adbPort","DEFAULT_ADB_PORT","androidInstallTimeout","defaults","isChromeSession","log","info","pkg","activity","getChromePkg","browserName","appPackage","appActivity","reboot","setAvdFromCapabilities","app","configureApp","APK_EXTENSION","APKS_EXTENSION","checkAppPresent","startUiAutomator2Session","fillDeviceDetails","mjpegScreenshotUrl","mjpegStream","mjpeg","MJpegStream","start","e","deleteSession","pixelRatio","getDevicePixelRatio","statBarHeight","getStatusBarHeight","viewportRect","getViewPortRect","driverData","getSession","sessionData","debug","uia2Data","jwproxy","command","isEmulator","adb","avd","deviceName","errorAndThrow","platformVersion","avdDevice","replace","allocateSystemPort","forwardPort","localPort","checkPortStatus","systemPort","_hasSystemPortInCaps","startPort","endPort","findAPortNotInUse","releaseSystemPort","removePortForward","allocateMjpegServerPort","mjpegServerPort","releaseMjpegServerPort","udid","emPort","getDeviceInfoFromCaps","createADB","apiLevel","getApiLevel","setHiddenApiPolicy","ignoreHiddenApiPolicyError","hasValue","gpsEnabled","toggleGPSLocationProvider","warn","appInfo","getLaunchInfo","curDeviceId","deviceUDID","initDevice","initUiAutomator2Server","disableWindowAnimation","isAnimationOn","setAnimationState","_wasWindowAnimationDisabled","initAUT","startSession","addDeviceInfoToCaps","skipUnlock","unlock","startChromeSession","ensureAppStarts","orientation","setOrientation","autoWebview","viewName","defaultWebviewName","autoWebviewTimeout","retryInterval","setContext","apiVersion","manufacturer","model","realDisplaySize","displayDensity","mobileGetDeviceInfo","deviceApiLevel","parseInt","deviceScreenSize","deviceScreenDensity","deviceModel","deviceManufacturer","uiautomator2Opts","host","remoteAdbHost","devicePort","apk","tmpDir","disableSuppressAccessibilityService","readTimeout","uiautomator2ServerReadTimeout","UiAutomator2Server","proxyReqRes","proxyCommand","skipServerInstallation","installServerApk","uiautomator2ServerInstallTimeout","addToDeviceIdleWhitelist","SETTINGS_HELPER_PKG_ID","SERVER_PACKAGE_ID","SERVER_TEST_PACKAGE_ID","stderr","message","uninstallOtherPackages","parseArray","otherApps","B","all","map","installOtherApks","noReset","isAppInstalled","noSign","checkApkCert","requireDefaultCert","signApp","skipUninstall","uninstallApk","installApk","fastReset","resetApp","appWaitPackage","appWaitActivity","androidCoverage","forceAppLaunch","processExists","startApp","action","intentAction","category","intentCategory","flags","intentFlags","waitPkg","waitActivity","waitForLaunch","appWaitForLaunch","waitDuration","appWaitDuration","optionalIntentArguments","stopApp","dontStopAppOnReset","retry","user","userProfile","screenRecordingStopTasks","isEmpty","_screenRecordingProperties","stopRecordingScreen","mobileIsMediaProjectionRecordingRunning","mobileStopMediaProjectionRecording","_screenStreamingProps","mobileStopScreenStreaming","removeAllSessionWebSocketHandlers","server","stopChromedriverProxies","err","task","ign","endAndroidCoverage","androidCoverageEndIntent","broadcast","shouldTerminateApp","forceStop","stopLogcat","error","setDefaultHiddenApiPolicy","avdName","killEmulator","stop","fs","exists","wrapBootstrapDisconnect","wrapped","restart","proxyActive","canProxy","getProxyAvoidList","nativeWebScreenshot","isChromeBrowser","exports","cmd","toPairs","androidCommands","prototype","commands","_default","default"],"sources":["../../lib/driver.js"],"sourcesContent":["import _ from 'lodash';\nimport { BaseDriver, DeviceSettings } from 'appium/driver';\nimport {\n UiAutomator2Server, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID\n} from './uiautomator2';\nimport { newMethodMap } from './method-map';\nimport { fs, util, mjpeg } from 'appium/support';\nimport { retryInterval } from 'asyncbox';\nimport B from 'bluebird';\nimport commands from './commands/index';\nimport { DEFAULT_ADB_PORT } from 'appium-adb';\nimport uiautomator2Helpers from './helpers';\nimport { androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID, } from 'appium-android-driver';\nimport desiredCapConstraints from './desired-caps';\nimport { findAPortNotInUse, checkPortStatus } from 'portscanner';\nimport os from 'os';\nimport path from 'path';\nimport { APK_EXTENSION, APKS_EXTENSION } from './extensions';\n\n\nconst helpers = Object.assign({}, uiautomator2Helpers, androidHelpers);\n\n// The range of ports we can use on the system for communicating to the\n// UiAutomator2 HTTP server on the device\nconst DEVICE_PORT_RANGE = [8200, 8299];\n\n// The guard is needed to avoid dynamic system port allocation conflicts for\n// parallel driver sessions\nconst DEVICE_PORT_ALLOCATION_GUARD = util.getLockFileGuard(\n path.resolve(os.tmpdir(), 'uia2_device_port_guard'),\n {timeout: 25, tryRecovery: true}\n);\n\n// This is the port that UiAutomator2 listens to on the device. We will forward\n// one of the ports above on the system to this port on the device.\nconst DEVICE_PORT = 6790;\n// This is the port that the UiAutomator2 MJPEG server listens to on the device.\n// We will forward one of the ports above on the system to this port on the\n// device.\nconst MJPEG_SERVER_DEVICE_PORT = 7810;\n\nconst LOCALHOST_IP4 = '127.0.0.1';\n\n// NO_PROXY contains the paths that we never want to proxy to UiAutomator2 server.\n// TODO: Add the list of paths that we never want to proxy to UiAutomator2 server.\n// TODO: Need to segregate the paths better way using regular expressions wherever applicable.\n// (Not segregating right away because more paths to be added in the NO_PROXY list)\nconst NO_PROXY = [\n ['GET', new RegExp('^/session/(?!.*/)')],\n ['GET', new RegExp('^/session/[^/]+/alert_[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/alert/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/appium/[^/]+/current_activity')],\n ['GET', new RegExp('^/session/[^/]+/appium/[^/]+/current_package')],\n ['GET', new RegExp('^/session/[^/]+/appium/app/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/appium/settings')],\n ['GET', new RegExp('^/session/[^/]+/context')],\n ['GET', new RegExp('^/session/[^/]+/contexts')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/attribute')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/displayed')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/enabled')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/location_in_view')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/name')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/screenshot')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/selected')],\n ['GET', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/location')],\n ['GET', new RegExp('^/session/[^/]+/network_connection')],\n ['GET', new RegExp('^/session/[^/]+/screenshot')],\n ['GET', new RegExp('^/session/[^/]+/timeouts')],\n ['GET', new RegExp('^/session/[^/]+/url')],\n ['POST', new RegExp('^/session/[^/]+/[^/]+_alert$')],\n ['POST', new RegExp('^/session/[^/]+/actions')],\n ['POST', new RegExp('^/session/[^/]+/alert/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/app/[^/]')],\n ['POST', new RegExp('^/session/[^/]+/appium/[^/]+/start_activity')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/appium/compare_images')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/(?!set_clipboard)[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/appium/element/[^/]+/replace_value')],\n ['POST', new RegExp('^/session/[^/]+/appium/element/[^/]+/value')],\n ['POST', new RegExp('^/session/[^/]+/appium/getPerformanceData')],\n ['POST', new RegExp('^/session/[^/]+/appium/performanceData/types')],\n ['POST', new RegExp('^/session/[^/]+/appium/settings')],\n ['POST', new RegExp('^/session/[^/]+/appium/execute_driver')],\n ['POST', new RegExp('^/session/[^/]+/appium/start_recording_screen')],\n ['POST', new RegExp('^/session/[^/]+/appium/stop_recording_screen')],\n ['POST', new RegExp('^/session/[^/]+/appium/.*event')],\n ['POST', new RegExp('^/session/[^/]+/context')],\n ['POST', new RegExp('^/session/[^/]+/element')],\n ['POST', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/keys')],\n ['POST', new RegExp('^/session/[^/]+/location')],\n ['POST', new RegExp('^/session/[^/]+/network_connection')],\n ['POST', new RegExp('^/session/[^/]+/timeouts')],\n ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')],\n ['POST', new RegExp('^/session/[^/]+/touch/perform')],\n ['POST', new RegExp('^/session/[^/]+/url')],\n\n // MJSONWP commands\n ['GET', new RegExp('^/session/[^/]+/log/types')],\n ['POST', new RegExp('^/session/[^/]+/execute')],\n ['POST', new RegExp('^/session/[^/]+/execute_async')],\n ['POST', new RegExp('^/session/[^/]+/log')],\n // W3C commands\n // For Selenium v4 (W3C does not have this route)\n ['GET', new RegExp('^/session/[^/]+/se/log/types')],\n ['GET', new RegExp('^/session/[^/]+/window/rect')],\n ['POST', new RegExp('^/session/[^/]+/execute/async')],\n ['POST', new RegExp('^/session/[^/]+/execute/sync')],\n // For Selenium v4 (W3C does not have this route)\n ['POST', new RegExp('^/session/[^/]+/se/log')],\n];\n\n// This is a set of methods and paths that we never want to proxy to Chromedriver.\nconst CHROME_NO_PROXY = [\n ['GET', new RegExp('^/session/[^/]+/appium')],\n ['GET', new RegExp('^/session/[^/]+/context')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/rect')],\n ['GET', new RegExp('^/session/[^/]+/orientation')],\n ['POST', new RegExp('^/session/[^/]+/appium')],\n ['POST', new RegExp('^/session/[^/]+/context')],\n ['POST', new RegExp('^/session/[^/]+/orientation')],\n ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')],\n ['POST', new RegExp('^/session/[^/]+/touch/perform')],\n\n // this is needed to make the mobile: commands working in web context\n ['POST', new RegExp('^/session/[^/]+/execute$')],\n ['POST', new RegExp('^/session/[^/]+/execute/sync')],\n\n // MJSONWP commands\n ['GET', new RegExp('^/session/[^/]+/log/types$')],\n ['POST', new RegExp('^/session/[^/]+/log$')],\n // W3C commands\n // For Selenium v4 (W3C does not have this route)\n ['GET', new RegExp('^/session/[^/]+/se/log/types$')],\n // For Selenium v4 (W3C does not have this route)\n ['POST', new RegExp('^/session/[^/]+/se/log$')],\n];\n\nconst MEMOIZED_FUNCTIONS = [\n 'getStatusBarHeight',\n 'getDevicePixelRatio',\n];\n\nclass AndroidUiautomator2Driver extends BaseDriver {\n\n static newMethodMap = newMethodMap;\n\n constructor (opts = {}, shouldValidateCaps = true) {\n // `shell` overwrites adb.shell, so remove\n delete opts.shell;\n\n super(opts, shouldValidateCaps);\n this.locatorStrategies = [\n 'xpath',\n 'id',\n 'class name',\n 'accessibility id',\n 'css selector',\n '-android uiautomator'\n ];\n this.desiredCapConstraints = desiredCapConstraints;\n this.uiautomator2 = null;\n this.jwpProxyActive = false;\n this.jwpProxyAvoid = NO_PROXY;\n this.apkStrings = {}; // map of language -> strings obj\n\n this.settings = new DeviceSettings({ignoreUnimportantViews: false, allowInvisibleElements: false},\n this.onSettingsUpdate.bind(this));\n // handle webview mechanics from AndroidDriver\n this.chromedriver = null;\n this.sessionChromedrivers = {};\n\n // memoize functions here, so that they are done on a per-instance basis\n for (const fn of MEMOIZED_FUNCTIONS) {\n this[fn] = _.memoize(this[fn]);\n }\n }\n\n validateDesiredCaps (caps) {\n return super.validateDesiredCaps(caps) && androidHelpers.validateDesiredCaps(caps);\n }\n\n async createSession (...args) {\n try {\n // TODO handle otherSessionData for multiple sessions\n let [sessionId, caps] = await super.createSession(...args);\n\n let serverDetails = {\n platform: 'LINUX',\n webStorageEnabled: false,\n takesScreenshot: true,\n javascriptEnabled: true,\n databaseEnabled: false,\n networkConnectionEnabled: true,\n locationContextEnabled: false,\n warnings: {},\n desired: this.caps,\n };\n\n this.caps = Object.assign(serverDetails, this.caps);\n\n this.curContext = this.defaultContextName();\n\n let defaultOpts = {\n fullReset: false,\n autoLaunch: true,\n adbPort: DEFAULT_ADB_PORT,\n androidInstallTimeout: 90000\n };\n _.defaults(this.opts, defaultOpts);\n\n if (this.isChromeSession) {\n this.log.info(\"We're going to run a Chrome-based session\");\n let {pkg, activity} = helpers.getChromePkg(this.opts.browserName);\n this.opts.appPackage = this.caps.appPackage = pkg;\n this.opts.appActivity = this.caps.appActivity = activity;\n this.log.info(`Chrome-type package and activity are ${pkg} and ${activity}`);\n }\n\n if (this.opts.reboot) {\n this.setAvdFromCapabilities(caps);\n }\n\n if (this.opts.app) {\n // find and copy, or download and unzip an app url or path\n this.opts.app = await this.helpers.configureApp(this.opts.app, [APK_EXTENSION, APKS_EXTENSION]);\n await this.checkAppPresent();\n } else if (this.opts.appPackage) {\n // the app isn't an actual app file but rather something we want to\n // assume is on the device and just launch via the appPackage\n this.log.info(`Starting '${this.opts.appPackage}' directly on the device`);\n } else {\n this.log.info(`Neither 'app' nor 'appPackage' was set. Starting UiAutomator2 ` +\n 'without the target application');\n }\n this.opts.adbPort = this.opts.adbPort || DEFAULT_ADB_PORT;\n\n await this.startUiAutomator2Session();\n await this.fillDeviceDetails();\n if (this.opts.mjpegScreenshotUrl) {\n this.log.info(`Starting MJPEG stream reading URL: '${this.opts.mjpegScreenshotUrl}'`);\n this.mjpegStream = new mjpeg.MJpegStream(this.opts.mjpegScreenshotUrl);\n await this.mjpegStream.start();\n }\n return [sessionId, this.caps];\n } catch (e) {\n await this.deleteSession();\n throw e;\n }\n }\n\n async fillDeviceDetails () {\n this.caps.pixelRatio = await this.getDevicePixelRatio();\n this.caps.statBarHeight = await this.getStatusBarHeight();\n this.caps.viewportRect = await this.getViewPortRect();\n }\n\n get driverData () {\n // TODO fill out resource info here\n return {};\n }\n\n async getSession () {\n let sessionData = await super.getSession();\n this.log.debug('Getting session details from server to mix in');\n let uia2Data = await this.uiautomator2.jwproxy.command('/', 'GET', {});\n return Object.assign({}, sessionData, uia2Data);\n }\n\n isEmulator () {\n return helpers.isEmulator(this.adb, this.opts);\n }\n\n setAvdFromCapabilities (caps) {\n if (this.opts.avd) {\n this.log.info('avd name defined, ignoring device name and platform version');\n } else {\n if (!caps.deviceName) {\n this.log.errorAndThrow('avd or deviceName should be specified when reboot option is enables');\n }\n if (!caps.platformVersion) {\n this.log.errorAndThrow('avd or platformVersion should be specified when reboot option is enabled');\n }\n let avdDevice = caps.deviceName.replace(/[^a-zA-Z0-9_.]/g, '-');\n this.opts.avd = `${avdDevice}__${caps.platformVersion}`;\n }\n }\n\n async allocateSystemPort () {\n const forwardPort = async (localPort) => {\n this.log.debug(`Forwarding UiAutomator2 Server port ${DEVICE_PORT} to local port ${localPort}`);\n if ((await checkPortStatus(localPort, LOCALHOST_IP4)) === 'open') {\n this.log.errorAndThrow(`UiAutomator2 Server cannot start because the local port #${localPort} is busy. ` +\n `Make sure the port you provide via 'systemPort' capability is not occupied. ` +\n `This situation might often be a result of an inaccurate sessions management, e.g. ` +\n `old automation sessions on the same device must always be closed before starting new ones.`);\n }\n await this.adb.forwardPort(localPort, DEVICE_PORT);\n };\n\n if (this.opts.systemPort) {\n this._hasSystemPortInCaps = true;\n return await forwardPort(this.opts.systemPort);\n }\n\n await DEVICE_PORT_ALLOCATION_GUARD(async () => {\n const [startPort, endPort] = DEVICE_PORT_RANGE;\n try {\n this.opts.systemPort = await findAPortNotInUse(startPort, endPort);\n } catch (e) {\n this.log.errorAndThrow(\n `Cannot find any free port in range ${startPort}..${endPort}}. ` +\n `Please set the available port number by providing the systemPort capability or ` +\n `double check the processes that are locking ports within this range and terminate ` +\n `these which are not needed anymore`);\n }\n await forwardPort(this.opts.systemPort);\n });\n }\n\n async releaseSystemPort () {\n if (!this.opts.systemPort || !this.adb) {\n return;\n }\n\n if (this._hasSystemPortInCaps) {\n await this.adb.removePortForward(this.opts.systemPort);\n } else {\n await DEVICE_PORT_ALLOCATION_GUARD(async () => await this.adb.removePortForward(this.opts.systemPort));\n }\n }\n\n async allocateMjpegServerPort () {\n if (this.opts.mjpegServerPort) {\n this.log.debug(`MJPEG broadcasting requested, forwarding MJPEG server port ${MJPEG_SERVER_DEVICE_PORT} ` +\n `to local port ${this.opts.mjpegServerPort}`);\n await this.adb.forwardPort(this.opts.mjpegServerPort, MJPEG_SERVER_DEVICE_PORT);\n }\n }\n\n async releaseMjpegServerPort () {\n if (this.opts.mjpegServerPort) {\n await this.adb.removePortForward(this.opts.mjpegServerPort);\n }\n }\n\n async startUiAutomator2Session () {\n // get device udid for this session\n let {udid, emPort} = await helpers.getDeviceInfoFromCaps(this.opts);\n this.opts.udid = udid;\n this.opts.emPort = emPort;\n\n // now that we know our java version and device info, we can create our\n // ADB instance\n this.adb = await androidHelpers.createADB(this.opts);\n\n const apiLevel = await this.adb.getApiLevel();\n\n if (apiLevel < 21) {\n this.log.errorAndThrow('UIAutomator2 is only supported since Android 5.0 (Lollipop). ' +\n 'You could still use other supported backends in order to automate older Android versions.');\n }\n\n if (apiLevel >= 28) { // Android P\n this.log.info('Relaxing hidden api policy');\n await this.adb.setHiddenApiPolicy('1', !!this.opts.ignoreHiddenApiPolicyError);\n }\n\n // check if we have to enable/disable gps before running the application\n if (util.hasValue(this.opts.gpsEnabled)) {\n if (this.isEmulator()) {\n this.log.info(`Trying to ${this.opts.gpsEnabled ? 'enable' : 'disable'} gps location provider`);\n await this.adb.toggleGPSLocationProvider(this.opts.gpsEnabled);\n } else {\n this.log.warn(`Sorry! 'gpsEnabled' capability is only available for emulators`);\n }\n }\n\n // get appPackage et al from manifest if necessary\n const appInfo = await helpers.getLaunchInfo(this.adb, this.opts);\n // and get it onto our 'opts' object so we use it from now on\n Object.assign(this.opts, appInfo || {});\n\n // set actual device name, udid, platform version, screen size, screen density, model and manufacturer details\n this.caps.deviceName = this.adb.curDeviceId;\n this.caps.deviceUDID = this.opts.udid;\n\n // start an avd, set the language/locale, pick an emulator, etc...\n // TODO with multiple devices we'll need to parameterize this\n await helpers.initDevice(this.adb, this.opts);\n\n // Prepare the device by forwarding the UiAutomator2 port\n // This call mutates this.opts.systemPort if it is not set explicitly\n await this.allocateSystemPort();\n\n // Prepare the device by forwarding the UiAutomator2 MJPEG server port (if\n // applicable)\n await this.allocateMjpegServerPort();\n\n // set up the modified UiAutomator2 server etc\n await this.initUiAutomator2Server();\n\n // Should be after installing io.appium.settings in helpers.initDevice\n if (this.opts.disableWindowAnimation && (await this.adb.getApiLevel() < 26)) { // API level 26 is Android 8.0.\n // Granting android.permission.SET_ANIMATION_SCALE is necessary to handle animations under API level 26\n // Read https://github.com/appium/appium/pull/11640#issuecomment-438260477\n // `--no-window-animation` works over Android 8 to disable all of animations\n if (await this.adb.isAnimationOn()) {\n this.log.info('Disabling animation via io.appium.settings');\n await this.adb.setAnimationState(false);\n this._wasWindowAnimationDisabled = true;\n } else {\n this.log.info('Window animation is already disabled');\n }\n }\n\n // set up app under test\n // prepare our actual AUT, get it on the device, etc...\n await this.initAUT();\n\n // Adding AUT package name in the capabilities if package name not exist in caps\n if (!this.caps.appPackage && appInfo) {\n this.caps.appPackage = appInfo.appPackage;\n }\n\n // launch UiAutomator2 and wait till its online and we have a session\n await this.uiautomator2.startSession(this.caps);\n\n await this.addDeviceInfoToCaps();\n\n // Unlock the device after the session is started.\n if (!this.opts.skipUnlock) {\n // unlock the device to prepare it for testing\n await helpers.unlock(this, this.adb, this.caps);\n } else {\n this.log.debug(`'skipUnlock' capability set, so skipping device unlock`);\n }\n\n if (this.isChromeSession) { // start a chromedriver session\n await this.startChromeSession(this);\n } else if (this.opts.autoLaunch && this.opts.appPackage) {\n await this.ensureAppStarts();\n }\n\n // if the initial orientation is requested, set it\n if (util.hasValue(this.opts.orientation)) {\n this.log.debug(`Setting initial orientation to '${this.opts.orientation}'`);\n await this.setOrientation(this.opts.orientation);\n }\n\n // if we want to immediately get into a webview, set our context\n // appropriately\n if (this.opts.autoWebview) {\n const viewName = this.defaultWebviewName();\n const timeout = this.opts.autoWebviewTimeout || 2000;\n this.log.info(`Setting auto webview to context '${viewName}' with timeout ${timeout}ms`);\n await retryInterval(timeout / 500, 500, this.setContext.bind(this), viewName);\n }\n\n // now that everything has started successfully, turn on proxying so all\n // subsequent session requests go straight to/from uiautomator2\n this.jwpProxyActive = true;\n }\n\n async addDeviceInfoToCaps () {\n const {\n apiVersion,\n platformVersion,\n manufacturer,\n model,\n realDisplaySize,\n displayDensity,\n } = await this.mobileGetDeviceInfo();\n this.caps.deviceApiLevel = parseInt(apiVersion, 10);\n this.caps.platformVersion = platformVersion;\n this.caps.deviceScreenSize = realDisplaySize;\n this.caps.deviceScreenDensity = displayDensity;\n this.caps.deviceModel = model;\n this.caps.deviceManufacturer = manufacturer;\n }\n\n async initUiAutomator2Server () {\n // broken out for readability\n const uiautomator2Opts = {\n host: this.opts.remoteAdbHost || this.opts.host || LOCALHOST_IP4,\n systemPort: this.opts.systemPort,\n devicePort: DEVICE_PORT,\n adb: this.adb,\n apk: this.opts.app,\n tmpDir: this.opts.tmpDir,\n appPackage: this.opts.appPackage,\n appActivity: this.opts.appActivity,\n disableWindowAnimation: !!this.opts.disableWindowAnimation,\n disableSuppressAccessibilityService: this.opts.disableSuppressAccessibilityService,\n readTimeout: this.opts.uiautomator2ServerReadTimeout,\n };\n // now that we have package and activity, we can create an instance of\n // uiautomator2 with the appropriate options\n this.uiautomator2 = new UiAutomator2Server(this.log, uiautomator2Opts);\n this.proxyReqRes = this.uiautomator2.proxyReqRes.bind(this.uiautomator2);\n this.proxyCommand = this.uiautomator2.proxyCommand.bind(this.uiautomator2);\n\n if (this.opts.skipServerInstallation) {\n this.log.info(`'skipServerInstallation' is set. Skipping UIAutomator2 server installation.`);\n } else {\n await this.uiautomator2.installServerApk(this.opts.uiautomator2ServerInstallTimeout);\n try {\n await this.adb.addToDeviceIdleWhitelist(\n SETTINGS_HELPER_PKG_ID, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID,\n );\n } catch (e) {\n this.log.warn(`Cannot add server packages to the Doze whitelist. Original error: ` +\n (e.stderr || e.message));\n }\n }\n }\n\n async initAUT () {\n // Uninstall any uninstallOtherPackages which were specified in caps\n if (this.opts.uninstallOtherPackages) {\n await helpers.uninstallOtherPackages(\n this.adb,\n helpers.parseArray(this.opts.uninstallOtherPackages),\n [SETTINGS_HELPER_PKG_ID, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID]\n );\n }\n\n // Install any \"otherApps\" that were specified in caps\n if (this.opts.otherApps) {\n let otherApps;\n try {\n otherApps = helpers.parseArray(this.opts.otherApps);\n } catch (e) {\n this.log.errorAndThrow(`Could not parse \"otherApps\" capability: ${e.message}`);\n }\n otherApps = await B.all(otherApps\n .map((app) => this.helpers.configureApp(app, [APK_EXTENSION, APKS_EXTENSION])));\n await helpers.installOtherApks(otherApps, this.adb, this.opts);\n }\n\n if (this.opts.app) {\n if (this.opts.noReset && !(await this.adb.isAppInstalled(this.opts.appPackage))\n || !this.opts.noReset) {\n if (!this.opts.noSign && !await this.adb.checkApkCert(this.opts.app, this.opts.appPackage, {\n requireDefaultCert: false,\n })) {\n await helpers.signApp(this.adb, this.opts.app);\n }\n if (!this.opts.skipUninstall) {\n await this.adb.uninstallApk(this.opts.appPackage);\n }\n await helpers.installApk(this.adb, this.opts);\n } else {\n this.log.debug('noReset has been requested and the app is already installed. Doing nothing');\n }\n } else {\n if (this.opts.fullReset) {\n this.log.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');\n }\n this.log.debug('No app capability. Assuming it is already on the device');\n if (this.opts.fastReset && this.opts.appPackage) {\n await helpers.resetApp(this.adb, this.opts);\n }\n }\n }\n\n async ensureAppStarts () {\n // make sure we have an activity and package to wait for\n const appWaitPackage = this.opts.appWaitPackage || this.opts.appPackage;\n const appWaitActivity = this.opts.appWaitActivity || this.opts.appActivity;\n\n this.log.info(`Starting '${this.opts.appPackage}/${this.opts.appActivity} ` +\n `and waiting for '${appWaitPackage}/${appWaitActivity}'`);\n\n if (this.caps.androidCoverage) {\n this.log.info(`androidCoverage is configured. ` +\n ` Starting instrumentation of '${this.caps.androidCoverage}'...`);\n await this.adb.androidCoverage(this.caps.androidCoverage, appWaitPackage, appWaitActivity);\n return;\n }\n if (this.opts.noReset && !this.opts.forceAppLaunch\n && await this.adb.processExists(this.opts.appPackage)) {\n this.log.info(`'${this.opts.appPackage}' is already running and noReset is enabled. ` +\n `Set forceAppLaunch capability to true if the app must be forcefully restarted on session startup.`);\n return;\n }\n await this.adb.startApp({\n pkg: this.opts.appPackage,\n activity: this.opts.appActivity,\n action: this.opts.intentAction || 'android.intent.action.MAIN',\n category: this.opts.intentCategory || 'android.intent.category.LAUNCHER',\n flags: this.opts.intentFlags || '0x10200000', // FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\n waitPkg: this.opts.appWaitPackage,\n waitActivity: this.opts.appWaitActivity,\n waitForLaunch: this.opts.appWaitForLaunch,\n waitDuration: this.opts.appWaitDuration,\n optionalIntentArguments: this.opts.optionalIntentArguments,\n stopApp: this.opts.forceAppLaunch || !this.opts.dontStopAppOnReset,\n retry: true,\n user: this.opts.userProfile,\n });\n }\n\n async deleteSession () {\n this.log.debug('Deleting UiAutomator2 session');\n\n const screenRecordingStopTasks = [async () => {\n if (!_.isEmpty(this._screenRecordingProperties)) {\n await this.stopRecordingScreen();\n }\n }, async () => {\n if (await this.mobileIsMediaProjectionRecordingRunning()) {\n await this.mobileStopMediaProjectionRecording();\n }\n }, async () => {\n if (!_.isEmpty(this._screenStreamingProps)) {\n await this.mobileStopScreenStreaming();\n }\n }];\n\n await androidHelpers.removeAllSessionWebSocketHandlers(this.server, this.sessionId);\n\n if (this.uiautomator2) {\n try {\n await this.stopChromedriverProxies();\n } catch (err) {\n this.log.warn(`Unable to stop ChromeDriver proxies: ${err.message}`);\n }\n if (this.jwpProxyActive) {\n try {\n await this.uiautomator2.deleteSession();\n } catch (err) {\n this.log.warn(`Unable to proxy deleteSession to UiAutomator2: ${err.message}`);\n }\n }\n this.uiautomator2 = null;\n }\n this.jwpProxyActive = false;\n\n if (this.adb) {\n await B.all(screenRecordingStopTasks.map((task) => {\n (async () => {\n try {\n await task();\n } catch (ign) {}\n })();\n }));\n\n if (this.caps.androidCoverage) {\n this.log.info('Shutting down the adb process of instrumentation...');\n await this.adb.endAndroidCoverage();\n // Use this broadcast intent to notify it's time to dump coverage to file\n if (this.caps.androidCoverageEndIntent) {\n this.log.info(`Sending intent broadcast '${this.caps.androidCoverageEndIntent}' at the end of instrumenting.`);\n await this.adb.broadcast(this.caps.androidCoverageEndIntent);\n } else {\n this.log.warn('No androidCoverageEndIntent is configured in caps. Possibly you cannot get coverage file.');\n }\n }\n if (this.opts.appPackage) {\n if (!this.isChromeSession && ((!this.opts.dontStopAppOnReset && !this.opts.noReset)\n || (this.opts.noReset && this.opts.shouldTerminateApp))) {\n try {\n await this.adb.forceStop(this.opts.appPackage);\n } catch (err) {\n this.log.warn(`Unable to force stop app: ${err.message}`);\n }\n }\n if (this.opts.fullReset && !this.opts.skipUninstall) {\n this.log.debug(`Capability 'fullReset' set to 'true', Uninstalling '${this.opts.appPackage}'`);\n try {\n await this.adb.uninstallApk(this.opts.appPackage);\n } catch (err) {\n this.log.warn(`Unable to uninstall app: ${err.message}`);\n }\n }\n }\n // This value can be true if test target device is <= 26\n if (this._wasWindowAnimationDisabled) {\n this.log.info('Restoring window animation state');\n await this.adb.setAnimationState(true);\n }\n await this.adb.stopLogcat();\n try {\n await this.releaseSystemPort();\n } catch (error) {\n this.log.warn(`Unable to remove system port forward: ${error.message}`);\n // Ignore, this block will also be called when we fall in catch block\n // and before even port forward.\n }\n try {\n await this.releaseMjpegServerPort();\n } catch (error) {\n this.log.warn(`Unable to remove MJPEG server port forward: ${error.message}`);\n // Ignore, this block will also be called when we fall in catch block\n // and before even port forward.\n }\n\n if (await this.adb.getApiLevel() >= 28) { // Android P\n this.log.info('Restoring hidden api policy to the device default configuration');\n await this.adb.setDefaultHiddenApiPolicy(!!this.opts.ignoreHiddenApiPolicyError);\n }\n\n if (this.opts.reboot) {\n let avdName = this.opts.avd.replace('@', '');\n this.log.debug(`Closing emulator '${avdName}'`);\n try {\n await this.adb.killEmulator(avdName);\n } catch (err) {\n this.log.warn(`Unable to close emulator: ${err.message}`);\n }\n }\n }\n if (this.mjpegStream) {\n this.log.info('Closing MJPEG stream');\n this.mjpegStream.stop();\n }\n await super.deleteSession();\n }\n\n async checkAppPresent () {\n this.log.debug('Checking whether app is actually present');\n if (!(await fs.exists(this.opts.app))) {\n this.log.errorAndThrow(`Could not find app apk at '${this.opts.app}'`);\n }\n }\n\n async onSettingsUpdate () {\n // intentionally do nothing here, since commands.updateSettings proxies\n // settings to the uiauto2 server already\n }\n\n // Need to override android-driver's version of this since we don't actually\n // have a bootstrap; instead we just restart adb and re-forward the UiAutomator2\n // port\n async wrapBootstrapDisconnect (wrapped) {\n await wrapped();\n await this.adb.restart();\n await this.allocateSystemPort();\n await this.allocateMjpegServerPort();\n }\n\n proxyActive (sessionId) {\n super.proxyActive(sessionId);\n\n // we always have an active proxy to the UiAutomator2 server\n return true;\n }\n\n canProxy (sessionId) {\n super.canProxy(sessionId);\n\n // we can always proxy to the uiautomator2 server\n return true;\n }\n\n getProxyAvoidList (sessionId) {\n super.getProxyAvoidList(sessionId);\n // we are maintaining two sets of NO_PROXY lists, one for chromedriver(CHROME_NO_PROXY)\n // and one for uiautomator2(NO_PROXY), based on current context will return related NO_PROXY list\n if (util.hasValue(this.chromedriver)) {\n // if the current context is webview(chromedriver), then return CHROME_NO_PROXY list\n this.jwpProxyAvoid = CHROME_NO_PROXY;\n } else {\n this.jwpProxyAvoid = NO_PROXY;\n }\n if (this.opts.nativeWebScreenshot) {\n this.jwpProxyAvoid = [...this.jwpProxyAvoid, ['GET', new RegExp('^/session/[^/]+/screenshot')]];\n }\n\n return this.jwpProxyAvoid;\n }\n\n get isChromeSession () {\n return helpers.isChromeBrowser(this.opts.browserName);\n }\n}\n\n// first add the android-driver commands which we will fall back to\nfor (let [cmd, fn] of _.toPairs(androidCommands)) {\n AndroidUiautomator2Driver.prototype[cmd] = fn;\n}\n\n// then overwrite with any uiautomator2-specific commands\nfor (let [cmd, fn] of _.toPairs(commands)) {\n AndroidUiautomator2Driver.prototype[cmd] = fn;\n}\n\nexport { AndroidUiautomator2Driver };\nexport default AndroidUiautomator2Driver;\n"],"mappings":";;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAF,OAAA;AAGA,IAAAG,UAAA,GAAAH,OAAA;AACA,IAAAI,QAAA,GAAAJ,OAAA;AACA,IAAAK,SAAA,GAAAL,OAAA;AACA,IAAAM,SAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,MAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,UAAA,GAAAR,OAAA;AACA,IAAAS,QAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,oBAAA,GAAAV,OAAA;AACA,IAAAW,YAAA,GAAAZ,sBAAA,CAAAC,OAAA;AACA,IAAAY,YAAA,GAAAZ,OAAA;AACA,IAAAa,GAAA,GAAAd,sBAAA,CAAAC,OAAA;AACA,IAAAc,KAAA,GAAAf,sBAAA,CAAAC,OAAA;AACA,IAAAe,WAAA,GAAAf,OAAA;AAGA,MAAMgB,OAAO,GAAGC,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAEC,gBAAmB,EAAEC,mCAAc,CAAC;AAItE,MAAMC,iBAAiB,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;AAItC,MAAMC,4BAA4B,GAAGC,aAAI,CAACC,gBAAgB,CACxDC,aAAI,CAACC,OAAO,CAACC,WAAE,CAACC,MAAM,CAAC,CAAC,EAAE,wBAAwB,CAAC,EACnD;EAACC,OAAO,EAAE,EAAE;EAAEC,WAAW,EAAE;AAAI,CACjC,CAAC;AAID,MAAMC,WAAW,GAAG,IAAI;AAIxB,MAAMC,wBAAwB,GAAG,IAAI;AAErC,MAAMC,aAAa,GAAG,WAAW;AAMjC,MAAMC,QAAQ,GAAG,CACf,CAAC,KAAK,EAAE,IAAIC,MAAM,CAAC,mBAAmB,CAAC,CAAC,EACxC,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,6BAA6B,CAAC,CAAC,EAClD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,6BAA6B,CAAC,CAAC,EAClD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,+CAA+C,CAAC,CAAC,EACpE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,8CAA8C,CAAC,CAAC,EACnE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,kCAAkC,CAAC,CAAC,EACvD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,qCAAqC,CAAC,CAAC,EAC1D,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,iCAAiC,CAAC,CAAC,EACtD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC9C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAC/C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,yCAAyC,CAAC,CAAC,EAC9D,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,yCAAyC,CAAC,CAAC,EAC9D,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,uCAAuC,CAAC,CAAC,EAC5D,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,gDAAgD,CAAC,CAAC,EACrE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,oCAAoC,CAAC,CAAC,EACzD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,0CAA0C,CAAC,CAAC,EAC/D,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,wCAAwC,CAAC,CAAC,EAC7D,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,2BAA2B,CAAC,CAAC,EAChD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAC/C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,oCAAoC,CAAC,CAAC,EACzD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,4BAA4B,CAAC,CAAC,EACjD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAC/C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAC1C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8BAA8B,CAAC,CAAC,EACpD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC/C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,6BAA6B,CAAC,CAAC,EACnD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,6CAA6C,CAAC,CAAC,EACnE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,kCAAkC,CAAC,CAAC,EACxD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,uCAAuC,CAAC,CAAC,EAC7D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,sDAAsD,CAAC,CAAC,EAC5E,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,oDAAoD,CAAC,CAAC,EAC1E,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,4CAA4C,CAAC,CAAC,EAClE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,2CAA2C,CAAC,CAAC,EACjE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8CAA8C,CAAC,CAAC,EACpE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,iCAAiC,CAAC,CAAC,EACvD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,uCAAuC,CAAC,CAAC,EAC7D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,+CAA+C,CAAC,CAAC,EACrE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8CAA8C,CAAC,CAAC,EACpE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,gCAAgC,CAAC,CAAC,EACtD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC/C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC/C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,2BAA2B,CAAC,CAAC,EACjD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,sBAAsB,CAAC,CAAC,EAC5C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,oCAAoC,CAAC,CAAC,EAC1D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,qCAAqC,CAAC,CAAC,EAC3D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,+BAA+B,CAAC,CAAC,EACrD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAG3C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,2BAA2B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC/C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,+BAA+B,CAAC,CAAC,EACrD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAG3C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,8BAA8B,CAAC,CAAC,EACnD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,6BAA6B,CAAC,CAAC,EAClD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,+BAA+B,CAAC,CAAC,EACrD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8BAA8B,CAAC,CAAC,EAEpD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAC/C;AAGD,MAAMC,eAAe,GAAG,CACtB,CAAC,KAAK,EAAE,IAAID,MAAM,CAAC,wBAAwB,CAAC,CAAC,EAC7C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC9C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,oCAAoC,CAAC,CAAC,EACzD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,6BAA6B,CAAC,CAAC,EAClD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,wBAAwB,CAAC,CAAC,EAC9C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC/C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,6BAA6B,CAAC,CAAC,EACnD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,qCAAqC,CAAC,CAAC,EAC3D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,+BAA+B,CAAC,CAAC,EAGrD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8BAA8B,CAAC,CAAC,EAGpD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,4BAA4B,CAAC,CAAC,EACjD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,sBAAsB,CAAC,CAAC,EAG5C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,+BAA+B,CAAC,CAAC,EAEpD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAChD;AAED,MAAME,kBAAkB,GAAG,CACzB,oBAAoB,EACpB,qBAAqB,CACtB;AAED,MAAMC,yBAAyB,SAASC,kBAAU,CAAC;EAEjD,OAAOC,YAAY,GAAGA,uBAAY;EAElCC,WAAWA,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAEC,kBAAkB,GAAG,IAAI,EAAE;IAEjD,OAAOD,IAAI,CAACE,KAAK;IAEjB,KAAK,CAACF,IAAI,EAAEC,kBAAkB,CAAC;IAC/B,IAAI,CAACE,iBAAiB,GAAG,CACvB,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,sBAAsB,CACvB;IACD,IAAI,CAACC,qBAAqB,GAAGA,oBAAqB;IAClD,IAAI,CAACC,YAAY,GAAG,IAAI;IACxB,IAAI,CAACC,cAAc,GAAG,KAAK;IAC3B,IAAI,CAACC,aAAa,GAAGf,QAAQ;IAC7B,IAAI,CAACgB,UAAU,GAAG,CAAC,CAAC;IAEpB,IAAI,CAACC,QAAQ,GAAG,IAAIC,sBAAc,CAAC;MAACC,sBAAsB,EAAE,KAAK;MAAEC,sBAAsB,EAAE;IAAK,CAAC,EAC7F,IAAI,CAACC,gBAAgB,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,CAACC,YAAY,GAAG,IAAI;IACxB,IAAI,CAACC,oBAAoB,GAAG,CAAC,CAAC;IAG9B,KAAK,MAAMC,EAAE,IAAItB,kBAAkB,EAAE;MACnC,IAAI,CAACsB,EAAE,CAAC,GAAGC,eAAC,CAACC,OAAO,CAAC,IAAI,CAACF,EAAE,CAAC,CAAC;IAChC;EACF;EAEAG,mBAAmBA,CAAEC,IAAI,EAAE;IACzB,OAAO,KAAK,CAACD,mBAAmB,CAACC,IAAI,CAAC,IAAI3C,mCAAc,CAAC0C,mBAAmB,CAACC,IAAI,CAAC;EACpF;EAEA,MAAMC,aAAaA,CAAE,GAAGC,IAAI,EAAE;IAC5B,IAAI;MAEF,IAAI,CAACC,SAAS,EAAEH,IAAI,CAAC,GAAG,MAAM,KAAK,CAACC,aAAa,CAAC,GAAGC,IAAI,CAAC;MAE1D,IAAIE,aAAa,GAAG;QAClBC,QAAQ,EAAE,OAAO;QACjBC,iBAAiB,EAAE,KAAK;QACxBC,eAAe,EAAE,IAAI;QACrBC,iBAAiB,EAAE,IAAI;QACvBC,eAAe,EAAE,KAAK;QACtBC,wBAAwB,EAAE,IAAI;QAC9BC,sBAAsB,EAAE,KAAK;QAC7BC,QAAQ,EAAE,CAAC,CAAC;QACZC,OAAO,EAAE,IAAI,CAACb;MAChB,CAAC;MAED,IAAI,CAACA,IAAI,GAAG9C,MAAM,CAACC,MAAM,CAACiD,aAAa,EAAE,IAAI,CAACJ,IAAI,CAAC;MAEnD,IAAI,CAACc,UAAU,GAAG,IAAI,CAACC,kBAAkB,CAAC,CAAC;MAE3C,IAAIC,WAAW,GAAG;QAChBC,SAAS,EAAE,KAAK;QAChBC,UAAU,EAAE,IAAI;QAChBC,OAAO,EAAEC,2BAAgB;QACzBC,qBAAqB,EAAE;MACzB,CAAC;MACDxB,eAAC,CAACyB,QAAQ,CAAC,IAAI,CAAC3C,IAAI,EAAEqC,WAAW,CAAC;MAElC,IAAI,IAAI,CAACO,eAAe,EAAE;QACxB,IAAI,CAACC,GAAG,CAACC,IAAI,CAAC,2CAA2C,CAAC;QAC1D,IAAI;UAACC,GAAG;UAAEC;QAAQ,CAAC,GAAG1E,OAAO,CAAC2E,YAAY,CAAC,IAAI,CAACjD,IAAI,CAACkD,WAAW,CAAC;QACjE,IAAI,CAAClD,IAAI,CAACmD,UAAU,GAAG,IAAI,CAAC9B,IAAI,CAAC8B,UAAU,GAAGJ,GAAG;QACjD,IAAI,CAAC/C,IAAI,CAACoD,WAAW,GAAG,IAAI,CAAC/B,IAAI,CAAC+B,WAAW,GAAGJ,QAAQ;QACxD,IAAI,CAACH,GAAG,CAACC,IAAI,CAAE,wCAAuCC,GAAI,QAAOC,QAAS,EAAC,CAAC;MAC9E;MAEA,IAAI,IAAI,CAAChD,IAAI,CAACqD,MAAM,EAAE;QACpB,IAAI,CAACC,sBAAsB,CAACjC,IAAI,CAAC;MACnC;MAEA,IAAI,IAAI,CAACrB,IAAI,CAACuD,GAAG,EAAE;QAEjB,IAAI,CAACvD,IAAI,CAACuD,GAAG,GAAG,MAAM,IAAI,CAACjF,OAAO,CAACkF,YAAY,CAAC,IAAI,CAACxD,IAAI,CAACuD,GAAG,EAAE,CAACE,yBAAa,EAAEC,0BAAc,CAAC,CAAC;QAC/F,MAAM,IAAI,CAACC,eAAe,CAAC,CAAC;MAC9B,CAAC,MAAM,IAAI,IAAI,CAAC3D,IAAI,CAACmD,UAAU,EAAE;QAG/B,IAAI,CAACN,GAAG,CAACC,IAAI,CAAE,aAAY,IAAI,CAAC9C,IAAI,CAACmD,UAAW,0BAAyB,CAAC;MAC5E,CAAC,MAAM;QACL,IAAI,CAACN,GAAG,CAACC,IAAI,CAAE,gEAA+D,GAC5E,gCAAgC,CAAC;MACrC;MACA,IAAI,CAAC9C,IAAI,CAACwC,OAAO,GAAG,IAAI,CAACxC,IAAI,CAACwC,OAAO,IAAIC,2BAAgB;MAEzD,MAAM,IAAI,CAACmB,wBAAwB,CAAC,CAAC;MACrC,MAAM,IAAI,CAACC,iBAAiB,CAAC,CAAC;MAC9B,IAAI,IAAI,CAAC7D,IAAI,CAAC8D,kBAAkB,EAAE;QAChC,IAAI,CAACjB,GAAG,CAACC,IAAI,CAAE,uCAAsC,IAAI,CAAC9C,IAAI,CAAC8D,kBAAmB,GAAE,CAAC;QACrF,IAAI,CAACC,WAAW,GAAG,IAAIC,cAAK,CAACC,WAAW,CAAC,IAAI,CAACjE,IAAI,CAAC8D,kBAAkB,CAAC;QACtE,MAAM,IAAI,CAACC,WAAW,CAACG,KAAK,CAAC,CAAC;MAChC;MACA,OAAO,CAAC1C,SAAS,EAAE,IAAI,CAACH,IAAI,CAAC;IAC/B,CAAC,CAAC,OAAO8C,CAAC,EAAE;MACV,MAAM,IAAI,CAACC,aAAa,CAAC,CAAC;MAC1B,MAAMD,CAAC;IACT;EACF;EAEA,MAAMN,iBAAiBA,CAAA,EAAI;IACzB,IAAI,CAACxC,IAAI,CAACgD,UAAU,GAAG,MAAM,IAAI,CAACC,mBAAmB,CAAC,CAAC;IACvD,IAAI,CAACjD,IAAI,CAACkD,aAAa,GAAG,MAAM,IAAI,CAACC,kBAAkB,CAAC,CAAC;IACzD,IAAI,CAACnD,IAAI,CAACoD,YAAY,GAAG,MAAM,IAAI,CAACC,eAAe,CAAC,CAAC;EACvD;EAEA,IAAIC,UAAUA,CAAA,EAAI;IAEhB,OAAO,CAAC,CAAC;EACX;EAEA,MAAMC,UAAUA,CAAA,EAAI;IAClB,IAAIC,WAAW,GAAG,MAAM,KAAK,CAACD,UAAU,CAAC,CAAC;IAC1C,IAAI,CAAC/B,GAAG,CAACiC,KAAK,CAAC,+CAA+C,CAAC;IAC/D,IAAIC,QAAQ,GAAG,MAAM,IAAI,CAAC1E,YAAY,CAAC2E,OAAO,CAACC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACtE,OAAO1G,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAEqG,WAAW,EAAEE,QAAQ,CAAC;EACjD;EAEAG,UAAUA,CAAA,EAAI;IACZ,OAAO5G,OAAO,CAAC4G,UAAU,CAAC,IAAI,CAACC,GAAG,EAAE,IAAI,CAACnF,IAAI,CAAC;EAChD;EAEAsD,sBAAsBA,CAAEjC,IAAI,EAAE;IAC5B,IAAI,IAAI,CAACrB,IAAI,CAACoF,GAAG,EAAE;MACjB,IAAI,CAACvC,GAAG,CAACC,IAAI,CAAC,6DAA6D,CAAC;IAC9E,CAAC,MAAM;MACL,IAAI,CAACzB,IAAI,CAACgE,UAAU,EAAE;QACpB,IAAI,CAACxC,GAAG,CAACyC,aAAa,CAAC,qEAAqE,CAAC;MAC/F;MACA,IAAI,CAACjE,IAAI,CAACkE,eAAe,EAAE;QACzB,IAAI,CAAC1C,GAAG,CAACyC,aAAa,CAAC,0EAA0E,CAAC;MACpG;MACA,IAAIE,SAAS,GAAGnE,IAAI,CAACgE,UAAU,CAACI,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;MAC/D,IAAI,CAACzF,IAAI,CAACoF,GAAG,GAAI,GAAEI,SAAU,KAAInE,IAAI,CAACkE,eAAgB,EAAC;IACzD;EACF;EAEA,MAAMG,kBAAkBA,CAAA,EAAI;IAC1B,MAAMC,WAAW,GAAG,MAAOC,SAAS,IAAK;MACvC,IAAI,CAAC/C,GAAG,CAACiC,KAAK,CAAE,uCAAsCzF,WAAY,kBAAiBuG,SAAU,EAAC,CAAC;MAC/F,IAAI,CAAC,MAAM,IAAAC,4BAAe,EAACD,SAAS,EAAErG,aAAa,CAAC,MAAM,MAAM,EAAE;QAChE,IAAI,CAACsD,GAAG,CAACyC,aAAa,CAAE,4DAA2DM,SAAU,YAAW,GACrG,8EAA6E,GAC7E,oFAAmF,GACnF,4FAA2F,CAAC;MACjG;MACA,MAAM,IAAI,CAACT,GAAG,CAACQ,WAAW,CAACC,SAAS,EAAEvG,WAAW,CAAC;IACpD,CAAC;IAED,IAAI,IAAI,CAACW,IAAI,CAAC8F,UAAU,EAAE;MACxB,IAAI,CAACC,oBAAoB,GAAG,IAAI;MAChC,OAAO,MAAMJ,WAAW,CAAC,IAAI,CAAC3F,IAAI,CAAC8F,UAAU,CAAC;IAChD;IAEA,MAAMlH,4BAA4B,CAAC,YAAY;MAC7C,MAAM,CAACoH,SAAS,EAAEC,OAAO,CAAC,GAAGtH,iBAAiB;MAC9C,IAAI;QACF,IAAI,CAACqB,IAAI,CAAC8F,UAAU,GAAG,MAAM,IAAAI,8BAAiB,EAACF,SAAS,EAAEC,OAAO,CAAC;MACpE,CAAC,CAAC,OAAO9B,CAAC,EAAE;QACV,IAAI,CAACtB,GAAG,CAACyC,aAAa,CACnB,sCAAqCU,SAAU,KAAIC,OAAQ,KAAI,GAC/D,iFAAgF,GAChF,oFAAmF,GACnF,oCAAmC,CAAC;MACzC;MACA,MAAMN,WAAW,CAAC,IAAI,CAAC3F,IAAI,CAAC8F,UAAU,CAAC;IACzC,CAAC,CAAC;EACJ;EAEA,MAAMK,iBAAiBA,CAAA,EAAI;IACzB,IAAI,CAAC,IAAI,CAACnG,IAAI,CAAC8F,UAAU,IAAI,CAAC,IAAI,CAACX,GAAG,EAAE;MACtC;IACF;IAEA,IAAI,IAAI,CAACY,oBAAoB,EAAE;MAC7B,MAAM,IAAI,CAACZ,GAAG,CAACiB,iBAAiB,CAAC,IAAI,CAACpG,IAAI,CAAC8F,UAAU,CAAC;IACxD,CAAC,MAAM;MACL,MAAMlH,4BAA4B,CAAC,YAAY,MAAM,IAAI,CAACuG,GAAG,CAACiB,iBAAiB,CAAC,IAAI,CAACpG,IAAI,CAAC8F,UAAU,CAAC,CAAC;IACxG;EACF;EAEA,MAAMO,uBAAuBA,CAAA,EAAI;IAC/B,IAAI,IAAI,CAACrG,IAAI,CAACsG,eAAe,EAAE;MAC7B,IAAI,CAACzD,GAAG,CAACiC,KAAK,CAAE,8DAA6DxF,wBAAyB,GAAE,GACrG,iBAAgB,IAAI,CAACU,IAAI,CAACsG,eAAgB,EAAC,CAAC;MAC/C,MAAM,IAAI,CAACnB,GAAG,CAACQ,WAAW,CAAC,IAAI,CAAC3F,IAAI,CAACsG,eAAe,EAAEhH,wBAAwB,CAAC;IACjF;EACF;EAEA,MAAMiH,sBAAsBA,CAAA,EAAI;IAC9B,IAAI,IAAI,CAACvG,IAAI,CAACsG,eAAe,EAAE;MAC7B,MAAM,IAAI,CAACnB,GAAG,CAACiB,iBAAiB,CAAC,IAAI,CAACpG,IAAI,CAACsG,eAAe,CAAC;IAC7D;EACF;EAEA,MAAM1C,wBAAwBA,CAAA,EAAI;IAEhC,IAAI;MAAC4C,IAAI;MAAEC;IAAM,CAAC,GAAG,MAAMnI,OAAO,CAACoI,qBAAqB,CAAC,IAAI,CAAC1G,IAAI,CAAC;IACnE,IAAI,CAACA,IAAI,CAACwG,IAAI,GAAGA,IAAI;IACrB,IAAI,CAACxG,IAAI,CAACyG,MAAM,GAAGA,MAAM;IAIzB,IAAI,CAACtB,GAAG,GAAG,MAAMzG,mCAAc,CAACiI,SAAS,CAAC,IAAI,CAAC3G,IAAI,CAAC;IAEpD,MAAM4G,QAAQ,GAAG,MAAM,IAAI,CAACzB,GAAG,CAAC0B,WAAW,CAAC,CAAC;IAE7C,IAAID,QAAQ,GAAG,EAAE,EAAE;MACjB,IAAI,CAAC/D,GAAG,CAACyC,aAAa,CAAC,+DAA+D,GACpF,2FAA2F,CAAC;IAChG;IAEA,IAAIsB,QAAQ,IAAI,EAAE,EAAE;MAClB,IAAI,CAAC/D,GAAG,CAACC,IAAI,CAAC,4BAA4B,CAAC;MAC3C,MAAM,IAAI,CAACqC,GAAG,CAAC2B,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC9G,IAAI,CAAC+G,0BAA0B,CAAC;IAChF;IAGA,IAAIlI,aAAI,CAACmI,QAAQ,CAAC,IAAI,CAAChH,IAAI,CAACiH,UAAU,CAAC,EAAE;MACvC,IAAI,IAAI,CAAC/B,UAAU,CAAC,CAAC,EAAE;QACrB,IAAI,CAACrC,GAAG,CAACC,IAAI,CAAE,aAAY,IAAI,CAAC9C,IAAI,CAACiH,UAAU,GAAG,QAAQ,GAAG,SAAU,wBAAuB,CAAC;QAC/F,MAAM,IAAI,CAAC9B,GAAG,CAAC+B,yBAAyB,CAAC,IAAI,CAAClH,IAAI,CAACiH,UAAU,CAAC;MAChE,CAAC,MAAM;QACL,IAAI,CAACpE,GAAG,CAACsE,IAAI,CAAE,gEAA+D,CAAC;MACjF;IACF;IAGA,MAAMC,OAAO,GAAG,MAAM9I,OAAO,CAAC+I,aAAa,CAAC,IAAI,CAAClC,GAAG,EAAE,IAAI,CAACnF,IAAI,CAAC;IAEhEzB,MAAM,CAACC,MAAM,CAAC,IAAI,CAACwB,IAAI,EAAEoH,OAAO,IAAI,CAAC,CAAC,CAAC;IAGvC,IAAI,CAAC/F,IAAI,CAACgE,UAAU,GAAG,IAAI,CAACF,GAAG,CAACmC,WAAW;IAC3C,IAAI,CAACjG,IAAI,CAACkG,UAAU,GAAG,IAAI,CAACvH,IAAI,CAACwG,IAAI;IAIrC,MAAMlI,OAAO,CAACkJ,UAAU,CAAC,IAAI,CAACrC,GAAG,EAAE,IAAI,CAACnF,IAAI,CAAC;IAI7C,MAAM,IAAI,CAAC0F,kBAAkB,CAAC,CAAC;IAI/B,MAAM,IAAI,CAACW,uBAAuB,CAAC,CAAC;IAGpC,MAAM,IAAI,CAACoB,sBAAsB,CAAC,CAAC;IAGnC,IAAI,IAAI,CAACzH,IAAI,CAAC0H,sBAAsB,IAAK,OAAM,IAAI,CAACvC,GAAG,CAAC0B,WAAW,CAAC,CAAC,IAAG,EAAG,EAAE;MAI3E,IAAI,MAAM,IAAI,CAAC1B,GAAG,CAACwC,aAAa,CAAC,CAAC,EAAE;QAClC,IAAI,CAAC9E,GAAG,CAACC,IAAI,CAAC,4CAA4C,CAAC;QAC3D,MAAM,IAAI,CAACqC,GAAG,CAACyC,iBAAiB,CAAC,KAAK,CAAC;QACvC,IAAI,CAACC,2BAA2B,GAAG,IAAI;MACzC,CAAC,MAAM;QACL,IAAI,CAAChF,GAAG,CAACC,IAAI,CAAC,sCAAsC,CAAC;MACvD;IACF;IAIA,MAAM,IAAI,CAACgF,OAAO,CAAC,CAAC;IAGpB,IAAI,CAAC,IAAI,CAACzG,IAAI,CAAC8B,UAAU,IAAIiE,OAAO,EAAE;MACpC,IAAI,CAAC/F,IAAI,CAAC8B,UAAU,GAAGiE,OAAO,CAACjE,UAAU;IAC3C;IAGA,MAAM,IAAI,CAAC9C,YAAY,CAAC0H,YAAY,CAAC,IAAI,CAAC1G,IAAI,CAAC;IAE/C,MAAM,IAAI,CAAC2G,mBAAmB,CAAC,CAAC;IAGhC,IAAI,CAAC,IAAI,CAAChI,IAAI,CAACiI,UAAU,EAAE;MAEzB,MAAM3J,OAAO,CAAC4J,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC/C,GAAG,EAAE,IAAI,CAAC9D,IAAI,CAAC;IACjD,CAAC,MAAM;MACL,IAAI,CAACwB,GAAG,CAACiC,KAAK,CAAE,wDAAuD,CAAC;IAC1E;IAEA,IAAI,IAAI,CAAClC,eAAe,EAAE;MACxB,MAAM,IAAI,CAACuF,kBAAkB,CAAC,IAAI,CAAC;IACrC,CAAC,MAAM,IAAI,IAAI,CAACnI,IAAI,CAACuC,UAAU,IAAI,IAAI,CAACvC,IAAI,CAACmD,UAAU,EAAE;MACvD,MAAM,IAAI,CAACiF,eAAe,CAAC,CAAC;IAC9B;IAGA,IAAIvJ,aAAI,CAACmI,QAAQ,CAAC,IAAI,CAAChH,IAAI,CAACqI,WAAW,CAAC,EAAE;MACxC,IAAI,CAACxF,GAAG,CAACiC,KAAK,CAAE,mCAAkC,IAAI,CAAC9E,IAAI,CAACqI,WAAY,GAAE,CAAC;MAC3E,MAAM,IAAI,CAACC,cAAc,CAAC,IAAI,CAACtI,IAAI,CAACqI,WAAW,CAAC;IAClD;IAIA,IAAI,IAAI,CAACrI,IAAI,CAACuI,WAAW,EAAE;MACzB,MAAMC,QAAQ,GAAG,IAAI,CAACC,kBAAkB,CAAC,CAAC;MAC1C,MAAMtJ,OAAO,GAAG,IAAI,CAACa,IAAI,CAAC0I,kBAAkB,IAAI,IAAI;MACpD,IAAI,CAAC7F,GAAG,CAACC,IAAI,CAAE,oCAAmC0F,QAAS,kBAAiBrJ,OAAQ,IAAG,CAAC;MACxF,MAAM,IAAAwJ,uBAAa,EAACxJ,OAAO,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,CAACyJ,UAAU,CAAC9H,IAAI,CAAC,IAAI,CAAC,EAAE0H,QAAQ,CAAC;IAC/E;IAIA,IAAI,CAAClI,cAAc,GAAG,IAAI;EAC5B;EAEA,MAAM0H,mBAAmBA,CAAA,EAAI;IAC3B,MAAM;MACJa,UAAU;MACVtD,eAAe;MACfuD,YAAY;MACZC,KAAK;MACLC,eAAe;MACfC;IACF,CAAC,GAAG,MAAM,IAAI,CAACC,mBAAmB,CAAC,CAAC;IACpC,IAAI,CAAC7H,IAAI,CAAC8H,cAAc,GAAGC,QAAQ,CAACP,UAAU,EAAE,EAAE,CAAC;IACnD,IAAI,CAACxH,IAAI,CAACkE,eAAe,GAAGA,eAAe;IAC3C,IAAI,CAAClE,IAAI,CAACgI,gBAAgB,GAAGL,eAAe;IAC5C,IAAI,CAAC3H,IAAI,CAACiI,mBAAmB,GAAGL,cAAc;IAC9C,IAAI,CAAC5H,IAAI,CAACkI,WAAW,GAAGR,KAAK;IAC7B,IAAI,CAAC1H,IAAI,CAACmI,kBAAkB,GAAGV,YAAY;EAC7C;EAEA,MAAMrB,sBAAsBA,CAAA,EAAI;IAE9B,MAAMgC,gBAAgB,GAAG;MACvBC,IAAI,EAAE,IAAI,CAAC1J,IAAI,CAAC2J,aAAa,IAAI,IAAI,CAAC3J,IAAI,CAAC0J,IAAI,IAAInK,aAAa;MAChEuG,UAAU,EAAE,IAAI,CAAC9F,IAAI,CAAC8F,UAAU;MAChC8D,UAAU,EAAEvK,WAAW;MACvB8F,GAAG,EAAE,IAAI,CAACA,GAAG;MACb0E,GAAG,EAAE,IAAI,CAAC7J,IAAI,CAACuD,GAAG;MAClBuG,MAAM,EAAE,IAAI,CAAC9J,IAAI,CAAC8J,MAAM;MACxB3G,UAAU,EAAE,IAAI,CAACnD,IAAI,CAACmD,UAAU;MAChCC,WAAW,EAAE,IAAI,CAACpD,IAAI,CAACoD,WAAW;MAClCsE,sBAAsB,EAAE,CAAC,CAAC,IAAI,CAAC1H,IAAI,CAAC0H,sBAAsB;MAC1DqC,mCAAmC,EAAE,IAAI,CAAC/J,IAAI,CAAC+J,mCAAmC;MAClFC,WAAW,EAAE,IAAI,CAAChK,IAAI,CAACiK;IACzB,CAAC;IAGD,IAAI,CAAC5J,YAAY,GAAG,IAAI6J,+BAAkB,CAAC,IAAI,CAACrH,GAAG,EAAE4G,gBAAgB,CAAC;IACtE,IAAI,CAACU,WAAW,GAAG,IAAI,CAAC9J,YAAY,CAAC8J,WAAW,CAACrJ,IAAI,CAAC,IAAI,CAACT,YAAY,CAAC;IACxE,IAAI,CAAC+J,YAAY,GAAG,IAAI,CAAC/J,YAAY,CAAC+J,YAAY,CAACtJ,IAAI,CAAC,IAAI,CAACT,YAAY,CAAC;IAE1E,IAAI,IAAI,CAACL,IAAI,CAACqK,sBAAsB,EAAE;MACpC,IAAI,CAACxH,GAAG,CAACC,IAAI,CAAE,6EAA4E,CAAC;IAC9F,CAAC,MAAM;MACL,MAAM,IAAI,CAACzC,YAAY,CAACiK,gBAAgB,CAAC,IAAI,CAACtK,IAAI,CAACuK,gCAAgC,CAAC;MACpF,IAAI;QACF,MAAM,IAAI,CAACpF,GAAG,CAACqF,wBAAwB,CACrCC,2CAAsB,EAAEC,8BAAiB,EAAEC,mCAC7C,CAAC;MACH,CAAC,CAAC,OAAOxG,CAAC,EAAE;QACV,IAAI,CAACtB,GAAG,CAACsE,IAAI,CAAE,oEAAmE,IAC/EhD,CAAC,CAACyG,MAAM,IAAIzG,CAAC,CAAC0G,OAAO,CAAC,CAAC;MAC5B;IACF;EACF;EAEA,MAAM/C,OAAOA,CAAA,EAAI;IAEf,IAAI,IAAI,CAAC9H,IAAI,CAAC8K,sBAAsB,EAAE;MACpC,MAAMxM,OAAO,CAACwM,sBAAsB,CAClC,IAAI,CAAC3F,GAAG,EACR7G,OAAO,CAACyM,UAAU,CAAC,IAAI,CAAC/K,IAAI,CAAC8K,sBAAsB,CAAC,EACpD,CAACL,2CAAsB,EAAEC,8BAAiB,EAAEC,mCAAsB,CACpE,CAAC;IACH;IAGA,IAAI,IAAI,CAAC3K,IAAI,CAACgL,SAAS,EAAE;MACvB,IAAIA,SAAS;MACb,IAAI;QACFA,SAAS,GAAG1M,OAAO,CAACyM,UAAU,CAAC,IAAI,CAAC/K,IAAI,CAACgL,SAAS,CAAC;MACrD,CAAC,CAAC,OAAO7G,CAAC,EAAE;QACV,IAAI,CAACtB,GAAG,CAACyC,aAAa,CAAE,2CAA0CnB,CAAC,CAAC0G,OAAQ,EAAC,CAAC;MAChF;MACAG,SAAS,GAAG,MAAMC,iBAAC,CAACC,GAAG,CAACF,SAAS,CAC9BG,GAAG,CAAE5H,GAAG,IAAK,IAAI,CAACjF,OAAO,CAACkF,YAAY,CAACD,GAAG,EAAE,CAACE,yBAAa,EAAEC,0BAAc,CAAC,CAAC,CAAC,CAAC;MACjF,MAAMpF,OAAO,CAAC8M,gBAAgB,CAACJ,SAAS,EAAE,IAAI,CAAC7F,GAAG,EAAE,IAAI,CAACnF,IAAI,CAAC;IAChE;IAEA,IAAI,IAAI,CAACA,IAAI,CAACuD,GAAG,EAAE;MACjB,IAAI,IAAI,CAACvD,IAAI,CAACqL,OAAO,IAAI,EAAE,MAAM,IAAI,CAAClG,GAAG,CAACmG,cAAc,CAAC,IAAI,CAACtL,IAAI,CAACmD,UAAU,CAAC,CAAC,IACxE,CAAC,IAAI,CAACnD,IAAI,CAACqL,OAAO,EAAE;QACzB,IAAI,CAAC,IAAI,CAACrL,IAAI,CAACuL,MAAM,IAAI,EAAC,MAAM,IAAI,CAACpG,GAAG,CAACqG,YAAY,CAAC,IAAI,CAACxL,IAAI,CAACuD,GAAG,EAAE,IAAI,CAACvD,IAAI,CAACmD,UAAU,EAAE;UACzFsI,kBAAkB,EAAE;QACtB,CAAC,CAAC,GAAE;UACF,MAAMnN,OAAO,CAACoN,OAAO,CAAC,IAAI,CAACvG,GAAG,EAAE,IAAI,CAACnF,IAAI,CAACuD,GAAG,CAAC;QAChD;QACA,IAAI,CAAC,IAAI,CAACvD,IAAI,CAAC2L,aAAa,EAAE;UAC5B,MAAM,IAAI,CAACxG,GAAG,CAACyG,YAAY,CAAC,IAAI,CAAC5L,IAAI,CAACmD,UAAU,CAAC;QACnD;QACA,MAAM7E,OAAO,CAACuN,UAAU,CAAC,IAAI,CAAC1G,GAAG,EAAE,IAAI,CAACnF,IAAI,CAAC;MAC/C,CAAC,MAAM;QACL,IAAI,CAAC6C,GAAG,CAACiC,KAAK,CAAC,4EAA4E,CAAC;MAC9F;IACF,CAAC,MAAM;MACL,IAAI,IAAI,CAAC9E,IAAI,CAACsC,SAAS,EAAE;QACvB,IAAI,CAACO,GAAG,CAACyC,aAAa,CAAC,6EAA6E,CAAC;MACvG;MACA,IAAI,CAACzC,GAAG,CAACiC,KAAK,CAAC,yDAAyD,CAAC;MACzE,IAAI,IAAI,CAAC9E,IAAI,CAAC8L,SAAS,IAAI,IAAI,CAAC9L,IAAI,CAACmD,UAAU,EAAE;QAC/C,MAAM7E,OAAO,CAACyN,QAAQ,CAAC,IAAI,CAAC5G,GAAG,EAAE,IAAI,CAACnF,IAAI,CAAC;MAC7C;IACF;EACF;EAEA,MAAMoI,eAAeA,CAAA,EAAI;IAEvB,MAAM4D,cAAc,GAAG,IAAI,CAAChM,IAAI,CAACgM,cAAc,IAAI,IAAI,CAAChM,IAAI,CAACmD,UAAU;IACvE,MAAM8I,eAAe,GAAG,IAAI,CAACjM,IAAI,CAACiM,eAAe,IAAI,IAAI,CAACjM,IAAI,CAACoD,WAAW;IAE1E,IAAI,CAACP,GAAG,CAACC,IAAI,CAAE,aAAY,IAAI,CAAC9C,IAAI,CAACmD,UAAW,IAAG,IAAI,CAACnD,IAAI,CAACoD,WAAY,GAAE,GACxE,oBAAmB4I,cAAe,IAAGC,eAAgB,GAAE,CAAC;IAE3D,IAAI,IAAI,CAAC5K,IAAI,CAAC6K,eAAe,EAAE;MAC7B,IAAI,CAACrJ,GAAG,CAACC,IAAI,CAAE,iCAAgC,GAC5C,iCAAgC,IAAI,CAACzB,IAAI,CAAC6K,eAAgB,MAAK,CAAC;MACnE,MAAM,IAAI,CAAC/G,GAAG,CAAC+G,eAAe,CAAC,IAAI,CAAC7K,IAAI,CAAC6K,eAAe,EAAEF,cAAc,EAAEC,eAAe,CAAC;MAC1F;IACF;IACA,IAAI,IAAI,CAACjM,IAAI,CAACqL,OAAO,IAAI,CAAC,IAAI,CAACrL,IAAI,CAACmM,cAAc,KAC3C,MAAM,IAAI,CAAChH,GAAG,CAACiH,aAAa,CAAC,IAAI,CAACpM,IAAI,CAACmD,UAAU,CAAC,GAAE;MACzD,IAAI,CAACN,GAAG,CAACC,IAAI,CAAE,IAAG,IAAI,CAAC9C,IAAI,CAACmD,UAAW,+CAA8C,GAClF,mGAAkG,CAAC;MACtG;IACF;IACA,MAAM,IAAI,CAACgC,GAAG,CAACkH,QAAQ,CAAC;MACtBtJ,GAAG,EAAE,IAAI,CAAC/C,IAAI,CAACmD,UAAU;MACzBH,QAAQ,EAAE,IAAI,CAAChD,IAAI,CAACoD,WAAW;MAC/BkJ,MAAM,EAAE,IAAI,CAACtM,IAAI,CAACuM,YAAY,IAAI,4BAA4B;MAC9DC,QAAQ,EAAE,IAAI,CAACxM,IAAI,CAACyM,cAAc,IAAI,kCAAkC;MACxEC,KAAK,EAAE,IAAI,CAAC1M,IAAI,CAAC2M,WAAW,IAAI,YAAY;MAC5CC,OAAO,EAAE,IAAI,CAAC5M,IAAI,CAACgM,cAAc;MACjCa,YAAY,EAAE,IAAI,CAAC7M,IAAI,CAACiM,eAAe;MACvCa,aAAa,EAAE,IAAI,CAAC9M,IAAI,CAAC+M,gBAAgB;MACzCC,YAAY,EAAE,IAAI,CAAChN,IAAI,CAACiN,eAAe;MACvCC,uBAAuB,EAAE,IAAI,CAAClN,IAAI,CAACkN,uBAAuB;MAC1DC,OAAO,EAAE,IAAI,CAACnN,IAAI,CAACmM,cAAc,IAAI,CAAC,IAAI,CAACnM,IAAI,CAACoN,kBAAkB;MAClEC,KAAK,EAAE,IAAI;MACXC,IAAI,EAAE,IAAI,CAACtN,IAAI,CAACuN;IAClB,CAAC,CAAC;EACJ;EAEA,MAAMnJ,aAAaA,CAAA,EAAI;IACrB,IAAI,CAACvB,GAAG,CAACiC,KAAK,CAAC,+BAA+B,CAAC;IAE/C,MAAM0I,wBAAwB,GAAG,CAAC,YAAY;MAC5C,IAAI,CAACtM,eAAC,CAACuM,OAAO,CAAC,IAAI,CAACC,0BAA0B,CAAC,EAAE;QAC/C,MAAM,IAAI,CAACC,mBAAmB,CAAC,CAAC;MAClC;IACF,CAAC,EAAE,YAAY;MACb,IAAI,MAAM,IAAI,CAACC,uCAAuC,CAAC,CAAC,EAAE;QACxD,MAAM,IAAI,CAACC,kCAAkC,CAAC,CAAC;MACjD;IACF,CAAC,EAAE,YAAY;MACb,IAAI,CAAC3M,eAAC,CAACuM,OAAO,CAAC,IAAI,CAACK,qBAAqB,CAAC,EAAE;QAC1C,MAAM,IAAI,CAACC,yBAAyB,CAAC,CAAC;MACxC;IACF,CAAC,CAAC;IAEF,MAAMrP,mCAAc,CAACsP,iCAAiC,CAAC,IAAI,CAACC,MAAM,EAAE,IAAI,CAACzM,SAAS,CAAC;IAEnF,IAAI,IAAI,CAACnB,YAAY,EAAE;MACrB,IAAI;QACF,MAAM,IAAI,CAAC6N,uBAAuB,CAAC,CAAC;MACtC,CAAC,CAAC,OAAOC,GAAG,EAAE;QACZ,IAAI,CAACtL,GAAG,CAACsE,IAAI,CAAE,wCAAuCgH,GAAG,CAACtD,OAAQ,EAAC,CAAC;MACtE;MACA,IAAI,IAAI,CAACvK,cAAc,EAAE;QACvB,IAAI;UACF,MAAM,IAAI,CAACD,YAAY,CAAC+D,aAAa,CAAC,CAAC;QACzC,CAAC,CAAC,OAAO+J,GAAG,EAAE;UACZ,IAAI,CAACtL,GAAG,CAACsE,IAAI,CAAE,kDAAiDgH,GAAG,CAACtD,OAAQ,EAAC,CAAC;QAChF;MACF;MACA,IAAI,CAACxK,YAAY,GAAG,IAAI;IAC1B;IACA,IAAI,CAACC,cAAc,GAAG,KAAK;IAE3B,IAAI,IAAI,CAAC6E,GAAG,EAAE;MACZ,MAAM8F,iBAAC,CAACC,GAAG,CAACsC,wBAAwB,CAACrC,GAAG,CAAEiD,IAAI,IAAK;QACjD,CAAC,YAAY;UACX,IAAI;YACF,MAAMA,IAAI,CAAC,CAAC;UACd,CAAC,CAAC,OAAOC,GAAG,EAAE,CAAC;QACjB,CAAC,EAAE,CAAC;MACN,CAAC,CAAC,CAAC;MAEH,IAAI,IAAI,CAAChN,IAAI,CAAC6K,eAAe,EAAE;QAC7B,IAAI,CAACrJ,GAAG,CAACC,IAAI,CAAC,qDAAqD,CAAC;QACpE,MAAM,IAAI,CAACqC,GAAG,CAACmJ,kBAAkB,CAAC,CAAC;QAEnC,IAAI,IAAI,CAACjN,IAAI,CAACkN,wBAAwB,EAAE;UACtC,IAAI,CAAC1L,GAAG,CAACC,IAAI,CAAE,6BAA4B,IAAI,CAACzB,IAAI,CAACkN,wBAAyB,gCAA+B,CAAC;UAC9G,MAAM,IAAI,CAACpJ,GAAG,CAACqJ,SAAS,CAAC,IAAI,CAACnN,IAAI,CAACkN,wBAAwB,CAAC;QAC9D,CAAC,MAAM;UACL,IAAI,CAAC1L,GAAG,CAACsE,IAAI,CAAC,2FAA2F,CAAC;QAC5G;MACF;MACA,IAAI,IAAI,CAACnH,IAAI,CAACmD,UAAU,EAAE;QACxB,IAAI,CAAC,IAAI,CAACP,eAAe,KAAM,CAAC,IAAI,CAAC5C,IAAI,CAACoN,kBAAkB,IAAI,CAAC,IAAI,CAACpN,IAAI,CAACqL,OAAO,IAC1E,IAAI,CAACrL,IAAI,CAACqL,OAAO,IAAI,IAAI,CAACrL,IAAI,CAACyO,kBAAmB,CAAC,EAAE;UAC3D,IAAI;YACF,MAAM,IAAI,CAACtJ,GAAG,CAACuJ,SAAS,CAAC,IAAI,CAAC1O,IAAI,CAACmD,UAAU,CAAC;UAChD,CAAC,CAAC,OAAOgL,GAAG,EAAE;YACZ,IAAI,CAACtL,GAAG,CAACsE,IAAI,CAAE,6BAA4BgH,GAAG,CAACtD,OAAQ,EAAC,CAAC;UAC3D;QACF;QACA,IAAI,IAAI,CAAC7K,IAAI,CAACsC,SAAS,IAAI,CAAC,IAAI,CAACtC,IAAI,CAAC2L,aAAa,EAAE;UACnD,IAAI,CAAC9I,GAAG,CAACiC,KAAK,CAAE,uDAAsD,IAAI,CAAC9E,IAAI,CAACmD,UAAW,GAAE,CAAC;UAC9F,IAAI;YACF,MAAM,IAAI,CAACgC,GAAG,CAACyG,YAAY,CAAC,IAAI,CAAC5L,IAAI,CAACmD,UAAU,CAAC;UACnD,CAAC,CAAC,OAAOgL,GAAG,EAAE;YACZ,IAAI,CAACtL,GAAG,CAACsE,IAAI,CAAE,4BAA2BgH,GAAG,CAACtD,OAAQ,EAAC,CAAC;UAC1D;QACF;MACF;MAEA,IAAI,IAAI,CAAChD,2BAA2B,EAAE;QACpC,IAAI,CAAChF,GAAG,CAACC,IAAI,CAAC,kCAAkC,CAAC;QACjD,MAAM,IAAI,CAACqC,GAAG,CAACyC,iBAAiB,CAAC,IAAI,CAAC;MACxC;MACA,MAAM,IAAI,CAACzC,GAAG,CAACwJ,UAAU,CAAC,CAAC;MAC3B,IAAI;QACF,MAAM,IAAI,CAACxI,iBAAiB,CAAC,CAAC;MAChC,CAAC,CAAC,OAAOyI,KAAK,EAAE;QACd,IAAI,CAAC/L,GAAG,CAACsE,IAAI,CAAE,yCAAwCyH,KAAK,CAAC/D,OAAQ,EAAC,CAAC;MAGzE;MACA,IAAI;QACF,MAAM,IAAI,CAACtE,sBAAsB,CAAC,CAAC;MACrC,CAAC,CAAC,OAAOqI,KAAK,EAAE;QACd,IAAI,CAAC/L,GAAG,CAACsE,IAAI,CAAE,+CAA8CyH,KAAK,CAAC/D,OAAQ,EAAC,CAAC;MAG/E;MAEA,IAAI,OAAM,IAAI,CAAC1F,GAAG,CAAC0B,WAAW,CAAC,CAAC,KAAI,EAAE,EAAE;QACtC,IAAI,CAAChE,GAAG,CAACC,IAAI,CAAC,iEAAiE,CAAC;QAChF,MAAM,IAAI,CAACqC,GAAG,CAAC0J,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC7O,IAAI,CAAC+G,0BAA0B,CAAC;MAClF;MAEA,IAAI,IAAI,CAAC/G,IAAI,CAACqD,MAAM,EAAE;QACpB,IAAIyL,OAAO,GAAG,IAAI,CAAC9O,IAAI,CAACoF,GAAG,CAACK,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC5C,GAAG,CAACiC,KAAK,CAAE,qBAAoBgK,OAAQ,GAAE,CAAC;QAC/C,IAAI;UACF,MAAM,IAAI,CAAC3J,GAAG,CAAC4J,YAAY,CAACD,OAAO,CAAC;QACtC,CAAC,CAAC,OAAOX,GAAG,EAAE;UACZ,IAAI,CAACtL,GAAG,CAACsE,IAAI,CAAE,6BAA4BgH,GAAG,CAACtD,OAAQ,EAAC,CAAC;QAC3D;MACF;IACF;IACA,IAAI,IAAI,CAAC9G,WAAW,EAAE;MACpB,IAAI,CAAClB,GAAG,CAACC,IAAI,CAAC,sBAAsB,CAAC;MACrC,IAAI,CAACiB,WAAW,CAACiL,IAAI,CAAC,CAAC;IACzB;IACA,MAAM,KAAK,CAAC5K,aAAa,CAAC,CAAC;EAC7B;EAEA,MAAMT,eAAeA,CAAA,EAAI;IACvB,IAAI,CAACd,GAAG,CAACiC,KAAK,CAAC,0CAA0C,CAAC;IAC1D,IAAI,EAAE,MAAMmK,WAAE,CAACC,MAAM,CAAC,IAAI,CAAClP,IAAI,CAACuD,GAAG,CAAC,CAAC,EAAE;MACrC,IAAI,CAACV,GAAG,CAACyC,aAAa,CAAE,8BAA6B,IAAI,CAACtF,IAAI,CAACuD,GAAI,GAAE,CAAC;IACxE;EACF;EAEA,MAAM1C,gBAAgBA,CAAA,EAAI,CAG1B;EAKA,MAAMsO,uBAAuBA,CAAEC,OAAO,EAAE;IACtC,MAAMA,OAAO,CAAC,CAAC;IACf,MAAM,IAAI,CAACjK,GAAG,CAACkK,OAAO,CAAC,CAAC;IACxB,MAAM,IAAI,CAAC3J,kBAAkB,CAAC,CAAC;IAC/B,MAAM,IAAI,CAACW,uBAAuB,CAAC,CAAC;EACtC;EAEAiJ,WAAWA,CAAE9N,SAAS,EAAE;IACtB,KAAK,CAAC8N,WAAW,CAAC9N,SAAS,CAAC;IAG5B,OAAO,IAAI;EACb;EAEA+N,QAAQA,CAAE/N,SAAS,EAAE;IACnB,KAAK,CAAC+N,QAAQ,CAAC/N,SAAS,CAAC;IAGzB,OAAO,IAAI;EACb;EAEAgO,iBAAiBA,CAAEhO,SAAS,EAAE;IAC5B,KAAK,CAACgO,iBAAiB,CAAChO,SAAS,CAAC;IAGlC,IAAI3C,aAAI,CAACmI,QAAQ,CAAC,IAAI,CAACjG,YAAY,CAAC,EAAE;MAEpC,IAAI,CAACR,aAAa,GAAGb,eAAe;IACtC,CAAC,MAAM;MACL,IAAI,CAACa,aAAa,GAAGf,QAAQ;IAC/B;IACA,IAAI,IAAI,CAACQ,IAAI,CAACyP,mBAAmB,EAAE;MACjC,IAAI,CAAClP,aAAa,GAAG,CAAC,GAAG,IAAI,CAACA,aAAa,EAAE,CAAC,KAAK,EAAE,IAAId,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACjG;IAEA,OAAO,IAAI,CAACc,aAAa;EAC3B;EAEA,IAAIqC,eAAeA,CAAA,EAAI;IACrB,OAAOtE,OAAO,CAACoR,eAAe,CAAC,IAAI,CAAC1P,IAAI,CAACkD,WAAW,CAAC;EACvD;AACF;AAACyM,OAAA,CAAA/P,yBAAA,GAAAA,yBAAA;AAGD,KAAK,IAAI,CAACgQ,GAAG,EAAE3O,EAAE,CAAC,IAAIC,eAAC,CAAC2O,OAAO,CAACC,oCAAe,CAAC,EAAE;EAChDlQ,yBAAyB,CAACmQ,SAAS,CAACH,GAAG,CAAC,GAAG3O,EAAE;AAC/C;AAGA,KAAK,IAAI,CAAC2O,GAAG,EAAE3O,EAAE,CAAC,IAAIC,eAAC,CAAC2O,OAAO,CAACG,cAAQ,CAAC,EAAE;EACzCpQ,yBAAyB,CAACmQ,SAAS,CAACH,GAAG,CAAC,GAAG3O,EAAE;AAC/C;AAAC,IAAAgP,QAAA,GAGcrQ,yBAAyB;AAAA+P,OAAA,CAAAO,OAAA,GAAAD,QAAA"}
package/lib/driver.js CHANGED
@@ -334,6 +334,8 @@ class AndroidUiautomator2Driver extends BaseDriver {
334
334
 
335
335
  async allocateMjpegServerPort () {
336
336
  if (this.opts.mjpegServerPort) {
337
+ this.log.debug(`MJPEG broadcasting requested, forwarding MJPEG server port ${MJPEG_SERVER_DEVICE_PORT} ` +
338
+ `to local port ${this.opts.mjpegServerPort}`);
337
339
  await this.adb.forwardPort(this.opts.mjpegServerPort, MJPEG_SERVER_DEVICE_PORT);
338
340
  }
339
341
  }
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "appium-uiautomator2-driver",
3
- "version": "2.25.2",
3
+ "version": "2.26.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appium-uiautomator2-driver",
9
- "version": "2.25.2",
9
+ "version": "2.26.0",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@babel/runtime": "^7.0.0",
13
13
  "appium-adb": "^9.11.5",
14
14
  "appium-android-driver": "^5.13.0",
15
15
  "appium-chromedriver": "^5.3.1",
16
- "appium-uiautomator2-server": "^5.10.0",
16
+ "appium-uiautomator2-server": "^5.11.1",
17
17
  "asyncbox": "^2.3.1",
18
18
  "axios": "^1.x",
19
19
  "bluebird": "^3.5.1",
@@ -39,7 +39,7 @@
39
39
  "babel-plugin-source-map-support": "^2.2.0",
40
40
  "chai": "^4.1.0",
41
41
  "chai-as-promised": "^7.1.1",
42
- "conventional-changelog-conventionalcommits": "^5.0.0",
42
+ "conventional-changelog-conventionalcommits": "^6.0.0",
43
43
  "eslint-config-prettier": "^8.5.0",
44
44
  "fancy-log": "^2.0.0",
45
45
  "lint-staged": "^13.0.3",
@@ -341,27 +341,27 @@
341
341
  }
342
342
  },
343
343
  "node_modules/@babel/code-frame": {
344
- "version": "7.21.4",
344
+ "version": "7.22.5",
345
345
  "license": "MIT",
346
346
  "dependencies": {
347
- "@babel/highlight": "^7.18.6"
347
+ "@babel/highlight": "^7.22.5"
348
348
  },
349
349
  "engines": {
350
350
  "node": ">=6.9.0"
351
351
  }
352
352
  },
353
353
  "node_modules/@babel/helper-validator-identifier": {
354
- "version": "7.19.1",
354
+ "version": "7.22.5",
355
355
  "license": "MIT",
356
356
  "engines": {
357
357
  "node": ">=6.9.0"
358
358
  }
359
359
  },
360
360
  "node_modules/@babel/highlight": {
361
- "version": "7.18.6",
361
+ "version": "7.22.5",
362
362
  "license": "MIT",
363
363
  "dependencies": {
364
- "@babel/helper-validator-identifier": "^7.18.6",
364
+ "@babel/helper-validator-identifier": "^7.22.5",
365
365
  "chalk": "^2.0.0",
366
366
  "js-tokens": "^4.0.0"
367
367
  },
@@ -370,7 +370,7 @@
370
370
  }
371
371
  },
372
372
  "node_modules/@babel/runtime": {
373
- "version": "7.22.3",
373
+ "version": "7.22.5",
374
374
  "license": "MIT",
375
375
  "dependencies": {
376
376
  "regenerator-runtime": "^0.13.11"
@@ -620,7 +620,7 @@
620
620
  }
621
621
  },
622
622
  "node_modules/@types/node": {
623
- "version": "20.2.5",
623
+ "version": "20.3.0",
624
624
  "license": "MIT"
625
625
  },
626
626
  "node_modules/@types/normalize-package-data": {
@@ -818,7 +818,7 @@
818
818
  }
819
819
  },
820
820
  "node_modules/appium-adb": {
821
- "version": "9.11.5",
821
+ "version": "9.11.6",
822
822
  "license": "Apache-2.0",
823
823
  "dependencies": {
824
824
  "@appium/support": "^4.0.0",
@@ -848,7 +848,7 @@
848
848
  }
849
849
  },
850
850
  "node_modules/appium-android-driver": {
851
- "version": "5.13.2",
851
+ "version": "5.13.3",
852
852
  "license": "Apache-2.0",
853
853
  "dependencies": {
854
854
  "appium-adb": "^9.11.2",
@@ -886,7 +886,7 @@
886
886
  }
887
887
  },
888
888
  "node_modules/appium-chromedriver": {
889
- "version": "5.4.3",
889
+ "version": "5.4.4",
890
890
  "hasInstallScript": true,
891
891
  "license": "Apache-2.0",
892
892
  "dependencies": {
@@ -911,7 +911,7 @@
911
911
  }
912
912
  },
913
913
  "node_modules/appium-uiautomator2-server": {
914
- "version": "5.10.0",
914
+ "version": "5.11.1",
915
915
  "license": "Apache-2.0",
916
916
  "engines": {
917
917
  "node": ">=14",
@@ -2251,7 +2251,7 @@
2251
2251
  }
2252
2252
  },
2253
2253
  "node_modules/io.appium.settings": {
2254
- "version": "5.0.3",
2254
+ "version": "5.0.4",
2255
2255
  "license": "Apache-2.0",
2256
2256
  "engines": {
2257
2257
  "node": ">=14",
@@ -2812,7 +2812,7 @@
2812
2812
  "license": "MIT"
2813
2813
  },
2814
2814
  "node_modules/node-abi": {
2815
- "version": "3.43.0",
2815
+ "version": "3.45.0",
2816
2816
  "license": "MIT",
2817
2817
  "dependencies": {
2818
2818
  "semver": "^7.3.5"
@@ -3944,7 +3944,7 @@
3944
3944
  }
3945
3945
  },
3946
3946
  "node_modules/tslib": {
3947
- "version": "2.5.2",
3947
+ "version": "2.5.3",
3948
3948
  "extraneous": true,
3949
3949
  "license": "0BSD"
3950
3950
  },
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "automated testing",
8
8
  "android"
9
9
  ],
10
- "version": "2.25.2",
10
+ "version": "2.26.0",
11
11
  "author": "Appium Contributors",
12
12
  "license": "Apache-2.0",
13
13
  "repository": {
@@ -60,7 +60,7 @@
60
60
  "appium-adb": "^9.11.5",
61
61
  "appium-android-driver": "^5.13.0",
62
62
  "appium-chromedriver": "^5.3.1",
63
- "appium-uiautomator2-server": "^5.10.0",
63
+ "appium-uiautomator2-server": "^5.11.1",
64
64
  "asyncbox": "^2.3.1",
65
65
  "axios": "^1.x",
66
66
  "bluebird": "^3.5.1",
@@ -109,7 +109,7 @@
109
109
  "babel-plugin-source-map-support": "^2.2.0",
110
110
  "chai": "^4.1.0",
111
111
  "chai-as-promised": "^7.1.1",
112
- "conventional-changelog-conventionalcommits": "^5.0.0",
112
+ "conventional-changelog-conventionalcommits": "^6.0.0",
113
113
  "eslint-config-prettier": "^8.5.0",
114
114
  "fancy-log": "^2.0.0",
115
115
  "lint-staged": "^13.0.3",