appium-android-driver 5.10.3 → 5.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [5.11.0](https://github.com/appium/appium-android-driver/compare/v5.10.4...v5.11.0) (2023-04-28)
2
+
3
+
4
+ ### Features
5
+
6
+ * Add mobile wrapper for emulator helper functions ([#805](https://github.com/appium/appium-android-driver/issues/805)) ([59197f9](https://github.com/appium/appium-android-driver/commit/59197f93e3b46e756a379159e97735f103613a8f))
7
+
8
+ ## [5.10.4](https://github.com/appium/appium-android-driver/compare/v5.10.3...v5.10.4) (2023-04-20)
9
+
10
+
11
+ ### Miscellaneous Chores
12
+
13
+ * Use values from session capabilities if none are passed to mobile: unlock ([#804](https://github.com/appium/appium-android-driver/issues/804)) ([16180c9](https://github.com/appium/appium-android-driver/commit/16180c9ed1d971fdf97f119af49bb8c1ad192b8f))
14
+
1
15
  ## [5.10.3](https://github.com/appium/appium-android-driver/compare/v5.10.2...v5.10.3) (2023-04-20)
2
16
 
3
17
 
@@ -12,6 +12,7 @@ var _path = _interopRequireDefault(require("path"));
12
12
  var _bluebird = _interopRequireDefault(require("bluebird"));
13
13
  var _jimp = _interopRequireDefault(require("jimp"));
14
14
  var _teen_process = require("teen_process");
15
+ var _utils = require("../utils");
15
16
  const swipeStepsPerSec = 28;
16
17
  const dragStepsPerSec = 40;
17
18
  let commands = {},
@@ -165,48 +166,98 @@ commands.fingerprint = async function fingerprint(fingerprintId) {
165
166
  }
166
167
  await this.adb.fingerprint(fingerprintId);
167
168
  };
169
+ commands.mobileFingerprint = async function mobileFingerprint(opts = {}) {
170
+ const {
171
+ fingerprintId
172
+ } = (0, _utils.requireArgs)('fingerprintId', opts);
173
+ await this.fingerprint(fingerprintId);
174
+ };
168
175
  commands.sendSMS = async function sendSMS(phoneNumber, message) {
169
176
  if (!this.isEmulator()) {
170
177
  this.log.errorAndThrow('sendSMS method is only available for emulators');
171
178
  }
172
179
  await this.adb.sendSMS(phoneNumber, message);
173
180
  };
181
+ commands.mobileSendSms = async function mobileSendSms(opts = {}) {
182
+ const {
183
+ phoneNumber,
184
+ message
185
+ } = (0, _utils.requireArgs)(['phoneNumber', 'message'], opts);
186
+ await this.sendSMS(phoneNumber, message);
187
+ };
174
188
  commands.gsmCall = async function gsmCall(phoneNumber, action) {
175
189
  if (!this.isEmulator()) {
176
190
  this.log.errorAndThrow('gsmCall method is only available for emulators');
177
191
  }
178
192
  await this.adb.gsmCall(phoneNumber, action);
179
193
  };
194
+ commands.mobileGsmCall = async function mobileGsmCall(opts = {}) {
195
+ const {
196
+ phoneNumber,
197
+ action
198
+ } = (0, _utils.requireArgs)(['phoneNumber', 'action'], opts);
199
+ await this.gsmCall(phoneNumber, action);
200
+ };
180
201
  commands.gsmSignal = async function gsmSignal(signalStrengh) {
181
202
  if (!this.isEmulator()) {
182
203
  this.log.errorAndThrow('gsmSignal method is only available for emulators');
183
204
  }
184
205
  await this.adb.gsmSignal(signalStrengh);
185
206
  };
207
+ commands.mobileGsmSignal = async function mobileGsmSignal(opts = {}) {
208
+ const {
209
+ strength
210
+ } = (0, _utils.requireArgs)('strength', opts);
211
+ await this.gsmSignal(strength);
212
+ };
186
213
  commands.gsmVoice = async function gsmVoice(state) {
187
214
  if (!this.isEmulator()) {
188
215
  this.log.errorAndThrow('gsmVoice method is only available for emulators');
189
216
  }
190
217
  await this.adb.gsmVoice(state);
191
218
  };
219
+ commands.mobileGsmVoice = async function mobileGsmVoice(opts = {}) {
220
+ const {
221
+ state
222
+ } = (0, _utils.requireArgs)('state', opts);
223
+ await this.gsmVoice(state);
224
+ };
192
225
  commands.powerAC = async function powerAC(state) {
193
226
  if (!this.isEmulator()) {
194
227
  this.log.errorAndThrow('powerAC method is only available for emulators');
195
228
  }
196
229
  await this.adb.powerAC(state);
197
230
  };
231
+ commands.mobilePowerAc = async function mobilePowerAc(opts = {}) {
232
+ const {
233
+ state
234
+ } = (0, _utils.requireArgs)('state', opts);
235
+ await this.powerAC(state);
236
+ };
198
237
  commands.powerCapacity = async function powerCapacity(batteryPercent) {
199
238
  if (!this.isEmulator()) {
200
239
  this.log.errorAndThrow('powerCapacity method is only available for emulators');
201
240
  }
202
241
  await this.adb.powerCapacity(batteryPercent);
203
242
  };
243
+ commands.mobilePowerCapacity = async function mobilePowerCapacity(opts = {}) {
244
+ const {
245
+ percent
246
+ } = (0, _utils.requireArgs)('percent', opts);
247
+ await this.powerCapacity(percent);
248
+ };
204
249
  commands.networkSpeed = async function networkSpeed(networkSpeed) {
205
250
  if (!this.isEmulator()) {
206
251
  this.log.errorAndThrow('networkSpeed method is only available for emulators');
207
252
  }
208
253
  await this.adb.networkSpeed(networkSpeed);
209
254
  };
255
+ commands.mobileNetworkSpeed = async function mobileNetworkSpeed(opts = {}) {
256
+ const {
257
+ speed
258
+ } = (0, _utils.requireArgs)('speed', opts);
259
+ await this.networkSpeed(speed);
260
+ };
210
261
  commands.sensorSet = async function sensorSet(sensor = {}) {
211
262
  const {
212
263
  sensorType,
@@ -299,4 +350,4 @@ commands.getScreenshot = async function getScreenshot() {
299
350
  Object.assign(extensions, commands, helpers);
300
351
  var _default = extensions;
301
352
  exports.default = _default;
302
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYW5kcm9pZEhlbHBlcnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zdXBwb3J0IiwiX3BhdGgiLCJfYmx1ZWJpcmQiLCJfamltcCIsIl90ZWVuX3Byb2Nlc3MiLCJzd2lwZVN0ZXBzUGVyU2VjIiwiZHJhZ1N0ZXBzUGVyU2VjIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJ3YXJuIiwicHJlc3NLZXlDb2RlIiwiYm9vdHN0cmFwIiwic2VuZEFjdGlvbiIsImxvbmdQcmVzc0tleUNvZGUiLCJnZXRPcmllbnRhdGlvbiIsInBhcmFtcyIsIm5hdHVyYWxPcmllbnRhdGlvbiIsIm9wdHMiLCJhbmRyb2lkTmF0dXJhbE9yaWVudGF0aW9uIiwib3JpZW50YXRpb24iLCJ0b1VwcGVyQ2FzZSIsInNldE9yaWVudGF0aW9uIiwiZmFrZUZsaWNrIiwieFNwZWVkIiwieVNwZWVkIiwiZmFrZUZsaWNrRWxlbWVudCIsImVsZW1lbnRJZCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwic3BlZWQiLCJzd2lwZSIsInN0YXJ0WCIsInN0YXJ0WSIsImVuZFgiLCJlbmRZIiwiZHVyYXRpb24iLCJ0b3VjaENvdW50IiwiZWxJZCIsInN3aXBlT3B0cyIsInN0ZXBzIiwiTWF0aCIsInJvdW5kIiwidXRpbCIsImhhc1ZhbHVlIiwiZG9Td2lwZSIsInBpbmNoQ2xvc2UiLCJwZXJjZW50IiwicGluY2hPcHRzIiwiZGlyZWN0aW9uIiwicGluY2hPcGVuIiwiZmxpY2siLCJlbGVtZW50IiwieE9mZnNldCIsInlPZmZzZXQiLCJkcmFnIiwiZGVzdEVsSWQiLCJkcmFnT3B0cyIsImRvRHJhZyIsImxvY2siLCJzZWNvbmRzIiwiYWRiIiwiaXNOYU4iLCJmbG9hdFNlY29uZHMiLCJwYXJzZUZsb2F0IiwiQiIsImRlbGF5IiwidW5sb2NrIiwiaXNMb2NrZWQiLCJpc1NjcmVlbkxvY2tlZCIsImFuZHJvaWRIZWxwZXJzIiwiY2FwcyIsIm9wZW5Ob3RpZmljYXRpb25zIiwic2V0TG9jYXRpb24iLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsInNlbmRUZWxuZXRDb21tYW5kIiwiZmluZ2VycHJpbnQiLCJmaW5nZXJwcmludElkIiwiaXNFbXVsYXRvciIsImVycm9yQW5kVGhyb3ciLCJzZW5kU01TIiwicGhvbmVOdW1iZXIiLCJtZXNzYWdlIiwiZ3NtQ2FsbCIsImFjdGlvbiIsImdzbVNpZ25hbCIsInNpZ25hbFN0cmVuZ2giLCJnc21Wb2ljZSIsInN0YXRlIiwicG93ZXJBQyIsInBvd2VyQ2FwYWNpdHkiLCJiYXR0ZXJ5UGVyY2VudCIsIm5ldHdvcmtTcGVlZCIsInNlbnNvclNldCIsInNlbnNvciIsInNlbnNvclR5cGUiLCJ2YWx1ZSIsImdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsIiwibG9jYWxGaWxlIiwidGVtcERpciIsInBhdGgiLCJwcmVmaXgiLCJzdWZmaXgiLCJmcyIsImV4aXN0cyIsInVubGluayIsInBuZ0RpciIsImFuZHJvaWRTY3JlZW5zaG90UGF0aCIsInBuZyIsInBvc2l4IiwicmVzb2x2ZSIsImNtZCIsInNoZWxsIiwiZmlsZVNpemUiLCJFcnJvciIsInB1bGwiLCJqaW1wIiwicmVhZCIsImdldFNjcmVlbnNob3REYXRhV2l0aEFkYkV4ZWNPdXQiLCJzdGRvdXQiLCJzdGRlcnIiLCJjb2RlIiwiZXhlYyIsImV4ZWN1dGFibGUiLCJkZWZhdWx0QXJncyIsImNvbmNhdCIsImVuY29kaW5nIiwiaXNCdWZmZXIiLCJsZW5ndGgiLCJ0b1N0cmluZyIsImdldFNjcmVlbnNob3QiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiaW1hZ2UiLCJlIiwiaW5mbyIsImVyciIsInNjcmVlbk9yaWVudGF0aW9uIiwiZ2V0U2NyZWVuT3JpZW50YXRpb24iLCJyb3RhdGUiLCJnZXRCdWZmZXIiLCJwcm9taXNpZnkiLCJjb250ZXh0IiwiaW1nQnVmZmVyIiwiTUlNRV9QTkciLCJPYmplY3QiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYW5kcm9pZEhlbHBlcnMgZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IGZzLCB1dGlsLCB0ZW1wRGlyfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgamltcCBmcm9tICdqaW1wJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuXG5jb25zdCBzd2lwZVN0ZXBzUGVyU2VjID0gMjg7XG5jb25zdCBkcmFnU3RlcHNQZXJTZWMgPSA0MDtcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb21tYW5kcy5rZXlldmVudCA9IGFzeW5jIGZ1bmN0aW9uIGtleWV2ZW50IChrZXljb2RlLCBtZXRhc3RhdGUgPSBudWxsKSB7XG4gIC8vIFRPRE8gZGVwcmVjYXRlIGtleWV2ZW50OyBjdXJyZW50bHkgd2Qgb25seSBpbXBsZW1lbnRzIGtleWV2ZW50XG4gIHRoaXMubG9nLndhcm4oJ2tleWV2ZW50IHdpbGwgYmUgZGVwcmVjYXRlZCB1c2UgcHJlc3NLZXlDb2RlJyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnByZXNzS2V5Q29kZShrZXljb2RlLCBtZXRhc3RhdGUpO1xufTtcblxuY29tbWFuZHMucHJlc3NLZXlDb2RlID0gYXN5bmMgZnVuY3Rpb24gcHJlc3NLZXlDb2RlIChrZXljb2RlLCBtZXRhc3RhdGUgPSBudWxsKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdwcmVzc0tleUNvZGUnLCB7a2V5Y29kZSwgbWV0YXN0YXRlfSk7XG59O1xuXG5jb21tYW5kcy5sb25nUHJlc3NLZXlDb2RlID0gYXN5bmMgZnVuY3Rpb24gbG9uZ1ByZXNzS2V5Q29kZSAoa2V5Y29kZSwgbWV0YXN0YXRlID0gbnVsbCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignbG9uZ1ByZXNzS2V5Q29kZScsIHtrZXljb2RlLCBtZXRhc3RhdGV9KTtcbn07XG5cbmNvbW1hbmRzLmdldE9yaWVudGF0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0T3JpZW50YXRpb24gKCkge1xuICBsZXQgcGFyYW1zID0ge1xuICAgIG5hdHVyYWxPcmllbnRhdGlvbjogISF0aGlzLm9wdHMuYW5kcm9pZE5hdHVyYWxPcmllbnRhdGlvbixcbiAgfTtcbiAgbGV0IG9yaWVudGF0aW9uID0gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignb3JpZW50YXRpb24nLCBwYXJhbXMpO1xuICByZXR1cm4gb3JpZW50YXRpb24udG9VcHBlckNhc2UoKTtcbn07XG5cbmNvbW1hbmRzLnNldE9yaWVudGF0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0T3JpZW50YXRpb24gKG9yaWVudGF0aW9uKSB7XG4gIG9yaWVudGF0aW9uID0gb3JpZW50YXRpb24udG9VcHBlckNhc2UoKTtcbiAgbGV0IHBhcmFtcyA9IHtcbiAgICBvcmllbnRhdGlvbixcbiAgICBuYXR1cmFsT3JpZW50YXRpb246ICEhdGhpcy5vcHRzLmFuZHJvaWROYXR1cmFsT3JpZW50YXRpb24sXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdvcmllbnRhdGlvbicsIHBhcmFtcyk7XG59O1xuXG5jb21tYW5kcy5mYWtlRmxpY2sgPSBhc3luYyBmdW5jdGlvbiBmYWtlRmxpY2sgKHhTcGVlZCwgeVNwZWVkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdmbGljaycsIHt4U3BlZWQsIHlTcGVlZH0pO1xufTtcblxuY29tbWFuZHMuZmFrZUZsaWNrRWxlbWVudCA9IGFzeW5jIGZ1bmN0aW9uIGZha2VGbGlja0VsZW1lbnQgKGVsZW1lbnRJZCwgeG9mZnNldCwgeW9mZnNldCwgc3BlZWQpIHtcbiAgbGV0IHBhcmFtcyA9IHt4b2Zmc2V0LCB5b2Zmc2V0LCBzcGVlZCwgZWxlbWVudElkfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6ZmxpY2snLCBwYXJhbXMpO1xufTtcblxuY29tbWFuZHMuc3dpcGUgPSBhc3luYyBmdW5jdGlvbiBzd2lwZSAoc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCB0b3VjaENvdW50LCBlbElkKSB7XG4gIGlmIChzdGFydFggPT09ICdudWxsJykge1xuICAgIHN0YXJ0WCA9IDAuNTtcbiAgfVxuICBpZiAoc3RhcnRZID09PSAnbnVsbCcpIHtcbiAgICBzdGFydFkgPSAwLjU7XG4gIH1cbiAgbGV0IHN3aXBlT3B0cyA9IHtzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSxcbiAgICAgICAgICAgICAgICAgICBzdGVwczogTWF0aC5yb3VuZChkdXJhdGlvbiAqIHN3aXBlU3RlcHNQZXJTZWMpfTtcbiAgLy8gZ29pbmcgdGhlIGxvbmcgd2F5IGFuZCBjaGVja2luZyBmb3IgdW5kZWZpbmVkIGFuZCBudWxsIHNpbmNlXG4gIC8vIHdlIGNhbid0IGJlIGFzc3VyZWQgYGVsSWRgIGlzIGEgc3RyaW5nIGFuZCBub3QgYW4gaW50XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGVsSWQpKSB7XG4gICAgc3dpcGVPcHRzLmVsZW1lbnRJZCA9IGVsSWQ7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZG9Td2lwZShzd2lwZU9wdHMpO1xufTtcblxuY29tbWFuZHMuZG9Td2lwZSA9IGFzeW5jIGZ1bmN0aW9uIGRvU3dpcGUgKHN3aXBlT3B0cykge1xuICBpZiAodXRpbC5oYXNWYWx1ZShzd2lwZU9wdHMuZWxlbWVudElkKSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnN3aXBlJywgc3dpcGVPcHRzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc3dpcGUnLCBzd2lwZU9wdHMpO1xuICB9XG59O1xuXG5jb21tYW5kcy5waW5jaENsb3NlID0gYXN5bmMgZnVuY3Rpb24gcGluY2hDbG9zZSAoc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCBwZXJjZW50LCBzdGVwcywgZWxJZCkge1xuICBsZXQgcGluY2hPcHRzID0ge1xuICAgIGRpcmVjdGlvbjogJ2luJyxcbiAgICBlbGVtZW50SWQ6IGVsSWQsXG4gICAgcGVyY2VudCxcbiAgICBzdGVwc1xuICB9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpwaW5jaCcsIHBpbmNoT3B0cyk7XG59O1xuXG5jb21tYW5kcy5waW5jaE9wZW4gPSBhc3luYyBmdW5jdGlvbiBwaW5jaE9wZW4gKHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBkdXJhdGlvbiwgcGVyY2VudCwgc3RlcHMsIGVsSWQpIHtcbiAgbGV0IHBpbmNoT3B0cyA9IHtkaXJlY3Rpb246ICdvdXQnLCBlbGVtZW50SWQ6IGVsSWQsIHBlcmNlbnQsIHN0ZXBzfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6cGluY2gnLCBwaW5jaE9wdHMpO1xufTtcblxuY29tbWFuZHMuZmxpY2sgPSBhc3luYyBmdW5jdGlvbiBmbGljayAoZWxlbWVudCwgeFNwZWVkLCB5U3BlZWQsIHhPZmZzZXQsIHlPZmZzZXQsIHNwZWVkKSB7XG4gIGlmIChlbGVtZW50KSB7XG4gICAgYXdhaXQgdGhpcy5mYWtlRmxpY2tFbGVtZW50KGVsZW1lbnQsIHhPZmZzZXQsIHlPZmZzZXQsIHNwZWVkKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCB0aGlzLmZha2VGbGljayh4U3BlZWQsIHlTcGVlZCk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmRyYWcgPSBhc3luYyBmdW5jdGlvbiBkcmFnIChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIHRvdWNoQ291bnQsIGVsZW1lbnRJZCwgZGVzdEVsSWQpIHtcbiAgbGV0IGRyYWdPcHRzID0ge1xuICAgIGVsZW1lbnRJZCwgZGVzdEVsSWQsIHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLFxuICAgIHN0ZXBzOiBNYXRoLnJvdW5kKGR1cmF0aW9uICogZHJhZ1N0ZXBzUGVyU2VjKVxuICB9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5kb0RyYWcoZHJhZ09wdHMpO1xuXG59O1xuXG5jb21tYW5kcy5kb0RyYWcgPSBhc3luYyBmdW5jdGlvbiBkb0RyYWcgKGRyYWdPcHRzKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGRyYWdPcHRzLmVsZW1lbnRJZCkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpkcmFnJywgZHJhZ09wdHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdkcmFnJywgZHJhZ09wdHMpO1xuICB9XG59O1xuXG5jb21tYW5kcy5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbG9jayAoc2Vjb25kcykge1xuICBhd2FpdCB0aGlzLmFkYi5sb2NrKCk7XG4gIGlmIChpc05hTihzZWNvbmRzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZsb2F0U2Vjb25kcyA9IHBhcnNlRmxvYXQoc2Vjb25kcyk7XG4gIGlmIChmbG9hdFNlY29uZHMgPD0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBCLmRlbGF5KDEwMDAgKiBmbG9hdFNlY29uZHMpO1xuICBhd2FpdCB0aGlzLnVubG9jaygpO1xufTtcblxuY29tbWFuZHMuaXNMb2NrZWQgPSBhc3luYyBmdW5jdGlvbiBpc0xvY2tlZCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5pc1NjcmVlbkxvY2tlZCgpO1xufTtcblxuY29tbWFuZHMudW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gdW5sb2NrICgpIHtcbiAgcmV0dXJuIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwgdGhpcy5jYXBzKTtcbn07XG5cbmNvbW1hbmRzLm9wZW5Ob3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gb3Blbk5vdGlmaWNhdGlvbnMgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignb3Blbk5vdGlmaWNhdGlvbicpO1xufTtcblxuY29tbWFuZHMuc2V0TG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBzZXRMb2NhdGlvbiAobGF0aXR1ZGUsIGxvbmdpdHVkZSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc2VuZFRlbG5ldENvbW1hbmQoYGdlbyBmaXggJHtsb25naXR1ZGV9ICR7bGF0aXR1ZGV9YCk7XG59O1xuXG5jb21tYW5kcy5maW5nZXJwcmludCA9IGFzeW5jIGZ1bmN0aW9uIGZpbmdlcnByaW50IChmaW5nZXJwcmludElkKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdmaW5nZXJwcmludCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmZpbmdlcnByaW50KGZpbmdlcnByaW50SWQpO1xufTtcblxuY29tbWFuZHMuc2VuZFNNUyA9IGFzeW5jIGZ1bmN0aW9uIHNlbmRTTVMgKHBob25lTnVtYmVyLCBtZXNzYWdlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdzZW5kU01TIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuc2VuZFNNUyhwaG9uZU51bWJlciwgbWVzc2FnZSk7XG59O1xuXG5jb21tYW5kcy5nc21DYWxsID0gYXN5bmMgZnVuY3Rpb24gZ3NtQ2FsbCAocGhvbmVOdW1iZXIsIGFjdGlvbikge1xuICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnZ3NtQ2FsbCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbUNhbGwocGhvbmVOdW1iZXIsIGFjdGlvbik7XG59O1xuXG5jb21tYW5kcy5nc21TaWduYWwgPSBhc3luYyBmdW5jdGlvbiBnc21TaWduYWwgKHNpZ25hbFN0cmVuZ2gpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2dzbVNpZ25hbCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVNpZ25hbChzaWduYWxTdHJlbmdoKTtcbn07XG5cbmNvbW1hbmRzLmdzbVZvaWNlID0gYXN5bmMgZnVuY3Rpb24gZ3NtVm9pY2UgKHN0YXRlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdnc21Wb2ljZSBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVZvaWNlKHN0YXRlKTtcbn07XG5cbmNvbW1hbmRzLnBvd2VyQUMgPSBhc3luYyBmdW5jdGlvbiBwb3dlckFDIChzdGF0ZSkge1xuICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygncG93ZXJBQyBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLnBvd2VyQUMoc3RhdGUpO1xufTtcblxuY29tbWFuZHMucG93ZXJDYXBhY2l0eSA9IGFzeW5jIGZ1bmN0aW9uIHBvd2VyQ2FwYWNpdHkgKGJhdHRlcnlQZXJjZW50KSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdwb3dlckNhcGFjaXR5IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIucG93ZXJDYXBhY2l0eShiYXR0ZXJ5UGVyY2VudCk7XG59O1xuXG5jb21tYW5kcy5uZXR3b3JrU3BlZWQgPSBhc3luYyBmdW5jdGlvbiBuZXR3b3JrU3BlZWQgKG5ldHdvcmtTcGVlZCkge1xuICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnbmV0d29ya1NwZWVkIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIubmV0d29ya1NwZWVkKG5ldHdvcmtTcGVlZCk7XG59O1xuXG4vKipcbiAqIEVtdWxhdGUgc2Vuc29ycyB2YWx1ZXMgb24gdGhlIGNvbm5lY3RlZCBlbXVsYXRvci5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTZW5zb3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZW5zb3JUeXBlIC0gc2Vuc29yIHR5cGUgZGVjbGFyZWQgaW4gYWRiLlNFTlNPUlNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2YWx1ZSAtIHZhbHVlIHRvIHNldCB0byB0aGUgc2Vuc29yXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFNlbnNvclxuICogQHRocm93cyB7RXJyb3J9IC0gSWYgc2Vuc29yVHlwZSBpcyBub3QgZGVmaW5lZFxuICogQHRocm93cyB7RXJyb3J9IC0gSWYgdmFsdWUgZm9yIHRoZSBzZSBzb3IgaXMgbm90IGRlZmluZWRcbiAqIEB0aHJvd3Mge0Vycm9yfSAtIElmIGRldmljZVR5cGUgaXMgbm90IGFuIGVtdWxhdG9yXG4gKi9cbmNvbW1hbmRzLnNlbnNvclNldCA9IGFzeW5jIGZ1bmN0aW9uIHNlbnNvclNldCAoc2Vuc29yID0ge30pIHtcbiAgY29uc3Qge3NlbnNvclR5cGUsIHZhbHVlfSA9IHNlbnNvcjtcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKHNlbnNvclR5cGUpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgJ3NlbnNvclR5cGUnIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKHZhbHVlKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYCd2YWx1ZScgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnc2Vuc29yU2V0IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuc2Vuc29yU2V0KHNlbnNvclR5cGUsIHZhbHVlKTtcbn07XG5cbmhlbHBlcnMuZ2V0U2NyZWVuc2hvdERhdGFXaXRoQWRiU2hlbGwgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJTaGVsbCAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IGxvY2FsRmlsZSA9IGF3YWl0IHRlbXBEaXIucGF0aCh7cHJlZml4OiAnYXBwaXVtJywgc3VmZml4OiAnLnBuZyd9KTtcbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhsb2NhbEZpbGUpKSB7XG4gICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBwbmdEaXIgPSBvcHRzLmFuZHJvaWRTY3JlZW5zaG90UGF0aCB8fCAnL2RhdGEvbG9jYWwvdG1wLyc7XG4gICAgY29uc3QgcG5nID0gcGF0aC5wb3NpeC5yZXNvbHZlKHBuZ0RpciwgJ3NjcmVlbnNob3QucG5nJyk7XG4gICAgY29uc3QgY21kID0gWycvc3lzdGVtL2Jpbi9ybScsIGAke3BuZ307YCwgJy9zeXN0ZW0vYmluL3NjcmVlbmNhcCcsICctcCcsIHBuZ107XG4gICAgYXdhaXQgYWRiLnNoZWxsKGNtZCk7XG4gICAgaWYgKCFhd2FpdCBhZGIuZmlsZVNpemUocG5nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc2l6ZSBvZiB0aGUgdGFrZW4gc2NyZWVuc2hvdCBlcXVhbHMgdG8gemVyby4nKTtcbiAgICB9XG4gICAgYXdhaXQgYWRiLnB1bGwocG5nLCBsb2NhbEZpbGUpO1xuICAgIHJldHVybiBhd2FpdCBqaW1wLnJlYWQobG9jYWxGaWxlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsRmlsZSkpIHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhsb2NhbEZpbGUpO1xuICAgIH1cbiAgfVxufTtcblxuaGVscGVycy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuc2hvdERhdGFXaXRoQWRiRXhlY091dCAoYWRiKSB7XG4gIGxldCB7c3Rkb3V0LCBzdGRlcnIsIGNvZGV9ID0gYXdhaXQgZXhlYyhhZGIuZXhlY3V0YWJsZS5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChbJ2V4ZWMtb3V0JywgJy9zeXN0ZW0vYmluL3NjcmVlbmNhcCcsICctcCddKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlbmNvZGluZzogJ2JpbmFyeScsIGlzQnVmZmVyOiB0cnVlfSk7XG4gIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB0aHJvd1xuICBpZiAoY29kZSB8fCBzdGRlcnIubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTY3JlZW5zaG90IHJldHVybmVkIGVycm9yLCBjb2RlOiAnJHtjb2RlfScsIHN0ZGVycjogJyR7c3RkZXJyLnRvU3RyaW5nKCl9J2ApO1xuICB9XG4gIC8vIGlmIHdlIGRvbid0IGdldCBhbnl0aGluZyBhdCBhbGwsIHRocm93XG4gIGlmICghc3Rkb3V0Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2NyZWVuc2hvdCByZXR1cm5lZCBubyBkYXRhJyk7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgamltcC5yZWFkKHN0ZG91dCk7XG59O1xuXG5jb21tYW5kcy5nZXRTY3JlZW5zaG90ID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuc2hvdCAoKSB7XG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgbGV0IGltYWdlID0gbnVsbDtcbiAgaWYgKGFwaUxldmVsID4gMjApIHtcbiAgICB0cnkge1xuICAgICAgLy8gVGhpcyBzY3JlZW5zaG90aW5nIGFwcHJvYWNoIGlzIHdheSBmYXN0ZXIsIHNpbmNlIGl0IHJlcXVpcmVzIGxlc3MgZXh0ZXJuYWwgY29tbWFuZHNcbiAgICAgIC8vIHRvIGJlIGV4ZWN1dGVkLiBVbmZvcnR1bmF0ZWx5LCBleGVjLW91dCBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgYnkgbmV3ZXIgQW5kcm9pZC9TREsgdmVyc2lvbnMgKDUuMCBhbmQgbGF0ZXIpXG4gICAgICBpbWFnZSA9IGF3YWl0IHRoaXMuZ2V0U2NyZWVuc2hvdERhdGFXaXRoQWRiRXhlY091dCh0aGlzLmFkYik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgQ2Fubm90IGdldCBzY3JlZW5zaG90IGRhdGEgd2l0aCAnYWRiIGV4ZWMtb3V0JyBiZWNhdXNlIG9mICcke2UubWVzc2FnZX0nLiBgICtcbiAgICAgICAgYERlZmF1bHRpbmcgdG8gJ2FkYiBzaGVsbCcgY2FsbGApO1xuICAgIH1cbiAgfVxuICBpZiAoIWltYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGltYWdlID0gYXdhaXQgdGhpcy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJTaGVsbCh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBlcnIgPSBgQ2Fubm90IGdldCBzY3JlZW5zaG90IGRhdGEgYmVjYXVzZSBvZiAnJHtlLm1lc3NhZ2V9Jy4gYCArXG4gICAgICAgIGBNYWtlIHN1cmUgdGhlICdMYXlvdXRQYXJhbXMuRkxBR19TRUNVUkUnIGlzIG5vdCBzZXQgZm9yIGAgK1xuICAgICAgICBgdGhlIGN1cnJlbnQgdmlld2A7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGVycik7XG4gICAgfVxuICB9XG4gIGlmIChhcGlMZXZlbCA8IDIzKSB7XG4gICAgLy8gQW5kcm9pZCBidWcgODQzMzc0MiAtIHJvdGF0ZSBzY3JlZW5zaG90IGlmIHNjcmVlbiBpcyByb3RhdGVkXG4gICAgbGV0IHNjcmVlbk9yaWVudGF0aW9uID0gYXdhaXQgdGhpcy5hZGIuZ2V0U2NyZWVuT3JpZW50YXRpb24oKTtcbiAgICB0cnkge1xuICAgICAgaW1hZ2UgPSBhd2FpdCBpbWFnZS5yb3RhdGUoLTkwICogc2NyZWVuT3JpZW50YXRpb24pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybihgQ291bGQgbm90IHJvdGF0ZSBzY3JlZW5zaG90IGR1ZSB0byBlcnJvcjogJHtlcnJ9YCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGdldEJ1ZmZlciA9IEIucHJvbWlzaWZ5KGltYWdlLmdldEJ1ZmZlciwge2NvbnRleHQ6IGltYWdlfSk7XG4gIGNvbnN0IGltZ0J1ZmZlciA9IGF3YWl0IGdldEJ1ZmZlcihqaW1wLk1JTUVfUE5HKTtcbiAgcmV0dXJuIGltZ0J1ZmZlci50b1N0cmluZygnYmFzZTY0Jyk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07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
353
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYW5kcm9pZEhlbHBlcnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zdXBwb3J0IiwiX3BhdGgiLCJfYmx1ZWJpcmQiLCJfamltcCIsIl90ZWVuX3Byb2Nlc3MiLCJfdXRpbHMiLCJzd2lwZVN0ZXBzUGVyU2VjIiwiZHJhZ1N0ZXBzUGVyU2VjIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJ3YXJuIiwicHJlc3NLZXlDb2RlIiwiYm9vdHN0cmFwIiwic2VuZEFjdGlvbiIsImxvbmdQcmVzc0tleUNvZGUiLCJnZXRPcmllbnRhdGlvbiIsInBhcmFtcyIsIm5hdHVyYWxPcmllbnRhdGlvbiIsIm9wdHMiLCJhbmRyb2lkTmF0dXJhbE9yaWVudGF0aW9uIiwib3JpZW50YXRpb24iLCJ0b1VwcGVyQ2FzZSIsInNldE9yaWVudGF0aW9uIiwiZmFrZUZsaWNrIiwieFNwZWVkIiwieVNwZWVkIiwiZmFrZUZsaWNrRWxlbWVudCIsImVsZW1lbnRJZCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwic3BlZWQiLCJzd2lwZSIsInN0YXJ0WCIsInN0YXJ0WSIsImVuZFgiLCJlbmRZIiwiZHVyYXRpb24iLCJ0b3VjaENvdW50IiwiZWxJZCIsInN3aXBlT3B0cyIsInN0ZXBzIiwiTWF0aCIsInJvdW5kIiwidXRpbCIsImhhc1ZhbHVlIiwiZG9Td2lwZSIsInBpbmNoQ2xvc2UiLCJwZXJjZW50IiwicGluY2hPcHRzIiwiZGlyZWN0aW9uIiwicGluY2hPcGVuIiwiZmxpY2siLCJlbGVtZW50IiwieE9mZnNldCIsInlPZmZzZXQiLCJkcmFnIiwiZGVzdEVsSWQiLCJkcmFnT3B0cyIsImRvRHJhZyIsImxvY2siLCJzZWNvbmRzIiwiYWRiIiwiaXNOYU4iLCJmbG9hdFNlY29uZHMiLCJwYXJzZUZsb2F0IiwiQiIsImRlbGF5IiwidW5sb2NrIiwiaXNMb2NrZWQiLCJpc1NjcmVlbkxvY2tlZCIsImFuZHJvaWRIZWxwZXJzIiwiY2FwcyIsIm9wZW5Ob3RpZmljYXRpb25zIiwic2V0TG9jYXRpb24iLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsInNlbmRUZWxuZXRDb21tYW5kIiwiZmluZ2VycHJpbnQiLCJmaW5nZXJwcmludElkIiwiaXNFbXVsYXRvciIsImVycm9yQW5kVGhyb3ciLCJtb2JpbGVGaW5nZXJwcmludCIsInJlcXVpcmVBcmdzIiwic2VuZFNNUyIsInBob25lTnVtYmVyIiwibWVzc2FnZSIsIm1vYmlsZVNlbmRTbXMiLCJnc21DYWxsIiwiYWN0aW9uIiwibW9iaWxlR3NtQ2FsbCIsImdzbVNpZ25hbCIsInNpZ25hbFN0cmVuZ2giLCJtb2JpbGVHc21TaWduYWwiLCJzdHJlbmd0aCIsImdzbVZvaWNlIiwic3RhdGUiLCJtb2JpbGVHc21Wb2ljZSIsInBvd2VyQUMiLCJtb2JpbGVQb3dlckFjIiwicG93ZXJDYXBhY2l0eSIsImJhdHRlcnlQZXJjZW50IiwibW9iaWxlUG93ZXJDYXBhY2l0eSIsIm5ldHdvcmtTcGVlZCIsIm1vYmlsZU5ldHdvcmtTcGVlZCIsInNlbnNvclNldCIsInNlbnNvciIsInNlbnNvclR5cGUiLCJ2YWx1ZSIsImdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsIiwibG9jYWxGaWxlIiwidGVtcERpciIsInBhdGgiLCJwcmVmaXgiLCJzdWZmaXgiLCJmcyIsImV4aXN0cyIsInVubGluayIsInBuZ0RpciIsImFuZHJvaWRTY3JlZW5zaG90UGF0aCIsInBuZyIsInBvc2l4IiwicmVzb2x2ZSIsImNtZCIsInNoZWxsIiwiZmlsZVNpemUiLCJFcnJvciIsInB1bGwiLCJqaW1wIiwicmVhZCIsImdldFNjcmVlbnNob3REYXRhV2l0aEFkYkV4ZWNPdXQiLCJzdGRvdXQiLCJzdGRlcnIiLCJjb2RlIiwiZXhlYyIsImV4ZWN1dGFibGUiLCJkZWZhdWx0QXJncyIsImNvbmNhdCIsImVuY29kaW5nIiwiaXNCdWZmZXIiLCJsZW5ndGgiLCJ0b1N0cmluZyIsImdldFNjcmVlbnNob3QiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiaW1hZ2UiLCJlIiwiaW5mbyIsImVyciIsInNjcmVlbk9yaWVudGF0aW9uIiwiZ2V0U2NyZWVuT3JpZW50YXRpb24iLCJyb3RhdGUiLCJnZXRCdWZmZXIiLCJwcm9taXNpZnkiLCJjb250ZXh0IiwiaW1nQnVmZmVyIiwiTUlNRV9QTkciLCJPYmplY3QiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYW5kcm9pZEhlbHBlcnMgZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IGZzLCB1dGlsLCB0ZW1wRGlyfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgamltcCBmcm9tICdqaW1wJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcmVxdWlyZUFyZ3MgfSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IHN3aXBlU3RlcHNQZXJTZWMgPSAyODtcbmNvbnN0IGRyYWdTdGVwc1BlclNlYyA9IDQwO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbW1hbmRzLmtleWV2ZW50ID0gYXN5bmMgZnVuY3Rpb24ga2V5ZXZlbnQgKGtleWNvZGUsIG1ldGFzdGF0ZSA9IG51bGwpIHtcbiAgLy8gVE9ETyBkZXByZWNhdGUga2V5ZXZlbnQ7IGN1cnJlbnRseSB3ZCBvbmx5IGltcGxlbWVudHMga2V5ZXZlbnRcbiAgdGhpcy5sb2cud2Fybigna2V5ZXZlbnQgd2lsbCBiZSBkZXByZWNhdGVkIHVzZSBwcmVzc0tleUNvZGUnKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJlc3NLZXlDb2RlKGtleWNvZGUsIG1ldGFzdGF0ZSk7XG59O1xuXG5jb21tYW5kcy5wcmVzc0tleUNvZGUgPSBhc3luYyBmdW5jdGlvbiBwcmVzc0tleUNvZGUgKGtleWNvZGUsIG1ldGFzdGF0ZSA9IG51bGwpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3ByZXNzS2V5Q29kZScsIHtrZXljb2RlLCBtZXRhc3RhdGV9KTtcbn07XG5cbmNvbW1hbmRzLmxvbmdQcmVzc0tleUNvZGUgPSBhc3luYyBmdW5jdGlvbiBsb25nUHJlc3NLZXlDb2RlIChrZXljb2RlLCBtZXRhc3RhdGUgPSBudWxsKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdsb25nUHJlc3NLZXlDb2RlJywge2tleWNvZGUsIG1ldGFzdGF0ZX0pO1xufTtcblxuY29tbWFuZHMuZ2V0T3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRPcmllbnRhdGlvbiAoKSB7XG4gIGxldCBwYXJhbXMgPSB7XG4gICAgbmF0dXJhbE9yaWVudGF0aW9uOiAhIXRoaXMub3B0cy5hbmRyb2lkTmF0dXJhbE9yaWVudGF0aW9uLFxuICB9O1xuICBsZXQgb3JpZW50YXRpb24gPSBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdvcmllbnRhdGlvbicsIHBhcmFtcyk7XG4gIHJldHVybiBvcmllbnRhdGlvbi50b1VwcGVyQ2FzZSgpO1xufTtcblxuY29tbWFuZHMuc2V0T3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBzZXRPcmllbnRhdGlvbiAob3JpZW50YXRpb24pIHtcbiAgb3JpZW50YXRpb24gPSBvcmllbnRhdGlvbi50b1VwcGVyQ2FzZSgpO1xuICBsZXQgcGFyYW1zID0ge1xuICAgIG9yaWVudGF0aW9uLFxuICAgIG5hdHVyYWxPcmllbnRhdGlvbjogISF0aGlzLm9wdHMuYW5kcm9pZE5hdHVyYWxPcmllbnRhdGlvbixcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ29yaWVudGF0aW9uJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLmZha2VGbGljayA9IGFzeW5jIGZ1bmN0aW9uIGZha2VGbGljayAoeFNwZWVkLCB5U3BlZWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2ZsaWNrJywge3hTcGVlZCwgeVNwZWVkfSk7XG59O1xuXG5jb21tYW5kcy5mYWtlRmxpY2tFbGVtZW50ID0gYXN5bmMgZnVuY3Rpb24gZmFrZUZsaWNrRWxlbWVudCAoZWxlbWVudElkLCB4b2Zmc2V0LCB5b2Zmc2V0LCBzcGVlZCkge1xuICBsZXQgcGFyYW1zID0ge3hvZmZzZXQsIHlvZmZzZXQsIHNwZWVkLCBlbGVtZW50SWR9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpmbGljaycsIHBhcmFtcyk7XG59O1xuXG5jb21tYW5kcy5zd2lwZSA9IGFzeW5jIGZ1bmN0aW9uIHN3aXBlIChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIHRvdWNoQ291bnQsIGVsSWQpIHtcbiAgaWYgKHN0YXJ0WCA9PT0gJ251bGwnKSB7XG4gICAgc3RhcnRYID0gMC41O1xuICB9XG4gIGlmIChzdGFydFkgPT09ICdudWxsJykge1xuICAgIHN0YXJ0WSA9IDAuNTtcbiAgfVxuICBsZXQgc3dpcGVPcHRzID0ge3N0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLFxuICAgICAgICAgICAgICAgICAgIHN0ZXBzOiBNYXRoLnJvdW5kKGR1cmF0aW9uICogc3dpcGVTdGVwc1BlclNlYyl9O1xuICAvLyBnb2luZyB0aGUgbG9uZyB3YXkgYW5kIGNoZWNraW5nIGZvciB1bmRlZmluZWQgYW5kIG51bGwgc2luY2VcbiAgLy8gd2UgY2FuJ3QgYmUgYXNzdXJlZCBgZWxJZGAgaXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBpbnRcbiAgaWYgKHV0aWwuaGFzVmFsdWUoZWxJZCkpIHtcbiAgICBzd2lwZU9wdHMuZWxlbWVudElkID0gZWxJZDtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5kb1N3aXBlKHN3aXBlT3B0cyk7XG59O1xuXG5jb21tYW5kcy5kb1N3aXBlID0gYXN5bmMgZnVuY3Rpb24gZG9Td2lwZSAoc3dpcGVPcHRzKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHN3aXBlT3B0cy5lbGVtZW50SWQpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6c3dpcGUnLCBzd2lwZU9wdHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdzd2lwZScsIHN3aXBlT3B0cyk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLnBpbmNoQ2xvc2UgPSBhc3luYyBmdW5jdGlvbiBwaW5jaENsb3NlIChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIHBlcmNlbnQsIHN0ZXBzLCBlbElkKSB7XG4gIGxldCBwaW5jaE9wdHMgPSB7XG4gICAgZGlyZWN0aW9uOiAnaW4nLFxuICAgIGVsZW1lbnRJZDogZWxJZCxcbiAgICBwZXJjZW50LFxuICAgIHN0ZXBzXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnBpbmNoJywgcGluY2hPcHRzKTtcbn07XG5cbmNvbW1hbmRzLnBpbmNoT3BlbiA9IGFzeW5jIGZ1bmN0aW9uIHBpbmNoT3BlbiAoc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCBwZXJjZW50LCBzdGVwcywgZWxJZCkge1xuICBsZXQgcGluY2hPcHRzID0ge2RpcmVjdGlvbjogJ291dCcsIGVsZW1lbnRJZDogZWxJZCwgcGVyY2VudCwgc3RlcHN9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpwaW5jaCcsIHBpbmNoT3B0cyk7XG59O1xuXG5jb21tYW5kcy5mbGljayA9IGFzeW5jIGZ1bmN0aW9uIGZsaWNrIChlbGVtZW50LCB4U3BlZWQsIHlTcGVlZCwgeE9mZnNldCwgeU9mZnNldCwgc3BlZWQpIHtcbiAgaWYgKGVsZW1lbnQpIHtcbiAgICBhd2FpdCB0aGlzLmZha2VGbGlja0VsZW1lbnQoZWxlbWVudCwgeE9mZnNldCwgeU9mZnNldCwgc3BlZWQpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuZmFrZUZsaWNrKHhTcGVlZCwgeVNwZWVkKTtcbiAgfVxufTtcblxuY29tbWFuZHMuZHJhZyA9IGFzeW5jIGZ1bmN0aW9uIGRyYWcgKHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBkdXJhdGlvbiwgdG91Y2hDb3VudCwgZWxlbWVudElkLCBkZXN0RWxJZCkge1xuICBsZXQgZHJhZ09wdHMgPSB7XG4gICAgZWxlbWVudElkLCBkZXN0RWxJZCwgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksXG4gICAgc3RlcHM6IE1hdGgucm91bmQoZHVyYXRpb24gKiBkcmFnU3RlcHNQZXJTZWMpXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmRvRHJhZyhkcmFnT3B0cyk7XG5cbn07XG5cbmNvbW1hbmRzLmRvRHJhZyA9IGFzeW5jIGZ1bmN0aW9uIGRvRHJhZyAoZHJhZ09wdHMpIHtcbiAgaWYgKHV0aWwuaGFzVmFsdWUoZHJhZ09wdHMuZWxlbWVudElkKSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OmRyYWcnLCBkcmFnT3B0cyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2RyYWcnLCBkcmFnT3B0cyk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmxvY2sgPSBhc3luYyBmdW5jdGlvbiBsb2NrIChzZWNvbmRzKSB7XG4gIGF3YWl0IHRoaXMuYWRiLmxvY2soKTtcbiAgaWYgKGlzTmFOKHNlY29uZHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmxvYXRTZWNvbmRzID0gcGFyc2VGbG9hdChzZWNvbmRzKTtcbiAgaWYgKGZsb2F0U2Vjb25kcyA8PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IEIuZGVsYXkoMTAwMCAqIGZsb2F0U2Vjb25kcyk7XG4gIGF3YWl0IHRoaXMudW5sb2NrKCk7XG59O1xuXG5jb21tYW5kcy5pc0xvY2tlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzTG9ja2VkICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzU2NyZWVuTG9ja2VkKCk7XG59O1xuXG5jb21tYW5kcy51bmxvY2sgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2sgKCkge1xuICByZXR1cm4gYXdhaXQgYW5kcm9pZEhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xufTtcblxuY29tbWFuZHMub3Blbk5vdGlmaWNhdGlvbnMgPSBhc3luYyBmdW5jdGlvbiBvcGVuTm90aWZpY2F0aW9ucyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdvcGVuTm90aWZpY2F0aW9uJyk7XG59O1xuXG5jb21tYW5kcy5zZXRMb2NhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHNldExvY2F0aW9uIChsYXRpdHVkZSwgbG9uZ2l0dWRlKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5zZW5kVGVsbmV0Q29tbWFuZChgZ2VvIGZpeCAke2xvbmdpdHVkZX0gJHtsYXRpdHVkZX1gKTtcbn07XG5cbmNvbW1hbmRzLmZpbmdlcnByaW50ID0gYXN5bmMgZnVuY3Rpb24gZmluZ2VycHJpbnQgKGZpbmdlcnByaW50SWQpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2ZpbmdlcnByaW50IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuZmluZ2VycHJpbnQoZmluZ2VycHJpbnRJZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEZpbmdlcnByaW50T3B0c1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBmaW5nZXJwcmludElkIFRoZSB2YWx1ZSBpcyB0aGUgZmluZ2VyX2lkIGZvciB0aGUgZmluZ2VyIHRoYXRcbiAqIHdhcyBcInNjYW5uZWRcIi4gSXQgaXMgYSB1bmlxdWUgaW50ZWdlciB0aGF0IHlvdSBhc3NpZ24gZm9yIGVhY2ggdmlydHVhbCBmaW5nZXJwcmludC5cbiAqIFdoZW4gdGhlIGFwcCBpcyBydW5uaW5nIHlvdSBjYW4gcnVuIHRoaXMgc2FtZSBjb21tYW5kIGVhY2ggdGltZSB0aGVcbiAqIGVtdWxhdG9yIHByb21wdHMgeW91IGZvciBhIGZpbmdlcnByaW50LCB5b3UgY2FuIHJ1biB0aGUgYWRiIGNvbW1hbmQgYW5kIHBhc3MgaXRcbiAqIHRoZSBmaW5nZXJfaWQgdG8gc2ltdWxhdGUgdGhlIGZpbmdlcnByaW50IHNjYW4uXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGZpbmdlcnByaW50IG9uIEFuZHJvaWQgRW11bGF0b3IuXG4gKiBPbmx5IHdvcmtzIG9uIEFQSSAyMytcbiAqXG4gKiBAcGFyYW0ge0ZpbmdlcnByaW50T3B0c30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVGaW5nZXJwcmludCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUZpbmdlcnByaW50KG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZmluZ2VycHJpbnRJZH0gPSByZXF1aXJlQXJncygnZmluZ2VycHJpbnRJZCcsIG9wdHMpO1xuICBhd2FpdCB0aGlzLmZpbmdlcnByaW50KGZpbmdlcnByaW50SWQpO1xufTtcblxuY29tbWFuZHMuc2VuZFNNUyA9IGFzeW5jIGZ1bmN0aW9uIHNlbmRTTVMgKHBob25lTnVtYmVyLCBtZXNzYWdlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdzZW5kU01TIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuc2VuZFNNUyhwaG9uZU51bWJlciwgbWVzc2FnZSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNlbmRTbXNPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGhvbmVOdW1iZXIgVGhlIHBob25lIG51bWJlciB0byBzZW5kIFNNUyB0b1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgcGF5bG9hZFxuICovXG5cbi8qKlxuICogRW11bGF0ZSBzZW5kaW5nIGFuIFNNUyB0byB0aGUgZ2l2ZW4gcGhvbmUgbnVtYmVyLlxuICogT25seSB3b3JrcyBvbiBlbXVsYXRvcnMuXG4gKlxuICogQHBhcmFtIHtTZW5kU21zT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVTZW5kU21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2VuZFNtcyhvcHRzID0ge30pIHtcbiAgY29uc3Qge3Bob25lTnVtYmVyLCBtZXNzYWdlfSA9IHJlcXVpcmVBcmdzKFsncGhvbmVOdW1iZXInLCAnbWVzc2FnZSddLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5zZW5kU01TKHBob25lTnVtYmVyLCBtZXNzYWdlKTtcbn07XG5cbmNvbW1hbmRzLmdzbUNhbGwgPSBhc3luYyBmdW5jdGlvbiBnc21DYWxsIChwaG9uZU51bWJlciwgYWN0aW9uKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdnc21DYWxsIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuZ3NtQ2FsbChwaG9uZU51bWJlciwgYWN0aW9uKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtQ2FsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwaG9uZU51bWJlciBUaGUgcGhvbmUgbnVtYmVyIHRvIGNhbGwgdG9cbiAqIEBwcm9wZXJ0eSB7Y2FsbHxhY2NlcHR8Y2FuY2VsfGhvbGR9IGFjdGlvbiBPbmUgb2YgcG9zc2libGUgYWN0aW9ucyB0byB0YWtlXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGEgR1NNIGNhbGwgdG8gdGhlIGdpdmVuIHBob25lIG51bWJlci5cbiAqIE9ubHkgd29ya3Mgb24gZW11bGF0b3JzLlxuICpcbiAqIEBwYXJhbSB7R3NtQ2FsbE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR3NtQ2FsbCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdzbUNhbGwob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtwaG9uZU51bWJlciwgYWN0aW9ufSA9IHJlcXVpcmVBcmdzKFsncGhvbmVOdW1iZXInLCAnYWN0aW9uJ10sIG9wdHMpO1xuICBhd2FpdCB0aGlzLmdzbUNhbGwocGhvbmVOdW1iZXIsIGFjdGlvbik7XG59O1xuXG5jb21tYW5kcy5nc21TaWduYWwgPSBhc3luYyBmdW5jdGlvbiBnc21TaWduYWwgKHNpZ25hbFN0cmVuZ2gpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2dzbVNpZ25hbCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVNpZ25hbChzaWduYWxTdHJlbmdoKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtU2lnbmFsT3B0aW9uc1xuICogQHByb3BlcnR5IHswfDF8MnwzfDR9IHN0cmVuZ3RoIE9uZSBvZiBwb3NzaWJsZSBzaWduYWwgc3RyZW5ndGggdmFsdWVzLCB3aGVyZSA0IGlzIHRoZSBiZXN0IHNpZ25hbC5cbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgR1NNIHNpZ25hbCBzdHJlbmd0aCBjaGFuZ2UgZXZlbnQuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge0dzbVNpZ25hbE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR3NtU2lnbmFsID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR3NtU2lnbmFsKG9wdHMgPSB7fSkge1xuICBjb25zdCB7c3RyZW5ndGh9ID0gcmVxdWlyZUFyZ3MoJ3N0cmVuZ3RoJywgb3B0cyk7XG4gIGF3YWl0IHRoaXMuZ3NtU2lnbmFsKHN0cmVuZ3RoKTtcbn07XG5cbmNvbW1hbmRzLmdzbVZvaWNlID0gYXN5bmMgZnVuY3Rpb24gZ3NtVm9pY2UgKHN0YXRlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdnc21Wb2ljZSBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVZvaWNlKHN0YXRlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtVm9pY2VPcHRpb25zXG4gKiBAcHJvcGVydHkge29ufG9mZn0gc3RhdGVcbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgR1NNIHZvaWNlIHN0YXRlIGNoYW5nZSBldmVudC5cbiAqIE9ubHkgd29ya3Mgb24gZW11bGF0b3JzLlxuICpcbiAqIEBwYXJhbSB7R3NtVm9pY2VPcHRpb25zfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdzbVZvaWNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR3NtVm9pY2Uob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtzdGF0ZX0gPSByZXF1aXJlQXJncygnc3RhdGUnLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5nc21Wb2ljZShzdGF0ZSk7XG59O1xuXG5jb21tYW5kcy5wb3dlckFDID0gYXN5bmMgZnVuY3Rpb24gcG93ZXJBQyAoc3RhdGUpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ3Bvd2VyQUMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5wb3dlckFDKHN0YXRlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUG93ZXJBY09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7b258b2ZmfSBzdGF0ZVxuICovXG5cbi8qKlxuICogRW11bGF0ZSBBQyBwb3dlciBzdGF0ZSBjaGFuZ2UuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge0dzbVZvaWNlT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVQb3dlckFjID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUG93ZXJBYyhvcHRzID0ge30pIHtcbiAgY29uc3Qge3N0YXRlfSA9IHJlcXVpcmVBcmdzKCdzdGF0ZScsIG9wdHMpO1xuICBhd2FpdCB0aGlzLnBvd2VyQUMoc3RhdGUpO1xufTtcblxuY29tbWFuZHMucG93ZXJDYXBhY2l0eSA9IGFzeW5jIGZ1bmN0aW9uIHBvd2VyQ2FwYWNpdHkgKGJhdHRlcnlQZXJjZW50KSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdwb3dlckNhcGFjaXR5IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIucG93ZXJDYXBhY2l0eShiYXR0ZXJ5UGVyY2VudCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvd2VyQ2FwYWNpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGVyY2VudCAtIFBlcmNlbnRhZ2UgdmFsdWUgaW4gcmFuZ2UgWzAsIDEwMF1cbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgcG93ZXIgY2FwYWNpdHkgY2hhbmdlLlxuICogT25seSB3b3JrcyBvbiBlbXVsYXRvcnMuXG4gKlxuICogQHBhcmFtIHtQb3dlckNhcGFjaXR5T3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVQb3dlckNhcGFjaXR5ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUG93ZXJDYXBhY2l0eShvcHRzID0ge30pIHtcbiAgY29uc3Qge3BlcmNlbnR9ID0gcmVxdWlyZUFyZ3MoJ3BlcmNlbnQnLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5wb3dlckNhcGFjaXR5KHBlcmNlbnQpO1xufTtcblxuY29tbWFuZHMubmV0d29ya1NwZWVkID0gYXN5bmMgZnVuY3Rpb24gbmV0d29ya1NwZWVkIChuZXR3b3JrU3BlZWQpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ25ldHdvcmtTcGVlZCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLm5ldHdvcmtTcGVlZChuZXR3b3JrU3BlZWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBOZXR3b3JrU3BlZWRPcHRpb25zXG4gKiBAcHJvcGVydHkge2dzbXxzY3NkfGdwcnN8ZWRnZXx1bXRzfGhzZHBhfGx0ZXxldmRvfGZ1bGx9IHNwZWVkXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGRpZmZlcmVudCBuZXR3b3JrIGNvbm5lY3Rpb24gc3BlZWQgbW9kZXMuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge05ldHdvcmtTcGVlZE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlTmV0d29ya1NwZWVkID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTmV0d29ya1NwZWVkKG9wdHMgPSB7fSkge1xuICBjb25zdCB7c3BlZWR9ID0gcmVxdWlyZUFyZ3MoJ3NwZWVkJywgb3B0cyk7XG4gIGF3YWl0IHRoaXMubmV0d29ya1NwZWVkKHNwZWVkKTtcbn07XG5cbi8qKlxuICogRW11bGF0ZSBzZW5zb3JzIHZhbHVlcyBvbiB0aGUgY29ubmVjdGVkIGVtdWxhdG9yLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNlbnNvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbnNvclR5cGUgLSBzZW5zb3IgdHlwZSBkZWNsYXJlZCBpbiBhZGIuU0VOU09SU1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gdmFsdWUgdG8gc2V0IHRvIHRoZSBzZW5zb3JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gU2Vuc29yXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiBzZW5zb3JUeXBlIGlzIG5vdCBkZWZpbmVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiB2YWx1ZSBmb3IgdGhlIHNlIHNvciBpcyBub3QgZGVmaW5lZFxuICogQHRocm93cyB7RXJyb3J9IC0gSWYgZGV2aWNlVHlwZSBpcyBub3QgYW4gZW11bGF0b3JcbiAqL1xuY29tbWFuZHMuc2Vuc29yU2V0ID0gYXN5bmMgZnVuY3Rpb24gc2Vuc29yU2V0IChzZW5zb3IgPSB7fSkge1xuICBjb25zdCB7c2Vuc29yVHlwZSwgdmFsdWV9ID0gc2Vuc29yO1xuICBpZiAoIXV0aWwuaGFzVmFsdWUoc2Vuc29yVHlwZSkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGAnc2Vuc29yVHlwZScgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuICBpZiAoIXV0aWwuaGFzVmFsdWUodmFsdWUpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgJ3ZhbHVlJyBhcmd1bWVudCBpcyByZXF1aXJlZGApO1xuICB9XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdzZW5zb3JTZXQgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5zZW5zb3JTZXQoc2Vuc29yVHlwZSwgdmFsdWUpO1xufTtcblxuaGVscGVycy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJTaGVsbCA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsIChhZGIsIG9wdHMpIHtcbiAgY29uc3QgbG9jYWxGaWxlID0gYXdhaXQgdGVtcERpci5wYXRoKHtwcmVmaXg6ICdhcHBpdW0nLCBzdWZmaXg6ICcucG5nJ30pO1xuICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsRmlsZSkpIHtcbiAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxGaWxlKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHBuZ0RpciA9IG9wdHMuYW5kcm9pZFNjcmVlbnNob3RQYXRoIHx8ICcvZGF0YS9sb2NhbC90bXAvJztcbiAgICBjb25zdCBwbmcgPSBwYXRoLnBvc2l4LnJlc29sdmUocG5nRGlyLCAnc2NyZWVuc2hvdC5wbmcnKTtcbiAgICBjb25zdCBjbWQgPSBbJy9zeXN0ZW0vYmluL3JtJywgYCR7cG5nfTtgLCAnL3N5c3RlbS9iaW4vc2NyZWVuY2FwJywgJy1wJywgcG5nXTtcbiAgICBhd2FpdCBhZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWF3YWl0IGFkYi5maWxlU2l6ZShwbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzaXplIG9mIHRoZSB0YWtlbiBzY3JlZW5zaG90IGVxdWFscyB0byB6ZXJvLicpO1xuICAgIH1cbiAgICBhd2FpdCBhZGIucHVsbChwbmcsIGxvY2FsRmlsZSk7XG4gICAgcmV0dXJuIGF3YWl0IGppbXAucmVhZChsb2NhbEZpbGUpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxGaWxlKSkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gICAgfVxuICB9XG59O1xuXG5oZWxwZXJzLmdldFNjcmVlbnNob3REYXRhV2l0aEFkYkV4ZWNPdXQgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0IChhZGIpIHtcbiAgbGV0IHtzdGRvdXQsIHN0ZGVyciwgY29kZX0gPSBhd2FpdCBleGVjKGFkYi5leGVjdXRhYmxlLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KFsnZXhlYy1vdXQnLCAnL3N5c3RlbS9iaW4vc2NyZWVuY2FwJywgJy1wJ10pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2VuY29kaW5nOiAnYmluYXJ5JywgaXNCdWZmZXI6IHRydWV9KTtcbiAgLy8gaWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRocm93XG4gIGlmIChjb2RlIHx8IHN0ZGVyci5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNjcmVlbnNob3QgcmV0dXJuZWQgZXJyb3IsIGNvZGU6ICcke2NvZGV9Jywgc3RkZXJyOiAnJHtzdGRlcnIudG9TdHJpbmcoKX0nYCk7XG4gIH1cbiAgLy8gaWYgd2UgZG9uJ3QgZ2V0IGFueXRoaW5nIGF0IGFsbCwgdGhyb3dcbiAgaWYgKCFzdGRvdXQubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTY3JlZW5zaG90IHJldHVybmVkIG5vIGRhdGEnKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCBqaW1wLnJlYWQoc3Rkb3V0KTtcbn07XG5cbmNvbW1hbmRzLmdldFNjcmVlbnNob3QgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5zaG90ICgpIHtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuICBsZXQgaW1hZ2UgPSBudWxsO1xuICBpZiAoYXBpTGV2ZWwgPiAyMCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBUaGlzIHNjcmVlbnNob3RpbmcgYXBwcm9hY2ggaXMgd2F5IGZhc3Rlciwgc2luY2UgaXQgcmVxdWlyZXMgbGVzcyBleHRlcm5hbCBjb21tYW5kc1xuICAgICAgLy8gdG8gYmUgZXhlY3V0ZWQuIFVuZm9ydHVuYXRlbHksIGV4ZWMtb3V0IG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBieSBuZXdlciBBbmRyb2lkL1NESyB2ZXJzaW9ucyAoNS4wIGFuZCBsYXRlcilcbiAgICAgIGltYWdlID0gYXdhaXQgdGhpcy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0KHRoaXMuYWRiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBDYW5ub3QgZ2V0IHNjcmVlbnNob3QgZGF0YSB3aXRoICdhZGIgZXhlYy1vdXQnIGJlY2F1c2Ugb2YgJyR7ZS5tZXNzYWdlfScuIGAgK1xuICAgICAgICBgRGVmYXVsdGluZyB0byAnYWRiIHNoZWxsJyBjYWxsYCk7XG4gICAgfVxuICB9XG4gIGlmICghaW1hZ2UpIHtcbiAgICB0cnkge1xuICAgICAgaW1hZ2UgPSBhd2FpdCB0aGlzLmdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IGVyciA9IGBDYW5ub3QgZ2V0IHNjcmVlbnNob3QgZGF0YSBiZWNhdXNlIG9mICcke2UubWVzc2FnZX0nLiBgICtcbiAgICAgICAgYE1ha2Ugc3VyZSB0aGUgJ0xheW91dFBhcmFtcy5GTEFHX1NFQ1VSRScgaXMgbm90IHNldCBmb3IgYCArXG4gICAgICAgIGB0aGUgY3VycmVudCB2aWV3YDtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coZXJyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFwaUxldmVsIDwgMjMpIHtcbiAgICAvLyBBbmRyb2lkIGJ1ZyA4NDMzNzQyIC0gcm90YXRlIHNjcmVlbnNob3QgaWYgc2NyZWVuIGlzIHJvdGF0ZWRcbiAgICBsZXQgc2NyZWVuT3JpZW50YXRpb24gPSBhd2FpdCB0aGlzLmFkYi5nZXRTY3JlZW5PcmllbnRhdGlvbigpO1xuICAgIHRyeSB7XG4gICAgICBpbWFnZSA9IGF3YWl0IGltYWdlLnJvdGF0ZSgtOTAgKiBzY3JlZW5PcmllbnRhdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBDb3VsZCBub3Qgcm90YXRlIHNjcmVlbnNob3QgZHVlIHRvIGVycm9yOiAke2Vycn1gKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZ2V0QnVmZmVyID0gQi5wcm9taXNpZnkoaW1hZ2UuZ2V0QnVmZmVyLCB7Y29udGV4dDogaW1hZ2V9KTtcbiAgY29uc3QgaW1nQnVmZmVyID0gYXdhaXQgZ2V0QnVmZmVyKGppbXAuTUlNRV9QTkcpO1xuICByZXR1cm4gaW1nQnVmZmVyLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsZUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsS0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsU0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksS0FBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssYUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBRUEsTUFBTU8sZ0JBQWdCLEdBQUcsRUFBRTtBQUMzQixNQUFNQyxlQUFlLEdBQUcsRUFBRTtBQUUxQixJQUFJQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUFDQyxPQUFBLENBQUFGLE9BQUEsR0FBQUEsT0FBQTtBQUFBRSxPQUFBLENBQUFILFFBQUEsR0FBQUEsUUFBQTtBQUVqREEsUUFBUSxDQUFDSSxRQUFRLEdBQUcsZUFBZUEsUUFBUUEsQ0FBRUMsT0FBTyxFQUFFQyxT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
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","names":["_androidHelpers","_interopRequireDefault","require","_support","_path","_bluebird","_jimp","_teen_process","swipeStepsPerSec","dragStepsPerSec","commands","helpers","extensions","exports","keyevent","keycode","metastate","log","warn","pressKeyCode","bootstrap","sendAction","longPressKeyCode","getOrientation","params","naturalOrientation","opts","androidNaturalOrientation","orientation","toUpperCase","setOrientation","fakeFlick","xSpeed","ySpeed","fakeFlickElement","elementId","xoffset","yoffset","speed","swipe","startX","startY","endX","endY","duration","touchCount","elId","swipeOpts","steps","Math","round","util","hasValue","doSwipe","pinchClose","percent","pinchOpts","direction","pinchOpen","flick","element","xOffset","yOffset","drag","destElId","dragOpts","doDrag","lock","seconds","adb","isNaN","floatSeconds","parseFloat","B","delay","unlock","isLocked","isScreenLocked","androidHelpers","caps","openNotifications","setLocation","latitude","longitude","sendTelnetCommand","fingerprint","fingerprintId","isEmulator","errorAndThrow","sendSMS","phoneNumber","message","gsmCall","action","gsmSignal","signalStrengh","gsmVoice","state","powerAC","powerCapacity","batteryPercent","networkSpeed","sensorSet","sensor","sensorType","value","getScreenshotDataWithAdbShell","localFile","tempDir","path","prefix","suffix","fs","exists","unlink","pngDir","androidScreenshotPath","png","posix","resolve","cmd","shell","fileSize","Error","pull","jimp","read","getScreenshotDataWithAdbExecOut","stdout","stderr","code","exec","executable","defaultArgs","concat","encoding","isBuffer","length","toString","getScreenshot","apiLevel","getApiLevel","image","e","info","err","screenOrientation","getScreenOrientation","rotate","getBuffer","promisify","context","imgBuffer","MIME_PNG","Object","assign","_default","default"],"sources":["../../../lib/commands/actions.js"],"sourcesContent":["import androidHelpers from '../android-helpers';\nimport { fs, util, tempDir} from '@appium/support';\nimport path from 'path';\nimport B from 'bluebird';\nimport jimp from 'jimp';\nimport { exec } from 'teen_process';\n\nconst swipeStepsPerSec = 28;\nconst dragStepsPerSec = 40;\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.keyevent = async function keyevent (keycode, metastate = null) {\n // TODO deprecate keyevent; currently wd only implements keyevent\n this.log.warn('keyevent will be deprecated use pressKeyCode');\n return await this.pressKeyCode(keycode, metastate);\n};\n\ncommands.pressKeyCode = async function pressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('pressKeyCode', {keycode, metastate});\n};\n\ncommands.longPressKeyCode = async function longPressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('longPressKeyCode', {keycode, metastate});\n};\n\ncommands.getOrientation = async function getOrientation () {\n let params = {\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n let orientation = await this.bootstrap.sendAction('orientation', params);\n return orientation.toUpperCase();\n};\n\ncommands.setOrientation = async function setOrientation (orientation) {\n orientation = orientation.toUpperCase();\n let params = {\n orientation,\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n return await this.bootstrap.sendAction('orientation', params);\n};\n\ncommands.fakeFlick = async function fakeFlick (xSpeed, ySpeed) {\n return await this.bootstrap.sendAction('flick', {xSpeed, ySpeed});\n};\n\ncommands.fakeFlickElement = async function fakeFlickElement (elementId, xoffset, yoffset, speed) {\n let params = {xoffset, yoffset, speed, elementId};\n return await this.bootstrap.sendAction('element:flick', params);\n};\n\ncommands.swipe = async function swipe (startX, startY, endX, endY, duration, touchCount, elId) {\n if (startX === 'null') {\n startX = 0.5;\n }\n if (startY === 'null') {\n startY = 0.5;\n }\n let swipeOpts = {startX, startY, endX, endY,\n steps: Math.round(duration * swipeStepsPerSec)};\n // going the long way and checking for undefined and null since\n // we can't be assured `elId` is a string and not an int\n if (util.hasValue(elId)) {\n swipeOpts.elementId = elId;\n }\n return await this.doSwipe(swipeOpts);\n};\n\ncommands.doSwipe = async function doSwipe (swipeOpts) {\n if (util.hasValue(swipeOpts.elementId)) {\n return await this.bootstrap.sendAction('element:swipe', swipeOpts);\n } else {\n return await this.bootstrap.sendAction('swipe', swipeOpts);\n }\n};\n\ncommands.pinchClose = async function pinchClose (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {\n direction: 'in',\n elementId: elId,\n percent,\n steps\n };\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.pinchOpen = async function pinchOpen (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {direction: 'out', elementId: elId, percent, steps};\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.flick = async function flick (element, xSpeed, ySpeed, xOffset, yOffset, speed) {\n if (element) {\n await this.fakeFlickElement(element, xOffset, yOffset, speed);\n } else {\n await this.fakeFlick(xSpeed, ySpeed);\n }\n};\n\ncommands.drag = async function drag (startX, startY, endX, endY, duration, touchCount, elementId, destElId) {\n let dragOpts = {\n elementId, destElId, startX, startY, endX, endY,\n steps: Math.round(duration * dragStepsPerSec)\n };\n return await this.doDrag(dragOpts);\n\n};\n\ncommands.doDrag = async function doDrag (dragOpts) {\n if (util.hasValue(dragOpts.elementId)) {\n return await this.bootstrap.sendAction('element:drag', dragOpts);\n } else {\n return await this.bootstrap.sendAction('drag', dragOpts);\n }\n};\n\ncommands.lock = async function lock (seconds) {\n await this.adb.lock();\n if (isNaN(seconds)) {\n return;\n }\n\n const floatSeconds = parseFloat(seconds);\n if (floatSeconds <= 0) {\n return;\n }\n await B.delay(1000 * floatSeconds);\n await this.unlock();\n};\n\ncommands.isLocked = async function isLocked () {\n return await this.adb.isScreenLocked();\n};\n\ncommands.unlock = async function unlock () {\n return await androidHelpers.unlock(this, this.adb, this.caps);\n};\n\ncommands.openNotifications = async function openNotifications () {\n return await this.bootstrap.sendAction('openNotification');\n};\n\ncommands.setLocation = async function setLocation (latitude, longitude) {\n return await this.adb.sendTelnetCommand(`geo fix ${longitude} ${latitude}`);\n};\n\ncommands.fingerprint = async function fingerprint (fingerprintId) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('fingerprint method is only available for emulators');\n }\n await this.adb.fingerprint(fingerprintId);\n};\n\ncommands.sendSMS = async function sendSMS (phoneNumber, message) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sendSMS method is only available for emulators');\n }\n await this.adb.sendSMS(phoneNumber, message);\n};\n\ncommands.gsmCall = async function gsmCall (phoneNumber, action) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmCall method is only available for emulators');\n }\n await this.adb.gsmCall(phoneNumber, action);\n};\n\ncommands.gsmSignal = async function gsmSignal (signalStrengh) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmSignal method is only available for emulators');\n }\n await this.adb.gsmSignal(signalStrengh);\n};\n\ncommands.gsmVoice = async function gsmVoice (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmVoice method is only available for emulators');\n }\n await this.adb.gsmVoice(state);\n};\n\ncommands.powerAC = async function powerAC (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerAC method is only available for emulators');\n }\n await this.adb.powerAC(state);\n};\n\ncommands.powerCapacity = async function powerCapacity (batteryPercent) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerCapacity method is only available for emulators');\n }\n await this.adb.powerCapacity(batteryPercent);\n};\n\ncommands.networkSpeed = async function networkSpeed (networkSpeed) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('networkSpeed method is only available for emulators');\n }\n await this.adb.networkSpeed(networkSpeed);\n};\n\n/**\n * Emulate sensors values on the connected emulator.\n *\n * @typedef {Object} Sensor\n * @property {string} sensorType - sensor type declared in adb.SENSORS\n * @property {string} value - value to set to the sensor\n *\n * @param {Object} Sensor\n * @throws {Error} - If sensorType is not defined\n * @throws {Error} - If value for the se sor is not defined\n * @throws {Error} - If deviceType is not an emulator\n */\ncommands.sensorSet = async function sensorSet (sensor = {}) {\n const {sensorType, value} = sensor;\n if (!util.hasValue(sensorType)) {\n this.log.errorAndThrow(`'sensorType' argument is required`);\n }\n if (!util.hasValue(value)) {\n this.log.errorAndThrow(`'value' argument is required`);\n }\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sensorSet method is only available for emulators');\n }\n await this.adb.sensorSet(sensorType, value);\n};\n\nhelpers.getScreenshotDataWithAdbShell = async function getScreenshotDataWithAdbShell (adb, opts) {\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.png'});\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n try {\n const pngDir = opts.androidScreenshotPath || '/data/local/tmp/';\n const png = path.posix.resolve(pngDir, 'screenshot.png');\n const cmd = ['/system/bin/rm', `${png};`, '/system/bin/screencap', '-p', png];\n await adb.shell(cmd);\n if (!await adb.fileSize(png)) {\n throw new Error('The size of the taken screenshot equals to zero.');\n }\n await adb.pull(png, localFile);\n return await jimp.read(localFile);\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n }\n};\n\nhelpers.getScreenshotDataWithAdbExecOut = async function getScreenshotDataWithAdbExecOut (adb) {\n let {stdout, stderr, code} = await exec(adb.executable.path,\n adb.executable.defaultArgs\n .concat(['exec-out', '/system/bin/screencap', '-p']),\n {encoding: 'binary', isBuffer: true});\n // if there is an error, throw\n if (code || stderr.length) {\n throw new Error(`Screenshot returned error, code: '${code}', stderr: '${stderr.toString()}'`);\n }\n // if we don't get anything at all, throw\n if (!stdout.length) {\n throw new Error('Screenshot returned no data');\n }\n\n return await jimp.read(stdout);\n};\n\ncommands.getScreenshot = async function getScreenshot () {\n const apiLevel = await this.adb.getApiLevel();\n let image = null;\n if (apiLevel > 20) {\n try {\n // This screenshoting approach is way faster, since it requires less external commands\n // to be executed. Unfortunately, exec-out option is only supported by newer Android/SDK versions (5.0 and later)\n image = await this.getScreenshotDataWithAdbExecOut(this.adb);\n } catch (e) {\n this.log.info(`Cannot get screenshot data with 'adb exec-out' because of '${e.message}'. ` +\n `Defaulting to 'adb shell' call`);\n }\n }\n if (!image) {\n try {\n image = await this.getScreenshotDataWithAdbShell(this.adb, this.opts);\n } catch (e) {\n const err = `Cannot get screenshot data because of '${e.message}'. ` +\n `Make sure the 'LayoutParams.FLAG_SECURE' is not set for ` +\n `the current view`;\n this.log.errorAndThrow(err);\n }\n }\n if (apiLevel < 23) {\n // Android bug 8433742 - rotate screenshot if screen is rotated\n let screenOrientation = await this.adb.getScreenOrientation();\n try {\n image = await image.rotate(-90 * screenOrientation);\n } catch (err) {\n this.log.warn(`Could not rotate screenshot due to error: ${err}`);\n }\n }\n const getBuffer = B.promisify(image.getBuffer, {context: image});\n const imgBuffer = await getBuffer(jimp.MIME_PNG);\n return imgBuffer.toString('base64');\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
1
+ {"version":3,"file":"actions.js","names":["_androidHelpers","_interopRequireDefault","require","_support","_path","_bluebird","_jimp","_teen_process","_utils","swipeStepsPerSec","dragStepsPerSec","commands","helpers","extensions","exports","keyevent","keycode","metastate","log","warn","pressKeyCode","bootstrap","sendAction","longPressKeyCode","getOrientation","params","naturalOrientation","opts","androidNaturalOrientation","orientation","toUpperCase","setOrientation","fakeFlick","xSpeed","ySpeed","fakeFlickElement","elementId","xoffset","yoffset","speed","swipe","startX","startY","endX","endY","duration","touchCount","elId","swipeOpts","steps","Math","round","util","hasValue","doSwipe","pinchClose","percent","pinchOpts","direction","pinchOpen","flick","element","xOffset","yOffset","drag","destElId","dragOpts","doDrag","lock","seconds","adb","isNaN","floatSeconds","parseFloat","B","delay","unlock","isLocked","isScreenLocked","androidHelpers","caps","openNotifications","setLocation","latitude","longitude","sendTelnetCommand","fingerprint","fingerprintId","isEmulator","errorAndThrow","mobileFingerprint","requireArgs","sendSMS","phoneNumber","message","mobileSendSms","gsmCall","action","mobileGsmCall","gsmSignal","signalStrengh","mobileGsmSignal","strength","gsmVoice","state","mobileGsmVoice","powerAC","mobilePowerAc","powerCapacity","batteryPercent","mobilePowerCapacity","networkSpeed","mobileNetworkSpeed","sensorSet","sensor","sensorType","value","getScreenshotDataWithAdbShell","localFile","tempDir","path","prefix","suffix","fs","exists","unlink","pngDir","androidScreenshotPath","png","posix","resolve","cmd","shell","fileSize","Error","pull","jimp","read","getScreenshotDataWithAdbExecOut","stdout","stderr","code","exec","executable","defaultArgs","concat","encoding","isBuffer","length","toString","getScreenshot","apiLevel","getApiLevel","image","e","info","err","screenOrientation","getScreenOrientation","rotate","getBuffer","promisify","context","imgBuffer","MIME_PNG","Object","assign","_default","default"],"sources":["../../../lib/commands/actions.js"],"sourcesContent":["import androidHelpers from '../android-helpers';\nimport { fs, util, tempDir} from '@appium/support';\nimport path from 'path';\nimport B from 'bluebird';\nimport jimp from 'jimp';\nimport { exec } from 'teen_process';\nimport { requireArgs } from '../utils';\n\nconst swipeStepsPerSec = 28;\nconst dragStepsPerSec = 40;\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.keyevent = async function keyevent (keycode, metastate = null) {\n // TODO deprecate keyevent; currently wd only implements keyevent\n this.log.warn('keyevent will be deprecated use pressKeyCode');\n return await this.pressKeyCode(keycode, metastate);\n};\n\ncommands.pressKeyCode = async function pressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('pressKeyCode', {keycode, metastate});\n};\n\ncommands.longPressKeyCode = async function longPressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('longPressKeyCode', {keycode, metastate});\n};\n\ncommands.getOrientation = async function getOrientation () {\n let params = {\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n let orientation = await this.bootstrap.sendAction('orientation', params);\n return orientation.toUpperCase();\n};\n\ncommands.setOrientation = async function setOrientation (orientation) {\n orientation = orientation.toUpperCase();\n let params = {\n orientation,\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n return await this.bootstrap.sendAction('orientation', params);\n};\n\ncommands.fakeFlick = async function fakeFlick (xSpeed, ySpeed) {\n return await this.bootstrap.sendAction('flick', {xSpeed, ySpeed});\n};\n\ncommands.fakeFlickElement = async function fakeFlickElement (elementId, xoffset, yoffset, speed) {\n let params = {xoffset, yoffset, speed, elementId};\n return await this.bootstrap.sendAction('element:flick', params);\n};\n\ncommands.swipe = async function swipe (startX, startY, endX, endY, duration, touchCount, elId) {\n if (startX === 'null') {\n startX = 0.5;\n }\n if (startY === 'null') {\n startY = 0.5;\n }\n let swipeOpts = {startX, startY, endX, endY,\n steps: Math.round(duration * swipeStepsPerSec)};\n // going the long way and checking for undefined and null since\n // we can't be assured `elId` is a string and not an int\n if (util.hasValue(elId)) {\n swipeOpts.elementId = elId;\n }\n return await this.doSwipe(swipeOpts);\n};\n\ncommands.doSwipe = async function doSwipe (swipeOpts) {\n if (util.hasValue(swipeOpts.elementId)) {\n return await this.bootstrap.sendAction('element:swipe', swipeOpts);\n } else {\n return await this.bootstrap.sendAction('swipe', swipeOpts);\n }\n};\n\ncommands.pinchClose = async function pinchClose (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {\n direction: 'in',\n elementId: elId,\n percent,\n steps\n };\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.pinchOpen = async function pinchOpen (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {direction: 'out', elementId: elId, percent, steps};\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.flick = async function flick (element, xSpeed, ySpeed, xOffset, yOffset, speed) {\n if (element) {\n await this.fakeFlickElement(element, xOffset, yOffset, speed);\n } else {\n await this.fakeFlick(xSpeed, ySpeed);\n }\n};\n\ncommands.drag = async function drag (startX, startY, endX, endY, duration, touchCount, elementId, destElId) {\n let dragOpts = {\n elementId, destElId, startX, startY, endX, endY,\n steps: Math.round(duration * dragStepsPerSec)\n };\n return await this.doDrag(dragOpts);\n\n};\n\ncommands.doDrag = async function doDrag (dragOpts) {\n if (util.hasValue(dragOpts.elementId)) {\n return await this.bootstrap.sendAction('element:drag', dragOpts);\n } else {\n return await this.bootstrap.sendAction('drag', dragOpts);\n }\n};\n\ncommands.lock = async function lock (seconds) {\n await this.adb.lock();\n if (isNaN(seconds)) {\n return;\n }\n\n const floatSeconds = parseFloat(seconds);\n if (floatSeconds <= 0) {\n return;\n }\n await B.delay(1000 * floatSeconds);\n await this.unlock();\n};\n\ncommands.isLocked = async function isLocked () {\n return await this.adb.isScreenLocked();\n};\n\ncommands.unlock = async function unlock () {\n return await androidHelpers.unlock(this, this.adb, this.caps);\n};\n\ncommands.openNotifications = async function openNotifications () {\n return await this.bootstrap.sendAction('openNotification');\n};\n\ncommands.setLocation = async function setLocation (latitude, longitude) {\n return await this.adb.sendTelnetCommand(`geo fix ${longitude} ${latitude}`);\n};\n\ncommands.fingerprint = async function fingerprint (fingerprintId) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('fingerprint method is only available for emulators');\n }\n await this.adb.fingerprint(fingerprintId);\n};\n\n/**\n * @typedef {Object} FingerprintOpts\n * @param {string|number} fingerprintId The value is the finger_id for the finger that\n * was \"scanned\". It is a unique integer that you assign for each virtual fingerprint.\n * When the app is running you can run this same command each time the\n * emulator prompts you for a fingerprint, you can run the adb command and pass it\n * the finger_id to simulate the fingerprint scan.\n */\n\n/**\n * Emulate fingerprint on Android Emulator.\n * Only works on API 23+\n *\n * @param {FingerprintOpts} opts\n */\ncommands.mobileFingerprint = async function mobileFingerprint(opts = {}) {\n const {fingerprintId} = requireArgs('fingerprintId', opts);\n await this.fingerprint(fingerprintId);\n};\n\ncommands.sendSMS = async function sendSMS (phoneNumber, message) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sendSMS method is only available for emulators');\n }\n await this.adb.sendSMS(phoneNumber, message);\n};\n\n/**\n * @typedef {Object} SendSmsOptions\n * @property {string} phoneNumber The phone number to send SMS to\n * @property {string} message The message payload\n */\n\n/**\n * Emulate sending an SMS to the given phone number.\n * Only works on emulators.\n *\n * @param {SendSmsOptions} opts\n */\ncommands.mobileSendSms = async function mobileSendSms(opts = {}) {\n const {phoneNumber, message} = requireArgs(['phoneNumber', 'message'], opts);\n await this.sendSMS(phoneNumber, message);\n};\n\ncommands.gsmCall = async function gsmCall (phoneNumber, action) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmCall method is only available for emulators');\n }\n await this.adb.gsmCall(phoneNumber, action);\n};\n\n/**\n * @typedef {Object} GsmCallOptions\n * @property {string} phoneNumber The phone number to call to\n * @property {call|accept|cancel|hold} action One of possible actions to take\n */\n\n/**\n * Emulate a GSM call to the given phone number.\n * Only works on emulators.\n *\n * @param {GsmCallOptions} opts\n */\ncommands.mobileGsmCall = async function mobileGsmCall(opts = {}) {\n const {phoneNumber, action} = requireArgs(['phoneNumber', 'action'], opts);\n await this.gsmCall(phoneNumber, action);\n};\n\ncommands.gsmSignal = async function gsmSignal (signalStrengh) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmSignal method is only available for emulators');\n }\n await this.adb.gsmSignal(signalStrengh);\n};\n\n/**\n * @typedef {Object} GsmSignalOptions\n * @property {0|1|2|3|4} strength One of possible signal strength values, where 4 is the best signal.\n */\n\n/**\n * Emulate GSM signal strength change event.\n * Only works on emulators.\n *\n * @param {GsmSignalOptions} opts\n */\ncommands.mobileGsmSignal = async function mobileGsmSignal(opts = {}) {\n const {strength} = requireArgs('strength', opts);\n await this.gsmSignal(strength);\n};\n\ncommands.gsmVoice = async function gsmVoice (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmVoice method is only available for emulators');\n }\n await this.adb.gsmVoice(state);\n};\n\n/**\n * @typedef {Object} GsmVoiceOptions\n * @property {on|off} state\n */\n\n/**\n * Emulate GSM voice state change event.\n * Only works on emulators.\n *\n * @param {GsmVoiceOptions} opts\n */\ncommands.mobileGsmVoice = async function mobileGsmVoice(opts = {}) {\n const {state} = requireArgs('state', opts);\n await this.gsmVoice(state);\n};\n\ncommands.powerAC = async function powerAC (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerAC method is only available for emulators');\n }\n await this.adb.powerAC(state);\n};\n\n/**\n * @typedef {Object} PowerAcOptions\n * @property {on|off} state\n */\n\n/**\n * Emulate AC power state change.\n * Only works on emulators.\n *\n * @param {GsmVoiceOptions} opts\n */\ncommands.mobilePowerAc = async function mobilePowerAc(opts = {}) {\n const {state} = requireArgs('state', opts);\n await this.powerAC(state);\n};\n\ncommands.powerCapacity = async function powerCapacity (batteryPercent) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerCapacity method is only available for emulators');\n }\n await this.adb.powerCapacity(batteryPercent);\n};\n\n/**\n * @typedef {Object} PowerCapacityOptions\n * @property {number} percent - Percentage value in range [0, 100]\n */\n\n/**\n * Emulate power capacity change.\n * Only works on emulators.\n *\n * @param {PowerCapacityOptions} opts\n */\ncommands.mobilePowerCapacity = async function mobilePowerCapacity(opts = {}) {\n const {percent} = requireArgs('percent', opts);\n await this.powerCapacity(percent);\n};\n\ncommands.networkSpeed = async function networkSpeed (networkSpeed) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('networkSpeed method is only available for emulators');\n }\n await this.adb.networkSpeed(networkSpeed);\n};\n\n/**\n * @typedef {Object} NetworkSpeedOptions\n * @property {gsm|scsd|gprs|edge|umts|hsdpa|lte|evdo|full} speed\n */\n\n/**\n * Emulate different network connection speed modes.\n * Only works on emulators.\n *\n * @param {NetworkSpeedOptions} opts\n */\ncommands.mobileNetworkSpeed = async function mobileNetworkSpeed(opts = {}) {\n const {speed} = requireArgs('speed', opts);\n await this.networkSpeed(speed);\n};\n\n/**\n * Emulate sensors values on the connected emulator.\n *\n * @typedef {Object} Sensor\n * @property {string} sensorType - sensor type declared in adb.SENSORS\n * @property {string} value - value to set to the sensor\n *\n * @param {Object} Sensor\n * @throws {Error} - If sensorType is not defined\n * @throws {Error} - If value for the se sor is not defined\n * @throws {Error} - If deviceType is not an emulator\n */\ncommands.sensorSet = async function sensorSet (sensor = {}) {\n const {sensorType, value} = sensor;\n if (!util.hasValue(sensorType)) {\n this.log.errorAndThrow(`'sensorType' argument is required`);\n }\n if (!util.hasValue(value)) {\n this.log.errorAndThrow(`'value' argument is required`);\n }\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sensorSet method is only available for emulators');\n }\n await this.adb.sensorSet(sensorType, value);\n};\n\nhelpers.getScreenshotDataWithAdbShell = async function getScreenshotDataWithAdbShell (adb, opts) {\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.png'});\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n try {\n const pngDir = opts.androidScreenshotPath || '/data/local/tmp/';\n const png = path.posix.resolve(pngDir, 'screenshot.png');\n const cmd = ['/system/bin/rm', `${png};`, '/system/bin/screencap', '-p', png];\n await adb.shell(cmd);\n if (!await adb.fileSize(png)) {\n throw new Error('The size of the taken screenshot equals to zero.');\n }\n await adb.pull(png, localFile);\n return await jimp.read(localFile);\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n }\n};\n\nhelpers.getScreenshotDataWithAdbExecOut = async function getScreenshotDataWithAdbExecOut (adb) {\n let {stdout, stderr, code} = await exec(adb.executable.path,\n adb.executable.defaultArgs\n .concat(['exec-out', '/system/bin/screencap', '-p']),\n {encoding: 'binary', isBuffer: true});\n // if there is an error, throw\n if (code || stderr.length) {\n throw new Error(`Screenshot returned error, code: '${code}', stderr: '${stderr.toString()}'`);\n }\n // if we don't get anything at all, throw\n if (!stdout.length) {\n throw new Error('Screenshot returned no data');\n }\n\n return await jimp.read(stdout);\n};\n\ncommands.getScreenshot = async function getScreenshot () {\n const apiLevel = await this.adb.getApiLevel();\n let image = null;\n if (apiLevel > 20) {\n try {\n // This screenshoting approach is way faster, since it requires less external commands\n // to be executed. Unfortunately, exec-out option is only supported by newer Android/SDK versions (5.0 and later)\n image = await this.getScreenshotDataWithAdbExecOut(this.adb);\n } catch (e) {\n this.log.info(`Cannot get screenshot data with 'adb exec-out' because of '${e.message}'. ` +\n `Defaulting to 'adb shell' call`);\n }\n }\n if (!image) {\n try {\n image = await this.getScreenshotDataWithAdbShell(this.adb, this.opts);\n } catch (e) {\n const err = `Cannot get screenshot data because of '${e.message}'. ` +\n `Make sure the 'LayoutParams.FLAG_SECURE' is not set for ` +\n `the current view`;\n this.log.errorAndThrow(err);\n }\n }\n if (apiLevel < 23) {\n // Android bug 8433742 - rotate screenshot if screen is rotated\n let screenOrientation = await this.adb.getScreenOrientation();\n try {\n image = await image.rotate(-90 * screenOrientation);\n } catch (err) {\n this.log.warn(`Could not rotate screenshot due to error: ${err}`);\n }\n }\n const getBuffer = B.promisify(image.getBuffer, {context: image});\n const imgBuffer = await getBuffer(jimp.MIME_PNG);\n return imgBuffer.toString('base64');\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
@@ -257,14 +257,18 @@ commands.mobileUnlock = async function mobileUnlock(opts = {}) {
257
257
  strategy,
258
258
  timeoutMs
259
259
  } = opts;
260
- await _androidHelpers.default.unlock(this, this.adb, {
261
- unlockKey: key,
262
- unlockType: type,
263
- unlockStrategy: strategy,
264
- unlockSuccessTimeout: timeoutMs
265
- });
260
+ if (!key && !type) {
261
+ await this.unlock();
262
+ } else {
263
+ await _androidHelpers.default.unlock(this, this.adb, {
264
+ unlockKey: key,
265
+ unlockType: type,
266
+ unlockStrategy: strategy,
267
+ unlockSuccessTimeout: timeoutMs
268
+ });
269
+ }
266
270
  };
267
271
  Object.assign(extensions, commands, helpers);
268
272
  var _default = extensions;
269
273
  exports.default = _default;
270
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYW5kcm9pZEhlbHBlcnMiLCJfc3VwcG9ydCIsIl9tb21lbnQiLCJfYXN5bmNib3giLCJfZHJpdmVyIiwiTU9NRU5UX0ZPUk1BVF9JU084NjAxIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJrZXlzIiwiXyIsImlzQXJyYXkiLCJqb2luIiwicGFyYW1zIiwidGV4dCIsInJlcGxhY2UiLCJvcHRzIiwidW5pY29kZUtleWJvYXJkIiwiZG9TZW5kS2V5cyIsImJvb3RzdHJhcCIsInNlbmRBY3Rpb24iLCJnZXREZXZpY2VUaW1lIiwiZm9ybWF0IiwibG9nIiwiZGVidWciLCJkZXZpY2VUaW1lc3RhbXAiLCJhZGIiLCJzaGVsbCIsInRyaW0iLCJwYXJzZWRUaW1lc3RhbXAiLCJtb21lbnQiLCJ1dGMiLCJpc1ZhbGlkIiwid2FybiIsInV0Y09mZnNldCIsIl90em0iLCJtb2JpbGVHZXREZXZpY2VUaW1lIiwiZ2V0UGFnZVNvdXJjZSIsImJhY2siLCJvcGVuU2V0dGluZ3NBY3Rpdml0eSIsInNldHRpbmciLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJnZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5Iiwid2FpdEZvck5vdEFjdGl2aXR5IiwiZ2V0V2luZG93U2l6ZSIsImdldFdpbmRvd1JlY3QiLCJ3aWR0aCIsImhlaWdodCIsIngiLCJ5IiwiZ2V0Q3VycmVudEFjdGl2aXR5IiwiZ2V0Q3VycmVudFBhY2thZ2UiLCJiYWNrZ3JvdW5kIiwic2Vjb25kcyIsImdvVG9Ib21lIiwic2xlZXBNcyIsInRocmVzaG9sZE1zIiwiaW50ZXJ2YWxNcyIsIm1pbiIsInBhcnNlSW50IiwicHJvZ3Jlc3NDYiIsImVsYXBzZWRNcyIsInByb2dyZXNzIiwid2FpdFNlY3MiLCJ0b0ZpeGVkIiwicHJvZ3Jlc3NQY3QiLCJsb25nU2xlZXAiLCJhcmdzIiwiX2NhY2hlZEFjdGl2aXR5QXJncyIsImFjdGl2YXRlQXBwIiwiaWduIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJzcGxpdCIsImluY2x1ZGVzIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJpbnRlbnRBY3Rpb24iLCJjYXRlZ29yeSIsImludGVudENhdGVnb3J5IiwiZmxhZ3MiLCJpbnRlbnRGbGFncyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJ3YWl0Rm9yTGF1bmNoIiwiYXBwV2FpdEZvckxhdW5jaCIsIndhaXREdXJhdGlvbiIsImFwcFdhaXREdXJhdGlvbiIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic3RvcEFwcCIsInVzZXIiLCJ1c2VyUHJvZmlsZSIsInV0aWwiLCJmaWx0ZXJPYmplY3QiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhcnRBcHAiLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsInRvUGFpcnMiLCJpc1N0cmluZyIsImFwa1N0cmluZ3MiLCJhbmRyb2lkSGVscGVycyIsInB1c2hTdHJpbmdzIiwibGF1bmNoQXBwIiwiaW5pdEFVVCIsInN0YXJ0QVVUIiwic3RhcnRBY3Rpdml0eSIsImRvbnRTdG9wQXBwT25SZXNldCIsImhhc1ZhbHVlIiwicmVzZXQiLCJyZXNldEFwcCIsIk9iamVjdCIsImFzc2lnbiIsImZhc3RSZXNldCIsInNldENvbnRleHQiLCJpc0Nocm9tZVNlc3Npb24iLCJzdGFydENocm9tZVNlc3Npb24iLCJzZXRVcmwiLCJ1cmkiLCJzdGFydFVyaSIsImNsb3NlQXBwIiwiZm9yY2VTdG9wIiwiZ2V0RGlzcGxheURlbnNpdHkiLCJvdXQiLCJ2YWwiLCJpc05hTiIsImVycm9yQW5kVGhyb3ciLCJtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwibW9iaWxlR2V0Tm90aWZpY2F0aW9ucyIsImdldE5vdGlmaWNhdGlvbnMiLCJtb2JpbGVMaXN0U21zIiwiZ2V0U21zTGlzdCIsIm1vYmlsZVVubG9jayIsInR5cGUiLCJzdHJhdGVneSIsInRpbWVvdXRNcyIsInVubG9jayIsInVubG9ja0tleSIsInVubG9ja1R5cGUiLCJ1bmxvY2tTdHJhdGVneSIsInVubG9ja1N1Y2Nlc3NUaW1lb3V0IiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2dlbmVyYWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhbmRyb2lkSGVscGVycyBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBsb25nU2xlZXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuY29uc3QgTU9NRU5UX0ZPUk1BVF9JU084NjAxID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb21tYW5kcy5rZXlzID0gYXN5bmMgZnVuY3Rpb24ga2V5cyAoa2V5cykge1xuICAvLyBQcm90b2NvbCBzZW5kcyBhbiBhcnJheTsgcmV0aGluayBhcHByb2FjaFxuICBrZXlzID0gXy5pc0FycmF5KGtleXMpID8ga2V5cy5qb2luKCcnKSA6IGtleXM7XG4gIGxldCBwYXJhbXMgPSB7XG4gICAgdGV4dDoga2V5cyxcbiAgICByZXBsYWNlOiBmYWxzZVxuICB9O1xuICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCkge1xuICAgIHBhcmFtcy51bmljb2RlS2V5Ym9hcmQgPSB0cnVlO1xuICB9XG4gIGF3YWl0IHRoaXMuZG9TZW5kS2V5cyhwYXJhbXMpO1xufTtcblxuY29tbWFuZHMuZG9TZW5kS2V5cyA9IGFzeW5jIGZ1bmN0aW9uIGRvU2VuZEtleXMgKHBhcmFtcykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc2V0VGV4dCcsIHBhcmFtcyk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBkZXZpY2UncyB0aW1lc3RhbXAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIFRoZSBzZXQgb2YgZm9ybWF0IHNwZWNpZmllcnMuIFJlYWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRldGltZSBmb3JtYXQgc3BlY2lmaWVycy4gVGhlIGRlZmF1bHQgZm9ybWF0IGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYFlZWVktTU0tRERUSEg6bW06c3NaYCwgd2hpY2ggY29tcGxpZXMgdG8gSVNPLTg2MDFcbiAqIEByZXR1cm4ge3N0cmluZ30gRm9ybWF0dGVkIGRhdGV0aW1lIHN0cmluZyBvciB0aGUgcmF3IGNvbW1hbmQgb3V0cHV0IGlmIGZvcm1hdHRpbmcgZmFpbHNcbiAqL1xuY29tbWFuZHMuZ2V0RGV2aWNlVGltZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVRpbWUgKGZvcm1hdCA9IE1PTUVOVF9GT1JNQVRfSVNPODYwMSkge1xuICB0aGlzLmxvZy5kZWJ1ZygnQXR0ZW1wdGluZyB0byBjYXB0dXJlIGFuZHJvaWQgZGV2aWNlIGRhdGUgYW5kIHRpbWUuICcgK1xuICAgIGBUaGUgZm9ybWF0IHNwZWNpZmllciBpcyAnJHtmb3JtYXR9J2ApO1xuICBjb25zdCBkZXZpY2VUaW1lc3RhbXAgPSAoYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkYXRlJywgJyslWS0lbS0lZFQlVCV6J10pKS50cmltKCk7XG4gIHRoaXMubG9nLmRlYnVnKGBHb3QgZGV2aWNlIHRpbWVzdGFtcDogJHtkZXZpY2VUaW1lc3RhbXB9YCk7XG4gIGNvbnN0IHBhcnNlZFRpbWVzdGFtcCA9IG1vbWVudC51dGMoZGV2aWNlVGltZXN0YW1wLCAnWVlZWS1NTS1ERFRISDptbTpzc1paJyk7XG4gIGlmICghcGFyc2VkVGltZXN0YW1wLmlzVmFsaWQoKSkge1xuICAgIHRoaXMubG9nLndhcm4oJ0Nhbm5vdCBwYXJzZSB0aGUgcmV0dXJuZWQgdGltZXN0YW1wLiBSZXR1cm5pbmcgYXMgaXMnKTtcbiAgICByZXR1cm4gZGV2aWNlVGltZXN0YW1wO1xuICB9XG4gIHJldHVybiBwYXJzZWRUaW1lc3RhbXAudXRjT2Zmc2V0KHBhcnNlZFRpbWVzdGFtcC5fdHptIHx8IDApLmZvcm1hdChmb3JtYXQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXZpY2VUaW1lT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1hdCBbWVlZWS1NTS1ERFRISDptbTpzc1pdIC0gU2VlIGdldERldmljZVRpbWUjZm9ybWF0XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZGV2aWNlIHRpbWVcbiAqXG4gKiBAcGFyYW0ge0RldmljZVRpbWVPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZvcm1hdHRlZCBkYXRldGltZSBzdHJpbmcgb3IgdGhlIHJhdyBjb21tYW5kIG91dHB1dCBpZiBmb3JtYXR0aW5nIGZhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldERldmljZVRpbWUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXREZXZpY2VUaW1lIChvcHRzID0ge30pIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlVGltZShvcHRzLmZvcm1hdCk7XG59O1xuXG5jb21tYW5kcy5nZXRQYWdlU291cmNlID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGFnZVNvdXJjZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdzb3VyY2UnKTtcbn07XG5cbmNvbW1hbmRzLmJhY2sgPSBhc3luYyBmdW5jdGlvbiBiYWNrICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3ByZXNzQmFjaycpO1xufTtcblxuY29tbWFuZHMub3BlblNldHRpbmdzQWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBvcGVuU2V0dGluZ3NBY3Rpdml0eSAoc2V0dGluZykge1xuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcbiAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydhbScsICdzdGFydCcsICctYScsIGBhbmRyb2lkLnNldHRpbmdzLiR7c2V0dGluZ31gXSk7XG4gIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG59O1xuXG5jb21tYW5kcy5nZXRXaW5kb3dTaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93U2l6ZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdnZXREZXZpY2VTaXplJyk7XG59O1xuXG4vLyBGb3IgVzNDXG5jb21tYW5kcy5nZXRXaW5kb3dSZWN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93UmVjdCAoKSB7XG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYXdhaXQgdGhpcy5nZXRXaW5kb3dTaXplKCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xufTtcblxuY29tbWFuZHMuZ2V0Q3VycmVudEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudEFjdGl2aXR5ICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCkpLmFwcEFjdGl2aXR5O1xufTtcblxuY29tbWFuZHMuZ2V0Q3VycmVudFBhY2thZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50UGFja2FnZSAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpKS5hcHBQYWNrYWdlO1xufTtcblxuY29tbWFuZHMuYmFja2dyb3VuZCA9IGFzeW5jIGZ1bmN0aW9uIGJhY2tncm91bmQgKHNlY29uZHMpIHtcbiAgaWYgKHNlY29uZHMgPCAwKSB7XG4gICAgLy8gaWYgdXNlciBwYXNzZXMgaW4gYSBuZWdhdGl2ZSBzZWNvbmRzIHZhbHVlLCBpbnRlcnByZXQgdGhhdCBhcyB0aGUgaW5zdHJ1Y3Rpb25cbiAgICAvLyB0byBub3QgYnJpbmcgdGhlIGFwcCBiYWNrIGF0IGFsbFxuICAgIGF3YWl0IHRoaXMuYWRiLmdvVG9Ib21lKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgbGV0IHthcHBQYWNrYWdlLCBhcHBBY3Rpdml0eX0gPSBhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCk7XG4gIGF3YWl0IHRoaXMuYWRiLmdvVG9Ib21lKCk7XG5cbiAgLy8gcGVvcGxlIGNhbiB3YWl0IGZvciBhIGxvbmcgdGltZSwgc28gdG8gYmUgc2FmZSBsZXQncyB1c2UgdGhlIGxvbmdTbGVlcCBmdW5jdGlvbiBhbmQgbG9nXG4gIC8vIHByb2dyZXNzIHBlcmlvZGljYWxseS5cbiAgY29uc3Qgc2xlZXBNcyA9IHNlY29uZHMgKiAxMDAwO1xuICBjb25zdCB0aHJlc2hvbGRNcyA9IDMwICogMTAwMDsgLy8gdXNlIHRoZSBzcGluLXdhaXQgZm9yIGFueXRoaW5nIG92ZXIgdGhpcyB0aHJlc2hvbGRcbiAgLy8gZm9yIG91ciBzcGluIGludGVydmFsLCB1c2UgMSUgb2YgdGhlIHRvdGFsIHdhaXQgdGltZSwgYnV0IG5vdGhpbmcgYmlnZ2VyIHRoYW4gMzBzXG4gIGNvbnN0IGludGVydmFsTXMgPSBfLm1pbihbMzAgKiAxMDAwLCBwYXJzZUludChzbGVlcE1zIC8gMTAwLCAxMCldKTtcbiAgY29uc3QgcHJvZ3Jlc3NDYiA9ICh7ZWxhcHNlZE1zLCBwcm9ncmVzc30pID0+IHtcbiAgICBjb25zdCB3YWl0U2VjcyA9IChlbGFwc2VkTXMgLyAxMDAwKS50b0ZpeGVkKDApO1xuICAgIGNvbnN0IHByb2dyZXNzUGN0ID0gKHByb2dyZXNzICogMTAwKS50b0ZpeGVkKDIpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBXYWl0ZWQgJHt3YWl0U2Vjc31zIHNvIGZhciAoJHtwcm9ncmVzc1BjdH0lKWApO1xuICB9O1xuICBhd2FpdCBsb25nU2xlZXAoc2xlZXBNcywge3RocmVzaG9sZE1zLCBpbnRlcnZhbE1zLCBwcm9ncmVzc0NifSk7XG5cbiAgbGV0IGFyZ3M7XG4gIGlmICh0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3MgJiYgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FwcFBhY2thZ2V9LyR7YXBwQWN0aXZpdHl9YF0pIHtcbiAgICAvLyB0aGUgYWN0aXZpdHkgd2FzIHN0YXJ0ZWQgd2l0aCBgc3RhcnRBY3Rpdml0eWAsIHNvIHVzZSB0aG9zZSBhcmdzIHRvIHJlc3RhcnRcbiAgICBhcmdzID0gdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FwcFBhY2thZ2V9LyR7YXBwQWN0aXZpdHl9YF07XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBBY3RpdmF0aW5nIGFwcCAnJHthcHBQYWNrYWdlfScgaW4gb3JkZXIgdG8gcmVzdG9yZSBpdGApO1xuICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZUFwcChhcHBQYWNrYWdlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICBhcmdzID0gKChhcHBQYWNrYWdlID09PSB0aGlzLm9wdHMuYXBwUGFja2FnZSAmJiBhcHBBY3Rpdml0eSA9PT0gdGhpcy5vcHRzLmFwcEFjdGl2aXR5KSB8fFxuICAgICAgICAgICAgKGFwcFBhY2thZ2UgPT09IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSAmJiAodGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSB8fCAnJykuc3BsaXQoJywnKS5pbmNsdWRlcyhhcHBBY3Rpdml0eSkpKVxuICAgICAgPyB7Ly8gdGhlIGFjdGl2aXR5IGlzIHRoZSBvcmlnaW5hbCBzZXNzaW9uIGFjdGl2aXR5LCBzbyB1c2UgdGhlIG9yaWdpbmFsIGFyZ3NcbiAgICAgICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgICAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgICAgc3RvcEFwcDogZmFsc2UsXG4gICAgICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZX1cbiAgICAgIDogey8vIHRoZSBhY3Rpdml0eSB3YXMgc3RhcnRlZCBzb21lIG90aGVyIHdheSwgc28gdXNlIGRlZmF1bHRzXG4gICAgICAgIHBrZzogYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgICAgICB3YWl0UGtnOiBhcHBQYWNrYWdlLFxuICAgICAgICB3YWl0QWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgICAgICBzdG9wQXBwOiBmYWxzZX07XG4gIH1cbiAgYXJncyA9IGF3YWl0IHV0aWwuZmlsdGVyT2JqZWN0KGFyZ3MpO1xuICB0aGlzLmxvZy5kZWJ1ZyhgQnJpbmdpbmcgYXBwbGljYXRpb24gYmFjayB0byBmb3JlZ3JvdW5kIHdpdGggYXJndW1lbnRzOiAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoYXJncyk7XG59O1xuXG5jb21tYW5kcy5nZXRTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gZ2V0U3RyaW5ncyAobGFuZ3VhZ2UpIHtcbiAgaWYgKCFsYW5ndWFnZSkge1xuICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5hZGIuZ2V0RGV2aWNlTGFuZ3VhZ2UoKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBObyBsYW5ndWFnZSBzcGVjaWZpZWQsIHJldHVybmluZyBzdHJpbmdzIGZvcjogJHtsYW5ndWFnZX1gKTtcbiAgfVxuXG4gIC8vIENsaWVudHMgcmVxdWlyZSB0aGUgcmVzdWx0aW5nIG1hcHBpbmcgdG8gaGF2ZSBib3RoIGtleXNcbiAgLy8gYW5kIHZhbHVlcyBvZiB0eXBlIHN0cmluZ1xuICBjb25zdCBwcmVwcm9jZXNzU3RyaW5nc01hcCA9IChtYXBwaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKG1hcHBpbmcpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IF8uaXNTdHJpbmcodmFsdWUpID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgaWYgKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIHN0cmluZ3NcbiAgICByZXR1cm4gcHJlcHJvY2Vzc1N0cmluZ3NNYXAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSk7XG4gIH1cblxuICB0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMucHVzaFN0cmluZ3MobGFuZ3VhZ2UsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBpZiAodGhpcy5ib290c3RyYXApIHtcbiAgICAvLyBUT0RPOiBUaGlzIGlzIG11dGF0aW5nIHRoZSBjdXJyZW50IGxhbmd1YWdlLCBidXQgaXQncyBob3cgYXBwaXVtIGN1cnJlbnRseSB3b3Jrc1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3VwZGF0ZVN0cmluZ3MnKTtcbiAgfVxuXG4gIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbn07XG5cbmNvbW1hbmRzLmxhdW5jaEFwcCA9IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaEFwcCAoKSB7XG4gIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuICBhd2FpdCB0aGlzLnN0YXJ0QVVUKCk7XG59O1xuXG5jb21tYW5kcy5zdGFydEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBY3Rpdml0eSAoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksXG4gIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHksIGludGVudEFjdGlvbiwgaW50ZW50Q2F0ZWdvcnksIGludGVudEZsYWdzLFxuICBvcHRpb25hbEludGVudEFyZ3VtZW50cywgZG9udFN0b3BBcHBPblJlc2V0KSB7XG4gIHRoaXMubG9nLmRlYnVnKGBTdGFydGluZyBwYWNrYWdlICcke2FwcFBhY2thZ2V9JyBhbmQgYWN0aXZpdHkgJyR7YXBwQWN0aXZpdHl9J2ApO1xuXG4gIC8vIGRvbnRTdG9wQXBwT25SZXNldCBpcyBib3RoIGFuIGFyZ3VtZW50IGhlcmUsIGFuZCBhIGRlc2lyZWQgY2FwYWJpbGl0eVxuICAvLyBpZiB0aGUgYXJndW1lbnQgaXMgc2V0LCB1c2UgaXQsIG90aGVyd2lzZSB1c2UgdGhlIGNhcFxuICBpZiAoIXV0aWwuaGFzVmFsdWUoZG9udFN0b3BBcHBPblJlc2V0KSkge1xuICAgIGRvbnRTdG9wQXBwT25SZXNldCA9ICEhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldDtcbiAgfVxuXG4gIGxldCBhcmdzID0ge1xuICAgIHBrZzogYXBwUGFja2FnZSxcbiAgICBhY3Rpdml0eTogYXBwQWN0aXZpdHksXG4gICAgd2FpdFBrZzogYXBwV2FpdFBhY2thZ2UgfHwgYXBwUGFja2FnZSxcbiAgICB3YWl0QWN0aXZpdHk6IGFwcFdhaXRBY3Rpdml0eSB8fCBhcHBBY3Rpdml0eSxcbiAgICBhY3Rpb246IGludGVudEFjdGlvbixcbiAgICBjYXRlZ29yeTogaW50ZW50Q2F0ZWdvcnksXG4gICAgZmxhZ3M6IGludGVudEZsYWdzLFxuICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgIHN0b3BBcHA6ICFkb250U3RvcEFwcE9uUmVzZXRcbiAgfTtcbiAgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzID0gdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzIHx8IHt9O1xuICB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXJncy53YWl0UGtnfS8ke2FyZ3Mud2FpdEFjdGl2aXR5fWBdID0gYXJncztcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoYXJncyk7XG59O1xuXG5jb21tYW5kcy5yZXNldCA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0ICgpIHtcbiAgYXdhaXQgYW5kcm9pZEhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywge2Zhc3RSZXNldDogdHJ1ZX0pKTtcbiAgLy8gcmVzZXQgY29udGV4dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvbiBjb250ZXh0IHdlIHdpbGwgZW5kIHVwIGFmdGVyIGFwcCBsYXVuY2guXG4gIGF3YWl0IHRoaXMuc2V0Q29udGV4dCgpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5pc0Nocm9tZVNlc3Npb24gPyB0aGlzLnN0YXJ0Q2hyb21lU2Vzc2lvbigpIDogdGhpcy5zdGFydEFVVCgpO1xufTtcblxuY29tbWFuZHMuc3RhcnRBVVQgPSBhc3luYyBmdW5jdGlvbiBzdGFydEFVVCAoKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKHtcbiAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgIGFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgIGNhdGVnb3J5OiB0aGlzLm9wdHMuaW50ZW50Q2F0ZWdvcnksXG4gICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyxcbiAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgd2FpdEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5LFxuICAgIHdhaXRGb3JMYXVuY2g6IHRoaXMub3B0cy5hcHBXYWl0Rm9yTGF1bmNoLFxuICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICBvcHRpb25hbEludGVudEFyZ3VtZW50czogdGhpcy5vcHRzLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgIHN0b3BBcHA6ICF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0LFxuICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZSxcbiAgfSk7XG59O1xuXG4vLyB3ZSBvdmVycmlkZSBzZXRVcmwgdG8gdGFrZSBhbiBhbmRyb2lkIFVSSSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZGVlcC1saW5raW5nXG4vLyBpbnNpZGUgYW4gYXBwLCBzaW1pbGFyIHRvIHN0YXJ0aW5nIGFuIGludGVudFxuY29tbWFuZHMuc2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gc2V0VXJsICh1cmkpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJpLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG59O1xuXG4vLyBjbG9zaW5nIGFwcCB1c2luZyBmb3JjZSBzdG9wXG5jb21tYW5kcy5jbG9zZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQXBwICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgLy8gcmVzZXQgY29udGV4dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvbiBjb250ZXh0IHdlIHdpbGwgZW5kIHVwIGFmdGVyIGFwcCBsYXVuY2guXG4gIGF3YWl0IHRoaXMuc2V0Q29udGV4dCgpO1xufTtcblxuY29tbWFuZHMuZ2V0RGlzcGxheURlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXREaXNwbGF5RGVuc2l0eSAoKSB7XG4gIC8vIGZpcnN0IHRyeSB0aGUgcHJvcGVydHkgZm9yIGRldmljZXNcbiAgbGV0IG91dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZ2V0cHJvcCcsICdyby5zZi5sY2RfZGVuc2l0eSddKTtcbiAgaWYgKG91dCkge1xuICAgIGxldCB2YWwgPSBwYXJzZUludChvdXQsIDEwKTtcbiAgICAvLyBpZiB0aGUgdmFsdWUgaXMgTmFOLCB0cnkgZ2V0dGluZyB0aGUgZW11bGF0b3IgcHJvcGVydHlcbiAgICBpZiAoIWlzTmFOKHZhbCkpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgZGVuc2l0eSB2YWx1ZSB3YXMgTmFOOiBcIiR7b3V0fVwiYCk7XG4gIH1cbiAgLy8gZmFsbGJhY2sgdG8gdHJ5aW5nIHByb3BlcnR5IGZvciBlbXVsYXRvcnNcbiAgb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydnZXRwcm9wJywgJ3FlbXUuc2YubGNkX2RlbnNpdHknXSk7XG4gIGlmIChvdXQpIHtcbiAgICBsZXQgdmFsID0gcGFyc2VJbnQob3V0LCAxMCk7XG4gICAgaWYgKCFpc05hTih2YWwpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIGRlbnNpdHkgdmFsdWUgd2FzIE5hTjogXCIke291dH1cImApO1xuICB9XG4gIC8vIGNvdWxkbid0IGdldCBhbnl0aGluZywgc28gZXJyb3Igb3V0XG4gIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ0ZhaWxlZCB0byBnZXQgZGlzcGxheSBkZW5zaXR5IHByb3BlcnR5LicpO1xufTtcblxuY29tbWFuZHMubW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7YWN0aW9ufSA9IG9wdHM7XG4gIGlmICghdXRpbC5oYXNWYWx1ZShhY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ2FjdGlvbicgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMuYWRiLnBlcmZvcm1FZGl0b3JBY3Rpb24oYWN0aW9uKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHJlY2VudCBzeXN0ZW0gbm90aWZpY2F0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXROb3RpZmljYXRpb25zYCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVHZXROb3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Tm90aWZpY2F0aW9ucyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXROb3RpZmljYXRpb25zKCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNtc0xpc3RPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4IFsxMDBdIC0gVGhlIG1heGltdW0gY291bnQgb2YgcmVjZW50IFNNUyBtZXNzYWdlc1xuICogdG8gcmV0cmlldmVcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiByZWNlbnQgU01TIG1lc3NhZ2VzIHdpdGggdGhlaXIgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge1Ntc0xpc3RPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXRTbXNMaXN0YCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVMaXN0U21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTGlzdFNtcyAob3B0cyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXRTbXNMaXN0KG9wdHMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmxvY2tPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30ga2V5IFRoZSB1bmxvY2sga2V5LiBUaGUgdmFsdWUgb2YgdGhpcyBrZXkgZGVwZW5kc1xuICogb24gdGhlIGFjdHVhbCB1bmxvY2sgdHlwZSBhbmQgY291bGQgYmUgYSBwaW4vcGFzc3dvcmQvcGF0dGVybiB2YWx1ZSBvclxuICogYSBiaW9tZXRyaWMgZmluZ2VyIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgVGhlIHVubG9jayB0eXBlLiBUaGUgZm9sbG93aW5nIHVubG9jayB0eXBlc1xuICogYXJlIHN1cHBvcnRlZDogYHBpbmAsIGBwaW5XaXRoS2V5RXZlbnRgLCBgcGFzc3dvcmRgLCBgcGF0dGVybmAgYW5kIGBmaW5nZXJwcmludGAuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHN0cmF0ZWd5IEVpdGhlciAnbG9ja3NldHRpbmdzJyAoZGVmYXVsdCkgb3IgJ3VpYXV0b21hdG9yJy5cbiAqIFNldHRpbmcgaXQgdG8gJ3VpYXV0b21hdG9yJyB3aWxsIGVuZm9yY2UgdGhlIGRyaXZlciB0byBhdm9pZCB1c2luZyBzcGVjaWFsXG4gKiBBREIgc2hvcnRjdXRzIGluIG9yZGVyIHRvIHNwZWVkIHVwIHRoZSB1bmxvY2sgcHJvY2VkdXJlLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0aW1lb3V0TXMgWzIwMDBdIFRoZSBtYXhpbXVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiB0byB3YWl0IHVudGlsIHRoZSBzY3JlZW4gZ2V0cyB1bmxvY2tlZFxuICovXG5cbi8qKlxuICogVW5sb2NrcyB0aGUgZGV2aWNlIGlmIGl0IGlzIGxvY2tlZC4gTm9vcCBpZiB0aGUgZGV2aWNlJ3Mgc2NyZWVuIGlzIG5vdCBsb2NrZWQuXG4gKlxuICogQHBhcmFtIHs/VW5sb2NrT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHVubG9jayBvcGVyYXRpb24gZmFpbHMgb3IgdGhlIHByb3ZpZGVkXG4gKiBhcmd1bWVudHMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVVbmxvY2sgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGtleSwgdHlwZSwgc3RyYXRlZ3ksIHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgYW5kcm9pZEhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB7XG4gICAgdW5sb2NrS2V5OiBrZXksXG4gICAgdW5sb2NrVHlwZTogdHlwZSxcbiAgICB1bmxvY2tTdHJhdGVneTogc3RyYXRlZ3ksXG4gICAgdW5sb2NrU3VjY2Vzc1RpbWVvdXQ6IHRpbWVvdXRNcyxcbiAgfSk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGVBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLFNBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUwsT0FBQTtBQUVBLE1BQU1NLHFCQUFxQixHQUFHLHNCQUFzQjtBQUVwRCxJQUFJQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUFDQyxPQUFBLENBQUFGLE9BQUEsR0FBQUEsT0FBQTtBQUFBRSxPQUFBLENBQUFILFFBQUEsR0FBQUEsUUFBQTtBQUVqREEsUUFBUSxDQUFDSSxJQUFJLEdBQUcsZUFBZUEsSUFBSUEsQ0FBRUEsSUFBSSxFQUFFO0VBRXpDQSxJQUFJLEdBQUdDLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDRixJQUFJLENBQUMsR0FBR0EsSUFBSSxDQUFDRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUdILElBQUk7RUFDN0MsSUFBSUksTUFBTSxHQUFHO0lBQ1hDLElBQUksRUFBRUwsSUFBSTtJQUNWTSxPQUFPLEVBQUU7RUFDWCxDQUFDO0VBQ0QsSUFBSSxJQUFJLENBQUNDLElBQUksQ0FBQ0MsZUFBZSxFQUFFO0lBQzdCSixNQUFNLENBQUNJLGVBQWUsR0FBRyxJQUFJO0VBQy9CO0VBQ0EsTUFBTSxJQUFJLENBQUNDLFVBQVUsQ0FBQ0wsTUFBTSxDQUFDO0FBQy9CLENBQUM7QUFFRFIsUUFBUSxDQUFDYSxVQUFVLEdBQUcsZUFBZUEsVUFBVUEsQ0FBRUwsTUFBTSxFQUFFO0VBQ3ZELE9BQU8sTUFBTSxJQUFJLENBQUNNLFNBQVMsQ0FBQ0MsVUFBVSxDQUFDLFNBQVMsRUFBRVAsTUFBTSxDQUFDO0FBQzNELENBQUM7QUFXRFIsUUFBUSxDQUFDZ0IsYUFBYSxHQUFHLGVBQWVBLGFBQWFBLENBQUVDLE1BQU0sR0FBR2xCLHFCQUFxQixFQUFFO0VBQ3JGLElBQUksQ0FBQ21CLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLHNEQUFzRCxHQUNsRSw0QkFBMkJGLE1BQU8sR0FBRSxDQUFDO0VBQ3hDLE1BQU1HLGVBQWUsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDQyxHQUFHLENBQUNDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUVDLElBQUksRUFBRTtFQUNqRixJQUFJLENBQUNMLEdBQUcsQ0FBQ0MsS0FBSyxDQUFFLHlCQUF3QkMsZUFBZ0IsRUFBQyxDQUFDO0VBQzFELE1BQU1JLGVBQWUsR0FBR0MsZUFBTSxDQUFDQyxHQUFHLENBQUNOLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQztFQUM1RSxJQUFJLENBQUNJLGVBQWUsQ0FBQ0csT0FBTyxFQUFFLEVBQUU7SUFDOUIsSUFBSSxDQUFDVCxHQUFHLENBQUNVLElBQUksQ0FBQyxzREFBc0QsQ0FBQztJQUNyRSxPQUFPUixlQUFlO0VBQ3hCO0VBQ0EsT0FBT0ksZUFBZSxDQUFDSyxTQUFTLENBQUNMLGVBQWUsQ0FBQ00sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDYixNQUFNLENBQUNBLE1BQU0sQ0FBQztBQUM1RSxDQUFDO0FBYURqQixRQUFRLENBQUMrQixtQkFBbUIsR0FBRyxlQUFlQSxtQkFBbUJBLENBQUVwQixJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDNUUsT0FBTyxNQUFNLElBQUksQ0FBQ0ssYUFBYSxDQUFDTCxJQUFJLENBQUNNLE1BQU0sQ0FBQztBQUM5QyxDQUFDO0FBRURqQixRQUFRLENBQUNnQyxhQUFhLEdBQUcsZUFBZUEsYUFBYUEsQ0FBQSxFQUFJO0VBQ3ZELE9BQU8sTUFBTSxJQUFJLENBQUNsQixTQUFTLENBQUNDLFVBQVUsQ0FBQyxRQUFRLENBQUM7QUFDbEQsQ0FBQztBQUVEZixRQUFRLENBQUNpQyxJQUFJLEdBQUcsZUFBZUEsSUFBSUEsQ0FBQSxFQUFJO0VBQ3JDLE9BQU8sTUFBTSxJQUFJLENBQUNuQixTQUFTLENBQUNDLFVBQVUsQ0FBQyxXQUFXLENBQUM7QUFDckQsQ0FBQztBQUVEZixRQUFRLENBQUNrQyxvQkFBb0IsR0FBRyxlQUFlQSxvQkFBb0JBLENBQUVDLE9BQU8sRUFBRTtFQUM1RSxJQUFJO0lBQUNDLFVBQVU7SUFBRUM7RUFBVyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUNoQixHQUFHLENBQUNpQiw0QkFBNEIsRUFBRTtFQUM3RSxNQUFNLElBQUksQ0FBQ2pCLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUcsb0JBQW1CYSxPQUFRLEVBQUMsQ0FBQyxDQUFDO0VBQzFFLE1BQU0sSUFBSSxDQUFDZCxHQUFHLENBQUNrQixrQkFBa0IsQ0FBQ0gsVUFBVSxFQUFFQyxXQUFXLEVBQUUsSUFBSSxDQUFDO0FBQ2xFLENBQUM7QUFFRHJDLFFBQVEsQ0FBQ3dDLGFBQWEsR0FBRyxlQUFlQSxhQUFhQSxDQUFBLEVBQUk7RUFDdkQsT0FBTyxNQUFNLElBQUksQ0FBQzFCLFNBQVMsQ0FBQ0MsVUFBVSxDQUFDLGVBQWUsQ0FBQztBQUN6RCxDQUFDO0FBR0RmLFFBQVEsQ0FBQ3lDLGFBQWEsR0FBRyxlQUFlQSxhQUFhQSxDQUFBLEVBQUk7RUFDdkQsTUFBTTtJQUFFQyxLQUFLO0lBQUVDO0VBQU8sQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDSCxhQUFhLEVBQUU7RUFDcEQsT0FBTztJQUNMRSxLQUFLO0lBQ0xDLE1BQU07SUFDTkMsQ0FBQyxFQUFFLENBQUM7SUFDSkMsQ0FBQyxFQUFFO0VBQ0wsQ0FBQztBQUNILENBQUM7QUFFRDdDLFFBQVEsQ0FBQzhDLGtCQUFrQixHQUFHLGVBQWVBLGtCQUFrQkEsQ0FBQSxFQUFJO0VBQ2pFLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQ3pCLEdBQUcsQ0FBQ2lCLDRCQUE0QixFQUFFLEVBQUVELFdBQVc7QUFDcEUsQ0FBQztBQUVEckMsUUFBUSxDQUFDK0MsaUJBQWlCLEdBQUcsZUFBZUEsaUJBQWlCQSxDQUFBLEVBQUk7RUFDL0QsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDMUIsR0FBRyxDQUFDaUIsNEJBQTRCLEVBQUUsRUFBRUYsVUFBVTtBQUNuRSxDQUFDO0FBRURwQyxRQUFRLENBQUNnRCxVQUFVLEdBQUcsZUFBZUEsVUFBVUEsQ0FBRUMsT0FBTyxFQUFFO0VBQ3hELElBQUlBLE9BQU8sR0FBRyxDQUFDLEVBQUU7SUFHZixNQUFNLElBQUksQ0FBQzVCLEdBQUcsQ0FBQzZCLFFBQVEsRUFBRTtJQUN6QixPQUFPLElBQUk7RUFDYjtFQUNBLElBQUk7SUFBQ2QsVUFBVTtJQUFFQztFQUFXLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQ2hCLEdBQUcsQ0FBQ2lCLDRCQUE0QixFQUFFO0VBQzdFLE1BQU0sSUFBSSxDQUFDakIsR0FBRyxDQUFDNkIsUUFBUSxFQUFFO0VBSXpCLE1BQU1DLE9BQU8sR0FBR0YsT0FBTyxHQUFHLElBQUk7RUFDOUIsTUFBTUcsV0FBVyxHQUFHLEVBQUUsR0FBRyxJQUFJO0VBRTdCLE1BQU1DLFVBQVUsR0FBR2hELGVBQUMsQ0FBQ2lELEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUVDLFFBQVEsQ0FBQ0osT0FBTyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQ2xFLE1BQU1LLFVBQVUsR0FBR0EsQ0FBQztJQUFDQyxTQUFTO0lBQUVDO0VBQVEsQ0FBQyxLQUFLO0lBQzVDLE1BQU1DLFFBQVEsR0FBRyxDQUFDRixTQUFTLEdBQUcsSUFBSSxFQUFFRyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzlDLE1BQU1DLFdBQVcsR0FBRyxDQUFDSCxRQUFRLEdBQUcsR0FBRyxFQUFFRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQy9DLElBQUksQ0FBQzFDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFFLFVBQVN3QyxRQUFTLGFBQVlFLFdBQVksSUFBRyxDQUFDO0VBQ2hFLENBQUM7RUFDRCxNQUFNLElBQUFDLG1CQUFTLEVBQUNYLE9BQU8sRUFBRTtJQUFDQyxXQUFXO0lBQUVDLFVBQVU7SUFBRUc7RUFBVSxDQUFDLENBQUM7RUFFL0QsSUFBSU8sSUFBSTtFQUNSLElBQUksSUFBSSxDQUFDQyxtQkFBbUIsSUFBSSxJQUFJLENBQUNBLG1CQUFtQixDQUFFLEdBQUU1QixVQUFXLElBQUdDLFdBQVksRUFBQyxDQUFDLEVBQUU7SUFFeEYwQixJQUFJLEdBQUcsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBRSxHQUFFNUIsVUFBVyxJQUFHQyxXQUFZLEVBQUMsQ0FBQztFQUNqRSxDQUFDLE1BQU07SUFDTCxJQUFJO01BQ0YsSUFBSSxDQUFDbkIsR0FBRyxDQUFDQyxLQUFLLENBQUUsbUJBQWtCaUIsVUFBVywwQkFBeUIsQ0FBQztNQUN2RSxNQUFNLElBQUksQ0FBQzZCLFdBQVcsQ0FBQzdCLFVBQVUsQ0FBQztNQUNsQyxPQUFPLElBQUk7SUFDYixDQUFDLENBQUMsT0FBTzhCLEdBQUcsRUFBRSxDQUFDO0lBQ2ZILElBQUksR0FBSzNCLFVBQVUsS0FBSyxJQUFJLENBQUN6QixJQUFJLENBQUN5QixVQUFVLElBQUlDLFdBQVcsS0FBSyxJQUFJLENBQUMxQixJQUFJLENBQUMwQixXQUFXLElBQzVFRCxVQUFVLEtBQUssSUFBSSxDQUFDekIsSUFBSSxDQUFDd0QsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDeEQsSUFBSSxDQUFDeUQsZUFBZSxJQUFJLEVBQUUsRUFBRUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDQyxRQUFRLENBQUNqQyxXQUFXLENBQUUsR0FDbkg7TUFDQWtDLEdBQUcsRUFBRSxJQUFJLENBQUM1RCxJQUFJLENBQUN5QixVQUFVO01BQ3pCb0MsUUFBUSxFQUFFLElBQUksQ0FBQzdELElBQUksQ0FBQzBCLFdBQVc7TUFDL0JvQyxNQUFNLEVBQUUsSUFBSSxDQUFDOUQsSUFBSSxDQUFDK0QsWUFBWTtNQUM5QkMsUUFBUSxFQUFFLElBQUksQ0FBQ2hFLElBQUksQ0FBQ2lFLGNBQWM7TUFDbENDLEtBQUssRUFBRSxJQUFJLENBQUNsRSxJQUFJLENBQUNtRSxXQUFXO01BQzVCQyxPQUFPLEVBQUUsSUFBSSxDQUFDcEUsSUFBSSxDQUFDd0QsY0FBYztNQUNqQ2EsWUFBWSxFQUFFLElBQUksQ0FBQ3JFLElBQUksQ0FBQ3lELGVBQWU7TUFDdkNhLGFBQWEsRUFBRSxJQUFJLENBQUN0RSxJQUFJLENBQUN1RSxnQkFBZ0I7TUFDekNDLFlBQVksRUFBRSxJQUFJLENBQUN4RSxJQUFJLENBQUN5RSxlQUFlO01BQ3ZDQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMxRSxJQUFJLENBQUMwRSx1QkFBdUI7TUFDMURDLE9BQU8sRUFBRSxLQUFLO01BQ2RDLElBQUksRUFBRSxJQUFJLENBQUM1RSxJQUFJLENBQUM2RTtJQUFXLENBQUMsR0FDNUI7TUFDQWpCLEdBQUcsRUFBRW5DLFVBQVU7TUFDZm9DLFFBQVEsRUFBRW5DLFdBQVc7TUFDckIwQyxPQUFPLEVBQUUzQyxVQUFVO01BQ25CNEMsWUFBWSxFQUFFM0MsV0FBVztNQUN6QmlELE9BQU8sRUFBRTtJQUFLLENBQUM7RUFDckI7RUFDQXZCLElBQUksR0FBRyxNQUFNMEIsYUFBSSxDQUFDQyxZQUFZLENBQUMzQixJQUFJLENBQUM7RUFDcEMsSUFBSSxDQUFDN0MsR0FBRyxDQUFDQyxLQUFLLENBQUUsMkRBQTBEd0UsSUFBSSxDQUFDQyxTQUFTLENBQUM3QixJQUFJLENBQUUsRUFBQyxDQUFDO0VBQ2pHLE9BQU8sTUFBTSxJQUFJLENBQUMxQyxHQUFHLENBQUN3RSxRQUFRLENBQUM5QixJQUFJLENBQUM7QUFDdEMsQ0FBQztBQUVEL0QsUUFBUSxDQUFDOEYsVUFBVSxHQUFHLGVBQWVBLFVBQVVBLENBQUVDLFFBQVEsRUFBRTtFQUN6RCxJQUFJLENBQUNBLFFBQVEsRUFBRTtJQUNiQSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMxRSxHQUFHLENBQUMyRSxpQkFBaUIsRUFBRTtJQUM3QyxJQUFJLENBQUM5RSxHQUFHLENBQUMrRSxJQUFJLENBQUUsaURBQWdERixRQUFTLEVBQUMsQ0FBQztFQUM1RTtFQUlBLE1BQU1HLG9CQUFvQixHQUFJQyxPQUFPLElBQUs7SUFDeEMsTUFBTUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNqQixLQUFLLE1BQU0sQ0FBQ0MsR0FBRyxFQUFFQyxLQUFLLENBQUMsSUFBSWpHLGVBQUMsQ0FBQ2tHLE9BQU8sQ0FBQ0osT0FBTyxDQUFDLEVBQUU7TUFDN0NDLE1BQU0sQ0FBQ0MsR0FBRyxDQUFDLEdBQUdoRyxlQUFDLENBQUNtRyxRQUFRLENBQUNGLEtBQUssQ0FBQyxHQUFHQSxLQUFLLEdBQUdYLElBQUksQ0FBQ0MsU0FBUyxDQUFDVSxLQUFLLENBQUM7SUFDakU7SUFDQSxPQUFPRixNQUFNO0VBQ2YsQ0FBQztFQUVELElBQUksSUFBSSxDQUFDSyxVQUFVLENBQUNWLFFBQVEsQ0FBQyxFQUFFO0lBRTdCLE9BQU9HLG9CQUFvQixDQUFDLElBQUksQ0FBQ08sVUFBVSxDQUFDVixRQUFRLENBQUMsQ0FBQztFQUN4RDtFQUVBLElBQUksQ0FBQ1UsVUFBVSxDQUFDVixRQUFRLENBQUMsR0FBRyxNQUFNVyx1QkFBYyxDQUFDQyxXQUFXLENBQUNaLFFBQVEsRUFBRSxJQUFJLENBQUMxRSxHQUFHLEVBQUUsSUFBSSxDQUFDVixJQUFJLENBQUM7RUFDM0YsSUFBSSxJQUFJLENBQUNHLFNBQVMsRUFBRTtJQUVsQixNQUFNLElBQUksQ0FBQ0EsU0FBUyxDQUFDQyxVQUFVLENBQUMsZUFBZSxDQUFDO0VBQ2xEO0VBRUEsT0FBT21GLG9CQUFvQixDQUFDLElBQUksQ0FBQ08sVUFBVSxDQUFDVixRQUFRLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQvRixRQUFRLENBQUM0RyxTQUFTLEdBQUcsZUFBZUEsU0FBU0EsQ0FBQSxFQUFJO0VBQy9DLE1BQU0sSUFBSSxDQUFDQyxPQUFPLEVBQUU7RUFDcEIsTUFBTSxJQUFJLENBQUNDLFFBQVEsRUFBRTtBQUN2QixDQUFDO0FBRUQ5RyxRQUFRLENBQUMrRyxhQUFhLEdBQUcsZUFBZUEsYUFBYUEsQ0FBRTNFLFVBQVUsRUFBRUMsV0FBVyxFQUM1RThCLGNBQWMsRUFBRUMsZUFBZSxFQUFFTSxZQUFZLEVBQUVFLGNBQWMsRUFBRUUsV0FBVyxFQUMxRU8sdUJBQXVCLEVBQUUyQixrQkFBa0IsRUFBRTtFQUM3QyxJQUFJLENBQUM5RixHQUFHLENBQUNDLEtBQUssQ0FBRSxxQkFBb0JpQixVQUFXLG1CQUFrQkMsV0FBWSxHQUFFLENBQUM7RUFJaEYsSUFBSSxDQUFDb0QsYUFBSSxDQUFDd0IsUUFBUSxDQUFDRCxrQkFBa0IsQ0FBQyxFQUFFO0lBQ3RDQSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDckcsSUFBSSxDQUFDcUcsa0JBQWtCO0VBQ3JEO0VBRUEsSUFBSWpELElBQUksR0FBRztJQUNUUSxHQUFHLEVBQUVuQyxVQUFVO0lBQ2ZvQyxRQUFRLEVBQUVuQyxXQUFXO0lBQ3JCMEMsT0FBTyxFQUFFWixjQUFjLElBQUkvQixVQUFVO0lBQ3JDNEMsWUFBWSxFQUFFWixlQUFlLElBQUkvQixXQUFXO0lBQzVDb0MsTUFBTSxFQUFFQyxZQUFZO0lBQ3BCQyxRQUFRLEVBQUVDLGNBQWM7SUFDeEJDLEtBQUssRUFBRUMsV0FBVztJQUNsQk8sdUJBQXVCO0lBQ3ZCQyxPQUFPLEVBQUUsQ0FBQzBCO0VBQ1osQ0FBQztFQUNELElBQUksQ0FBQ2hELG1CQUFtQixHQUFHLElBQUksQ0FBQ0EsbUJBQW1CLElBQUksQ0FBQyxDQUFDO0VBQ3pELElBQUksQ0FBQ0EsbUJBQW1CLENBQUUsR0FBRUQsSUFBSSxDQUFDZ0IsT0FBUSxJQUFHaEIsSUFBSSxDQUFDaUIsWUFBYSxFQUFDLENBQUMsR0FBR2pCLElBQUk7RUFDdkUsTUFBTSxJQUFJLENBQUMxQyxHQUFHLENBQUN3RSxRQUFRLENBQUM5QixJQUFJLENBQUM7QUFDL0IsQ0FBQztBQUVEL0QsUUFBUSxDQUFDa0gsS0FBSyxHQUFHLGVBQWVBLEtBQUtBLENBQUEsRUFBSTtFQUN2QyxNQUFNUix1QkFBYyxDQUFDUyxRQUFRLENBQUMsSUFBSSxDQUFDOUYsR0FBRyxFQUFFK0YsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDMUcsSUFBSSxFQUFFO0lBQUMyRyxTQUFTLEVBQUU7RUFBSSxDQUFDLENBQUMsQ0FBQztFQUV4RixNQUFNLElBQUksQ0FBQ0MsVUFBVSxFQUFFO0VBQ3ZCLE9BQU8sT0FBTSxJQUFJLENBQUNDLGVBQWUsSUFBRyxJQUFJLENBQUNDLGtCQUFrQixFQUFFLEdBQUcsSUFBSSxDQUFDWCxRQUFRLEVBQUU7QUFDakYsQ0FBQztBQUVEOUcsUUFBUSxDQUFDOEcsUUFBUSxHQUFHLGVBQWVBLFFBQVFBLENBQUEsRUFBSTtFQUM3QyxNQUFNLElBQUksQ0FBQ3pGLEdBQUcsQ0FBQ3dFLFFBQVEsQ0FBQztJQUN0QnRCLEdBQUcsRUFBRSxJQUFJLENBQUM1RCxJQUFJLENBQUN5QixVQUFVO0lBQ3pCb0MsUUFBUSxFQUFFLElBQUksQ0FBQzdELElBQUksQ0FBQzBCLFdBQVc7SUFDL0JvQyxNQUFNLEVBQUUsSUFBSSxDQUFDOUQsSUFBSSxDQUFDK0QsWUFBWTtJQUM5QkMsUUFBUSxFQUFFLElBQUksQ0FBQ2hFLElBQUksQ0FBQ2lFLGNBQWM7SUFDbENDLEtBQUssRUFBRSxJQUFJLENBQUNsRSxJQUFJLENBQUNtRSxXQUFXO0lBQzVCQyxPQUFPLEVBQUUsSUFBSSxDQUFDcEUsSUFBSSxDQUFDd0QsY0FBYztJQUNqQ2EsWUFBWSxFQUFFLElBQUksQ0FBQ3JFLElBQUksQ0FBQ3lELGVBQWU7SUFDdkNhLGFBQWEsRUFBRSxJQUFJLENBQUN0RSxJQUFJLENBQUN1RSxnQkFBZ0I7SUFDekNDLFlBQVksRUFBRSxJQUFJLENBQUN4RSxJQUFJLENBQUN5RSxlQUFlO0lBQ3ZDQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMxRSxJQUFJLENBQUMwRSx1QkFBdUI7SUFDMURDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQzNFLElBQUksQ0FBQ3FHLGtCQUFrQjtJQUN0Q3pCLElBQUksRUFBRSxJQUFJLENBQUM1RSxJQUFJLENBQUM2RTtFQUNsQixDQUFDLENBQUM7QUFDSixDQUFDO0FBSUR4RixRQUFRLENBQUMwSCxNQUFNLEdBQUcsZUFBZUEsTUFBTUEsQ0FBRUMsR0FBRyxFQUFFO0VBQzVDLE1BQU0sSUFBSSxDQUFDdEcsR0FBRyxDQUFDdUcsUUFBUSxDQUFDRCxHQUFHLEVBQUUsSUFBSSxDQUFDaEgsSUFBSSxDQUFDeUIsVUFBVSxDQUFDO0FBQ3BELENBQUM7QUFHRHBDLFFBQVEsQ0FBQzZILFFBQVEsR0FBRyxlQUFlQSxRQUFRQSxDQUFBLEVBQUk7RUFDN0MsTUFBTSxJQUFJLENBQUN4RyxHQUFHLENBQUN5RyxTQUFTLENBQUMsSUFBSSxDQUFDbkgsSUFBSSxDQUFDeUIsVUFBVSxDQUFDO0VBRTlDLE1BQU0sSUFBSSxDQUFDbUYsVUFBVSxFQUFFO0FBQ3pCLENBQUM7QUFFRHZILFFBQVEsQ0FBQytILGlCQUFpQixHQUFHLGVBQWVBLGlCQUFpQkEsQ0FBQSxFQUFJO0VBRS9ELElBQUlDLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQzNHLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDLENBQUM7RUFDaEUsSUFBSTBHLEdBQUcsRUFBRTtJQUNQLElBQUlDLEdBQUcsR0FBRzFFLFFBQVEsQ0FBQ3lFLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFFM0IsSUFBSSxDQUFDRSxLQUFLLENBQUNELEdBQUcsQ0FBQyxFQUFFO01BQ2YsT0FBT0EsR0FBRztJQUNaO0lBQ0EsSUFBSSxDQUFDL0csR0FBRyxDQUFDQyxLQUFLLENBQUUsa0NBQWlDNkcsR0FBSSxHQUFFLENBQUM7RUFDMUQ7RUFFQUEsR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDM0csR0FBRyxDQUFDQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUscUJBQXFCLENBQUMsQ0FBQztFQUM5RCxJQUFJMEcsR0FBRyxFQUFFO0lBQ1AsSUFBSUMsR0FBRyxHQUFHMUUsUUFBUSxDQUFDeUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztJQUMzQixJQUFJLENBQUNFLEtBQUssQ0FBQ0QsR0FBRyxDQUFDLEVBQUU7TUFDZixPQUFPQSxHQUFHO0lBQ1o7SUFDQSxJQUFJLENBQUMvRyxHQUFHLENBQUNDLEtBQUssQ0FBRSxrQ0FBaUM2RyxHQUFJLEdBQUUsQ0FBQztFQUMxRDtFQUVBLElBQUksQ0FBQzlHLEdBQUcsQ0FBQ2lILGFBQWEsQ0FBQyx5Q0FBeUMsQ0FBQztBQUNuRSxDQUFDO0FBRURuSSxRQUFRLENBQUNvSSx5QkFBeUIsR0FBRyxlQUFlQSx5QkFBeUJBLENBQUV6SCxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDeEYsTUFBTTtJQUFDOEQ7RUFBTSxDQUFDLEdBQUc5RCxJQUFJO0VBQ3JCLElBQUksQ0FBQzhFLGFBQUksQ0FBQ3dCLFFBQVEsQ0FBQ3hDLE1BQU0sQ0FBQyxFQUFFO0lBQzFCLE1BQU0sSUFBSTRELGNBQU0sQ0FBQ0Msb0JBQW9CLENBQUUsK0JBQThCLENBQUM7RUFDeEU7RUFFQSxNQUFNLElBQUksQ0FBQ2pILEdBQUcsQ0FBQ2tILG1CQUFtQixDQUFDOUQsTUFBTSxDQUFDO0FBQzVDLENBQUM7QUFRRHpFLFFBQVEsQ0FBQ3dJLHNCQUFzQixHQUFHLGVBQWVBLHNCQUFzQkEsQ0FBQSxFQUFJO0VBQ3pFLE9BQU8sTUFBTSxJQUFJLENBQUNuSCxHQUFHLENBQUNvSCxnQkFBZ0IsRUFBRTtBQUMxQyxDQUFDO0FBZUR6SSxRQUFRLENBQUMwSSxhQUFhLEdBQUcsZUFBZUEsYUFBYUEsQ0FBRS9ILElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUNoRSxPQUFPLE1BQU0sSUFBSSxDQUFDVSxHQUFHLENBQUNzSCxVQUFVLENBQUNoSSxJQUFJLENBQUM7QUFDeEMsQ0FBQztBQXVCRFgsUUFBUSxDQUFDNEksWUFBWSxHQUFHLGVBQWVBLFlBQVlBLENBQUVqSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDOUQsTUFBTTtJQUFFMEYsR0FBRztJQUFFd0MsSUFBSTtJQUFFQyxRQUFRO0lBQUVDO0VBQVUsQ0FBQyxHQUFHcEksSUFBSTtFQUMvQyxNQUFNK0YsdUJBQWMsQ0FBQ3NDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDM0gsR0FBRyxFQUFFO0lBQzFDNEgsU0FBUyxFQUFFNUMsR0FBRztJQUNkNkMsVUFBVSxFQUFFTCxJQUFJO0lBQ2hCTSxjQUFjLEVBQUVMLFFBQVE7SUFDeEJNLG9CQUFvQixFQUFFTDtFQUN4QixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQzQixNQUFNLENBQUNDLE1BQU0sQ0FBQ25ILFVBQVUsRUFBRUYsUUFBUSxFQUFFQyxPQUFPLENBQUM7QUFBQyxJQUFBb0osUUFBQSxHQUU5Qm5KLFVBQVU7QUFBQUMsT0FBQSxDQUFBbUosT0FBQSxHQUFBRCxRQUFBIn0=
274
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYW5kcm9pZEhlbHBlcnMiLCJfc3VwcG9ydCIsIl9tb21lbnQiLCJfYXN5bmNib3giLCJfZHJpdmVyIiwiTU9NRU5UX0ZPUk1BVF9JU084NjAxIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJrZXlzIiwiXyIsImlzQXJyYXkiLCJqb2luIiwicGFyYW1zIiwidGV4dCIsInJlcGxhY2UiLCJvcHRzIiwidW5pY29kZUtleWJvYXJkIiwiZG9TZW5kS2V5cyIsImJvb3RzdHJhcCIsInNlbmRBY3Rpb24iLCJnZXREZXZpY2VUaW1lIiwiZm9ybWF0IiwibG9nIiwiZGVidWciLCJkZXZpY2VUaW1lc3RhbXAiLCJhZGIiLCJzaGVsbCIsInRyaW0iLCJwYXJzZWRUaW1lc3RhbXAiLCJtb21lbnQiLCJ1dGMiLCJpc1ZhbGlkIiwid2FybiIsInV0Y09mZnNldCIsIl90em0iLCJtb2JpbGVHZXREZXZpY2VUaW1lIiwiZ2V0UGFnZVNvdXJjZSIsImJhY2siLCJvcGVuU2V0dGluZ3NBY3Rpdml0eSIsInNldHRpbmciLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJnZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5Iiwid2FpdEZvck5vdEFjdGl2aXR5IiwiZ2V0V2luZG93U2l6ZSIsImdldFdpbmRvd1JlY3QiLCJ3aWR0aCIsImhlaWdodCIsIngiLCJ5IiwiZ2V0Q3VycmVudEFjdGl2aXR5IiwiZ2V0Q3VycmVudFBhY2thZ2UiLCJiYWNrZ3JvdW5kIiwic2Vjb25kcyIsImdvVG9Ib21lIiwic2xlZXBNcyIsInRocmVzaG9sZE1zIiwiaW50ZXJ2YWxNcyIsIm1pbiIsInBhcnNlSW50IiwicHJvZ3Jlc3NDYiIsImVsYXBzZWRNcyIsInByb2dyZXNzIiwid2FpdFNlY3MiLCJ0b0ZpeGVkIiwicHJvZ3Jlc3NQY3QiLCJsb25nU2xlZXAiLCJhcmdzIiwiX2NhY2hlZEFjdGl2aXR5QXJncyIsImFjdGl2YXRlQXBwIiwiaWduIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJzcGxpdCIsImluY2x1ZGVzIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJpbnRlbnRBY3Rpb24iLCJjYXRlZ29yeSIsImludGVudENhdGVnb3J5IiwiZmxhZ3MiLCJpbnRlbnRGbGFncyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJ3YWl0Rm9yTGF1bmNoIiwiYXBwV2FpdEZvckxhdW5jaCIsIndhaXREdXJhdGlvbiIsImFwcFdhaXREdXJhdGlvbiIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic3RvcEFwcCIsInVzZXIiLCJ1c2VyUHJvZmlsZSIsInV0aWwiLCJmaWx0ZXJPYmplY3QiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhcnRBcHAiLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsInRvUGFpcnMiLCJpc1N0cmluZyIsImFwa1N0cmluZ3MiLCJhbmRyb2lkSGVscGVycyIsInB1c2hTdHJpbmdzIiwibGF1bmNoQXBwIiwiaW5pdEFVVCIsInN0YXJ0QVVUIiwic3RhcnRBY3Rpdml0eSIsImRvbnRTdG9wQXBwT25SZXNldCIsImhhc1ZhbHVlIiwicmVzZXQiLCJyZXNldEFwcCIsIk9iamVjdCIsImFzc2lnbiIsImZhc3RSZXNldCIsInNldENvbnRleHQiLCJpc0Nocm9tZVNlc3Npb24iLCJzdGFydENocm9tZVNlc3Npb24iLCJzZXRVcmwiLCJ1cmkiLCJzdGFydFVyaSIsImNsb3NlQXBwIiwiZm9yY2VTdG9wIiwiZ2V0RGlzcGxheURlbnNpdHkiLCJvdXQiLCJ2YWwiLCJpc05hTiIsImVycm9yQW5kVGhyb3ciLCJtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwibW9iaWxlR2V0Tm90aWZpY2F0aW9ucyIsImdldE5vdGlmaWNhdGlvbnMiLCJtb2JpbGVMaXN0U21zIiwiZ2V0U21zTGlzdCIsIm1vYmlsZVVubG9jayIsInR5cGUiLCJzdHJhdGVneSIsInRpbWVvdXRNcyIsInVubG9jayIsInVubG9ja0tleSIsInVubG9ja1R5cGUiLCJ1bmxvY2tTdHJhdGVneSIsInVubG9ja1N1Y2Nlc3NUaW1lb3V0IiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2dlbmVyYWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhbmRyb2lkSGVscGVycyBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBsb25nU2xlZXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuY29uc3QgTU9NRU5UX0ZPUk1BVF9JU084NjAxID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb21tYW5kcy5rZXlzID0gYXN5bmMgZnVuY3Rpb24ga2V5cyAoa2V5cykge1xuICAvLyBQcm90b2NvbCBzZW5kcyBhbiBhcnJheTsgcmV0aGluayBhcHByb2FjaFxuICBrZXlzID0gXy5pc0FycmF5KGtleXMpID8ga2V5cy5qb2luKCcnKSA6IGtleXM7XG4gIGxldCBwYXJhbXMgPSB7XG4gICAgdGV4dDoga2V5cyxcbiAgICByZXBsYWNlOiBmYWxzZVxuICB9O1xuICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCkge1xuICAgIHBhcmFtcy51bmljb2RlS2V5Ym9hcmQgPSB0cnVlO1xuICB9XG4gIGF3YWl0IHRoaXMuZG9TZW5kS2V5cyhwYXJhbXMpO1xufTtcblxuY29tbWFuZHMuZG9TZW5kS2V5cyA9IGFzeW5jIGZ1bmN0aW9uIGRvU2VuZEtleXMgKHBhcmFtcykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc2V0VGV4dCcsIHBhcmFtcyk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBkZXZpY2UncyB0aW1lc3RhbXAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIFRoZSBzZXQgb2YgZm9ybWF0IHNwZWNpZmllcnMuIFJlYWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRldGltZSBmb3JtYXQgc3BlY2lmaWVycy4gVGhlIGRlZmF1bHQgZm9ybWF0IGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYFlZWVktTU0tRERUSEg6bW06c3NaYCwgd2hpY2ggY29tcGxpZXMgdG8gSVNPLTg2MDFcbiAqIEByZXR1cm4ge3N0cmluZ30gRm9ybWF0dGVkIGRhdGV0aW1lIHN0cmluZyBvciB0aGUgcmF3IGNvbW1hbmQgb3V0cHV0IGlmIGZvcm1hdHRpbmcgZmFpbHNcbiAqL1xuY29tbWFuZHMuZ2V0RGV2aWNlVGltZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVRpbWUgKGZvcm1hdCA9IE1PTUVOVF9GT1JNQVRfSVNPODYwMSkge1xuICB0aGlzLmxvZy5kZWJ1ZygnQXR0ZW1wdGluZyB0byBjYXB0dXJlIGFuZHJvaWQgZGV2aWNlIGRhdGUgYW5kIHRpbWUuICcgK1xuICAgIGBUaGUgZm9ybWF0IHNwZWNpZmllciBpcyAnJHtmb3JtYXR9J2ApO1xuICBjb25zdCBkZXZpY2VUaW1lc3RhbXAgPSAoYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkYXRlJywgJyslWS0lbS0lZFQlVCV6J10pKS50cmltKCk7XG4gIHRoaXMubG9nLmRlYnVnKGBHb3QgZGV2aWNlIHRpbWVzdGFtcDogJHtkZXZpY2VUaW1lc3RhbXB9YCk7XG4gIGNvbnN0IHBhcnNlZFRpbWVzdGFtcCA9IG1vbWVudC51dGMoZGV2aWNlVGltZXN0YW1wLCAnWVlZWS1NTS1ERFRISDptbTpzc1paJyk7XG4gIGlmICghcGFyc2VkVGltZXN0YW1wLmlzVmFsaWQoKSkge1xuICAgIHRoaXMubG9nLndhcm4oJ0Nhbm5vdCBwYXJzZSB0aGUgcmV0dXJuZWQgdGltZXN0YW1wLiBSZXR1cm5pbmcgYXMgaXMnKTtcbiAgICByZXR1cm4gZGV2aWNlVGltZXN0YW1wO1xuICB9XG4gIHJldHVybiBwYXJzZWRUaW1lc3RhbXAudXRjT2Zmc2V0KHBhcnNlZFRpbWVzdGFtcC5fdHptIHx8IDApLmZvcm1hdChmb3JtYXQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXZpY2VUaW1lT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1hdCBbWVlZWS1NTS1ERFRISDptbTpzc1pdIC0gU2VlIGdldERldmljZVRpbWUjZm9ybWF0XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZGV2aWNlIHRpbWVcbiAqXG4gKiBAcGFyYW0ge0RldmljZVRpbWVPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZvcm1hdHRlZCBkYXRldGltZSBzdHJpbmcgb3IgdGhlIHJhdyBjb21tYW5kIG91dHB1dCBpZiBmb3JtYXR0aW5nIGZhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldERldmljZVRpbWUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXREZXZpY2VUaW1lIChvcHRzID0ge30pIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlVGltZShvcHRzLmZvcm1hdCk7XG59O1xuXG5jb21tYW5kcy5nZXRQYWdlU291cmNlID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGFnZVNvdXJjZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdzb3VyY2UnKTtcbn07XG5cbmNvbW1hbmRzLmJhY2sgPSBhc3luYyBmdW5jdGlvbiBiYWNrICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3ByZXNzQmFjaycpO1xufTtcblxuY29tbWFuZHMub3BlblNldHRpbmdzQWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBvcGVuU2V0dGluZ3NBY3Rpdml0eSAoc2V0dGluZykge1xuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcbiAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydhbScsICdzdGFydCcsICctYScsIGBhbmRyb2lkLnNldHRpbmdzLiR7c2V0dGluZ31gXSk7XG4gIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG59O1xuXG5jb21tYW5kcy5nZXRXaW5kb3dTaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93U2l6ZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdnZXREZXZpY2VTaXplJyk7XG59O1xuXG4vLyBGb3IgVzNDXG5jb21tYW5kcy5nZXRXaW5kb3dSZWN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93UmVjdCAoKSB7XG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYXdhaXQgdGhpcy5nZXRXaW5kb3dTaXplKCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xufTtcblxuY29tbWFuZHMuZ2V0Q3VycmVudEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudEFjdGl2aXR5ICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCkpLmFwcEFjdGl2aXR5O1xufTtcblxuY29tbWFuZHMuZ2V0Q3VycmVudFBhY2thZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50UGFja2FnZSAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpKS5hcHBQYWNrYWdlO1xufTtcblxuY29tbWFuZHMuYmFja2dyb3VuZCA9IGFzeW5jIGZ1bmN0aW9uIGJhY2tncm91bmQgKHNlY29uZHMpIHtcbiAgaWYgKHNlY29uZHMgPCAwKSB7XG4gICAgLy8gaWYgdXNlciBwYXNzZXMgaW4gYSBuZWdhdGl2ZSBzZWNvbmRzIHZhbHVlLCBpbnRlcnByZXQgdGhhdCBhcyB0aGUgaW5zdHJ1Y3Rpb25cbiAgICAvLyB0byBub3QgYnJpbmcgdGhlIGFwcCBiYWNrIGF0IGFsbFxuICAgIGF3YWl0IHRoaXMuYWRiLmdvVG9Ib21lKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgbGV0IHthcHBQYWNrYWdlLCBhcHBBY3Rpdml0eX0gPSBhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCk7XG4gIGF3YWl0IHRoaXMuYWRiLmdvVG9Ib21lKCk7XG5cbiAgLy8gcGVvcGxlIGNhbiB3YWl0IGZvciBhIGxvbmcgdGltZSwgc28gdG8gYmUgc2FmZSBsZXQncyB1c2UgdGhlIGxvbmdTbGVlcCBmdW5jdGlvbiBhbmQgbG9nXG4gIC8vIHByb2dyZXNzIHBlcmlvZGljYWxseS5cbiAgY29uc3Qgc2xlZXBNcyA9IHNlY29uZHMgKiAxMDAwO1xuICBjb25zdCB0aHJlc2hvbGRNcyA9IDMwICogMTAwMDsgLy8gdXNlIHRoZSBzcGluLXdhaXQgZm9yIGFueXRoaW5nIG92ZXIgdGhpcyB0aHJlc2hvbGRcbiAgLy8gZm9yIG91ciBzcGluIGludGVydmFsLCB1c2UgMSUgb2YgdGhlIHRvdGFsIHdhaXQgdGltZSwgYnV0IG5vdGhpbmcgYmlnZ2VyIHRoYW4gMzBzXG4gIGNvbnN0IGludGVydmFsTXMgPSBfLm1pbihbMzAgKiAxMDAwLCBwYXJzZUludChzbGVlcE1zIC8gMTAwLCAxMCldKTtcbiAgY29uc3QgcHJvZ3Jlc3NDYiA9ICh7ZWxhcHNlZE1zLCBwcm9ncmVzc30pID0+IHtcbiAgICBjb25zdCB3YWl0U2VjcyA9IChlbGFwc2VkTXMgLyAxMDAwKS50b0ZpeGVkKDApO1xuICAgIGNvbnN0IHByb2dyZXNzUGN0ID0gKHByb2dyZXNzICogMTAwKS50b0ZpeGVkKDIpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBXYWl0ZWQgJHt3YWl0U2Vjc31zIHNvIGZhciAoJHtwcm9ncmVzc1BjdH0lKWApO1xuICB9O1xuICBhd2FpdCBsb25nU2xlZXAoc2xlZXBNcywge3RocmVzaG9sZE1zLCBpbnRlcnZhbE1zLCBwcm9ncmVzc0NifSk7XG5cbiAgbGV0IGFyZ3M7XG4gIGlmICh0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3MgJiYgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FwcFBhY2thZ2V9LyR7YXBwQWN0aXZpdHl9YF0pIHtcbiAgICAvLyB0aGUgYWN0aXZpdHkgd2FzIHN0YXJ0ZWQgd2l0aCBgc3RhcnRBY3Rpdml0eWAsIHNvIHVzZSB0aG9zZSBhcmdzIHRvIHJlc3RhcnRcbiAgICBhcmdzID0gdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FwcFBhY2thZ2V9LyR7YXBwQWN0aXZpdHl9YF07XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBBY3RpdmF0aW5nIGFwcCAnJHthcHBQYWNrYWdlfScgaW4gb3JkZXIgdG8gcmVzdG9yZSBpdGApO1xuICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZUFwcChhcHBQYWNrYWdlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICBhcmdzID0gKChhcHBQYWNrYWdlID09PSB0aGlzLm9wdHMuYXBwUGFja2FnZSAmJiBhcHBBY3Rpdml0eSA9PT0gdGhpcy5vcHRzLmFwcEFjdGl2aXR5KSB8fFxuICAgICAgICAgICAgKGFwcFBhY2thZ2UgPT09IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSAmJiAodGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSB8fCAnJykuc3BsaXQoJywnKS5pbmNsdWRlcyhhcHBBY3Rpdml0eSkpKVxuICAgICAgPyB7Ly8gdGhlIGFjdGl2aXR5IGlzIHRoZSBvcmlnaW5hbCBzZXNzaW9uIGFjdGl2aXR5LCBzbyB1c2UgdGhlIG9yaWdpbmFsIGFyZ3NcbiAgICAgICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgICAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgICAgc3RvcEFwcDogZmFsc2UsXG4gICAgICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZX1cbiAgICAgIDogey8vIHRoZSBhY3Rpdml0eSB3YXMgc3RhcnRlZCBzb21lIG90aGVyIHdheSwgc28gdXNlIGRlZmF1bHRzXG4gICAgICAgIHBrZzogYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgICAgICB3YWl0UGtnOiBhcHBQYWNrYWdlLFxuICAgICAgICB3YWl0QWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgICAgICBzdG9wQXBwOiBmYWxzZX07XG4gIH1cbiAgYXJncyA9IGF3YWl0IHV0aWwuZmlsdGVyT2JqZWN0KGFyZ3MpO1xuICB0aGlzLmxvZy5kZWJ1ZyhgQnJpbmdpbmcgYXBwbGljYXRpb24gYmFjayB0byBmb3JlZ3JvdW5kIHdpdGggYXJndW1lbnRzOiAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoYXJncyk7XG59O1xuXG5jb21tYW5kcy5nZXRTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gZ2V0U3RyaW5ncyAobGFuZ3VhZ2UpIHtcbiAgaWYgKCFsYW5ndWFnZSkge1xuICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5hZGIuZ2V0RGV2aWNlTGFuZ3VhZ2UoKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBObyBsYW5ndWFnZSBzcGVjaWZpZWQsIHJldHVybmluZyBzdHJpbmdzIGZvcjogJHtsYW5ndWFnZX1gKTtcbiAgfVxuXG4gIC8vIENsaWVudHMgcmVxdWlyZSB0aGUgcmVzdWx0aW5nIG1hcHBpbmcgdG8gaGF2ZSBib3RoIGtleXNcbiAgLy8gYW5kIHZhbHVlcyBvZiB0eXBlIHN0cmluZ1xuICBjb25zdCBwcmVwcm9jZXNzU3RyaW5nc01hcCA9IChtYXBwaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKG1hcHBpbmcpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IF8uaXNTdHJpbmcodmFsdWUpID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgaWYgKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIHN0cmluZ3NcbiAgICByZXR1cm4gcHJlcHJvY2Vzc1N0cmluZ3NNYXAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSk7XG4gIH1cblxuICB0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMucHVzaFN0cmluZ3MobGFuZ3VhZ2UsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBpZiAodGhpcy5ib290c3RyYXApIHtcbiAgICAvLyBUT0RPOiBUaGlzIGlzIG11dGF0aW5nIHRoZSBjdXJyZW50IGxhbmd1YWdlLCBidXQgaXQncyBob3cgYXBwaXVtIGN1cnJlbnRseSB3b3Jrc1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3VwZGF0ZVN0cmluZ3MnKTtcbiAgfVxuXG4gIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbn07XG5cbmNvbW1hbmRzLmxhdW5jaEFwcCA9IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaEFwcCAoKSB7XG4gIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuICBhd2FpdCB0aGlzLnN0YXJ0QVVUKCk7XG59O1xuXG5jb21tYW5kcy5zdGFydEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBY3Rpdml0eSAoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksXG4gIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHksIGludGVudEFjdGlvbiwgaW50ZW50Q2F0ZWdvcnksIGludGVudEZsYWdzLFxuICBvcHRpb25hbEludGVudEFyZ3VtZW50cywgZG9udFN0b3BBcHBPblJlc2V0KSB7XG4gIHRoaXMubG9nLmRlYnVnKGBTdGFydGluZyBwYWNrYWdlICcke2FwcFBhY2thZ2V9JyBhbmQgYWN0aXZpdHkgJyR7YXBwQWN0aXZpdHl9J2ApO1xuXG4gIC8vIGRvbnRTdG9wQXBwT25SZXNldCBpcyBib3RoIGFuIGFyZ3VtZW50IGhlcmUsIGFuZCBhIGRlc2lyZWQgY2FwYWJpbGl0eVxuICAvLyBpZiB0aGUgYXJndW1lbnQgaXMgc2V0LCB1c2UgaXQsIG90aGVyd2lzZSB1c2UgdGhlIGNhcFxuICBpZiAoIXV0aWwuaGFzVmFsdWUoZG9udFN0b3BBcHBPblJlc2V0KSkge1xuICAgIGRvbnRTdG9wQXBwT25SZXNldCA9ICEhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldDtcbiAgfVxuXG4gIGxldCBhcmdzID0ge1xuICAgIHBrZzogYXBwUGFja2FnZSxcbiAgICBhY3Rpdml0eTogYXBwQWN0aXZpdHksXG4gICAgd2FpdFBrZzogYXBwV2FpdFBhY2thZ2UgfHwgYXBwUGFja2FnZSxcbiAgICB3YWl0QWN0aXZpdHk6IGFwcFdhaXRBY3Rpdml0eSB8fCBhcHBBY3Rpdml0eSxcbiAgICBhY3Rpb246IGludGVudEFjdGlvbixcbiAgICBjYXRlZ29yeTogaW50ZW50Q2F0ZWdvcnksXG4gICAgZmxhZ3M6IGludGVudEZsYWdzLFxuICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgIHN0b3BBcHA6ICFkb250U3RvcEFwcE9uUmVzZXRcbiAgfTtcbiAgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzID0gdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzIHx8IHt9O1xuICB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXJncy53YWl0UGtnfS8ke2FyZ3Mud2FpdEFjdGl2aXR5fWBdID0gYXJncztcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoYXJncyk7XG59O1xuXG5jb21tYW5kcy5yZXNldCA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0ICgpIHtcbiAgYXdhaXQgYW5kcm9pZEhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywge2Zhc3RSZXNldDogdHJ1ZX0pKTtcbiAgLy8gcmVzZXQgY29udGV4dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvbiBjb250ZXh0IHdlIHdpbGwgZW5kIHVwIGFmdGVyIGFwcCBsYXVuY2guXG4gIGF3YWl0IHRoaXMuc2V0Q29udGV4dCgpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5pc0Nocm9tZVNlc3Npb24gPyB0aGlzLnN0YXJ0Q2hyb21lU2Vzc2lvbigpIDogdGhpcy5zdGFydEFVVCgpO1xufTtcblxuY29tbWFuZHMuc3RhcnRBVVQgPSBhc3luYyBmdW5jdGlvbiBzdGFydEFVVCAoKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKHtcbiAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgIGFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgIGNhdGVnb3J5OiB0aGlzLm9wdHMuaW50ZW50Q2F0ZWdvcnksXG4gICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyxcbiAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgd2FpdEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5LFxuICAgIHdhaXRGb3JMYXVuY2g6IHRoaXMub3B0cy5hcHBXYWl0Rm9yTGF1bmNoLFxuICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICBvcHRpb25hbEludGVudEFyZ3VtZW50czogdGhpcy5vcHRzLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgIHN0b3BBcHA6ICF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0LFxuICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZSxcbiAgfSk7XG59O1xuXG4vLyB3ZSBvdmVycmlkZSBzZXRVcmwgdG8gdGFrZSBhbiBhbmRyb2lkIFVSSSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZGVlcC1saW5raW5nXG4vLyBpbnNpZGUgYW4gYXBwLCBzaW1pbGFyIHRvIHN0YXJ0aW5nIGFuIGludGVudFxuY29tbWFuZHMuc2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gc2V0VXJsICh1cmkpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJpLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG59O1xuXG4vLyBjbG9zaW5nIGFwcCB1c2luZyBmb3JjZSBzdG9wXG5jb21tYW5kcy5jbG9zZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQXBwICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgLy8gcmVzZXQgY29udGV4dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvbiBjb250ZXh0IHdlIHdpbGwgZW5kIHVwIGFmdGVyIGFwcCBsYXVuY2guXG4gIGF3YWl0IHRoaXMuc2V0Q29udGV4dCgpO1xufTtcblxuY29tbWFuZHMuZ2V0RGlzcGxheURlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXREaXNwbGF5RGVuc2l0eSAoKSB7XG4gIC8vIGZpcnN0IHRyeSB0aGUgcHJvcGVydHkgZm9yIGRldmljZXNcbiAgbGV0IG91dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZ2V0cHJvcCcsICdyby5zZi5sY2RfZGVuc2l0eSddKTtcbiAgaWYgKG91dCkge1xuICAgIGxldCB2YWwgPSBwYXJzZUludChvdXQsIDEwKTtcbiAgICAvLyBpZiB0aGUgdmFsdWUgaXMgTmFOLCB0cnkgZ2V0dGluZyB0aGUgZW11bGF0b3IgcHJvcGVydHlcbiAgICBpZiAoIWlzTmFOKHZhbCkpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgZGVuc2l0eSB2YWx1ZSB3YXMgTmFOOiBcIiR7b3V0fVwiYCk7XG4gIH1cbiAgLy8gZmFsbGJhY2sgdG8gdHJ5aW5nIHByb3BlcnR5IGZvciBlbXVsYXRvcnNcbiAgb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydnZXRwcm9wJywgJ3FlbXUuc2YubGNkX2RlbnNpdHknXSk7XG4gIGlmIChvdXQpIHtcbiAgICBsZXQgdmFsID0gcGFyc2VJbnQob3V0LCAxMCk7XG4gICAgaWYgKCFpc05hTih2YWwpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIGRlbnNpdHkgdmFsdWUgd2FzIE5hTjogXCIke291dH1cImApO1xuICB9XG4gIC8vIGNvdWxkbid0IGdldCBhbnl0aGluZywgc28gZXJyb3Igb3V0XG4gIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ0ZhaWxlZCB0byBnZXQgZGlzcGxheSBkZW5zaXR5IHByb3BlcnR5LicpO1xufTtcblxuY29tbWFuZHMubW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7YWN0aW9ufSA9IG9wdHM7XG4gIGlmICghdXRpbC5oYXNWYWx1ZShhY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ2FjdGlvbicgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMuYWRiLnBlcmZvcm1FZGl0b3JBY3Rpb24oYWN0aW9uKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHJlY2VudCBzeXN0ZW0gbm90aWZpY2F0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXROb3RpZmljYXRpb25zYCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVHZXROb3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Tm90aWZpY2F0aW9ucyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXROb3RpZmljYXRpb25zKCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNtc0xpc3RPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4IFsxMDBdIC0gVGhlIG1heGltdW0gY291bnQgb2YgcmVjZW50IFNNUyBtZXNzYWdlc1xuICogdG8gcmV0cmlldmVcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiByZWNlbnQgU01TIG1lc3NhZ2VzIHdpdGggdGhlaXIgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge1Ntc0xpc3RPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXRTbXNMaXN0YCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVMaXN0U21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTGlzdFNtcyAob3B0cyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXRTbXNMaXN0KG9wdHMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmxvY2tPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZz99IGtleSBUaGUgdW5sb2NrIGtleS4gVGhlIHZhbHVlIG9mIHRoaXMga2V5IGRlcGVuZHNcbiAqIG9uIHRoZSBhY3R1YWwgdW5sb2NrIHR5cGUgYW5kIGNvdWxkIGJlIGEgcGluL3Bhc3N3b3JkL3BhdHRlcm4gdmFsdWUgb3JcbiAqIGEgYmlvbWV0cmljIGZpbmdlciBpZC5cbiAqIElmIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gc2Vzc2lvbiBjYXBhYmlsaXRpZXMgaXMgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdHlwZSBUaGUgdW5sb2NrIHR5cGUuIFRoZSBmb2xsb3dpbmcgdW5sb2NrIHR5cGVzXG4gKiBhcmUgc3VwcG9ydGVkOiBgcGluYCwgYHBpbldpdGhLZXlFdmVudGAsIGBwYXNzd29yZGAsIGBwYXR0ZXJuYCBhbmQgYGZpbmdlcnByaW50YC5cbiAqIElmIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gc2Vzc2lvbiBjYXBhYmlsaXRpZXMgaXMgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gc3RyYXRlZ3kgRWl0aGVyICdsb2Nrc2V0dGluZ3MnIChkZWZhdWx0KSBvciAndWlhdXRvbWF0b3InLlxuICogU2V0dGluZyBpdCB0byAndWlhdXRvbWF0b3InIHdpbGwgZW5mb3JjZSB0aGUgZHJpdmVyIHRvIGF2b2lkIHVzaW5nIHNwZWNpYWxcbiAqIEFEQiBzaG9ydGN1dHMgaW4gb3JkZXIgdG8gc3BlZWQgdXAgdGhlIHVubG9jayBwcm9jZWR1cmUuXG4gKiBAcHJvcGVydHkge251bWJlcj99IHRpbWVvdXRNcyBbMjAwMF0gVGhlIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIHRvIHdhaXQgdW50aWwgdGhlIHNjcmVlbiBnZXRzIHVubG9ja2VkXG4gKi9cblxuLyoqXG4gKiBVbmxvY2tzIHRoZSBkZXZpY2UgaWYgaXQgaXMgbG9ja2VkLiBOb29wIGlmIHRoZSBkZXZpY2UncyBzY3JlZW4gaXMgbm90IGxvY2tlZC5cbiAqXG4gKiBAcGFyYW0ge1VubG9ja09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB1bmxvY2sgb3BlcmF0aW9uIGZhaWxzIG9yIHRoZSBwcm92aWRlZFxuICogYXJndW1lbnRzIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVW5sb2NrIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBrZXksIHR5cGUsIHN0cmF0ZWd5LCB0aW1lb3V0TXMgfSA9IG9wdHM7XG4gIGlmICgha2V5ICYmICF0eXBlKSB7XG4gICAgYXdhaXQgdGhpcy51bmxvY2soKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHtcbiAgICAgIHVubG9ja0tleToga2V5LFxuICAgICAgdW5sb2NrVHlwZTogdHlwZSxcbiAgICAgIHVubG9ja1N0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgIHVubG9ja1N1Y2Nlc3NUaW1lb3V0OiB0aW1lb3V0TXMsXG4gICAgfSk7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsZUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksU0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBTCxPQUFBO0FBRUEsTUFBTU0scUJBQXFCLEdBQUcsc0JBQXNCO0FBRXBELElBQUlDLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUNDLE9BQUEsQ0FBQUYsT0FBQSxHQUFBQSxPQUFBO0FBQUFFLE9BQUEsQ0FBQUgsUUFBQSxHQUFBQSxRQUFBO0FBRWpEQSxRQUFRLENBQUNJLElBQUksR0FBRyxlQUFlQSxJQUFJQSxDQUFFQSxJQUFJLEVBQUU7RUFFekNBLElBQUksR0FBR0MsZUFBQyxDQUFDQyxPQUFPLENBQUNGLElBQUksQ0FBQyxHQUFHQSxJQUFJLENBQUNHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBR0gsSUFBSTtFQUM3QyxJQUFJSSxNQUFNLEdBQUc7SUFDWEMsSUFBSSxFQUFFTCxJQUFJO0lBQ1ZNLE9BQU8sRUFBRTtFQUNYLENBQUM7RUFDRCxJQUFJLElBQUksQ0FBQ0MsSUFBSSxDQUFDQyxlQUFlLEVBQUU7SUFDN0JKLE1BQU0sQ0FBQ0ksZUFBZSxHQUFHLElBQUk7RUFDL0I7RUFDQSxNQUFNLElBQUksQ0FBQ0Ms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
@@ -1 +1 @@
1
- {"version":3,"file":"general.js","names":["_lodash","_interopRequireDefault","require","_androidHelpers","_support","_moment","_asyncbox","_driver","MOMENT_FORMAT_ISO8601","commands","helpers","extensions","exports","keys","_","isArray","join","params","text","replace","opts","unicodeKeyboard","doSendKeys","bootstrap","sendAction","getDeviceTime","format","log","debug","deviceTimestamp","adb","shell","trim","parsedTimestamp","moment","utc","isValid","warn","utcOffset","_tzm","mobileGetDeviceTime","getPageSource","back","openSettingsActivity","setting","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","getWindowSize","getWindowRect","width","height","x","y","getCurrentActivity","getCurrentPackage","background","seconds","goToHome","sleepMs","thresholdMs","intervalMs","min","parseInt","progressCb","elapsedMs","progress","waitSecs","toFixed","progressPct","longSleep","args","_cachedActivityArgs","activateApp","ign","appWaitPackage","appWaitActivity","split","includes","pkg","activity","action","intentAction","category","intentCategory","flags","intentFlags","waitPkg","waitActivity","waitForLaunch","appWaitForLaunch","waitDuration","appWaitDuration","optionalIntentArguments","stopApp","user","userProfile","util","filterObject","JSON","stringify","startApp","getStrings","language","getDeviceLanguage","info","preprocessStringsMap","mapping","result","key","value","toPairs","isString","apkStrings","androidHelpers","pushStrings","launchApp","initAUT","startAUT","startActivity","dontStopAppOnReset","hasValue","reset","resetApp","Object","assign","fastReset","setContext","isChromeSession","startChromeSession","setUrl","uri","startUri","closeApp","forceStop","getDisplayDensity","out","val","isNaN","errorAndThrow","mobilePerformEditorAction","errors","InvalidArgumentError","performEditorAction","mobileGetNotifications","getNotifications","mobileListSms","getSmsList","mobileUnlock","type","strategy","timeoutMs","unlock","unlockKey","unlockType","unlockStrategy","unlockSuccessTimeout","_default","default"],"sources":["../../../lib/commands/general.js"],"sourcesContent":["import _ from 'lodash';\nimport androidHelpers from '../android-helpers';\nimport { util } from '@appium/support';\nimport moment from 'moment';\nimport { longSleep } from 'asyncbox';\nimport { errors } from 'appium/driver';\n\nconst MOMENT_FORMAT_ISO8601 = 'YYYY-MM-DDTHH:mm:ssZ';\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.keys = async function keys (keys) {\n // Protocol sends an array; rethink approach\n keys = _.isArray(keys) ? keys.join('') : keys;\n let params = {\n text: keys,\n replace: false\n };\n if (this.opts.unicodeKeyboard) {\n params.unicodeKeyboard = true;\n }\n await this.doSendKeys(params);\n};\n\ncommands.doSendKeys = async function doSendKeys (params) {\n return await this.bootstrap.sendAction('setText', params);\n};\n\n/**\n * Retrieves the current device's timestamp.\n *\n * @param {string} format - The set of format specifiers. Read\n * https://momentjs.com/docs/ to get the full list of supported\n * datetime format specifiers. The default format is\n * `YYYY-MM-DDTHH:mm:ssZ`, which complies to ISO-8601\n * @return {string} Formatted datetime string or the raw command output if formatting fails\n */\ncommands.getDeviceTime = async function getDeviceTime (format = MOMENT_FORMAT_ISO8601) {\n this.log.debug('Attempting to capture android device date and time. ' +\n `The format specifier is '${format}'`);\n const deviceTimestamp = (await this.adb.shell(['date', '+%Y-%m-%dT%T%z'])).trim();\n this.log.debug(`Got device timestamp: ${deviceTimestamp}`);\n const parsedTimestamp = moment.utc(deviceTimestamp, 'YYYY-MM-DDTHH:mm:ssZZ');\n if (!parsedTimestamp.isValid()) {\n this.log.warn('Cannot parse the returned timestamp. Returning as is');\n return deviceTimestamp;\n }\n return parsedTimestamp.utcOffset(parsedTimestamp._tzm || 0).format(format);\n};\n\n/**\n * @typedef {Object} DeviceTimeOptions\n * @property {string} format [YYYY-MM-DDTHH:mm:ssZ] - See getDeviceTime#format\n */\n\n/**\n * Retrieves the current device time\n *\n * @param {DeviceTimeOptions} opts\n * @return {string} Formatted datetime string or the raw command output if formatting fails\n */\ncommands.mobileGetDeviceTime = async function mobileGetDeviceTime (opts = {}) {\n return await this.getDeviceTime(opts.format);\n};\n\ncommands.getPageSource = async function getPageSource () {\n return await this.bootstrap.sendAction('source');\n};\n\ncommands.back = async function back () {\n return await this.bootstrap.sendAction('pressBack');\n};\n\ncommands.openSettingsActivity = async function openSettingsActivity (setting) {\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n await this.adb.shell(['am', 'start', '-a', `android.settings.${setting}`]);\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n};\n\ncommands.getWindowSize = async function getWindowSize () {\n return await this.bootstrap.sendAction('getDeviceSize');\n};\n\n// For W3C\ncommands.getWindowRect = async function getWindowRect () {\n const { width, height } = await this.getWindowSize();\n return {\n width,\n height,\n x: 0,\n y: 0\n };\n};\n\ncommands.getCurrentActivity = async function getCurrentActivity () {\n return (await this.adb.getFocusedPackageAndActivity()).appActivity;\n};\n\ncommands.getCurrentPackage = async function getCurrentPackage () {\n return (await this.adb.getFocusedPackageAndActivity()).appPackage;\n};\n\ncommands.background = async function background (seconds) {\n if (seconds < 0) {\n // if user passes in a negative seconds value, interpret that as the instruction\n // to not bring the app back at all\n await this.adb.goToHome();\n return true;\n }\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n await this.adb.goToHome();\n\n // people can wait for a long time, so to be safe let's use the longSleep function and log\n // progress periodically.\n const sleepMs = seconds * 1000;\n const thresholdMs = 30 * 1000; // use the spin-wait for anything over this threshold\n // for our spin interval, use 1% of the total wait time, but nothing bigger than 30s\n const intervalMs = _.min([30 * 1000, parseInt(sleepMs / 100, 10)]);\n const progressCb = ({elapsedMs, progress}) => {\n const waitSecs = (elapsedMs / 1000).toFixed(0);\n const progressPct = (progress * 100).toFixed(2);\n this.log.debug(`Waited ${waitSecs}s so far (${progressPct}%)`);\n };\n await longSleep(sleepMs, {thresholdMs, intervalMs, progressCb});\n\n let args;\n if (this._cachedActivityArgs && this._cachedActivityArgs[`${appPackage}/${appActivity}`]) {\n // the activity was started with `startActivity`, so use those args to restart\n args = this._cachedActivityArgs[`${appPackage}/${appActivity}`];\n } else {\n try {\n this.log.debug(`Activating app '${appPackage}' in order to restore it`);\n await this.activateApp(appPackage);\n return true;\n } catch (ign) {}\n args = ((appPackage === this.opts.appPackage && appActivity === this.opts.appActivity) ||\n (appPackage === this.opts.appWaitPackage && (this.opts.appWaitActivity || '').split(',').includes(appActivity)))\n ? {// the activity is the original session activity, so use the original args\n pkg: this.opts.appPackage,\n activity: this.opts.appActivity,\n action: this.opts.intentAction,\n category: this.opts.intentCategory,\n flags: this.opts.intentFlags,\n waitPkg: this.opts.appWaitPackage,\n waitActivity: this.opts.appWaitActivity,\n waitForLaunch: this.opts.appWaitForLaunch,\n waitDuration: this.opts.appWaitDuration,\n optionalIntentArguments: this.opts.optionalIntentArguments,\n stopApp: false,\n user: this.opts.userProfile}\n : {// the activity was started some other way, so use defaults\n pkg: appPackage,\n activity: appActivity,\n waitPkg: appPackage,\n waitActivity: appActivity,\n stopApp: false};\n }\n args = await util.filterObject(args);\n this.log.debug(`Bringing application back to foreground with arguments: ${JSON.stringify(args)}`);\n return await this.adb.startApp(args);\n};\n\ncommands.getStrings = async function getStrings (language) {\n if (!language) {\n language = await this.adb.getDeviceLanguage();\n this.log.info(`No language specified, returning strings for: ${language}`);\n }\n\n // Clients require the resulting mapping to have both keys\n // and values of type string\n const preprocessStringsMap = (mapping) => {\n const result = {};\n for (const [key, value] of _.toPairs(mapping)) {\n result[key] = _.isString(value) ? value : JSON.stringify(value);\n }\n return result;\n };\n\n if (this.apkStrings[language]) {\n // Return cached strings\n return preprocessStringsMap(this.apkStrings[language]);\n }\n\n this.apkStrings[language] = await androidHelpers.pushStrings(language, this.adb, this.opts);\n if (this.bootstrap) {\n // TODO: This is mutating the current language, but it's how appium currently works\n await this.bootstrap.sendAction('updateStrings');\n }\n\n return preprocessStringsMap(this.apkStrings[language]);\n};\n\ncommands.launchApp = async function launchApp () {\n await this.initAUT();\n await this.startAUT();\n};\n\ncommands.startActivity = async function startActivity (appPackage, appActivity,\n appWaitPackage, appWaitActivity, intentAction, intentCategory, intentFlags,\n optionalIntentArguments, dontStopAppOnReset) {\n this.log.debug(`Starting package '${appPackage}' and activity '${appActivity}'`);\n\n // dontStopAppOnReset is both an argument here, and a desired capability\n // if the argument is set, use it, otherwise use the cap\n if (!util.hasValue(dontStopAppOnReset)) {\n dontStopAppOnReset = !!this.opts.dontStopAppOnReset;\n }\n\n let args = {\n pkg: appPackage,\n activity: appActivity,\n waitPkg: appWaitPackage || appPackage,\n waitActivity: appWaitActivity || appActivity,\n action: intentAction,\n category: intentCategory,\n flags: intentFlags,\n optionalIntentArguments,\n stopApp: !dontStopAppOnReset\n };\n this._cachedActivityArgs = this._cachedActivityArgs || {};\n this._cachedActivityArgs[`${args.waitPkg}/${args.waitActivity}`] = args;\n await this.adb.startApp(args);\n};\n\ncommands.reset = async function reset () {\n await androidHelpers.resetApp(this.adb, Object.assign({}, this.opts, {fastReset: true}));\n // reset context since we don't know what kind on context we will end up after app launch.\n await this.setContext();\n return await this.isChromeSession ? this.startChromeSession() : this.startAUT();\n};\n\ncommands.startAUT = async function startAUT () {\n await this.adb.startApp({\n pkg: this.opts.appPackage,\n activity: this.opts.appActivity,\n action: this.opts.intentAction,\n category: this.opts.intentCategory,\n flags: this.opts.intentFlags,\n waitPkg: this.opts.appWaitPackage,\n waitActivity: this.opts.appWaitActivity,\n waitForLaunch: this.opts.appWaitForLaunch,\n waitDuration: this.opts.appWaitDuration,\n optionalIntentArguments: this.opts.optionalIntentArguments,\n stopApp: !this.opts.dontStopAppOnReset,\n user: this.opts.userProfile,\n });\n};\n\n// we override setUrl to take an android URI which can be used for deep-linking\n// inside an app, similar to starting an intent\ncommands.setUrl = async function setUrl (uri) {\n await this.adb.startUri(uri, this.opts.appPackage);\n};\n\n// closing app using force stop\ncommands.closeApp = async function closeApp () {\n await this.adb.forceStop(this.opts.appPackage);\n // reset context since we don't know what kind on context we will end up after app launch.\n await this.setContext();\n};\n\ncommands.getDisplayDensity = async function getDisplayDensity () {\n // first try the property for devices\n let out = await this.adb.shell(['getprop', 'ro.sf.lcd_density']);\n if (out) {\n let val = parseInt(out, 10);\n // if the value is NaN, try getting the emulator property\n if (!isNaN(val)) {\n return val;\n }\n this.log.debug(`Parsed density value was NaN: \"${out}\"`);\n }\n // fallback to trying property for emulators\n out = await this.adb.shell(['getprop', 'qemu.sf.lcd_density']);\n if (out) {\n let val = parseInt(out, 10);\n if (!isNaN(val)) {\n return val;\n }\n this.log.debug(`Parsed density value was NaN: \"${out}\"`);\n }\n // couldn't get anything, so error out\n this.log.errorAndThrow('Failed to get display density property.');\n};\n\ncommands.mobilePerformEditorAction = async function mobilePerformEditorAction (opts = {}) {\n const {action} = opts;\n if (!util.hasValue(action)) {\n throw new errors.InvalidArgumentError(`'action' argument is required`);\n }\n\n await this.adb.performEditorAction(action);\n};\n\n/**\n * Retrieves the list of recent system notifications.\n *\n * @returns {Object} See the documentation on `adb.getNotifications` for\n * more details\n */\ncommands.mobileGetNotifications = async function mobileGetNotifications () {\n return await this.adb.getNotifications();\n};\n\n/**\n * @typedef {Object} SmsListOptions\n * @property {number} max [100] - The maximum count of recent SMS messages\n * to retrieve\n */\n\n/**\n * Retrieves the list of recent SMS messages with their properties.\n *\n * @param {SmsListOptions} opts\n * @returns {Object} See the documentation on `adb.getSmsList` for\n * more details\n */\ncommands.mobileListSms = async function mobileListSms (opts = {}) {\n return await this.adb.getSmsList(opts);\n};\n\n/**\n * @typedef {Object} UnlockOptions\n * @property {string} key The unlock key. The value of this key depends\n * on the actual unlock type and could be a pin/password/pattern value or\n * a biometric finger id.\n * @property {string} type The unlock type. The following unlock types\n * are supported: `pin`, `pinWithKeyEvent`, `password`, `pattern` and `fingerprint`.\n * @property {?string} strategy Either 'locksettings' (default) or 'uiautomator'.\n * Setting it to 'uiautomator' will enforce the driver to avoid using special\n * ADB shortcuts in order to speed up the unlock procedure.\n * @property {?number} timeoutMs [2000] The maximum time in milliseconds\n * to wait until the screen gets unlocked\n */\n\n/**\n * Unlocks the device if it is locked. Noop if the device's screen is not locked.\n *\n * @param {?UnlockOptions} opts\n * @throws {Error} if unlock operation fails or the provided\n * arguments are not valid\n */\ncommands.mobileUnlock = async function mobileUnlock (opts = {}) {\n const { key, type, strategy, timeoutMs } = opts;\n await androidHelpers.unlock(this, this.adb, {\n unlockKey: key,\n unlockType: type,\n unlockStrategy: strategy,\n unlockSuccessTimeout: timeoutMs,\n });\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":";;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,QAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,SAAA,GAAAJ,OAAA;AACA,IAAAK,OAAA,GAAAL,OAAA;AAEA,MAAMM,qBAAqB,GAAG,sBAAsB;AAEpD,IAAIC,QAAQ,GAAG,CAAC,CAAC;EAAEC,OAAO,GAAG,CAAC,CAAC;EAAEC,UAAU,GAAG,CAAC,CAAC;AAACC,OAAA,CAAAF,OAAA,GAAAA,OAAA;AAAAE,OAAA,CAAAH,QAAA,GAAAA,QAAA;AAEjDA,QAAQ,CAACI,IAAI,GAAG,eAAeA,IAAIA,CAAEA,IAAI,EAAE;EAEzCA,IAAI,GAAGC,eAAC,CAACC,OAAO,CAACF,IAAI,CAAC,GAAGA,IAAI,CAACG,IAAI,CAAC,EAAE,CAAC,GAAGH,IAAI;EAC7C,IAAII,MAAM,GAAG;IACXC,IAAI,EAAEL,IAAI;IACVM,OAAO,EAAE;EACX,CAAC;EACD,IAAI,IAAI,CAACC,IAAI,CAACC,eAAe,EAAE;IAC7BJ,MAAM,CAACI,eAAe,GAAG,IAAI;EAC/B;EACA,MAAM,IAAI,CAACC,UAAU,CAACL,MAAM,CAAC;AAC/B,CAAC;AAEDR,QAAQ,CAACa,UAAU,GAAG,eAAeA,UAAUA,CAAEL,MAAM,EAAE;EACvD,OAAO,MAAM,IAAI,CAACM,SAAS,CAACC,UAAU,CAAC,SAAS,EAAEP,MAAM,CAAC;AAC3D,CAAC;AAWDR,QAAQ,CAACgB,aAAa,GAAG,eAAeA,aAAaA,CAAEC,MAAM,GAAGlB,qBAAqB,EAAE;EACrF,IAAI,CAACmB,GAAG,CAACC,KAAK,CAAC,sDAAsD,GAClE,4BAA2BF,MAAO,GAAE,CAAC;EACxC,MAAMG,eAAe,GAAG,CAAC,MAAM,IAAI,CAACC,GAAG,CAACC,KAAK,CAAC,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,EAAEC,IAAI,EAAE;EACjF,IAAI,CAACL,GAAG,CAACC,KAAK,CAAE,yBAAwBC,eAAgB,EAAC,CAAC;EAC1D,MAAMI,eAAe,GAAGC,eAAM,CAACC,GAAG,CAACN,eAAe,EAAE,uBAAuB,CAAC;EAC5E,IAAI,CAACI,eAAe,CAACG,OAAO,EAAE,EAAE;IAC9B,IAAI,CAACT,GAAG,CAACU,IAAI,CAAC,sDAAsD,CAAC;IACrE,OAAOR,eAAe;EACxB;EACA,OAAOI,eAAe,CAACK,SAAS,CAACL,eAAe,CAACM,IAAI,IAAI,CAAC,CAAC,CAACb,MAAM,CAACA,MAAM,CAAC;AAC5E,CAAC;AAaDjB,QAAQ,CAAC+B,mBAAmB,GAAG,eAAeA,mBAAmBA,CAAEpB,IAAI,GAAG,CAAC,CAAC,EAAE;EAC5E,OAAO,MAAM,IAAI,CAACK,aAAa,CAACL,IAAI,CAACM,MAAM,CAAC;AAC9C,CAAC;AAEDjB,QAAQ,CAACgC,aAAa,GAAG,eAAeA,aAAaA,CAAA,EAAI;EACvD,OAAO,MAAM,IAAI,CAAClB,SAAS,CAACC,UAAU,CAAC,QAAQ,CAAC;AAClD,CAAC;AAEDf,QAAQ,CAACiC,IAAI,GAAG,eAAeA,IAAIA,CAAA,EAAI;EACrC,OAAO,MAAM,IAAI,CAACnB,SAAS,CAACC,UAAU,CAAC,WAAW,CAAC;AACrD,CAAC;AAEDf,QAAQ,CAACkC,oBAAoB,GAAG,eAAeA,oBAAoBA,CAAEC,OAAO,EAAE;EAC5E,IAAI;IAACC,UAAU;IAAEC;EAAW,CAAC,GAAG,MAAM,IAAI,CAAChB,GAAG,CAACiB,4BAA4B,EAAE;EAC7E,MAAM,IAAI,CAACjB,GAAG,CAACC,KAAK,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAG,oBAAmBa,OAAQ,EAAC,CAAC,CAAC;EAC1E,MAAM,IAAI,CAACd,GAAG,CAACkB,kBAAkB,CAACH,UAAU,EAAEC,WAAW,EAAE,IAAI,CAAC;AAClE,CAAC;AAEDrC,QAAQ,CAACwC,aAAa,GAAG,eAAeA,aAAaA,CAAA,EAAI;EACvD,OAAO,MAAM,IAAI,CAAC1B,SAAS,CAACC,UAAU,CAAC,eAAe,CAAC;AACzD,CAAC;AAGDf,QAAQ,CAACyC,aAAa,GAAG,eAAeA,aAAaA,CAAA,EAAI;EACvD,MAAM;IAAEC,KAAK;IAAEC;EAAO,CAAC,GAAG,MAAM,IAAI,CAACH,aAAa,EAAE;EACpD,OAAO;IACLE,KAAK;IACLC,MAAM;IACNC,CAAC,EAAE,CAAC;IACJC,CAAC,EAAE;EACL,CAAC;AACH,CAAC;AAED7C,QAAQ,CAAC8C,kBAAkB,GAAG,eAAeA,kBAAkBA,CAAA,EAAI;EACjE,OAAO,CAAC,MAAM,IAAI,CAACzB,GAAG,CAACiB,4BAA4B,EAAE,EAAED,WAAW;AACpE,CAAC;AAEDrC,QAAQ,CAAC+C,iBAAiB,GAAG,eAAeA,iBAAiBA,CAAA,EAAI;EAC/D,OAAO,CAAC,MAAM,IAAI,CAAC1B,GAAG,CAACiB,4BAA4B,EAAE,EAAEF,UAAU;AACnE,CAAC;AAEDpC,QAAQ,CAACgD,UAAU,GAAG,eAAeA,UAAUA,CAAEC,OAAO,EAAE;EACxD,IAAIA,OAAO,GAAG,CAAC,EAAE;IAGf,MAAM,IAAI,CAAC5B,GAAG,CAAC6B,QAAQ,EAAE;IACzB,OAAO,IAAI;EACb;EACA,IAAI;IAACd,UAAU;IAAEC;EAAW,CAAC,GAAG,MAAM,IAAI,CAAChB,GAAG,CAACiB,4BAA4B,EAAE;EAC7E,MAAM,IAAI,CAACjB,GAAG,CAAC6B,QAAQ,EAAE;EAIzB,MAAMC,OAAO,GAAGF,OAAO,GAAG,IAAI;EAC9B,MAAMG,WAAW,GAAG,EAAE,GAAG,IAAI;EAE7B,MAAMC,UAAU,GAAGhD,eAAC,CAACiD,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,EAAEC,QAAQ,CAACJ,OAAO,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;EAClE,MAAMK,UAAU,GAAGA,CAAC;IAACC,SAAS;IAAEC;EAAQ,CAAC,KAAK;IAC5C,MAAMC,QAAQ,GAAG,CAACF,SAAS,GAAG,IAAI,EAAEG,OAAO,CAAC,CAAC,CAAC;IAC9C,MAAMC,WAAW,GAAG,CAACH,QAAQ,GAAG,GAAG,EAAEE,OAAO,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC1C,GAAG,CAACC,KAAK,CAAE,UAASwC,QAAS,aAAYE,WAAY,IAAG,CAAC;EAChE,CAAC;EACD,MAAM,IAAAC,mBAAS,EAACX,OAAO,EAAE;IAACC,WAAW;IAAEC,UAAU;IAAEG;EAAU,CAAC,CAAC;EAE/D,IAAIO,IAAI;EACR,IAAI,IAAI,CAACC,mBAAmB,IAAI,IAAI,CAACA,mBAAmB,CAAE,GAAE5B,UAAW,IAAGC,WAAY,EAAC,CAAC,EAAE;IAExF0B,IAAI,GAAG,IAAI,CAACC,mBAAmB,CAAE,GAAE5B,UAAW,IAAGC,WAAY,EAAC,CAAC;EACjE,CAAC,MAAM;IACL,IAAI;MACF,IAAI,CAACnB,GAAG,CAACC,KAAK,CAAE,mBAAkBiB,UAAW,0BAAyB,CAAC;MACvE,MAAM,IAAI,CAAC6B,WAAW,CAAC7B,UAAU,CAAC;MAClC,OAAO,IAAI;IACb,CAAC,CAAC,OAAO8B,GAAG,EAAE,CAAC;IACfH,IAAI,GAAK3B,UAAU,KAAK,IAAI,CAACzB,IAAI,CAACyB,UAAU,IAAIC,WAAW,KAAK,IAAI,CAAC1B,IAAI,CAAC0B,WAAW,IAC5ED,UAAU,KAAK,IAAI,CAACzB,IAAI,CAACwD,cAAc,IAAI,CAAC,IAAI,CAACxD,IAAI,CAACyD,eAAe,IAAI,EAAE,EAAEC,KAAK,CAAC,GAAG,CAAC,CAACC,QAAQ,CAACjC,WAAW,CAAE,GACnH;MACAkC,GAAG,EAAE,IAAI,CAAC5D,IAAI,CAACyB,UAAU;MACzBoC,QAAQ,EAAE,IAAI,CAAC7D,IAAI,CAAC0B,WAAW;MAC/BoC,MAAM,EAAE,IAAI,CAAC9D,IAAI,CAAC+D,YAAY;MAC9BC,QAAQ,EAAE,IAAI,CAAChE,IAAI,CAACiE,cAAc;MAClCC,KAAK,EAAE,IAAI,CAAClE,IAAI,CAACmE,WAAW;MAC5BC,OAAO,EAAE,IAAI,CAACpE,IAAI,CAACwD,cAAc;MACjCa,YAAY,EAAE,IAAI,CAACrE,IAAI,CAACyD,eAAe;MACvCa,aAAa,EAAE,IAAI,CAACtE,IAAI,CAACuE,gBAAgB;MACzCC,YAAY,EAAE,IAAI,CAACxE,IAAI,CAACyE,eAAe;MACvCC,uBAAuB,EAAE,IAAI,CAAC1E,IAAI,CAAC0E,uBAAuB;MAC1DC,OAAO,EAAE,KAAK;MACdC,IAAI,EAAE,IAAI,CAAC5E,IAAI,CAAC6E;IAAW,CAAC,GAC5B;MACAjB,GAAG,EAAEnC,UAAU;MACfoC,QAAQ,EAAEnC,WAAW;MACrB0C,OAAO,EAAE3C,UAAU;MACnB4C,YAAY,EAAE3C,WAAW;MACzBiD,OAAO,EAAE;IAAK,CAAC;EACrB;EACAvB,IAAI,GAAG,MAAM0B,aAAI,CAACC,YAAY,CAAC3B,IAAI,CAAC;EACpC,IAAI,CAAC7C,GAAG,CAACC,KAAK,CAAE,2DAA0DwE,IAAI,CAACC,SAAS,CAAC7B,IAAI,CAAE,EAAC,CAAC;EACjG,OAAO,MAAM,IAAI,CAAC1C,GAAG,CAACwE,QAAQ,CAAC9B,IAAI,CAAC;AACtC,CAAC;AAED/D,QAAQ,CAAC8F,UAAU,GAAG,eAAeA,UAAUA,CAAEC,QAAQ,EAAE;EACzD,IAAI,CAACA,QAAQ,EAAE;IACbA,QAAQ,GAAG,MAAM,IAAI,CAAC1E,GAAG,CAAC2E,iBAAiB,EAAE;IAC7C,IAAI,CAAC9E,GAAG,CAAC+E,IAAI,CAAE,iDAAgDF,QAAS,EAAC,CAAC;EAC5E;EAIA,MAAMG,oBAAoB,GAAIC,OAAO,IAAK;IACxC,MAAMC,MAAM,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,CAACC,GAAG,EAAEC,KAAK,CAAC,IAAIjG,eAAC,CAACkG,OAAO,CAACJ,OAAO,CAAC,EAAE;MAC7CC,MAAM,CAACC,GAAG,CAAC,GAAGhG,eAAC,CAACmG,QAAQ,CAACF,KAAK,CAAC,GAAGA,KAAK,GAAGX,IAAI,CAACC,SAAS,CAACU,KAAK,CAAC;IACjE;IACA,OAAOF,MAAM;EACf,CAAC;EAED,IAAI,IAAI,CAACK,UAAU,CAACV,QAAQ,CAAC,EAAE;IAE7B,OAAOG,oBAAoB,CAAC,IAAI,CAACO,UAAU,CAACV,QAAQ,CAAC,CAAC;EACxD;EAEA,IAAI,CAACU,UAAU,CAACV,QAAQ,CAAC,GAAG,MAAMW,uBAAc,CAACC,WAAW,CAACZ,QAAQ,EAAE,IAAI,CAAC1E,GAAG,EAAE,IAAI,CAACV,IAAI,CAAC;EAC3F,IAAI,IAAI,CAACG,SAAS,EAAE;IAElB,MAAM,IAAI,CAACA,SAAS,CAACC,UAAU,CAAC,eAAe,CAAC;EAClD;EAEA,OAAOmF,oBAAoB,CAAC,IAAI,CAACO,UAAU,CAACV,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED/F,QAAQ,CAAC4G,SAAS,GAAG,eAAeA,SAASA,CAAA,EAAI;EAC/C,MAAM,IAAI,CAACC,OAAO,EAAE;EACpB,MAAM,IAAI,CAACC,QAAQ,EAAE;AACvB,CAAC;AAED9G,QAAQ,CAAC+G,aAAa,GAAG,eAAeA,aAAaA,CAAE3E,UAAU,EAAEC,WAAW,EAC5E8B,cAAc,EAAEC,eAAe,EAAEM,YAAY,EAAEE,cAAc,EAAEE,WAAW,EAC1EO,uBAAuB,EAAE2B,kBAAkB,EAAE;EAC7C,IAAI,CAAC9F,GAAG,CAACC,KAAK,CAAE,qBAAoBiB,UAAW,mBAAkBC,WAAY,GAAE,CAAC;EAIhF,IAAI,CAACoD,aAAI,CAACwB,QAAQ,CAACD,kBAAkB,CAAC,EAAE;IACtCA,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAACrG,IAAI,CAACqG,kBAAkB;EACrD;EAEA,IAAIjD,IAAI,GAAG;IACTQ,GAAG,EAAEnC,UAAU;IACfoC,QAAQ,EAAEnC,WAAW;IACrB0C,OAAO,EAAEZ,cAAc,IAAI/B,UAAU;IACrC4C,YAAY,EAAEZ,eAAe,IAAI/B,WAAW;IAC5CoC,MAAM,EAAEC,YAAY;IACpBC,QAAQ,EAAEC,cAAc;IACxBC,KAAK,EAAEC,WAAW;IAClBO,uBAAuB;IACvBC,OAAO,EAAE,CAAC0B;EACZ,CAAC;EACD,IAAI,CAAChD,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,IAAI,CAAC,CAAC;EACzD,IAAI,CAACA,mBAAmB,CAAE,GAAED,IAAI,CAACgB,OAAQ,IAAGhB,IAAI,CAACiB,YAAa,EAAC,CAAC,GAAGjB,IAAI;EACvE,MAAM,IAAI,CAAC1C,GAAG,CAACwE,QAAQ,CAAC9B,IAAI,CAAC;AAC/B,CAAC;AAED/D,QAAQ,CAACkH,KAAK,GAAG,eAAeA,KAAKA,CAAA,EAAI;EACvC,MAAMR,uBAAc,CAACS,QAAQ,CAAC,IAAI,CAAC9F,GAAG,EAAE+F,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC1G,IAAI,EAAE;IAAC2G,SAAS,EAAE;EAAI,CAAC,CAAC,CAAC;EAExF,MAAM,IAAI,CAACC,UAAU,EAAE;EACvB,OAAO,OAAM,IAAI,CAACC,eAAe,IAAG,IAAI,CAACC,kBAAkB,EAAE,GAAG,IAAI,CAACX,QAAQ,EAAE;AACjF,CAAC;AAED9G,QAAQ,CAAC8G,QAAQ,GAAG,eAAeA,QAAQA,CAAA,EAAI;EAC7C,MAAM,IAAI,CAACzF,GAAG,CAACwE,QAAQ,CAAC;IACtBtB,GAAG,EAAE,IAAI,CAAC5D,IAAI,CAACyB,UAAU;IACzBoC,QAAQ,EAAE,IAAI,CAAC7D,IAAI,CAAC0B,WAAW;IAC/BoC,MAAM,EAAE,IAAI,CAAC9D,IAAI,CAAC+D,YAAY;IAC9BC,QAAQ,EAAE,IAAI,CAAChE,IAAI,CAACiE,cAAc;IAClCC,KAAK,EAAE,IAAI,CAAClE,IAAI,CAACmE,WAAW;IAC5BC,OAAO,EAAE,IAAI,CAACpE,IAAI,CAACwD,cAAc;IACjCa,YAAY,EAAE,IAAI,CAACrE,IAAI,CAACyD,eAAe;IACvCa,aAAa,EAAE,IAAI,CAACtE,IAAI,CAACuE,gBAAgB;IACzCC,YAAY,EAAE,IAAI,CAACxE,IAAI,CAACyE,eAAe;IACvCC,uBAAuB,EAAE,IAAI,CAAC1E,IAAI,CAAC0E,uBAAuB;IAC1DC,OAAO,EAAE,CAAC,IAAI,CAAC3E,IAAI,CAACqG,kBAAkB;IACtCzB,IAAI,EAAE,IAAI,CAAC5E,IAAI,CAAC6E;EAClB,CAAC,CAAC;AACJ,CAAC;AAIDxF,QAAQ,CAAC0H,MAAM,GAAG,eAAeA,MAAMA,CAAEC,GAAG,EAAE;EAC5C,MAAM,IAAI,CAACtG,GAAG,CAACuG,QAAQ,CAACD,GAAG,EAAE,IAAI,CAAChH,IAAI,CAACyB,UAAU,CAAC;AACpD,CAAC;AAGDpC,QAAQ,CAAC6H,QAAQ,GAAG,eAAeA,QAAQA,CAAA,EAAI;EAC7C,MAAM,IAAI,CAACxG,GAAG,CAACyG,SAAS,CAAC,IAAI,CAACnH,IAAI,CAACyB,UAAU,CAAC;EAE9C,MAAM,IAAI,CAACmF,UAAU,EAAE;AACzB,CAAC;AAEDvH,QAAQ,CAAC+H,iBAAiB,GAAG,eAAeA,iBAAiBA,CAAA,EAAI;EAE/D,IAAIC,GAAG,GAAG,MAAM,IAAI,CAAC3G,GAAG,CAACC,KAAK,CAAC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;EAChE,IAAI0G,GAAG,EAAE;IACP,IAAIC,GAAG,GAAG1E,QAAQ,CAACyE,GAAG,EAAE,EAAE,CAAC;IAE3B,IAAI,CAACE,KAAK,CAACD,GAAG,CAAC,EAAE;MACf,OAAOA,GAAG;IACZ;IACA,IAAI,CAAC/G,GAAG,CAACC,KAAK,CAAE,kCAAiC6G,GAAI,GAAE,CAAC;EAC1D;EAEAA,GAAG,GAAG,MAAM,IAAI,CAAC3G,GAAG,CAACC,KAAK,CAAC,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;EAC9D,IAAI0G,GAAG,EAAE;IACP,IAAIC,GAAG,GAAG1E,QAAQ,CAACyE,GAAG,EAAE,EAAE,CAAC;IAC3B,IAAI,CAACE,KAAK,CAACD,GAAG,CAAC,EAAE;MACf,OAAOA,GAAG;IACZ;IACA,IAAI,CAAC/G,GAAG,CAACC,KAAK,CAAE,kCAAiC6G,GAAI,GAAE,CAAC;EAC1D;EAEA,IAAI,CAAC9G,GAAG,CAACiH,aAAa,CAAC,yCAAyC,CAAC;AACnE,CAAC;AAEDnI,QAAQ,CAACoI,yBAAyB,GAAG,eAAeA,yBAAyBA,CAAEzH,IAAI,GAAG,CAAC,CAAC,EAAE;EACxF,MAAM;IAAC8D;EAAM,CAAC,GAAG9D,IAAI;EACrB,IAAI,CAAC8E,aAAI,CAACwB,QAAQ,CAACxC,MAAM,CAAC,EAAE;IAC1B,MAAM,IAAI4D,cAAM,CAACC,oBAAoB,CAAE,+BAA8B,CAAC;EACxE;EAEA,MAAM,IAAI,CAACjH,GAAG,CAACkH,mBAAmB,CAAC9D,MAAM,CAAC;AAC5C,CAAC;AAQDzE,QAAQ,CAACwI,sBAAsB,GAAG,eAAeA,sBAAsBA,CAAA,EAAI;EACzE,OAAO,MAAM,IAAI,CAACnH,GAAG,CAACoH,gBAAgB,EAAE;AAC1C,CAAC;AAeDzI,QAAQ,CAAC0I,aAAa,GAAG,eAAeA,aAAaA,CAAE/H,IAAI,GAAG,CAAC,CAAC,EAAE;EAChE,OAAO,MAAM,IAAI,CAACU,GAAG,CAACsH,UAAU,CAAChI,IAAI,CAAC;AACxC,CAAC;AAuBDX,QAAQ,CAAC4I,YAAY,GAAG,eAAeA,YAAYA,CAAEjI,IAAI,GAAG,CAAC,CAAC,EAAE;EAC9D,MAAM;IAAE0F,GAAG;IAAEwC,IAAI;IAAEC,QAAQ;IAAEC;EAAU,CAAC,GAAGpI,IAAI;EAC/C,MAAM+F,uBAAc,CAACsC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC3H,GAAG,EAAE;IAC1C4H,SAAS,EAAE5C,GAAG;IACd6C,UAAU,EAAEL,IAAI;IAChBM,cAAc,EAAEL,QAAQ;IACxBM,oBAAoB,EAAEL;EACxB,CAAC,CAAC;AACJ,CAAC;AAED3B,MAAM,CAACC,MAAM,CAACnH,UAAU,EAAEF,QAAQ,EAAEC,OAAO,CAAC;AAAC,IAAAoJ,QAAA,GAE9BnJ,UAAU;AAAAC,OAAA,CAAAmJ,OAAA,GAAAD,QAAA"}
1
+ {"version":3,"file":"general.js","names":["_lodash","_interopRequireDefault","require","_androidHelpers","_support","_moment","_asyncbox","_driver","MOMENT_FORMAT_ISO8601","commands","helpers","extensions","exports","keys","_","isArray","join","params","text","replace","opts","unicodeKeyboard","doSendKeys","bootstrap","sendAction","getDeviceTime","format","log","debug","deviceTimestamp","adb","shell","trim","parsedTimestamp","moment","utc","isValid","warn","utcOffset","_tzm","mobileGetDeviceTime","getPageSource","back","openSettingsActivity","setting","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","getWindowSize","getWindowRect","width","height","x","y","getCurrentActivity","getCurrentPackage","background","seconds","goToHome","sleepMs","thresholdMs","intervalMs","min","parseInt","progressCb","elapsedMs","progress","waitSecs","toFixed","progressPct","longSleep","args","_cachedActivityArgs","activateApp","ign","appWaitPackage","appWaitActivity","split","includes","pkg","activity","action","intentAction","category","intentCategory","flags","intentFlags","waitPkg","waitActivity","waitForLaunch","appWaitForLaunch","waitDuration","appWaitDuration","optionalIntentArguments","stopApp","user","userProfile","util","filterObject","JSON","stringify","startApp","getStrings","language","getDeviceLanguage","info","preprocessStringsMap","mapping","result","key","value","toPairs","isString","apkStrings","androidHelpers","pushStrings","launchApp","initAUT","startAUT","startActivity","dontStopAppOnReset","hasValue","reset","resetApp","Object","assign","fastReset","setContext","isChromeSession","startChromeSession","setUrl","uri","startUri","closeApp","forceStop","getDisplayDensity","out","val","isNaN","errorAndThrow","mobilePerformEditorAction","errors","InvalidArgumentError","performEditorAction","mobileGetNotifications","getNotifications","mobileListSms","getSmsList","mobileUnlock","type","strategy","timeoutMs","unlock","unlockKey","unlockType","unlockStrategy","unlockSuccessTimeout","_default","default"],"sources":["../../../lib/commands/general.js"],"sourcesContent":["import _ from 'lodash';\nimport androidHelpers from '../android-helpers';\nimport { util } from '@appium/support';\nimport moment from 'moment';\nimport { longSleep } from 'asyncbox';\nimport { errors } from 'appium/driver';\n\nconst MOMENT_FORMAT_ISO8601 = 'YYYY-MM-DDTHH:mm:ssZ';\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.keys = async function keys (keys) {\n // Protocol sends an array; rethink approach\n keys = _.isArray(keys) ? keys.join('') : keys;\n let params = {\n text: keys,\n replace: false\n };\n if (this.opts.unicodeKeyboard) {\n params.unicodeKeyboard = true;\n }\n await this.doSendKeys(params);\n};\n\ncommands.doSendKeys = async function doSendKeys (params) {\n return await this.bootstrap.sendAction('setText', params);\n};\n\n/**\n * Retrieves the current device's timestamp.\n *\n * @param {string} format - The set of format specifiers. Read\n * https://momentjs.com/docs/ to get the full list of supported\n * datetime format specifiers. The default format is\n * `YYYY-MM-DDTHH:mm:ssZ`, which complies to ISO-8601\n * @return {string} Formatted datetime string or the raw command output if formatting fails\n */\ncommands.getDeviceTime = async function getDeviceTime (format = MOMENT_FORMAT_ISO8601) {\n this.log.debug('Attempting to capture android device date and time. ' +\n `The format specifier is '${format}'`);\n const deviceTimestamp = (await this.adb.shell(['date', '+%Y-%m-%dT%T%z'])).trim();\n this.log.debug(`Got device timestamp: ${deviceTimestamp}`);\n const parsedTimestamp = moment.utc(deviceTimestamp, 'YYYY-MM-DDTHH:mm:ssZZ');\n if (!parsedTimestamp.isValid()) {\n this.log.warn('Cannot parse the returned timestamp. Returning as is');\n return deviceTimestamp;\n }\n return parsedTimestamp.utcOffset(parsedTimestamp._tzm || 0).format(format);\n};\n\n/**\n * @typedef {Object} DeviceTimeOptions\n * @property {string} format [YYYY-MM-DDTHH:mm:ssZ] - See getDeviceTime#format\n */\n\n/**\n * Retrieves the current device time\n *\n * @param {DeviceTimeOptions} opts\n * @return {string} Formatted datetime string or the raw command output if formatting fails\n */\ncommands.mobileGetDeviceTime = async function mobileGetDeviceTime (opts = {}) {\n return await this.getDeviceTime(opts.format);\n};\n\ncommands.getPageSource = async function getPageSource () {\n return await this.bootstrap.sendAction('source');\n};\n\ncommands.back = async function back () {\n return await this.bootstrap.sendAction('pressBack');\n};\n\ncommands.openSettingsActivity = async function openSettingsActivity (setting) {\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n await this.adb.shell(['am', 'start', '-a', `android.settings.${setting}`]);\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n};\n\ncommands.getWindowSize = async function getWindowSize () {\n return await this.bootstrap.sendAction('getDeviceSize');\n};\n\n// For W3C\ncommands.getWindowRect = async function getWindowRect () {\n const { width, height } = await this.getWindowSize();\n return {\n width,\n height,\n x: 0,\n y: 0\n };\n};\n\ncommands.getCurrentActivity = async function getCurrentActivity () {\n return (await this.adb.getFocusedPackageAndActivity()).appActivity;\n};\n\ncommands.getCurrentPackage = async function getCurrentPackage () {\n return (await this.adb.getFocusedPackageAndActivity()).appPackage;\n};\n\ncommands.background = async function background (seconds) {\n if (seconds < 0) {\n // if user passes in a negative seconds value, interpret that as the instruction\n // to not bring the app back at all\n await this.adb.goToHome();\n return true;\n }\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n await this.adb.goToHome();\n\n // people can wait for a long time, so to be safe let's use the longSleep function and log\n // progress periodically.\n const sleepMs = seconds * 1000;\n const thresholdMs = 30 * 1000; // use the spin-wait for anything over this threshold\n // for our spin interval, use 1% of the total wait time, but nothing bigger than 30s\n const intervalMs = _.min([30 * 1000, parseInt(sleepMs / 100, 10)]);\n const progressCb = ({elapsedMs, progress}) => {\n const waitSecs = (elapsedMs / 1000).toFixed(0);\n const progressPct = (progress * 100).toFixed(2);\n this.log.debug(`Waited ${waitSecs}s so far (${progressPct}%)`);\n };\n await longSleep(sleepMs, {thresholdMs, intervalMs, progressCb});\n\n let args;\n if (this._cachedActivityArgs && this._cachedActivityArgs[`${appPackage}/${appActivity}`]) {\n // the activity was started with `startActivity`, so use those args to restart\n args = this._cachedActivityArgs[`${appPackage}/${appActivity}`];\n } else {\n try {\n this.log.debug(`Activating app '${appPackage}' in order to restore it`);\n await this.activateApp(appPackage);\n return true;\n } catch (ign) {}\n args = ((appPackage === this.opts.appPackage && appActivity === this.opts.appActivity) ||\n (appPackage === this.opts.appWaitPackage && (this.opts.appWaitActivity || '').split(',').includes(appActivity)))\n ? {// the activity is the original session activity, so use the original args\n pkg: this.opts.appPackage,\n activity: this.opts.appActivity,\n action: this.opts.intentAction,\n category: this.opts.intentCategory,\n flags: this.opts.intentFlags,\n waitPkg: this.opts.appWaitPackage,\n waitActivity: this.opts.appWaitActivity,\n waitForLaunch: this.opts.appWaitForLaunch,\n waitDuration: this.opts.appWaitDuration,\n optionalIntentArguments: this.opts.optionalIntentArguments,\n stopApp: false,\n user: this.opts.userProfile}\n : {// the activity was started some other way, so use defaults\n pkg: appPackage,\n activity: appActivity,\n waitPkg: appPackage,\n waitActivity: appActivity,\n stopApp: false};\n }\n args = await util.filterObject(args);\n this.log.debug(`Bringing application back to foreground with arguments: ${JSON.stringify(args)}`);\n return await this.adb.startApp(args);\n};\n\ncommands.getStrings = async function getStrings (language) {\n if (!language) {\n language = await this.adb.getDeviceLanguage();\n this.log.info(`No language specified, returning strings for: ${language}`);\n }\n\n // Clients require the resulting mapping to have both keys\n // and values of type string\n const preprocessStringsMap = (mapping) => {\n const result = {};\n for (const [key, value] of _.toPairs(mapping)) {\n result[key] = _.isString(value) ? value : JSON.stringify(value);\n }\n return result;\n };\n\n if (this.apkStrings[language]) {\n // Return cached strings\n return preprocessStringsMap(this.apkStrings[language]);\n }\n\n this.apkStrings[language] = await androidHelpers.pushStrings(language, this.adb, this.opts);\n if (this.bootstrap) {\n // TODO: This is mutating the current language, but it's how appium currently works\n await this.bootstrap.sendAction('updateStrings');\n }\n\n return preprocessStringsMap(this.apkStrings[language]);\n};\n\ncommands.launchApp = async function launchApp () {\n await this.initAUT();\n await this.startAUT();\n};\n\ncommands.startActivity = async function startActivity (appPackage, appActivity,\n appWaitPackage, appWaitActivity, intentAction, intentCategory, intentFlags,\n optionalIntentArguments, dontStopAppOnReset) {\n this.log.debug(`Starting package '${appPackage}' and activity '${appActivity}'`);\n\n // dontStopAppOnReset is both an argument here, and a desired capability\n // if the argument is set, use it, otherwise use the cap\n if (!util.hasValue(dontStopAppOnReset)) {\n dontStopAppOnReset = !!this.opts.dontStopAppOnReset;\n }\n\n let args = {\n pkg: appPackage,\n activity: appActivity,\n waitPkg: appWaitPackage || appPackage,\n waitActivity: appWaitActivity || appActivity,\n action: intentAction,\n category: intentCategory,\n flags: intentFlags,\n optionalIntentArguments,\n stopApp: !dontStopAppOnReset\n };\n this._cachedActivityArgs = this._cachedActivityArgs || {};\n this._cachedActivityArgs[`${args.waitPkg}/${args.waitActivity}`] = args;\n await this.adb.startApp(args);\n};\n\ncommands.reset = async function reset () {\n await androidHelpers.resetApp(this.adb, Object.assign({}, this.opts, {fastReset: true}));\n // reset context since we don't know what kind on context we will end up after app launch.\n await this.setContext();\n return await this.isChromeSession ? this.startChromeSession() : this.startAUT();\n};\n\ncommands.startAUT = async function startAUT () {\n await this.adb.startApp({\n pkg: this.opts.appPackage,\n activity: this.opts.appActivity,\n action: this.opts.intentAction,\n category: this.opts.intentCategory,\n flags: this.opts.intentFlags,\n waitPkg: this.opts.appWaitPackage,\n waitActivity: this.opts.appWaitActivity,\n waitForLaunch: this.opts.appWaitForLaunch,\n waitDuration: this.opts.appWaitDuration,\n optionalIntentArguments: this.opts.optionalIntentArguments,\n stopApp: !this.opts.dontStopAppOnReset,\n user: this.opts.userProfile,\n });\n};\n\n// we override setUrl to take an android URI which can be used for deep-linking\n// inside an app, similar to starting an intent\ncommands.setUrl = async function setUrl (uri) {\n await this.adb.startUri(uri, this.opts.appPackage);\n};\n\n// closing app using force stop\ncommands.closeApp = async function closeApp () {\n await this.adb.forceStop(this.opts.appPackage);\n // reset context since we don't know what kind on context we will end up after app launch.\n await this.setContext();\n};\n\ncommands.getDisplayDensity = async function getDisplayDensity () {\n // first try the property for devices\n let out = await this.adb.shell(['getprop', 'ro.sf.lcd_density']);\n if (out) {\n let val = parseInt(out, 10);\n // if the value is NaN, try getting the emulator property\n if (!isNaN(val)) {\n return val;\n }\n this.log.debug(`Parsed density value was NaN: \"${out}\"`);\n }\n // fallback to trying property for emulators\n out = await this.adb.shell(['getprop', 'qemu.sf.lcd_density']);\n if (out) {\n let val = parseInt(out, 10);\n if (!isNaN(val)) {\n return val;\n }\n this.log.debug(`Parsed density value was NaN: \"${out}\"`);\n }\n // couldn't get anything, so error out\n this.log.errorAndThrow('Failed to get display density property.');\n};\n\ncommands.mobilePerformEditorAction = async function mobilePerformEditorAction (opts = {}) {\n const {action} = opts;\n if (!util.hasValue(action)) {\n throw new errors.InvalidArgumentError(`'action' argument is required`);\n }\n\n await this.adb.performEditorAction(action);\n};\n\n/**\n * Retrieves the list of recent system notifications.\n *\n * @returns {Object} See the documentation on `adb.getNotifications` for\n * more details\n */\ncommands.mobileGetNotifications = async function mobileGetNotifications () {\n return await this.adb.getNotifications();\n};\n\n/**\n * @typedef {Object} SmsListOptions\n * @property {number} max [100] - The maximum count of recent SMS messages\n * to retrieve\n */\n\n/**\n * Retrieves the list of recent SMS messages with their properties.\n *\n * @param {SmsListOptions} opts\n * @returns {Object} See the documentation on `adb.getSmsList` for\n * more details\n */\ncommands.mobileListSms = async function mobileListSms (opts = {}) {\n return await this.adb.getSmsList(opts);\n};\n\n/**\n * @typedef {Object} UnlockOptions\n * @property {string?} key The unlock key. The value of this key depends\n * on the actual unlock type and could be a pin/password/pattern value or\n * a biometric finger id.\n * If not provided then the corresponding value from session capabilities is used.\n * @property {string?} type The unlock type. The following unlock types\n * are supported: `pin`, `pinWithKeyEvent`, `password`, `pattern` and `fingerprint`.\n * If not provided then the corresponding value from session capabilities is used.\n * @property {string?} strategy Either 'locksettings' (default) or 'uiautomator'.\n * Setting it to 'uiautomator' will enforce the driver to avoid using special\n * ADB shortcuts in order to speed up the unlock procedure.\n * @property {number?} timeoutMs [2000] The maximum time in milliseconds\n * to wait until the screen gets unlocked\n */\n\n/**\n * Unlocks the device if it is locked. Noop if the device's screen is not locked.\n *\n * @param {UnlockOptions} opts\n * @throws {Error} if unlock operation fails or the provided\n * arguments are not valid\n */\ncommands.mobileUnlock = async function mobileUnlock (opts = {}) {\n const { key, type, strategy, timeoutMs } = opts;\n if (!key && !type) {\n await this.unlock();\n } else {\n await androidHelpers.unlock(this, this.adb, {\n unlockKey: key,\n unlockType: type,\n unlockStrategy: strategy,\n unlockSuccessTimeout: timeoutMs,\n });\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
@@ -19,4 +19,4 @@ function requireArgs(argNames, opts = {}) {
19
19
  }
20
20
  return opts;
21
21
  }
22
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiQURCX1NIRUxMX0ZFQVRVUkUiLCJleHBvcnRzIiwicmVxdWlyZUFyZ3MiLCJhcmdOYW1lcyIsIm9wdHMiLCJhcmdOYW1lIiwiXyIsImlzQXJyYXkiLCJoYXMiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmV4cG9ydCBjb25zdCBBREJfU0hFTExfRkVBVFVSRSA9ICdhZGJfc2hlbGwnO1xuXG4vKipcbiAqIEFzc2VydCB0aGUgcHJlc2VuY2Ugb2YgcGFydGljdWxhciBrZXlzIGluIHRoZSBnaXZlbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSBhcmdOYW1lcyBvbmUgb3IgbW9yZSBrZXkgbmFtZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIHRoZSBvYmplY3QgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtPYmplY3R9IHRoZSBzYW1lIGdpdmVuIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUFyZ3MgKGFyZ05hbWVzLCBvcHRzID0ge30pIHtcbiAgZm9yIChjb25zdCBhcmdOYW1lIG9mIChfLmlzQXJyYXkoYXJnTmFtZXMpID8gYXJnTmFtZXMgOiBbYXJnTmFtZXNdKSkge1xuICAgIGlmICghXy5oYXMob3B0cywgYXJnTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCcke2FyZ05hbWV9JyBhcmd1bWVudCBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvcHRzO1xufSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRU8sTUFBTUUsaUJBQWlCLEdBQUcsV0FBVztBQUFDQyxPQUFBLENBQUFELGlCQUFBLEdBQUFBLGlCQUFBO0FBU3RDLFNBQVNFLFdBQVdBLENBQUVDLFFBQVEsRUFBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ2hELEtBQUssTUFBTUMsT0FBTyxJQUFLQyxlQUFDLENBQUNDLE9BQU8sQ0FBQ0osUUFBUSxDQUFDLEdBQUdBLFFBQVEsR0FBRyxDQUFDQSxRQUFRLENBQUMsRUFBRztJQUNuRSxJQUFJLENBQUNHLGVBQUMsQ0FBQ0UsR0FBRyxDQUFDSixJQUFJLEVBQUVDLE9BQU8sQ0FBQyxFQUFFO01BQ3pCLE1BQU0sSUFBSUksY0FBTSxDQUFDQyxvQkFBb0IsQ0FBRSxJQUFHTCxPQUFRLDZCQUE0QixDQUFDO0lBQ2pGO0VBQ0Y7RUFDQSxPQUFPRCxJQUFJO0FBQ2IifQ==
22
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiQURCX1NIRUxMX0ZFQVRVUkUiLCJleHBvcnRzIiwicmVxdWlyZUFyZ3MiLCJhcmdOYW1lcyIsIm9wdHMiLCJhcmdOYW1lIiwiXyIsImlzQXJyYXkiLCJoYXMiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmV4cG9ydCBjb25zdCBBREJfU0hFTExfRkVBVFVSRSA9ICdhZGJfc2hlbGwnO1xuXG4vKipcbiAqIEFzc2VydCB0aGUgcHJlc2VuY2Ugb2YgcGFydGljdWxhciBrZXlzIGluIHRoZSBnaXZlbiBvYmplY3RcbiAqXG4gKiBAdGVtcGxhdGUge09iamVjdH0gVFxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IGFyZ05hbWVzIG9uZSBvciBtb3JlIGtleSBuYW1lc1xuICogQHBhcmFtIHtUfSBvcHRzIHRoZSBvYmplY3QgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtUfSB0aGUgc2FtZSBnaXZlbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBcmdzIChhcmdOYW1lcywgb3B0cyA9IHt9KSB7XG4gIGZvciAoY29uc3QgYXJnTmFtZSBvZiAoXy5pc0FycmF5KGFyZ05hbWVzKSA/IGFyZ05hbWVzIDogW2FyZ05hbWVzXSkpIHtcbiAgICBpZiAoIV8uaGFzKG9wdHMsIGFyZ05hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAnJHthcmdOYW1lfScgYXJndW1lbnQgbXVzdCBiZSBwcm92aWRlZGApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0cztcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVPLE1BQU1FLGlCQUFpQixHQUFHLFdBQVc7QUFBQ0MsT0FBQSxDQUFBRCxpQkFBQSxHQUFBQSxpQkFBQTtBQVV0QyxTQUFTRSxXQUFXQSxDQUFFQyxRQUFRLEVBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUNoRCxLQUFLLE1BQU1DLE9BQU8sSUFBS0MsZUFBQyxDQUFDQyxPQUFPLENBQUNKLFFBQVEsQ0FBQyxHQUFHQSxRQUFRLEdBQUcsQ0FBQ0EsUUFBUSxDQUFDLEVBQUc7SUFDbkUsSUFBSSxDQUFDRyxlQUFDLENBQUNFLEdBQUcsQ0FBQ0osSUFBSSxFQUFFQyxPQUFPLENBQUMsRUFBRTtNQUN6QixNQUFNLElBQUlJLGNBQU0sQ0FBQ0Msb0JBQW9CLENBQUUsSUFBR0wsT0FBUSw2QkFBNEIsQ0FBQztJQUNqRjtFQUNGO0VBQ0EsT0FBT0QsSUFBSTtBQUNiIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["_lodash","_interopRequireDefault","require","_driver","ADB_SHELL_FEATURE","exports","requireArgs","argNames","opts","argName","_","isArray","has","errors","InvalidArgumentError"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nexport const ADB_SHELL_FEATURE = 'adb_shell';\n\n/**\n * Assert the presence of particular keys in the given object\n *\n * @param {string|Array<string>} argNames one or more key names\n * @param {Object} opts the object to check\n * @returns {Object} the same given object\n */\nexport function requireArgs (argNames, opts = {}) {\n for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {\n if (!_.has(opts, argName)) {\n throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);\n }\n }\n return opts;\n}"],"mappings":";;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEO,MAAME,iBAAiB,GAAG,WAAW;AAACC,OAAA,CAAAD,iBAAA,GAAAA,iBAAA;AAStC,SAASE,WAAWA,CAAEC,QAAQ,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAChD,KAAK,MAAMC,OAAO,IAAKC,eAAC,CAACC,OAAO,CAACJ,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC,EAAG;IACnE,IAAI,CAACG,eAAC,CAACE,GAAG,CAACJ,IAAI,EAAEC,OAAO,CAAC,EAAE;MACzB,MAAM,IAAII,cAAM,CAACC,oBAAoB,CAAE,IAAGL,OAAQ,6BAA4B,CAAC;IACjF;EACF;EACA,OAAOD,IAAI;AACb"}
1
+ {"version":3,"file":"utils.js","names":["_lodash","_interopRequireDefault","require","_driver","ADB_SHELL_FEATURE","exports","requireArgs","argNames","opts","argName","_","isArray","has","errors","InvalidArgumentError"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nexport const ADB_SHELL_FEATURE = 'adb_shell';\n\n/**\n * Assert the presence of particular keys in the given object\n *\n * @template {Object} T\n * @param {string|string[]} argNames one or more key names\n * @param {T} opts the object to check\n * @returns {T} the same given object\n */\nexport function requireArgs (argNames, opts = {}) {\n for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {\n if (!_.has(opts, argName)) {\n throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);\n }\n }\n return opts;\n}"],"mappings":";;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEO,MAAME,iBAAiB,GAAG,WAAW;AAACC,OAAA,CAAAD,iBAAA,GAAAA,iBAAA;AAUtC,SAASE,WAAWA,CAAEC,QAAQ,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAChD,KAAK,MAAMC,OAAO,IAAKC,eAAC,CAACC,OAAO,CAACJ,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC,EAAG;IACnE,IAAI,CAACG,eAAC,CAACE,GAAG,CAACJ,IAAI,EAAEC,OAAO,CAAC,EAAE;MACzB,MAAM,IAAII,cAAM,CAACC,oBAAoB,CAAE,IAAGL,OAAQ,6BAA4B,CAAC;IACjF;EACF;EACA,OAAOD,IAAI;AACb"}
@@ -4,6 +4,7 @@ import path from 'path';
4
4
  import B from 'bluebird';
5
5
  import jimp from 'jimp';
6
6
  import { exec } from 'teen_process';
7
+ import { requireArgs } from '../utils';
7
8
 
8
9
  const swipeStepsPerSec = 28;
9
10
  const dragStepsPerSec = 40;
@@ -152,6 +153,26 @@ commands.fingerprint = async function fingerprint (fingerprintId) {
152
153
  await this.adb.fingerprint(fingerprintId);
153
154
  };
154
155
 
156
+ /**
157
+ * @typedef {Object} FingerprintOpts
158
+ * @param {string|number} fingerprintId The value is the finger_id for the finger that
159
+ * was "scanned". It is a unique integer that you assign for each virtual fingerprint.
160
+ * When the app is running you can run this same command each time the
161
+ * emulator prompts you for a fingerprint, you can run the adb command and pass it
162
+ * the finger_id to simulate the fingerprint scan.
163
+ */
164
+
165
+ /**
166
+ * Emulate fingerprint on Android Emulator.
167
+ * Only works on API 23+
168
+ *
169
+ * @param {FingerprintOpts} opts
170
+ */
171
+ commands.mobileFingerprint = async function mobileFingerprint(opts = {}) {
172
+ const {fingerprintId} = requireArgs('fingerprintId', opts);
173
+ await this.fingerprint(fingerprintId);
174
+ };
175
+
155
176
  commands.sendSMS = async function sendSMS (phoneNumber, message) {
156
177
  if (!this.isEmulator()) {
157
178
  this.log.errorAndThrow('sendSMS method is only available for emulators');
@@ -159,6 +180,23 @@ commands.sendSMS = async function sendSMS (phoneNumber, message) {
159
180
  await this.adb.sendSMS(phoneNumber, message);
160
181
  };
161
182
 
183
+ /**
184
+ * @typedef {Object} SendSmsOptions
185
+ * @property {string} phoneNumber The phone number to send SMS to
186
+ * @property {string} message The message payload
187
+ */
188
+
189
+ /**
190
+ * Emulate sending an SMS to the given phone number.
191
+ * Only works on emulators.
192
+ *
193
+ * @param {SendSmsOptions} opts
194
+ */
195
+ commands.mobileSendSms = async function mobileSendSms(opts = {}) {
196
+ const {phoneNumber, message} = requireArgs(['phoneNumber', 'message'], opts);
197
+ await this.sendSMS(phoneNumber, message);
198
+ };
199
+
162
200
  commands.gsmCall = async function gsmCall (phoneNumber, action) {
163
201
  if (!this.isEmulator()) {
164
202
  this.log.errorAndThrow('gsmCall method is only available for emulators');
@@ -166,6 +204,23 @@ commands.gsmCall = async function gsmCall (phoneNumber, action) {
166
204
  await this.adb.gsmCall(phoneNumber, action);
167
205
  };
168
206
 
207
+ /**
208
+ * @typedef {Object} GsmCallOptions
209
+ * @property {string} phoneNumber The phone number to call to
210
+ * @property {call|accept|cancel|hold} action One of possible actions to take
211
+ */
212
+
213
+ /**
214
+ * Emulate a GSM call to the given phone number.
215
+ * Only works on emulators.
216
+ *
217
+ * @param {GsmCallOptions} opts
218
+ */
219
+ commands.mobileGsmCall = async function mobileGsmCall(opts = {}) {
220
+ const {phoneNumber, action} = requireArgs(['phoneNumber', 'action'], opts);
221
+ await this.gsmCall(phoneNumber, action);
222
+ };
223
+
169
224
  commands.gsmSignal = async function gsmSignal (signalStrengh) {
170
225
  if (!this.isEmulator()) {
171
226
  this.log.errorAndThrow('gsmSignal method is only available for emulators');
@@ -173,6 +228,22 @@ commands.gsmSignal = async function gsmSignal (signalStrengh) {
173
228
  await this.adb.gsmSignal(signalStrengh);
174
229
  };
175
230
 
231
+ /**
232
+ * @typedef {Object} GsmSignalOptions
233
+ * @property {0|1|2|3|4} strength One of possible signal strength values, where 4 is the best signal.
234
+ */
235
+
236
+ /**
237
+ * Emulate GSM signal strength change event.
238
+ * Only works on emulators.
239
+ *
240
+ * @param {GsmSignalOptions} opts
241
+ */
242
+ commands.mobileGsmSignal = async function mobileGsmSignal(opts = {}) {
243
+ const {strength} = requireArgs('strength', opts);
244
+ await this.gsmSignal(strength);
245
+ };
246
+
176
247
  commands.gsmVoice = async function gsmVoice (state) {
177
248
  if (!this.isEmulator()) {
178
249
  this.log.errorAndThrow('gsmVoice method is only available for emulators');
@@ -180,6 +251,22 @@ commands.gsmVoice = async function gsmVoice (state) {
180
251
  await this.adb.gsmVoice(state);
181
252
  };
182
253
 
254
+ /**
255
+ * @typedef {Object} GsmVoiceOptions
256
+ * @property {on|off} state
257
+ */
258
+
259
+ /**
260
+ * Emulate GSM voice state change event.
261
+ * Only works on emulators.
262
+ *
263
+ * @param {GsmVoiceOptions} opts
264
+ */
265
+ commands.mobileGsmVoice = async function mobileGsmVoice(opts = {}) {
266
+ const {state} = requireArgs('state', opts);
267
+ await this.gsmVoice(state);
268
+ };
269
+
183
270
  commands.powerAC = async function powerAC (state) {
184
271
  if (!this.isEmulator()) {
185
272
  this.log.errorAndThrow('powerAC method is only available for emulators');
@@ -187,6 +274,22 @@ commands.powerAC = async function powerAC (state) {
187
274
  await this.adb.powerAC(state);
188
275
  };
189
276
 
277
+ /**
278
+ * @typedef {Object} PowerAcOptions
279
+ * @property {on|off} state
280
+ */
281
+
282
+ /**
283
+ * Emulate AC power state change.
284
+ * Only works on emulators.
285
+ *
286
+ * @param {GsmVoiceOptions} opts
287
+ */
288
+ commands.mobilePowerAc = async function mobilePowerAc(opts = {}) {
289
+ const {state} = requireArgs('state', opts);
290
+ await this.powerAC(state);
291
+ };
292
+
190
293
  commands.powerCapacity = async function powerCapacity (batteryPercent) {
191
294
  if (!this.isEmulator()) {
192
295
  this.log.errorAndThrow('powerCapacity method is only available for emulators');
@@ -194,6 +297,22 @@ commands.powerCapacity = async function powerCapacity (batteryPercent) {
194
297
  await this.adb.powerCapacity(batteryPercent);
195
298
  };
196
299
 
300
+ /**
301
+ * @typedef {Object} PowerCapacityOptions
302
+ * @property {number} percent - Percentage value in range [0, 100]
303
+ */
304
+
305
+ /**
306
+ * Emulate power capacity change.
307
+ * Only works on emulators.
308
+ *
309
+ * @param {PowerCapacityOptions} opts
310
+ */
311
+ commands.mobilePowerCapacity = async function mobilePowerCapacity(opts = {}) {
312
+ const {percent} = requireArgs('percent', opts);
313
+ await this.powerCapacity(percent);
314
+ };
315
+
197
316
  commands.networkSpeed = async function networkSpeed (networkSpeed) {
198
317
  if (!this.isEmulator()) {
199
318
  this.log.errorAndThrow('networkSpeed method is only available for emulators');
@@ -201,6 +320,22 @@ commands.networkSpeed = async function networkSpeed (networkSpeed) {
201
320
  await this.adb.networkSpeed(networkSpeed);
202
321
  };
203
322
 
323
+ /**
324
+ * @typedef {Object} NetworkSpeedOptions
325
+ * @property {gsm|scsd|gprs|edge|umts|hsdpa|lte|evdo|full} speed
326
+ */
327
+
328
+ /**
329
+ * Emulate different network connection speed modes.
330
+ * Only works on emulators.
331
+ *
332
+ * @param {NetworkSpeedOptions} opts
333
+ */
334
+ commands.mobileNetworkSpeed = async function mobileNetworkSpeed(opts = {}) {
335
+ const {speed} = requireArgs('speed', opts);
336
+ await this.networkSpeed(speed);
337
+ };
338
+
204
339
  /**
205
340
  * Emulate sensors values on the connected emulator.
206
341
  *
@@ -321,33 +321,39 @@ commands.mobileListSms = async function mobileListSms (opts = {}) {
321
321
 
322
322
  /**
323
323
  * @typedef {Object} UnlockOptions
324
- * @property {string} key The unlock key. The value of this key depends
324
+ * @property {string?} key The unlock key. The value of this key depends
325
325
  * on the actual unlock type and could be a pin/password/pattern value or
326
326
  * a biometric finger id.
327
- * @property {string} type The unlock type. The following unlock types
327
+ * If not provided then the corresponding value from session capabilities is used.
328
+ * @property {string?} type The unlock type. The following unlock types
328
329
  * are supported: `pin`, `pinWithKeyEvent`, `password`, `pattern` and `fingerprint`.
329
- * @property {?string} strategy Either 'locksettings' (default) or 'uiautomator'.
330
+ * If not provided then the corresponding value from session capabilities is used.
331
+ * @property {string?} strategy Either 'locksettings' (default) or 'uiautomator'.
330
332
  * Setting it to 'uiautomator' will enforce the driver to avoid using special
331
333
  * ADB shortcuts in order to speed up the unlock procedure.
332
- * @property {?number} timeoutMs [2000] The maximum time in milliseconds
334
+ * @property {number?} timeoutMs [2000] The maximum time in milliseconds
333
335
  * to wait until the screen gets unlocked
334
336
  */
335
337
 
336
338
  /**
337
339
  * Unlocks the device if it is locked. Noop if the device's screen is not locked.
338
340
  *
339
- * @param {?UnlockOptions} opts
341
+ * @param {UnlockOptions} opts
340
342
  * @throws {Error} if unlock operation fails or the provided
341
343
  * arguments are not valid
342
344
  */
343
345
  commands.mobileUnlock = async function mobileUnlock (opts = {}) {
344
346
  const { key, type, strategy, timeoutMs } = opts;
345
- await androidHelpers.unlock(this, this.adb, {
346
- unlockKey: key,
347
- unlockType: type,
348
- unlockStrategy: strategy,
349
- unlockSuccessTimeout: timeoutMs,
350
- });
347
+ if (!key && !type) {
348
+ await this.unlock();
349
+ } else {
350
+ await androidHelpers.unlock(this, this.adb, {
351
+ unlockKey: key,
352
+ unlockType: type,
353
+ unlockStrategy: strategy,
354
+ unlockSuccessTimeout: timeoutMs,
355
+ });
356
+ }
351
357
  };
352
358
 
353
359
  Object.assign(extensions, commands, helpers);
package/lib/utils.js CHANGED
@@ -6,9 +6,10 @@ export const ADB_SHELL_FEATURE = 'adb_shell';
6
6
  /**
7
7
  * Assert the presence of particular keys in the given object
8
8
  *
9
- * @param {string|Array<string>} argNames one or more key names
10
- * @param {Object} opts the object to check
11
- * @returns {Object} the same given object
9
+ * @template {Object} T
10
+ * @param {string|string[]} argNames one or more key names
11
+ * @param {T} opts the object to check
12
+ * @returns {T} the same given object
12
13
  */
13
14
  export function requireArgs (argNames, opts = {}) {
14
15
  for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "mobile",
10
10
  "mobile testing"
11
11
  ],
12
- "version": "5.10.3",
12
+ "version": "5.11.0",
13
13
  "author": "Appium Contributors",
14
14
  "license": "Apache-2.0",
15
15
  "repository": {