appium-android-driver 5.4.3 → 5.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.js +1 -9
- package/build/lib/android-helpers.js +10 -194
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.js +4 -45
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.js +3 -78
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.js +3 -10
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.js +4 -32
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.js +6 -78
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/coverage.js +1 -6
- package/build/lib/commands/coverage.js.map +1 -1
- package/build/lib/commands/element.js +4 -47
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/emu-console.js +2 -7
- package/build/lib/commands/emu-console.js.map +1 -1
- package/build/lib/commands/execute.js +1 -13
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.js +3 -44
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.js +3 -16
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +32 -91
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.js +3 -14
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.js +3 -27
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.js +1 -40
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/log.js +3 -35
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.js +2 -47
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.js +4 -40
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.js +5 -57
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/recordscreen.js +1 -59
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/shell.js +1 -15
- package/build/lib/commands/shell.js.map +1 -1
- package/build/lib/commands/streamscreen.js +7 -74
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/system-bars.js +1 -23
- package/build/lib/commands/system-bars.js.map +1 -1
- package/build/lib/commands/touch.js +13 -79
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/desired-caps.js +3 -4
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.js +8 -97
- package/build/lib/driver.js.map +1 -1
- package/build/lib/logger.js +1 -5
- package/build/lib/logger.js.map +1 -1
- package/build/lib/uiautomator.js +3 -24
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.js +1 -61
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.js +1 -7
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.js +1 -94
- package/build/lib/webview-helpers.js.map +1 -1
- package/lib/android-helpers.js +2 -1
- package/lib/commands/general.js +34 -15
- package/package.json +1 -1
|
@@ -1,30 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.helpers = exports.default = exports.commands = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
10
|
var _driver = require("appium/driver");
|
|
15
|
-
|
|
16
11
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
17
|
-
|
|
18
12
|
let commands = {},
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
helpers = {},
|
|
14
|
+
extensions = {};
|
|
21
15
|
exports.helpers = helpers;
|
|
22
16
|
exports.commands = commands;
|
|
23
17
|
const AIRPLANE_MODE_MASK = 0b001;
|
|
24
18
|
const WIFI_MASK = 0b010;
|
|
25
19
|
const DATA_MASK = 0b100;
|
|
26
20
|
const GEO_EPSILON = Number.MIN_VALUE;
|
|
27
|
-
|
|
28
21
|
commands.getNetworkConnection = async function getNetworkConnection() {
|
|
29
22
|
this.log.info('Getting network connection');
|
|
30
23
|
let airplaneModeOn = await this.adb.isAirplaneModeOn();
|
|
@@ -36,14 +29,12 @@ commands.getNetworkConnection = async function getNetworkConnection() {
|
|
|
36
29
|
let dataOn = await this.adb.isDataOn();
|
|
37
30
|
connection |= dataOn ? DATA_MASK : 0;
|
|
38
31
|
}
|
|
39
|
-
|
|
40
32
|
return connection;
|
|
41
33
|
};
|
|
42
34
|
|
|
43
35
|
commands.isWifiOn = async function isWifiOn() {
|
|
44
36
|
return await this.adb.isWifiOn();
|
|
45
37
|
};
|
|
46
|
-
|
|
47
38
|
commands.setNetworkConnection = async function setNetworkConnection(type) {
|
|
48
39
|
this.log.info('Setting network connection');
|
|
49
40
|
const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;
|
|
@@ -53,7 +44,6 @@ commands.setNetworkConnection = async function setNetworkConnection(type) {
|
|
|
53
44
|
const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;
|
|
54
45
|
const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;
|
|
55
46
|
const isDataEnabled = (currentState & DATA_MASK) !== 0;
|
|
56
|
-
|
|
57
47
|
if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {
|
|
58
48
|
await this.wrapBootstrapDisconnect(async () => {
|
|
59
49
|
await this.adb.setAirplaneMode(shouldEnableAirplaneMode);
|
|
@@ -64,24 +54,19 @@ commands.setNetworkConnection = async function setNetworkConnection(type) {
|
|
|
64
54
|
} else {
|
|
65
55
|
this.log.info(`Not changing airplane mode, since it is already ` + `${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);
|
|
66
56
|
}
|
|
67
|
-
|
|
68
57
|
if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {
|
|
69
58
|
this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');
|
|
70
|
-
|
|
71
59
|
if (await this.adb.isAirplaneModeOn()) {
|
|
72
60
|
return AIRPLANE_MODE_MASK | currentState;
|
|
73
61
|
}
|
|
74
|
-
|
|
75
62
|
return ~AIRPLANE_MODE_MASK & currentState;
|
|
76
63
|
}
|
|
77
|
-
|
|
78
64
|
await this.wrapBootstrapDisconnect(async () => {
|
|
79
65
|
if (shouldEnableWifi !== isWiFiEnabled) {
|
|
80
66
|
await this.setWifiState(shouldEnableWifi);
|
|
81
67
|
} else {
|
|
82
68
|
this.log.info(`Not changing Wi-Fi state, since it is already ` + `${shouldEnableWifi ? 'enabled' : 'disabled'}`);
|
|
83
69
|
}
|
|
84
|
-
|
|
85
70
|
if (shouldEnableAirplaneMode) {
|
|
86
71
|
this.log.info('Not changing data connection state, because airplane mode is enabled');
|
|
87
72
|
} else if (shouldEnableDataConnection === isDataEnabled) {
|
|
@@ -96,7 +81,6 @@ commands.setNetworkConnection = async function setNetworkConnection(type) {
|
|
|
96
81
|
commands.setWifiState = async function setWifiState(wifi) {
|
|
97
82
|
await this.adb.setWifiState(wifi, this.isEmulator());
|
|
98
83
|
};
|
|
99
|
-
|
|
100
84
|
commands.toggleData = async function toggleData() {
|
|
101
85
|
let data = !(await this.adb.isDataOn());
|
|
102
86
|
this.log.info(`Turning network data ${data ? 'on' : 'off'}`);
|
|
@@ -106,7 +90,6 @@ commands.toggleData = async function toggleData() {
|
|
|
106
90
|
}, this.isEmulator());
|
|
107
91
|
});
|
|
108
92
|
};
|
|
109
|
-
|
|
110
93
|
commands.toggleWiFi = async function toggleWiFi() {
|
|
111
94
|
let wifi = !(await this.adb.isWifiOn());
|
|
112
95
|
this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);
|
|
@@ -116,7 +99,6 @@ commands.toggleWiFi = async function toggleWiFi() {
|
|
|
116
99
|
}, this.isEmulator());
|
|
117
100
|
});
|
|
118
101
|
};
|
|
119
|
-
|
|
120
102
|
commands.toggleFlightMode = async function toggleFlightMode() {
|
|
121
103
|
let flightMode = !(await this.adb.isAirplaneModeOn());
|
|
122
104
|
this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);
|
|
@@ -127,10 +109,8 @@ commands.toggleFlightMode = async function toggleFlightMode() {
|
|
|
127
109
|
await this.adb.broadcastAirplaneMode(flightMode);
|
|
128
110
|
});
|
|
129
111
|
};
|
|
130
|
-
|
|
131
112
|
commands.setGeoLocation = async function setGeoLocation(location) {
|
|
132
113
|
await this.adb.setGeoLocation(location, this.isEmulator());
|
|
133
|
-
|
|
134
114
|
try {
|
|
135
115
|
return await this.getGeoLocation();
|
|
136
116
|
} catch (e) {
|
|
@@ -150,7 +130,6 @@ commands.mobileRefreshGpsCache = async function mobileRefreshGpsCache(opts = {})
|
|
|
150
130
|
} = opts;
|
|
151
131
|
await this.adb.refreshGeoLocationCache(timeoutMs);
|
|
152
132
|
};
|
|
153
|
-
|
|
154
133
|
commands.getGeoLocation = async function getGeoLocation() {
|
|
155
134
|
const {
|
|
156
135
|
latitude,
|
|
@@ -163,28 +142,23 @@ commands.getGeoLocation = async function getGeoLocation() {
|
|
|
163
142
|
altitude: parseFloat(altitude) || GEO_EPSILON
|
|
164
143
|
};
|
|
165
144
|
};
|
|
166
|
-
|
|
167
145
|
const KeyCode = {
|
|
168
146
|
UP: 19,
|
|
169
147
|
DOWN: 20,
|
|
170
148
|
RIGHT: 22,
|
|
171
149
|
CENTER: 23
|
|
172
150
|
};
|
|
173
|
-
|
|
174
151
|
commands.toggleLocationServices = async function toggleLocationServices() {
|
|
175
152
|
this.log.info('Toggling location services');
|
|
176
153
|
let api = await this.adb.getApiLevel();
|
|
177
|
-
|
|
178
154
|
if (this.isEmulator()) {
|
|
179
155
|
let providers = await this.adb.getLocationProviders();
|
|
180
156
|
let isGpsEnabled = providers.indexOf('gps') !== -1;
|
|
181
157
|
await this.adb.toggleGPSLocationProvider(!isGpsEnabled);
|
|
182
158
|
return;
|
|
183
159
|
}
|
|
184
|
-
|
|
185
160
|
if (api > 15) {
|
|
186
161
|
let seq = [KeyCode.UP, KeyCode.UP];
|
|
187
|
-
|
|
188
162
|
if (api === 16) {
|
|
189
163
|
seq.push(KeyCode.DOWN);
|
|
190
164
|
} else if (api < 28) {
|
|
@@ -194,28 +168,24 @@ commands.toggleLocationServices = async function toggleLocationServices() {
|
|
|
194
168
|
seq = [KeyCode.RIGHT];
|
|
195
169
|
await this.adb.keyevent(KeyCode.UP);
|
|
196
170
|
}
|
|
197
|
-
|
|
198
171
|
await this.toggleSetting('LOCATION_SOURCE_SETTINGS', seq);
|
|
199
172
|
} else {
|
|
200
173
|
throw new _driver.errors.NotYetImplementedError();
|
|
201
174
|
}
|
|
202
175
|
};
|
|
203
|
-
|
|
204
176
|
helpers.toggleSetting = async function toggleSetting(setting, preKeySeq) {
|
|
205
177
|
if (_lodash.default.isNull(preKeySeq)) {
|
|
206
178
|
preKeySeq = [KeyCode.UP, KeyCode.UP, KeyCode.DOWN];
|
|
207
179
|
}
|
|
208
|
-
|
|
209
180
|
await this.openSettingsActivity(setting);
|
|
210
|
-
|
|
211
181
|
for (let key of preKeySeq) {
|
|
212
182
|
await this.doKey(key);
|
|
213
183
|
}
|
|
214
|
-
|
|
215
184
|
let {
|
|
216
185
|
appPackage,
|
|
217
186
|
appActivity
|
|
218
187
|
} = await this.adb.getFocusedPackageAndActivity();
|
|
188
|
+
|
|
219
189
|
await this.wrapBootstrapDisconnect(async () => {
|
|
220
190
|
await this.doKey(KeyCode.CENTER);
|
|
221
191
|
});
|
|
@@ -226,22 +196,17 @@ helpers.toggleSetting = async function toggleSetting(setting, preKeySeq) {
|
|
|
226
196
|
await this.doKey(KeyCode.CENTER);
|
|
227
197
|
await this.adb.waitForNotActivity(appPackage, appActivity, 5000);
|
|
228
198
|
} catch (ign) {}
|
|
229
|
-
|
|
230
199
|
await this.adb.back();
|
|
231
200
|
};
|
|
232
|
-
|
|
233
201
|
helpers.doKey = async function doKey(key) {
|
|
234
202
|
await _bluebird.default.delay(2000);
|
|
235
203
|
await this.adb.keyevent(key);
|
|
236
204
|
};
|
|
237
|
-
|
|
238
205
|
helpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect(wrapped) {
|
|
239
206
|
if (!this.bootstrap) {
|
|
240
207
|
return await wrapped();
|
|
241
208
|
}
|
|
242
|
-
|
|
243
209
|
this.bootstrap.ignoreUnexpectedShutdown = true;
|
|
244
|
-
|
|
245
210
|
try {
|
|
246
211
|
await wrapped();
|
|
247
212
|
await this.adb.restart();
|
|
@@ -250,8 +215,7 @@ helpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect(wrapped
|
|
|
250
215
|
this.bootstrap.ignoreUnexpectedShutdown = false;
|
|
251
216
|
}
|
|
252
217
|
};
|
|
253
|
-
|
|
254
218
|
Object.assign(extensions, commands, helpers);
|
|
255
219
|
var _default = extensions;
|
|
256
220
|
exports.default = _default;
|
|
257
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiQUlSUExBTkVfTU9ERV9NQVNLIiwiV0lGSV9NQVNLIiwiREFUQV9NQVNLIiwiR0VPX0VQU0lMT04iLCJOdW1iZXIiLCJNSU5fVkFMVUUiLCJnZXROZXR3b3JrQ29ubmVjdGlvbiIsImxvZyIsImluZm8iLCJhaXJwbGFuZU1vZGVPbiIsImFkYiIsImlzQWlycGxhbmVNb2RlT24iLCJjb25uZWN0aW9uIiwid2lmaU9uIiwiaXNXaWZpT24iLCJkYXRhT24iLCJpc0RhdGFPbiIsInNldE5ldHdvcmtDb25uZWN0aW9uIiwidHlwZSIsInNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSIsInNob3VsZEVuYWJsZVdpZmkiLCJzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiIsImN1cnJlbnRTdGF0ZSIsImlzQWlycGxhbmVNb2RlRW5hYmxlZCIsImlzV2lGaUVuYWJsZWQiLCJpc0RhdGFFbmFibGVkIiwid3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QiLCJzZXRBaXJwbGFuZU1vZGUiLCJicm9hZGNhc3RBaXJwbGFuZU1vZGUiLCJzZXRXaWZpU3RhdGUiLCJzZXREYXRhU3RhdGUiLCJpc0VtdWxhdG9yIiwid2lmaSIsInRvZ2dsZURhdGEiLCJkYXRhIiwic2V0V2lmaUFuZERhdGEiLCJ0b2dnbGVXaUZpIiwidG9nZ2xlRmxpZ2h0TW9kZSIsImZsaWdodE1vZGUiLCJzZXRHZW9Mb2NhdGlvbiIsImxvY2F0aW9uIiwiZ2V0R2VvTG9jYXRpb24iLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImFsdGl0dWRlIiwibW9iaWxlUmVmcmVzaEdwc0NhY2hlIiwib3B0cyIsInRpbWVvdXRNcyIsInJlZnJlc2hHZW9Mb2NhdGlvbkNhY2hlIiwicGFyc2VGbG9hdCIsIktleUNvZGUiLCJVUCIsIkRPV04iLCJSSUdIVCIsIkNFTlRFUiIsInRvZ2dsZUxvY2F0aW9uU2VydmljZXMiLCJhcGkiLCJnZXRBcGlMZXZlbCIsInByb3ZpZGVycyIsImdldExvY2F0aW9uUHJvdmlkZXJzIiwiaXNHcHNFbmFibGVkIiwiaW5kZXhPZiIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJzZXEiLCJwdXNoIiwia2V5ZXZlbnQiLCJ0b2dnbGVTZXR0aW5nIiwiZXJyb3JzIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsInNldHRpbmciLCJwcmVLZXlTZXEiLCJfIiwiaXNOdWxsIiwib3BlblNldHRpbmdzQWN0aXZpdHkiLCJrZXkiLCJkb0tleSIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkiLCJ3YWl0Rm9yTm90QWN0aXZpdHkiLCJpZ24iLCJiYWNrIiwiQiIsImRlbGF5Iiwid3JhcHBlZCIsImJvb3RzdHJhcCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsInJlc3RhcnQiLCJzdGFydCIsImRpc2FibGVBbmRyb2lkV2F0Y2hlcnMiLCJhY2NlcHRTc2xDZXJ0cyIsIk9iamVjdCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9uZXR3b3JrLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb25zdCBBSVJQTEFORV9NT0RFX01BU0sgPSAwYjAwMTtcbmNvbnN0IFdJRklfTUFTSyA9IDBiMDEwO1xuY29uc3QgREFUQV9NQVNLID0gMGIxMDA7XG4vLyBUaGUgdmFsdWUgY2xvc2UgdG8gemVybywgYnV0IG5vdCB6ZXJvLCBpcyBuZWVkZWRcbi8vIHRvIHRyaWNrIEpTT04gZ2VuZXJhdGlvbiBhbmQgc2VuZCBhIGZsb2F0IHZhbHVlIGluc3RlYWQgb2YgYW4gaW50ZWdlcixcbi8vIFRoaXMgYWxsb3dzIHN0cmljdGx5LXR5cGVkIGNsaWVudHMsIGxpa2UgSmF2YSwgdG8gcHJvcGVybHlcbi8vIHBhcnNlIGl0LiBPdGhlcndpc2UgZmxvYXQgMC4wIGlzIGFsd2F5cyByZXByZXNlbnRlZCBhcyBpbnRlZ2VyIDAgaW4gSlMuXG4vLyBUaGUgdmFsdWUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIERCTF9FUFNJTE9OIChodHRwczovL29wZW5zb3VyY2UuYXBwbGUuY29tL3NvdXJjZS9MaWJjL0xpYmMtNDk4L2luY2x1ZGUvZmxvYXQuaClcbmNvbnN0IEdFT19FUFNJTE9OID0gTnVtYmVyLk1JTl9WQUxVRTtcblxuY29tbWFuZHMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBnZXROZXR3b3JrQ29ubmVjdGlvbiAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ0dldHRpbmcgbmV0d29yayBjb25uZWN0aW9uJyk7XG4gIGxldCBhaXJwbGFuZU1vZGVPbiA9IGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKTtcbiAgbGV0IGNvbm5lY3Rpb24gPSBhaXJwbGFuZU1vZGVPbiA/IEFJUlBMQU5FX01PREVfTUFTSyA6IDA7XG5cbiAgLy8gbm8gbmVlZCB0byBjaGVjayBhbnl0aGluZyBlbHNlIGlmIHdlIGFyZSBpbiBhaXJwbGFuZSBtb2RlXG4gIGlmICghYWlycGxhbmVNb2RlT24pIHtcbiAgICBsZXQgd2lmaU9uID0gYXdhaXQgdGhpcy5pc1dpZmlPbigpO1xuICAgIGNvbm5lY3Rpb24gfD0gKHdpZmlPbiA/IFdJRklfTUFTSyA6IDApO1xuICAgIGxldCBkYXRhT24gPSBhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpO1xuICAgIGNvbm5lY3Rpb24gfD0gKGRhdGFPbiA/IERBVEFfTUFTSyA6IDApO1xuICB9XG5cbiAgcmV0dXJuIGNvbm5lY3Rpb247XG59O1xuXG4vKipcbiAqIGRlY291cGxpbmcgdG8gb3ZlcnJpZGUgdGhlIGJlaGF2aW91ciBpbiBvdGhlciBkcml2ZXJzIGxpa2UgVWlBdXRvbWF0b3IyLlxuICovXG5jb21tYW5kcy5pc1dpZmlPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzV2lmaU9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzV2lmaU9uKCk7XG59O1xuXG5jb21tYW5kcy5zZXROZXR3b3JrQ29ubmVjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHNldE5ldHdvcmtDb25uZWN0aW9uICh0eXBlKSB7XG4gIHRoaXMubG9nLmluZm8oJ1NldHRpbmcgbmV0d29yayBjb25uZWN0aW9uJyk7XG4gIC8vIGRlY29kZSB0aGUgaW5wdXRcbiAgY29uc3Qgc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlID0gKHR5cGUgJiBBSVJQTEFORV9NT0RFX01BU0spICE9PSAwO1xuICBjb25zdCBzaG91bGRFbmFibGVXaWZpID0gKHR5cGUgJiBXSUZJX01BU0spICE9PSAwO1xuICBjb25zdCBzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA9ICh0eXBlICYgREFUQV9NQVNLKSAhPT0gMDtcblxuICBjb25zdCBjdXJyZW50U3RhdGUgPSBhd2FpdCB0aGlzLmdldE5ldHdvcmtDb25uZWN0aW9uKCk7XG4gIGNvbnN0IGlzQWlycGxhbmVNb2RlRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBBSVJQTEFORV9NT0RFX01BU0spICE9PSAwO1xuICBjb25zdCBpc1dpRmlFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIFdJRklfTUFTSykgIT09IDA7XG4gIGNvbnN0IGlzRGF0YUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgREFUQV9NQVNLKSAhPT0gMDtcblxuICBpZiAoc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlICE9PSBpc0FpcnBsYW5lTW9kZUVuYWJsZWQpIHtcbiAgICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFpcnBsYW5lTW9kZShzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpO1xuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgTm90IGNoYW5naW5nIGFpcnBsYW5lIG1vZGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgYCArXG4gICAgICAgICAgICAgYCR7c2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gKTtcbiAgfVxuXG4gIGlmIChzaG91bGRFbmFibGVXaWZpID09PSBpc1dpRmlFbmFibGVkICYmIHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID09PSBpc0RhdGFFbmFibGVkKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbi9XaS1GaSBzdGF0ZXMsIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgc2V0IHRvIGV4cGVjdGVkIHZhbHVlcycpO1xuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FpcnBsYW5lTW9kZU9uKCkpIHtcbiAgICAgIHJldHVybiBBSVJQTEFORV9NT0RFX01BU0sgfCBjdXJyZW50U3RhdGU7XG4gICAgfVxuICAgIHJldHVybiB+QUlSUExBTkVfTU9ERV9NQVNLICYgY3VycmVudFN0YXRlO1xuICB9XG5cbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgaWYgKHNob3VsZEVuYWJsZVdpZmkgIT09IGlzV2lGaUVuYWJsZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0V2lmaVN0YXRlKHNob3VsZEVuYWJsZVdpZmkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgV2ktRmkgc3RhdGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgYCArXG4gICAgICAgIGAke3Nob3VsZEVuYWJsZVdpZmkgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWApO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ05vdCBjaGFuZ2luZyBkYXRhIGNvbm5lY3Rpb24gc3RhdGUsIGJlY2F1c2UgYWlycGxhbmUgbW9kZSBpcyBlbmFibGVkJyk7XG4gICAgfSBlbHNlIGlmIChzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA9PT0gaXNEYXRhRW5hYmxlZCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbiBzdGF0ZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgYCR7c2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXREYXRhU3RhdGUoc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLmdldE5ldHdvcmtDb25uZWN0aW9uKCk7XG59O1xuXG4vKipcbiAqIGRlY291cGxpbmcgdG8gb3ZlcnJpZGUgYmVoYXZpb3VyIGluIG90aGVyIGRyaXZlcnMgbGlrZSBVaUF1dG9tYXRvcjIuXG4gKi9cbmNvbW1hbmRzLnNldFdpZmlTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldFdpZmlTdGF0ZSAod2lmaSkge1xuICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpU3RhdGUod2lmaSwgdGhpcy5pc0VtdWxhdG9yKCkpO1xufTtcblxuY29tbWFuZHMudG9nZ2xlRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZURhdGEgKCkge1xuICBsZXQgZGF0YSA9ICEoYXdhaXQgdGhpcy5hZGIuaXNEYXRhT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgbmV0d29yayBkYXRhICR7ZGF0YSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaUFuZERhdGEoe2RhdGF9LCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMudG9nZ2xlV2lGaSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZVdpRmkgKCkge1xuICBsZXQgd2lmaSA9ICEoYXdhaXQgdGhpcy5hZGIuaXNXaWZpT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgV2lGaSAke3dpZmkgPyAnb24nIDogJ29mZid9YCk7XG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlBbmREYXRhKHt3aWZpfSwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICB9KTtcbn07XG5cbmNvbW1hbmRzLnRvZ2dsZUZsaWdodE1vZGUgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVGbGlnaHRNb2RlICgpIHtcbiAgLypcbiAgICogVE9ETzogSW1wbGVtZW50IGlzUmVhbERldmljZSgpLiBUaGlzIG1ldGhvZCBmYWlscyBvblxuICAgKiByZWFsIGRldmljZXMsIGl0IHNob3VsZCB0aHJvdyBhIE5vdFlldEltcGxlbWVudGVkRXJyb3JcbiAgICovXG4gIGxldCBmbGlnaHRNb2RlID0gIShhd2FpdCB0aGlzLmFkYi5pc0FpcnBsYW5lTW9kZU9uKCkpO1xuICB0aGlzLmxvZy5pbmZvKGBUdXJuaW5nIGZsaWdodCBtb2RlICR7ZmxpZ2h0TW9kZSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKGZsaWdodE1vZGUpO1xuICB9KTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKGZsaWdodE1vZGUpO1xuICB9KTtcbn07XG5cbmNvbW1hbmRzLnNldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0R2VvTG9jYXRpb24gKGxvY2F0aW9uKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldEdlb0xvY2F0aW9uKGxvY2F0aW9uLCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0R2VvTG9jYXRpb24oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMubG9nLndhcm4oYENvdWxkIG5vdCBnZXQgdGhlIGN1cnJlbnQgZ2VvbG9jYXRpb24gaW5mbzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgdGhpcy5sb2cud2FybihgUmV0dXJuaW5nIHRoZSBkZWZhdWx0IHplcm8nZWQgdmFsdWVzYCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGxvbmdpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgICBhbHRpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgfTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHcHNDYWNoZVJlZnJlc2hPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dE1zIFsyMDAwMF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICogdG8gYmxvY2sgdW50aWwgR1BTIGNhY2hlIGlzIHJlZnJlc2hlZC4gUHJvdmlkaW5nIHplcm8gb3IgYSBuZWdhdGl2ZVxuICogdmFsdWUgdG8gaXQgc2tpcHMgd2FpdGluZyBjb21wbGV0ZWx5LlxuICovXG5cbi8qKlxuICogU2VuZHMgYW4gYXN5bmMgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBHUFMgY2FjaGUuXG4gKiBUaGlzIGZlYXR1cmUgb25seSB3b3JrcyBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaGFzXG4gKiBHb29nbGUgUGxheSBTZXJ2aWNlcyBpbnN0YWxsZWQuIEluIGNhc2UgdGhlIHZhbmlsbGFcbiAqIExvY2F0aW9uTWFuYWdlciBpcyB1c2VkIHRoZSBkZXZpY2UgQVBJIGxldmVsIG11c3QgYmUgYXRcbiAqIHZlcnNpb24gMzAgKEFuZHJvaWQgUikgb3IgaGlnaGVyLlxuICpcbiAqIEBwYXJhbSB7R3BzQ2FjaGVSZWZyZXNoT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVSZWZyZXNoR3BzQ2FjaGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSZWZyZXNoR3BzQ2FjaGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgdGhpcy5hZGIucmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUodGltZW91dE1zKTtcbn07XG5cbmNvbW1hbmRzLmdldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0R2VvTG9jYXRpb24gKCkge1xuICBjb25zdCB7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWx0aXR1ZGV9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0R2VvTG9jYXRpb24oKTtcbiAgcmV0dXJuIHtcbiAgICBsYXRpdHVkZTogcGFyc2VGbG9hdChsYXRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgbG9uZ2l0dWRlOiBwYXJzZUZsb2F0KGxvbmdpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgYWx0aXR1ZGU6IHBhcnNlRmxvYXQoYWx0aXR1ZGUpIHx8IEdFT19FUFNJTE9OLFxuICB9O1xufTtcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0RQQURfQ0VOVEVSXG4vLyBpbiB0aGUgYW5kcm9pZCBkb2NzLCB0aGlzIGlzIGhvdyB0aGUga2V5Y29kZXMgYXJlIGRlZmluZWRcbmNvbnN0IEtleUNvZGUgPSB7XG4gIFVQOiAxOSxcbiAgRE9XTjogMjAsXG4gIFJJR0hUOiAyMixcbiAgQ0VOVEVSOiAyM1xufTtcbmNvbW1hbmRzLnRvZ2dsZUxvY2F0aW9uU2VydmljZXMgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVMb2NhdGlvblNlcnZpY2VzICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnVG9nZ2xpbmcgbG9jYXRpb24gc2VydmljZXMnKTtcbiAgbGV0IGFwaSA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gIGlmICh0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIGxldCBwcm92aWRlcnMgPSBhd2FpdCB0aGlzLmFkYi5nZXRMb2NhdGlvblByb3ZpZGVycygpO1xuICAgIGxldCBpc0dwc0VuYWJsZWQgPSBwcm92aWRlcnMuaW5kZXhPZignZ3BzJykgIT09IC0xO1xuICAgIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIoIWlzR3BzRW5hYmxlZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFwaSA+IDE1KSB7XG4gICAgbGV0IHNlcSA9IFtLZXlDb2RlLlVQLCBLZXlDb2RlLlVQXTtcbiAgICBpZiAoYXBpID09PSAxNikge1xuICAgICAgLy8gVGhpcyB2ZXJzaW9uIG9mIEFuZHJvaWQgaGFzIGEgXCJwYXJlbnRcIiBidXR0b24gaW4gaXRzIGFjdGlvbiBiYXJcbiAgICAgIHNlcS5wdXNoKEtleUNvZGUuRE9XTik7XG4gICAgfSBlbHNlIGlmIChhcGkgPCAyOCkge1xuICAgICAgLy8gTmV3ZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCBoYXZlIHRoZSB0b2dnbGUgaW4gdGhlIEFjdGlvbiBiYXJcbiAgICAgIHNlcSA9IFtLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlVQXTtcbiAgICAgIC8qXG4gICAgICAgKiBPbmNlIHRoZSBMb2NhdGlvbiBzZXJ2aWNlcyBzd2l0Y2ggaXMgT0ZGLCBpdCB3b24ndCByZWNlaXZlIGZvY3VzXG4gICAgICAgKiB3aGVuIGdvaW5nIGJhY2sgdG8gdGhlIExvY2F0aW9uIFNlcnZpY2VzIHNldHRpbmdzIHNjcmVlbiB1bmxlc3Mgd2VcbiAgICAgICAqIHNlbmQgYSBkdW1teSBrZXlldmVudCAoVVApICpiZWZvcmUqIG9wZW5pbmcgdGhlIHNldHRpbmdzIHNjcmVlblxuICAgICAgICovXG4gICAgICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChLZXlDb2RlLlVQKTtcbiAgICB9IGVsc2UgaWYgKGFwaSA+PSAyOCkge1xuICAgICAgLy8gRXZlbiBuZXdlciB2ZXJzaW9ucyBvZiBhbmRyb2lkIGhhdmUgdGhlIHRvZ2dsZSBpbiBhIGJhciBiZWxvdyB0aGUgYWN0aW9uIGJhclxuICAgICAgLy8gdGhpcyBtZWFucyBhIHNpbmdsZSByaWdodCBjbGljayB3aWxsIGNhdXNlIGl0IHRvIGJlIHNlbGVjdGVkLlxuICAgICAgc2VxID0gW0tleUNvZGUuUklHSFRdO1xuICAgICAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoS2V5Q29kZS5VUCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudG9nZ2xlU2V0dGluZygnTE9DQVRJT05fU09VUkNFX1NFVFRJTkdTJywgc2VxKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGVyZSdzIG5vIGdsb2JhbCBsb2NhdGlvbiBzZXJ2aWNlcyB0b2dnbGUgb24gb2xkZXIgQW5kcm9pZCB2ZXJzaW9uc1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90WWV0SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG59O1xuXG5oZWxwZXJzLnRvZ2dsZVNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVTZXR0aW5nIChzZXR0aW5nLCBwcmVLZXlTZXEpIHtcbiAgLypcbiAgICogcHJlS2V5U2VxIGlzIHRoZSBrZXlldmVudCBzZXF1ZW5jZSB0byBzZW5kIG92ZXIgQURCIGluIG9yZGVyXG4gICAqIHRvIHBvc2l0aW9uIHRoZSBjdXJzb3Igb24gdGhlIHJpZ2h0IG9wdGlvbi5cbiAgICogQnkgZGVmYXVsdCBpdCdzIFt1cCwgdXAsIGRvd25dIGJlY2F1c2Ugd2UgdXN1YWxseSB0YXJnZXQgdGhlIDFzdCBpdGVtIGluXG4gICAqIHRoZSBzY3JlZW4sIGFuZCBzb21ldGltZXMgd2hlbiBvcGVuaW5nIHNldHRpbmdzIGFjdGl2aXRpZXMgdGhlIGN1cnNvciBpc1xuICAgKiBhbHJlYWR5IHBvc2l0aW9ubmVkIG9uIHRoZSAxc3QgaXRlbSwgYnV0IHdlIGNhbid0IGtub3cgZm9yIHN1cmVcbiAgICovXG4gIGlmIChfLmlzTnVsbChwcmVLZXlTZXEpKSB7XG4gICAgcHJlS2V5U2VxID0gW0tleUNvZGUuVVAsIEtleUNvZGUuVVAsIEtleUNvZGUuRE9XTl07XG4gIH1cblxuICBhd2FpdCB0aGlzLm9wZW5TZXR0aW5nc0FjdGl2aXR5KHNldHRpbmcpO1xuXG4gIGZvciAobGV0IGtleSBvZiBwcmVLZXlTZXEpIHtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KGtleSk7XG4gIH1cblxuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcblxuICAvKlxuICAgKiBDbGljayBhbmQgaGFuZGxlIHBvdGVudGlhbCBBREIgZGlzY29ubmVjdCB0aGF0IG9jY3VycyBvbiBvZmZpY2lhbFxuICAgKiBlbXVsYXRvciB3aGVuIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuZG9LZXkoS2V5Q29kZS5DRU5URVIpO1xuICB9KTtcblxuICAvKlxuICAgKiBJbiBvbmUgcGFydGljdWxhciBjYXNlIChlbmFibGUgTG9jYXRpb24gU2VydmljZXMpLCBhIHBvcC11cCBpc1xuICAgKiBkaXNwbGF5ZWQgb24gc29tZSBwbGF0Zm9ybXMgc28gdGhlIHVzZXIgYWNjZXB0cyBvciByZWZ1c2VzIHRoYXQgR29vZ2xlXG4gICAqIGNvbGxlY3RzIGxvY2F0aW9uIGRhdGEuIFNvIHdlIHdhaXQgZm9yIHRoYXQgcG9wLXVwIHRvIG9wZW4sIGlmIGl0XG4gICAqIGRvZXNuJ3QgdGhlbiBwcm9jZWVkXG4gICAqL1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG4gICAgYXdhaXQgdGhpcy5kb0tleShLZXlDb2RlLlJJR0hUKTtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KEtleUNvZGUuQ0VOVEVSKTtcbiAgICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yTm90QWN0aXZpdHkoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIDUwMDApO1xuICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgYXdhaXQgdGhpcy5hZGIuYmFjaygpO1xufTtcblxuaGVscGVycy5kb0tleSA9IGFzeW5jIGZ1bmN0aW9uIGRvS2V5IChrZXkpIHtcbiAgLy8gVE9ETzogQ29uZmlybSB3ZSBuZWVkIHRoaXMgZGVsYXkuIFNlZW1zIHRvIHdvcmsgd2l0aG91dCBpdC5cbiAgYXdhaXQgQi5kZWxheSgyMDAwKTtcbiAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoa2V5KTtcbn07XG5cbmhlbHBlcnMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QgPSBhc3luYyBmdW5jdGlvbiB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICBpZiAoIXRoaXMuYm9vdHN0cmFwKSB7XG4gICAgcmV0dXJuIGF3YWl0IHdyYXBwZWQoKTtcbiAgfVxuXG4gIHRoaXMuYm9vdHN0cmFwLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zdGFydCh0aGlzLm9wdHMuYXBwUGFja2FnZSwgdGhpcy5vcHRzLmRpc2FibGVBbmRyb2lkV2F0Y2hlcnMsIHRoaXMub3B0cy5hY2NlcHRTc2xDZXJ0cyk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gZmFsc2U7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsSUFBSUEsUUFBUSxHQUFHLEVBQWY7QUFBQSxJQUFtQkMsT0FBTyxHQUFHLEVBQTdCO0FBQUEsSUFBaUNDLFVBQVUsR0FBRyxFQUE5Qzs7O0FBRUEsTUFBTUMsa0JBQWtCLEdBQUcsS0FBM0I7QUFDQSxNQUFNQyxTQUFTLEdBQUcsS0FBbEI7QUFDQSxNQUFNQyxTQUFTLEdBQUcsS0FBbEI7QUFNQSxNQUFNQyxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsU0FBM0I7O0FBRUFSLFFBQVEsQ0FBQ1Msb0JBQVQsR0FBZ0MsZUFBZUEsb0JBQWYsR0FBdUM7RUFDckUsS0FBS0MsR0FBTCxDQUFTQyxJQUFULENBQWMsNEJBQWQ7RUFDQSxJQUFJQyxjQUFjLEdBQUcsTUFBTSxLQUFLQyxHQUFMLENBQVNDLGdCQUFULEVBQTNCO0VBQ0EsSUFBSUMsVUFBVSxHQUFHSCxjQUFjLEdBQUdULGtCQUFILEdBQXdCLENBQXZEOztFQUdBLElBQUksQ0FBQ1MsY0FBTCxFQUFxQjtJQUNuQixJQUFJSSxNQUFNLEdBQUcsTUFBTSxLQUFLQyxRQUFMLEVBQW5CO0lBQ0FGLFVBQVUsSUFBS0MsTUFBTSxHQUFHWixTQUFILEdBQWUsQ0FBcEM7SUFDQSxJQUFJYyxNQUFNLEdBQUcsTUFBTSxLQUFLTCxHQUFMLENBQVNNLFFBQVQsRUFBbkI7SUFDQUosVUFBVSxJQUFLRyxNQUFNLEdBQUdiLFNBQUgsR0FBZSxDQUFwQztFQUNEOztFQUVELE9BQU9V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
|
|
221
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiQUlSUExBTkVfTU9ERV9NQVNLIiwiV0lGSV9NQVNLIiwiREFUQV9NQVNLIiwiR0VPX0VQU0lMT04iLCJOdW1iZXIiLCJNSU5fVkFMVUUiLCJnZXROZXR3b3JrQ29ubmVjdGlvbiIsImxvZyIsImluZm8iLCJhaXJwbGFuZU1vZGVPbiIsImFkYiIsImlzQWlycGxhbmVNb2RlT24iLCJjb25uZWN0aW9uIiwid2lmaU9uIiwiaXNXaWZpT24iLCJkYXRhT24iLCJpc0RhdGFPbiIsInNldE5ldHdvcmtDb25uZWN0aW9uIiwidHlwZSIsInNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSIsInNob3VsZEVuYWJsZVdpZmkiLCJzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiIsImN1cnJlbnRTdGF0ZSIsImlzQWlycGxhbmVNb2RlRW5hYmxlZCIsImlzV2lGaUVuYWJsZWQiLCJpc0RhdGFFbmFibGVkIiwid3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QiLCJzZXRBaXJwbGFuZU1vZGUiLCJicm9hZGNhc3RBaXJwbGFuZU1vZGUiLCJzZXRXaWZpU3RhdGUiLCJzZXREYXRhU3RhdGUiLCJpc0VtdWxhdG9yIiwid2lmaSIsInRvZ2dsZURhdGEiLCJkYXRhIiwic2V0V2lmaUFuZERhdGEiLCJ0b2dnbGVXaUZpIiwidG9nZ2xlRmxpZ2h0TW9kZSIsImZsaWdodE1vZGUiLCJzZXRHZW9Mb2NhdGlvbiIsImxvY2F0aW9uIiwiZ2V0R2VvTG9jYXRpb24iLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImFsdGl0dWRlIiwibW9iaWxlUmVmcmVzaEdwc0NhY2hlIiwib3B0cyIsInRpbWVvdXRNcyIsInJlZnJlc2hHZW9Mb2NhdGlvbkNhY2hlIiwicGFyc2VGbG9hdCIsIktleUNvZGUiLCJVUCIsIkRPV04iLCJSSUdIVCIsIkNFTlRFUiIsInRvZ2dsZUxvY2F0aW9uU2VydmljZXMiLCJhcGkiLCJnZXRBcGlMZXZlbCIsInByb3ZpZGVycyIsImdldExvY2F0aW9uUHJvdmlkZXJzIiwiaXNHcHNFbmFibGVkIiwiaW5kZXhPZiIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJzZXEiLCJwdXNoIiwia2V5ZXZlbnQiLCJ0b2dnbGVTZXR0aW5nIiwiZXJyb3JzIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsInNldHRpbmciLCJwcmVLZXlTZXEiLCJfIiwiaXNOdWxsIiwib3BlblNldHRpbmdzQWN0aXZpdHkiLCJrZXkiLCJkb0tleSIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkiLCJ3YWl0Rm9yTm90QWN0aXZpdHkiLCJpZ24iLCJiYWNrIiwiQiIsImRlbGF5Iiwid3JhcHBlZCIsImJvb3RzdHJhcCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsInJlc3RhcnQiLCJzdGFydCIsImRpc2FibGVBbmRyb2lkV2F0Y2hlcnMiLCJhY2NlcHRTc2xDZXJ0cyIsIk9iamVjdCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9uZXR3b3JrLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb25zdCBBSVJQTEFORV9NT0RFX01BU0sgPSAwYjAwMTtcbmNvbnN0IFdJRklfTUFTSyA9IDBiMDEwO1xuY29uc3QgREFUQV9NQVNLID0gMGIxMDA7XG4vLyBUaGUgdmFsdWUgY2xvc2UgdG8gemVybywgYnV0IG5vdCB6ZXJvLCBpcyBuZWVkZWRcbi8vIHRvIHRyaWNrIEpTT04gZ2VuZXJhdGlvbiBhbmQgc2VuZCBhIGZsb2F0IHZhbHVlIGluc3RlYWQgb2YgYW4gaW50ZWdlcixcbi8vIFRoaXMgYWxsb3dzIHN0cmljdGx5LXR5cGVkIGNsaWVudHMsIGxpa2UgSmF2YSwgdG8gcHJvcGVybHlcbi8vIHBhcnNlIGl0LiBPdGhlcndpc2UgZmxvYXQgMC4wIGlzIGFsd2F5cyByZXByZXNlbnRlZCBhcyBpbnRlZ2VyIDAgaW4gSlMuXG4vLyBUaGUgdmFsdWUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIERCTF9FUFNJTE9OIChodHRwczovL29wZW5zb3VyY2UuYXBwbGUuY29tL3NvdXJjZS9MaWJjL0xpYmMtNDk4L2luY2x1ZGUvZmxvYXQuaClcbmNvbnN0IEdFT19FUFNJTE9OID0gTnVtYmVyLk1JTl9WQUxVRTtcblxuY29tbWFuZHMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBnZXROZXR3b3JrQ29ubmVjdGlvbiAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ0dldHRpbmcgbmV0d29yayBjb25uZWN0aW9uJyk7XG4gIGxldCBhaXJwbGFuZU1vZGVPbiA9IGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKTtcbiAgbGV0IGNvbm5lY3Rpb24gPSBhaXJwbGFuZU1vZGVPbiA/IEFJUlBMQU5FX01PREVfTUFTSyA6IDA7XG5cbiAgLy8gbm8gbmVlZCB0byBjaGVjayBhbnl0aGluZyBlbHNlIGlmIHdlIGFyZSBpbiBhaXJwbGFuZSBtb2RlXG4gIGlmICghYWlycGxhbmVNb2RlT24pIHtcbiAgICBsZXQgd2lmaU9uID0gYXdhaXQgdGhpcy5pc1dpZmlPbigpO1xuICAgIGNvbm5lY3Rpb24gfD0gKHdpZmlPbiA/IFdJRklfTUFTSyA6IDApO1xuICAgIGxldCBkYXRhT24gPSBhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpO1xuICAgIGNvbm5lY3Rpb24gfD0gKGRhdGFPbiA/IERBVEFfTUFTSyA6IDApO1xuICB9XG5cbiAgcmV0dXJuIGNvbm5lY3Rpb247XG59O1xuXG4vKipcbiAqIGRlY291cGxpbmcgdG8gb3ZlcnJpZGUgdGhlIGJlaGF2aW91ciBpbiBvdGhlciBkcml2ZXJzIGxpa2UgVWlBdXRvbWF0b3IyLlxuICovXG5jb21tYW5kcy5pc1dpZmlPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzV2lmaU9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzV2lmaU9uKCk7XG59O1xuXG5jb21tYW5kcy5zZXROZXR3b3JrQ29ubmVjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHNldE5ldHdvcmtDb25uZWN0aW9uICh0eXBlKSB7XG4gIHRoaXMubG9nLmluZm8oJ1NldHRpbmcgbmV0d29yayBjb25uZWN0aW9uJyk7XG4gIC8vIGRlY29kZSB0aGUgaW5wdXRcbiAgY29uc3Qgc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlID0gKHR5cGUgJiBBSVJQTEFORV9NT0RFX01BU0spICE9PSAwO1xuICBjb25zdCBzaG91bGRFbmFibGVXaWZpID0gKHR5cGUgJiBXSUZJX01BU0spICE9PSAwO1xuICBjb25zdCBzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA9ICh0eXBlICYgREFUQV9NQVNLKSAhPT0gMDtcblxuICBjb25zdCBjdXJyZW50U3RhdGUgPSBhd2FpdCB0aGlzLmdldE5ldHdvcmtDb25uZWN0aW9uKCk7XG4gIGNvbnN0IGlzQWlycGxhbmVNb2RlRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBBSVJQTEFORV9NT0RFX01BU0spICE9PSAwO1xuICBjb25zdCBpc1dpRmlFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIFdJRklfTUFTSykgIT09IDA7XG4gIGNvbnN0IGlzRGF0YUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgREFUQV9NQVNLKSAhPT0gMDtcblxuICBpZiAoc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlICE9PSBpc0FpcnBsYW5lTW9kZUVuYWJsZWQpIHtcbiAgICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFpcnBsYW5lTW9kZShzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpO1xuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgTm90IGNoYW5naW5nIGFpcnBsYW5lIG1vZGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgYCArXG4gICAgICAgICAgICAgYCR7c2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gKTtcbiAgfVxuXG4gIGlmIChzaG91bGRFbmFibGVXaWZpID09PSBpc1dpRmlFbmFibGVkICYmIHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID09PSBpc0RhdGFFbmFibGVkKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbi9XaS1GaSBzdGF0ZXMsIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgc2V0IHRvIGV4cGVjdGVkIHZhbHVlcycpO1xuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FpcnBsYW5lTW9kZU9uKCkpIHtcbiAgICAgIHJldHVybiBBSVJQTEFORV9NT0RFX01BU0sgfCBjdXJyZW50U3RhdGU7XG4gICAgfVxuICAgIHJldHVybiB+QUlSUExBTkVfTU9ERV9NQVNLICYgY3VycmVudFN0YXRlO1xuICB9XG5cbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgaWYgKHNob3VsZEVuYWJsZVdpZmkgIT09IGlzV2lGaUVuYWJsZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0V2lmaVN0YXRlKHNob3VsZEVuYWJsZVdpZmkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgV2ktRmkgc3RhdGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgYCArXG4gICAgICAgIGAke3Nob3VsZEVuYWJsZVdpZmkgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWApO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ05vdCBjaGFuZ2luZyBkYXRhIGNvbm5lY3Rpb24gc3RhdGUsIGJlY2F1c2UgYWlycGxhbmUgbW9kZSBpcyBlbmFibGVkJyk7XG4gICAgfSBlbHNlIGlmIChzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA9PT0gaXNEYXRhRW5hYmxlZCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbiBzdGF0ZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgYCR7c2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXREYXRhU3RhdGUoc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLmdldE5ldHdvcmtDb25uZWN0aW9uKCk7XG59O1xuXG4vKipcbiAqIGRlY291cGxpbmcgdG8gb3ZlcnJpZGUgYmVoYXZpb3VyIGluIG90aGVyIGRyaXZlcnMgbGlrZSBVaUF1dG9tYXRvcjIuXG4gKi9cbmNvbW1hbmRzLnNldFdpZmlTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldFdpZmlTdGF0ZSAod2lmaSkge1xuICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpU3RhdGUod2lmaSwgdGhpcy5pc0VtdWxhdG9yKCkpO1xufTtcblxuY29tbWFuZHMudG9nZ2xlRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZURhdGEgKCkge1xuICBsZXQgZGF0YSA9ICEoYXdhaXQgdGhpcy5hZGIuaXNEYXRhT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgbmV0d29yayBkYXRhICR7ZGF0YSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaUFuZERhdGEoe2RhdGF9LCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMudG9nZ2xlV2lGaSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZVdpRmkgKCkge1xuICBsZXQgd2lmaSA9ICEoYXdhaXQgdGhpcy5hZGIuaXNXaWZpT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgV2lGaSAke3dpZmkgPyAnb24nIDogJ29mZid9YCk7XG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlBbmREYXRhKHt3aWZpfSwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICB9KTtcbn07XG5cbmNvbW1hbmRzLnRvZ2dsZUZsaWdodE1vZGUgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVGbGlnaHRNb2RlICgpIHtcbiAgLypcbiAgICogVE9ETzogSW1wbGVtZW50IGlzUmVhbERldmljZSgpLiBUaGlzIG1ldGhvZCBmYWlscyBvblxuICAgKiByZWFsIGRldmljZXMsIGl0IHNob3VsZCB0aHJvdyBhIE5vdFlldEltcGxlbWVudGVkRXJyb3JcbiAgICovXG4gIGxldCBmbGlnaHRNb2RlID0gIShhd2FpdCB0aGlzLmFkYi5pc0FpcnBsYW5lTW9kZU9uKCkpO1xuICB0aGlzLmxvZy5pbmZvKGBUdXJuaW5nIGZsaWdodCBtb2RlICR7ZmxpZ2h0TW9kZSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKGZsaWdodE1vZGUpO1xuICB9KTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKGZsaWdodE1vZGUpO1xuICB9KTtcbn07XG5cbmNvbW1hbmRzLnNldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0R2VvTG9jYXRpb24gKGxvY2F0aW9uKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldEdlb0xvY2F0aW9uKGxvY2F0aW9uLCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0R2VvTG9jYXRpb24oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMubG9nLndhcm4oYENvdWxkIG5vdCBnZXQgdGhlIGN1cnJlbnQgZ2VvbG9jYXRpb24gaW5mbzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgdGhpcy5sb2cud2FybihgUmV0dXJuaW5nIHRoZSBkZWZhdWx0IHplcm8nZWQgdmFsdWVzYCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGxvbmdpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgICBhbHRpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgfTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHcHNDYWNoZVJlZnJlc2hPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dE1zIFsyMDAwMF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICogdG8gYmxvY2sgdW50aWwgR1BTIGNhY2hlIGlzIHJlZnJlc2hlZC4gUHJvdmlkaW5nIHplcm8gb3IgYSBuZWdhdGl2ZVxuICogdmFsdWUgdG8gaXQgc2tpcHMgd2FpdGluZyBjb21wbGV0ZWx5LlxuICovXG5cbi8qKlxuICogU2VuZHMgYW4gYXN5bmMgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBHUFMgY2FjaGUuXG4gKiBUaGlzIGZlYXR1cmUgb25seSB3b3JrcyBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaGFzXG4gKiBHb29nbGUgUGxheSBTZXJ2aWNlcyBpbnN0YWxsZWQuIEluIGNhc2UgdGhlIHZhbmlsbGFcbiAqIExvY2F0aW9uTWFuYWdlciBpcyB1c2VkIHRoZSBkZXZpY2UgQVBJIGxldmVsIG11c3QgYmUgYXRcbiAqIHZlcnNpb24gMzAgKEFuZHJvaWQgUikgb3IgaGlnaGVyLlxuICpcbiAqIEBwYXJhbSB7R3BzQ2FjaGVSZWZyZXNoT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVSZWZyZXNoR3BzQ2FjaGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSZWZyZXNoR3BzQ2FjaGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgdGhpcy5hZGIucmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUodGltZW91dE1zKTtcbn07XG5cbmNvbW1hbmRzLmdldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0R2VvTG9jYXRpb24gKCkge1xuICBjb25zdCB7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWx0aXR1ZGV9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0R2VvTG9jYXRpb24oKTtcbiAgcmV0dXJuIHtcbiAgICBsYXRpdHVkZTogcGFyc2VGbG9hdChsYXRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgbG9uZ2l0dWRlOiBwYXJzZUZsb2F0KGxvbmdpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgYWx0aXR1ZGU6IHBhcnNlRmxvYXQoYWx0aXR1ZGUpIHx8IEdFT19FUFNJTE9OLFxuICB9O1xufTtcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0RQQURfQ0VOVEVSXG4vLyBpbiB0aGUgYW5kcm9pZCBkb2NzLCB0aGlzIGlzIGhvdyB0aGUga2V5Y29kZXMgYXJlIGRlZmluZWRcbmNvbnN0IEtleUNvZGUgPSB7XG4gIFVQOiAxOSxcbiAgRE9XTjogMjAsXG4gIFJJR0hUOiAyMixcbiAgQ0VOVEVSOiAyM1xufTtcbmNvbW1hbmRzLnRvZ2dsZUxvY2F0aW9uU2VydmljZXMgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVMb2NhdGlvblNlcnZpY2VzICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnVG9nZ2xpbmcgbG9jYXRpb24gc2VydmljZXMnKTtcbiAgbGV0IGFwaSA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gIGlmICh0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIGxldCBwcm92aWRlcnMgPSBhd2FpdCB0aGlzLmFkYi5nZXRMb2NhdGlvblByb3ZpZGVycygpO1xuICAgIGxldCBpc0dwc0VuYWJsZWQgPSBwcm92aWRlcnMuaW5kZXhPZignZ3BzJykgIT09IC0xO1xuICAgIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIoIWlzR3BzRW5hYmxlZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFwaSA+IDE1KSB7XG4gICAgbGV0IHNlcSA9IFtLZXlDb2RlLlVQLCBLZXlDb2RlLlVQXTtcbiAgICBpZiAoYXBpID09PSAxNikge1xuICAgICAgLy8gVGhpcyB2ZXJzaW9uIG9mIEFuZHJvaWQgaGFzIGEgXCJwYXJlbnRcIiBidXR0b24gaW4gaXRzIGFjdGlvbiBiYXJcbiAgICAgIHNlcS5wdXNoKEtleUNvZGUuRE9XTik7XG4gICAgfSBlbHNlIGlmIChhcGkgPCAyOCkge1xuICAgICAgLy8gTmV3ZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCBoYXZlIHRoZSB0b2dnbGUgaW4gdGhlIEFjdGlvbiBiYXJcbiAgICAgIHNlcSA9IFtLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlVQXTtcbiAgICAgIC8qXG4gICAgICAgKiBPbmNlIHRoZSBMb2NhdGlvbiBzZXJ2aWNlcyBzd2l0Y2ggaXMgT0ZGLCBpdCB3b24ndCByZWNlaXZlIGZvY3VzXG4gICAgICAgKiB3aGVuIGdvaW5nIGJhY2sgdG8gdGhlIExvY2F0aW9uIFNlcnZpY2VzIHNldHRpbmdzIHNjcmVlbiB1bmxlc3Mgd2VcbiAgICAgICAqIHNlbmQgYSBkdW1teSBrZXlldmVudCAoVVApICpiZWZvcmUqIG9wZW5pbmcgdGhlIHNldHRpbmdzIHNjcmVlblxuICAgICAgICovXG4gICAgICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChLZXlDb2RlLlVQKTtcbiAgICB9IGVsc2UgaWYgKGFwaSA+PSAyOCkge1xuICAgICAgLy8gRXZlbiBuZXdlciB2ZXJzaW9ucyBvZiBhbmRyb2lkIGhhdmUgdGhlIHRvZ2dsZSBpbiBhIGJhciBiZWxvdyB0aGUgYWN0aW9uIGJhclxuICAgICAgLy8gdGhpcyBtZWFucyBhIHNpbmdsZSByaWdodCBjbGljayB3aWxsIGNhdXNlIGl0IHRvIGJlIHNlbGVjdGVkLlxuICAgICAgc2VxID0gW0tleUNvZGUuUklHSFRdO1xuICAgICAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoS2V5Q29kZS5VUCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudG9nZ2xlU2V0dGluZygnTE9DQVRJT05fU09VUkNFX1NFVFRJTkdTJywgc2VxKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGVyZSdzIG5vIGdsb2JhbCBsb2NhdGlvbiBzZXJ2aWNlcyB0b2dnbGUgb24gb2xkZXIgQW5kcm9pZCB2ZXJzaW9uc1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90WWV0SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG59O1xuXG5oZWxwZXJzLnRvZ2dsZVNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVTZXR0aW5nIChzZXR0aW5nLCBwcmVLZXlTZXEpIHtcbiAgLypcbiAgICogcHJlS2V5U2VxIGlzIHRoZSBrZXlldmVudCBzZXF1ZW5jZSB0byBzZW5kIG92ZXIgQURCIGluIG9yZGVyXG4gICAqIHRvIHBvc2l0aW9uIHRoZSBjdXJzb3Igb24gdGhlIHJpZ2h0IG9wdGlvbi5cbiAgICogQnkgZGVmYXVsdCBpdCdzIFt1cCwgdXAsIGRvd25dIGJlY2F1c2Ugd2UgdXN1YWxseSB0YXJnZXQgdGhlIDFzdCBpdGVtIGluXG4gICAqIHRoZSBzY3JlZW4sIGFuZCBzb21ldGltZXMgd2hlbiBvcGVuaW5nIHNldHRpbmdzIGFjdGl2aXRpZXMgdGhlIGN1cnNvciBpc1xuICAgKiBhbHJlYWR5IHBvc2l0aW9ubmVkIG9uIHRoZSAxc3QgaXRlbSwgYnV0IHdlIGNhbid0IGtub3cgZm9yIHN1cmVcbiAgICovXG4gIGlmIChfLmlzTnVsbChwcmVLZXlTZXEpKSB7XG4gICAgcHJlS2V5U2VxID0gW0tleUNvZGUuVVAsIEtleUNvZGUuVVAsIEtleUNvZGUuRE9XTl07XG4gIH1cblxuICBhd2FpdCB0aGlzLm9wZW5TZXR0aW5nc0FjdGl2aXR5KHNldHRpbmcpO1xuXG4gIGZvciAobGV0IGtleSBvZiBwcmVLZXlTZXEpIHtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KGtleSk7XG4gIH1cblxuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcblxuICAvKlxuICAgKiBDbGljayBhbmQgaGFuZGxlIHBvdGVudGlhbCBBREIgZGlzY29ubmVjdCB0aGF0IG9jY3VycyBvbiBvZmZpY2lhbFxuICAgKiBlbXVsYXRvciB3aGVuIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuZG9LZXkoS2V5Q29kZS5DRU5URVIpO1xuICB9KTtcblxuICAvKlxuICAgKiBJbiBvbmUgcGFydGljdWxhciBjYXNlIChlbmFibGUgTG9jYXRpb24gU2VydmljZXMpLCBhIHBvcC11cCBpc1xuICAgKiBkaXNwbGF5ZWQgb24gc29tZSBwbGF0Zm9ybXMgc28gdGhlIHVzZXIgYWNjZXB0cyBvciByZWZ1c2VzIHRoYXQgR29vZ2xlXG4gICAqIGNvbGxlY3RzIGxvY2F0aW9uIGRhdGEuIFNvIHdlIHdhaXQgZm9yIHRoYXQgcG9wLXVwIHRvIG9wZW4sIGlmIGl0XG4gICAqIGRvZXNuJ3QgdGhlbiBwcm9jZWVkXG4gICAqL1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG4gICAgYXdhaXQgdGhpcy5kb0tleShLZXlDb2RlLlJJR0hUKTtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KEtleUNvZGUuQ0VOVEVSKTtcbiAgICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yTm90QWN0aXZpdHkoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIDUwMDApO1xuICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgYXdhaXQgdGhpcy5hZGIuYmFjaygpO1xufTtcblxuaGVscGVycy5kb0tleSA9IGFzeW5jIGZ1bmN0aW9uIGRvS2V5IChrZXkpIHtcbiAgLy8gVE9ETzogQ29uZmlybSB3ZSBuZWVkIHRoaXMgZGVsYXkuIFNlZW1zIHRvIHdvcmsgd2l0aG91dCBpdC5cbiAgYXdhaXQgQi5kZWxheSgyMDAwKTtcbiAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoa2V5KTtcbn07XG5cbmhlbHBlcnMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QgPSBhc3luYyBmdW5jdGlvbiB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICBpZiAoIXRoaXMuYm9vdHN0cmFwKSB7XG4gICAgcmV0dXJuIGF3YWl0IHdyYXBwZWQoKTtcbiAgfVxuXG4gIHRoaXMuYm9vdHN0cmFwLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zdGFydCh0aGlzLm9wdHMuYXBwUGFja2FnZSwgdGhpcy5vcHRzLmRpc2FibGVBbmRyb2lkV2F0Y2hlcnMsIHRoaXMub3B0cy5hY2NlcHRTc2xDZXJ0cyk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gZmFsc2U7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUEsSUFBSUEsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFBQztBQUFBO0FBRWpELE1BQU1DLGtCQUFrQixHQUFHLEtBQUs7QUFDaEMsTUFBTUMsU0FBUyxHQUFHLEtBQUs7QUFDdkIsTUFBTUMsU0FBUyxHQUFHLEtBQUs7QUFNdkIsTUFBTUMsV0FBVyxHQUFHQyxNQUFNLENBQUNDLFNBQVM7QUFFcENSLFFBQVEsQ0FBQ1Msb0JBQW9CLEdBQUcsZUFBZUEsb0JBQW9CLEdBQUk7RUFDckUsSUFBSSxDQUFDQyxHQUFHLENBQUNDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztFQUMzQyxJQUFJQyxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsZ0JBQWdCLEVBQUU7RUFDdEQsSUFBSUMsVUFBVSxHQUFHSCxjQUFjLEdBQUdULGtCQUFrQixHQUFHLENBQUM7O0VBR3hELElBQUksQ0FBQ1MsY0FBYyxFQUFFO0lBQ25CLElBQUlJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQ0MsUUFBUSxFQUFFO0lBQ2xDRixVQUFVLElBQUtDLE1BQU0sR0FBR1osU0FBUyxHQUFHLENBQUU7SUFDdEMsSUFBSWMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDTCxHQUFHLENBQUNNLFFBQVEsRUFBRTtJQUN0Q0osVUFBVSxJQUFLRyxNQUFNLEdBQUdiLFNB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","names":["commands","helpers","extensions","AIRPLANE_MODE_MASK","WIFI_MASK","DATA_MASK","GEO_EPSILON","Number","MIN_VALUE","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","currentState","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","setAirplaneMode","broadcastAirplaneMode","setWifiState","setDataState","isEmulator","wifi","toggleData","data","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","opts","timeoutMs","refreshGeoLocationCache","parseFloat","KeyCode","UP","DOWN","RIGHT","CENTER","toggleLocationServices","api","getApiLevel","providers","getLocationProviders","isGpsEnabled","indexOf","toggleGPSLocationProvider","seq","push","keyevent","toggleSetting","errors","NotYetImplementedError","setting","preKeySeq","_","isNull","openSettingsActivity","key","doKey","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","ign","back","B","delay","wrapped","bootstrap","ignoreUnexpectedShutdown","restart","start","disableAndroidWatchers","acceptSslCerts","Object","assign"],"sources":["../../../lib/commands/network.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport B from 'bluebird';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst AIRPLANE_MODE_MASK = 0b001;\nconst WIFI_MASK = 0b010;\nconst DATA_MASK = 0b100;\n// The value close to zero, but not zero, is needed\n// to trick JSON generation and send a float value instead of an integer,\n// This allows strictly-typed clients, like Java, to properly\n// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.\n// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)\nconst GEO_EPSILON = Number.MIN_VALUE;\n\ncommands.getNetworkConnection = async function getNetworkConnection () {\n this.log.info('Getting network connection');\n let airplaneModeOn = await this.adb.isAirplaneModeOn();\n let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;\n\n // no need to check anything else if we are in airplane mode\n if (!airplaneModeOn) {\n let wifiOn = await this.isWifiOn();\n connection |= (wifiOn ? WIFI_MASK : 0);\n let dataOn = await this.adb.isDataOn();\n connection |= (dataOn ? DATA_MASK : 0);\n }\n\n return connection;\n};\n\n/**\n * decoupling to override the behaviour in other drivers like UiAutomator2.\n */\ncommands.isWifiOn = async function isWifiOn () {\n return await this.adb.isWifiOn();\n};\n\ncommands.setNetworkConnection = async function setNetworkConnection (type) {\n this.log.info('Setting network connection');\n // decode the input\n const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;\n const shouldEnableWifi = (type & WIFI_MASK) !== 0;\n const shouldEnableDataConnection = (type & DATA_MASK) !== 0;\n\n const currentState = await this.getNetworkConnection();\n const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;\n const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;\n const isDataEnabled = (currentState & DATA_MASK) !== 0;\n\n if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(shouldEnableAirplaneMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n });\n } else {\n this.log.info(`Not changing airplane mode, since it is already ` +\n `${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {\n this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');\n if (await this.adb.isAirplaneModeOn()) {\n return AIRPLANE_MODE_MASK | currentState;\n }\n return ~AIRPLANE_MODE_MASK & currentState;\n }\n\n await this.wrapBootstrapDisconnect(async () => {\n if (shouldEnableWifi !== isWiFiEnabled) {\n await this.setWifiState(shouldEnableWifi);\n } else {\n this.log.info(`Not changing Wi-Fi state, since it is already ` +\n `${shouldEnableWifi ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableAirplaneMode) {\n this.log.info('Not changing data connection state, because airplane mode is enabled');\n } else if (shouldEnableDataConnection === isDataEnabled) {\n this.log.info(`Not changing data connection state, since it is already ` +\n `${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);\n } else {\n await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());\n }\n });\n\n return await this.getNetworkConnection();\n};\n\n/**\n * decoupling to override behaviour in other drivers like UiAutomator2.\n */\ncommands.setWifiState = async function setWifiState (wifi) {\n await this.adb.setWifiState(wifi, this.isEmulator());\n};\n\ncommands.toggleData = async function toggleData () {\n let data = !(await this.adb.isDataOn());\n this.log.info(`Turning network data ${data ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({data}, this.isEmulator());\n });\n};\n\ncommands.toggleWiFi = async function toggleWiFi () {\n let wifi = !(await this.adb.isWifiOn());\n this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({wifi}, this.isEmulator());\n });\n};\n\ncommands.toggleFlightMode = async function toggleFlightMode () {\n /*\n * TODO: Implement isRealDevice(). This method fails on\n * real devices, it should throw a NotYetImplementedError\n */\n let flightMode = !(await this.adb.isAirplaneModeOn());\n this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(flightMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.broadcastAirplaneMode(flightMode);\n });\n};\n\ncommands.setGeoLocation = async function setGeoLocation (location) {\n await this.adb.setGeoLocation(location, this.isEmulator());\n try {\n return await this.getGeoLocation();\n } catch (e) {\n this.log.warn(`Could not get the current geolocation info: ${e.message}`);\n this.log.warn(`Returning the default zero'ed values`);\n return {\n latitude: GEO_EPSILON,\n longitude: GEO_EPSILON,\n altitude: GEO_EPSILON,\n };\n }\n};\n\n/**\n * @typedef {Object} GpsCacheRefreshOptions\n * @property {number} timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n */\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param {GpsCacheRefreshOptions} opts\n */\ncommands.mobileRefreshGpsCache = async function mobileRefreshGpsCache (opts = {}) {\n const { timeoutMs } = opts;\n await this.adb.refreshGeoLocationCache(timeoutMs);\n};\n\ncommands.getGeoLocation = async function getGeoLocation () {\n const {latitude, longitude, altitude} = await this.adb.getGeoLocation();\n return {\n latitude: parseFloat(latitude) || GEO_EPSILON,\n longitude: parseFloat(longitude) || GEO_EPSILON,\n altitude: parseFloat(altitude) || GEO_EPSILON,\n };\n};\n// https://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_CENTER\n// in the android docs, this is how the keycodes are defined\nconst KeyCode = {\n UP: 19,\n DOWN: 20,\n RIGHT: 22,\n CENTER: 23\n};\ncommands.toggleLocationServices = async function toggleLocationServices () {\n this.log.info('Toggling location services');\n let api = await this.adb.getApiLevel();\n if (this.isEmulator()) {\n let providers = await this.adb.getLocationProviders();\n let isGpsEnabled = providers.indexOf('gps') !== -1;\n await this.adb.toggleGPSLocationProvider(!isGpsEnabled);\n return;\n }\n\n if (api > 15) {\n let seq = [KeyCode.UP, KeyCode.UP];\n if (api === 16) {\n // This version of Android has a \"parent\" button in its action bar\n seq.push(KeyCode.DOWN);\n } else if (api < 28) {\n // Newer versions of Android have the toggle in the Action bar\n seq = [KeyCode.RIGHT, KeyCode.RIGHT, KeyCode.UP];\n /*\n * Once the Location services switch is OFF, it won't receive focus\n * when going back to the Location Services settings screen unless we\n * send a dummy keyevent (UP) *before* opening the settings screen\n */\n await this.adb.keyevent(KeyCode.UP);\n } else if (api >= 28) {\n // Even newer versions of android have the toggle in a bar below the action bar\n // this means a single right click will cause it to be selected.\n seq = [KeyCode.RIGHT];\n await this.adb.keyevent(KeyCode.UP);\n }\n await this.toggleSetting('LOCATION_SOURCE_SETTINGS', seq);\n } else {\n // There's no global location services toggle on older Android versions\n throw new errors.NotYetImplementedError();\n }\n};\n\nhelpers.toggleSetting = async function toggleSetting (setting, preKeySeq) {\n /*\n * preKeySeq is the keyevent sequence to send over ADB in order\n * to position the cursor on the right option.\n * By default it's [up, up, down] because we usually target the 1st item in\n * the screen, and sometimes when opening settings activities the cursor is\n * already positionned on the 1st item, but we can't know for sure\n */\n if (_.isNull(preKeySeq)) {\n preKeySeq = [KeyCode.UP, KeyCode.UP, KeyCode.DOWN];\n }\n\n await this.openSettingsActivity(setting);\n\n for (let key of preKeySeq) {\n await this.doKey(key);\n }\n\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n\n /*\n * Click and handle potential ADB disconnect that occurs on official\n * emulator when the network connection is disabled\n */\n await this.wrapBootstrapDisconnect(async () => {\n await this.doKey(KeyCode.CENTER);\n });\n\n /*\n * In one particular case (enable Location Services), a pop-up is\n * displayed on some platforms so the user accepts or refuses that Google\n * collects location data. So we wait for that pop-up to open, if it\n * doesn't then proceed\n */\n try {\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n await this.doKey(KeyCode.RIGHT);\n await this.doKey(KeyCode.CENTER);\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n } catch (ign) {}\n\n await this.adb.back();\n};\n\nhelpers.doKey = async function doKey (key) {\n // TODO: Confirm we need this delay. Seems to work without it.\n await B.delay(2000);\n await this.adb.keyevent(key);\n};\n\nhelpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect (wrapped) {\n if (!this.bootstrap) {\n return await wrapped();\n }\n\n this.bootstrap.ignoreUnexpectedShutdown = true;\n try {\n await wrapped();\n await this.adb.restart();\n await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);\n } finally {\n this.bootstrap.ignoreUnexpectedShutdown = false;\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"network.js","names":["commands","helpers","extensions","AIRPLANE_MODE_MASK","WIFI_MASK","DATA_MASK","GEO_EPSILON","Number","MIN_VALUE","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","currentState","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","setAirplaneMode","broadcastAirplaneMode","setWifiState","setDataState","isEmulator","wifi","toggleData","data","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","opts","timeoutMs","refreshGeoLocationCache","parseFloat","KeyCode","UP","DOWN","RIGHT","CENTER","toggleLocationServices","api","getApiLevel","providers","getLocationProviders","isGpsEnabled","indexOf","toggleGPSLocationProvider","seq","push","keyevent","toggleSetting","errors","NotYetImplementedError","setting","preKeySeq","_","isNull","openSettingsActivity","key","doKey","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","ign","back","B","delay","wrapped","bootstrap","ignoreUnexpectedShutdown","restart","start","disableAndroidWatchers","acceptSslCerts","Object","assign"],"sources":["../../../lib/commands/network.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport B from 'bluebird';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst AIRPLANE_MODE_MASK = 0b001;\nconst WIFI_MASK = 0b010;\nconst DATA_MASK = 0b100;\n// The value close to zero, but not zero, is needed\n// to trick JSON generation and send a float value instead of an integer,\n// This allows strictly-typed clients, like Java, to properly\n// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.\n// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)\nconst GEO_EPSILON = Number.MIN_VALUE;\n\ncommands.getNetworkConnection = async function getNetworkConnection () {\n this.log.info('Getting network connection');\n let airplaneModeOn = await this.adb.isAirplaneModeOn();\n let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;\n\n // no need to check anything else if we are in airplane mode\n if (!airplaneModeOn) {\n let wifiOn = await this.isWifiOn();\n connection |= (wifiOn ? WIFI_MASK : 0);\n let dataOn = await this.adb.isDataOn();\n connection |= (dataOn ? DATA_MASK : 0);\n }\n\n return connection;\n};\n\n/**\n * decoupling to override the behaviour in other drivers like UiAutomator2.\n */\ncommands.isWifiOn = async function isWifiOn () {\n return await this.adb.isWifiOn();\n};\n\ncommands.setNetworkConnection = async function setNetworkConnection (type) {\n this.log.info('Setting network connection');\n // decode the input\n const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;\n const shouldEnableWifi = (type & WIFI_MASK) !== 0;\n const shouldEnableDataConnection = (type & DATA_MASK) !== 0;\n\n const currentState = await this.getNetworkConnection();\n const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;\n const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;\n const isDataEnabled = (currentState & DATA_MASK) !== 0;\n\n if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(shouldEnableAirplaneMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n });\n } else {\n this.log.info(`Not changing airplane mode, since it is already ` +\n `${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {\n this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');\n if (await this.adb.isAirplaneModeOn()) {\n return AIRPLANE_MODE_MASK | currentState;\n }\n return ~AIRPLANE_MODE_MASK & currentState;\n }\n\n await this.wrapBootstrapDisconnect(async () => {\n if (shouldEnableWifi !== isWiFiEnabled) {\n await this.setWifiState(shouldEnableWifi);\n } else {\n this.log.info(`Not changing Wi-Fi state, since it is already ` +\n `${shouldEnableWifi ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableAirplaneMode) {\n this.log.info('Not changing data connection state, because airplane mode is enabled');\n } else if (shouldEnableDataConnection === isDataEnabled) {\n this.log.info(`Not changing data connection state, since it is already ` +\n `${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);\n } else {\n await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());\n }\n });\n\n return await this.getNetworkConnection();\n};\n\n/**\n * decoupling to override behaviour in other drivers like UiAutomator2.\n */\ncommands.setWifiState = async function setWifiState (wifi) {\n await this.adb.setWifiState(wifi, this.isEmulator());\n};\n\ncommands.toggleData = async function toggleData () {\n let data = !(await this.adb.isDataOn());\n this.log.info(`Turning network data ${data ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({data}, this.isEmulator());\n });\n};\n\ncommands.toggleWiFi = async function toggleWiFi () {\n let wifi = !(await this.adb.isWifiOn());\n this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({wifi}, this.isEmulator());\n });\n};\n\ncommands.toggleFlightMode = async function toggleFlightMode () {\n /*\n * TODO: Implement isRealDevice(). This method fails on\n * real devices, it should throw a NotYetImplementedError\n */\n let flightMode = !(await this.adb.isAirplaneModeOn());\n this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(flightMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.broadcastAirplaneMode(flightMode);\n });\n};\n\ncommands.setGeoLocation = async function setGeoLocation (location) {\n await this.adb.setGeoLocation(location, this.isEmulator());\n try {\n return await this.getGeoLocation();\n } catch (e) {\n this.log.warn(`Could not get the current geolocation info: ${e.message}`);\n this.log.warn(`Returning the default zero'ed values`);\n return {\n latitude: GEO_EPSILON,\n longitude: GEO_EPSILON,\n altitude: GEO_EPSILON,\n };\n }\n};\n\n/**\n * @typedef {Object} GpsCacheRefreshOptions\n * @property {number} timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n */\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param {GpsCacheRefreshOptions} opts\n */\ncommands.mobileRefreshGpsCache = async function mobileRefreshGpsCache (opts = {}) {\n const { timeoutMs } = opts;\n await this.adb.refreshGeoLocationCache(timeoutMs);\n};\n\ncommands.getGeoLocation = async function getGeoLocation () {\n const {latitude, longitude, altitude} = await this.adb.getGeoLocation();\n return {\n latitude: parseFloat(latitude) || GEO_EPSILON,\n longitude: parseFloat(longitude) || GEO_EPSILON,\n altitude: parseFloat(altitude) || GEO_EPSILON,\n };\n};\n// https://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_CENTER\n// in the android docs, this is how the keycodes are defined\nconst KeyCode = {\n UP: 19,\n DOWN: 20,\n RIGHT: 22,\n CENTER: 23\n};\ncommands.toggleLocationServices = async function toggleLocationServices () {\n this.log.info('Toggling location services');\n let api = await this.adb.getApiLevel();\n if (this.isEmulator()) {\n let providers = await this.adb.getLocationProviders();\n let isGpsEnabled = providers.indexOf('gps') !== -1;\n await this.adb.toggleGPSLocationProvider(!isGpsEnabled);\n return;\n }\n\n if (api > 15) {\n let seq = [KeyCode.UP, KeyCode.UP];\n if (api === 16) {\n // This version of Android has a \"parent\" button in its action bar\n seq.push(KeyCode.DOWN);\n } else if (api < 28) {\n // Newer versions of Android have the toggle in the Action bar\n seq = [KeyCode.RIGHT, KeyCode.RIGHT, KeyCode.UP];\n /*\n * Once the Location services switch is OFF, it won't receive focus\n * when going back to the Location Services settings screen unless we\n * send a dummy keyevent (UP) *before* opening the settings screen\n */\n await this.adb.keyevent(KeyCode.UP);\n } else if (api >= 28) {\n // Even newer versions of android have the toggle in a bar below the action bar\n // this means a single right click will cause it to be selected.\n seq = [KeyCode.RIGHT];\n await this.adb.keyevent(KeyCode.UP);\n }\n await this.toggleSetting('LOCATION_SOURCE_SETTINGS', seq);\n } else {\n // There's no global location services toggle on older Android versions\n throw new errors.NotYetImplementedError();\n }\n};\n\nhelpers.toggleSetting = async function toggleSetting (setting, preKeySeq) {\n /*\n * preKeySeq is the keyevent sequence to send over ADB in order\n * to position the cursor on the right option.\n * By default it's [up, up, down] because we usually target the 1st item in\n * the screen, and sometimes when opening settings activities the cursor is\n * already positionned on the 1st item, but we can't know for sure\n */\n if (_.isNull(preKeySeq)) {\n preKeySeq = [KeyCode.UP, KeyCode.UP, KeyCode.DOWN];\n }\n\n await this.openSettingsActivity(setting);\n\n for (let key of preKeySeq) {\n await this.doKey(key);\n }\n\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n\n /*\n * Click and handle potential ADB disconnect that occurs on official\n * emulator when the network connection is disabled\n */\n await this.wrapBootstrapDisconnect(async () => {\n await this.doKey(KeyCode.CENTER);\n });\n\n /*\n * In one particular case (enable Location Services), a pop-up is\n * displayed on some platforms so the user accepts or refuses that Google\n * collects location data. So we wait for that pop-up to open, if it\n * doesn't then proceed\n */\n try {\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n await this.doKey(KeyCode.RIGHT);\n await this.doKey(KeyCode.CENTER);\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n } catch (ign) {}\n\n await this.adb.back();\n};\n\nhelpers.doKey = async function doKey (key) {\n // TODO: Confirm we need this delay. Seems to work without it.\n await B.delay(2000);\n await this.adb.keyevent(key);\n};\n\nhelpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect (wrapped) {\n if (!this.bootstrap) {\n return await wrapped();\n }\n\n this.bootstrap.ignoreUnexpectedShutdown = true;\n try {\n await wrapped();\n await this.adb.restart();\n await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);\n } finally {\n this.bootstrap.ignoreUnexpectedShutdown = false;\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|