appium-uiautomator2-driver 2.11.1 → 2.12.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 +7 -0
- package/README.md +3 -2
- package/build/lib/desired-caps.js +4 -1
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.js +21 -21
- package/build/lib/driver.js.map +1 -1
- package/lib/desired-caps.js +3 -0
- package/lib/driver.js +22 -21
- package/npm-shrinkwrap.json +41 -21
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [2.12.0](https://github.com/appium/appium-uiautomator2-driver/compare/v2.11.1...v2.12.0) (2022-12-08)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* Add forceAppLaunch capability ([#569](https://github.com/appium/appium-uiautomator2-driver/issues/569)) ([8af938e](https://github.com/appium/appium-uiautomator2-driver/commit/8af938e361ed7f2821756fd3466ea97761714104))
|
|
7
|
+
|
|
1
8
|
## [2.11.1](https://github.com/appium/appium-uiautomator2-driver/compare/v2.11.0...v2.11.1) (2022-12-01)
|
|
2
9
|
|
|
3
10
|
|
package/README.md
CHANGED
|
@@ -73,9 +73,10 @@ appium:intentCategory | Set an optional intent category to be applied when start
|
|
|
73
73
|
appium:intentAction | Set an optional intent action to be applied when starting the given appActivity by [Activity Manager](https://developer.android.com/studio/command-line/adb#am). Dfaults to `android.intent.action.MAIN`. Please use [mobile:startActivity](#mobile-startactivity) in case you don't set an explicit value.
|
|
74
74
|
appium:intentFlags | Set an optional intent flags to be applied when starting the given appActivity by [Activity Manager](https://developer.android.com/studio/command-line/adb#am). Defaults to `0x10200000` (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED flags). Please use [mobile:startActivity](#mobile-startactivity) in case you don't set an explicit value.
|
|
75
75
|
appium:optionalIntentArguments | Set an optional intent arguments to be applied when starting the given appActivity by [Activity Manager](https://developer.android.com/studio/command-line/adb#am)
|
|
76
|
-
appium:dontStopAppOnReset | Set it to `true` if you don't want the application to be restarted if it was already running. `
|
|
76
|
+
appium:dontStopAppOnReset | Set it to `true` if you don't want the application to be restarted if it was already running. If `appium:noReset` is falsy, then the app under test is going to be restarted if either this capability is falsy (the default behavior) or `appium:forceAppLaunch` is set to `true`.
|
|
77
|
+
appium:forceAppLaunch | Set it to `true` if you want the application under test to be always forcefully restarted on session startup even if `appium:noReset` is `true`, and the app was already running. If `noReset` is falsy, then the app under test is going to be restarted if either this capability set to `true` or `appium:dontStopAppOnReset` is falsy (the default behavior). Available since driver version 2.12
|
|
77
78
|
appium:autoLaunch | Whether to launch the application under test automatically (`true`, the default value) after a test starts
|
|
78
|
-
appium:autoGrantPermissions | Whether to grant all the requested application permissions automatically when a test starts(`true`). The targetSdkVersion in the application manifest must be greater or equal to 23 and the Android version on the device under test must be greater or equal to Android 6 (API level 23) to grant permissions. Applications whose targetSdkVersion is lower than or equal to 22 must be
|
|
79
|
+
appium:autoGrantPermissions | Whether to grant all the requested application permissions automatically when a test starts(`true`). The targetSdkVersion in the application manifest must be greater or equal to 23 and the Android version on the device under test must be greater or equal to Android 6 (API level 23) to grant permissions. Applications whose targetSdkVersion is lower than or equal to 22 must be reinstalled to grant permissions, for example, by setting the `appium:fullReset` capability as `true` for Android 6+ devices. If your app needs some special security permissions, like access to notifications or media recording, consider using [mobile: changePermissions](#mobile-changepermissions) extension with `appops` target. `false` by default
|
|
79
80
|
appium:otherApps | Allows to set one or more comma-separated paths to Android packages that are going to be installed along with the main application under test. This might be useful if the tested app has dependencies
|
|
80
81
|
appium:uninstallOtherPackages | Allows to set one or more comma-separated package identifiers to be uninstalled from the device before a test starts
|
|
81
82
|
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
|
|
@@ -58,10 +58,13 @@ let uiautomatorCapConstraints = {
|
|
|
58
58
|
},
|
|
59
59
|
disableSuppressAccessibilityService: {
|
|
60
60
|
isBoolean: true
|
|
61
|
+
},
|
|
62
|
+
forceAppLaunch: {
|
|
63
|
+
isBoolean: true
|
|
61
64
|
}
|
|
62
65
|
};
|
|
63
66
|
let desiredCapConstraints = {};
|
|
64
67
|
Object.assign(desiredCapConstraints, uiautomatorCapConstraints, _appiumAndroidDriver.commonCapConstraints);
|
|
65
68
|
var _default = desiredCapConstraints;
|
|
66
69
|
exports.default = _default;
|
|
67
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
70
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1aWF1dG9tYXRvckNhcENvbnN0cmFpbnRzIiwiYXBwIiwicHJlc2VuY2UiLCJpc1N0cmluZyIsImF1dG9tYXRpb25OYW1lIiwiYnJvd3Nlck5hbWUiLCJsYXVuY2hUaW1lb3V0IiwiaXNOdW1iZXIiLCJza2lwVW5sb2NrIiwiaXNCb29sZWFuIiwidWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCIsInVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0IiwidWlhdXRvbWF0b3IyU2VydmVyUmVhZFRpbWVvdXQiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwic3lzdGVtUG9ydCIsIm1qcGVnU2VydmVyUG9ydCIsIm1qcGVnU2NyZWVuc2hvdFVybCIsInNraXBTZXJ2ZXJJbnN0YWxsYXRpb24iLCJhbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQiLCJ1c2VyUHJvZmlsZSIsImFwcFdhaXRGb3JMYXVuY2giLCJkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSIsImZvcmNlQXBwTGF1bmNoIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwiT2JqZWN0IiwiYXNzaWduIiwiY29tbW9uQ2FwQ29uc3RyYWludHMiXSwic291cmNlcyI6WyIuLi8uLi9saWIvZGVzaXJlZC1jYXBzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbW1vbkNhcENvbnN0cmFpbnRzIH0gZnJvbSAnYXBwaXVtLWFuZHJvaWQtZHJpdmVyJztcblxubGV0IHVpYXV0b21hdG9yQ2FwQ29uc3RyYWludHMgPSB7XG4gIGFwcDoge1xuICAgIHByZXNlbmNlOiB0cnVlLFxuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGF1dG9tYXRpb25OYW1lOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgYnJvd3Nlck5hbWU6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBsYXVuY2hUaW1lb3V0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgc2tpcFVubG9jazoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICB1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgdWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICB1aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIGRpc2FibGVXaW5kb3dBbmltYXRpb246IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgc3lzdGVtUG9ydDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIG1qcGVnU2VydmVyUG9ydDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIG1qcGVnU2NyZWVuc2hvdFVybDoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIHNraXBTZXJ2ZXJJbnN0YWxsYXRpb246IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50OiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgdXNlclByb2ZpbGU6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBhcHBXYWl0Rm9yTGF1bmNoOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGZvcmNlQXBwTGF1bmNoOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH1cbn07XG5cbmxldCBkZXNpcmVkQ2FwQ29uc3RyYWludHMgPSB7fTtcbk9iamVjdC5hc3NpZ24oXG4gIGRlc2lyZWRDYXBDb25zdHJhaW50cyxcbiAgdWlhdXRvbWF0b3JDYXBDb25zdHJhaW50cyxcbiAgY29tbW9uQ2FwQ29uc3RyYWludHNcbik7XG5cbmV4cG9ydCBkZWZhdWx0IGRlc2lyZWRDYXBDb25zdHJhaW50cztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBRUEsSUFBSUEseUJBQXlCLEdBQUc7RUFDOUJDLEdBQUcsRUFBRTtJQUNIQyxRQUFRLEVBQUUsSUFBSTtJQUNkQyxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RDLGNBQWMsRUFBRTtJQUNkRCxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RFLFdBQVcsRUFBRTtJQUNYRixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RHLGFBQWEsRUFBRTtJQUNiQyxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RDLFVBQVUsRUFBRTtJQUNWQyxTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0RDLCtCQUErQixFQUFFO0lBQy9CSCxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RJLGdDQUFnQyxFQUFFO0lBQ2hDSixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RLLDZCQUE2QixFQUFFO0lBQzdCTCxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RNLHNCQUFzQixFQUFFO0lBQ3RCSixTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0RLLFVBQVUsRUFBRTtJQUNWUCxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RRLGVBQWUsRUFBRTtJQUNmUixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RTLGtCQUFrQixFQUFFO0lBQ2xCYixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RjLHNCQUFzQixFQUFFO0lBQ3RCUixTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0RTLHdCQUF3QixFQUFFO0lBQ3hCZixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RnQixXQUFXLEVBQUU7SUFDWFosUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEYSxnQkFBZ0IsRUFBRTtJQUNoQlgsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEWSxtQ0FBbUMsRUFBRTtJQUNuQ1osU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEYSxjQUFjLEVBQUU7SUFDZGIsU0FBUyxFQUFFO0VBQ2I7QUFDRixDQUFDO0FBRUQsSUFBSWMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBQzlCQyxNQUFNLENBQUNDLE1BQU0sQ0FDWEYscUJBQXFCLEVBQ3JCdkIseUJBQXlCLEVBQ3pCMEIseUNBQW9CLENBQ3JCO0FBQUMsZUFFYUgscUJBQXFCO0FBQUEifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"desired-caps.js","names":["uiautomatorCapConstraints","app","presence","isString","automationName","browserName","launchTimeout","isNumber","skipUnlock","isBoolean","uiautomator2ServerLaunchTimeout","uiautomator2ServerInstallTimeout","uiautomator2ServerReadTimeout","disableWindowAnimation","systemPort","mjpegServerPort","mjpegScreenshotUrl","skipServerInstallation","androidCoverageEndIntent","userProfile","appWaitForLaunch","disableSuppressAccessibilityService","desiredCapConstraints","Object","assign","commonCapConstraints"],"sources":["../../lib/desired-caps.js"],"sourcesContent":["import { commonCapConstraints } from 'appium-android-driver';\n\nlet uiautomatorCapConstraints = {\n app: {\n presence: true,\n isString: true\n },\n automationName: {\n isString: true\n },\n browserName: {\n isString: true\n },\n launchTimeout: {\n isNumber: true\n },\n skipUnlock: {\n isBoolean: true\n },\n uiautomator2ServerLaunchTimeout: {\n isNumber: true\n },\n uiautomator2ServerInstallTimeout: {\n isNumber: true\n },\n uiautomator2ServerReadTimeout: {\n isNumber: true\n },\n disableWindowAnimation: {\n isBoolean: true\n },\n systemPort: {\n isNumber: true\n },\n mjpegServerPort: {\n isNumber: true\n },\n mjpegScreenshotUrl: {\n isString: true\n },\n skipServerInstallation: {\n isBoolean: true\n },\n androidCoverageEndIntent: {\n isString: true\n },\n userProfile: {\n isNumber: true\n },\n appWaitForLaunch: {\n isBoolean: true\n },\n disableSuppressAccessibilityService: {\n isBoolean: true\n }\n};\n\nlet desiredCapConstraints = {};\nObject.assign(\n desiredCapConstraints,\n uiautomatorCapConstraints,\n commonCapConstraints\n);\n\nexport default desiredCapConstraints;\n"],"mappings":";;;;;;;AAAA;AAEA,IAAIA,yBAAyB,GAAG;EAC9BC,GAAG,EAAE;IACHC,QAAQ,EAAE,IAAI;IACdC,QAAQ,EAAE;EACZ,CAAC;EACDC,cAAc,EAAE;IACdD,QAAQ,EAAE;EACZ,CAAC;EACDE,WAAW,EAAE;IACXF,QAAQ,EAAE;EACZ,CAAC;EACDG,aAAa,EAAE;IACbC,QAAQ,EAAE;EACZ,CAAC;EACDC,UAAU,EAAE;IACVC,SAAS,EAAE;EACb,CAAC;EACDC,+BAA+B,EAAE;IAC/BH,QAAQ,EAAE;EACZ,CAAC;EACDI,gCAAgC,EAAE;IAChCJ,QAAQ,EAAE;EACZ,CAAC;EACDK,6BAA6B,EAAE;IAC7BL,QAAQ,EAAE;EACZ,CAAC;EACDM,sBAAsB,EAAE;IACtBJ,SAAS,EAAE;EACb,CAAC;EACDK,UAAU,EAAE;IACVP,QAAQ,EAAE;EACZ,CAAC;EACDQ,eAAe,EAAE;IACfR,QAAQ,EAAE;EACZ,CAAC;EACDS,kBAAkB,EAAE;IAClBb,QAAQ,EAAE;EACZ,CAAC;EACDc,sBAAsB,EAAE;IACtBR,SAAS,EAAE;EACb,CAAC;EACDS,wBAAwB,EAAE;IACxBf,QAAQ,EAAE;EACZ,CAAC;EACDgB,WAAW,EAAE;IACXZ,QAAQ,EAAE;EACZ,CAAC;EACDa,gBAAgB,EAAE;IAChBX,SAAS,EAAE;EACb,CAAC;EACDY,mCAAmC,EAAE;IACnCZ,SAAS,EAAE;EACb;AACF,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"desired-caps.js","names":["uiautomatorCapConstraints","app","presence","isString","automationName","browserName","launchTimeout","isNumber","skipUnlock","isBoolean","uiautomator2ServerLaunchTimeout","uiautomator2ServerInstallTimeout","uiautomator2ServerReadTimeout","disableWindowAnimation","systemPort","mjpegServerPort","mjpegScreenshotUrl","skipServerInstallation","androidCoverageEndIntent","userProfile","appWaitForLaunch","disableSuppressAccessibilityService","forceAppLaunch","desiredCapConstraints","Object","assign","commonCapConstraints"],"sources":["../../lib/desired-caps.js"],"sourcesContent":["import { commonCapConstraints } from 'appium-android-driver';\n\nlet uiautomatorCapConstraints = {\n app: {\n presence: true,\n isString: true\n },\n automationName: {\n isString: true\n },\n browserName: {\n isString: true\n },\n launchTimeout: {\n isNumber: true\n },\n skipUnlock: {\n isBoolean: true\n },\n uiautomator2ServerLaunchTimeout: {\n isNumber: true\n },\n uiautomator2ServerInstallTimeout: {\n isNumber: true\n },\n uiautomator2ServerReadTimeout: {\n isNumber: true\n },\n disableWindowAnimation: {\n isBoolean: true\n },\n systemPort: {\n isNumber: true\n },\n mjpegServerPort: {\n isNumber: true\n },\n mjpegScreenshotUrl: {\n isString: true\n },\n skipServerInstallation: {\n isBoolean: true\n },\n androidCoverageEndIntent: {\n isString: true\n },\n userProfile: {\n isNumber: true\n },\n appWaitForLaunch: {\n isBoolean: true\n },\n disableSuppressAccessibilityService: {\n isBoolean: true\n },\n forceAppLaunch: {\n isBoolean: true\n }\n};\n\nlet desiredCapConstraints = {};\nObject.assign(\n desiredCapConstraints,\n uiautomatorCapConstraints,\n commonCapConstraints\n);\n\nexport default desiredCapConstraints;\n"],"mappings":";;;;;;;AAAA;AAEA,IAAIA,yBAAyB,GAAG;EAC9BC,GAAG,EAAE;IACHC,QAAQ,EAAE,IAAI;IACdC,QAAQ,EAAE;EACZ,CAAC;EACDC,cAAc,EAAE;IACdD,QAAQ,EAAE;EACZ,CAAC;EACDE,WAAW,EAAE;IACXF,QAAQ,EAAE;EACZ,CAAC;EACDG,aAAa,EAAE;IACbC,QAAQ,EAAE;EACZ,CAAC;EACDC,UAAU,EAAE;IACVC,SAAS,EAAE;EACb,CAAC;EACDC,+BAA+B,EAAE;IAC/BH,QAAQ,EAAE;EACZ,CAAC;EACDI,gCAAgC,EAAE;IAChCJ,QAAQ,EAAE;EACZ,CAAC;EACDK,6BAA6B,EAAE;IAC7BL,QAAQ,EAAE;EACZ,CAAC;EACDM,sBAAsB,EAAE;IACtBJ,SAAS,EAAE;EACb,CAAC;EACDK,UAAU,EAAE;IACVP,QAAQ,EAAE;EACZ,CAAC;EACDQ,eAAe,EAAE;IACfR,QAAQ,EAAE;EACZ,CAAC;EACDS,kBAAkB,EAAE;IAClBb,QAAQ,EAAE;EACZ,CAAC;EACDc,sBAAsB,EAAE;IACtBR,SAAS,EAAE;EACb,CAAC;EACDS,wBAAwB,EAAE;IACxBf,QAAQ,EAAE;EACZ,CAAC;EACDgB,WAAW,EAAE;IACXZ,QAAQ,EAAE;EACZ,CAAC;EACDa,gBAAgB,EAAE;IAChBX,SAAS,EAAE;EACb,CAAC;EACDY,mCAAmC,EAAE;IACnCZ,SAAS,EAAE;EACb,CAAC;EACDa,cAAc,EAAE;IACdb,SAAS,EAAE;EACb;AACF,CAAC;AAED,IAAIc,qBAAqB,GAAG,CAAC,CAAC;AAC9BC,MAAM,CAACC,MAAM,CACXF,qBAAqB,EACrBvB,yBAAyB,EACzB0B,yCAAoB,CACrB;AAAC,eAEaH,qBAAqB;AAAA"}
|
package/build/lib/driver.js
CHANGED
|
@@ -346,27 +346,27 @@ class AndroidUiautomator2Driver extends _driver.BaseDriver {
|
|
|
346
346
|
if (this.caps.androidCoverage) {
|
|
347
347
|
this.log.info(`androidCoverage is configured. ` + ` Starting instrumentation of '${this.caps.androidCoverage}'...`);
|
|
348
348
|
await this.adb.androidCoverage(this.caps.androidCoverage, appWaitPackage, appWaitActivity);
|
|
349
|
-
|
|
350
|
-
if (this.opts.noReset && (await this.adb.processExists(this.opts.appPackage))) {
|
|
351
|
-
this.log.info(`'${this.opts.appPackage}' is already running`);
|
|
352
|
-
return;
|
|
353
|
-
}
|
|
354
|
-
await this.adb.startApp({
|
|
355
|
-
pkg: this.opts.appPackage,
|
|
356
|
-
activity: this.opts.appActivity,
|
|
357
|
-
action: this.opts.intentAction || 'android.intent.action.MAIN',
|
|
358
|
-
category: this.opts.intentCategory || 'android.intent.category.LAUNCHER',
|
|
359
|
-
flags: this.opts.intentFlags || '0x10200000',
|
|
360
|
-
waitPkg: this.opts.appWaitPackage,
|
|
361
|
-
waitActivity: this.opts.appWaitActivity,
|
|
362
|
-
waitForLaunch: this.opts.appWaitForLaunch,
|
|
363
|
-
waitDuration: this.opts.appWaitDuration,
|
|
364
|
-
optionalIntentArguments: this.opts.optionalIntentArguments,
|
|
365
|
-
stopApp: !this.opts.dontStopAppOnReset,
|
|
366
|
-
retry: true,
|
|
367
|
-
user: this.opts.userProfile
|
|
368
|
-
});
|
|
349
|
+
return;
|
|
369
350
|
}
|
|
351
|
+
if (this.opts.noReset && !this.opts.forceAppLaunch && (await this.adb.processExists(this.opts.appPackage))) {
|
|
352
|
+
this.log.info(`'${this.opts.appPackage}' is already running and noReset is enabled. ` + `Set forceAppLaunch capability to true if the app must be forcefully restarted on session startup.`);
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
await this.adb.startApp({
|
|
356
|
+
pkg: this.opts.appPackage,
|
|
357
|
+
activity: this.opts.appActivity,
|
|
358
|
+
action: this.opts.intentAction || 'android.intent.action.MAIN',
|
|
359
|
+
category: this.opts.intentCategory || 'android.intent.category.LAUNCHER',
|
|
360
|
+
flags: this.opts.intentFlags || '0x10200000',
|
|
361
|
+
waitPkg: this.opts.appWaitPackage,
|
|
362
|
+
waitActivity: this.opts.appWaitActivity,
|
|
363
|
+
waitForLaunch: this.opts.appWaitForLaunch,
|
|
364
|
+
waitDuration: this.opts.appWaitDuration,
|
|
365
|
+
optionalIntentArguments: this.opts.optionalIntentArguments,
|
|
366
|
+
stopApp: this.opts.forceAppLaunch || !this.opts.dontStopAppOnReset,
|
|
367
|
+
retry: true,
|
|
368
|
+
user: this.opts.userProfile
|
|
369
|
+
});
|
|
370
370
|
}
|
|
371
371
|
async deleteSession() {
|
|
372
372
|
this.log.debug('Deleting UiAutomator2 session');
|
|
@@ -524,4 +524,4 @@ for (let [cmd, fn] of _lodash.default.toPairs(_index.default)) {
|
|
|
524
524
|
}
|
|
525
525
|
var _default = AndroidUiautomator2Driver;
|
|
526
526
|
exports.default = _default;
|
|
527
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJoZWxwZXJzIiwiT2JqZWN0IiwiYXNzaWduIiwidWlhdXRvbWF0b3IySGVscGVycyIsImFuZHJvaWRIZWxwZXJzIiwiREVWSUNFX1BPUlRfUkFOR0UiLCJERVZJQ0VfUE9SVF9BTExPQ0FUSU9OX0dVQVJEIiwidXRpbCIsImdldExvY2tGaWxlR3VhcmQiLCJwYXRoIiwicmVzb2x2ZSIsIm9zIiwidG1wZGlyIiwidGltZW91dCIsInRyeVJlY292ZXJ5IiwiREVWSUNFX1BPUlQiLCJNSlBFR19TRVJWRVJfREVWSUNFX1BPUlQiLCJMT0NBTEhPU1RfSVA0IiwiTk9fUFJPWFkiLCJSZWdFeHAiLCJDSFJPTUVfTk9fUFJPWFkiLCJNRU1PSVpFRF9GVU5DVElPTlMiLCJBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIiwiQmFzZURyaXZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsInNoZWxsIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJ1aWF1dG9tYXRvcjIiLCJqd3BQcm94eUFjdGl2ZSIsImRlZmF1bHRJTUUiLCJqd3BQcm94eUF2b2lkIiwiYXBrU3RyaW5ncyIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwiYWxsb3dJbnZpc2libGVFbGVtZW50cyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJmbiIsIl8iLCJtZW1vaXplIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJjcmVhdGVTZXNzaW9uIiwiYXJncyIsInNlc3Npb25JZCIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImRlZmF1bHRPcHRzIiwiZnVsbFJlc2V0IiwiYXV0b0xhdW5jaCIsImFkYlBvcnQiLCJERUZBVUxUX0FEQl9QT1JUIiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiZGVmYXVsdHMiLCJpc0Nocm9tZVNlc3Npb24iLCJsb2ciLCJpbmZvIiwicGtnIiwiYWN0aXZpdHkiLCJnZXRDaHJvbWVQa2ciLCJicm93c2VyTmFtZSIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsInJlYm9vdCIsInNldEF2ZEZyb21DYXBhYmlsaXRpZXMiLCJhcHAiLCJjb25maWd1cmVBcHAiLCJBUEtfRVhURU5TSU9OIiwiQVBLU19FWFRFTlNJT04iLCJjaGVja0FwcFByZXNlbnQiLCJzdGFydFVpQXV0b21hdG9yMlNlc3Npb24iLCJmaWxsRGV2aWNlRGV0YWlscyIsIm1qcGVnU2NyZWVuc2hvdFVybCIsIm1qcGVnU3RyZWFtIiwibWpwZWciLCJNSnBlZ1N0cmVhbSIsInN0YXJ0IiwiZSIsImRlbGV0ZVNlc3Npb24iLCJwaXhlbFJhdGlvIiwiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsInN0YXRCYXJIZWlnaHQiLCJnZXRTdGF0dXNCYXJIZWlnaHQiLCJ2aWV3cG9ydFJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJkcml2ZXJEYXRhIiwiZ2V0U2Vzc2lvbiIsInNlc3Npb25EYXRhIiwiZGVidWciLCJ1aWEyRGF0YSIsImp3cHJveHkiLCJjb21tYW5kIiwiaXNFbXVsYXRvciIsImFkYiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImFsbG9jYXRlU3lzdGVtUG9ydCIsImZvcndhcmRQb3J0IiwibG9jYWxQb3J0IiwiY2hlY2tQb3J0U3RhdHVzIiwic3lzdGVtUG9ydCIsIl9oYXNTeXN0ZW1Qb3J0SW5DYXBzIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwicmVsZWFzZVN5c3RlbVBvcnQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0IiwibWpwZWdTZXJ2ZXJQb3J0IiwicmVsZWFzZU1qcGVnU2VydmVyUG9ydCIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJjcmVhdGVBREIiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwic2V0SGlkZGVuQXBpUG9saWN5IiwiaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IiLCJoYXNWYWx1ZSIsImdwc0VuYWJsZWQiLCJ0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIiwid2FybiIsImFwcEluZm8iLCJnZXRMYXVuY2hJbmZvIiwiY3VyRGV2aWNlSWQiLCJkZXZpY2VVRElEIiwiaW5pdERldmljZSIsImluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwiaXNBbmltYXRpb25PbiIsInNldEFuaW1hdGlvblN0YXRlIiwiX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkIiwiaW5pdEFVVCIsInN0YXJ0U2Vzc2lvbiIsImFkZERldmljZUluZm9Ub0NhcHMiLCJza2lwVW5sb2NrIiwidW5sb2NrIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwiZW5zdXJlQXBwU3RhcnRzIiwib3JpZW50YXRpb24iLCJzZXRPcmllbnRhdGlvbiIsImF1dG9XZWJ2aWV3Iiwidmlld05hbWUiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJhdXRvV2Vidmlld1RpbWVvdXQiLCJyZXRyeUludGVydmFsIiwic2V0Q29udGV4dCIsImFwaVZlcnNpb24iLCJtYW51ZmFjdHVyZXIiLCJtb2RlbCIsInJlYWxEaXNwbGF5U2l6ZSIsImRpc3BsYXlEZW5zaXR5IiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsImRldmljZUFwaUxldmVsIiwicGFyc2VJbnQiLCJkZXZpY2VTY3JlZW5TaXplIiwiZGV2aWNlU2NyZWVuRGVuc2l0eSIsImRldmljZU1vZGVsIiwiZGV2aWNlTWFudWZhY3R1cmVyIiwidWlhdXRvbWF0b3IyT3B0cyIsImhvc3QiLCJyZW1vdGVBZGJIb3N0IiwiZGV2aWNlUG9ydCIsImFwayIsInRtcERpciIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicmVhZFRpbWVvdXQiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCIsIlVpQXV0b21hdG9yMlNlcnZlciIsInByb3h5UmVxUmVzIiwicHJveHlDb21tYW5kIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsImluc3RhbGxTZXJ2ZXJBcGsiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCIsImFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJzdGRlcnIiLCJtZXNzYWdlIiwidW5pbnN0YWxsT3RoZXJQYWNrYWdlcyIsInBhcnNlQXJyYXkiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwibWFwIiwiaW5zdGFsbE90aGVyQXBrcyIsIm5vUmVzZXQiLCJpc0FwcEluc3RhbGxlZCIsIm5vU2lnbiIsImNoZWNrQXBrQ2VydCIsInJlcXVpcmVEZWZhdWx0Q2VydCIsInNpZ25BcHAiLCJza2lwVW5pbnN0YWxsIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbEFwayIsImZhc3RSZXNldCIsInJlc2V0QXBwIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJhbmRyb2lkQ292ZXJhZ2UiLCJwcm9jZXNzRXhpc3RzIiwic3RhcnRBcHAiLCJhY3Rpb24iLCJpbnRlbnRBY3Rpb24iLCJjYXRlZ29yeSIsImludGVudENhdGVnb3J5IiwiZmxhZ3MiLCJpbnRlbnRGbGFncyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJ3YWl0Rm9yTGF1bmNoIiwiYXBwV2FpdEZvckxhdW5jaCIsIndhaXREdXJhdGlvbiIsImFwcFdhaXREdXJhdGlvbiIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic3RvcEFwcCIsImRvbnRTdG9wQXBwT25SZXNldCIsInJldHJ5IiwidXNlciIsInVzZXJQcm9maWxlIiwic2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzIiwiaXNFbXB0eSIsIl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzIiwic3RvcFJlY29yZGluZ1NjcmVlbiIsIm1vYmlsZUlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZyIsIm1vYmlsZVN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmciLCJfc2NyZWVuU3RyZWFtaW5nUHJvcHMiLCJtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwic3RvcENocm9tZWRyaXZlclByb3hpZXMiLCJlcnIiLCJ0YXNrIiwiaWduIiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsInNldElNRSIsImVuZEFuZHJvaWRDb3ZlcmFnZSIsImFuZHJvaWRDb3ZlcmFnZUVuZEludGVudCIsImJyb2FkY2FzdCIsImZvcmNlU3RvcCIsInN0b3BMb2djYXQiLCJlcnJvciIsInNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kiLCJhdmROYW1lIiwia2lsbEVtdWxhdG9yIiwic3RvcCIsImZzIiwiZXhpc3RzIiwid3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QiLCJ3cmFwcGVkIiwicmVzdGFydCIsInByb3h5QWN0aXZlIiwiY2FuUHJveHkiLCJnZXRQcm94eUF2b2lkTGlzdCIsIm5hdGl2ZVdlYlNjcmVlbnNob3QiLCJpc0Nocm9tZUJyb3dzZXIiLCJjbWQiLCJ0b1BhaXJzIiwiYW5kcm9pZENvbW1hbmRzIiwicHJvdG90eXBlIiwiY29tbWFuZHMiXSwic291cmNlcyI6WyIuLi8uLi9saWIvZHJpdmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBEZXZpY2VTZXR0aW5ncyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHtcbiAgVWlBdXRvbWF0b3IyU2VydmVyLCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRFxufSBmcm9tICcuL3VpYXV0b21hdG9yMic7XG5pbXBvcnQgeyBmcywgdXRpbCwgbWpwZWcgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMvaW5kZXgnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHVpYXV0b21hdG9yMkhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7XG4gIGFuZHJvaWRIZWxwZXJzLCBhbmRyb2lkQ29tbWFuZHMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSURcbn0gZnJvbSAnYXBwaXVtLWFuZHJvaWQtZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ2FwQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UsIGNoZWNrUG9ydFN0YXR1cyB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OIH0gZnJvbSAnLi9leHRlbnNpb25zJztcblxuXG5jb25zdCBoZWxwZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdWlhdXRvbWF0b3IySGVscGVycywgYW5kcm9pZEhlbHBlcnMpO1xuXG4vLyBUaGUgcmFuZ2Ugb2YgcG9ydHMgd2UgY2FuIHVzZSBvbiB0aGUgc3lzdGVtIGZvciBjb21tdW5pY2F0aW5nIHRvIHRoZVxuLy8gVWlBdXRvbWF0b3IyIEhUVFAgc2VydmVyIG9uIHRoZSBkZXZpY2VcbmNvbnN0IERFVklDRV9QT1JUX1JBTkdFID0gWzgyMDAsIDgyOTldO1xuXG4vLyBUaGUgZ3VhcmQgaXMgbmVlZGVkIHRvIGF2b2lkIGR5bmFtaWMgc3lzdGVtIHBvcnQgYWxsb2NhdGlvbiBjb25mbGljdHMgZm9yXG4vLyBwYXJhbGxlbCBkcml2ZXIgc2Vzc2lvbnNcbmNvbnN0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQoXG4gIHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ3VpYTJfZGV2aWNlX3BvcnRfZ3VhcmQnKSxcbiAge3RpbWVvdXQ6IDI1LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5cbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCBVaUF1dG9tYXRvcjIgbGlzdGVucyB0byBvbiB0aGUgZGV2aWNlLiBXZSB3aWxsIGZvcndhcmRcbi8vIG9uZSBvZiB0aGUgcG9ydHMgYWJvdmUgb24gdGhlIHN5c3RlbSB0byB0aGlzIHBvcnQgb24gdGhlIGRldmljZS5cbmNvbnN0IERFVklDRV9QT1JUID0gNjc5MDtcbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCB0aGUgVWlBdXRvbWF0b3IyIE1KUEVHIHNlcnZlciBsaXN0ZW5zIHRvIG9uIHRoZSBkZXZpY2UuXG4vLyBXZSB3aWxsIGZvcndhcmQgb25lIG9mIHRoZSBwb3J0cyBhYm92ZSBvbiB0aGUgc3lzdGVtIHRvIHRoaXMgcG9ydCBvbiB0aGVcbi8vIGRldmljZS5cbmNvbnN0IE1KUEVHX1NFUlZFUl9ERVZJQ0VfUE9SVCA9IDc4MTA7XG5cbmNvbnN0IExPQ0FMSE9TVF9JUDQgPSAnMTI3LjAuMC4xJztcblxuLy8gTk9fUFJPWFkgY29udGFpbnMgdGhlIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBVaUF1dG9tYXRvcjIgc2VydmVyLlxuLy8gVE9ETzogIEFkZCB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gVWlBdXRvbWF0b3IyIHNlcnZlci5cbi8vIFRPRE86IE5lZWQgdG8gc2VncmVnYXRlIHRoZSBwYXRocyBiZXR0ZXIgd2F5IHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hlcmV2ZXIgYXBwbGljYWJsZS5cbi8vIChOb3Qgc2VncmVnYXRpbmcgcmlnaHQgYXdheSBiZWNhdXNlIG1vcmUgcGF0aHMgdG8gYmUgYWRkZWQgaW4gdGhlIE5PX1BST1hZIGxpc3QpXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vKD8hLiovKScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnRfW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FsZXJ0L1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvY3VycmVudF9hY3Rpdml0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL2N1cnJlbnRfcGFja2FnZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9hdHRyaWJ1dGUnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZGlzcGxheWVkJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2VuYWJsZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvbG9jYXRpb25faW5fdmlldycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9uYW1lJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3NjcmVlbnNob3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvc2VsZWN0ZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9jYXRpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL1teL10rX2FsZXJ0JCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FjdGlvbnMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hbGVydC9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcC9bXi9dJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL3N0YXJ0X2FjdGl2aXR5JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9jb21wYXJlX2ltYWdlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvKD8hc2V0X2NsaXBib2FyZClbXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9lbGVtZW50L1teL10rL3JlcGxhY2VfdmFsdWUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZWxlbWVudC9bXi9dKy92YWx1ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9nZXRQZXJmb3JtYW5jZURhdGEnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vcGVyZm9ybWFuY2VEYXRhL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2V4ZWN1dGVfZHJpdmVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0YXJ0X3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RvcF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtLy4qZXZlbnQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2tleXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZV9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZycpXSxcbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy93aW5kb3cvcmVjdCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvYXN5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZycpXSxcbl07XG5cbi8vIFRoaXMgaXMgYSBzZXQgb2YgbWV0aG9kcyBhbmQgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIENocm9tZWRyaXZlci5cbmNvbnN0IENIUk9NRV9OT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3JlY3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG5cbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gbWFrZSB0aGUgbW9iaWxlOiBjb21tYW5kcyB3b3JraW5nIGluIHdlYiBjb250ZXh0XG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcblxuICAvLyBNSlNPTldQIGNvbW1hbmRzXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZy90eXBlcyQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2ckJyldLFxuICAvLyBXM0MgY29tbWFuZHNcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cvdHlwZXMkJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2ckJyldLFxuXTtcblxuY29uc3QgTUVNT0laRURfRlVOQ1RJT05TID0gW1xuICAnZ2V0U3RhdHVzQmFySGVpZ2h0JyxcbiAgJ2dldERldmljZVBpeGVsUmF0aW8nLFxuXTtcblxuY2xhc3MgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9LCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgLy8gYHNoZWxsYCBvdmVyd3JpdGVzIGFkYi5zaGVsbCwgc28gcmVtb3ZlXG4gICAgZGVsZXRlIG9wdHMuc2hlbGw7XG5cbiAgICBzdXBlcihvcHRzLCBzaG91bGRWYWxpZGF0ZUNhcHMpO1xuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAneHBhdGgnLFxuICAgICAgJ2lkJyxcbiAgICAgICdjbGFzcyBuYW1lJyxcbiAgICAgICdhY2Nlc3NpYmlsaXR5IGlkJyxcbiAgICAgICdjc3Mgc2VsZWN0b3InLFxuICAgICAgJy1hbmRyb2lkIHVpYXV0b21hdG9yJ1xuICAgIF07XG4gICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSBkZXNpcmVkQ2FwQ29uc3RyYWludHM7XG4gICAgdGhpcy51aWF1dG9tYXRvcjIgPSBudWxsO1xuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLmRlZmF1bHRJTUUgPSBudWxsO1xuICAgIHRoaXMuandwUHJveHlBdm9pZCA9IE5PX1BST1hZO1xuICAgIHRoaXMuYXBrU3RyaW5ncyA9IHt9OyAvLyBtYXAgb2YgbGFuZ3VhZ2UgLT4gc3RyaW5ncyBvYmpcblxuICAgIHRoaXMuc2V0dGluZ3MgPSBuZXcgRGV2aWNlU2V0dGluZ3Moe2lnbm9yZVVuaW1wb3J0YW50Vmlld3M6IGZhbHNlLCBhbGxvd0ludmlzaWJsZUVsZW1lbnRzOiBmYWxzZX0sXG4gICAgICAgIHRoaXMub25TZXR0aW5nc1VwZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICAvLyBoYW5kbGUgd2VidmlldyBtZWNoYW5pY3MgZnJvbSBBbmRyb2lkRHJpdmVyXG4gICAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMgPSB7fTtcblxuICAgIC8vIG1lbW9pemUgZnVuY3Rpb25zIGhlcmUsIHNvIHRoYXQgdGhleSBhcmUgZG9uZSBvbiBhIHBlci1pbnN0YW5jZSBiYXNpc1xuICAgIGZvciAoY29uc3QgZm4gb2YgTUVNT0laRURfRlVOQ1RJT05TKSB7XG4gICAgICB0aGlzW2ZuXSA9IF8ubWVtb2l6ZSh0aGlzW2ZuXSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVEZXNpcmVkQ2FwcyAoY2Fwcykge1xuICAgIHJldHVybiBzdXBlci52YWxpZGF0ZURlc2lyZWRDYXBzKGNhcHMpICYmIGFuZHJvaWRIZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcyk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXNzaW9uICguLi5hcmdzKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRPRE8gaGFuZGxlIG90aGVyU2Vzc2lvbkRhdGEgZm9yIG11bHRpcGxlIHNlc3Npb25zXG4gICAgICBsZXQgW3Nlc3Npb25JZCwgY2Fwc10gPSBhd2FpdCBzdXBlci5jcmVhdGVTZXNzaW9uKC4uLmFyZ3MpO1xuXG4gICAgICBsZXQgc2VydmVyRGV0YWlscyA9IHtcbiAgICAgICAgcGxhdGZvcm06ICdMSU5VWCcsXG4gICAgICAgIHdlYlN0b3JhZ2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgdGFrZXNTY3JlZW5zaG90OiB0cnVlLFxuICAgICAgICBqYXZhc2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZGF0YWJhc2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkOiB0cnVlLFxuICAgICAgICBsb2NhdGlvbkNvbnRleHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgd2FybmluZ3M6IHt9LFxuICAgICAgICBkZXNpcmVkOiB0aGlzLmNhcHMsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNhcHMgPSBPYmplY3QuYXNzaWduKHNlcnZlckRldGFpbHMsIHRoaXMuY2Fwcyk7XG5cbiAgICAgIHRoaXMuY3VyQ29udGV4dCA9IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG5cbiAgICAgIGxldCBkZWZhdWx0T3B0cyA9IHtcbiAgICAgICAgZnVsbFJlc2V0OiBmYWxzZSxcbiAgICAgICAgYXV0b0xhdW5jaDogdHJ1ZSxcbiAgICAgICAgYWRiUG9ydDogREVGQVVMVF9BREJfUE9SVCxcbiAgICAgICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0OiA5MDAwMFxuICAgICAgfTtcbiAgICAgIF8uZGVmYXVsdHModGhpcy5vcHRzLCBkZWZhdWx0T3B0cyk7XG5cbiAgICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKFwiV2UncmUgZ29pbmcgdG8gcnVuIGEgQ2hyb21lLWJhc2VkIHNlc3Npb25cIik7XG4gICAgICAgIGxldCB7cGtnLCBhY3Rpdml0eX0gPSBoZWxwZXJzLmdldENocm9tZVBrZyh0aGlzLm9wdHMuYnJvd3Nlck5hbWUpO1xuICAgICAgICB0aGlzLm9wdHMuYXBwUGFja2FnZSA9IHRoaXMuY2Fwcy5hcHBQYWNrYWdlID0gcGtnO1xuICAgICAgICB0aGlzLm9wdHMuYXBwQWN0aXZpdHkgPSB0aGlzLmNhcHMuYXBwQWN0aXZpdHkgPSBhY3Rpdml0eTtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgQ2hyb21lLXR5cGUgcGFja2FnZSBhbmQgYWN0aXZpdHkgYXJlICR7cGtnfSBhbmQgJHthY3Rpdml0eX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgdGhpcy5zZXRBdmRGcm9tQ2FwYWJpbGl0aWVzKGNhcHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgICAvLyBmaW5kIGFuZCBjb3B5LCBvciBkb3dubG9hZCBhbmQgdW56aXAgYW4gYXBwIHVybCBvciBwYXRoXG4gICAgICAgIHRoaXMub3B0cy5hcHAgPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKHRoaXMub3B0cy5hcHAsIFtBUEtfRVhURU5TSU9OLCBBUEtTX0VYVEVOU0lPTl0pO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwUHJlc2VudCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgICAvLyB0aGUgYXBwIGlzbid0IGFuIGFjdHVhbCBhcHAgZmlsZSBidXQgcmF0aGVyIHNvbWV0aGluZyB3ZSB3YW50IHRvXG4gICAgICAgIC8vIGFzc3VtZSBpcyBvbiB0aGUgZGV2aWNlIGFuZCBqdXN0IGxhdW5jaCB2aWEgdGhlIGFwcFBhY2thZ2VcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9JyBkaXJlY3RseSBvbiB0aGUgZGV2aWNlYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBOZWl0aGVyICdhcHAnIG5vciAnYXBwUGFja2FnZScgd2FzIHNldC4gU3RhcnRpbmcgVWlBdXRvbWF0b3IyIGAgK1xuICAgICAgICAgICd3aXRob3V0IHRoZSB0YXJnZXQgYXBwbGljYXRpb24nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0cy5hZGJQb3J0ID0gdGhpcy5vcHRzLmFkYlBvcnQgfHwgREVGQVVMVF9BREJfUE9SVDtcblxuICAgICAgYXdhaXQgdGhpcy5zdGFydFVpQXV0b21hdG9yMlNlc3Npb24oKTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsbERldmljZURldGFpbHMoKTtcbiAgICAgIGlmICh0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nIE1KUEVHIHN0cmVhbSByZWFkaW5nIFVSTDogJyR7dGhpcy5vcHRzLm1qcGVnU2NyZWVuc2hvdFVybH0nYCk7XG4gICAgICAgIHRoaXMubWpwZWdTdHJlYW0gPSBuZXcgbWpwZWcuTUpwZWdTdHJlYW0odGhpcy5vcHRzLm1qcGVnU2NyZWVuc2hvdFVybCk7XG4gICAgICAgIGF3YWl0IHRoaXMubWpwZWdTdHJlYW0uc3RhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCB0aGlzLmNhcHNdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmaWxsRGV2aWNlRGV0YWlscyAoKSB7XG4gICAgdGhpcy5jYXBzLnBpeGVsUmF0aW8gPSBhd2FpdCB0aGlzLmdldERldmljZVBpeGVsUmF0aW8oKTtcbiAgICB0aGlzLmNhcHMuc3RhdEJhckhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0U3RhdHVzQmFySGVpZ2h0KCk7XG4gICAgdGhpcy5jYXBzLnZpZXdwb3J0UmVjdCA9IGF3YWl0IHRoaXMuZ2V0Vmlld1BvcnRSZWN0KCk7XG4gIH1cblxuICBnZXQgZHJpdmVyRGF0YSAoKSB7XG4gICAgLy8gVE9ETyBmaWxsIG91dCByZXNvdXJjZSBpbmZvIGhlcmVcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBhc3luYyBnZXRTZXNzaW9uICgpIHtcbiAgICBsZXQgc2Vzc2lvbkRhdGEgPSBhd2FpdCBzdXBlci5nZXRTZXNzaW9uKCk7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0dldHRpbmcgc2Vzc2lvbiBkZXRhaWxzIGZyb20gc2VydmVyIHRvIG1peCBpbicpO1xuICAgIGxldCB1aWEyRGF0YSA9IGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnLycsICdHRVQnLCB7fSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHNlc3Npb25EYXRhLCB1aWEyRGF0YSk7XG4gIH1cblxuICBpc0VtdWxhdG9yICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0VtdWxhdG9yKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICB9XG5cbiAgc2V0QXZkRnJvbUNhcGFiaWxpdGllcyAoY2Fwcykge1xuICAgIGlmICh0aGlzLm9wdHMuYXZkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdhdmQgbmFtZSBkZWZpbmVkLCBpZ25vcmluZyBkZXZpY2UgbmFtZSBhbmQgcGxhdGZvcm0gdmVyc2lvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNhcHMuZGV2aWNlTmFtZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdhdmQgb3IgZGV2aWNlTmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWNhcHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBwbGF0Zm9ybVZlcnNpb24gc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlZCcpO1xuICAgICAgfVxuICAgICAgbGV0IGF2ZERldmljZSA9IGNhcHMuZGV2aWNlTmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV8uXS9nLCAnLScpO1xuICAgICAgdGhpcy5vcHRzLmF2ZCA9IGAke2F2ZERldmljZX1fXyR7Y2Fwcy5wbGF0Zm9ybVZlcnNpb259YDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhbGxvY2F0ZVN5c3RlbVBvcnQgKCkge1xuICAgIGNvbnN0IGZvcndhcmRQb3J0ID0gYXN5bmMgKGxvY2FsUG9ydCkgPT4ge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYEZvcndhcmRpbmcgVWlBdXRvbWF0b3IyIFNlcnZlciBwb3J0ICR7REVWSUNFX1BPUlR9IHRvIGxvY2FsIHBvcnQgJHtsb2NhbFBvcnR9YCk7XG4gICAgICBpZiAoKGF3YWl0IGNoZWNrUG9ydFN0YXR1cyhsb2NhbFBvcnQsIExPQ0FMSE9TVF9JUDQpKSA9PT0gJ29wZW4nKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYFVpQXV0b21hdG9yMiBTZXJ2ZXIgY2Fubm90IHN0YXJ0IGJlY2F1c2UgdGhlIGxvY2FsIHBvcnQgIyR7bG9jYWxQb3J0fSBpcyBidXN5LiBgICtcbiAgICAgICAgICBgTWFrZSBzdXJlIHRoZSBwb3J0IHlvdSBwcm92aWRlIHZpYSAnc3lzdGVtUG9ydCcgY2FwYWJpbGl0eSBpcyBub3Qgb2NjdXBpZWQuIGAgK1xuICAgICAgICAgIGBUaGlzIHNpdHVhdGlvbiBtaWdodCBvZnRlbiBiZSBhIHJlc3VsdCBvZiBhbiBpbmFjY3VyYXRlIHNlc3Npb25zIG1hbmFnZW1lbnQsIGUuZy4gYCArXG4gICAgICAgICAgYG9sZCBhdXRvbWF0aW9uIHNlc3Npb25zIG9uIHRoZSBzYW1lIGRldmljZSBtdXN0IGFsd2F5cyBiZSBjbG9zZWQgYmVmb3JlIHN0YXJ0aW5nIG5ldyBvbmVzLmApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yd2FyZFBvcnQobG9jYWxQb3J0LCBERVZJQ0VfUE9SVCk7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdHMuc3lzdGVtUG9ydCkge1xuICAgICAgdGhpcy5faGFzU3lzdGVtUG9ydEluQ2FwcyA9IHRydWU7XG4gICAgICByZXR1cm4gYXdhaXQgZm9yd2FyZFBvcnQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH1cblxuICAgIGF3YWl0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgW3N0YXJ0UG9ydCwgZW5kUG9ydF0gPSBERVZJQ0VfUE9SVF9SQU5HRTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMub3B0cy5zeXN0ZW1Qb3J0ID0gYXdhaXQgZmluZEFQb3J0Tm90SW5Vc2Uoc3RhcnRQb3J0LCBlbmRQb3J0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgYW55IGZyZWUgcG9ydCBpbiByYW5nZSAke3N0YXJ0UG9ydH0uLiR7ZW5kUG9ydH19LiBgICtcbiAgICAgICAgICBgUGxlYXNlIHNldCB0aGUgYXZhaWxhYmxlIHBvcnQgbnVtYmVyIGJ5IHByb3ZpZGluZyB0aGUgc3lzdGVtUG9ydCBjYXBhYmlsaXR5IG9yIGAgK1xuICAgICAgICAgIGBkb3VibGUgY2hlY2sgdGhlIHByb2Nlc3NlcyB0aGF0IGFyZSBsb2NraW5nIHBvcnRzIHdpdGhpbiB0aGlzIHJhbmdlIGFuZCB0ZXJtaW5hdGUgYCArXG4gICAgICAgICAgYHRoZXNlIHdoaWNoIGFyZSBub3QgbmVlZGVkIGFueW1vcmVgKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGZvcndhcmRQb3J0KHRoaXMub3B0cy5zeXN0ZW1Qb3J0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VTeXN0ZW1Qb3J0ICgpIHtcbiAgICBpZiAoIXRoaXMub3B0cy5zeXN0ZW1Qb3J0IHx8ICF0aGlzLmFkYikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9oYXNTeXN0ZW1Qb3J0SW5DYXBzKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQoYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLnN5c3RlbVBvcnQpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhbGxvY2F0ZU1qcGVnU2VydmVyUG9ydCAoKSB7XG4gICAgaWYgKHRoaXMub3B0cy5tanBlZ1NlcnZlclBvcnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcndhcmRQb3J0KHRoaXMub3B0cy5tanBlZ1NlcnZlclBvcnQsIE1KUEVHX1NFUlZFUl9ERVZJQ0VfUE9SVCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVsZWFzZU1qcGVnU2VydmVyUG9ydCAoKSB7XG4gICAgaWYgKHRoaXMub3B0cy5tanBlZ1NlcnZlclBvcnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5tanBlZ1NlcnZlclBvcnQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VWlBdXRvbWF0b3IyU2Vzc2lvbiAoKSB7XG4gICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICBsZXQge3VkaWQsIGVtUG9ydH0gPSBhd2FpdCBoZWxwZXJzLmdldERldmljZUluZm9Gcm9tQ2Fwcyh0aGlzLm9wdHMpO1xuICAgIHRoaXMub3B0cy51ZGlkID0gdWRpZDtcbiAgICB0aGlzLm9wdHMuZW1Qb3J0ID0gZW1Qb3J0O1xuXG4gICAgLy8gbm93IHRoYXQgd2Uga25vdyBvdXIgamF2YSB2ZXJzaW9uIGFuZCBkZXZpY2UgaW5mbywgd2UgY2FuIGNyZWF0ZSBvdXJcbiAgICAvLyBBREIgaW5zdGFuY2VcbiAgICB0aGlzLmFkYiA9IGF3YWl0IGFuZHJvaWRIZWxwZXJzLmNyZWF0ZUFEQih0aGlzLm9wdHMpO1xuXG4gICAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuXG4gICAgaWYgKGFwaUxldmVsIDwgMjEpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ1VJQXV0b21hdG9yMiBpcyBvbmx5IHN1cHBvcnRlZCBzaW5jZSBBbmRyb2lkIDUuMCAoTG9sbGlwb3ApLiAnICtcbiAgICAgICAgJ1lvdSBjb3VsZCBzdGlsbCB1c2Ugb3RoZXIgc3VwcG9ydGVkIGJhY2tlbmRzIGluIG9yZGVyIHRvIGF1dG9tYXRlIG9sZGVyIEFuZHJvaWQgdmVyc2lvbnMuJyk7XG4gICAgfVxuXG4gICAgaWYgKGFwaUxldmVsID49IDI4KSB7IC8vIEFuZHJvaWQgUFxuICAgICAgdGhpcy5sb2cuaW5mbygnUmVsYXhpbmcgaGlkZGVuIGFwaSBwb2xpY3knKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEhpZGRlbkFwaVBvbGljeSgnMScsICEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIHRvIGVuYWJsZS9kaXNhYmxlIGdwcyBiZWZvcmUgcnVubmluZyB0aGUgYXBwbGljYXRpb25cbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMuZ3BzRW5hYmxlZCkpIHtcbiAgICAgIGlmICh0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBUcnlpbmcgdG8gJHt0aGlzLm9wdHMuZ3BzRW5hYmxlZCA/ICdlbmFibGUnIDogJ2Rpc2FibGUnfSBncHMgbG9jYXRpb24gcHJvdmlkZXJgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIudG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlcih0aGlzLm9wdHMuZ3BzRW5hYmxlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBTb3JyeSEgJ2dwc0VuYWJsZWQnIGNhcGFiaWxpdHkgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9yc2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGdldCBhcHBQYWNrYWdlIGV0IGFsIGZyb20gbWFuaWZlc3QgaWYgbmVjZXNzYXJ5XG4gICAgY29uc3QgYXBwSW5mbyA9IGF3YWl0IGhlbHBlcnMuZ2V0TGF1bmNoSW5mbyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICAvLyBhbmQgZ2V0IGl0IG9udG8gb3VyICdvcHRzJyBvYmplY3Qgc28gd2UgdXNlIGl0IGZyb20gbm93IG9uXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGFwcEluZm8gfHwge30pO1xuXG4gICAgLy8gc2V0IGFjdHVhbCBkZXZpY2UgbmFtZSwgdWRpZCwgcGxhdGZvcm0gdmVyc2lvbiwgc2NyZWVuIHNpemUsIHNjcmVlbiBkZW5zaXR5LCBtb2RlbCBhbmQgbWFudWZhY3R1cmVyIGRldGFpbHNcbiAgICB0aGlzLmNhcHMuZGV2aWNlTmFtZSA9IHRoaXMuYWRiLmN1ckRldmljZUlkO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VVRElEID0gdGhpcy5vcHRzLnVkaWQ7XG5cbiAgICAvLyBzdGFydCBhbiBhdmQsIHNldCB0aGUgbGFuZ3VhZ2UvbG9jYWxlLCBwaWNrIGFuIGVtdWxhdG9yLCBldGMuLi5cbiAgICAvLyBUT0RPIHdpdGggbXVsdGlwbGUgZGV2aWNlcyB3ZSdsbCBuZWVkIHRvIHBhcmFtZXRlcml6ZSB0aGlzXG4gICAgdGhpcy5kZWZhdWx0SU1FID0gYXdhaXQgaGVscGVycy5pbml0RGV2aWNlKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgZGV2aWNlIGJ5IGZvcndhcmRpbmcgdGhlIFVpQXV0b21hdG9yMiBwb3J0XG4gICAgLy8gVGhpcyBjYWxsIG11dGF0ZXMgdGhpcy5vcHRzLnN5c3RlbVBvcnQgaWYgaXQgaXMgbm90IHNldCBleHBsaWNpdGx5XG4gICAgYXdhaXQgdGhpcy5hbGxvY2F0ZVN5c3RlbVBvcnQoKTtcblxuICAgIC8vIFByZXBhcmUgdGhlIGRldmljZSBieSBmb3J3YXJkaW5nIHRoZSBVaUF1dG9tYXRvcjIgTUpQRUcgc2VydmVyIHBvcnQgKGlmXG4gICAgLy8gYXBwbGljYWJsZSlcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0KCk7XG5cbiAgICAvLyBzZXQgdXAgdGhlIG1vZGlmaWVkIFVpQXV0b21hdG9yMiBzZXJ2ZXIgZXRjXG4gICAgYXdhaXQgdGhpcy5pbml0VWlBdXRvbWF0b3IyU2VydmVyKCk7XG5cbiAgICAvLyBTaG91bGQgYmUgYWZ0ZXIgaW5zdGFsbGluZyBpby5hcHBpdW0uc2V0dGluZ3MgaW4gaGVscGVycy5pbml0RGV2aWNlXG4gICAgaWYgKHRoaXMub3B0cy5kaXNhYmxlV2luZG93QW5pbWF0aW9uICYmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgMjYpKSB7IC8vIEFQSSBsZXZlbCAyNiBpcyBBbmRyb2lkIDguMC5cbiAgICAgIC8vIEdyYW50aW5nIGFuZHJvaWQucGVybWlzc2lvbi5TRVRfQU5JTUFUSU9OX1NDQUxFIGlzIG5lY2Vzc2FyeSB0byBoYW5kbGUgYW5pbWF0aW9ucyB1bmRlciBBUEkgbGV2ZWwgMjZcbiAgICAgIC8vIFJlYWQgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcHVsbC8xMTY0MCNpc3N1ZWNvbW1lbnQtNDM4MjYwNDc3XG4gICAgICAvLyBgLS1uby13aW5kb3ctYW5pbWF0aW9uYCB3b3JrcyBvdmVyIEFuZHJvaWQgOCB0byBkaXNhYmxlIGFsbCBvZiBhbmltYXRpb25zXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuaXNBbmltYXRpb25PbigpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ0Rpc2FibGluZyBhbmltYXRpb24gdmlhIGlvLmFwcGl1bS5zZXR0aW5ncycpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBbmltYXRpb25TdGF0ZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1dpbmRvdyBhbmltYXRpb24gaXMgYWxyZWFkeSBkaXNhYmxlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCB1cCBhcHAgdW5kZXIgdGVzdFxuICAgIC8vIHByZXBhcmUgb3VyIGFjdHVhbCBBVVQsIGdldCBpdCBvbiB0aGUgZGV2aWNlLCBldGMuLi5cbiAgICBhd2FpdCB0aGlzLmluaXRBVVQoKTtcblxuICAgIC8vIEFkZGluZyBBVVQgcGFja2FnZSBuYW1lIGluIHRoZSBjYXBhYmlsaXRpZXMgaWYgcGFja2FnZSBuYW1lIG5vdCBleGlzdCBpbiBjYXBzXG4gICAgaWYgKCF0aGlzLmNhcHMuYXBwUGFja2FnZSAmJiBhcHBJbmZvKSB7XG4gICAgICB0aGlzLmNhcHMuYXBwUGFja2FnZSA9IGFwcEluZm8uYXBwUGFja2FnZTtcbiAgICB9XG5cbiAgICAvLyBsYXVuY2ggVWlBdXRvbWF0b3IyIGFuZCB3YWl0IHRpbGwgaXRzIG9ubGluZSBhbmQgd2UgaGF2ZSBhIHNlc3Npb25cbiAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5zdGFydFNlc3Npb24odGhpcy5jYXBzKTtcblxuICAgIGF3YWl0IHRoaXMuYWRkRGV2aWNlSW5mb1RvQ2FwcygpO1xuXG4gICAgLy8gVW5sb2NrIHRoZSBkZXZpY2UgYWZ0ZXIgdGhlIHNlc3Npb24gaXMgc3RhcnRlZC5cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5sb2NrKSB7XG4gICAgICAvLyB1bmxvY2sgdGhlIGRldmljZSB0byBwcmVwYXJlIGl0IGZvciB0ZXN0aW5nXG4gICAgICBhd2FpdCBoZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwgdGhpcy5jYXBzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYCdza2lwVW5sb2NrJyBjYXBhYmlsaXR5IHNldCwgc28gc2tpcHBpbmcgZGV2aWNlIHVubG9ja2ApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikgeyAvLyBzdGFydCBhIGNocm9tZWRyaXZlciBzZXNzaW9uXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0Q2hyb21lU2Vzc2lvbih0aGlzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0cy5hdXRvTGF1bmNoICYmIHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUFwcFN0YXJ0cygpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBpbml0aWFsIG9yaWVudGF0aW9uIGlzIHJlcXVlc3RlZCwgc2V0IGl0XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5vcHRzLm9yaWVudGF0aW9uKSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgaW5pdGlhbCBvcmllbnRhdGlvbiB0byAnJHt0aGlzLm9wdHMub3JpZW50YXRpb259J2ApO1xuICAgICAgYXdhaXQgdGhpcy5zZXRPcmllbnRhdGlvbih0aGlzLm9wdHMub3JpZW50YXRpb24pO1xuICAgIH1cblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gaW1tZWRpYXRlbHkgZ2V0IGludG8gYSB3ZWJ2aWV3LCBzZXQgb3VyIGNvbnRleHRcbiAgICAvLyBhcHByb3ByaWF0ZWx5XG4gICAgaWYgKHRoaXMub3B0cy5hdXRvV2Vidmlldykge1xuICAgICAgY29uc3Qgdmlld05hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICAgICAgY29uc3QgdGltZW91dCA9IHRoaXMub3B0cy5hdXRvV2Vidmlld1RpbWVvdXQgfHwgMjAwMDtcbiAgICAgIHRoaXMubG9nLmluZm8oYFNldHRpbmcgYXV0byB3ZWJ2aWV3IHRvIGNvbnRleHQgJyR7dmlld05hbWV9JyB3aXRoIHRpbWVvdXQgJHt0aW1lb3V0fW1zYCk7XG4gICAgICBhd2FpdCByZXRyeUludGVydmFsKHRpbWVvdXQgLyA1MDAsIDUwMCwgdGhpcy5zZXRDb250ZXh0LmJpbmQodGhpcyksIHZpZXdOYW1lKTtcbiAgICB9XG5cbiAgICAvLyBub3cgdGhhdCBldmVyeXRoaW5nIGhhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseSwgdHVybiBvbiBwcm94eWluZyBzbyBhbGxcbiAgICAvLyBzdWJzZXF1ZW50IHNlc3Npb24gcmVxdWVzdHMgZ28gc3RyYWlnaHQgdG8vZnJvbSB1aWF1dG9tYXRvcjJcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGFkZERldmljZUluZm9Ub0NhcHMgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFwaVZlcnNpb24sXG4gICAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgICBtYW51ZmFjdHVyZXIsXG4gICAgICBtb2RlbCxcbiAgICAgIHJlYWxEaXNwbGF5U2l6ZSxcbiAgICAgIGRpc3BsYXlEZW5zaXR5LFxuICAgIH0gPSBhd2FpdCB0aGlzLm1vYmlsZUdldERldmljZUluZm8oKTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlQXBpTGV2ZWwgPSBwYXJzZUludChhcGlWZXJzaW9uLCAxMCk7XG4gICAgdGhpcy5jYXBzLnBsYXRmb3JtVmVyc2lvbiA9IHBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuU2l6ZSA9IHJlYWxEaXNwbGF5U2l6ZTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuRGVuc2l0eSA9IGRpc3BsYXlEZW5zaXR5O1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNYW51ZmFjdHVyZXIgPSBtYW51ZmFjdHVyZXI7XG4gIH1cblxuICBhc3luYyBpbml0VWlBdXRvbWF0b3IyU2VydmVyICgpIHtcbiAgICAvLyBicm9rZW4gb3V0IGZvciByZWFkYWJpbGl0eVxuICAgIGNvbnN0IHVpYXV0b21hdG9yMk9wdHMgPSB7XG4gICAgICBob3N0OiB0aGlzLm9wdHMucmVtb3RlQWRiSG9zdCB8fCB0aGlzLm9wdHMuaG9zdCB8fCBMT0NBTEhPU1RfSVA0LFxuICAgICAgc3lzdGVtUG9ydDogdGhpcy5vcHRzLnN5c3RlbVBvcnQsXG4gICAgICBkZXZpY2VQb3J0OiBERVZJQ0VfUE9SVCxcbiAgICAgIGFkYjogdGhpcy5hZGIsXG4gICAgICBhcGs6IHRoaXMub3B0cy5hcHAsXG4gICAgICB0bXBEaXI6IHRoaXMub3B0cy50bXBEaXIsXG4gICAgICBhcHBQYWNrYWdlOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgIGFwcEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgICBkaXNhYmxlV2luZG93QW5pbWF0aW9uOiAhIXRoaXMub3B0cy5kaXNhYmxlV2luZG93QW5pbWF0aW9uLFxuICAgICAgZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2U6IHRoaXMub3B0cy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSxcbiAgICAgIHJlYWRUaW1lb3V0OiB0aGlzLm9wdHMudWlhdXRvbWF0b3IyU2VydmVyUmVhZFRpbWVvdXQsXG4gICAgfTtcbiAgICAvLyBub3cgdGhhdCB3ZSBoYXZlIHBhY2thZ2UgYW5kIGFjdGl2aXR5LCB3ZSBjYW4gY3JlYXRlIGFuIGluc3RhbmNlIG9mXG4gICAgLy8gdWlhdXRvbWF0b3IyIHdpdGggdGhlIGFwcHJvcHJpYXRlIG9wdGlvbnNcbiAgICB0aGlzLnVpYXV0b21hdG9yMiA9IG5ldyBVaUF1dG9tYXRvcjJTZXJ2ZXIodGhpcy5sb2csIHVpYXV0b21hdG9yMk9wdHMpO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLnVpYXV0b21hdG9yMi5wcm94eVJlcVJlcy5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMudWlhdXRvbWF0b3IyLnByb3h5Q29tbWFuZC5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcblxuICAgIGlmICh0aGlzLm9wdHMuc2tpcFNlcnZlckluc3RhbGxhdGlvbikge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgJ3NraXBTZXJ2ZXJJbnN0YWxsYXRpb24nIGlzIHNldC4gU2tpcHBpbmcgVUlBdXRvbWF0b3IyIHNlcnZlciBpbnN0YWxsYXRpb24uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmluc3RhbGxTZXJ2ZXJBcGsodGhpcy5vcHRzLnVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdChcbiAgICAgICAgICBTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IGFkZCBzZXJ2ZXIgcGFja2FnZXMgdG8gdGhlIERvemUgd2hpdGVsaXN0LiBPcmlnaW5hbCBlcnJvcjogYCArXG4gICAgICAgICAgKGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXRBVVQgKCkge1xuICAgIC8vIFVuaW5zdGFsbCBhbnkgdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyB3aGljaCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMoXG4gICAgICAgIHRoaXMuYWRiLFxuICAgICAgICBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpLFxuICAgICAgICBbU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSURdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEluc3RhbGwgYW55IFwib3RoZXJBcHBzXCIgdGhhdCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy5vdGhlckFwcHMpIHtcbiAgICAgIGxldCBvdGhlckFwcHM7XG4gICAgICB0cnkge1xuICAgICAgICBvdGhlckFwcHMgPSBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLm90aGVyQXBwcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcIm90aGVyQXBwc1wiIGNhcGFiaWxpdHk6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgb3RoZXJBcHBzID0gYXdhaXQgQi5hbGwob3RoZXJBcHBzXG4gICAgICAgIC5tYXAoKGFwcCkgPT4gdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcChhcHAsIFtBUEtfRVhURU5TSU9OLCBBUEtTX0VYVEVOU0lPTl0pKSk7XG4gICAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxPdGhlckFwa3Mob3RoZXJBcHBzLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ICYmICEoYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQodGhpcy5vcHRzLmFwcFBhY2thZ2UpKVxuICAgICAgICAgIHx8ICF0aGlzLm9wdHMubm9SZXNldCkge1xuICAgICAgICBpZiAoIXRoaXMub3B0cy5ub1NpZ24gJiYgIWF3YWl0IHRoaXMuYWRiLmNoZWNrQXBrQ2VydCh0aGlzLm9wdHMuYXBwLCB0aGlzLm9wdHMuYXBwUGFja2FnZSwge1xuICAgICAgICAgIHJlcXVpcmVEZWZhdWx0Q2VydDogZmFsc2UsXG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgYXdhaXQgaGVscGVycy5zaWduQXBwKHRoaXMuYWRiLCB0aGlzLm9wdHMuYXBwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxBcGsodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1Zygnbm9SZXNldCBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHRoZSBhcHAgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIERvaW5nIG5vdGhpbmcnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnRnVsbCByZXNldCByZXF1aXJlcyBhbiBhcHAgY2FwYWJpbGl0eSwgdXNlIGZhc3RSZXNldCBpZiBhcHAgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnTm8gYXBwIGNhcGFiaWxpdHkuIEFzc3VtaW5nIGl0IGlzIGFscmVhZHkgb24gdGhlIGRldmljZScpO1xuICAgICAgaWYgKHRoaXMub3B0cy5mYXN0UmVzZXQgJiYgdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgICAgYXdhaXQgaGVscGVycy5yZXNldEFwcCh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBlbnN1cmVBcHBTdGFydHMgKCkge1xuICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGFjdGl2aXR5IGFuZCBwYWNrYWdlIHRvIHdhaXQgZm9yXG4gICAgY29uc3QgYXBwV2FpdFBhY2thZ2UgPSB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UgfHwgdGhpcy5vcHRzLmFwcFBhY2thZ2U7XG4gICAgY29uc3QgYXBwV2FpdEFjdGl2aXR5ID0gdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSB8fCB0aGlzLm9wdHMuYXBwQWN0aXZpdHk7XG5cbiAgICB0aGlzLmxvZy5pbmZvKGBTdGFydGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0vJHt0aGlzLm9wdHMuYXBwQWN0aXZpdHl9IGAgK1xuICAgICAgYGFuZCB3YWl0aW5nIGZvciAnJHthcHBXYWl0UGFja2FnZX0vJHthcHBXYWl0QWN0aXZpdHl9J2ApO1xuXG4gICAgaWYgKHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2UpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYGFuZHJvaWRDb3ZlcmFnZSBpcyBjb25maWd1cmVkLiBgICtcbiAgICAgICAgYCBTdGFydGluZyBpbnN0cnVtZW50YXRpb24gb2YgJyR7dGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZX0nLi4uYCk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5hbmRyb2lkQ292ZXJhZ2UodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSwgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdHMubm9SZXNldCAmJiBhd2FpdCB0aGlzLmFkYi5wcm9jZXNzRXhpc3RzKHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nIGlzIGFscmVhZHkgcnVubmluZ2ApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcCh7XG4gICAgICAgIHBrZzogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICAgIGFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgICAgIGFjdGlvbjogdGhpcy5vcHRzLmludGVudEFjdGlvbiB8fCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5IHx8ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICAgIGZsYWdzOiB0aGlzLm9wdHMuaW50ZW50RmxhZ3MgfHwgJzB4MTAyMDAwMDAnLCAvLyBGTEFHX0FDVElWSVRZX05FV19UQVNLIHwgRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRFxuICAgICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgICAgc3RvcEFwcDogIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQsXG4gICAgICAgIHJldHJ5OiB0cnVlLFxuICAgICAgICB1c2VyOiB0aGlzLm9wdHMudXNlclByb2ZpbGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdEZWxldGluZyBVaUF1dG9tYXRvcjIgc2Vzc2lvbicpO1xuXG4gICAgY29uc3Qgc2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzID0gW2FzeW5jICgpID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcFJlY29yZGluZ1NjcmVlbigpO1xuICAgICAgfVxuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLm1vYmlsZUlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZygpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZygpO1xuICAgICAgfVxuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcoKTtcbiAgICAgIH1cbiAgICB9XTtcblxuICAgIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyh0aGlzLnNlcnZlciwgdGhpcy5zZXNzaW9uSWQpO1xuXG4gICAgaWYgKHRoaXMudWlhdXRvbWF0b3IyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHN0b3AgQ2hyb21lRHJpdmVyIHByb3hpZXM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5qd3BQcm94eUFjdGl2ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHByb3h5IGRlbGV0ZVNlc3Npb24gdG8gVWlBdXRvbWF0b3IyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnVpYXV0b21hdG9yMiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgYXdhaXQgQi5hbGwoc2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzLm1hcCgodGFzaykgPT4ge1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgICB9KSgpO1xuICAgICAgfSkpO1xuXG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJiB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFJlc2V0dGluZyBJTUUgdG8gJyR7dGhpcy5kZWZhdWx0SU1FfSdgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRJTUUodGhpcy5kZWZhdWx0SU1FKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHJlc2V0IElNRTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2UpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnU2h1dHRpbmcgZG93biB0aGUgYWRiIHByb2Nlc3Mgb2YgaW5zdHJ1bWVudGF0aW9uLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmVuZEFuZHJvaWRDb3ZlcmFnZSgpO1xuICAgICAgICAvLyBVc2UgdGhpcyBicm9hZGNhc3QgaW50ZW50IHRvIG5vdGlmeSBpdCdzIHRpbWUgdG8gZHVtcCBjb3ZlcmFnZSB0byBmaWxlXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50KSB7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgU2VuZGluZyBpbnRlbnQgYnJvYWRjYXN0ICcke3RoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnR9JyBhdCB0aGUgZW5kIG9mIGluc3RydW1lbnRpbmcuYCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0KHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oJ05vIGFuZHJvaWRDb3ZlcmFnZUVuZEludGVudCBpcyBjb25maWd1cmVkIGluIGNhcHMuIFBvc3NpYmx5IHlvdSBjYW5ub3QgZ2V0IGNvdmVyYWdlIGZpbGUuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNDaHJvbWVTZXNzaW9uXG4gICAgICAgICAgICAmJiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldFxuICAgICAgICAgICAgJiYgIXRoaXMub3B0cy5ub1Jlc2V0KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gZm9yY2Ugc3RvcCBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBDYXBhYmlsaXR5ICdmdWxsUmVzZXQnIHNldCB0byAndHJ1ZScsIFVuaW5zdGFsbGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nYCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gdW5pbnN0YWxsIGFwcDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgdmFsdWUgY2FuIGJlIHRydWUgaWYgdGVzdCB0YXJnZXQgZGV2aWNlIGlzIDw9IDI2XG4gICAgICBpZiAodGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVzdG9yaW5nIHdpbmRvdyBhbmltYXRpb24gc3RhdGUnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zdG9wTG9nY2F0KCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VTeXN0ZW1Qb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcmVtb3ZlIHN5c3RlbSBwb3J0IGZvcndhcmQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgLy8gSWdub3JlLCB0aGlzIGJsb2NrIHdpbGwgYWxzbyBiZSBjYWxsZWQgd2hlbiB3ZSBmYWxsIGluIGNhdGNoIGJsb2NrXG4gICAgICAgIC8vIGFuZCBiZWZvcmUgZXZlbiBwb3J0IGZvcndhcmQuXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VNanBlZ1NlcnZlclBvcnQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byByZW1vdmUgTUpQRUcgc2VydmVyIHBvcnQgZm9yd2FyZDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAvLyBJZ25vcmUsIHRoaXMgYmxvY2sgd2lsbCBhbHNvIGJlIGNhbGxlZCB3aGVuIHdlIGZhbGwgaW4gY2F0Y2ggYmxvY2tcbiAgICAgICAgLy8gYW5kIGJlZm9yZSBldmVuIHBvcnQgZm9yd2FyZC5cbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBDbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIGNsb3NlIGVtdWxhdG9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLm1qcGVnU3RyZWFtKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdDbG9zaW5nIE1KUEVHIHN0cmVhbScpO1xuICAgICAgdGhpcy5tanBlZ1N0cmVhbS5zdG9wKCk7XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgYXBwIGlzIGFjdHVhbGx5IHByZXNlbnQnKTtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5vcHRzLmFwcCkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBhcHAgYXBrIGF0ICcke3RoaXMub3B0cy5hcHB9J2ApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKCkge1xuICAgIC8vIGludGVudGlvbmFsbHkgZG8gbm90aGluZyBoZXJlLCBzaW5jZSBjb21tYW5kcy51cGRhdGVTZXR0aW5ncyBwcm94aWVzXG4gICAgLy8gc2V0dGluZ3MgdG8gdGhlIHVpYXV0bzIgc2VydmVyIGFscmVhZHlcbiAgfVxuXG4gIC8vIE5lZWQgdG8gb3ZlcnJpZGUgYW5kcm9pZC1kcml2ZXIncyB2ZXJzaW9uIG9mIHRoaXMgc2luY2Ugd2UgZG9uJ3QgYWN0dWFsbHlcbiAgLy8gaGF2ZSBhIGJvb3RzdHJhcDsgaW5zdGVhZCB3ZSBqdXN0IHJlc3RhcnQgYWRiIGFuZCByZS1mb3J3YXJkIHRoZSBVaUF1dG9tYXRvcjJcbiAgLy8gcG9ydFxuICBhc3luYyB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICAgIGF3YWl0IHdyYXBwZWQoKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5yZXN0YXJ0KCk7XG4gICAgYXdhaXQgdGhpcy5hbGxvY2F0ZVN5c3RlbVBvcnQoKTtcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0KCk7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGFsd2F5cyBoYXZlIGFuIGFjdGl2ZSBwcm94eSB0byB0aGUgVWlBdXRvbWF0b3IyIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB3ZSBjYW4gYWx3YXlzIHByb3h5IHRvIHRoZSB1aWF1dG9tYXRvcjIgc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRQcm94eUF2b2lkTGlzdCAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuZ2V0UHJveHlBdm9pZExpc3Qoc2Vzc2lvbklkKTtcbiAgICAvLyB3ZSBhcmUgbWFpbnRhaW5pbmcgdHdvIHNldHMgb2YgTk9fUFJPWFkgbGlzdHMsIG9uZSBmb3IgY2hyb21lZHJpdmVyKENIUk9NRV9OT19QUk9YWSlcbiAgICAvLyBhbmQgb25lIGZvciB1aWF1dG9tYXRvcjIoTk9fUFJPWFkpLCBiYXNlZCBvbiBjdXJyZW50IGNvbnRleHQgd2lsbCByZXR1cm4gcmVsYXRlZCBOT19QUk9YWSBsaXN0XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5jaHJvbWVkcml2ZXIpKSB7XG4gICAgICAvLyBpZiB0aGUgY3VycmVudCBjb250ZXh0IGlzIHdlYnZpZXcoY2hyb21lZHJpdmVyKSwgdGhlbiByZXR1cm4gQ0hST01FX05PX1BST1hZIGxpc3RcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IENIUk9NRV9OT19QUk9YWTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdHMubmF0aXZlV2ViU2NyZWVuc2hvdCkge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gWy4uLnRoaXMuandwUHJveHlBdm9pZCwgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuandwUHJveHlBdm9pZDtcbiAgfVxuXG4gIGdldCBpc0Nocm9tZVNlc3Npb24gKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzQ2hyb21lQnJvd3Nlcih0aGlzLm9wdHMuYnJvd3Nlck5hbWUpO1xuICB9XG59XG5cbi8vIGZpcnN0IGFkZCB0aGUgYW5kcm9pZC1kcml2ZXIgY29tbWFuZHMgd2hpY2ggd2Ugd2lsbCBmYWxsIGJhY2sgdG9cbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoYW5kcm9pZENvbW1hbmRzKSkge1xuICBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbi8vIHRoZW4gb3ZlcndyaXRlIHdpdGggYW55IHVpYXV0b21hdG9yMi1zcGVjaWZpYyBjb21tYW5kc1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhjb21tYW5kcykpIHtcbiAgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xufVxuXG5leHBvcnQgeyBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBLE1BQU1BLE9BQU8sR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVDLGdCQUFtQixFQUFFQyxtQ0FBYyxDQUFDO0FBSXRFLE1BQU1DLGlCQUFpQixHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztBQUl0QyxNQUFNQyw0QkFBNEIsR0FBR0MsYUFBSSxDQUFDQyxnQkFBZ0IsQ0FDeERDLGFBQUksQ0FBQ0MsT0FBTyxDQUFDQyxXQUFFLENBQUNDLE1BQU0sRUFBRSxFQUFFLHdCQUF3QixDQUFDLEVBQ25EO0VBQUNDLE9BQU8sRUFBRSxFQUFFO0VBQUVDLFdBQVcsRUFBRTtBQUFJLENBQUMsQ0FDakM7QUFJRCxNQUFNQyxXQUFXLEdBQUcsSUFBSTtBQUl4QixNQUFNQyx3QkFBd0IsR0FBRyxJQUFJO0FBRXJDLE1BQU1DLGFBQWEsR0FBRyxXQUFXO0FBTWpDLE1BQU1DLFFBQVEsR0FBRyxDQUNmLENBQUMsS0FBSyxFQUFFLElBQUlDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQ3hDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ2xELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ2xELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDLEVBQ3BFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLEVBQ25FLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLEVBQ3ZELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLEVBQzFELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLEVBQ3RELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQzlDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQzlELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQzlELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLEVBQzVELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDLEVBQ3JFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQ3pELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLEVBQy9ELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLEVBQzdELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEVBQ2hELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQ3pELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLEVBQ2pELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQzFDLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLEVBQ3BELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ25ELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQ2hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDLEVBQ25FLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLEVBQ3hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLEVBQzdELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxzREFBc0QsQ0FBQyxDQUFDLEVBQzVFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvREFB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
|
|
527
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJoZWxwZXJzIiwiT2JqZWN0IiwiYXNzaWduIiwidWlhdXRvbWF0b3IySGVscGVycyIsImFuZHJvaWRIZWxwZXJzIiwiREVWSUNFX1BPUlRfUkFOR0UiLCJERVZJQ0VfUE9SVF9BTExPQ0FUSU9OX0dVQVJEIiwidXRpbCIsImdldExvY2tGaWxlR3VhcmQiLCJwYXRoIiwicmVzb2x2ZSIsIm9zIiwidG1wZGlyIiwidGltZW91dCIsInRyeVJlY292ZXJ5IiwiREVWSUNFX1BPUlQiLCJNSlBFR19TRVJWRVJfREVWSUNFX1BPUlQiLCJMT0NBTEhPU1RfSVA0IiwiTk9fUFJPWFkiLCJSZWdFeHAiLCJDSFJPTUVfTk9fUFJPWFkiLCJNRU1PSVpFRF9GVU5DVElPTlMiLCJBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIiwiQmFzZURyaXZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsInNoZWxsIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJ1aWF1dG9tYXRvcjIiLCJqd3BQcm94eUFjdGl2ZSIsImRlZmF1bHRJTUUiLCJqd3BQcm94eUF2b2lkIiwiYXBrU3RyaW5ncyIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwiYWxsb3dJbnZpc2libGVFbGVtZW50cyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJmbiIsIl8iLCJtZW1vaXplIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJjcmVhdGVTZXNzaW9uIiwiYXJncyIsInNlc3Npb25JZCIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImRlZmF1bHRPcHRzIiwiZnVsbFJlc2V0IiwiYXV0b0xhdW5jaCIsImFkYlBvcnQiLCJERUZBVUxUX0FEQl9QT1JUIiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiZGVmYXVsdHMiLCJpc0Nocm9tZVNlc3Npb24iLCJsb2ciLCJpbmZvIiwicGtnIiwiYWN0aXZpdHkiLCJnZXRDaHJvbWVQa2ciLCJicm93c2VyTmFtZSIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsInJlYm9vdCIsInNldEF2ZEZyb21DYXBhYmlsaXRpZXMiLCJhcHAiLCJjb25maWd1cmVBcHAiLCJBUEtfRVhURU5TSU9OIiwiQVBLU19FWFRFTlNJT04iLCJjaGVja0FwcFByZXNlbnQiLCJzdGFydFVpQXV0b21hdG9yMlNlc3Npb24iLCJmaWxsRGV2aWNlRGV0YWlscyIsIm1qcGVnU2NyZWVuc2hvdFVybCIsIm1qcGVnU3RyZWFtIiwibWpwZWciLCJNSnBlZ1N0cmVhbSIsInN0YXJ0IiwiZSIsImRlbGV0ZVNlc3Npb24iLCJwaXhlbFJhdGlvIiwiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsInN0YXRCYXJIZWlnaHQiLCJnZXRTdGF0dXNCYXJIZWlnaHQiLCJ2aWV3cG9ydFJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJkcml2ZXJEYXRhIiwiZ2V0U2Vzc2lvbiIsInNlc3Npb25EYXRhIiwiZGVidWciLCJ1aWEyRGF0YSIsImp3cHJveHkiLCJjb21tYW5kIiwiaXNFbXVsYXRvciIsImFkYiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImFsbG9jYXRlU3lzdGVtUG9ydCIsImZvcndhcmRQb3J0IiwibG9jYWxQb3J0IiwiY2hlY2tQb3J0U3RhdHVzIiwic3lzdGVtUG9ydCIsIl9oYXNTeXN0ZW1Qb3J0SW5DYXBzIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwicmVsZWFzZVN5c3RlbVBvcnQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0IiwibWpwZWdTZXJ2ZXJQb3J0IiwicmVsZWFzZU1qcGVnU2VydmVyUG9ydCIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJjcmVhdGVBREIiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwic2V0SGlkZGVuQXBpUG9saWN5IiwiaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IiLCJoYXNWYWx1ZSIsImdwc0VuYWJsZWQiLCJ0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIiwid2FybiIsImFwcEluZm8iLCJnZXRMYXVuY2hJbmZvIiwiY3VyRGV2aWNlSWQiLCJkZXZpY2VVRElEIiwiaW5pdERldmljZSIsImluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwiaXNBbmltYXRpb25PbiIsInNldEFuaW1hdGlvblN0YXRlIiwiX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkIiwiaW5pdEFVVCIsInN0YXJ0U2Vzc2lvbiIsImFkZERldmljZUluZm9Ub0NhcHMiLCJza2lwVW5sb2NrIiwidW5sb2NrIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwiZW5zdXJlQXBwU3RhcnRzIiwib3JpZW50YXRpb24iLCJzZXRPcmllbnRhdGlvbiIsImF1dG9XZWJ2aWV3Iiwidmlld05hbWUiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJhdXRvV2Vidmlld1RpbWVvdXQiLCJyZXRyeUludGVydmFsIiwic2V0Q29udGV4dCIsImFwaVZlcnNpb24iLCJtYW51ZmFjdHVyZXIiLCJtb2RlbCIsInJlYWxEaXNwbGF5U2l6ZSIsImRpc3BsYXlEZW5zaXR5IiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsImRldmljZUFwaUxldmVsIiwicGFyc2VJbnQiLCJkZXZpY2VTY3JlZW5TaXplIiwiZGV2aWNlU2NyZWVuRGVuc2l0eSIsImRldmljZU1vZGVsIiwiZGV2aWNlTWFudWZhY3R1cmVyIiwidWlhdXRvbWF0b3IyT3B0cyIsImhvc3QiLCJyZW1vdGVBZGJIb3N0IiwiZGV2aWNlUG9ydCIsImFwayIsInRtcERpciIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicmVhZFRpbWVvdXQiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCIsIlVpQXV0b21hdG9yMlNlcnZlciIsInByb3h5UmVxUmVzIiwicHJveHlDb21tYW5kIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsImluc3RhbGxTZXJ2ZXJBcGsiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCIsImFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJzdGRlcnIiLCJtZXNzYWdlIiwidW5pbnN0YWxsT3RoZXJQYWNrYWdlcyIsInBhcnNlQXJyYXkiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwibWFwIiwiaW5zdGFsbE90aGVyQXBrcyIsIm5vUmVzZXQiLCJpc0FwcEluc3RhbGxlZCIsIm5vU2lnbiIsImNoZWNrQXBrQ2VydCIsInJlcXVpcmVEZWZhdWx0Q2VydCIsInNpZ25BcHAiLCJza2lwVW5pbnN0YWxsIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbEFwayIsImZhc3RSZXNldCIsInJlc2V0QXBwIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJhbmRyb2lkQ292ZXJhZ2UiLCJmb3JjZUFwcExhdW5jaCIsInByb2Nlc3NFeGlzdHMiLCJzdGFydEFwcCIsImFjdGlvbiIsImludGVudEFjdGlvbiIsImNhdGVnb3J5IiwiaW50ZW50Q2F0ZWdvcnkiLCJmbGFncyIsImludGVudEZsYWdzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsIndhaXRGb3JMYXVuY2giLCJhcHBXYWl0Rm9yTGF1bmNoIiwid2FpdER1cmF0aW9uIiwiYXBwV2FpdER1cmF0aW9uIiwib3B0aW9uYWxJbnRlbnRBcmd1bWVudHMiLCJzdG9wQXBwIiwiZG9udFN0b3BBcHBPblJlc2V0IiwicmV0cnkiLCJ1c2VyIiwidXNlclByb2ZpbGUiLCJzY3JlZW5SZWNvcmRpbmdTdG9wVGFza3MiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwibW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwibW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsIl9zY3JlZW5TdHJlYW1pbmdQcm9wcyIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzdG9wQ2hyb21lZHJpdmVyUHJveGllcyIsImVyciIsInRhc2siLCJpZ24iLCJ1bmljb2RlS2V5Ym9hcmQiLCJyZXNldEtleWJvYXJkIiwic2V0SU1FIiwiZW5kQW5kcm9pZENvdmVyYWdlIiwiYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50IiwiYnJvYWRjYXN0IiwiZm9yY2VTdG9wIiwic3RvcExvZ2NhdCIsImVycm9yIiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsImF2ZE5hbWUiLCJraWxsRW11bGF0b3IiLCJzdG9wIiwiZnMiLCJleGlzdHMiLCJ3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCIsIndyYXBwZWQiLCJyZXN0YXJ0IiwicHJveHlBY3RpdmUiLCJjYW5Qcm94eSIsImdldFByb3h5QXZvaWRMaXN0IiwibmF0aXZlV2ViU2NyZWVuc2hvdCIsImlzQ2hyb21lQnJvd3NlciIsImNtZCIsInRvUGFpcnMiLCJhbmRyb2lkQ29tbWFuZHMiLCJwcm90b3R5cGUiLCJjb21tYW5kcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJhc2VEcml2ZXIsIERldmljZVNldHRpbmdzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQge1xuICBVaUF1dG9tYXRvcjJTZXJ2ZXIsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEXG59IGZyb20gJy4vdWlhdXRvbWF0b3IyJztcbmltcG9ydCB7IGZzLCB1dGlsLCBtanBlZyB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgY29tbWFuZHMgZnJvbSAnLi9jb21tYW5kcy9pbmRleCc7XG5pbXBvcnQgeyBERUZBVUxUX0FEQl9QT1JUIH0gZnJvbSAnYXBwaXVtLWFkYic7XG5pbXBvcnQgdWlhdXRvbWF0b3IySGVscGVycyBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgYW5kcm9pZEhlbHBlcnMsIGFuZHJvaWRDb21tYW5kcywgU0VUVElOR1NfSEVMUEVSX1BLR19JRFxufSBmcm9tICdhcHBpdW0tYW5kcm9pZC1kcml2ZXInO1xuaW1wb3J0IGRlc2lyZWRDYXBDb25zdHJhaW50cyBmcm9tICcuL2Rlc2lyZWQtY2Fwcyc7XG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSwgY2hlY2tQb3J0U3RhdHVzIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQVBLX0VYVEVOU0lPTiwgQVBLU19FWFRFTlNJT04gfSBmcm9tICcuL2V4dGVuc2lvbnMnO1xuXG5cbmNvbnN0IGhlbHBlcnMgPSBPYmplY3QuYXNzaWduKHt9LCB1aWF1dG9tYXRvcjJIZWxwZXJzLCBhbmRyb2lkSGVscGVycyk7XG5cbi8vIFRoZSByYW5nZSBvZiBwb3J0cyB3ZSBjYW4gdXNlIG9uIHRoZSBzeXN0ZW0gZm9yIGNvbW11bmljYXRpbmcgdG8gdGhlXG4vLyBVaUF1dG9tYXRvcjIgSFRUUCBzZXJ2ZXIgb24gdGhlIGRldmljZVxuY29uc3QgREVWSUNFX1BPUlRfUkFOR0UgPSBbODIwMCwgODI5OV07XG5cbi8vIFRoZSBndWFyZCBpcyBuZWVkZWQgdG8gYXZvaWQgZHluYW1pYyBzeXN0ZW0gcG9ydCBhbGxvY2F0aW9uIGNvbmZsaWN0cyBmb3Jcbi8vIHBhcmFsbGVsIGRyaXZlciBzZXNzaW9uc1xuY29uc3QgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCA9IHV0aWwuZ2V0TG9ja0ZpbGVHdWFyZChcbiAgcGF0aC5yZXNvbHZlKG9zLnRtcGRpcigpLCAndWlhMl9kZXZpY2VfcG9ydF9ndWFyZCcpLFxuICB7dGltZW91dDogMjUsIHRyeVJlY292ZXJ5OiB0cnVlfVxuKTtcblxuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IFVpQXV0b21hdG9yMiBsaXN0ZW5zIHRvIG9uIHRoZSBkZXZpY2UuIFdlIHdpbGwgZm9yd2FyZFxuLy8gb25lIG9mIHRoZSBwb3J0cyBhYm92ZSBvbiB0aGUgc3lzdGVtIHRvIHRoaXMgcG9ydCBvbiB0aGUgZGV2aWNlLlxuY29uc3QgREVWSUNFX1BPUlQgPSA2NzkwO1xuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IHRoZSBVaUF1dG9tYXRvcjIgTUpQRUcgc2VydmVyIGxpc3RlbnMgdG8gb24gdGhlIGRldmljZS5cbi8vIFdlIHdpbGwgZm9yd2FyZCBvbmUgb2YgdGhlIHBvcnRzIGFib3ZlIG9uIHRoZSBzeXN0ZW0gdG8gdGhpcyBwb3J0IG9uIHRoZVxuLy8gZGV2aWNlLlxuY29uc3QgTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUID0gNzgxMDtcblxuY29uc3QgTE9DQUxIT1NUX0lQNCA9ICcxMjcuMC4wLjEnO1xuXG4vLyBOT19QUk9YWSBjb250YWlucyB0aGUgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIFVpQXV0b21hdG9yMiBzZXJ2ZXIuXG4vLyBUT0RPOiAgQWRkIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBVaUF1dG9tYXRvcjIgc2VydmVyLlxuLy8gVE9ETzogTmVlZCB0byBzZWdyZWdhdGUgdGhlIHBhdGhzIGJldHRlciB3YXkgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucyB3aGVyZXZlciBhcHBsaWNhYmxlLlxuLy8gKE5vdCBzZWdyZWdhdGluZyByaWdodCBhd2F5IGJlY2F1c2UgbW9yZSBwYXRocyB0byBiZSBhZGRlZCBpbiB0aGUgTk9fUFJPWFkgbGlzdClcbmNvbnN0IE5PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi8oPyEuKi8pJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hbGVydF9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnQvW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9bXi9dKy9jdXJyZW50X2FjdGl2aXR5JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvY3VycmVudF9wYWNrYWdlJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc2V0dGluZ3MnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2F0dHJpYnV0ZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9kaXNwbGF5ZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZW5hYmxlZCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9sb2NhdGlvbl9pbl92aWV3JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL25hbWUnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvc2NyZWVuc2hvdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9zZWxlY3RlZCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zY3JlZW5zaG90JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90aW1lb3V0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdXJsJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvW14vXStfYWxlcnQkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWN0aW9ucycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FsZXJ0L1teL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwL1teL10nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvc3RhcnRfYWN0aXZpdHknKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL1teL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2NvbXBhcmVfaW1hZ2VzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS8oPyFzZXRfY2xpcGJvYXJkKVteL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2VsZW1lbnQvW14vXSsvcmVwbGFjZV92YWx1ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9lbGVtZW50L1teL10rL3ZhbHVlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2dldFBlcmZvcm1hbmNlRGF0YScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9wZXJmb3JtYW5jZURhdGEvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc2V0dGluZ3MnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZXhlY3V0ZV9kcml2ZXInKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RhcnRfcmVjb3JkaW5nX3NjcmVlbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zdG9wX3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vLipldmVudCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsva2V5cycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvY2F0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcblxuICAvLyBNSlNPTldQIGNvbW1hbmRzXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZy90eXBlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlX2FzeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJyldLFxuICAvLyBXM0MgY29tbWFuZHNcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cvdHlwZXMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3dpbmRvdy9yZWN0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nJyldLFxuXTtcblxuLy8gVGhpcyBpcyBhIHNldCBvZiBtZXRob2RzIGFuZCBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gQ2hyb21lZHJpdmVyLlxuY29uc3QgQ0hST01FX05PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvcmVjdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvcGVyZm9ybScpXSxcblxuICAvLyB0aGlzIGlzIG5lZWRlZCB0byBtYWtlIHRoZSBtb2JpbGU6IGNvbW1hbmRzIHdvcmtpbmcgaW4gd2ViIGNvbnRleHRcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZyQnKV0sXG4gIC8vIFczQyBjb21tYW5kc1xuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZy90eXBlcyQnKV0sXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZyQnKV0sXG5dO1xuXG5jb25zdCBNRU1PSVpFRF9GVU5DVElPTlMgPSBbXG4gICdnZXRTdGF0dXNCYXJIZWlnaHQnLFxuICAnZ2V0RGV2aWNlUGl4ZWxSYXRpbycsXG5dO1xuXG5jbGFzcyBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30sIHNob3VsZFZhbGlkYXRlQ2FwcyA9IHRydWUpIHtcbiAgICAvLyBgc2hlbGxgIG92ZXJ3cml0ZXMgYWRiLnNoZWxsLCBzbyByZW1vdmVcbiAgICBkZWxldGUgb3B0cy5zaGVsbDtcblxuICAgIHN1cGVyKG9wdHMsIHNob3VsZFZhbGlkYXRlQ2Fwcyk7XG4gICAgdGhpcy5sb2NhdG9yU3RyYXRlZ2llcyA9IFtcbiAgICAgICd4cGF0aCcsXG4gICAgICAnaWQnLFxuICAgICAgJ2NsYXNzIG5hbWUnLFxuICAgICAgJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgICAgJ2NzcyBzZWxlY3RvcicsXG4gICAgICAnLWFuZHJvaWQgdWlhdXRvbWF0b3InXG4gICAgXTtcbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDYXBDb25zdHJhaW50cztcbiAgICB0aGlzLnVpYXV0b21hdG9yMiA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGVmYXVsdElNRSA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgdGhpcy5hcGtTdHJpbmdzID0ge307IC8vIG1hcCBvZiBsYW5ndWFnZSAtPiBzdHJpbmdzIG9ialxuXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2UsIGFsbG93SW52aXNpYmxlRWxlbWVudHM6IGZhbHNlfSxcbiAgICAgICAgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIC8vIGhhbmRsZSB3ZWJ2aWV3IG1lY2hhbmljcyBmcm9tIEFuZHJvaWREcml2ZXJcbiAgICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVycyA9IHt9O1xuXG4gICAgLy8gbWVtb2l6ZSBmdW5jdGlvbnMgaGVyZSwgc28gdGhhdCB0aGV5IGFyZSBkb25lIG9uIGEgcGVyLWluc3RhbmNlIGJhc2lzXG4gICAgZm9yIChjb25zdCBmbiBvZiBNRU1PSVpFRF9GVU5DVElPTlMpIHtcbiAgICAgIHRoaXNbZm5dID0gXy5tZW1vaXplKHRoaXNbZm5dKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlRGVzaXJlZENhcHMoY2FwcykgJiYgYW5kcm9pZEhlbHBlcnMudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IHRoaXMuY2FwcyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oXCJXZSdyZSBnb2luZyB0byBydW4gYSBDaHJvbWUtYmFzZWQgc2Vzc2lvblwiKTtcbiAgICAgICAgbGV0IHtwa2csIGFjdGl2aXR5fSA9IGhlbHBlcnMuZ2V0Q2hyb21lUGtnKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gICAgICAgIHRoaXMub3B0cy5hcHBQYWNrYWdlID0gdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBwa2c7XG4gICAgICAgIHRoaXMub3B0cy5hcHBBY3Rpdml0eSA9IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBDaHJvbWUtdHlwZSBwYWNrYWdlIGFuZCBhY3Rpdml0eSBhcmUgJHtwa2d9IGFuZCAke2FjdGl2aXR5fWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgIC8vIGZpbmQgYW5kIGNvcHksIG9yIGRvd25sb2FkIGFuZCB1bnppcCBhbiBhcHAgdXJsIG9yIHBhdGhcbiAgICAgICAgdGhpcy5vcHRzLmFwcCA9IGF3YWl0IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAodGhpcy5vcHRzLmFwcCwgW0FQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBQcmVzZW50KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIC8vIHRoZSBhcHAgaXNuJ3QgYW4gYWN0dWFsIGFwcCBmaWxlIGJ1dCByYXRoZXIgc29tZXRoaW5nIHdlIHdhbnQgdG9cbiAgICAgICAgLy8gYXNzdW1lIGlzIG9uIHRoZSBkZXZpY2UgYW5kIGp1c3QgbGF1bmNoIHZpYSB0aGUgYXBwUGFja2FnZVxuICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdGFydGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nIGRpcmVjdGx5IG9uIHRoZSBkZXZpY2VgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYE5laXRoZXIgJ2FwcCcgbm9yICdhcHBQYWNrYWdlJyB3YXMgc2V0LiBTdGFydGluZyBVaUF1dG9tYXRvcjIgYCArXG4gICAgICAgICAgJ3dpdGhvdXQgdGhlIHRhcmdldCBhcHBsaWNhdGlvbicpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VWlBdXRvbWF0b3IyU2Vzc2lvbigpO1xuICAgICAgYXdhaXQgdGhpcy5maWxsRGV2aWNlRGV0YWlscygpO1xuICAgICAgaWYgKHRoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmwpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgTUpQRUcgc3RyZWFtIHJlYWRpbmcgVVJMOiAnJHt0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsfSdgKTtcbiAgICAgICAgdGhpcy5tanBlZ1N0cmVhbSA9IG5ldyBtanBlZy5NSnBlZ1N0cmVhbSh0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsKTtcbiAgICAgICAgYXdhaXQgdGhpcy5tanBlZ1N0cmVhbS5zdGFydCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtzZXNzaW9uSWQsIHRoaXMuY2Fwc107XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZpbGxEZXZpY2VEZXRhaWxzICgpIHtcbiAgICB0aGlzLmNhcHMucGl4ZWxSYXRpbyA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO1xuICAgIHRoaXMuY2Fwcy5zdGF0QmFySGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRTdGF0dXNCYXJIZWlnaHQoKTtcbiAgICB0aGlzLmNhcHMudmlld3BvcnRSZWN0ID0gYXdhaXQgdGhpcy5nZXRWaWV3UG9ydFJlY3QoKTtcbiAgfVxuXG4gIGdldCBkcml2ZXJEYXRhICgpIHtcbiAgICAvLyBUT0RPIGZpbGwgb3V0IHJlc291cmNlIGluZm8gaGVyZVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGFzeW5jIGdldFNlc3Npb24gKCkge1xuICAgIGxldCBzZXNzaW9uRGF0YSA9IGF3YWl0IHN1cGVyLmdldFNlc3Npb24oKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnR2V0dGluZyBzZXNzaW9uIGRldGFpbHMgZnJvbSBzZXJ2ZXIgdG8gbWl4IGluJyk7XG4gICAgbGV0IHVpYTJEYXRhID0gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvJywgJ0dFVCcsIHt9KTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc2Vzc2lvbkRhdGEsIHVpYTJEYXRhKTtcbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlU3lzdGVtUG9ydCAoKSB7XG4gICAgY29uc3QgZm9yd2FyZFBvcnQgPSBhc3luYyAobG9jYWxQb3J0KSA9PiB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBVaUF1dG9tYXRvcjIgU2VydmVyIHBvcnQgJHtERVZJQ0VfUE9SVH0gdG8gbG9jYWwgcG9ydCAke2xvY2FsUG9ydH1gKTtcbiAgICAgIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKGxvY2FsUG9ydCwgTE9DQUxIT1NUX0lQNCkpID09PSAnb3BlbicpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVWlBdXRvbWF0b3IyIFNlcnZlciBjYW5ub3Qgc3RhcnQgYmVjYXVzZSB0aGUgbG9jYWwgcG9ydCAjJHtsb2NhbFBvcnR9IGlzIGJ1c3kuIGAgK1xuICAgICAgICAgIGBNYWtlIHN1cmUgdGhlIHBvcnQgeW91IHByb3ZpZGUgdmlhICdzeXN0ZW1Qb3J0JyBjYXBhYmlsaXR5IGlzIG5vdCBvY2N1cGllZC4gYCArXG4gICAgICAgICAgYFRoaXMgc2l0dWF0aW9uIG1pZ2h0IG9mdGVuIGJlIGEgcmVzdWx0IG9mIGFuIGluYWNjdXJhdGUgc2Vzc2lvbnMgbWFuYWdlbWVudCwgZS5nLiBgICtcbiAgICAgICAgICBgb2xkIGF1dG9tYXRpb24gc2Vzc2lvbnMgb24gdGhlIHNhbWUgZGV2aWNlIG11c3QgYWx3YXlzIGJlIGNsb3NlZCBiZWZvcmUgc3RhcnRpbmcgbmV3IG9uZXMuYCk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydChsb2NhbFBvcnQsIERFVklDRV9QT1JUKTtcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KSB7XG4gICAgICB0aGlzLl9oYXNTeXN0ZW1Qb3J0SW5DYXBzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBhd2FpdCBmb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgfVxuXG4gICAgYXdhaXQgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBbc3RhcnRQb3J0LCBlbmRQb3J0XSA9IERFVklDRV9QT1JUX1JBTkdFO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5vcHRzLnN5c3RlbVBvcnQgPSBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShzdGFydFBvcnQsIGVuZFBvcnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KFxuICAgICAgICAgIGBDYW5ub3QgZmluZCBhbnkgZnJlZSBwb3J0IGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fX0uIGAgK1xuICAgICAgICAgIGBQbGVhc2Ugc2V0IHRoZSBhdmFpbGFibGUgcG9ydCBudW1iZXIgYnkgcHJvdmlkaW5nIHRoZSBzeXN0ZW1Qb3J0IGNhcGFiaWxpdHkgb3IgYCArXG4gICAgICAgICAgYGRvdWJsZSBjaGVjayB0aGUgcHJvY2Vzc2VzIHRoYXQgYXJlIGxvY2tpbmcgcG9ydHMgd2l0aGluIHRoaXMgcmFuZ2UgYW5kIHRlcm1pbmF0ZSBgICtcbiAgICAgICAgICBgdGhlc2Ugd2hpY2ggYXJlIG5vdCBuZWVkZWQgYW55bW9yZWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgZm9yd2FyZFBvcnQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVsZWFzZVN5c3RlbVBvcnQgKCkge1xuICAgIGlmICghdGhpcy5vcHRzLnN5c3RlbVBvcnQgfHwgIXRoaXMuYWRiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2hhc1N5c3RlbVBvcnRJbkNhcHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMuc3lzdGVtUG9ydCkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yd2FyZFBvcnQodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCwgTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRVaUF1dG9tYXRvcjJTZXNzaW9uICgpIHtcbiAgICAvLyBnZXQgZGV2aWNlIHVkaWQgZm9yIHRoaXMgc2Vzc2lvblxuICAgIGxldCB7dWRpZCwgZW1Qb3J0fSA9IGF3YWl0IGhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzKHRoaXMub3B0cyk7XG4gICAgdGhpcy5vcHRzLnVkaWQgPSB1ZGlkO1xuICAgIHRoaXMub3B0cy5lbVBvcnQgPSBlbVBvcnQ7XG5cbiAgICAvLyBub3cgdGhhdCB3ZSBrbm93IG91ciBqYXZhIHZlcnNpb24gYW5kIGRldmljZSBpbmZvLCB3ZSBjYW4gY3JlYXRlIG91clxuICAgIC8vIEFEQiBpbnN0YW5jZVxuICAgIHRoaXMuYWRiID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMuY3JlYXRlQURCKHRoaXMub3B0cyk7XG5cbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG5cbiAgICBpZiAoYXBpTGV2ZWwgPCAyMSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnVUlBdXRvbWF0b3IyIGlzIG9ubHkgc3VwcG9ydGVkIHNpbmNlIEFuZHJvaWQgNS4wIChMb2xsaXBvcCkuICcgK1xuICAgICAgICAnWW91IGNvdWxkIHN0aWxsIHVzZSBvdGhlciBzdXBwb3J0ZWQgYmFja2VuZHMgaW4gb3JkZXIgdG8gYXV0b21hdGUgb2xkZXIgQW5kcm9pZCB2ZXJzaW9ucy4nKTtcbiAgICB9XG5cbiAgICBpZiAoYXBpTGV2ZWwgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICB0aGlzLmxvZy5pbmZvKCdSZWxheGluZyBoaWRkZW4gYXBpIHBvbGljeScpO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0SGlkZGVuQXBpUG9saWN5KCcxJywgISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgdG8gZW5hYmxlL2Rpc2FibGUgZ3BzIGJlZm9yZSBydW5uaW5nIHRoZSBhcHBsaWNhdGlvblxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5ncHNFbmFibGVkKSkge1xuICAgICAgaWYgKHRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFRyeWluZyB0byAke3RoaXMub3B0cy5ncHNFbmFibGVkID8gJ2VuYWJsZScgOiAnZGlzYWJsZSd9IGdwcyBsb2NhdGlvbiBwcm92aWRlcmApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyKHRoaXMub3B0cy5ncHNFbmFibGVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFNvcnJ5ISAnZ3BzRW5hYmxlZCcgY2FwYWJpbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBjb25zdCBhcHBJbmZvID0gYXdhaXQgaGVscGVycy5nZXRMYXVuY2hJbmZvKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIC8vIGFuZCBnZXQgaXQgb250byBvdXIgJ29wdHMnIG9iamVjdCBzbyB3ZSB1c2UgaXQgZnJvbSBub3cgb25cbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0cywgYXBwSW5mbyB8fCB7fSk7XG5cbiAgICAvLyBzZXQgYWN0dWFsIGRldmljZSBuYW1lLCB1ZGlkLCBwbGF0Zm9ybSB2ZXJzaW9uLCBzY3JlZW4gc2l6ZSwgc2NyZWVuIGRlbnNpdHksIG1vZGVsIGFuZCBtYW51ZmFjdHVyZXIgZGV0YWlsc1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VOYW1lID0gdGhpcy5hZGIuY3VyRGV2aWNlSWQ7XG4gICAgdGhpcy5jYXBzLmRldmljZVVESUQgPSB0aGlzLm9wdHMudWRpZDtcblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICB0aGlzLmRlZmF1bHRJTUUgPSBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgVWlBdXRvbWF0b3IyIHBvcnRcbiAgICAvLyBUaGlzIGNhbGwgbXV0YXRlcyB0aGlzLm9wdHMuc3lzdGVtUG9ydCBpZiBpdCBpcyBub3Qgc2V0IGV4cGxpY2l0bHlcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlU3lzdGVtUG9ydCgpO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgZGV2aWNlIGJ5IGZvcndhcmRpbmcgdGhlIFVpQXV0b21hdG9yMiBNSlBFRyBzZXJ2ZXIgcG9ydCAoaWZcbiAgICAvLyBhcHBsaWNhYmxlKVxuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQoKTtcblxuICAgIC8vIHNldCB1cCB0aGUgbW9kaWZpZWQgVWlBdXRvbWF0b3IyIHNlcnZlciBldGNcbiAgICBhd2FpdCB0aGlzLmluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIoKTtcblxuICAgIC8vIFNob3VsZCBiZSBhZnRlciBpbnN0YWxsaW5nIGlvLmFwcGl1bS5zZXR0aW5ncyBpbiBoZWxwZXJzLmluaXREZXZpY2VcbiAgICBpZiAodGhpcy5vcHRzLmRpc2FibGVXaW5kb3dBbmltYXRpb24gJiYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyNikpIHsgLy8gQVBJIGxldmVsIDI2IGlzIEFuZHJvaWQgOC4wLlxuICAgICAgLy8gR3JhbnRpbmcgYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9BTklNQVRJT05fU0NBTEUgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBhbmltYXRpb25zIHVuZGVyIEFQSSBsZXZlbCAyNlxuICAgICAgLy8gUmVhZCBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9wdWxsLzExNjQwI2lzc3VlY29tbWVudC00MzgyNjA0NzdcbiAgICAgIC8vIGAtLW5vLXdpbmRvdy1hbmltYXRpb25gIHdvcmtzIG92ZXIgQW5kcm9pZCA4IHRvIGRpc2FibGUgYWxsIG9mIGFuaW1hdGlvbnNcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRGlzYWJsaW5nIGFuaW1hdGlvbiB2aWEgaW8uYXBwaXVtLnNldHRpbmdzJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnV2luZG93IGFuaW1hdGlvbiBpcyBhbHJlYWR5IGRpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIGFwcCB1bmRlciB0ZXN0XG4gICAgLy8gcHJlcGFyZSBvdXIgYWN0dWFsIEFVVCwgZ2V0IGl0IG9uIHRoZSBkZXZpY2UsIGV0Yy4uLlxuICAgIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuXG4gICAgLy8gQWRkaW5nIEFVVCBwYWNrYWdlIG5hbWUgaW4gdGhlIGNhcGFiaWxpdGllcyBpZiBwYWNrYWdlIG5hbWUgbm90IGV4aXN0IGluIGNhcHNcbiAgICBpZiAoIXRoaXMuY2Fwcy5hcHBQYWNrYWdlICYmIGFwcEluZm8pIHtcbiAgICAgIHRoaXMuY2Fwcy5hcHBQYWNrYWdlID0gYXBwSW5mby5hcHBQYWNrYWdlO1xuICAgIH1cblxuICAgIC8vIGxhdW5jaCBVaUF1dG9tYXRvcjIgYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLnN0YXJ0U2Vzc2lvbih0aGlzLmNhcHMpO1xuXG4gICAgYXdhaXQgdGhpcy5hZGREZXZpY2VJbmZvVG9DYXBzKCk7XG5cbiAgICAvLyBVbmxvY2sgdGhlIGRldmljZSBhZnRlciB0aGUgc2Vzc2lvbiBpcyBzdGFydGVkLlxuICAgIGlmICghdGhpcy5vcHRzLnNraXBVbmxvY2spIHtcbiAgICAgIC8vIHVubG9jayB0aGUgZGV2aWNlIHRvIHByZXBhcmUgaXQgZm9yIHRlc3RpbmdcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgJ3NraXBVbmxvY2snIGNhcGFiaWxpdHkgc2V0LCBzbyBza2lwcGluZyBkZXZpY2UgdW5sb2NrYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7IC8vIHN0YXJ0IGEgY2hyb21lZHJpdmVyIHNlc3Npb25cbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmF1dG9MYXVuY2ggJiYgdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQXBwU3RhcnRzKCk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGluaXRpYWwgb3JpZW50YXRpb24gaXMgcmVxdWVzdGVkLCBzZXQgaXRcbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMub3JpZW50YXRpb24pKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBpbml0aWFsIG9yaWVudGF0aW9uIHRvICcke3RoaXMub3B0cy5vcmllbnRhdGlvbn0nYCk7XG4gICAgICBhd2FpdCB0aGlzLnNldE9yaWVudGF0aW9uKHRoaXMub3B0cy5vcmllbnRhdGlvbik7XG4gICAgfVxuXG4gICAgLy8gaWYgd2Ugd2FudCB0byBpbW1lZGlhdGVseSBnZXQgaW50byBhIHdlYnZpZXcsIHNldCBvdXIgY29udGV4dFxuICAgIC8vIGFwcHJvcHJpYXRlbHlcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBjb25zdCB2aWV3TmFtZSA9IHRoaXMuZGVmYXVsdFdlYnZpZXdOYW1lKCk7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCB8fCAyMDAwO1xuICAgICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyBhdXRvIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcbiAgICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwodGltZW91dCAvIDUwMCwgNTAwLCB0aGlzLnNldENvbnRleHQuYmluZCh0aGlzKSwgdmlld05hbWUpO1xuICAgIH1cblxuICAgIC8vIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCB0dXJuIG9uIHByb3h5aW5nIHNvIGFsbFxuICAgIC8vIHN1YnNlcXVlbnQgc2Vzc2lvbiByZXF1ZXN0cyBnbyBzdHJhaWdodCB0by9mcm9tIHVpYXV0b21hdG9yMlxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgYWRkRGV2aWNlSW5mb1RvQ2FwcyAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXBpVmVyc2lvbixcbiAgICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICAgIG1hbnVmYWN0dXJlcixcbiAgICAgIG1vZGVsLFxuICAgICAgcmVhbERpc3BsYXlTaXplLFxuICAgICAgZGlzcGxheURlbnNpdHksXG4gICAgfSA9IGF3YWl0IHRoaXMubW9iaWxlR2V0RGV2aWNlSW5mbygpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VBcGlMZXZlbCA9IHBhcnNlSW50KGFwaVZlcnNpb24sIDEwKTtcbiAgICB0aGlzLmNhcHMucGxhdGZvcm1WZXJzaW9uID0gcGxhdGZvcm1WZXJzaW9uO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5TaXplID0gcmVhbERpc3BsYXlTaXplO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5EZW5zaXR5ID0gZGlzcGxheURlbnNpdHk7XG4gICAgdGhpcy5jYXBzLmRldmljZU1vZGVsID0gbW9kZWw7XG4gICAgdGhpcy5jYXBzLmRldmljZU1hbnVmYWN0dXJlciA9IG1hbnVmYWN0dXJlcjtcbiAgfVxuXG4gIGFzeW5jIGluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIgKCkge1xuICAgIC8vIGJyb2tlbiBvdXQgZm9yIHJlYWRhYmlsaXR5XG4gICAgY29uc3QgdWlhdXRvbWF0b3IyT3B0cyA9IHtcbiAgICAgIGhvc3Q6IHRoaXMub3B0cy5yZW1vdGVBZGJIb3N0IHx8IHRoaXMub3B0cy5ob3N0IHx8IExPQ0FMSE9TVF9JUDQsXG4gICAgICBzeXN0ZW1Qb3J0OiB0aGlzLm9wdHMuc3lzdGVtUG9ydCxcbiAgICAgIGRldmljZVBvcnQ6IERFVklDRV9QT1JULFxuICAgICAgYWRiOiB0aGlzLmFkYixcbiAgICAgIGFwazogdGhpcy5vcHRzLmFwcCxcbiAgICAgIHRtcERpcjogdGhpcy5vcHRzLnRtcERpcixcbiAgICAgIGFwcFBhY2thZ2U6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgYXBwQWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgIGRpc2FibGVXaW5kb3dBbmltYXRpb246ICEhdGhpcy5vcHRzLmRpc2FibGVXaW5kb3dBbmltYXRpb24sXG4gICAgICBkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTogdGhpcy5vcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlLFxuICAgICAgcmVhZFRpbWVvdXQ6IHRoaXMub3B0cy51aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCxcbiAgICB9O1xuICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgcGFja2FnZSBhbmQgYWN0aXZpdHksIHdlIGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2ZcbiAgICAvLyB1aWF1dG9tYXRvcjIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgb3B0aW9uc1xuICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbmV3IFVpQXV0b21hdG9yMlNlcnZlcih0aGlzLmxvZywgdWlhdXRvbWF0b3IyT3B0cyk7XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMudWlhdXRvbWF0b3IyLnByb3h5UmVxUmVzLmJpbmQodGhpcy51aWF1dG9tYXRvcjIpO1xuICAgIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy51aWF1dG9tYXRvcjIucHJveHlDb21tYW5kLmJpbmQodGhpcy51aWF1dG9tYXRvcjIpO1xuXG4gICAgaWYgKHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGAnc2tpcFNlcnZlckluc3RhbGxhdGlvbicgaXMgc2V0LiBTa2lwcGluZyBVSUF1dG9tYXRvcjIgc2VydmVyIGluc3RhbGxhdGlvbi5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuaW5zdGFsbFNlcnZlckFwayh0aGlzLm9wdHMudWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0KFxuICAgICAgICAgIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lELFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgYWRkIHNlcnZlciBwYWNrYWdlcyB0byB0aGUgRG96ZSB3aGl0ZWxpc3QuIE9yaWdpbmFsIGVycm9yOiBgICtcbiAgICAgICAgICAoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdEFVVCAoKSB7XG4gICAgLy8gVW5pbnN0YWxsIGFueSB1bmluc3RhbGxPdGhlclBhY2thZ2VzIHdoaWNoIHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyhcbiAgICAgICAgdGhpcy5hZGIsXG4gICAgICAgIGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyksXG4gICAgICAgIFtTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCBhbnkgXCJvdGhlckFwcHNcIiB0aGF0IHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLm90aGVyQXBwcykge1xuICAgICAgbGV0IG90aGVyQXBwcztcbiAgICAgIHRyeSB7XG4gICAgICAgIG90aGVyQXBwcyA9IGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMub3RoZXJBcHBzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IHBhcnNlIFwib3RoZXJBcHBzXCIgY2FwYWJpbGl0eTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBvdGhlckFwcHMgPSBhd2FpdCBCLmFsbChvdGhlckFwcHNcbiAgICAgICAgLm1hcCgoYXBwKSA9PiB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcCwgW0FQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OXSkpKTtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbE90aGVyQXBrcyhvdGhlckFwcHMsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgJiYgIShhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZCh0aGlzLm9wdHMuYXBwUGFja2FnZSkpXG4gICAgICAgICAgfHwgIXRoaXMub3B0cy5ub1Jlc2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRzLm5vU2lnbiAmJiAhYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KHRoaXMub3B0cy5hcHAsIHRoaXMub3B0cy5hcHBQYWNrYWdlLCB7XG4gICAgICAgICAgcmVxdWlyZURlZmF1bHRDZXJ0OiBmYWxzZSxcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICBhd2FpdCBoZWxwZXJzLnNpZ25BcHAodGhpcy5hZGIsIHRoaXMub3B0cy5hcHApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5vcHRzLnNraXBVbmluc3RhbGwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEFwayh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdub1Jlc2V0IGhhcyBiZWVuIHJlcXVlc3RlZCBhbmQgdGhlIGFwcCBpcyBhbHJlYWR5IGluc3RhbGxlZC4gRG9pbmcgbm90aGluZycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdGdWxsIHJlc2V0IHJlcXVpcmVzIGFuIGFwcCBjYXBhYmlsaXR5LCB1c2UgZmFzdFJlc2V0IGlmIGFwcCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBhcHAgY2FwYWJpbGl0eS4gQXNzdW1pbmcgaXQgaXMgYWxyZWFkeSBvbiB0aGUgZGV2aWNlJyk7XG4gICAgICBpZiAodGhpcy5vcHRzLmZhc3RSZXNldCAmJiB0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0QXBwKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGVuc3VyZUFwcFN0YXJ0cyAoKSB7XG4gICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYW4gYWN0aXZpdHkgYW5kIHBhY2thZ2UgdG8gd2FpdCBmb3JcbiAgICBjb25zdCBhcHBXYWl0UGFja2FnZSA9IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSB8fCB0aGlzLm9wdHMuYXBwUGFja2FnZTtcbiAgICBjb25zdCBhcHBXYWl0QWN0aXZpdHkgPSB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5IHx8IHRoaXMub3B0cy5hcHBBY3Rpdml0eTtcblxuICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfS8ke3RoaXMub3B0cy5hcHBBY3Rpdml0eX0gYCArXG4gICAgICBgYW5kIHdhaXRpbmcgZm9yICcke2FwcFdhaXRQYWNrYWdlfS8ke2FwcFdhaXRBY3Rpdml0eX0nYCk7XG5cbiAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgYW5kcm9pZENvdmVyYWdlIGlzIGNvbmZpZ3VyZWQuIGAgK1xuICAgICAgICBgIFN0YXJ0aW5nIGluc3RydW1lbnRhdGlvbiBvZiAnJHt0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlfScuLi5gKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmFuZHJvaWRDb3ZlcmFnZSh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlLCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ICYmICF0aGlzLm9wdHMuZm9yY2VBcHBMYXVuY2hcbiAgICAgICAgJiYgYXdhaXQgdGhpcy5hZGIucHJvY2Vzc0V4aXN0cyh0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYCcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCBub1Jlc2V0IGlzIGVuYWJsZWQuIGAgK1xuICAgICAgICBgU2V0IGZvcmNlQXBwTGF1bmNoIGNhcGFiaWxpdHkgdG8gdHJ1ZSBpZiB0aGUgYXBwIG11c3QgYmUgZm9yY2VmdWxseSByZXN0YXJ0ZWQgb24gc2Vzc2lvbiBzdGFydHVwLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcCh7XG4gICAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgIGFjdGlvbjogdGhpcy5vcHRzLmludGVudEFjdGlvbiB8fCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgICAgY2F0ZWdvcnk6IHRoaXMub3B0cy5pbnRlbnRDYXRlZ29yeSB8fCAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyB8fCAnMHgxMDIwMDAwMCcsIC8vIEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBGTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEXG4gICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICB3YWl0QWN0aXZpdHk6IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHksXG4gICAgICB3YWl0Rm9yTGF1bmNoOiB0aGlzLm9wdHMuYXBwV2FpdEZvckxhdW5jaCxcbiAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzOiB0aGlzLm9wdHMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsXG4gICAgICBzdG9wQXBwOiB0aGlzLm9wdHMuZm9yY2VBcHBMYXVuY2ggfHwgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQsXG4gICAgICByZXRyeTogdHJ1ZSxcbiAgICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdEZWxldGluZyBVaUF1dG9tYXRvcjIgc2Vzc2lvbicpO1xuXG4gICAgY29uc3Qgc2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzID0gW2FzeW5jICgpID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcFJlY29yZGluZ1NjcmVlbigpO1xuICAgICAgfVxuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLm1vYmlsZUlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZygpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZygpO1xuICAgICAgfVxuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcoKTtcbiAgICAgIH1cbiAgICB9XTtcblxuICAgIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyh0aGlzLnNlcnZlciwgdGhpcy5zZXNzaW9uSWQpO1xuXG4gICAgaWYgKHRoaXMudWlhdXRvbWF0b3IyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHN0b3AgQ2hyb21lRHJpdmVyIHByb3hpZXM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5qd3BQcm94eUFjdGl2ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHByb3h5IGRlbGV0ZVNlc3Npb24gdG8gVWlBdXRvbWF0b3IyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnVpYXV0b21hdG9yMiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgYXdhaXQgQi5hbGwoc2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzLm1hcCgodGFzaykgPT4ge1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgICB9KSgpO1xuICAgICAgfSkpO1xuXG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJiB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFJlc2V0dGluZyBJTUUgdG8gJyR7dGhpcy5kZWZhdWx0SU1FfSdgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRJTUUodGhpcy5kZWZhdWx0SU1FKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHJlc2V0IElNRTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2UpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnU2h1dHRpbmcgZG93biB0aGUgYWRiIHByb2Nlc3Mgb2YgaW5zdHJ1bWVudGF0aW9uLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmVuZEFuZHJvaWRDb3ZlcmFnZSgpO1xuICAgICAgICAvLyBVc2UgdGhpcyBicm9hZGNhc3QgaW50ZW50IHRvIG5vdGlmeSBpdCdzIHRpbWUgdG8gZHVtcCBjb3ZlcmFnZSB0byBmaWxlXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50KSB7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgU2VuZGluZyBpbnRlbnQgYnJvYWRjYXN0ICcke3RoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnR9JyBhdCB0aGUgZW5kIG9mIGluc3RydW1lbnRpbmcuYCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0KHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oJ05vIGFuZHJvaWRDb3ZlcmFnZUVuZEludGVudCBpcyBjb25maWd1cmVkIGluIGNhcHMuIFBvc3NpYmx5IHlvdSBjYW5ub3QgZ2V0IGNvdmVyYWdlIGZpbGUuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNDaHJvbWVTZXNzaW9uXG4gICAgICAgICAgICAmJiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldFxuICAgICAgICAgICAgJiYgIXRoaXMub3B0cy5ub1Jlc2V0KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gZm9yY2Ugc3RvcCBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBDYXBhYmlsaXR5ICdmdWxsUmVzZXQnIHNldCB0byAndHJ1ZScsIFVuaW5zdGFsbGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nYCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gdW5pbnN0YWxsIGFwcDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgdmFsdWUgY2FuIGJlIHRydWUgaWYgdGVzdCB0YXJnZXQgZGV2aWNlIGlzIDw9IDI2XG4gICAgICBpZiAodGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVzdG9yaW5nIHdpbmRvdyBhbmltYXRpb24gc3RhdGUnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zdG9wTG9nY2F0KCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VTeXN0ZW1Qb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcmVtb3ZlIHN5c3RlbSBwb3J0IGZvcndhcmQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgLy8gSWdub3JlLCB0aGlzIGJsb2NrIHdpbGwgYWxzbyBiZSBjYWxsZWQgd2hlbiB3ZSBmYWxsIGluIGNhdGNoIGJsb2NrXG4gICAgICAgIC8vIGFuZCBiZWZvcmUgZXZlbiBwb3J0IGZvcndhcmQuXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VNanBlZ1NlcnZlclBvcnQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byByZW1vdmUgTUpQRUcgc2VydmVyIHBvcnQgZm9yd2FyZDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAvLyBJZ25vcmUsIHRoaXMgYmxvY2sgd2lsbCBhbHNvIGJlIGNhbGxlZCB3aGVuIHdlIGZhbGwgaW4gY2F0Y2ggYmxvY2tcbiAgICAgICAgLy8gYW5kIGJlZm9yZSBldmVuIHBvcnQgZm9yd2FyZC5cbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBDbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIGNsb3NlIGVtdWxhdG9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLm1qcGVnU3RyZWFtKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdDbG9zaW5nIE1KUEVHIHN0cmVhbScpO1xuICAgICAgdGhpcy5tanBlZ1N0cmVhbS5zdG9wKCk7XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgYXBwIGlzIGFjdHVhbGx5IHByZXNlbnQnKTtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5vcHRzLmFwcCkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBhcHAgYXBrIGF0ICcke3RoaXMub3B0cy5hcHB9J2ApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKCkge1xuICAgIC8vIGludGVudGlvbmFsbHkgZG8gbm90aGluZyBoZXJlLCBzaW5jZSBjb21tYW5kcy51cGRhdGVTZXR0aW5ncyBwcm94aWVzXG4gICAgLy8gc2V0dGluZ3MgdG8gdGhlIHVpYXV0bzIgc2VydmVyIGFscmVhZHlcbiAgfVxuXG4gIC8vIE5lZWQgdG8gb3ZlcnJpZGUgYW5kcm9pZC1kcml2ZXIncyB2ZXJzaW9uIG9mIHRoaXMgc2luY2Ugd2UgZG9uJ3QgYWN0dWFsbHlcbiAgLy8gaGF2ZSBhIGJvb3RzdHJhcDsgaW5zdGVhZCB3ZSBqdXN0IHJlc3RhcnQgYWRiIGFuZCByZS1mb3J3YXJkIHRoZSBVaUF1dG9tYXRvcjJcbiAgLy8gcG9ydFxuICBhc3luYyB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICAgIGF3YWl0IHdyYXBwZWQoKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5yZXN0YXJ0KCk7XG4gICAgYXdhaXQgdGhpcy5hbGxvY2F0ZVN5c3RlbVBvcnQoKTtcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0KCk7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGFsd2F5cyBoYXZlIGFuIGFjdGl2ZSBwcm94eSB0byB0aGUgVWlBdXRvbWF0b3IyIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB3ZSBjYW4gYWx3YXlzIHByb3h5IHRvIHRoZSB1aWF1dG9tYXRvcjIgc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRQcm94eUF2b2lkTGlzdCAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuZ2V0UHJveHlBdm9pZExpc3Qoc2Vzc2lvbklkKTtcbiAgICAvLyB3ZSBhcmUgbWFpbnRhaW5pbmcgdHdvIHNldHMgb2YgTk9fUFJPWFkgbGlzdHMsIG9uZSBmb3IgY2hyb21lZHJpdmVyKENIUk9NRV9OT19QUk9YWSlcbiAgICAvLyBhbmQgb25lIGZvciB1aWF1dG9tYXRvcjIoTk9fUFJPWFkpLCBiYXNlZCBvbiBjdXJyZW50IGNvbnRleHQgd2lsbCByZXR1cm4gcmVsYXRlZCBOT19QUk9YWSBsaXN0XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5jaHJvbWVkcml2ZXIpKSB7XG4gICAgICAvLyBpZiB0aGUgY3VycmVudCBjb250ZXh0IGlzIHdlYnZpZXcoY2hyb21lZHJpdmVyKSwgdGhlbiByZXR1cm4gQ0hST01FX05PX1BST1hZIGxpc3RcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IENIUk9NRV9OT19QUk9YWTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdHMubmF0aXZlV2ViU2NyZWVuc2hvdCkge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gWy4uLnRoaXMuandwUHJveHlBdm9pZCwgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuandwUHJveHlBdm9pZDtcbiAgfVxuXG4gIGdldCBpc0Nocm9tZVNlc3Npb24gKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzQ2hyb21lQnJvd3Nlcih0aGlzLm9wdHMuYnJvd3Nlck5hbWUpO1xuICB9XG59XG5cbi8vIGZpcnN0IGFkZCB0aGUgYW5kcm9pZC1kcml2ZXIgY29tbWFuZHMgd2hpY2ggd2Ugd2lsbCBmYWxsIGJhY2sgdG9cbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoYW5kcm9pZENvbW1hbmRzKSkge1xuICBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbi8vIHRoZW4gb3ZlcndyaXRlIHdpdGggYW55IHVpYXV0b21hdG9yMi1zcGVjaWZpYyBjb21tYW5kc1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhjb21tYW5kcykpIHtcbiAgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xufVxuXG5leHBvcnQgeyBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBLE1BQU1BLE9BQU8sR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVDLGdCQUFtQixFQUFFQyxtQ0FBYyxDQUFDO0FBSXRFLE1BQU1DLGlCQUFpQixHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztBQUl0QyxNQUFNQyw0QkFBNEIsR0FBR0MsYUFBSSxDQUFDQyxnQkFBZ0IsQ0FDeERDLGFBQUksQ0FBQ0MsT0FBTyxDQUFDQyxXQUFFLENBQUNDLE1BQU0sRUFBRSxFQUFFLHdCQUF3QixDQUFDLEVBQ25EO0VBQUNDLE9BQU8sRUFBRSxFQUFFO0VBQUVDLFdBQVcsRUFBRTtBQUFJLENBQUMsQ0FDakM7QUFJRCxNQUFNQyxXQUFXLEdBQUcsSUFBSTtBQUl4QixNQUFNQyx3QkFBd0IsR0FBRyxJQUFJO0FBRXJDLE1BQU1DLGFBQWEsR0FBRyxXQUFXO0FBTWpDLE1BQU1DLFFBQVEsR0FBRyxDQUNmLENBQUMsS0FBSyxFQUFFLElBQUlDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQ3hDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ2xELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ2xELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDLEVBQ3BFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLEVBQ25FLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLEVBQ3ZELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLEVBQzFELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLEVBQ3RELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQzlDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQzlELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQzlELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLEVBQzVELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDLEVBQ3JFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQ3pELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLEVBQy9ELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLEVBQzdELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEVBQ2hELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQ3pELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLEVBQ2pELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQzFDLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLEVBQ3BELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ25ELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQ2hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDLEVBQ25FLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLEVBQ3hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLEVBQzdELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxzREFBc0QsQ0FBQyxDQUFDLEVBQzVFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvREFBb0QsQ0FBQyxDQUFDLEVBQzFFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDLEVBQ2xFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLEVBQ2pFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLEVBQ3BFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLEVBQ3ZELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLEVBQzdELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDLEVBQ3JFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLEVBQ3BFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLEVBQ3RELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEVBQ2pELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQzVDLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQ2hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQzFELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQ2hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLEVBQzNELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLEVBQ3JELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBRzNDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEVBQ2hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLEVBQ3JELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBRzNDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLEVBQ25ELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ2xELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLEVBQ3JELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLEVBRXBELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQy9DO0FBR0QsTUFBTUMsZUFBZSxHQUFHLENBQ3RCLENBQUMsS0FBSyxFQUFFLElBQUlELE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQzdDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQzlDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQ3pELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ2xELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQzlDLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ25ELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLEVBQzNELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLEVBR3JELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQ2hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLEVBR3BELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLEVBQ2pELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBRzVDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLEVBRXBELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQ2hEO0FBRUQsTUFBTUUsa0JBQWtCLEdBQUcsQ0FDekIsb0JBQW9CLEVBQ3BCLHFCQUFxQixDQUN0QjtBQUVELE1BQU1DLHlCQUF5QixTQUFTQyxrQkFBVSxDQUFDO0VBQ2pEQyxXQUFXLENBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRUMsa0JBQWtCLEdBQUcsSUFBSSxFQUFFO0lBRWpELE9BQU9ELElBQUksQ0FBQ0UsS0FBSztJQUVqQixLQUFLLENBQUNGLElBQUksRUFBRUMsa0JBQWtCLENBQUM7SUFDL0IsSUFBSSxDQUFDRSxpQkFBaUIsR0FBRyxDQUN2QixPQUFPLEVBQ1AsSUFBSSxFQUNKLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLHNCQUFzQixDQUN2QjtJQUNELElBQUksQ0FBQ0MscUJBQXFCLEdBQUdBLG9CQUFxQjtJQUNsRCxJQUFJLENBQUNDLFlBQVksR0FBRyxJQUFJO0lBQ3hCLElBQUksQ0FBQ0MsY0FBYyxHQUFHLEtBQUs7SUFDM0IsSUFBSSxDQUFDQyxVQUFVLEdBQUcsSUFBSTtJQUN0QixJQUFJLENBQUNDLGFBQWEsR0FBR2YsUUFBUTtJQUM3QixJQUFJLENBQUNnQixVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLElBQUksQ0FBQ0MsUUFBUSxHQUFHLElBQUlDLHNCQUFjLENBQUM7TUFBQ0Msc0JBQXNCLEVBQUUsS0FBSztNQUFFQyxzQkFBc0IsRUFBRTtJQUFLLENBQUMsRUFDN0YsSUFBSSxDQUFDQyxnQkFBZ0IsQ0FBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXJDLElBQUksQ0FBQ0MsWUFBWSxHQUFHLElBQUk7SUFDeEIsSUFBSSxDQUFDQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFHOUIsS0FBSyxNQUFNQyxFQUFFLElBQUl0QixrQkFBa0IsRUFBRTtNQUNuQyxJQUFJLENBQUNzQixFQUFFLENBQUMsR0FBR0MsZUFBQyxDQUFDQyxPQUFPLENBQUMsSUFBSSxDQUFDRixFQUFFLENBQUMsQ0FBQztJQUNoQztFQUNGO0VBRUFHLG1CQUFtQixDQUFFQyxJQUFJLEVBQUU7SUFDekIsT0FBTyxLQUFLLENBQUNELG1CQUFtQixDQUFDQyxJQUFJLENBQUMsSUFBSTNDLG1DQUFjLENBQUMwQyxtQkFBbUIsQ0FBQ0MsSUFBSSxDQUFDO0VBQ3BGO0VBRUEsTUFBTUMsYUFBYSxDQUFFLEdBQUdDLElBQUksRUFBRTtJQUM1QixJQUFJO01BRUYsSUFBSSxDQUFDQyxTQUFTLEVBQUVILElBQUksQ0FBQyxHQUFHLE1BQU0sS0FBSyxDQUFDQyxhQUFhLENBQUMsR0FBR0MsSUFBSSxDQUFDO01BRTFELElBQUlFLGFBQWEsR0FBRztRQUNsQkMsUUFBUSxFQUFFLE9BQU87UUFDakJDLGlCQUFpQixFQUFFLEtBQUs7UUFDeEJDLGVBQWUsRUFBRSxJQUFJO1FBQ3JCQyxpQkFBaUIsRUFBRSxJQUFJO1FBQ3ZCQyxlQUFlLEVBQUUsS0FBSztRQUN0QkMsd0JBQXdCLEVBQUUsSUFBSTtRQUM5QkMsc0JBQXNCLEVBQUUsS0FBSztRQUM3QkMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNaQyxPQUFPLEVBQUUsSUFBSSxDQUFDYjtNQUNoQixDQUFDO01BRUQsSUFBSSxDQUFDQSxJQUFJLEdBQUc5QyxNQUFNLENBQUNDLE1BQU0sQ0FBQ2lELGFBQWEsRUFBRSxJQUFJLENBQUNKLElBQUksQ0FBQztNQUVuRCxJQUFJLENBQUNjLFVBQVUsR0FBRyxJQUFJLENBQUNDLGtCQUFrQixFQUFFO01BRTNDLElBQUlDLFdBQVcsR0FBRztRQUNoQkMsU0FBUyxFQUFFLEtBQUs7UUFDaEJDLFVBQVUsRUFBRSxJQUFJO1FBQ2hCQyxPQUFPLEVBQUVDLDJCQUFnQjtRQUN6QkMscUJBQXFCLEVBQUU7TUFDekIsQ0FBQztNQUNEeEIsZUFBQyxDQUFDeUIsUUFBUSxDQUFDLElBQUksQ0FBQzVDLElBQUksRUFBRXNDLFdBQVcsQ0FBQztNQUVsQyxJQUFJLElBQUksQ0FBQ08sZUFBZSxFQUFFO1FBQ3hCLElBQUksQ0FBQ0MsR0FBRyxDQUFDQyxJQUFJLENBQUMsMkNBQTJDLENBQUM7UUFDMUQsSUFBSTtVQUFDQyxHQUFHO1VBQUVDO1FBQVEsQ0FBQyxHQUFHMUUsT0FBTyxDQUFDMkUsWUFBWSxDQUFDLElBQUksQ0FBQ2xELElBQUksQ0FBQ21ELFdBQVcsQ0FBQztRQUNqRSxJQUFJLENBQUNuRCxJQUFJLENBQUNvRCxVQUFVLEdBQUcsSUFBSSxDQUFDOUIsSUFBSSxDQUFDOEIsVUFBVSxHQUFHSixHQUFHO1FBQ2pELElBQUksQ0FBQ2hELElBQUksQ0FBQ3FELFdBQVcsR0FBRyxJQUFJLENBQUMvQixJQUFJLENBQUMrQixXQUFXLEdBQUdKLFFBQVE7UUFDeEQsSUFBSSxDQUFDSCxHQUFHLENBQUNDLElBQUksQ0FBRSx3Q0FBdUNDLEdBQUksUUFBT0MsUUFBUyxFQUFDLENBQUM7TUFDOUU7TUFFQSxJQUFJLElBQUksQ0FBQ2pELElBQUksQ0FBQ3NELE1BQU0sRUFBRTtRQUNwQixJQUFJLENBQUNDLHNCQUFzQixDQUFDakMsSUFBSSxDQUFDO01BQ25DO01BRUEsSUFBSSxJQUFJLENBQUN0QixJQUFJLENBQUN3RCxHQUFHLEVBQUU7UUFFakIsSUFBSSxDQUFDeEQsSUFBSSxDQUFDd0QsR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDakYsT0FBTyxDQUFDa0YsWUFBWSxDQUFDLElBQUksQ0FBQ3pELElBQUksQ0FBQ3dELEdBQUcsRUFBRSxDQUFDRSx5QkFBYSxFQUFFQywwQkFBYyxDQUFDLENBQUM7UUFDL0YsTUFBTSxJQUFJLENBQUNDLGVBQWUsRUFBRTtNQUM5QixDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM1RCxJQUFJLENBQUNvRCxVQUFVLEVBQUU7UUFHL0IsSUFBSSxDQUFDTixHQUFHLENBQUNDLElBQUksQ0FBRSxhQUFZLElBQUksQ0FBQy9DLElBQUksQ0FBQ29ELFVBQVcsMEJBQXlCLENBQUM7TUFDNUUsQ0FBQyxNQUFNO1FBQ0wsSUFBSSxDQUFDTixHQUFHLENBQUNDLElBQUksQ0FBRSxnRUFBK0QsR0FDNUUsZ0NBQWdDLENBQUM7TUFDckM7TUFDQSxJQUFJLENBQUMvQyxJQUFJLENBQUN5QyxPQUFPLEdBQUcsSUFBSSxDQUFDekMsSUFBSSxDQUFDeUMsT0FBTyxJQUFJQywyQkFBZ0I7TUFFekQsTUFBTSxJQUFJLENBQUNtQix3QkFBd0IsRUFBRTtNQUNyQyxNQUFNLElBQUksQ0FBQ0MsaUJBQWlCLEVBQUU7TUFDOUIsSUFBSSxJQUFJLENBQUM5RCxJQUFJLENBQUMrRCxrQkFBa0IsRUFBRTtRQUNoQyxJQUFJLENBQUNqQixHQUFHLENBQUNDLElBQUksQ0FBRSx1Q0FBc0MsSUFBSSxDQUFDL0MsSUFBSSxDQUFDK0Qsa0JBQW1CLEdBQUUsQ0FBQztRQUNyRixJQUFJLENBQUNDLFdBQVcsR0FBRyxJQUFJQyxjQUFLLENBQUNDLFdBQVcsQ0FBQyxJQUFJLENBQUNsRSxJQUFJLENBQUMrRCxrQkFBa0IsQ0FBQztRQUN0RSxNQUFNLElBQUksQ0FBQ0MsV0FBVyxDQUFDRyxLQUFLLEVBQUU7TUFDaEM7TUFDQSxPQUFPLENBQUMxQyxTQUFTLEVBQUUsSUFBSSxDQUFDSCxJQUFJLENBQUM7SUFDL0IsQ0FBQyxDQUFDLE9BQU84QyxDQUFDLEVBQUU7TUFDVixNQUFNLElBQUksQ0FBQ0MsYUFBYSxFQUFFO01BQzFCLE1BQU1ELENBQUM7SUFDVDtFQUNGO0VBRUEsTUFBTU4saUJBQWlCLEdBQUk7SUFDekIsSUFBSSxDQUFDeEMsSUFBSSxDQUFDZ0QsVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxtQkFBbUIsRUFBRTtJQUN2RCxJQUFJLENBQUNqRCxJQUFJLENBQUNrRCxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUNDLGtCQUFrQixFQUFFO0lBQ3pELElBQUksQ0FBQ25ELElBQUksQ0FBQ29ELFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQ0MsZUFBZSxFQUFFO0VBQ3ZEO0VBRUEsSUFBSUMsVUFBVSxHQUFJO0lBRWhCLE9BQU8sQ0FBQyxDQUFDO0VBQ1g7RUFFQSxNQUFNQyxVQUFVLEdBQUk7SUFDbEIsSUFBSUMsV0FBVyxHQUFHLE1BQU0sS0FBSyxDQUFDRCxVQUFVLEVBQUU7SUFDMUMsSUFBSSxDQUFDL0IsR0FBRyxDQUFDaUMsS0FBSyxDQUFDLCtDQUErQyxDQUFDO0lBQy9ELElBQUlDLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQzNFLFlBQVksQ0FBQzRFLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEUsT0FBTzFHLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFcUcsV0FBVyxFQUFFRSxRQUFRLENBQUM7RUFDakQ7RUFFQUcsVUFBVSxHQUFJO0lBQ1osT0FBTzVHLE9BQU8sQ0FBQzRHLFVBQVUsQ0FBQyxJQUFJLENBQUNDLEdBQUcsRUFBRSxJQUFJLENBQUNwRixJQUFJLENBQUM7RUFDaEQ7RUFFQXVELHNCQUFzQixDQUFFakMsSUFBSSxFQUFFO0lBQzVCLElBQUksSUFBSSxDQUFDdEIsSUFBSSxDQUFDcUYsR0FBRyxFQUFFO01BQ2pCLElBQUksQ0FBQ3ZDLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLDZEQUE2RCxDQUFDO0lBQzlFLENBQUMsTUFBTTtNQUNMLElBQUksQ0FBQ3pCLElBQUksQ0FBQ2dFLFVBQVUsRUFBRTtRQUNwQixJQUFJLENBQUN4QyxHQUFHLENBQUN5QyxhQUFhLENBQUMscUVBQXFFLENBQUM7TUFDL0Y7TUFDQSxJQUFJLENBQUNqRSxJQUFJLENBQUNrRSxlQUFlLEVBQUU7UUFDekIsSUFBSSxDQUFDMUMsR0FBRyxDQUFDeUMsYUFBYSxDQUFDLDBFQUEwRSxDQUFDO01BQ3BHO01BQ0EsSUFBSUUsU0FBUyxHQUFHbkUsSUFBSSxDQUFDZ0UsVUFBVSxDQUFDSSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDO01BQy9ELElBQUksQ0FBQzFGLElBQUksQ0FBQ3FGLEdBQUcsR0FBSSxHQUFFSSxTQUFVLEtBQUluRSxJQUFJLENBQUNrRSxlQUFnQixFQUFDO0lBQ3pEO0VBQ0Y7RUFFQSxNQUFNRyxrQkFBa0IsR0FBSTtJQUMxQixNQUFNQyxXQUFXLEdBQUcsTUFBT0MsU0FBUyxJQUFLO01BQ3ZDLElBQUksQ0FBQy9DLEdBQUcsQ0FBQ2lDLEtBQUssQ0FBRSx1Q0FBc0N6RixXQUFZLGtCQUFpQnVHLFNBQVUsRUFBQyxDQUFDO01BQy9GLElBQUksQ0FBQyxNQUFNLElBQUFDLDRCQUFlLEVBQUNELFNBQVMsRUFBRXJHLGFBQWEsQ0FBQyxNQUFNLE1BQU0sRUFBRTtRQUNoRSxJQUFJLENBQUNzRCxHQUFHLENBQUN5QyxhQUFhLENBQUUsNERBQTJETSxTQUFVLFlBQVcsR0FDckcsOEVBQTZFLEdBQzdFLG9GQUFtRixHQUNuRiw0RkFBMkYsQ0FBQztNQUNqRztNQUNBLE1BQU0sSUFBSSxDQUFDVCxHQUFHLENBQUNRLFdBQVcsQ0FBQ0MsU0FBUyxFQUFFdkcsV0FBVyxDQUFDO0lBQ3BELENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQ1UsSUFBSSxDQUFDK0YsVUFBVSxFQUFFO01BQ3hCLElBQUksQ0FBQ0Msb0JBQW9CLEdBQUcsSUFBSTtNQUNoQyxPQUFPLE1BQU1KLFdBQVcsQ0FBQyxJQUFJLENBQUM1RixJQUFJLENBQUMrRixVQUFVLENBQUM7SUFDaEQ7SUFFQSxNQUFNbEgsNEJBQTRCLENBQUMsWUFBWTtNQUM3QyxNQUFNLENBQUNvSCxTQUFTLEVBQUVDLE9BQU8sQ0FBQyxHQUFHdEgsaUJBQWlCO01BQzlDLElBQUk7UUFDRixJQUFJLENBQUNvQixJQUFJLENBQUMrRixVQUFVLEdBQUcsTUFBTSxJQUFBSSw4QkFBaUIsRUFBQ0YsU0FBUyxFQUFFQyxPQUFPLENBQUM7TUFDcEUsQ0FBQyxDQUFDLE9BQU85QixDQUFDLEVBQUU7UUFDVixJQUFJLENBQUN0QixHQUFHLENBQUN5QyxhQUFhLENBQ25CLHNDQUFxQ1UsU0FBVSxLQUFJQyxPQUFRLEtBQUksR0FDL0QsaUZBQWdGLEdBQ2hGLG9GQUFtRixHQUNuRixvQ0FBbUMsQ0FBQztNQUN6QztNQUNBLE1BQU1OLFdBQVcsQ0FBQyxJQUFJLENBQUM1RixJQUFJLENBQUMrRixVQUFVLENBQUM7SUFDekMsQ0FBQyxDQUFDO0VBQ0o7RUFFQSxNQUFNSyxpQkFBaUIsR0FBSTtJQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDcEcsSUFBSSxDQUFDK0YsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDWCxHQUFHLEVBQUU7TUFDdEM7SUFDRjtJQUVBLElBQUksSUFBSSxDQUFDWSxvQkFBb0IsRUFBRTtNQUM3QixNQUFNLElBQUksQ0FBQ1osR0FBRyxDQUFDaUIsaUJBQWlCLENBQUMsSUFBSSxDQUFDckcsSUFBSSxDQUFDK0YsVUFBVSxDQUFDO0lBQ3hELENBQUMsTUFBTTtNQUNMLE1BQU1sSCw0QkFBNEIsQ0FBQyxZQUFZLE1BQU0sSUFBSSxDQUFDdUcsR0FBRyxDQUFDaUIsaUJBQWlCLENBQUMsSUFBSSxDQUFDckcsSUFBSSxDQUFDK0YsVUFBVSxDQUFDLENBQUM7SUFDeEc7RUFDRjtFQUVBLE1BQU1PLHVCQUF1QixHQUFJO0lBQy9CLElBQUksSUFBSSxDQUFDdEcsSUFBSSxDQUFDdUcsZUFBZSxFQUFFO01BQzdCLE1BQU0sSUFBSSxDQUFDbkIsR0FBRyxDQUFDUSxXQUFXLENBQUMsSUFBSSxDQUFDNUYsSUFBSSxDQUFDdUcsZUFBZSxFQUFFaEgsd0JBQXdCLENBQUM7SUFDakY7RUFDRjtFQUVBLE1BQU1pSCxzQkFBc0IsR0FBSTtJQUM5QixJQUFJLElBQUksQ0FBQ3hHLElBQUksQ0FBQ3VHLGVBQWUsRUFBRTtNQUM3QixNQUFNLElBQUksQ0FBQ25CLEdBQUcsQ0FBQ2lCLGlCQUFpQixDQUFDLElBQUksQ0FBQ3JHLElBQUksQ0FBQ3VHLGVBQWUsQ0FBQztJQUM3RDtFQUNGO0VBRUEsTUFBTTFDLHdCQUF3QixHQUFJO0lBRWhDLElBQUk7TUFBQzRDLElBQUk7TUFBRUM7SUFBTSxDQUFDLEdBQUcsTUFBTW5JLE9BQU8sQ0FBQ29JLHFCQUFxQixDQUFDLElBQUksQ0FBQzNHLElBQUksQ0FBQztJQUNuRSxJQUFJLENBQUNBLElBQUksQ0FBQ3lHLElBQUksR0FBR0EsSUFBSTtJQUNyQixJQUFJLENBQUN6RyxJQUFJLENBQUMwRyxNQUFNLEdBQUdBLE1BQU07SUFJekIsSUFBSSxDQUFDdEIsR0FBRyxHQUFHLE1BQU16RyxtQ0FBYyxDQUFDaUksU0FBUyxDQUFDLElBQUksQ0FBQzVHLElBQUksQ0FBQztJQUVwRCxNQUFNNkcsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDekIsR0FBRyxDQUFDMEIsV0FBVyxFQUFFO0lBRTdDLElBQUlELFFBQVEsR0FBRyxFQUFFLEVBQUU7TUFDakIsSUFBSSxDQUFDL0QsR0FBRyxDQUFDeUMsYUFBYSxDQUFDLCtEQUErRCxHQUNwRiwyRkFBMkYsQ0FBQztJQUNoRztJQUVBLElBQUlzQixRQUFRLElBQUksRUFBRSxFQUFFO01BQ2xCLElBQUksQ0FBQy9ELEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLDRCQUE0QixDQUFDO01BQzNDLE1BQU0sSUFBSSxDQUFDcUMsR0FBRyxDQUFDMkIsa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMvRyxJQUFJLENBQUNnSCwwQkFBMEIsQ0FBQztJQUNoRjtJQUdBLElBQUlsSSxhQUFJLENBQUNtSSxRQUFRLENBQUMsSUFBSSxDQUFDakgsSUFBSSxDQUFDa0gsVUFBVSxDQUFDLEVBQUU7TUFDdkMsSUFBSSxJQUFJLENBQUMvQixVQUFVLEVBQUUsRUFBRTtRQUNyQixJQUFJLENBQUNyQyxHQUFHLENBQUNDLElBQUksQ0FBRSxhQUFZLElBQUksQ0FBQy9DLElBQUksQ0FBQ2tILFVBQVUsR0FBRyxRQUFRLEdBQUcsU0FBVSx3QkFBdUIsQ0FBQztRQUMvRixNQUFNLElBQUksQ0FBQzlCLEdBQUcsQ0FBQytCLHlCQUF5QixDQUFDLElBQUksQ0FBQ25ILElBQUksQ0FBQ2tILFVBQVUsQ0FBQztNQUNoRSxDQUFDLE1BQU07UUFDTCxJQUFJLENBQUNwRSxHQUFHLENBQUNzRSxJQUFJLENBQUUsZ0VBQStELENBQUM7TUFDakY7SUFDRjtJQUdBLE1BQU1DLE9BQU8sR0FBRyxNQUFNOUksT0FBTyxDQUFDK0ksYUFBYSxDQUFDLElBQUksQ0FBQ2xDLEdBQUcsRUFBRSxJQUFJLENBQUNwRixJQUFJLENBQUM7SUFFaEV4QixNQUFNLENBQUNDLE1BQU0sQ0FBQyxJQUFJLENBQUN1QixJQUFJLEVBQUVxSCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7SUFHdkMsSUFBSSxDQUFDL0YsSUFBSSxDQUFDZ0UsVUFBVSxHQUFHLElBQUksQ0FBQ0YsR0FBRyxDQUFDbUMsV0FBVztJQUMzQyxJQUFJLENBQUNqRyxJQUFJLENBQUNrRyxVQUFVLEdBQUcsSUFBSSxDQUFDeEgsSUFBSSxDQUFDeUcsSUFBSTtJQUlyQyxJQUFJLENBQUNsRyxVQUFVLEdBQUcsTUFBTWhDLE9BQU8sQ0FBQ2tKLFVBQVUsQ0FBQyxJQUFJLENBQUNyQyxHQUFHLEVBQUUsSUFBSSxDQUFDcEYsSUFBSSxDQUFDO0lBSS9ELE1BQU0sSUFBSSxDQUFDMkYsa0JBQWtCLEVBQUU7SUFJL0IsTUFBTSxJQUFJLENBQUNXLHVCQUF1QixFQUFFO0lBR3BDLE1BQU0sSUFBSSxDQUFDb0Isc0JBQXNCLEVBQUU7SUFHbkMsSUFBSSxJQUFJLENBQUMxSCxJQUFJLENBQUMySCxzQkFBc0IsSUFBSyxPQUFNLElBQUksQ0FBQ3ZDLEdBQUcsQ0FBQzBCLFdBQVcsRUFBRSxJQUFHLEVBQUcsRUFBRTtNQUkzRSxJQUFJLE1BQU0sSUFBSSxDQUFDMUIsR0FBRyxDQUFDd0MsYUFBYSxFQUFFLEVBQUU7UUFDbEMsSUFBSSxDQUFDOUUsR0FBRyxDQUFDQyxJQUFJLENBQUMsNENBQTRDLENBQUM7UUFDM0QsTUFBTSxJQUFJLENBQUNxQyxHQUFHLENBQUN5QyxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7UUFDdkMsSUFBSSxDQUFDQywyQkFBMkIsR0FBRyxJQUFJO01BQ3pDLENBQUMsTUFBTTtRQUNMLElBQUksQ0FBQ2hGLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLHNDQUFzQyxDQUFDO01BQ3ZEO0lBQ0Y7SUFJQSxNQUFNLElBQUksQ0FBQ2dGLE9BQU8sRUFBRTtJQUdwQixJQUFJLENBQUMsSUFBSSxDQUFDekcsSUFBSSxDQUFDOEIsVUFBVSxJQUFJaUUsT0FBTyxFQUFFO01BQ3BDLElBQUksQ0FBQy9GLElBQUksQ0FBQzhCLFVBQVUsR0FBR2lFLE9BQU8sQ0FBQ2pFLFVBQVU7SUFDM0M7SUFHQSxNQUFNLElBQUksQ0FBQy9DLFlBQVksQ0FBQzJILFlBQVksQ0FBQyxJQUFJLENBQUMxRyxJQUFJLENBQUM7SUFFL0MsTUFBTSxJQUFJLENBQUMyRyxtQkFBbUIsRUFBRTtJQUdoQyxJQUFJLENBQUMsSUFBSSxDQUFDakksSUFBSSxDQUFDa0ksVUFBVSxFQUFFO01BRXpCLE1BQU0zSixPQUFPLENBQUM0SixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQy9DLEdBQUcsRUFBRSxJQUFJLENBQUM5RCxJQUFJLENBQUM7SUFDakQsQ0FBQyxNQUFNO01BQ0wsSUFBSSxDQUFDd0IsR0FBRyxDQUFDaUMsS0FBSyxDQUFFLHdEQUF1RCxDQUFDO0lBQzFFO0lBRUEsSUFBSSxJQUFJLENBQUNsQyxlQUFlLEVBQUU7TUFDeEIsTUFBTSxJQUFJLENBQUN1RixrQkFBa0IsQ0FBQyxJQUFJLENBQUM7SUFDckMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDcEksSUFBSSxDQUFDd0MsVUFBVSxJQUFJLElBQUksQ0FBQ3hDLElBQUksQ0FBQ29ELFVBQVUsRUFBRTtNQUN2RCxNQUFNLElBQUksQ0FBQ2lGLGVBQWUsRUFBRTtJQUM5QjtJQUdBLElBQUl2SixhQUFJLENBQUNtSSxRQUFRLENBQUMsSUFBSSxDQUFDakgsSUFBSSxDQUFDc0ksV0FBVyxDQUFDLEVBQUU7TUFDeEMsSUFBSSxDQUFDeEYsR0FBRyxDQUFDaUMsS0FBSyxDQUFFLG1DQUFrQyxJQUFJLENBQUMvRSxJQUFJLENBQUNzSSxXQUFZLEdBQUUsQ0FBQztNQUMzRSxNQUFNLElBQUksQ0FBQ0MsY0FBYyxDQUFDLElBQUksQ0FBQ3ZJLElBQUksQ0FBQ3NJLFdBQVcsQ0FBQztJQUNsRDtJQUlBLElBQUksSUFBSSxDQUFDdEksSUFBSSxDQUFDd0ksV0FBVyxFQUFFO01BQ3pCLE1BQU1DLFFBQVEsR0FBRyxJQUFJLENBQUNDLGtCQUFrQixFQUFFO01BQzFDLE1BQU10SixPQUFPLEdBQUcsSUFBSSxDQUFDWSxJQUFJLENBQUMySSxrQkFBa0IsSUFBSSxJQUFJO01BQ3BELElBQUksQ0FBQzdGLEdBQUcsQ0FBQ0MsSUFBSSxDQUFFLG9DQUFtQzBGLFFBQVMsa0JBQWlCckosT0FBUSxJQUFHLENBQUM7TUFDeEYsTUFBTSxJQUFBd0osdUJBQWEsRUFBQ3hKLE9BQU8sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQ3lKLFVBQVUsQ0FBQzlILElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTBILFFBQVEsQ0FBQztJQUMvRTtJQUlBLElBQUksQ0FBQ25JLGNBQWMsR0FBRyxJQUFJO0VBQzVCO0VBRUEsTUFBTTJILG1CQUFtQixHQUFJO0lBQzNCLE1BQU07TUFDSmEsVUFBVTtNQUNWdEQsZUFBZTtNQUNmdUQsWUFBWTtNQUNaQyxLQUFLO01BQ0xDLGVBQWU7TUFDZkM7SUFDRixDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUNDLG1CQUFtQixFQUFFO0lBQ3BDLElBQUksQ0FBQzdILElBQUksQ0FBQzhILGNBQWMsR0FBR0MsUUFBUSxDQUFDUCxVQUFVLEVBQUUsRUFBRSxDQUFDO0lBQ25ELElBQUksQ0FBQ3hILElBQUksQ0FBQ2tFLGVBQWUsR0FBR0EsZUFBZTtJQUMzQyxJQUFJLENBQUNsRSxJQUFJLENBQUNnSSxnQkFBZ0IsR0FBR0wsZUFBZTtJQUM1QyxJQUFJLENBQUMzSCxJQUFJLENBQUNpSSxtQkFBbUIsR0FBR0wsY0FBYztJQUM5QyxJQUFJLENBQUM1SCxJQUFJLENBQUNrSSxXQUFXLEdBQUdSLEtBQUs7SUFDN0IsSUFBSSxDQUFDMUgsSUFBSSxDQUFDbUksa0JBQWtCLEdBQUdWLFlBQVk7RUFDN0M7RUFFQSxNQUFNckIsc0JBQXNCLEdBQUk7SUFFOUIsTUFBTWdDLGdCQUFnQixHQUFHO01BQ3ZCQyxJQUFJLEVBQUUsSUFBSSxDQUFDM0osSUFBSSxDQUFDNEosYUFBYSxJQUFJLElBQUksQ0FBQzVKLElBQUksQ0FBQzJKLElBQUksSUFBSW5LLGFBQWE7TUFDaEV1RyxVQUFVLEVBQUUsSUFBSSxDQUFDL0YsSUFBSSxDQUFDK0YsVUFBVTtNQUNoQzhELFVBQVUsRUFBRXZLLFdBQVc7TUFDdkI4RixHQUFHLEVBQUUsSUFBSSxDQUFDQSxHQUFHO01BQ2IwRSxHQUFHLEVBQUUsSUFBSSxDQUFDOUosSUFBSSxDQUFDd0QsR0FBRztNQUNsQnVHLE1BQU0sRUFBRSxJQUFJLENBQUMvSixJQUFJLENBQUMrSixNQUFNO01BQ3hCM0csVUFBVSxFQUFFLElBQUksQ0FBQ3BELElBQUksQ0FBQ29ELFVBQVU7TUFDaENDLFdBQVcsRUFBRSxJQUFJLENBQUNyRCxJQUFJLENBQUNxRCxXQUFXO01BQ2xDc0Usc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQzNILElBQUksQ0FBQzJILHNCQUFzQjtNQUMxRHFDLG1DQUFtQyxFQUFFLElBQUksQ0FBQ2hLLElBQUksQ0FBQ2dLLG1DQUFtQztNQUNsRkMsV0FBVyxFQUFFLElBQUksQ0FBQ2pLLElBQUksQ0FBQ2tLO0lBQ3pCLENBQUM7SUFHRCxJQUFJLENBQUM3SixZQUFZLEdBQUcsSUFBSThKLCtCQUFrQixDQUFDLElBQUksQ0FBQ3JILEdBQUcsRUFBRTRHLGdCQUFnQixDQUFDO0lBQ3RFLElBQUksQ0FBQ1UsV0FBVyxHQUFHLElBQUksQ0FBQy9KLFlBQVksQ0FBQytKLFdBQVcsQ0FBQ3JKLElBQUksQ0FBQyxJQUFJLENBQUNWLFlBQVksQ0FBQztJQUN4RSxJQUFJLENBQUNnSyxZQUFZLEdBQUcsSUFBSSxDQUFDaEssWUFBWSxDQUFDZ0ssWUFBWSxDQUFDdEosSUFBSSxDQUFDLElBQUksQ0FBQ1YsWUFBWSxDQUFDO0lBRTFFLElBQUksSUFBSSxDQUFDTCxJQUFJLENBQUNzSyxzQkFBc0IsRUFBRTtNQUNwQyxJQUFJLENBQUN4SCxHQUFHLENBQUNDLElBQUksQ0FBRSw2RUFBNEUsQ0FBQztJQUM5RixDQUFDLE1BQU07TUFDTCxNQUFNLElBQUksQ0FBQzFDLFlBQVksQ0FBQ2tLLGdCQUFnQixDQUFDLElBQUksQ0FBQ3ZLLElBQUksQ0FBQ3dLLGdDQUFnQyxDQUFDO01BQ3BGLElBQUk7UUFDRixNQUFNLElBQUksQ0FBQ3BGLEdBQUcsQ0FBQ3FGLHdCQUF3QixDQUNyQ0MsMkNBQXNCLEVBQUVDLDhCQUFpQixFQUFFQyxtQ0FBc0IsQ0FDbEU7TUFDSCxDQUFDLENBQUMsT0FBT3hHLENBQUMsRUFBRTtRQUNWLElBQUksQ0FBQ3RCLEdBQUcsQ0FBQ3NFLElBQUksQ0FBRSxvRUFBbUUsSUFDL0VoRCxDQUFDLENBQUN5RyxNQUFNLElBQUl6RyxDQUFDLENBQUMwRyxPQUFPLENBQUMsQ0FBQztNQUM1QjtJQUNGO0VBQ0Y7RUFFQSxNQUFNL0MsT0FBTyxHQUFJO0lBRWYsSUFBSSxJQUFJLENBQUMvSCxJQUFJLENBQUMrSyxzQkFBc0IsRUFBRTtNQUNwQyxNQUFNeE0sT0FBTyxDQUFDd00sc0JBQXNCLENBQ2xDLElBQUksQ0FBQzNGLEdBQUcsRUFDUjdHLE9BQU8sQ0FBQ3lNLFVBQVUsQ0FBQyxJQUFJLENBQUNoTCxJQUFJLENBQUMrSyxzQkFBc0IsQ0FBQyxFQUNwRCxDQUFDTCwyQ0FBc0IsRUFBRUMsOEJBQWlCLEVBQUVDLG1DQUFzQixDQUFDLENBQ3BFO0lBQ0g7SUFHQSxJQUFJLElBQUksQ0FBQzVLLElBQUksQ0FBQ2lMLFNBQVMsRUFBRTtNQUN2QixJQUFJQSxTQUFTO01BQ2IsSUFBSTtRQUNGQSxTQUFTLEdBQUcxTSxPQUFPLENBQUN5TSxVQUFVLENBQUMsSUFBSSxDQUFDaEwsSUFBSSxDQUFDaUwsU0FBUyxDQUFDO01BQ3JELENBQUMsQ0FBQyxPQUFPN0csQ0FBQyxFQUFFO1FBQ1YsSUFBSSxDQUFDdEIsR0FBRyxDQUFDeUMsYUFBYSxDQUFFLDJDQUEwQ25CLENBQUMsQ0FBQzBHLE9BQVEsRUFBQyxDQUFDO01BQ2hGO01BQ0FHLFNBQVMsR0FBRyxNQUFNQyxpQkFBQyxDQUFDQyxHQUFHLENBQUNGLFNBQVMsQ0FDOUJHLEdBQUcsQ0FBRTVILEdBQUcsSUFBSyxJQUFJLENBQUNqRixPQUFPLENBQUNrRixZQUFZLENBQUNELEdBQUcsRUFBRSxDQUFDRSx5QkFBYSxFQUFFQywwQkFBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ2pGLE1BQU1wRixPQUFPLENBQUM4TSxnQkFBZ0IsQ0FBQ0osU0FBUyxFQUFFLElBQUksQ0FBQzdGLEdBQUcsRUFBRSxJQUFJLENBQUNwRixJQUFJLENBQUM7SUFDaEU7SUFFQSxJQUFJLElBQUksQ0FBQ0EsSUFBSSxDQUFDd0QsR0FBRyxFQUFFO01BQ2pCLElBQUksSUFBSSxDQUFDeEQsSUFBSSxDQUFDc0wsT0FBTyxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUNsRyxHQUFHLENBQUNtRyxjQUFjLENBQUMsSUFBSSxDQUFDdkwsSUFBSSxDQUFDb0QsVUFBVSxDQUFDLENBQUMsSUFDeEUsQ0FBQyxJQUFJLENBQUNwRCxJQUFJLENBQUNzTCxPQUFPLEVBQUU7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQ3RMLElBQUksQ0FBQ3dMLE1BQU0sSUFBSSxFQUFDLE1BQU0sSUFBSSxDQUFDcEcsR0FBRyxDQUFDcUcsWUFBWSxDQUFDLElBQUksQ0FBQ3pMLElBQUksQ0FBQ3dELEdBQUcsRUFBRSxJQUFJLENBQUN4RCxJQUFJLENBQUNvRCxVQUFVLEVBQUU7VUFDekZzSSxrQkFBa0IsRUFBRTtRQUN0QixDQUFDLENBQUMsR0FBRTtVQUNGLE1BQU1uTixPQUFPLENBQUNvTixPQUFPLENBQUMsSUFBSSxDQUFDdkcsR0FBRyxFQUFFLElBQUksQ0FBQ3BGLElBQUksQ0FBQ3dELEdBQUcsQ0FBQztRQUNoRDtRQUNBLElBQUksQ0FBQyxJQUFJLENBQUN4RCxJQUFJLENBQUM0TCxhQUFhLEVBQUU7VUFDNUIsTUFBTSxJQUFJLENBQUN4RyxHQUFHLENBQUN5RyxZQUFZLENBQUMsSUFBSSxDQUFDN0wsSUFBSSxDQUFDb0QsVUFBVSxDQUFDO1FBQ25EO1FBQ0EsTUFBTTdFLE9BQU8sQ0FBQ3VOLFVBQVUsQ0FBQyxJQUFJLENBQUMxRyxHQUFHLEVBQUUsSUFBSSxDQUFDcEYsSUFBSSxDQUFDO01BQy9DLENBQUMsTUFBTTtRQUNMLElBQUksQ0FBQzhDLEdBQUcsQ0FBQ2lDLEtBQUssQ0FBQyw0RUFBNEUsQ0FBQztNQUM5RjtJQUNGLENBQUMsTUFBTTtNQUNMLElBQUksSUFBSSxDQUFDL0UsSUFBSSxDQUFDdUMsU0FBUyxFQUFFO1FBQ3ZCLElBQUksQ0FBQ08sR0FBRyxDQUFDeUMsYUFBYSxDQUFDLDZFQUE2RSxDQUFDO01BQ3ZHO01BQ0EsSUFBSSxDQUFDekMsR0FBRyxDQUFDaUMsS0FBSyxDQUFDLHlEQUF5RCxDQUFDO01BQ3pFLElBQUksSUFBSSxDQUFDL0UsSUFBSSxDQUFDK0wsU0FBUyxJQUFJLElBQUksQ0FBQy9MLElBQUksQ0FBQ29ELFVBQVUsRUFBRTtRQUMvQyxNQUFNN0UsT0FBTyxDQUFDeU4sUUFBUSxDQUFDLElBQUksQ0FBQzVHLEdBQUcsRUFBRSxJQUFJLENBQUNwRixJQUFJLENBQUM7TUFDN0M7SUFDRjtFQUNGO0VBRUEsTUFBTXFJLGVBQWUsR0FBSTtJQUV2QixNQUFNNEQsY0FBYyxHQUFHLElBQUksQ0FBQ2pNLElBQUksQ0FBQ2lNLGNBQWMsSUFBSSxJQUFJLENBQUNqTSxJQUFJLENBQUNvRCxVQUFVO0lBQ3ZFLE1BQU04SSxlQUFlLEdBQUcsSUFBSSxDQUFDbE0sSUFBSSxDQUFDa00sZUFBZSxJQUFJLElBQUksQ0FBQ2xNLElBQUksQ0FBQ3FELFdBQVc7SUFFMUUsSUFBSSxDQUFDUCxHQUFHLENBQUNDLElBQUksQ0FBRSxhQUFZLElBQUksQ0FBQy9DLElBQUksQ0FBQ29ELFVBQVcsSUFBRyxJQUFJLENBQUNwRCxJQUFJLENBQUNxRCxXQUFZLEdBQUUsR0FDeEUsb0JBQW1CNEksY0FBZSxJQUFHQyxlQUFnQixHQUFFLENBQUM7SUFFM0QsSUFBSSxJQUFJLENBQUM1SyxJQUFJLENBQUM2SyxlQUFlLEVBQUU7TUFDN0IsSUFBSSxDQUFDckosR0FBRyxDQUFDQyxJQUFJLENBQUUsaUNBQWdDLEdBQzVDLGlDQUFnQyxJQUFJLENBQUN6QixJQUFJLENBQUM2SyxlQUFnQixNQUFLLENBQUM7TUFDbkUsTUFBTSxJQUFJLENBQUMvRyxHQUFHLENBQUMrRyxlQUFlLENBQUMsSUFBSSxDQUFDN0ssSUFBSSxDQUFDNkssZUFBZSxFQUFFRixjQUFjLEVBQUVDLGVBQWUsQ0FBQztNQUMxRjtJQUNGO0lBQ0EsSUFBSSxJQUFJLENBQUNsTSxJQUFJLENBQUNzTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUN0TCxJQUFJLENBQUNvTSxjQUFjLEtBQzNDLE1BQU0sSUFBSSxDQUFDaEgsR0FBRyxDQUFDaUgsYUFBYSxDQUFDLElBQUksQ0FBQ3JNLElBQUksQ0FBQ29ELFVBQVUsQ0FBQyxHQUFFO01BQ3pELElBQUksQ0FBQ04sR0FBRyxDQUFDQyxJQUFJLENBQUUsSUFBRyxJQUFJLENBQUMvQyxJQUFJLENBQUNvRCxVQUFXLCtDQUE4QyxHQUNsRixtR0FBa0csQ0FBQztNQUN0RztJQUNGO0lBQ0EsTUFBTSxJQUFJLENBQUNnQyxHQUFHLENBQUNrSCxRQUFRLENBQUM7TUFDdEJ0SixHQUFHLEVBQUUsSUFBSSxDQUFDaEQsSUFBSSxDQUFDb0QsVUFBVTtNQUN6QkgsUUFBUSxFQUFFLElBQUksQ0FBQ2pELElBQUksQ0FBQ3FELFdBQVc7TUFDL0JrSixNQUFNLEVBQUUsSUFBSSxDQUFDdk0sSUFBSSxDQUFDd00sWUFBWSxJQUFJLDRCQUE0QjtNQUM5REMsUUFBUSxFQUFFLElBQUksQ0FBQ3pNLElBQUksQ0FBQzBNLGNBQWMsSUFBSSxrQ0FBa0M7TUFDeEVDLEtBQUssRUFBRSxJQUFJLENBQUMzTSxJQUFJLENBQUM0TSxXQUFXLElBQUksWUFBWTtNQUM1Q0MsT0FBTyxFQUFFLElBQUksQ0FBQzdNLElBQUksQ0FBQ2lNLGNBQWM7TUFDakNhLFlBQVksRUFBRSxJQUFJLENBQUM5TSxJQUFJLENBQUNrTSxlQUFlO01BQ3ZDYSxhQUFhLEVBQUUsSUFBSSxDQUFDL00sSUFBSSxDQUFDZ04sZ0JBQWdCO01BQ3pDQyxZQUFZLEVBQUUsSUFBSSxDQUFDak4sSUFBSSxDQUFDa04sZUFBZTtNQUN2Q0MsdUJBQXVCLEVBQUUsSUFBSSxDQUFDbk4sSUFBSSxDQUFDbU4sdUJBQXVCO01BQzFEQyxPQUFPLEVBQUUsSUFBSSxDQUFDcE4sSUFBSSxDQUFDb00sY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDcE0sSUFBSSxDQUFDcU4sa0JBQWtCO01BQ2xFQyxLQUFLLEVBQUUsSUFBSTtNQUNYQyxJQUFJLEVBQUUsSUFBSSxDQUFDdk4sSUFBSSxDQUFDd047SUFDbEIsQ0FBQyxDQUFDO0VBQ0o7RUFFQSxNQUFNbkosYUFBYSxHQUFJO0lBQ3JCLElBQUksQ0FBQ3ZCLEdBQUcsQ0FBQ2lDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQztJQUUvQyxNQUFNMEksd0JBQXdCLEdBQUcsQ0FBQyxZQUFZO01BQzVDLElBQUksQ0FBQ3RNLGVBQUMsQ0FBQ3VNLE9BQU8sQ0FBQyxJQUFJLENBQUNDLDBCQUEwQixDQUFDLEVBQUU7UUFDL0MsTUFBTSxJQUFJLENBQUNDLG1CQUFtQixFQUFFO01BQ2xDO0lBQ0YsQ0FBQyxFQUFFLFlBQVk7TUFDYixJQUFJLE1BQU0sSUFBSSxDQUFDQyx1Q0FBdUMsRUFBRSxFQUFFO1FBQ3hELE1BQU0sSUFBSSxDQUFDQyxrQ0FBa0MsRUFBRTtNQUNqRDtJQUNGLENBQUMsRUFBRSxZQUFZO01BQ2IsSUFBSSxDQUFDM00sZUFBQyxDQUFDdU0sT0FBTyxDQUFDLElBQUksQ0FBQ0sscUJBQXFCLENBQUMsRUFBRTtRQUMxQyxNQUFNLElBQUksQ0FBQ0MseUJBQXlCLEVBQUU7TUFDeEM7SUFDRixDQUFDLENBQUM7SUFFRixNQUFNclAsbUNBQWMsQ0FBQ3NQLGlDQUFpQyxDQUFDLElBQUksQ0FBQ0MsTUFBTSxFQUFFLElBQUksQ0FBQ3pNLFNBQVMsQ0FBQztJQUVuRixJQUFJLElBQUksQ0FBQ3BCLFlBQVksRUFBRTtNQUNyQixJQUFJO1FBQ0YsTUFBTSxJQUFJLENBQUM4Tix1QkFBdUIsRUFBRTtNQUN0QyxDQUFDLENBQUMsT0FBT0MsR0FBRyxFQUFFO1FBQ1osSUFBSSxDQUFDdEwsR0FBRyxDQUFDc0UsSUFBSSxDQUFFLHdDQUF1Q2dILEdBQUcsQ0FBQ3RELE9BQVEsRUFBQyxDQUFDO01BQ3RFO01BQ0EsSUFBSSxJQUFJLENBQUN4SyxjQUFjLEVBQUU7UUFDdkIsSUFBSTtVQUNGLE1BQU0sSUFBSSxDQUFDRCxZQUFZLENBQUNnRSxhQUFhLEVBQUU7UUFDekMsQ0FBQyxDQUFDLE9BQU8rSixHQUFHLEVBQUU7VUFDWixJQUFJLENBQUN0TCxHQUFHLENBQUNzRSxJQUFJLENBQUUsa0RBQWlEZ0gsR0FBRyxDQUFDdEQsT0FBUSxFQUFDLENBQUM7UUFDaEY7TUFDRjtNQUNBLElBQUksQ0FBQ3pLLFlBQVksR0FBRyxJQUFJO0lBQzFCO0lBQ0EsSUFBSSxDQUFDQyxjQUFjLEdBQUcsS0FBSztJQUUzQixJQUFJLElBQUksQ0FBQzhFLEdBQUcsRUFBRTtNQUNaLE1BQU04RixpQkFBQyxDQUFDQyxHQUFHLENBQUNzQyx3QkFBd0IsQ0FBQ3JDLEdBQUcsQ0FBRWlELElBQUksSUFBSztRQUNqRCxDQUFDLFlBQVk7VUFDWCxJQUFJO1lBQ0YsTUFBTUEsSUFBSSxFQUFFO1VBQ2QsQ0FBQyxDQUFDLE9BQU9DLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLENBQUMsR0FBRztNQUNOLENBQUMsQ0FBQyxDQUFDO01BRUgsSUFBSSxJQUFJLENBQUN0TyxJQUFJLENBQUN1TyxlQUFlLElBQUksSUFBSSxDQUFDdk8sSUFBSSxDQUFDd08sYUFBYSxJQUFJLElBQUksQ0FBQ2pPLFVBQVUsRUFBRTtRQUMzRSxJQUFJLENBQUN1QyxHQUFHLENBQUNpQyxLQUFLLENBQUUscUJBQW9CLElBQUksQ0FBQ3hFLFVBQVcsR0FBRSxDQUFDO1FBQ3ZELElBQUk7VUFDRixNQUFNLElBQUksQ0FBQzZFLEdBQUcsQ0FBQ3FKLE1BQU0sQ0FBQyxJQUFJLENBQUNsTyxVQUFVLENBQUM7UUFDeEMsQ0FBQyxDQUFDLE9BQU82TixHQUFHLEVBQUU7VUFDWixJQUFJLENBQUN0TCxHQUFHLENBQUNzRSxJQUFJLENBQUUsd0JBQXVCZ0gsR0FBRyxDQUFDdEQsT0FBUSxFQUFDLENBQUM7UUFDdEQ7TUFDRjtNQUNBLElBQUksSUFBSSxDQUFDeEosSUFBSSxDQUFDNkssZUFBZSxFQUFFO1FBQzdCLElBQUksQ0FBQ3JKLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLHFEQUFxRCxDQUFDO1FBQ3BFLE1BQU0sSUFBSSxDQUFDcUMsR0FBRyxDQUFDc0osa0JBQWtCLEVBQUU7UUFFbkMsSUFBSSxJQUFJLENBQUNwTixJQUFJLENBQUNxTix3QkFBd0IsRUFBRTtVQUN0QyxJQUFJLENBQUM3TCxHQUFHLENBQUNDLElBQUksQ0FBRSw2QkFBNEIsSUFBSSxDQUFDekIsSUFBSSxDQUFDcU4sd0JBQXlCLGdDQUErQixDQUFDO1VBQzlHLE1BQU0sSUFBSSxDQUFDdkosR0FBRyxDQUFDd0osU0FBUyxDQUFDLElBQUksQ0FBQ3ROLElBQUksQ0FBQ3FOLHdCQUF3QixDQUFDO1FBQzlELENBQUMsTUFBTTtVQUNMLElBQUksQ0FBQzdMLEdBQUcsQ0FBQ3NFLElBQUksQ0FBQywyRkFBMkYsQ0FBQztRQUM1RztNQUNGO01BQ0EsSUFBSSxJQUFJLENBQUNwSCxJQUFJLENBQUNvRCxVQUFVLEVBQUU7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQ1AsZUFBZSxJQUNsQixDQUFDLElBQUksQ0FBQzdDLElBQUksQ0FBQ3FOLGtCQUFrQixJQUM3QixDQUFDLElBQUksQ0FBQ3JOLElBQUksQ0FBQ3NMLE9BQU8sRUFBRTtVQUN6QixJQUFJO1lBQ0YsTUFBTSxJQUFJLENBQUNsRyxHQUFHLENBQUN5SixTQUFTLENBQUMsSUFBSSxDQUFDN08sSUFBSSxDQUFDb0QsVUFBVSxDQUFDO1VBQ2hELENBQUMsQ0FBQyxPQUFPZ0wsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDdEwsR0FBRyxDQUFDc0UsSUFBSSxDQUFFLDZCQUE0QmdILEdBQUcsQ0FBQ3RELE9BQVEsRUFBQyxDQUFDO1VBQzNEO1FBQ0Y7UUFDQSxJQUFJLElBQUksQ0FBQzlLLElBQUksQ0FBQ3VDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQ3ZDLElBQUksQ0FBQzRMLGFBQWEsRUFBRTtVQUNuRCxJQUFJLENBQUM5SSxHQUFHLENBQUNpQyxLQUFLLENBQUUsdURBQXNELElBQUksQ0FBQy9FLElBQUksQ0FBQ29ELFVBQVcsR0FBRSxDQUFDO1VBQzlGLElBQUk7WUFDRixNQUFNLElBQUksQ0FBQ2dDLEdBQUcsQ0FBQ3lHLFlBQVksQ0FBQyxJQUFJLENBQUM3TCxJQUFJLENBQUNvRCxVQUFVLENBQUM7VUFDbkQsQ0FBQyxDQUFDLE9BQU9nTCxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUN0TCxHQUFHLENBQUNzRSxJQUFJLENBQUUsNEJBQTJCZ0gsR0FBRyxDQUFDdEQsT0FBUSxFQUFDLENBQUM7VUFDMUQ7UUFDRjtNQUNGO01BRUEsSUFBSSxJQUFJLENBQUNoRCwyQkFBMkIsRUFBRTtRQUNwQyxJQUFJLENBQUNoRixHQUFHLENBQUNDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztRQUNqRCxNQUFNLElBQUksQ0FBQ3FDLEdBQUcsQ0FBQ3lDLGlCQUFpQixDQUFDLElBQUksQ0FBQztNQUN4QztNQUNBLE1BQU0sSUFBSSxDQUFDekMsR0FBRyxDQUFDMEosVUFBVSxFQUFFO01BQzNCLElBQUk7UUFDRixNQUFNLElBQUksQ0FBQzFJLGlCQUFpQixFQUFFO01BQ2hDLENBQUMsQ0FBQyxPQUFPMkksS0FBSyxFQUFFO1FBQ2QsSUFBSSxDQUFDak0sR0FBRyxDQUFDc0UsSUFBSSxDQUFFLHlDQUF3QzJILEtBQUssQ0FBQ2pFLE9BQVEsRUFBQyxDQUFDO01BR3pFO01BQ0EsSUFBSTtRQUNGLE1BQU0sSUFBSSxDQUFDdEUsc0JBQXNCLEVBQUU7TUFDckMsQ0FBQyxDQUFDLE9BQU91SSxLQUFLLEVBQUU7UUFDZCxJQUFJLENBQUNqTSxHQUFHLENBQUNzRSxJQUFJLENBQUUsK0NBQThDMkgsS0FBSyxDQUFDakUsT0FBUSxFQUFDLENBQUM7TUFHL0U7TUFFQSxJQUFJLE9BQU0sSUFBSSxDQUFDMUYsR0FBRyxDQUFDMEIsV0FBVyxFQUFFLEtBQUksRUFBRSxFQUFFO1FBQ3RDLElBQUksQ0FBQ2hFLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLGlFQUFpRSxDQUFDO1FBQ2hGLE1BQU0sSUFBSSxDQUFDcUMsR0FBRyxDQUFDNEoseUJBQXlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQ2hQLElBQUksQ0FBQ2dILDBCQUEwQixDQUFDO01BQ2xGO01BRUEsSUFBSSxJQUFJLENBQUNoSCxJQUFJLENBQUNzRCxNQUFNLEVBQUU7UUFDcEIsSUFBSTJMLE9BQU8sR0FBRyxJQUFJLENBQUNqUCxJQUFJLENBQUNxRixHQUFHLENBQUNLLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQzVDLEdBQUcsQ0FBQ2lDLEtBQUssQ0FBRSxxQkFBb0JrSyxPQUFRLEdBQUUsQ0FBQztRQUMvQyxJQUFJO1VBQ0YsTUFBTSxJQUFJLENBQUM3SixHQUFHLENBQUM4SixZQUFZLENBQUNELE9BQU8sQ0FBQztRQUN0QyxDQUFDLENBQUMsT0FBT2IsR0FBRyxFQUFFO1VBQ1osSUFBSSxDQUFDdEwsR0FBRyxDQUFDc0UsSUFBSSxDQUFFLDZCQUE0QmdILEdBQUcsQ0FBQ3RELE9BQVEsRUFBQyxDQUFDO1FBQzNEO01BQ0Y7SUFDRjtJQUNBLElBQUksSUFBSSxDQUFDOUcsV0FBVyxFQUFFO01BQ3BCLElBQUksQ0FBQ2xCLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDO01BQ3JDLElBQUksQ0FBQ2lCLFdBQVcsQ0FBQ21MLElBQUksRUFBRTtJQUN6QjtJQUNBLE1BQU0sS0FBSyxDQUFDOUssYUFBYSxFQUFFO0VBQzdCO0VBRUEsTUFBTVQsZUFBZSxHQUFJO0lBQ3ZCLElBQUksQ0FBQ2QsR0FBRyxDQUFDaUMsS0FBSyxDQUFDLDBDQUEwQyxDQUFDO0lBQzFELElBQUksRUFBRSxNQUFNcUssV0FBRSxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDclAsSUFBSSxDQUFDd0QsR0FBRyxDQUFDLENBQUMsRUFBRTtNQUNyQyxJQUFJLENBQUNWLEdBQUcsQ0FBQ3lDLGFBQWEsQ0FBRSw4QkFBNkIsSUFBSSxDQUFDdkYsSUFBSSxDQUFDd0QsR0FBSSxHQUFFLENBQUM7SUFDeEU7RUFDRjtFQUVBLE1BQU0xQyxnQkFBZ0IsR0FBSSxDQUcxQjtFQUtBLE1BQU13Tyx1QkFBdUIsQ0FBRUMsT0FBTyxFQUFFO0lBQ3RDLE1BQU1BLE9BQU8sRUFBRTtJQUNmLE1BQU0sSUFBSSxDQUFDbkssR0FBRyxDQUFDb0ssT0FBTyxFQUFFO0lBQ3hCLE1BQU0sSUFBSSxDQUFDN0osa0JBQWtCLEVBQUU7SUFDL0IsTUFBTSxJQUFJLENBQUNXLHVCQUF1QixFQUFFO0VBQ3RDO0VBRUFtSixXQUFXLENBQUVoTyxTQUFTLEVBQUU7SUFDdEIsS0FBSyxDQUFDZ08sV0FBVyxDQUFDaE8sU0FBUyxDQUFDO0lBRzVCLE9BQU8sSUFBSTtFQUNiO0VBRUFpTyxRQUFRLENBQUVqTyxTQUFTLEVBQUU7SUFDbkIsS0FBSyxDQUFDaU8sUUFBUSxDQUFDak8sU0FBUyxDQUFDO0lBR3pCLE9BQU8sSUFBSTtFQUNiO0VBRUFrTyxpQkFBaUIsQ0FBRWxPLFNBQVMsRUFBRTtJQUM1QixLQUFLLENBQUNrTyxpQkFBaUIsQ0FBQ2xPLFNBQVMsQ0FBQztJQUdsQyxJQUFJM0MsYUFBSSxDQUFDbUksUUFBUSxDQUFDLElBQUksQ0FBQ2pHLFlBQVksQ0FBQyxFQUFFO01BRXBDLElBQUksQ0FBQ1IsYUFBYSxHQUFHYixlQUFlO0lBQ3RDLENBQUMsTUFBTTtNQUNMLElBQUksQ0FBQ2EsYUFBYSxHQUFHZixRQUFRO0lBQy9CO0lBQ0EsSUFBSSxJQUFJLENBQUNPLElBQUksQ0FBQzRQLG1CQUFtQixFQUFFO01BQ2pDLElBQUksQ0FBQ3BQLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDQSxhQUFhLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSWQsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQztJQUNqRztJQUVBLE9BQU8sSUFBSSxDQUFDYyxhQUFhO0VBQzNCO0VBRUEsSUFBSXFDLGVBQWUsR0FBSTtJQUNyQixPQUFPdEUsT0FBTyxDQUFDc1IsZUFBZSxDQUFDLElBQUksQ0FBQzdQLElBQUksQ0FBQ21ELFdBQVcsQ0FBQztFQUN2RDtBQUNGO0FBQUM7QUFHRCxLQUFLLElBQUksQ0FBQzJNLEdBQUcsRUFBRTVPLEVBQUUsQ0FBQyxJQUFJQyxlQUFDLENBQUM0TyxPQUFPLENBQUNDLG9DQUFlLENBQUMsRUFBRTtFQUNoRG5RLHlCQUF5QixDQUFDb1EsU0FBUyxDQUFDSCxHQUFHLENBQUMsR0FBRzVPLEVBQUU7QUFDL0M7QUFHQSxLQUFLLElBQUksQ0FBQzRPLEdBQUcsRUFBRTVPLEVBQUUsQ0FBQyxJQUFJQyxlQUFDLENBQUM0TyxPQUFPLENBQUNHLGNBQVEsQ0FBQyxFQUFFO0VBQ3pDclEseUJBQXlCLENBQUNvUSxTQUFTLENBQUNILEdBQUcsQ0FBQyxHQUFHNU8sRUFBRTtBQUMvQztBQUFDLGVBR2NyQix5QkFBeUI7QUFBQSJ9
|
package/build/lib/driver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.js","names":["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","constructor","opts","shouldValidateCaps","shell","locatorStrategies","desiredCapConstraints","uiautomator2","jwpProxyActive","defaultIME","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","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","unicodeKeyboard","resetKeyboard","setIME","endAndroidCoverage","androidCoverageEndIntent","broadcast","forceStop","stopLogcat","error","setDefaultHiddenApiPolicy","avdName","killEmulator","stop","fs","exists","wrapBootstrapDisconnect","wrapped","restart","proxyActive","canProxy","getProxyAvoidList","nativeWebScreenshot","isChromeBrowser","cmd","toPairs","androidCommands","prototype","commands"],"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 { 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 {\n androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID\n} 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 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.defaultIME = null;\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 this.defaultIME = 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 } else {\n if (this.opts.noReset && await this.adb.processExists(this.opts.appPackage)) {\n this.log.info(`'${this.opts.appPackage}' is already running`);\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.dontStopAppOnReset,\n retry: true,\n user: this.opts.userProfile,\n });\n }\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.opts.unicodeKeyboard && this.opts.resetKeyboard && this.defaultIME) {\n this.log.debug(`Resetting IME to '${this.defaultIME}'`);\n try {\n await this.adb.setIME(this.defaultIME);\n } catch (err) {\n this.log.warn(`Unable to reset IME: ${err.message}`);\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\n && !this.opts.dontStopAppOnReset\n && !this.opts.noReset) {\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":["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","constructor","opts","shouldValidateCaps","shell","locatorStrategies","desiredCapConstraints","uiautomator2","jwpProxyActive","defaultIME","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","unicodeKeyboard","resetKeyboard","setIME","endAndroidCoverage","androidCoverageEndIntent","broadcast","forceStop","stopLogcat","error","setDefaultHiddenApiPolicy","avdName","killEmulator","stop","fs","exists","wrapBootstrapDisconnect","wrapped","restart","proxyActive","canProxy","getProxyAvoidList","nativeWebScreenshot","isChromeBrowser","cmd","toPairs","androidCommands","prototype","commands"],"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 { 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 {\n androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID\n} 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 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.defaultIME = null;\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 this.defaultIME = 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.opts.unicodeKeyboard && this.opts.resetKeyboard && this.defaultIME) {\n this.log.debug(`Resetting IME to '${this.defaultIME}'`);\n try {\n await this.adb.setIME(this.defaultIME);\n } catch (err) {\n this.log.warn(`Unable to reset IME: ${err.message}`);\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\n && !this.opts.dontStopAppOnReset\n && !this.opts.noReset) {\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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"}
|
package/lib/desired-caps.js
CHANGED
package/lib/driver.js
CHANGED
|
@@ -575,28 +575,29 @@ class AndroidUiautomator2Driver extends BaseDriver {
|
|
|
575
575
|
this.log.info(`androidCoverage is configured. ` +
|
|
576
576
|
` Starting instrumentation of '${this.caps.androidCoverage}'...`);
|
|
577
577
|
await this.adb.androidCoverage(this.caps.androidCoverage, appWaitPackage, appWaitActivity);
|
|
578
|
-
|
|
579
|
-
if (this.opts.noReset && await this.adb.processExists(this.opts.appPackage)) {
|
|
580
|
-
this.log.info(`'${this.opts.appPackage}' is already running`);
|
|
581
|
-
return;
|
|
582
|
-
}
|
|
583
|
-
await this.adb.startApp({
|
|
584
|
-
pkg: this.opts.appPackage,
|
|
585
|
-
activity: this.opts.appActivity,
|
|
586
|
-
action: this.opts.intentAction || 'android.intent.action.MAIN',
|
|
587
|
-
category: this.opts.intentCategory || 'android.intent.category.LAUNCHER',
|
|
588
|
-
flags: this.opts.intentFlags || '0x10200000', // FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
|
|
589
|
-
waitPkg: this.opts.appWaitPackage,
|
|
590
|
-
waitActivity: this.opts.appWaitActivity,
|
|
591
|
-
waitForLaunch: this.opts.appWaitForLaunch,
|
|
592
|
-
waitDuration: this.opts.appWaitDuration,
|
|
593
|
-
optionalIntentArguments: this.opts.optionalIntentArguments,
|
|
594
|
-
stopApp: !this.opts.dontStopAppOnReset,
|
|
595
|
-
retry: true,
|
|
596
|
-
user: this.opts.userProfile,
|
|
597
|
-
});
|
|
578
|
+
return;
|
|
598
579
|
}
|
|
599
|
-
|
|
580
|
+
if (this.opts.noReset && !this.opts.forceAppLaunch
|
|
581
|
+
&& await this.adb.processExists(this.opts.appPackage)) {
|
|
582
|
+
this.log.info(`'${this.opts.appPackage}' is already running and noReset is enabled. ` +
|
|
583
|
+
`Set forceAppLaunch capability to true if the app must be forcefully restarted on session startup.`);
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
await this.adb.startApp({
|
|
587
|
+
pkg: this.opts.appPackage,
|
|
588
|
+
activity: this.opts.appActivity,
|
|
589
|
+
action: this.opts.intentAction || 'android.intent.action.MAIN',
|
|
590
|
+
category: this.opts.intentCategory || 'android.intent.category.LAUNCHER',
|
|
591
|
+
flags: this.opts.intentFlags || '0x10200000', // FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
|
|
592
|
+
waitPkg: this.opts.appWaitPackage,
|
|
593
|
+
waitActivity: this.opts.appWaitActivity,
|
|
594
|
+
waitForLaunch: this.opts.appWaitForLaunch,
|
|
595
|
+
waitDuration: this.opts.appWaitDuration,
|
|
596
|
+
optionalIntentArguments: this.opts.optionalIntentArguments,
|
|
597
|
+
stopApp: this.opts.forceAppLaunch || !this.opts.dontStopAppOnReset,
|
|
598
|
+
retry: true,
|
|
599
|
+
user: this.opts.userProfile,
|
|
600
|
+
});
|
|
600
601
|
}
|
|
601
602
|
|
|
602
603
|
async deleteSession () {
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-uiautomator2-driver",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.12.0",
|
|
4
4
|
"lockfileVersion": 2,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "appium-uiautomator2-driver",
|
|
9
|
-
"version": "2.
|
|
9
|
+
"version": "2.12.0",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@babel/runtime": "^7.0.0",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"semantic-release": "^19.0.2",
|
|
51
51
|
"sinon": "^15.0.0",
|
|
52
52
|
"unzipper": "^0.x",
|
|
53
|
-
"webdriverio": "^
|
|
53
|
+
"webdriverio": "^8.0.5",
|
|
54
54
|
"xpath": "^0.x"
|
|
55
55
|
},
|
|
56
56
|
"engines": {
|
|
@@ -971,7 +971,7 @@
|
|
|
971
971
|
}
|
|
972
972
|
},
|
|
973
973
|
"node_modules/@types/node": {
|
|
974
|
-
"version": "18.11.
|
|
974
|
+
"version": "18.11.11",
|
|
975
975
|
"license": "MIT"
|
|
976
976
|
},
|
|
977
977
|
"node_modules/@types/normalize-package-data": {
|
|
@@ -1198,7 +1198,7 @@
|
|
|
1198
1198
|
}
|
|
1199
1199
|
},
|
|
1200
1200
|
"node_modules/appium-android-driver": {
|
|
1201
|
-
"version": "5.8.
|
|
1201
|
+
"version": "5.8.1",
|
|
1202
1202
|
"license": "Apache-2.0",
|
|
1203
1203
|
"dependencies": {
|
|
1204
1204
|
"@babel/runtime": "^7.0.0",
|
|
@@ -1255,7 +1255,7 @@
|
|
|
1255
1255
|
}
|
|
1256
1256
|
},
|
|
1257
1257
|
"node_modules/appium-uiautomator2-server": {
|
|
1258
|
-
"version": "5.7.
|
|
1258
|
+
"version": "5.7.5",
|
|
1259
1259
|
"license": "Apache-2.0",
|
|
1260
1260
|
"engines": {
|
|
1261
1261
|
"node": ">=14",
|
|
@@ -1394,7 +1394,7 @@
|
|
|
1394
1394
|
"license": "MIT"
|
|
1395
1395
|
},
|
|
1396
1396
|
"node_modules/axios": {
|
|
1397
|
-
"version": "1.2.
|
|
1397
|
+
"version": "1.2.1",
|
|
1398
1398
|
"license": "MIT",
|
|
1399
1399
|
"dependencies": {
|
|
1400
1400
|
"follow-redirects": "^1.15.0",
|
|
@@ -1998,7 +1998,7 @@
|
|
|
1998
1998
|
}
|
|
1999
1999
|
},
|
|
2000
2000
|
"node_modules/es-abstract": {
|
|
2001
|
-
"version": "1.20.
|
|
2001
|
+
"version": "1.20.5",
|
|
2002
2002
|
"extraneous": true,
|
|
2003
2003
|
"license": "MIT",
|
|
2004
2004
|
"dependencies": {
|
|
@@ -2008,6 +2008,7 @@
|
|
|
2008
2008
|
"function.prototype.name": "^1.1.5",
|
|
2009
2009
|
"get-intrinsic": "^1.1.3",
|
|
2010
2010
|
"get-symbol-description": "^1.0.0",
|
|
2011
|
+
"gopd": "^1.0.1",
|
|
2011
2012
|
"has": "^1.0.3",
|
|
2012
2013
|
"has-property-descriptors": "^1.0.0",
|
|
2013
2014
|
"has-symbols": "^1.0.3",
|
|
@@ -2023,8 +2024,8 @@
|
|
|
2023
2024
|
"object.assign": "^4.1.4",
|
|
2024
2025
|
"regexp.prototype.flags": "^1.4.3",
|
|
2025
2026
|
"safe-regex-test": "^1.0.0",
|
|
2026
|
-
"string.prototype.trimend": "^1.0.
|
|
2027
|
-
"string.prototype.trimstart": "^1.0.
|
|
2027
|
+
"string.prototype.trimend": "^1.0.6",
|
|
2028
|
+
"string.prototype.trimstart": "^1.0.6",
|
|
2028
2029
|
"unbox-primitive": "^1.0.2"
|
|
2029
2030
|
},
|
|
2030
2031
|
"engines": {
|
|
@@ -2451,6 +2452,17 @@
|
|
|
2451
2452
|
"process": "^0.11.10"
|
|
2452
2453
|
}
|
|
2453
2454
|
},
|
|
2455
|
+
"node_modules/gopd": {
|
|
2456
|
+
"version": "1.0.1",
|
|
2457
|
+
"extraneous": true,
|
|
2458
|
+
"license": "MIT",
|
|
2459
|
+
"dependencies": {
|
|
2460
|
+
"get-intrinsic": "^1.1.3"
|
|
2461
|
+
},
|
|
2462
|
+
"funding": {
|
|
2463
|
+
"url": "https://github.com/sponsors/ljharb"
|
|
2464
|
+
}
|
|
2465
|
+
},
|
|
2454
2466
|
"node_modules/got": {
|
|
2455
2467
|
"version": "11.8.5",
|
|
2456
2468
|
"license": "MIT",
|
|
@@ -2651,7 +2663,7 @@
|
|
|
2651
2663
|
}
|
|
2652
2664
|
},
|
|
2653
2665
|
"node_modules/io.appium.settings": {
|
|
2654
|
-
"version": "4.2.
|
|
2666
|
+
"version": "4.2.4",
|
|
2655
2667
|
"license": "Apache-2.0",
|
|
2656
2668
|
"engines": {
|
|
2657
2669
|
"node": ">=14",
|
|
@@ -3251,7 +3263,7 @@
|
|
|
3251
3263
|
}
|
|
3252
3264
|
},
|
|
3253
3265
|
"node_modules/marked": {
|
|
3254
|
-
"version": "4.2.
|
|
3266
|
+
"version": "4.2.4",
|
|
3255
3267
|
"extraneous": true,
|
|
3256
3268
|
"license": "MIT",
|
|
3257
3269
|
"bin": {
|
|
@@ -5750,7 +5762,7 @@
|
|
|
5750
5762
|
}
|
|
5751
5763
|
},
|
|
5752
5764
|
"@types/node": {
|
|
5753
|
-
"version": "18.11.
|
|
5765
|
+
"version": "18.11.11"
|
|
5754
5766
|
},
|
|
5755
5767
|
"@types/normalize-package-data": {
|
|
5756
5768
|
"version": "2.4.1"
|
|
@@ -5908,7 +5920,7 @@
|
|
|
5908
5920
|
}
|
|
5909
5921
|
},
|
|
5910
5922
|
"appium-android-driver": {
|
|
5911
|
-
"version": "5.8.
|
|
5923
|
+
"version": "5.8.1",
|
|
5912
5924
|
"requires": {
|
|
5913
5925
|
"@babel/runtime": "^7.0.0",
|
|
5914
5926
|
"appium-adb": "^9.10.9",
|
|
@@ -5951,7 +5963,7 @@
|
|
|
5951
5963
|
}
|
|
5952
5964
|
},
|
|
5953
5965
|
"appium-uiautomator2-server": {
|
|
5954
|
-
"version": "5.7.
|
|
5966
|
+
"version": "5.7.5"
|
|
5955
5967
|
},
|
|
5956
5968
|
"aproba": {
|
|
5957
5969
|
"version": "2.0.0"
|
|
@@ -6054,7 +6066,7 @@
|
|
|
6054
6066
|
"version": "0.4.0"
|
|
6055
6067
|
},
|
|
6056
6068
|
"axios": {
|
|
6057
|
-
"version": "1.2.
|
|
6069
|
+
"version": "1.2.1",
|
|
6058
6070
|
"requires": {
|
|
6059
6071
|
"follow-redirects": "^1.15.0",
|
|
6060
6072
|
"form-data": "^4.0.0",
|
|
@@ -6426,7 +6438,7 @@
|
|
|
6426
6438
|
}
|
|
6427
6439
|
},
|
|
6428
6440
|
"es-abstract": {
|
|
6429
|
-
"version": "1.20.
|
|
6441
|
+
"version": "1.20.5",
|
|
6430
6442
|
"extraneous": true,
|
|
6431
6443
|
"requires": {
|
|
6432
6444
|
"call-bind": "^1.0.2",
|
|
@@ -6435,6 +6447,7 @@
|
|
|
6435
6447
|
"function.prototype.name": "^1.1.5",
|
|
6436
6448
|
"get-intrinsic": "^1.1.3",
|
|
6437
6449
|
"get-symbol-description": "^1.0.0",
|
|
6450
|
+
"gopd": "^1.0.1",
|
|
6438
6451
|
"has": "^1.0.3",
|
|
6439
6452
|
"has-property-descriptors": "^1.0.0",
|
|
6440
6453
|
"has-symbols": "^1.0.3",
|
|
@@ -6450,8 +6463,8 @@
|
|
|
6450
6463
|
"object.assign": "^4.1.4",
|
|
6451
6464
|
"regexp.prototype.flags": "^1.4.3",
|
|
6452
6465
|
"safe-regex-test": "^1.0.0",
|
|
6453
|
-
"string.prototype.trimend": "^1.0.
|
|
6454
|
-
"string.prototype.trimstart": "^1.0.
|
|
6466
|
+
"string.prototype.trimend": "^1.0.6",
|
|
6467
|
+
"string.prototype.trimstart": "^1.0.6",
|
|
6455
6468
|
"unbox-primitive": "^1.0.2"
|
|
6456
6469
|
}
|
|
6457
6470
|
},
|
|
@@ -6738,6 +6751,13 @@
|
|
|
6738
6751
|
"process": "^0.11.10"
|
|
6739
6752
|
}
|
|
6740
6753
|
},
|
|
6754
|
+
"gopd": {
|
|
6755
|
+
"version": "1.0.1",
|
|
6756
|
+
"extraneous": true,
|
|
6757
|
+
"requires": {
|
|
6758
|
+
"get-intrinsic": "^1.1.3"
|
|
6759
|
+
}
|
|
6760
|
+
},
|
|
6741
6761
|
"got": {
|
|
6742
6762
|
"version": "11.8.5",
|
|
6743
6763
|
"requires": {
|
|
@@ -6859,7 +6879,7 @@
|
|
|
6859
6879
|
}
|
|
6860
6880
|
},
|
|
6861
6881
|
"io.appium.settings": {
|
|
6862
|
-
"version": "4.2.
|
|
6882
|
+
"version": "4.2.4"
|
|
6863
6883
|
},
|
|
6864
6884
|
"ipaddr.js": {
|
|
6865
6885
|
"version": "1.9.1"
|
|
@@ -7248,7 +7268,7 @@
|
|
|
7248
7268
|
"requires": {}
|
|
7249
7269
|
},
|
|
7250
7270
|
"marked": {
|
|
7251
|
-
"version": "4.2.
|
|
7271
|
+
"version": "4.2.4",
|
|
7252
7272
|
"extraneous": true
|
|
7253
7273
|
},
|
|
7254
7274
|
"mdurl": {
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"automated testing",
|
|
8
8
|
"android"
|
|
9
9
|
],
|
|
10
|
-
"version": "2.
|
|
10
|
+
"version": "2.12.0",
|
|
11
11
|
"author": "Appium Contributors",
|
|
12
12
|
"license": "Apache-2.0",
|
|
13
13
|
"repository": {
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
"semantic-release": "^19.0.2",
|
|
116
116
|
"sinon": "^15.0.0",
|
|
117
117
|
"unzipper": "^0.x",
|
|
118
|
-
"webdriverio": "^
|
|
118
|
+
"webdriverio": "^8.0.5",
|
|
119
119
|
"xpath": "^0.x"
|
|
120
120
|
}
|
|
121
121
|
}
|