appium-adb 9.10.20 → 9.10.22
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 +14 -0
- package/build/lib/tools/lockmgmt.js +6 -14
- package/build/lib/tools/lockmgmt.js.map +1 -1
- package/lib/tools/lockmgmt.js +15 -16
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [9.10.22](https://github.com/appium/appium-adb/compare/v9.10.21...v9.10.22) (2023-01-13)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Miscellaneous Chores
|
|
5
|
+
|
|
6
|
+
* Bump rimraf from 3.0.2 to 4.0.4 ([#633](https://github.com/appium/appium-adb/issues/633)) ([2129c71](https://github.com/appium/appium-adb/commit/2129c7161a920f57af2ac3567c7967ccc8ba0658))
|
|
7
|
+
|
|
8
|
+
## [9.10.21](https://github.com/appium/appium-adb/compare/v9.10.20...v9.10.21) (2022-12-23)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Miscellaneous Chores
|
|
12
|
+
|
|
13
|
+
* Remove redundant debug calls ([#631](https://github.com/appium/appium-adb/issues/631)) ([69931b1](https://github.com/appium/appium-adb/commit/69931b15122f743edc65a1770080216310de05fc))
|
|
14
|
+
|
|
1
15
|
## [9.10.20](https://github.com/appium/appium-adb/compare/v9.10.19...v9.10.20) (2022-12-22)
|
|
2
16
|
|
|
3
17
|
|
|
@@ -7,9 +7,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.default = void 0;
|
|
8
8
|
require("source-map-support/register");
|
|
9
9
|
var _logger = _interopRequireDefault(require("../logger.js"));
|
|
10
|
-
var _path = _interopRequireDefault(require("path"));
|
|
11
10
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
12
|
-
var _support = require("@appium/support");
|
|
13
11
|
var _helpers = require("../helpers.js");
|
|
14
12
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
15
13
|
const lockManagementMethods = {};
|
|
@@ -29,9 +27,8 @@ function buildCommand(verb, oldCredential = null, ...args) {
|
|
|
29
27
|
}
|
|
30
28
|
return cmd;
|
|
31
29
|
}
|
|
32
|
-
async function swipeUp(
|
|
33
|
-
const
|
|
34
|
-
const dimensionsMatch = /init=(\d+)x(\d+)/.exec(output);
|
|
30
|
+
async function swipeUp(windowDumpsys) {
|
|
31
|
+
const dimensionsMatch = /init=(\d+)x(\d+)/.exec(windowDumpsys);
|
|
35
32
|
if (!dimensionsMatch) {
|
|
36
33
|
throw new Error('Cannot retrieve the display size');
|
|
37
34
|
}
|
|
@@ -41,7 +38,7 @@ async function swipeUp(adb) {
|
|
|
41
38
|
const y0 = displayHeight / 5 * 4;
|
|
42
39
|
const x1 = x0;
|
|
43
40
|
const y1 = displayHeight / 5;
|
|
44
|
-
await
|
|
41
|
+
await this.shell(['input', 'touchscreen', 'swipe', ...[x0, y0, x1, y1].map(c => Math.trunc(c))]);
|
|
45
42
|
}
|
|
46
43
|
lockManagementMethods.isLockManagementSupported = async function isLockManagementSupported() {
|
|
47
44
|
if (!_lodash.default.isBoolean(this._isLockManagementSupported)) {
|
|
@@ -132,11 +129,6 @@ lockManagementMethods.setLockCredential = async function setLockCredential(crede
|
|
|
132
129
|
};
|
|
133
130
|
lockManagementMethods.isScreenLocked = async function isScreenLocked() {
|
|
134
131
|
const stdout = await this.shell(['dumpsys', 'window']);
|
|
135
|
-
if (process.env.APPIUM_LOG_DUMPSYS) {
|
|
136
|
-
const dumpsysFile = _path.default.resolve(process.cwd(), 'dumpsys.log');
|
|
137
|
-
_logger.default.debug(`Writing dumpsys output to ${dumpsysFile}`);
|
|
138
|
-
await _support.fs.writeFile(dumpsysFile, stdout);
|
|
139
|
-
}
|
|
140
132
|
return (0, _helpers.isShowingLockscreen)(stdout) || (0, _helpers.isCurrentFocusOnKeyguard)(stdout) || !(0, _helpers.isScreenOnFully)(stdout);
|
|
141
133
|
};
|
|
142
134
|
lockManagementMethods.dismissKeyguard = async function dismissKeyguard() {
|
|
@@ -146,7 +138,7 @@ lockManagementMethods.dismissKeyguard = async function dismissKeyguard() {
|
|
|
146
138
|
await this.shell(['wm', 'dismiss-keyguard']);
|
|
147
139
|
return;
|
|
148
140
|
}
|
|
149
|
-
const stdout = await this.shell(['dumpsys', 'window'
|
|
141
|
+
const stdout = await this.shell(['dumpsys', 'window']);
|
|
150
142
|
if (!(0, _helpers.isCurrentFocusOnKeyguard)(stdout)) {
|
|
151
143
|
_logger.default.debug('The keyguard seems to be inactive');
|
|
152
144
|
return;
|
|
@@ -158,7 +150,7 @@ lockManagementMethods.dismissKeyguard = async function dismissKeyguard() {
|
|
|
158
150
|
_logger.default.debug('Dismissing notifications from the unlock view');
|
|
159
151
|
await this.shell(['service', 'call', 'notification', '1']);
|
|
160
152
|
await this.back();
|
|
161
|
-
await swipeUp(this);
|
|
153
|
+
await swipeUp.bind(this)(stdout);
|
|
162
154
|
};
|
|
163
155
|
lockManagementMethods.cycleWakeUp = async function cycleWakeUp() {
|
|
164
156
|
await this.keyevent(KEYCODE_POWER);
|
|
@@ -166,4 +158,4 @@ lockManagementMethods.cycleWakeUp = async function cycleWakeUp() {
|
|
|
166
158
|
};
|
|
167
159
|
var _default = lockManagementMethods;
|
|
168
160
|
exports.default = _default;
|
|
169
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2NrTWFuYWdlbWVudE1ldGhvZHMiLCJDUkVERU5USUFMX0NBTk5PVF9CRV9OVUxMX09SX0VNUFRZX0VSUk9SIiwiQ1JFREVOVElBTF9ESURfTk9UX01BVENIX0VSUk9SIiwiU1VQUE9SVEVEX0xPQ0tfQ1JFREVOVElBTF9UWVBFUyIsIktFWUNPREVfUE9XRVIiLCJLRVlDT0RFX1dBS0VVUCIsIkhJREVfS0VZQk9BUkRfV0FJVF9USU1FIiwiYnVpbGRDb21tYW5kIiwidmVyYiIsIm9sZENyZWRlbnRpYWwiLCJhcmdzIiwiY21kIiwiXyIsImlzRW1wdHkiLCJwdXNoIiwic3dpcGVVcCIsImFkYiIsIm91dHB1dCIsInNoZWxsIiwiZGltZW5zaW9uc01hdGNoIiwiZXhlYyIsIkVycm9yIiwiZGlzcGxheVdpZHRoIiwicGFyc2VJbnQiLCJkaXNwbGF5SGVpZ2h0IiwieDAiLCJ5MCIsIngxIiwieTEiLCJtYXAiLCJjIiwiTWF0aCIsInRydW5jIiwiaXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCIsImlzQm9vbGVhbiIsIl9pc0xvY2tNYW5hZ2VtZW50U3VwcG9ydGVkIiwicGFzc0ZsYWciLCJpZ24iLCJpbmNsdWRlcyIsImxvZyIsImRlYnVnIiwidmVyaWZ5TG9ja0NyZWRlbnRpYWwiLCJjcmVkZW50aWFsIiwic3Rkb3V0Iiwic3RkZXJyIiwib3V0cHV0Rm9ybWF0IiwiRVhFQ19PVVRQVVRfRk9STUFUIiwiRlVMTCIsInNvbWUiLCJ4IiwiZSIsIm1lc3NhZ2UiLCJjbGVhckxvY2tDcmVkZW50aWFsIiwiaXNMb2NrRW5hYmxlZCIsInRlc3QiLCJzZXRMb2NrQ3JlZGVudGlhbCIsImNyZWRlbnRpYWxUeXBlIiwiaXNJbnRlZ2VyIiwiaXNTY3JlZW5Mb2NrZWQiLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX0xPR19EVU1QU1lTIiwiZHVtcHN5c0ZpbGUiLCJwYXRoIiwicmVzb2x2ZSIsImN3ZCIsImZzIiwid3JpdGVGaWxlIiwiaXNTaG93aW5nTG9ja3NjcmVlbiIsImlzQ3VycmVudEZvY3VzT25LZXlndWFyZCIsImlzU2NyZWVuT25GdWxseSIsImRpc21pc3NLZXlndWFyZCIsImluZm8iLCJjeWNsZVdha2VVcCIsImdldEFwaUxldmVsIiwiaGlkZUtleWJvYXJkIiwiQiIsImRlbGF5IiwiYmFjayIsImtleWV2ZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3Rvb2xzL2xvY2ttZ210LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7XG4gIGlzU2hvd2luZ0xvY2tzY3JlZW4sIGlzQ3VycmVudEZvY3VzT25LZXlndWFyZCwgaXNTY3JlZW5PbkZ1bGx5LFxufSBmcm9tICcuLi9oZWxwZXJzLmpzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgbG9ja01hbmFnZW1lbnRNZXRob2RzID0ge307XG5cbmNvbnN0IENSRURFTlRJQUxfQ0FOTk9UX0JFX05VTExfT1JfRU1QVFlfRVJST1IgPSBgQ3JlZGVudGlhbCBjYW4ndCBiZSBudWxsIG9yIGVtcHR5YDtcbmNvbnN0IENSRURFTlRJQUxfRElEX05PVF9NQVRDSF9FUlJPUiA9IGBkaWRuJ3QgbWF0Y2hgO1xuY29uc3QgU1VQUE9SVEVEX0xPQ0tfQ1JFREVOVElBTF9UWVBFUyA9IFsncGFzc3dvcmQnLCAncGluJywgJ3BhdHRlcm4nXTtcbmNvbnN0IEtFWUNPREVfUE9XRVIgPSAyNjtcbmNvbnN0IEtFWUNPREVfV0FLRVVQID0gMjI0OyAvLyB3b3JrcyBvdmVyIEFQSSBMZXZlbCAyMFxuY29uc3QgSElERV9LRVlCT0FSRF9XQUlUX1RJTUUgPSAxMDA7XG5cbmZ1bmN0aW9uIGJ1aWxkQ29tbWFuZCAodmVyYiwgb2xkQ3JlZGVudGlhbCA9IG51bGwsIC4uLmFyZ3MpIHtcbiAgY29uc3QgY21kID0gWydsb2Nrc2V0dGluZ3MnLCB2ZXJiXTtcbiAgaWYgKCFfLmlzRW1wdHkob2xkQ3JlZGVudGlhbCkpIHtcbiAgICBjbWQucHVzaCgnLS1vbGQnLCBvbGRDcmVkZW50aWFsKTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eShhcmdzKSkge1xuICAgIGNtZC5wdXNoKC4uLmFyZ3MpO1xuICB9XG4gIHJldHVybiBjbWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN3aXBlVXAgKGFkYikge1xuICBjb25zdCBvdXRwdXQgPSBhd2FpdCBhZGIuc2hlbGwoWydkdW1wc3lzJywgJ3dpbmRvdyddKTtcbiAgY29uc3QgZGltZW5zaW9uc01hdGNoID0gL2luaXQ9KFxcZCspeChcXGQrKS8uZXhlYyhvdXRwdXQpO1xuICBpZiAoIWRpbWVuc2lvbnNNYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJldHJpZXZlIHRoZSBkaXNwbGF5IHNpemUnKTtcbiAgfVxuICBjb25zdCBkaXNwbGF5V2lkdGggPSBwYXJzZUludChkaW1lbnNpb25zTWF0Y2hbMV0sIDEwKTtcbiAgY29uc3QgZGlzcGxheUhlaWdodCA9IHBhcnNlSW50KGRpbWVuc2lvbnNNYXRjaFsyXSwgMTApO1xuICBjb25zdCB4MCA9IGRpc3BsYXlXaWR0aCAvIDI7XG4gIGNvbnN0IHkwID0gZGlzcGxheUhlaWdodCAvIDUgKiA0O1xuICBjb25zdCB4MSA9IHgwO1xuICBjb25zdCB5MSA9IGRpc3BsYXlIZWlnaHQgLyA1O1xuICBhd2FpdCBhZGIuc2hlbGwoW1xuICAgICdpbnB1dCcsICd0b3VjaHNjcmVlbicsICdzd2lwZScsXG4gICAgLi4uKFt4MCwgeTAsIHgxLCB5MV0ubWFwKChjKSA9PiBNYXRoLnRydW5jKGMpKSlcbiAgXSk7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIGxvY2sgc2V0dGluZ3MgbWFuYWdlbWVudCB3aXRoIGBsb2Nrc2V0dGluZ3NgXG4gKiBjb21tYW5kIGxpbmUgdG9vbC4gVGhpcyB0b29sIGhhcyBiZWVuIGFkZGVkIHRvIEFuZHJvaWQgdG9vbHNldCBzaW5jZSAgQVBJIDI3IE9yZW9cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBtYW5hZ2VtZW50IGlzIHN1cHBvcnRlZC4gVGhlIHJlc3VsdCBpcyBjYWNoZWQgcGVyIEFEQiBpbnN0YW5jZVxuICovXG5sb2NrTWFuYWdlbWVudE1ldGhvZHMuaXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzTG9ja01hbmFnZW1lbnRTdXBwb3J0ZWQgKCkge1xuICBpZiAoIV8uaXNCb29sZWFuKHRoaXMuX2lzTG9ja01hbmFnZW1lbnRTdXBwb3J0ZWQpKSB7XG4gICAgY29uc3QgcGFzc0ZsYWcgPSAnX19QQVNTX18nO1xuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICB0cnkge1xuICAgICAgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbYGxvY2tzZXR0aW5ncyBoZWxwICYmIGVjaG8gJHtwYXNzRmxhZ31gXSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIHRoaXMuX2lzTG9ja01hbmFnZW1lbnRTdXBwb3J0ZWQgPSBfLmluY2x1ZGVzKG91dHB1dCwgcGFzc0ZsYWcpO1xuICAgIGxvZy5kZWJ1ZyhgRXh0ZW5kZWQgbG9jayBzZXR0aW5ncyBtYW5hZ2VtZW50IGlzIGAgK1xuICAgICAgYCR7dGhpcy5faXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCA/ICcnIDogJ25vdCAnfXN1cHBvcnRlZGApO1xuICB9XG4gIHJldHVybiB0aGlzLl9pc0xvY2tNYW5hZ2VtZW50U3VwcG9ydGVkO1xufTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjcmVkZW50aWFsIGlzIG1hdGNoZXMgdG8gdGhlIGN1cnJlbnRseSBzZXQgb25lLlxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gY3JlZGVudGlhbCBbbnVsbF0gVGhlIGNyZWRlbnRpYWwgdmFsdWUuIEl0IGNvdWxkIGJlIGVpdGhlclxuICogcGluLCBwYXNzd29yZCBvciBhIHBhdHRlcm4uIEEgcGF0dGVybiBpcyBzcGVjaWZpZWQgYnkgYSBub24tc2VwYXJhdGVkIGxpc3RcbiAqIG9mIG51bWJlcnMgdGhhdCBpbmRleCB0aGUgY2VsbCBvbiB0aGUgcGF0dGVybiBpbiBhIDEtYmFzZWQgbWFubmVyIGluIGxlZnRcbiAqIHRvIHJpZ2h0IGFuZCB0b3AgdG8gYm90dG9tIG9yZGVyLCBpLmUuIHRoZSB0b3AtbGVmdCBjZWxsIGlzIGluZGV4ZWQgd2l0aCAxLFxuICogd2hlcmVhcyB0aGUgYm90dG9tLXJpZ2h0IGNlbGwgaXMgaW5kZXhlZCB3aXRoIDkuIEV4YW1wbGU6IDEyMzQuXG4gKiBudWxsL2VtcHR5IHZhbHVlIGFzc3VtZXMgdGhlIGRldmljZSBoYXMgbm8gbG9jayBjdXJyZW50bHkgc2V0LlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZ2l2ZW4gY3JlZGVudGlhbCBtYXRjaGVzIHRvIHRoZSBkZXZpY2UncyBvbmVcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdmVyaWZpY2F0aW9uIGZhY2VzIGFuIHVuZXhwZWN0ZWQgZXJyb3JcbiAqL1xubG9ja01hbmFnZW1lbnRNZXRob2RzLnZlcmlmeUxvY2tDcmVkZW50aWFsID0gYXN5bmMgZnVuY3Rpb24gdmVyaWZ5TG9ja0NyZWRlbnRpYWwgKGNyZWRlbnRpYWwgPSBudWxsKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qge3N0ZG91dCwgc3RkZXJyfSA9IGF3YWl0IHRoaXMuc2hlbGwoYnVpbGRDb21tYW5kKCd2ZXJpZnknLCBjcmVkZW50aWFsKSwge1xuICAgICAgb3V0cHV0Rm9ybWF0OiB0aGlzLkVYRUNfT1VUUFVUX0ZPUk1BVC5GVUxMXG4gICAgfSk7XG4gICAgaWYgKF8uaW5jbHVkZXMoc3Rkb3V0LCAndmVyaWZpZWQgc3VjY2Vzc2Z1bGx5JykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoW2BkaWRuJ3QgbWF0Y2hgLCBDUkVERU5USUFMX0NBTk5PVF9CRV9OVUxMX09SX0VNUFRZX0VSUk9SXVxuICAgICAgICAuc29tZSgoeCkgPT4gXy5pbmNsdWRlcyhzdGRlcnIgfHwgc3Rkb3V0LCB4KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKHN0ZGVyciB8fCBzdGRvdXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEZXZpY2UgbG9jayBjcmVkZW50aWFsIHZlcmlmaWNhdGlvbiBmYWlsZWQuIGAgK1xuICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Uuc3RkZXJyIHx8IGUuc3Rkb3V0IHx8IGUubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDbGVhcnMgY3VycmVudCBsb2NrIGNyZWRlbnRpYWxzLiBVc3VhbGx5IGl0IHRha2VzIHNldmVyYWwgc2Vjb25kcyBmb3IgYSBkZXZpY2UgdG9cbiAqIHN5bmMgdGhlIGNyZWRlbnRpYWwgc3RhdGUgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy5cbiAqXG4gKiBAcGFyYW0gez9zdHJpbmd9IGNyZWRlbnRpYWwgW251bGxdIFRoZSBjcmVkZW50aWFsIHZhbHVlLiBJdCBjb3VsZCBiZSBlaXRoZXJcbiAqIHBpbiwgcGFzc3dvcmQgb3IgYSBwYXR0ZXJuLiBBIHBhdHRlcm4gaXMgc3BlY2lmaWVkIGJ5IGEgbm9uLXNlcGFyYXRlZCBsaXN0XG4gKiBvZiBudW1iZXJzIHRoYXQgaW5kZXggdGhlIGNlbGwgb24gdGhlIHBhdHRlcm4gaW4gYSAxLWJhc2VkIG1hbm5lciBpbiBsZWZ0XG4gKiB0byByaWdodCBhbmQgdG9wIHRvIGJvdHRvbSBvcmRlciwgaS5lLiB0aGUgdG9wLWxlZnQgY2VsbCBpcyBpbmRleGVkIHdpdGggMSxcbiAqIHdoZXJlYXMgdGhlIGJvdHRvbS1yaWdodCBjZWxsIGlzIGluZGV4ZWQgd2l0aCA5LiBFeGFtcGxlOiAxMjM0LlxuICogbnVsbC9lbXB0eSB2YWx1ZSBhc3N1bWVzIHRoZSBkZXZpY2UgaGFzIG5vIGxvY2sgY3VycmVudGx5IHNldC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBvcGVyYXRpb24gZmFjZXMgYW4gdW5leHBlY3RlZCBlcnJvclxuICovXG5sb2NrTWFuYWdlbWVudE1ldGhvZHMuY2xlYXJMb2NrQ3JlZGVudGlhbCA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyTG9ja0NyZWRlbnRpYWwgKGNyZWRlbnRpYWwgPSBudWxsKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qge3N0ZG91dCwgc3RkZXJyfSA9IGF3YWl0IHRoaXMuc2hlbGwoYnVpbGRDb21tYW5kKCdjbGVhcicsIGNyZWRlbnRpYWwpLCB7XG4gICAgICBvdXRwdXRGb3JtYXQ6IHRoaXMuRVhFQ19PVVRQVVRfRk9STUFULkZVTExcbiAgICB9KTtcbiAgICBpZiAoIVsndXNlciBoYXMgbm8gcGFzc3dvcmQnLCAnTG9jayBjcmVkZW50aWFsIGNsZWFyZWQnXVxuICAgICAgICAuc29tZSgoeCkgPT4gXy5pbmNsdWRlcyhzdGRlcnIgfHwgc3Rkb3V0LCB4KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihzdGRlcnIgfHwgc3Rkb3V0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjbGVhciBkZXZpY2UgbG9jayBjcmVkZW50aWFsLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLnN0ZGVyciB8fCBlLnN0ZG91dCB8fCBlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGRldmljZSBpcyBsb2NrZWQgd2l0aCBhIGNyZWRlbnRpYWwgKGVpdGhlciBwaW4gb3IgYSBwYXNzd29yZFxuICogb3IgYSBwYXR0ZXJuKS5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBkZXZpY2UgaXMgbG9ja2VkXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgb3BlcmF0aW9uIGZhY2VzIGFuIHVuZXhwZWN0ZWQgZXJyb3JcbiAqL1xubG9ja01hbmFnZW1lbnRNZXRob2RzLmlzTG9ja0VuYWJsZWQgPSBhc3luYyBmdW5jdGlvbiBpc0xvY2tFbmFibGVkICgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7c3Rkb3V0LCBzdGRlcnJ9ID0gYXdhaXQgdGhpcy5zaGVsbChidWlsZENvbW1hbmQoJ2dldC1kaXNhYmxlZCcpLCB7XG4gICAgICBvdXRwdXRGb3JtYXQ6IHRoaXMuRVhFQ19PVVRQVVRfRk9STUFULkZVTExcbiAgICB9KTtcbiAgICBpZiAoL1xcYmZhbHNlXFxiLy50ZXN0KHN0ZG91dClcbiAgICAgICAgfHwgW0NSRURFTlRJQUxfRElEX05PVF9NQVRDSF9FUlJPUiwgQ1JFREVOVElBTF9DQU5OT1RfQkVfTlVMTF9PUl9FTVBUWV9FUlJPUl0uc29tZShcbiAgICAgICAgICAoeCkgPT4gXy5pbmNsdWRlcyhzdGRlcnIgfHwgc3Rkb3V0LCB4KSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoL1xcYnRydWVcXGIvLnRlc3Qoc3Rkb3V0KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3Ioc3RkZXJyIHx8IHN0ZG91dCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjaGVjayBpZiBkZXZpY2UgbG9jayBpcyBlbmFibGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2V0cyB0aGUgZGV2aWNlIGxvY2suXG4gKlxuICogQHBhcmFtIHshc3RyaW5nfSBjcmVkZW50aWFsVHlwZSBPbmUgb2Y6IHBhc3N3b3JkLCBwaW4sIHBhdHRlcm4uXG4gKiBAcGFyYW0geyFzdHJpbmd9IGNyZWRlbnRpYWwgQSBub24tZW1wdHkgY3JlZGVudGlhbCB2YWx1ZSB0byBiZSBzZXQuXG4gKiBNYWtlIHN1cmUgeW91ciBuZXcgY3JlZGVudGlhbCBtYXRjaGVzIHRvIHRoZSBhY3R1YWwgc3lzdGVtIHNlY3VyaXR5IHJlcXVpcmVtZW50cyxcbiAqIGUuZy4gYSBtaW5pbXVtIHBhc3N3b3JkIGxlbmd0aC4gQSBwYXR0ZXJuIGlzIHNwZWNpZmllZCBieSBhIG5vbi1zZXBhcmF0ZWQgbGlzdFxuICogb2YgbnVtYmVycyB0aGF0IGluZGV4IHRoZSBjZWxsIG9uIHRoZSBwYXR0ZXJuIGluIGEgMS1iYXNlZCBtYW5uZXIgaW4gbGVmdFxuICogdG8gcmlnaHQgYW5kIHRvcCB0byBib3R0b20gb3JkZXIsIGkuZS4gdGhlIHRvcC1sZWZ0IGNlbGwgaXMgaW5kZXhlZCB3aXRoIDEsXG4gKiB3aGVyZWFzIHRoZSBib3R0b20tcmlnaHQgY2VsbCBpcyBpbmRleGVkIHdpdGggOS4gRXhhbXBsZTogMTIzNC5cbiAqIEBwYXJhbSB7P3N0cmluZ30gb2xkQ3JlZGVudGlhbCBbbnVsbF0gQW4gb2xkIGNyZWRlbnRpYWwgc3RyaW5nLlxuICogSXQgaXMgb25seSByZXF1aXJlZCB0byBiZSBzZXQgaW4gY2FzZSB5b3UgbmVlZCB0byBjaGFuZ2UgdGhlIGN1cnJlbnRcbiAqIGNyZWRlbnRpYWwgcmF0aGVyIHRoYW4gdG8gc2V0IGEgbmV3IG9uZS4gU2V0dGluZyBpdCB0byBhIHdyb25nIHZhbHVlIHdpbGxcbiAqIG1ha2UgdGhpcyBtZXRob2QgdG8gZmFpbCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgdmVyaWZ5aW5nIGlucHV0IGFyZ3VtZW50cyBvciBzZXR0aW5nXG4gKiB0aGUgY3JlZGVudGlhbFxuICovXG5sb2NrTWFuYWdlbWVudE1ldGhvZHMuc2V0TG9ja0NyZWRlbnRpYWwgPSBhc3luYyBmdW5jdGlvbiBzZXRMb2NrQ3JlZGVudGlhbCAoXG4gIGNyZWRlbnRpYWxUeXBlLCBjcmVkZW50aWFsLCBvbGRDcmVkZW50aWFsID0gbnVsbCkge1xuICBpZiAoIVNVUFBPUlRFRF9MT0NLX0NSRURFTlRJQUxfVFlQRVMuaW5jbHVkZXMoY3JlZGVudGlhbFR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEZXZpY2UgbG9jayBjcmVkZW50aWFsIHR5cGUgJyR7Y3JlZGVudGlhbFR5cGV9JyBpcyB1bmtub3duLiBgICtcbiAgICAgIGBPbmx5IHRoZSBmb2xsb3dpbmcgY3JlZGVudGlhbCB0eXBlcyBhcmUgc3VwcG9ydGVkOiAke1NVUFBPUlRFRF9MT0NLX0NSRURFTlRJQUxfVFlQRVN9YCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShjcmVkZW50aWFsKSAmJiAhXy5pc0ludGVnZXIoY3JlZGVudGlhbCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RldmljZSBsb2NrIGNyZWRlbnRpYWwgY2Fubm90IGJlIGVtcHR5Jyk7XG4gIH1cbiAgY29uc3QgY21kID0gYnVpbGRDb21tYW5kKGBzZXQtJHtjcmVkZW50aWFsVHlwZX1gLCBvbGRDcmVkZW50aWFsLCBjcmVkZW50aWFsKTtcbiAgdHJ5IHtcbiAgICBjb25zdCB7c3Rkb3V0LCBzdGRlcnJ9ID0gYXdhaXQgdGhpcy5zaGVsbChjbWQsIHtcbiAgICAgIG91dHB1dEZvcm1hdDogdGhpcy5FWEVDX09VVFBVVF9GT1JNQVQuRlVMTFxuICAgIH0pO1xuICAgIGlmICghXy5pbmNsdWRlcyhzdGRvdXQsICdzZXQgdG8nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHN0ZGVyciB8fCBzdGRvdXQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2V0dGluZyBvZiBkZXZpY2UgbG9jayAke2NyZWRlbnRpYWxUeXBlfSBjcmVkZW50aWFsIGZhaWxlZC4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5zdGRvdXQgfHwgZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBzY3JlZW4gbG9jayBzdGF0ZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIGxvY2tlZC5cbiAqL1xubG9ja01hbmFnZW1lbnRNZXRob2RzLmlzU2NyZWVuTG9ja2VkID0gYXN5bmMgZnVuY3Rpb24gaXNTY3JlZW5Mb2NrZWQgKCkge1xuICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICd3aW5kb3cnXSk7XG4gIGlmIChwcm9jZXNzLmVudi5BUFBJVU1fTE9HX0RVTVBTWVMpIHtcbiAgICAvLyBvcHRpb25hbCBkZWJ1Z2dpbmdcbiAgICAvLyBpZiB0aGUgbWV0aG9kIGlzIG5vdCB3b3JraW5nLCB0dXJuIGl0IG9uIGFuZCBzZW5kIHVzIHRoZSBvdXRwdXRcbiAgICBjb25zdCBkdW1wc3lzRmlsZSA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnZHVtcHN5cy5sb2cnKTtcbiAgICBsb2cuZGVidWcoYFdyaXRpbmcgZHVtcHN5cyBvdXRwdXQgdG8gJHtkdW1wc3lzRmlsZX1gKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZHVtcHN5c0ZpbGUsIHN0ZG91dCk7XG4gIH1cbiAgcmV0dXJuIGlzU2hvd2luZ0xvY2tzY3JlZW4oc3Rkb3V0KSB8fCBpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQoc3Rkb3V0KSB8fCAhaXNTY3JlZW5PbkZ1bGx5KHN0ZG91dCk7XG59O1xuXG4vKipcbiAqIERpc21pc3NlcyBrZXlndWFyZCBvdmVybGF5LlxuICovXG5sb2NrTWFuYWdlbWVudE1ldGhvZHMuZGlzbWlzc0tleWd1YXJkID0gYXN5bmMgZnVuY3Rpb24gZGlzbWlzc0tleWd1YXJkICgpIHtcbiAgbG9nLmluZm8oJ1dha2luZyB1cCB0aGUgZGV2aWNlIHRvIGRpc21pc3MgdGhlIGtleWd1YXJkJyk7XG4gIC8vIFNjcmVlbiBvZmYgb25jZSB0byBmb3JjZSBwcmUtaW5wdXR0ZWQgdGV4dCBmaWVsZCBjbGVhbiBhZnRlciB3YWtlLXVwXG4gIC8vIEp1c3Qgc2NyZWVuIG9uIGlmIHRoZSBzY3JlZW4gZGVmYXVsdHMgb2ZmXG4gIGF3YWl0IHRoaXMuY3ljbGVXYWtlVXAoKTtcblxuICBpZiAoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpID4gMjEpIHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsnd20nLCAnZGlzbWlzcy1rZXlndWFyZCddKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICd3aW5kb3cnLCAnd2luZG93cyddKTtcbiAgaWYgKCFpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQoc3Rkb3V0KSkge1xuICAgIGxvZy5kZWJ1ZygnVGhlIGtleWd1YXJkIHNlZW1zIHRvIGJlIGluYWN0aXZlJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nLmRlYnVnKCdTd2lwaW5nIHVwIHRvIGRpc21pc3MgdGhlIGtleWd1YXJkJyk7XG4gIGlmIChhd2FpdCB0aGlzLmhpZGVLZXlib2FyZCgpKSB7XG4gICAgYXdhaXQgQi5kZWxheShISURFX0tFWUJPQVJEX1dBSVRfVElNRSk7XG4gIH1cbiAgbG9nLmRlYnVnKCdEaXNtaXNzaW5nIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgdW5sb2NrIHZpZXcnKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ3NlcnZpY2UnLCAnY2FsbCcsICdub3RpZmljYXRpb24nLCAnMSddKTtcbiAgYXdhaXQgdGhpcy5iYWNrKCk7XG4gIGF3YWl0IHN3aXBlVXAodGhpcyk7XG59O1xuXG4vKipcbiAqIFByZXNzZXMgdGhlIGNvcnJlc3BvbmRpbmcga2V5IGNvbWJpbmF0aW9uIHRvIG1ha2Ugc3VyZSB0aGUgZGV2aWNlJ3Mgc2NyZWVuXG4gKiBpcyBub3QgdHVybmVkIG9mZiBhbmQgaXMgbG9ja2VkIGlmIHRoZSBsYXR0ZXIgaXMgZW5hYmxlZC5cbiAqL1xubG9ja01hbmFnZW1lbnRNZXRob2RzLmN5Y2xlV2FrZVVwID0gYXN5bmMgZnVuY3Rpb24gY3ljbGVXYWtlVXAgKCkge1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KEtFWUNPREVfUE9XRVIpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KEtFWUNPREVfV0FLRVVQKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxvY2tNYW5hZ2VtZW50TWV0aG9kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQSxNQUFNQSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFFaEMsTUFBTUMsd0NBQXdDLEdBQUksbUNBQWtDO0FBQ3BGLE1BQU1DLDhCQUE4QixHQUFJLGNBQWE7QUFDckQsTUFBTUMsK0JBQStCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQztBQUN0RSxNQUFNQyxhQUFhLEdBQUcsRUFBRTtBQUN4QixNQUFNQyxjQUFjLEdBQUcsR0FBRztBQUMxQixNQUFNQyx1QkFBdUIsR0FBRyxHQUFHO0FBRW5DLFNBQVNDLFlBQVksQ0FBRUMsSUFBSSxFQUFFQyxhQUFhLEdBQUcsSUFBSSxFQUFFLEdBQUdDLElBQUksRUFBRTtFQUMxRCxNQUFNQyxHQUFHLEdBQUcsQ0FBQyxjQUFjLEVBQUVILElBQUksQ0FBQztFQUNsQyxJQUFJLENBQUNJLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDSixhQUFhLENBQUMsRUFBRTtJQUM3QkUsR0FBRyxDQUFDRyxJQUFJLENBQUMsT0FBTyxFQUFFTCxhQUFhLENBQUM7RUFDbEM7RUFDQSxJQUFJLENBQUNHLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDSCxJQUFJLENBQUMsRUFBRTtJQUNwQkMsR0FBRyxDQUFDRyxJQUFJLENBQUMsR0FBR0osSUFBSSxDQUFDO0VBQ25CO0VBQ0EsT0FBT0MsR0FBRztBQUNaO0FBRUEsZUFBZUksT0FBTyxDQUFFQyxHQUFHLEVBQUU7RUFDM0IsTUFBTUMsTUFBTSxHQUFHLE1BQU1ELEdBQUcsQ0FBQ0UsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0VBQ3JELE1BQU1DLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQ0MsSUFBSSxDQUFDSCxNQUFNLENBQUM7RUFDdkQsSUFB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
|
|
161
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2NrTWFuYWdlbWVudE1ldGhvZHMiLCJDUkVERU5USUFMX0NBTk5PVF9CRV9OVUxMX09SX0VNUFRZX0VSUk9SIiwiQ1JFREVOVElBTF9ESURfTk9UX01BVENIX0VSUk9SIiwiU1VQUE9SVEVEX0xPQ0tfQ1JFREVOVElBTF9UWVBFUyIsIktFWUNPREVfUE9XRVIiLCJLRVlDT0RFX1dBS0VVUCIsIkhJREVfS0VZQk9BUkRfV0FJVF9USU1FIiwiYnVpbGRDb21tYW5kIiwidmVyYiIsIm9sZENyZWRlbnRpYWwiLCJhcmdzIiwiY21kIiwiXyIsImlzRW1wdHkiLCJwdXNoIiwic3dpcGVVcCIsIndpbmRvd0R1bXBzeXMiLCJkaW1lbnNpb25zTWF0Y2giLCJleGVjIiwiRXJyb3IiLCJkaXNwbGF5V2lkdGgiLCJwYXJzZUludCIsImRpc3BsYXlIZWlnaHQiLCJ4MCIsInkwIiwieDEiLCJ5MSIsInNoZWxsIiwibWFwIiwiYyIsIk1hdGgiLCJ0cnVuYyIsImlzTG9ja01hbmFnZW1lbnRTdXBwb3J0ZWQiLCJpc0Jvb2xlYW4iLCJfaXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCIsInBhc3NGbGFnIiwib3V0cHV0IiwiaWduIiwiaW5jbHVkZXMiLCJsb2ciLCJkZWJ1ZyIsInZlcmlmeUxvY2tDcmVkZW50aWFsIiwiY3JlZGVudGlhbCIsInN0ZG91dCIsInN0ZGVyciIsIm91dHB1dEZvcm1hdCIsIkVYRUNfT1VUUFVUX0ZPUk1BVCIsIkZVTEwiLCJzb21lIiwieCIsImUiLCJtZXNzYWdlIiwiY2xlYXJMb2NrQ3JlZGVudGlhbCIsImlzTG9ja0VuYWJsZWQiLCJ0ZXN0Iiwic2V0TG9ja0NyZWRlbnRpYWwiLCJjcmVkZW50aWFsVHlwZSIsImlzSW50ZWdlciIsImlzU2NyZWVuTG9ja2VkIiwiaXNTaG93aW5nTG9ja3NjcmVlbiIsImlzQ3VycmVudEZvY3VzT25LZXlndWFyZCIsImlzU2NyZWVuT25GdWxseSIsImRpc21pc3NLZXlndWFyZCIsImluZm8iLCJjeWNsZVdha2VVcCIsImdldEFwaUxldmVsIiwiaGlkZUtleWJvYXJkIiwiQiIsImRlbGF5IiwiYmFjayIsImJpbmQiLCJrZXlldmVudCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi90b29scy9sb2NrbWdtdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgaXNTaG93aW5nTG9ja3NjcmVlbiwgaXNDdXJyZW50Rm9jdXNPbktleWd1YXJkLCBpc1NjcmVlbk9uRnVsbHksXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBsb2NrTWFuYWdlbWVudE1ldGhvZHMgPSB7fTtcblxuY29uc3QgQ1JFREVOVElBTF9DQU5OT1RfQkVfTlVMTF9PUl9FTVBUWV9FUlJPUiA9IGBDcmVkZW50aWFsIGNhbid0IGJlIG51bGwgb3IgZW1wdHlgO1xuY29uc3QgQ1JFREVOVElBTF9ESURfTk9UX01BVENIX0VSUk9SID0gYGRpZG4ndCBtYXRjaGA7XG5jb25zdCBTVVBQT1JURURfTE9DS19DUkVERU5USUFMX1RZUEVTID0gWydwYXNzd29yZCcsICdwaW4nLCAncGF0dGVybiddO1xuY29uc3QgS0VZQ09ERV9QT1dFUiA9IDI2O1xuY29uc3QgS0VZQ09ERV9XQUtFVVAgPSAyMjQ7IC8vIHdvcmtzIG92ZXIgQVBJIExldmVsIDIwXG5jb25zdCBISURFX0tFWUJPQVJEX1dBSVRfVElNRSA9IDEwMDtcblxuZnVuY3Rpb24gYnVpbGRDb21tYW5kICh2ZXJiLCBvbGRDcmVkZW50aWFsID0gbnVsbCwgLi4uYXJncykge1xuICBjb25zdCBjbWQgPSBbJ2xvY2tzZXR0aW5ncycsIHZlcmJdO1xuICBpZiAoIV8uaXNFbXB0eShvbGRDcmVkZW50aWFsKSkge1xuICAgIGNtZC5wdXNoKCctLW9sZCcsIG9sZENyZWRlbnRpYWwpO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KGFyZ3MpKSB7XG4gICAgY21kLnB1c2goLi4uYXJncyk7XG4gIH1cbiAgcmV0dXJuIGNtZDtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBzd2lwZSB1cCBnZXN0dXJlIG9uIHRoZSBzY3JlZW5cbiAqXG4gKiBAdGhpcyB7QURCfVxuICogQHBhcmFtIHtzdHJpbmd9IHdpbmRvd0R1bXBzeXMgVGhlIG91dHB1dCBvZiBgYWRiIHNoZWxsIGR1bXBzeXMgd2luZG93YCBjb21tYW5kXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGRpc3BsYXkgc2l6ZSBjYW5ub3QgYmUgcmV0cmlldmVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN3aXBlVXAgKHdpbmRvd0R1bXBzeXMpIHtcbiAgY29uc3QgZGltZW5zaW9uc01hdGNoID0gL2luaXQ9KFxcZCspeChcXGQrKS8uZXhlYyh3aW5kb3dEdW1wc3lzKTtcbiAgaWYgKCFkaW1lbnNpb25zTWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSB0aGUgZGlzcGxheSBzaXplJyk7XG4gIH1cbiAgY29uc3QgZGlzcGxheVdpZHRoID0gcGFyc2VJbnQoZGltZW5zaW9uc01hdGNoWzFdLCAxMCk7XG4gIGNvbnN0IGRpc3BsYXlIZWlnaHQgPSBwYXJzZUludChkaW1lbnNpb25zTWF0Y2hbMl0sIDEwKTtcbiAgY29uc3QgeDAgPSBkaXNwbGF5V2lkdGggLyAyO1xuICBjb25zdCB5MCA9IGRpc3BsYXlIZWlnaHQgLyA1ICogNDtcbiAgY29uc3QgeDEgPSB4MDtcbiAgY29uc3QgeTEgPSBkaXNwbGF5SGVpZ2h0IC8gNTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgJ2lucHV0JywgJ3RvdWNoc2NyZWVuJywgJ3N3aXBlJyxcbiAgICAuLi4oW3gwLCB5MCwgeDEsIHkxXS5tYXAoKGMpID0+IE1hdGgudHJ1bmMoYykpKVxuICBdKTtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBkZXZpY2Ugc3VwcG9ydHMgbG9jayBzZXR0aW5ncyBtYW5hZ2VtZW50IHdpdGggYGxvY2tzZXR0aW5nc2BcbiAqIGNvbW1hbmQgbGluZSB0b29sLiBUaGlzIHRvb2wgaGFzIGJlZW4gYWRkZWQgdG8gQW5kcm9pZCB0b29sc2V0IHNpbmNlICBBUEkgMjcgT3Jlb1xuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIG1hbmFnZW1lbnQgaXMgc3VwcG9ydGVkLiBUaGUgcmVzdWx0IGlzIGNhY2hlZCBwZXIgQURCIGluc3RhbmNlXG4gKi9cbmxvY2tNYW5hZ2VtZW50TWV0aG9kcy5pc0xvY2tNYW5hZ2VtZW50U3VwcG9ydGVkID0gYXN5bmMgZnVuY3Rpb24gaXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCAoKSB7XG4gIGlmICghXy5pc0Jvb2xlYW4odGhpcy5faXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCkpIHtcbiAgICBjb25zdCBwYXNzRmxhZyA9ICdfX1BBU1NfXyc7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFtgbG9ja3NldHRpbmdzIGhlbHAgJiYgZWNobyAke3Bhc3NGbGFnfWBdKTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgdGhpcy5faXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCA9IF8uaW5jbHVkZXMob3V0cHV0LCBwYXNzRmxhZyk7XG4gICAgbG9nLmRlYnVnKGBFeHRlbmRlZCBsb2NrIHNldHRpbmdzIG1hbmFnZW1lbnQgaXMgYCArXG4gICAgICBgJHt0aGlzLl9pc0xvY2tNYW5hZ2VtZW50U3VwcG9ydGVkID8gJycgOiAnbm90ICd9c3VwcG9ydGVkYCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2lzTG9ja01hbmFnZW1lbnRTdXBwb3J0ZWQ7XG59O1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNyZWRlbnRpYWwgaXMgbWF0Y2hlcyB0byB0aGUgY3VycmVudGx5IHNldCBvbmUuXG4gKlxuICogQHBhcmFtIHs/c3RyaW5nfSBjcmVkZW50aWFsIFtudWxsXSBUaGUgY3JlZGVudGlhbCB2YWx1ZS4gSXQgY291bGQgYmUgZWl0aGVyXG4gKiBwaW4sIHBhc3N3b3JkIG9yIGEgcGF0dGVybi4gQSBwYXR0ZXJuIGlzIHNwZWNpZmllZCBieSBhIG5vbi1zZXBhcmF0ZWQgbGlzdFxuICogb2YgbnVtYmVycyB0aGF0IGluZGV4IHRoZSBjZWxsIG9uIHRoZSBwYXR0ZXJuIGluIGEgMS1iYXNlZCBtYW5uZXIgaW4gbGVmdFxuICogdG8gcmlnaHQgYW5kIHRvcCB0byBib3R0b20gb3JkZXIsIGkuZS4gdGhlIHRvcC1sZWZ0IGNlbGwgaXMgaW5kZXhlZCB3aXRoIDEsXG4gKiB3aGVyZWFzIHRoZSBib3R0b20tcmlnaHQgY2VsbCBpcyBpbmRleGVkIHdpdGggOS4gRXhhbXBsZTogMTIzNC5cbiAqIG51bGwvZW1wdHkgdmFsdWUgYXNzdW1lcyB0aGUgZGV2aWNlIGhhcyBubyBsb2NrIGN1cnJlbnRseSBzZXQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBnaXZlbiBjcmVkZW50aWFsIG1hdGNoZXMgdG8gdGhlIGRldmljZSdzIG9uZVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB2ZXJpZmljYXRpb24gZmFjZXMgYW4gdW5leHBlY3RlZCBlcnJvclxuICovXG5sb2NrTWFuYWdlbWVudE1ldGhvZHMudmVyaWZ5TG9ja0NyZWRlbnRpYWwgPSBhc3luYyBmdW5jdGlvbiB2ZXJpZnlMb2NrQ3JlZGVudGlhbCAoY3JlZGVudGlhbCA9IG51bGwpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7c3Rkb3V0LCBzdGRlcnJ9ID0gYXdhaXQgdGhpcy5zaGVsbChidWlsZENvbW1hbmQoJ3ZlcmlmeScsIGNyZWRlbnRpYWwpLCB7XG4gICAgICBvdXRwdXRGb3JtYXQ6IHRoaXMuRVhFQ19PVVRQVVRfRk9STUFULkZVTExcbiAgICB9KTtcbiAgICBpZiAoXy5pbmNsdWRlcyhzdGRvdXQsICd2ZXJpZmllZCBzdWNjZXNzZnVsbHknKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChbYGRpZG4ndCBtYXRjaGAsIENSRURFTlRJQUxfQ0FOTk9UX0JFX05VTExfT1JfRU1QVFlfRVJST1JdXG4gICAgICAgIC5zb21lKCh4KSA9PiBfLmluY2x1ZGVzKHN0ZGVyciB8fCBzdGRvdXQsIHgpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3Ioc3RkZXJyIHx8IHN0ZG91dCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERldmljZSBsb2NrIGNyZWRlbnRpYWwgdmVyaWZpY2F0aW9uIGZhaWxlZC4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5zdGRvdXQgfHwgZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIENsZWFycyBjdXJyZW50IGxvY2sgY3JlZGVudGlhbHMuIFVzdWFsbHkgaXQgdGFrZXMgc2V2ZXJhbCBzZWNvbmRzIGZvciBhIGRldmljZSB0b1xuICogc3luYyB0aGUgY3JlZGVudGlhbCBzdGF0ZSBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zLlxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gY3JlZGVudGlhbCBbbnVsbF0gVGhlIGNyZWRlbnRpYWwgdmFsdWUuIEl0IGNvdWxkIGJlIGVpdGhlclxuICogcGluLCBwYXNzd29yZCBvciBhIHBhdHRlcm4uIEEgcGF0dGVybiBpcyBzcGVjaWZpZWQgYnkgYSBub24tc2VwYXJhdGVkIGxpc3RcbiAqIG9mIG51bWJlcnMgdGhhdCBpbmRleCB0aGUgY2VsbCBvbiB0aGUgcGF0dGVybiBpbiBhIDEtYmFzZWQgbWFubmVyIGluIGxlZnRcbiAqIHRvIHJpZ2h0IGFuZCB0b3AgdG8gYm90dG9tIG9yZGVyLCBpLmUuIHRoZSB0b3AtbGVmdCBjZWxsIGlzIGluZGV4ZWQgd2l0aCAxLFxuICogd2hlcmVhcyB0aGUgYm90dG9tLXJpZ2h0IGNlbGwgaXMgaW5kZXhlZCB3aXRoIDkuIEV4YW1wbGU6IDEyMzQuXG4gKiBudWxsL2VtcHR5IHZhbHVlIGFzc3VtZXMgdGhlIGRldmljZSBoYXMgbm8gbG9jayBjdXJyZW50bHkgc2V0LlxuICogQHRocm93cyB7RXJyb3J9IElmIG9wZXJhdGlvbiBmYWNlcyBhbiB1bmV4cGVjdGVkIGVycm9yXG4gKi9cbmxvY2tNYW5hZ2VtZW50TWV0aG9kcy5jbGVhckxvY2tDcmVkZW50aWFsID0gYXN5bmMgZnVuY3Rpb24gY2xlYXJMb2NrQ3JlZGVudGlhbCAoY3JlZGVudGlhbCA9IG51bGwpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7c3Rkb3V0LCBzdGRlcnJ9ID0gYXdhaXQgdGhpcy5zaGVsbChidWlsZENvbW1hbmQoJ2NsZWFyJywgY3JlZGVudGlhbCksIHtcbiAgICAgIG91dHB1dEZvcm1hdDogdGhpcy5FWEVDX09VVFBVVF9GT1JNQVQuRlVMTFxuICAgIH0pO1xuICAgIGlmICghWyd1c2VyIGhhcyBubyBwYXNzd29yZCcsICdMb2NrIGNyZWRlbnRpYWwgY2xlYXJlZCddXG4gICAgICAgIC5zb21lKCh4KSA9PiBfLmluY2x1ZGVzKHN0ZGVyciB8fCBzdGRvdXQsIHgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHN0ZGVyciB8fCBzdGRvdXQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNsZWFyIGRldmljZSBsb2NrIGNyZWRlbnRpYWwuIGAgK1xuICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Uuc3RkZXJyIHx8IGUuc3Rkb3V0IHx8IGUubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZGV2aWNlIGlzIGxvY2tlZCB3aXRoIGEgY3JlZGVudGlhbCAoZWl0aGVyIHBpbiBvciBhIHBhc3N3b3JkXG4gKiBvciBhIHBhdHRlcm4pLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGRldmljZSBpcyBsb2NrZWRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBvcGVyYXRpb24gZmFjZXMgYW4gdW5leHBlY3RlZCBlcnJvclxuICovXG5sb2NrTWFuYWdlbWVudE1ldGhvZHMuaXNMb2NrRW5hYmxlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzTG9ja0VuYWJsZWQgKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHtzdGRvdXQsIHN0ZGVycn0gPSBhd2FpdCB0aGlzLnNoZWxsKGJ1aWxkQ29tbWFuZCgnZ2V0LWRpc2FibGVkJyksIHtcbiAgICAgIG91dHB1dEZvcm1hdDogdGhpcy5FWEVDX09VVFBVVF9GT1JNQVQuRlVMTFxuICAgIH0pO1xuICAgIGlmICgvXFxiZmFsc2VcXGIvLnRlc3Qoc3Rkb3V0KVxuICAgICAgICB8fCBbQ1JFREVOVElBTF9ESURfTk9UX01BVENIX0VSUk9SLCBDUkVERU5USUFMX0NBTk5PVF9CRV9OVUxMX09SX0VNUFRZX0VSUk9SXS5zb21lKFxuICAgICAgICAgICh4KSA9PiBfLmluY2x1ZGVzKHN0ZGVyciB8fCBzdGRvdXQsIHgpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICgvXFxidHJ1ZVxcYi8udGVzdChzdGRvdXQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihzdGRlcnIgfHwgc3Rkb3V0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNoZWNrIGlmIGRldmljZSBsb2NrIGlzIGVuYWJsZWQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBkZXZpY2UgbG9jay5cbiAqXG4gKiBAcGFyYW0geyFzdHJpbmd9IGNyZWRlbnRpYWxUeXBlIE9uZSBvZjogcGFzc3dvcmQsIHBpbiwgcGF0dGVybi5cbiAqIEBwYXJhbSB7IXN0cmluZ30gY3JlZGVudGlhbCBBIG5vbi1lbXB0eSBjcmVkZW50aWFsIHZhbHVlIHRvIGJlIHNldC5cbiAqIE1ha2Ugc3VyZSB5b3VyIG5ldyBjcmVkZW50aWFsIG1hdGNoZXMgdG8gdGhlIGFjdHVhbCBzeXN0ZW0gc2VjdXJpdHkgcmVxdWlyZW1lbnRzLFxuICogZS5nLiBhIG1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoLiBBIHBhdHRlcm4gaXMgc3BlY2lmaWVkIGJ5IGEgbm9uLXNlcGFyYXRlZCBsaXN0XG4gKiBvZiBudW1iZXJzIHRoYXQgaW5kZXggdGhlIGNlbGwgb24gdGhlIHBhdHRlcm4gaW4gYSAxLWJhc2VkIG1hbm5lciBpbiBsZWZ0XG4gKiB0byByaWdodCBhbmQgdG9wIHRvIGJvdHRvbSBvcmRlciwgaS5lLiB0aGUgdG9wLWxlZnQgY2VsbCBpcyBpbmRleGVkIHdpdGggMSxcbiAqIHdoZXJlYXMgdGhlIGJvdHRvbS1yaWdodCBjZWxsIGlzIGluZGV4ZWQgd2l0aCA5LiBFeGFtcGxlOiAxMjM0LlxuICogQHBhcmFtIHs/c3RyaW5nfSBvbGRDcmVkZW50aWFsIFtudWxsXSBBbiBvbGQgY3JlZGVudGlhbCBzdHJpbmcuXG4gKiBJdCBpcyBvbmx5IHJlcXVpcmVkIHRvIGJlIHNldCBpbiBjYXNlIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgY3VycmVudFxuICogY3JlZGVudGlhbCByYXRoZXIgdGhhbiB0byBzZXQgYSBuZXcgb25lLiBTZXR0aW5nIGl0IHRvIGEgd3JvbmcgdmFsdWUgd2lsbFxuICogbWFrZSB0aGlzIG1ldGhvZCB0byBmYWlsIGFuZCB0aHJvdyBhbiBleGNlcHRpb24uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSB2ZXJpZnlpbmcgaW5wdXQgYXJndW1lbnRzIG9yIHNldHRpbmdcbiAqIHRoZSBjcmVkZW50aWFsXG4gKi9cbmxvY2tNYW5hZ2VtZW50TWV0aG9kcy5zZXRMb2NrQ3JlZGVudGlhbCA9IGFzeW5jIGZ1bmN0aW9uIHNldExvY2tDcmVkZW50aWFsIChcbiAgY3JlZGVudGlhbFR5cGUsIGNyZWRlbnRpYWwsIG9sZENyZWRlbnRpYWwgPSBudWxsKSB7XG4gIGlmICghU1VQUE9SVEVEX0xPQ0tfQ1JFREVOVElBTF9UWVBFUy5pbmNsdWRlcyhjcmVkZW50aWFsVHlwZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERldmljZSBsb2NrIGNyZWRlbnRpYWwgdHlwZSAnJHtjcmVkZW50aWFsVHlwZX0nIGlzIHVua25vd24uIGAgK1xuICAgICAgYE9ubHkgdGhlIGZvbGxvd2luZyBjcmVkZW50aWFsIHR5cGVzIGFyZSBzdXBwb3J0ZWQ6ICR7U1VQUE9SVEVEX0xPQ0tfQ1JFREVOVElBTF9UWVBFU31gKTtcbiAgfVxuICBpZiAoXy5pc0VtcHR5KGNyZWRlbnRpYWwpICYmICFfLmlzSW50ZWdlcihjcmVkZW50aWFsKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRGV2aWNlIGxvY2sgY3JlZGVudGlhbCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgfVxuICBjb25zdCBjbWQgPSBidWlsZENvbW1hbmQoYHNldC0ke2NyZWRlbnRpYWxUeXBlfWAsIG9sZENyZWRlbnRpYWwsIGNyZWRlbnRpYWwpO1xuICB0cnkge1xuICAgIGNvbnN0IHtzdGRvdXQsIHN0ZGVycn0gPSBhd2FpdCB0aGlzLnNoZWxsKGNtZCwge1xuICAgICAgb3V0cHV0Rm9ybWF0OiB0aGlzLkVYRUNfT1VUUFVUX0ZPUk1BVC5GVUxMXG4gICAgfSk7XG4gICAgaWYgKCFfLmluY2x1ZGVzKHN0ZG91dCwgJ3NldCB0bycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3Ioc3RkZXJyIHx8IHN0ZG91dCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTZXR0aW5nIG9mIGRldmljZSBsb2NrICR7Y3JlZGVudGlhbFR5cGV9IGNyZWRlbnRpYWwgZmFpbGVkLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLnN0ZGVyciB8fCBlLnN0ZG91dCB8fCBlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIHNjcmVlbiBsb2NrIHN0YXRlIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBkZXZpY2UgaXMgbG9ja2VkLlxuICovXG5sb2NrTWFuYWdlbWVudE1ldGhvZHMuaXNTY3JlZW5Mb2NrZWQgPSBhc3luYyBmdW5jdGlvbiBpc1NjcmVlbkxvY2tlZCAoKSB7XG4gIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3dpbmRvdyddKTtcbiAgcmV0dXJuIGlzU2hvd2luZ0xvY2tzY3JlZW4oc3Rkb3V0KVxuICAgIHx8IGlzQ3VycmVudEZvY3VzT25LZXlndWFyZChzdGRvdXQpXG4gICAgfHwgIWlzU2NyZWVuT25GdWxseShzdGRvdXQpO1xufTtcblxuLyoqXG4gKiBEaXNtaXNzZXMga2V5Z3VhcmQgb3ZlcmxheS5cbiAqL1xubG9ja01hbmFnZW1lbnRNZXRob2RzLmRpc21pc3NLZXlndWFyZCA9IGFzeW5jIGZ1bmN0aW9uIGRpc21pc3NLZXlndWFyZCAoKSB7XG4gIGxvZy5pbmZvKCdXYWtpbmcgdXAgdGhlIGRldmljZSB0byBkaXNtaXNzIHRoZSBrZXlndWFyZCcpO1xuICAvLyBTY3JlZW4gb2ZmIG9uY2UgdG8gZm9yY2UgcHJlLWlucHV0dGVkIHRleHQgZmllbGQgY2xlYW4gYWZ0ZXIgd2FrZS11cFxuICAvLyBKdXN0IHNjcmVlbiBvbiBpZiB0aGUgc2NyZWVuIGRlZmF1bHRzIG9mZlxuICBhd2FpdCB0aGlzLmN5Y2xlV2FrZVVwKCk7XG5cbiAgaWYgKGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA+IDIxKSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3dtJywgJ2Rpc21pc3Mta2V5Z3VhcmQnXSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAnd2luZG93J10pO1xuICBpZiAoIWlzQ3VycmVudEZvY3VzT25LZXlndWFyZChzdGRvdXQpKSB7XG4gICAgbG9nLmRlYnVnKCdUaGUga2V5Z3VhcmQgc2VlbXMgdG8gYmUgaW5hY3RpdmUnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2cuZGVidWcoJ1N3aXBpbmcgdXAgdG8gZGlzbWlzcyB0aGUga2V5Z3VhcmQnKTtcbiAgaWYgKGF3YWl0IHRoaXMuaGlkZUtleWJvYXJkKCkpIHtcbiAgICBhd2FpdCBCLmRlbGF5KEhJREVfS0VZQk9BUkRfV0FJVF9USU1FKTtcbiAgfVxuICBsb2cuZGVidWcoJ0Rpc21pc3Npbmcgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSB1bmxvY2sgdmlldycpO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnc2VydmljZScsICdjYWxsJywgJ25vdGlmaWNhdGlvbicsICcxJ10pO1xuICBhd2FpdCB0aGlzLmJhY2soKTtcbiAgYXdhaXQgc3dpcGVVcC5iaW5kKHRoaXMpKHN0ZG91dCk7XG59O1xuXG4vKipcbiAqIFByZXNzZXMgdGhlIGNvcnJlc3BvbmRpbmcga2V5IGNvbWJpbmF0aW9uIHRvIG1ha2Ugc3VyZSB0aGUgZGV2aWNlJ3Mgc2NyZWVuXG4gKiBpcyBub3QgdHVybmVkIG9mZiBhbmQgaXMgbG9ja2VkIGlmIHRoZSBsYXR0ZXIgaXMgZW5hYmxlZC5cbiAqL1xubG9ja01hbmFnZW1lbnRNZXRob2RzLmN5Y2xlV2FrZVVwID0gYXN5bmMgZnVuY3Rpb24gY3ljbGVXYWtlVXAgKCkge1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KEtFWUNPREVfUE9XRVIpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KEtFWUNPREVfV0FLRVVQKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxvY2tNYW5hZ2VtZW50TWV0aG9kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUVBLE1BQU1BLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUVoQyxNQUFNQyx3Q0FBd0MsR0FBSSxtQ0FBa0M7QUFDcEYsTUFBTUMsOEJBQThCLEdBQUksY0FBYTtBQUNyRCxNQUFNQywrQkFBK0IsR0FBRyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUs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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockmgmt.js","names":["lockManagementMethods","CREDENTIAL_CANNOT_BE_NULL_OR_EMPTY_ERROR","CREDENTIAL_DID_NOT_MATCH_ERROR","SUPPORTED_LOCK_CREDENTIAL_TYPES","KEYCODE_POWER","KEYCODE_WAKEUP","HIDE_KEYBOARD_WAIT_TIME","buildCommand","verb","oldCredential","args","cmd","_","isEmpty","push","swipeUp","adb","output","shell","dimensionsMatch","exec","Error","displayWidth","parseInt","displayHeight","x0","y0","x1","y1","map","c","Math","trunc","isLockManagementSupported","isBoolean","_isLockManagementSupported","passFlag","ign","includes","log","debug","verifyLockCredential","credential","stdout","stderr","outputFormat","EXEC_OUTPUT_FORMAT","FULL","some","x","e","message","clearLockCredential","isLockEnabled","test","setLockCredential","credentialType","isInteger","isScreenLocked","process","env","APPIUM_LOG_DUMPSYS","dumpsysFile","path","resolve","cwd","fs","writeFile","isShowingLockscreen","isCurrentFocusOnKeyguard","isScreenOnFully","dismissKeyguard","info","cycleWakeUp","getApiLevel","hideKeyboard","B","delay","back","keyevent"],"sources":["../../../lib/tools/lockmgmt.js"],"sourcesContent":["import log from '../logger.js';\nimport path from 'path';\nimport _ from 'lodash';\nimport { fs } from '@appium/support';\nimport {\n isShowingLockscreen, isCurrentFocusOnKeyguard, isScreenOnFully,\n} from '../helpers.js';\nimport B from 'bluebird';\n\nconst lockManagementMethods = {};\n\nconst CREDENTIAL_CANNOT_BE_NULL_OR_EMPTY_ERROR = `Credential can't be null or empty`;\nconst CREDENTIAL_DID_NOT_MATCH_ERROR = `didn't match`;\nconst SUPPORTED_LOCK_CREDENTIAL_TYPES = ['password', 'pin', 'pattern'];\nconst KEYCODE_POWER = 26;\nconst KEYCODE_WAKEUP = 224; // works over API Level 20\nconst HIDE_KEYBOARD_WAIT_TIME = 100;\n\nfunction buildCommand (verb, oldCredential = null, ...args) {\n const cmd = ['locksettings', verb];\n if (!_.isEmpty(oldCredential)) {\n cmd.push('--old', oldCredential);\n }\n if (!_.isEmpty(args)) {\n cmd.push(...args);\n }\n return cmd;\n}\n\nasync function swipeUp (adb) {\n const output = await adb.shell(['dumpsys', 'window']);\n const dimensionsMatch = /init=(\\d+)x(\\d+)/.exec(output);\n if (!dimensionsMatch) {\n throw new Error('Cannot retrieve the display size');\n }\n const displayWidth = parseInt(dimensionsMatch[1], 10);\n const displayHeight = parseInt(dimensionsMatch[2], 10);\n const x0 = displayWidth / 2;\n const y0 = displayHeight / 5 * 4;\n const x1 = x0;\n const y1 = displayHeight / 5;\n await adb.shell([\n 'input', 'touchscreen', 'swipe',\n ...([x0, y0, x1, y1].map((c) => Math.trunc(c)))\n ]);\n}\n\n/**\n * Check whether the device supports lock settings management with `locksettings`\n * command line tool. This tool has been added to Android toolset since API 27 Oreo\n *\n * @return {boolean} True if the management is supported. The result is cached per ADB instance\n */\nlockManagementMethods.isLockManagementSupported = async function isLockManagementSupported () {\n if (!_.isBoolean(this._isLockManagementSupported)) {\n const passFlag = '__PASS__';\n let output = '';\n try {\n output = await this.shell([`locksettings help && echo ${passFlag}`]);\n } catch (ign) {}\n this._isLockManagementSupported = _.includes(output, passFlag);\n log.debug(`Extended lock settings management is ` +\n `${this._isLockManagementSupported ? '' : 'not '}supported`);\n }\n return this._isLockManagementSupported;\n};\n\n/**\n * Check whether the given credential is matches to the currently set one.\n *\n * @param {?string} credential [null] The credential value. It could be either\n * pin, password or a pattern. A pattern is specified by a non-separated list\n * of numbers that index the cell on the pattern in a 1-based manner in left\n * to right and top to bottom order, i.e. the top-left cell is indexed with 1,\n * whereas the bottom-right cell is indexed with 9. Example: 1234.\n * null/empty value assumes the device has no lock currently set.\n * @return {boolean} True if the given credential matches to the device's one\n * @throws {Error} If the verification faces an unexpected error\n */\nlockManagementMethods.verifyLockCredential = async function verifyLockCredential (credential = null) {\n try {\n const {stdout, stderr} = await this.shell(buildCommand('verify', credential), {\n outputFormat: this.EXEC_OUTPUT_FORMAT.FULL\n });\n if (_.includes(stdout, 'verified successfully')) {\n return true;\n }\n if ([`didn't match`, CREDENTIAL_CANNOT_BE_NULL_OR_EMPTY_ERROR]\n .some((x) => _.includes(stderr || stdout, x))) {\n return false;\n }\n throw new Error(stderr || stdout);\n } catch (e) {\n throw new Error(`Device lock credential verification failed. ` +\n `Original error: ${e.stderr || e.stdout || e.message}`);\n }\n};\n\n/**\n * Clears current lock credentials. Usually it takes several seconds for a device to\n * sync the credential state after this method returns.\n *\n * @param {?string} credential [null] The credential value. It could be either\n * pin, password or a pattern. A pattern is specified by a non-separated list\n * of numbers that index the cell on the pattern in a 1-based manner in left\n * to right and top to bottom order, i.e. the top-left cell is indexed with 1,\n * whereas the bottom-right cell is indexed with 9. Example: 1234.\n * null/empty value assumes the device has no lock currently set.\n * @throws {Error} If operation faces an unexpected error\n */\nlockManagementMethods.clearLockCredential = async function clearLockCredential (credential = null) {\n try {\n const {stdout, stderr} = await this.shell(buildCommand('clear', credential), {\n outputFormat: this.EXEC_OUTPUT_FORMAT.FULL\n });\n if (!['user has no password', 'Lock credential cleared']\n .some((x) => _.includes(stderr || stdout, x))) {\n throw new Error(stderr || stdout);\n }\n } catch (e) {\n throw new Error(`Cannot clear device lock credential. ` +\n `Original error: ${e.stderr || e.stdout || e.message}`);\n }\n};\n\n/**\n * Checks whether the device is locked with a credential (either pin or a password\n * or a pattern).\n *\n * @returns {boolean} `true` if the device is locked\n * @throws {Error} If operation faces an unexpected error\n */\nlockManagementMethods.isLockEnabled = async function isLockEnabled () {\n try {\n const {stdout, stderr} = await this.shell(buildCommand('get-disabled'), {\n outputFormat: this.EXEC_OUTPUT_FORMAT.FULL\n });\n if (/\\bfalse\\b/.test(stdout)\n || [CREDENTIAL_DID_NOT_MATCH_ERROR, CREDENTIAL_CANNOT_BE_NULL_OR_EMPTY_ERROR].some(\n (x) => _.includes(stderr || stdout, x))) {\n return true;\n }\n if (/\\btrue\\b/.test(stdout)) {\n return false;\n }\n throw new Error(stderr || stdout);\n } catch (e) {\n throw new Error(`Cannot check if device lock is enabled. Original error: ${e.message}`);\n }\n};\n\n/**\n * Sets the device lock.\n *\n * @param {!string} credentialType One of: password, pin, pattern.\n * @param {!string} credential A non-empty credential value to be set.\n * Make sure your new credential matches to the actual system security requirements,\n * e.g. a minimum password length. A pattern is specified by a non-separated list\n * of numbers that index the cell on the pattern in a 1-based manner in left\n * to right and top to bottom order, i.e. the top-left cell is indexed with 1,\n * whereas the bottom-right cell is indexed with 9. Example: 1234.\n * @param {?string} oldCredential [null] An old credential string.\n * It is only required to be set in case you need to change the current\n * credential rather than to set a new one. Setting it to a wrong value will\n * make this method to fail and throw an exception.\n * @throws {Error} If there was a failure while verifying input arguments or setting\n * the credential\n */\nlockManagementMethods.setLockCredential = async function setLockCredential (\n credentialType, credential, oldCredential = null) {\n if (!SUPPORTED_LOCK_CREDENTIAL_TYPES.includes(credentialType)) {\n throw new Error(`Device lock credential type '${credentialType}' is unknown. ` +\n `Only the following credential types are supported: ${SUPPORTED_LOCK_CREDENTIAL_TYPES}`);\n }\n if (_.isEmpty(credential) && !_.isInteger(credential)) {\n throw new Error('Device lock credential cannot be empty');\n }\n const cmd = buildCommand(`set-${credentialType}`, oldCredential, credential);\n try {\n const {stdout, stderr} = await this.shell(cmd, {\n outputFormat: this.EXEC_OUTPUT_FORMAT.FULL\n });\n if (!_.includes(stdout, 'set to')) {\n throw new Error(stderr || stdout);\n }\n } catch (e) {\n throw new Error(`Setting of device lock ${credentialType} credential failed. ` +\n `Original error: ${e.stderr || e.stdout || e.message}`);\n }\n};\n\n/**\n * Retrieve the screen lock state of the device under test.\n *\n * @return {boolean} True if the device is locked.\n */\nlockManagementMethods.isScreenLocked = async function isScreenLocked () {\n const stdout = await this.shell(['dumpsys', 'window']);\n if (process.env.APPIUM_LOG_DUMPSYS) {\n // optional debugging\n // if the method is not working, turn it on and send us the output\n const dumpsysFile = path.resolve(process.cwd(), 'dumpsys.log');\n log.debug(`Writing dumpsys output to ${dumpsysFile}`);\n await fs.writeFile(dumpsysFile, stdout);\n }\n return isShowingLockscreen(stdout) || isCurrentFocusOnKeyguard(stdout) || !isScreenOnFully(stdout);\n};\n\n/**\n * Dismisses keyguard overlay.\n */\nlockManagementMethods.dismissKeyguard = async function dismissKeyguard () {\n log.info('Waking up the device to dismiss the keyguard');\n // Screen off once to force pre-inputted text field clean after wake-up\n // Just screen on if the screen defaults off\n await this.cycleWakeUp();\n\n if (await this.getApiLevel() > 21) {\n await this.shell(['wm', 'dismiss-keyguard']);\n return;\n }\n\n const stdout = await this.shell(['dumpsys', 'window', 'windows']);\n if (!isCurrentFocusOnKeyguard(stdout)) {\n log.debug('The keyguard seems to be inactive');\n return;\n }\n\n log.debug('Swiping up to dismiss the keyguard');\n if (await this.hideKeyboard()) {\n await B.delay(HIDE_KEYBOARD_WAIT_TIME);\n }\n log.debug('Dismissing notifications from the unlock view');\n await this.shell(['service', 'call', 'notification', '1']);\n await this.back();\n await swipeUp(this);\n};\n\n/**\n * Presses the corresponding key combination to make sure the device's screen\n * is not turned off and is locked if the latter is enabled.\n */\nlockManagementMethods.cycleWakeUp = async function cycleWakeUp () {\n await this.keyevent(KEYCODE_POWER);\n await this.keyevent(KEYCODE_WAKEUP);\n};\n\nexport default lockManagementMethods;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lockmgmt.js","names":["lockManagementMethods","CREDENTIAL_CANNOT_BE_NULL_OR_EMPTY_ERROR","CREDENTIAL_DID_NOT_MATCH_ERROR","SUPPORTED_LOCK_CREDENTIAL_TYPES","KEYCODE_POWER","KEYCODE_WAKEUP","HIDE_KEYBOARD_WAIT_TIME","buildCommand","verb","oldCredential","args","cmd","_","isEmpty","push","swipeUp","windowDumpsys","dimensionsMatch","exec","Error","displayWidth","parseInt","displayHeight","x0","y0","x1","y1","shell","map","c","Math","trunc","isLockManagementSupported","isBoolean","_isLockManagementSupported","passFlag","output","ign","includes","log","debug","verifyLockCredential","credential","stdout","stderr","outputFormat","EXEC_OUTPUT_FORMAT","FULL","some","x","e","message","clearLockCredential","isLockEnabled","test","setLockCredential","credentialType","isInteger","isScreenLocked","isShowingLockscreen","isCurrentFocusOnKeyguard","isScreenOnFully","dismissKeyguard","info","cycleWakeUp","getApiLevel","hideKeyboard","B","delay","back","bind","keyevent"],"sources":["../../../lib/tools/lockmgmt.js"],"sourcesContent":["import log from '../logger.js';\nimport _ from 'lodash';\nimport {\n isShowingLockscreen, isCurrentFocusOnKeyguard, isScreenOnFully,\n} from '../helpers.js';\nimport B from 'bluebird';\n\nconst lockManagementMethods = {};\n\nconst CREDENTIAL_CANNOT_BE_NULL_OR_EMPTY_ERROR = `Credential can't be null or empty`;\nconst CREDENTIAL_DID_NOT_MATCH_ERROR = `didn't match`;\nconst SUPPORTED_LOCK_CREDENTIAL_TYPES = ['password', 'pin', 'pattern'];\nconst KEYCODE_POWER = 26;\nconst KEYCODE_WAKEUP = 224; // works over API Level 20\nconst HIDE_KEYBOARD_WAIT_TIME = 100;\n\nfunction buildCommand (verb, oldCredential = null, ...args) {\n const cmd = ['locksettings', verb];\n if (!_.isEmpty(oldCredential)) {\n cmd.push('--old', oldCredential);\n }\n if (!_.isEmpty(args)) {\n cmd.push(...args);\n }\n return cmd;\n}\n\n/**\n * Performs swipe up gesture on the screen\n *\n * @this {ADB}\n * @param {string} windowDumpsys The output of `adb shell dumpsys window` command\n * @throws {Error} If the display size cannot be retrieved\n */\nasync function swipeUp (windowDumpsys) {\n const dimensionsMatch = /init=(\\d+)x(\\d+)/.exec(windowDumpsys);\n if (!dimensionsMatch) {\n throw new Error('Cannot retrieve the display size');\n }\n const displayWidth = parseInt(dimensionsMatch[1], 10);\n const displayHeight = parseInt(dimensionsMatch[2], 10);\n const x0 = displayWidth / 2;\n const y0 = displayHeight / 5 * 4;\n const x1 = x0;\n const y1 = displayHeight / 5;\n await this.shell([\n 'input', 'touchscreen', 'swipe',\n ...([x0, y0, x1, y1].map((c) => Math.trunc(c)))\n ]);\n}\n\n/**\n * Check whether the device supports lock settings management with `locksettings`\n * command line tool. This tool has been added to Android toolset since API 27 Oreo\n *\n * @return {boolean} True if the management is supported. The result is cached per ADB instance\n */\nlockManagementMethods.isLockManagementSupported = async function isLockManagementSupported () {\n if (!_.isBoolean(this._isLockManagementSupported)) {\n const passFlag = '__PASS__';\n let output = '';\n try {\n output = await this.shell([`locksettings help && echo ${passFlag}`]);\n } catch (ign) {}\n this._isLockManagementSupported = _.includes(output, passFlag);\n log.debug(`Extended lock settings management is ` +\n `${this._isLockManagementSupported ? '' : 'not '}supported`);\n }\n return this._isLockManagementSupported;\n};\n\n/**\n * Check whether the given credential is matches to the currently set one.\n *\n * @param {?string} credential [null] The credential value. It could be either\n * pin, password or a pattern. A pattern is specified by a non-separated list\n * of numbers that index the cell on the pattern in a 1-based manner in left\n * to right and top to bottom order, i.e. the top-left cell is indexed with 1,\n * whereas the bottom-right cell is indexed with 9. Example: 1234.\n * null/empty value assumes the device has no lock currently set.\n * @return {boolean} True if the given credential matches to the device's one\n * @throws {Error} If the verification faces an unexpected error\n */\nlockManagementMethods.verifyLockCredential = async function verifyLockCredential (credential = null) {\n try {\n const {stdout, stderr} = await this.shell(buildCommand('verify', credential), {\n outputFormat: this.EXEC_OUTPUT_FORMAT.FULL\n });\n if (_.includes(stdout, 'verified successfully')) {\n return true;\n }\n if ([`didn't match`, CREDENTIAL_CANNOT_BE_NULL_OR_EMPTY_ERROR]\n .some((x) => _.includes(stderr || stdout, x))) {\n return false;\n }\n throw new Error(stderr || stdout);\n } catch (e) {\n throw new Error(`Device lock credential verification failed. ` +\n `Original error: ${e.stderr || e.stdout || e.message}`);\n }\n};\n\n/**\n * Clears current lock credentials. Usually it takes several seconds for a device to\n * sync the credential state after this method returns.\n *\n * @param {?string} credential [null] The credential value. It could be either\n * pin, password or a pattern. A pattern is specified by a non-separated list\n * of numbers that index the cell on the pattern in a 1-based manner in left\n * to right and top to bottom order, i.e. the top-left cell is indexed with 1,\n * whereas the bottom-right cell is indexed with 9. Example: 1234.\n * null/empty value assumes the device has no lock currently set.\n * @throws {Error} If operation faces an unexpected error\n */\nlockManagementMethods.clearLockCredential = async function clearLockCredential (credential = null) {\n try {\n const {stdout, stderr} = await this.shell(buildCommand('clear', credential), {\n outputFormat: this.EXEC_OUTPUT_FORMAT.FULL\n });\n if (!['user has no password', 'Lock credential cleared']\n .some((x) => _.includes(stderr || stdout, x))) {\n throw new Error(stderr || stdout);\n }\n } catch (e) {\n throw new Error(`Cannot clear device lock credential. ` +\n `Original error: ${e.stderr || e.stdout || e.message}`);\n }\n};\n\n/**\n * Checks whether the device is locked with a credential (either pin or a password\n * or a pattern).\n *\n * @returns {boolean} `true` if the device is locked\n * @throws {Error} If operation faces an unexpected error\n */\nlockManagementMethods.isLockEnabled = async function isLockEnabled () {\n try {\n const {stdout, stderr} = await this.shell(buildCommand('get-disabled'), {\n outputFormat: this.EXEC_OUTPUT_FORMAT.FULL\n });\n if (/\\bfalse\\b/.test(stdout)\n || [CREDENTIAL_DID_NOT_MATCH_ERROR, CREDENTIAL_CANNOT_BE_NULL_OR_EMPTY_ERROR].some(\n (x) => _.includes(stderr || stdout, x))) {\n return true;\n }\n if (/\\btrue\\b/.test(stdout)) {\n return false;\n }\n throw new Error(stderr || stdout);\n } catch (e) {\n throw new Error(`Cannot check if device lock is enabled. Original error: ${e.message}`);\n }\n};\n\n/**\n * Sets the device lock.\n *\n * @param {!string} credentialType One of: password, pin, pattern.\n * @param {!string} credential A non-empty credential value to be set.\n * Make sure your new credential matches to the actual system security requirements,\n * e.g. a minimum password length. A pattern is specified by a non-separated list\n * of numbers that index the cell on the pattern in a 1-based manner in left\n * to right and top to bottom order, i.e. the top-left cell is indexed with 1,\n * whereas the bottom-right cell is indexed with 9. Example: 1234.\n * @param {?string} oldCredential [null] An old credential string.\n * It is only required to be set in case you need to change the current\n * credential rather than to set a new one. Setting it to a wrong value will\n * make this method to fail and throw an exception.\n * @throws {Error} If there was a failure while verifying input arguments or setting\n * the credential\n */\nlockManagementMethods.setLockCredential = async function setLockCredential (\n credentialType, credential, oldCredential = null) {\n if (!SUPPORTED_LOCK_CREDENTIAL_TYPES.includes(credentialType)) {\n throw new Error(`Device lock credential type '${credentialType}' is unknown. ` +\n `Only the following credential types are supported: ${SUPPORTED_LOCK_CREDENTIAL_TYPES}`);\n }\n if (_.isEmpty(credential) && !_.isInteger(credential)) {\n throw new Error('Device lock credential cannot be empty');\n }\n const cmd = buildCommand(`set-${credentialType}`, oldCredential, credential);\n try {\n const {stdout, stderr} = await this.shell(cmd, {\n outputFormat: this.EXEC_OUTPUT_FORMAT.FULL\n });\n if (!_.includes(stdout, 'set to')) {\n throw new Error(stderr || stdout);\n }\n } catch (e) {\n throw new Error(`Setting of device lock ${credentialType} credential failed. ` +\n `Original error: ${e.stderr || e.stdout || e.message}`);\n }\n};\n\n/**\n * Retrieve the screen lock state of the device under test.\n *\n * @return {boolean} True if the device is locked.\n */\nlockManagementMethods.isScreenLocked = async function isScreenLocked () {\n const stdout = await this.shell(['dumpsys', 'window']);\n return isShowingLockscreen(stdout)\n || isCurrentFocusOnKeyguard(stdout)\n || !isScreenOnFully(stdout);\n};\n\n/**\n * Dismisses keyguard overlay.\n */\nlockManagementMethods.dismissKeyguard = async function dismissKeyguard () {\n log.info('Waking up the device to dismiss the keyguard');\n // Screen off once to force pre-inputted text field clean after wake-up\n // Just screen on if the screen defaults off\n await this.cycleWakeUp();\n\n if (await this.getApiLevel() > 21) {\n await this.shell(['wm', 'dismiss-keyguard']);\n return;\n }\n\n const stdout = await this.shell(['dumpsys', 'window']);\n if (!isCurrentFocusOnKeyguard(stdout)) {\n log.debug('The keyguard seems to be inactive');\n return;\n }\n\n log.debug('Swiping up to dismiss the keyguard');\n if (await this.hideKeyboard()) {\n await B.delay(HIDE_KEYBOARD_WAIT_TIME);\n }\n log.debug('Dismissing notifications from the unlock view');\n await this.shell(['service', 'call', 'notification', '1']);\n await this.back();\n await swipeUp.bind(this)(stdout);\n};\n\n/**\n * Presses the corresponding key combination to make sure the device's screen\n * is not turned off and is locked if the latter is enabled.\n */\nlockManagementMethods.cycleWakeUp = async function cycleWakeUp () {\n await this.keyevent(KEYCODE_POWER);\n await this.keyevent(KEYCODE_WAKEUP);\n};\n\nexport default lockManagementMethods;\n"],"mappings":"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"}
|
package/lib/tools/lockmgmt.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import log from '../logger.js';
|
|
2
|
-
import path from 'path';
|
|
3
2
|
import _ from 'lodash';
|
|
4
|
-
import { fs } from '@appium/support';
|
|
5
3
|
import {
|
|
6
4
|
isShowingLockscreen, isCurrentFocusOnKeyguard, isScreenOnFully,
|
|
7
5
|
} from '../helpers.js';
|
|
@@ -27,9 +25,15 @@ function buildCommand (verb, oldCredential = null, ...args) {
|
|
|
27
25
|
return cmd;
|
|
28
26
|
}
|
|
29
27
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Performs swipe up gesture on the screen
|
|
30
|
+
*
|
|
31
|
+
* @this {ADB}
|
|
32
|
+
* @param {string} windowDumpsys The output of `adb shell dumpsys window` command
|
|
33
|
+
* @throws {Error} If the display size cannot be retrieved
|
|
34
|
+
*/
|
|
35
|
+
async function swipeUp (windowDumpsys) {
|
|
36
|
+
const dimensionsMatch = /init=(\d+)x(\d+)/.exec(windowDumpsys);
|
|
33
37
|
if (!dimensionsMatch) {
|
|
34
38
|
throw new Error('Cannot retrieve the display size');
|
|
35
39
|
}
|
|
@@ -39,7 +43,7 @@ async function swipeUp (adb) {
|
|
|
39
43
|
const y0 = displayHeight / 5 * 4;
|
|
40
44
|
const x1 = x0;
|
|
41
45
|
const y1 = displayHeight / 5;
|
|
42
|
-
await
|
|
46
|
+
await this.shell([
|
|
43
47
|
'input', 'touchscreen', 'swipe',
|
|
44
48
|
...([x0, y0, x1, y1].map((c) => Math.trunc(c)))
|
|
45
49
|
]);
|
|
@@ -196,14 +200,9 @@ lockManagementMethods.setLockCredential = async function setLockCredential (
|
|
|
196
200
|
*/
|
|
197
201
|
lockManagementMethods.isScreenLocked = async function isScreenLocked () {
|
|
198
202
|
const stdout = await this.shell(['dumpsys', 'window']);
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
const dumpsysFile = path.resolve(process.cwd(), 'dumpsys.log');
|
|
203
|
-
log.debug(`Writing dumpsys output to ${dumpsysFile}`);
|
|
204
|
-
await fs.writeFile(dumpsysFile, stdout);
|
|
205
|
-
}
|
|
206
|
-
return isShowingLockscreen(stdout) || isCurrentFocusOnKeyguard(stdout) || !isScreenOnFully(stdout);
|
|
203
|
+
return isShowingLockscreen(stdout)
|
|
204
|
+
|| isCurrentFocusOnKeyguard(stdout)
|
|
205
|
+
|| !isScreenOnFully(stdout);
|
|
207
206
|
};
|
|
208
207
|
|
|
209
208
|
/**
|
|
@@ -220,7 +219,7 @@ lockManagementMethods.dismissKeyguard = async function dismissKeyguard () {
|
|
|
220
219
|
return;
|
|
221
220
|
}
|
|
222
221
|
|
|
223
|
-
const stdout = await this.shell(['dumpsys', 'window'
|
|
222
|
+
const stdout = await this.shell(['dumpsys', 'window']);
|
|
224
223
|
if (!isCurrentFocusOnKeyguard(stdout)) {
|
|
225
224
|
log.debug('The keyguard seems to be inactive');
|
|
226
225
|
return;
|
|
@@ -233,7 +232,7 @@ lockManagementMethods.dismissKeyguard = async function dismissKeyguard () {
|
|
|
233
232
|
log.debug('Dismissing notifications from the unlock view');
|
|
234
233
|
await this.shell(['service', 'call', 'notification', '1']);
|
|
235
234
|
await this.back();
|
|
236
|
-
await swipeUp(this);
|
|
235
|
+
await swipeUp.bind(this)(stdout);
|
|
237
236
|
};
|
|
238
237
|
|
|
239
238
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-adb",
|
|
3
|
-
"version": "9.10.
|
|
3
|
+
"version": "9.10.22",
|
|
4
4
|
"description": "Android Debug Bridge interface",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
"mocha": "^10.0.0",
|
|
94
94
|
"pre-commit": "^1.1.3",
|
|
95
95
|
"prettier": "^2.7.1",
|
|
96
|
-
"rimraf": "^
|
|
96
|
+
"rimraf": "^4.0.4",
|
|
97
97
|
"semantic-release": "^19.0.2",
|
|
98
98
|
"sinon": "^15.0.0",
|
|
99
99
|
"temp": "^0.x"
|