appium-android-driver 5.4.2 → 5.4.4

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.
Files changed (67) hide show
  1. package/build/index.js +1 -9
  2. package/build/lib/android-helpers.js +10 -194
  3. package/build/lib/android-helpers.js.map +1 -1
  4. package/build/lib/bootstrap.js +4 -45
  5. package/build/lib/bootstrap.js.map +1 -1
  6. package/build/lib/commands/actions.js +3 -78
  7. package/build/lib/commands/actions.js.map +1 -1
  8. package/build/lib/commands/alert.js +3 -10
  9. package/build/lib/commands/alert.js.map +1 -1
  10. package/build/lib/commands/app-management.js +4 -32
  11. package/build/lib/commands/app-management.js.map +1 -1
  12. package/build/lib/commands/context.js +6 -78
  13. package/build/lib/commands/context.js.map +1 -1
  14. package/build/lib/commands/coverage.js +1 -6
  15. package/build/lib/commands/coverage.js.map +1 -1
  16. package/build/lib/commands/element.js +4 -47
  17. package/build/lib/commands/element.js.map +1 -1
  18. package/build/lib/commands/emu-console.js +2 -7
  19. package/build/lib/commands/emu-console.js.map +1 -1
  20. package/build/lib/commands/execute.js +1 -13
  21. package/build/lib/commands/execute.js.map +1 -1
  22. package/build/lib/commands/file-actions.js +3 -44
  23. package/build/lib/commands/file-actions.js.map +1 -1
  24. package/build/lib/commands/find.js +3 -16
  25. package/build/lib/commands/find.js.map +1 -1
  26. package/build/lib/commands/general.js +4 -78
  27. package/build/lib/commands/general.js.map +1 -1
  28. package/build/lib/commands/ime.js +3 -14
  29. package/build/lib/commands/ime.js.map +1 -1
  30. package/build/lib/commands/index.js +3 -27
  31. package/build/lib/commands/index.js.map +1 -1
  32. package/build/lib/commands/intent.js +1 -40
  33. package/build/lib/commands/intent.js.map +1 -1
  34. package/build/lib/commands/log.js +3 -35
  35. package/build/lib/commands/log.js.map +1 -1
  36. package/build/lib/commands/media-projection.js +2 -47
  37. package/build/lib/commands/media-projection.js.map +1 -1
  38. package/build/lib/commands/network.js +4 -40
  39. package/build/lib/commands/network.js.map +1 -1
  40. package/build/lib/commands/performance.js +5 -57
  41. package/build/lib/commands/performance.js.map +1 -1
  42. package/build/lib/commands/recordscreen.js +1 -59
  43. package/build/lib/commands/recordscreen.js.map +1 -1
  44. package/build/lib/commands/shell.js +1 -15
  45. package/build/lib/commands/shell.js.map +1 -1
  46. package/build/lib/commands/streamscreen.js +7 -74
  47. package/build/lib/commands/streamscreen.js.map +1 -1
  48. package/build/lib/commands/system-bars.js +1 -23
  49. package/build/lib/commands/system-bars.js.map +1 -1
  50. package/build/lib/commands/touch.js +13 -79
  51. package/build/lib/commands/touch.js.map +1 -1
  52. package/build/lib/desired-caps.js +3 -4
  53. package/build/lib/desired-caps.js.map +1 -1
  54. package/build/lib/driver.js +8 -97
  55. package/build/lib/driver.js.map +1 -1
  56. package/build/lib/logger.js +1 -5
  57. package/build/lib/logger.js.map +1 -1
  58. package/build/lib/uiautomator.js +3 -24
  59. package/build/lib/uiautomator.js.map +1 -1
  60. package/build/lib/unlock-helpers.js +1 -61
  61. package/build/lib/unlock-helpers.js.map +1 -1
  62. package/build/lib/utils.js +1 -7
  63. package/build/lib/utils.js.map +1 -1
  64. package/build/lib/webview-helpers.js +1 -94
  65. package/build/lib/webview-helpers.js.map +1 -1
  66. package/lib/android-helpers.js +2 -1
  67. package/package.json +2 -2
@@ -1,24 +1,18 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = exports.commands = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _lodash = _interopRequireDefault(require("lodash"));
13
-
14
10
  var _driver = require("appium/driver");
15
-
16
11
  const NO_VALUE_ARG_TYPE = 'sn';
17
12
  const SUPPORTED_EXTRA_TYPES = ['s', NO_VALUE_ARG_TYPE, 'z', 'i', 'l', 'f', 'u', 'cn', 'ia', 'ial', 'la', 'lal', 'fa', 'fal', 'sa', 'sal'];
18
13
  const API_LEVEL_ANDROID_8 = 26;
19
14
  const commands = {};
20
15
  exports.commands = commands;
21
-
22
16
  function parseIntentSpec(opts = {}) {
23
17
  const {
24
18
  intent,
@@ -32,27 +26,21 @@ function parseIntentSpec(opts = {}) {
32
26
  flags
33
27
  } = opts;
34
28
  const resultArgs = [];
35
-
36
29
  if (intent) {
37
30
  resultArgs.push(intent);
38
31
  }
39
-
40
32
  if (action) {
41
33
  resultArgs.push('-a', action);
42
34
  }
43
-
44
35
  if (uri) {
45
36
  resultArgs.push('-d', uri);
46
37
  }
47
-
48
38
  if (mimeType) {
49
39
  resultArgs.push('-t', mimeType);
50
40
  }
51
-
52
41
  if (!_lodash.default.isNil(identifier)) {
53
42
  resultArgs.push('-i', identifier);
54
43
  }
55
-
56
44
  if (categories) {
57
45
  if (_lodash.default.isArray(categories)) {
58
46
  resultArgs.push(..._lodash.default.flatMap(categories.map(cName => ['-c', cName])));
@@ -60,35 +48,27 @@ function parseIntentSpec(opts = {}) {
60
48
  resultArgs.push('-c', categories);
61
49
  }
62
50
  }
63
-
64
51
  if (component) {
65
52
  resultArgs.push('-n', component);
66
53
  }
67
-
68
54
  if (opts.package) {
69
55
  resultArgs.push('-p', opts.package);
70
56
  }
71
-
72
57
  if (extras) {
73
58
  if (!_lodash.default.isArray(extras)) {
74
59
  throw new _driver.errors.InvalidArgumentError(`'extras' must be an array`);
75
60
  }
76
-
77
61
  for (const item of extras) {
78
62
  if (!_lodash.default.isArray(item)) {
79
63
  throw new _driver.errors.InvalidArgumentError(`Extra argument '${item}' must be an array`);
80
64
  }
81
-
82
65
  const [type, key, value] = item;
83
-
84
66
  if (!_lodash.default.includes(SUPPORTED_EXTRA_TYPES, type)) {
85
67
  throw new _driver.errors.InvalidArgumentError(`Extra argument type '${type}' is not known. ` + `Supported intent argument types are: ${SUPPORTED_EXTRA_TYPES}`);
86
68
  }
87
-
88
69
  if (_lodash.default.isEmpty(key) || _lodash.default.isString(key) && _lodash.default.trim(key) === '') {
89
70
  throw new _driver.errors.InvalidArgumentError(`Extra argument's key in '${JSON.stringify(item)}' must be a valid string identifier`);
90
71
  }
91
-
92
72
  if (type === NO_VALUE_ARG_TYPE) {
93
73
  resultArgs.push(`--e${type}`, key);
94
74
  } else if (_lodash.default.isUndefined(value)) {
@@ -98,11 +78,9 @@ function parseIntentSpec(opts = {}) {
98
78
  }
99
79
  }
100
80
  }
101
-
102
81
  if (flags) {
103
82
  resultArgs.push('-f', flags);
104
83
  }
105
-
106
84
  return resultArgs;
107
85
  }
108
86
 
@@ -116,31 +94,24 @@ commands.mobileStartActivity = async function mobileStartActivity(opts = {}) {
116
94
  display
117
95
  } = opts;
118
96
  const cmd = ['am', (await this.adb.getApiLevel()) < API_LEVEL_ANDROID_8 ? 'start' : 'start-activity'];
119
-
120
97
  if (!_lodash.default.isNil(user)) {
121
98
  cmd.push('--user', user);
122
99
  }
123
-
124
100
  if (wait) {
125
101
  cmd.push('-W');
126
102
  }
127
-
128
103
  if (stop) {
129
104
  cmd.push('-S');
130
105
  }
131
-
132
106
  if (!_lodash.default.isNil(windowingMode)) {
133
107
  cmd.push('--windowingMode', windowingMode);
134
108
  }
135
-
136
109
  if (!_lodash.default.isNil(activityType)) {
137
110
  cmd.push('--activityType', activityType);
138
111
  }
139
-
140
112
  if (!_lodash.default.isNil(display)) {
141
113
  cmd.push('--display', display);
142
114
  }
143
-
144
115
  cmd.push(...parseIntentSpec(opts));
145
116
  return await this.adb.shell(cmd);
146
117
  };
@@ -152,19 +123,15 @@ commands.mobileBroadcast = async function mobileBroadcast(opts = {}) {
152
123
  allowBackgroundActivityStarts
153
124
  } = opts;
154
125
  const cmd = ['am', 'broadcast'];
155
-
156
126
  if (!_lodash.default.isNil(user)) {
157
127
  cmd.push('--user', user);
158
128
  }
159
-
160
129
  if (receiverPermission) {
161
130
  cmd.push('--receiver-permission', receiverPermission);
162
131
  }
163
-
164
132
  if (allowBackgroundActivityStarts) {
165
133
  cmd.push('--allow-background-activity-starts');
166
134
  }
167
-
168
135
  cmd.push(...parseIntentSpec(opts));
169
136
  return await this.adb.shell(cmd);
170
137
  };
@@ -175,17 +142,14 @@ commands.mobileStartService = async function mobileStartService(opts = {}) {
175
142
  foreground
176
143
  } = opts;
177
144
  const cmd = ['am'];
178
-
179
145
  if ((await this.adb.getApiLevel()) < API_LEVEL_ANDROID_8) {
180
146
  cmd.push('startservice');
181
147
  } else {
182
148
  cmd.push(foreground ? 'start-foreground-service' : 'start-service');
183
149
  }
184
-
185
150
  if (!_lodash.default.isNil(user)) {
186
151
  cmd.push('--user', user);
187
152
  }
188
-
189
153
  cmd.push(...parseIntentSpec(opts));
190
154
  return await this.adb.shell(cmd);
191
155
  };
@@ -195,15 +159,12 @@ commands.mobileStopService = async function mobileStopService(opts = {}) {
195
159
  user
196
160
  } = opts;
197
161
  const cmd = ['am', (await this.adb.getApiLevel()) < API_LEVEL_ANDROID_8 ? 'stopservice' : 'stop-service'];
198
-
199
162
  if (!_lodash.default.isNil(user)) {
200
163
  cmd.push('--user', user);
201
164
  }
202
-
203
165
  cmd.push(...parseIntentSpec(opts));
204
166
  return await this.adb.shell(cmd);
205
167
  };
206
-
207
168
  var _default = commands;
208
169
  exports.default = _default;
209
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOT19WQUxVRV9BUkdfVFlQRSIsIlNVUFBPUlRFRF9FWFRSQV9UWVBFUyIsIkFQSV9MRVZFTF9BTkRST0lEXzgiLCJjb21tYW5kcyIsInBhcnNlSW50ZW50U3BlYyIsIm9wdHMiLCJpbnRlbnQiLCJhY3Rpb24iLCJ1cmkiLCJtaW1lVHlwZSIsImlkZW50aWZpZXIiLCJjYXRlZ29yaWVzIiwiY29tcG9uZW50IiwiZXh0cmFzIiwiZmxhZ3MiLCJyZXN1bHRBcmdzIiwicHVzaCIsIl8iLCJpc05pbCIsImlzQXJyYXkiLCJmbGF0TWFwIiwibWFwIiwiY05hbWUiLCJwYWNrYWdlIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJpdGVtIiwidHlwZSIsImtleSIsInZhbHVlIiwiaW5jbHVkZXMiLCJpc0VtcHR5IiwiaXNTdHJpbmciLCJ0cmltIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzVW5kZWZpbmVkIiwibW9iaWxlU3RhcnRBY3Rpdml0eSIsInVzZXIiLCJ3YWl0Iiwic3RvcCIsIndpbmRvd2luZ01vZGUiLCJhY3Rpdml0eVR5cGUiLCJkaXNwbGF5IiwiY21kIiwiYWRiIiwiZ2V0QXBpTGV2ZWwiLCJzaGVsbCIsIm1vYmlsZUJyb2FkY2FzdCIsInJlY2VpdmVyUGVybWlzc2lvbiIsImFsbG93QmFja2dyb3VuZEFjdGl2aXR5U3RhcnRzIiwibW9iaWxlU3RhcnRTZXJ2aWNlIiwiZm9yZWdyb3VuZCIsIm1vYmlsZVN0b3BTZXJ2aWNlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2ludGVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IE5PX1ZBTFVFX0FSR19UWVBFID0gJ3NuJztcbmNvbnN0IFNVUFBPUlRFRF9FWFRSQV9UWVBFUyA9IFtcbiAgJ3MnLCBOT19WQUxVRV9BUkdfVFlQRSwgJ3onLCAnaScsICdsJywgJ2YnLCAndScsICdjbicsXG4gICdpYScsICdpYWwnLCAnbGEnLCAnbGFsJywgJ2ZhJywgJ2ZhbCcsICdzYScsICdzYWwnLFxuXTtcbmNvbnN0IEFQSV9MRVZFTF9BTkRST0lEXzggPSAyNjtcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuZnVuY3Rpb24gcGFyc2VJbnRlbnRTcGVjIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGludGVudCxcbiAgICBhY3Rpb24sXG4gICAgdXJpLFxuICAgIG1pbWVUeXBlLFxuICAgIGlkZW50aWZpZXIsXG4gICAgY2F0ZWdvcmllcyxcbiAgICBjb21wb25lbnQsXG4gICAgZXh0cmFzLFxuICAgIGZsYWdzLFxuICB9ID0gb3B0cztcbiAgY29uc3QgcmVzdWx0QXJncyA9IFtdO1xuICBpZiAoaW50ZW50KSB7XG4gICAgcmVzdWx0QXJncy5wdXNoKGludGVudCk7XG4gIH1cbiAgaWYgKGFjdGlvbikge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLWEnLCBhY3Rpb24pO1xuICB9XG4gIGlmICh1cmkpIHtcbiAgICByZXN1bHRBcmdzLnB1c2goJy1kJywgdXJpKTtcbiAgfVxuICBpZiAobWltZVR5cGUpIHtcbiAgICByZXN1bHRBcmdzLnB1c2goJy10JywgbWltZVR5cGUpO1xuICB9XG4gIGlmICghXy5pc05pbChpZGVudGlmaWVyKSkge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLWknLCBpZGVudGlmaWVyKTtcbiAgfVxuICBpZiAoY2F0ZWdvcmllcykge1xuICAgIGlmIChfLmlzQXJyYXkoY2F0ZWdvcmllcykpIHtcbiAgICAgIHJlc3VsdEFyZ3MucHVzaCguLi4oXy5mbGF0TWFwKGNhdGVnb3JpZXMubWFwKChjTmFtZSkgPT4gWyctYycsIGNOYW1lXSkpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdEFyZ3MucHVzaCgnLWMnLCBjYXRlZ29yaWVzKTtcbiAgICB9XG4gIH1cbiAgaWYgKGNvbXBvbmVudCkge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLW4nLCBjb21wb25lbnQpO1xuICB9XG4gIGlmIChvcHRzLnBhY2thZ2UpIHtcbiAgICByZXN1bHRBcmdzLnB1c2goJy1wJywgb3B0cy5wYWNrYWdlKTtcbiAgfVxuICBpZiAoZXh0cmFzKSB7XG4gICAgaWYgKCFfLmlzQXJyYXkoZXh0cmFzKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ2V4dHJhcycgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXh0cmFzKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShpdGVtKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBFeHRyYSBhcmd1bWVudCAnJHtpdGVtfScgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgICAgfVxuICAgICAgY29uc3QgW3R5cGUsIGtleSwgdmFsdWVdID0gaXRlbTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhTVVBQT1JURURfRVhUUkFfVFlQRVMsIHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEV4dHJhIGFyZ3VtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCBrbm93bi4gYCArXG4gICAgICAgICAgYFN1cHBvcnRlZCBpbnRlbnQgYXJndW1lbnQgdHlwZXMgYXJlOiAke1NVUFBPUlRFRF9FWFRSQV9UWVBFU31gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc0VtcHR5KGtleSkgfHwgKF8uaXNTdHJpbmcoa2V5KSAmJiBfLnRyaW0oa2V5KSA9PT0gJycpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEV4dHJhIGFyZ3VtZW50J3Mga2V5IGluICcke0pTT04uc3RyaW5naWZ5KGl0ZW0pfScgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBpZGVudGlmaWVyYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09IE5PX1ZBTFVFX0FSR19UWVBFKSB7XG4gICAgICAgIHJlc3VsdEFyZ3MucHVzaChgLS1lJHt0eXBlfWAsIGtleSk7XG4gICAgICB9IGVsc2UgaWYgKF8uaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEludGVudCBhcmd1bWVudCB0eXBlICcke3R5cGV9JyBpbiAnJHtKU09OLnN0cmluZ2lmeShpdGVtKX0nIHJlcXVpcmVzIGEgYCArXG4gICAgICAgICAgYHZhbGlkIHZhbHVlIHRvIGJlIHByb3ZpZGVkYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0QXJncy5wdXNoKGAtLWUke3R5cGV9YCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChmbGFncykge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLWYnLCBmbGFncyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdEFyZ3M7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRBY3Rpdml0eU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHVzZXIgWydjdXJyZW50J10gLSBUaGUgdXNlciBJRCBmb3Igd2hpY2ggdGhlIHNlcnZpY2UgaXMgc3RhcnRlZC5cbiAqIFRoZSBgY3VycmVudGAgdXNlciBpZCBpcyB1c2VkIGJ5IGRlZmF1bHRcbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHdhaXQgW2ZhbHNlXSAtIFNldCBpdCB0byBgdHJ1ZWAgaWYgeW91IHdhbnQgdG8gYmxvY2sgdGhlIG1ldGhvZCBjYWxsXG4gKiB1bnRpbCB0aGUgYWN0aXZpdHkgbWFuYWdlcidzIHByb2Nlc3MgcmV0dXJucyB0aGUgY29udHJvbCB0byB0aGUgc3lzdGVtLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gc3RvcCBbZmFsc2VdIC0gU2V0IGl0IHRvIGB0cnVlYCB0byBmb3JjZSBzdG9wIHRoZSB0YXJnZXRcbiAqIGFwcCBiZWZvcmUgc3RhcnRpbmcgdGhlIGFjdGl2aXR5XG4gKiBAcHJvcGVydHkgez9udW1iZXJ8c3RyaW5nfSB3aW5kb3dpbmdNb2RlIC0gVGhlIHdpbmRvd2luZyBtb2RlIHRvIGxhdW5jaCB0aGUgYWN0aXZpdHkgaW50by5cbiAqIENoZWNrIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL21hc3Rlci9jb3JlL2phdmEvYW5kcm9pZC9hcHAvV2luZG93Q29uZmlndXJhdGlvbi5qYXZhXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHBvc3NpYmxlIHdpbmRvd2luZyBtb2RlcyAoY29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggYFdJTkRPV0lOR19NT0RFX2ApLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfHN0cmluZ30gYWN0aXZpdHlUeXBlIC0gVGhlIGFjdGl2aXR5IHR5cGUgdG8gbGF1bmNoIHRoZSBhY3Rpdml0eSBhcy5cbiAqIENoZWNrIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL21hc3Rlci9jb3JlL2phdmEvYW5kcm9pZC9hcHAvV2luZG93Q29uZmlndXJhdGlvbi5qYXZhXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHBvc3NpYmxlIGFjdGl2aXR5IHR5cGVzIChjb25zdGFudHMgc3RhcnRpbmcgd2l0aCBgQUNUSVZJVFlfVFlQRV9gKS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IGRpc3BsYXkgLSBUaGUgZGlzcGxheSBpZGVudGlmaWVyIHRvIGxhdW5jaCB0aGUgYWN0aXZpdHkgaW50by5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGFjdGl2aXR5IGludGVudCB0byBzdGFydCwgZm9yIGV4YW1wbGVcbiAqIGBjb20uc29tZS5wYWNrYWdlLm5hbWUvLllvdXJTZXJ2aWNlU3ViQ2xhc3NOYW1lYFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBhY3Rpb24gLSBBY3Rpb24gbmFtZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwYWNrYWdlIC0gUGFja2FnZSBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHVyaSAtIFVuaWZpZWQgcmVzb3VyY2UgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBtaW1lVHlwZSAtIE1pbWUgdHlwZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpZGVudGlmaWVyIC0gT3B0aW9uYWwgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHs/c3RyaW5nfEFycmF5PHN0cmluZz59IGNhdGVnb3JpZXMgLSBPbmUgb3IgbW9yZSBjYXRlZ29yeSBuYW1lc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBjb21wb25lbnQgLSBDb21wb25lbnQgbmFtZVxuICogQHByb3BlcnR5IHtBcnJheTxzdHJpbmd8QXJyYXk8c3RyaW5nPj59IGV4dHJhcyAtIE9wdGlvbmFsIGludGVudCBhcmd1bWVudHMuIE11c3QgYmUgcmVwcmVzZW50ZWRcbiAqIGFzIGFycmF5IG9mIGFycmF5cywgd2hlcmUgZWFjaCBzdWJhcnJheSBpdGVtIGNvbnRhaW5zIHR3byBvciB0aHJlZSBzdHJpbmcgaXRlbXM6XG4gKiB2YWx1ZSB0eXBlLCBrZXkgbmFtZSBhbmQgdGhlIHZhbHVlIGl0c2VsZi5cbiAqIFN1cHBvcnRlZCB2YWx1ZSB0eXBlcyBhcmU6XG4gKiAtIHM6IHN0cmluZy4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIHN0cmluZ1xuICogLSBzbjogbnVsbC4gVmFsdWUgaXMgaWdub3JlZCBmb3IgdGhpcyB0eXBlXG4gKiAtIHo6IGJvb2xlYW4uIFZhbHVlIG11c3QgYmUgZWl0aGVyIGB0cnVlYCBvciBgZmFsc2VgXG4gKiAtIGk6IGludGVnZXIuIFZhbHVlIG11c3QgYmUgYSB2YWxpZCA0LWJ5dGUgaW50ZWdlciBudW1iZXJcbiAqIC0gbDogbG9uZy4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIDgtYnl0ZSBsb25nIG51bWJlclxuICogLSBmOiBmbG9hdDogVmFsdWUgbXVzdCBiZSBhIHZhbGlkIGZsb2F0IG51bWJlclxuICogLSB1OiB1cmkuIFZhbHVlIG11c3QgYmUgYSB2YWxpZCB1bmlmb3JtIHJlc291cmNlIGlkZW50aWZpZXIgc3RyaW5nXG4gKiAtIGNuOiBjb21wb25lbnQgbmFtZS4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIGNvbXBvbmVudCBuYW1lIHN0cmluZ1xuICogLSBpYTogSW50ZWdlcltdLiBWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9mIGNvbW1hLXNlcGFyYXRlZCBpbnRlZ2Vyc1xuICogLSBpYWw6IExpc3Q8SW50ZWdlcj4uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGludGVnZXJzXG4gKiAtIGxhOiBMb25nW10uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGxvbmcgbnVtYmVyc1xuICogLSBsYWw6IExpc3Q8TG9uZz4uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGxvbmcgbnVtYmVyc1xuICogLSBmYTogRmxvYXRbXS4gVmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvZiBjb21tYS1zZXBhcmF0ZWQgZmxvYXQgbnVtYmVyc1xuICogLSBmYWw6IExpc3Q8RmxvYXQ+LiBWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9mIGNvbW1hLXNlcGFyYXRlZCBmbG9hdCBudW1iZXJzXG4gKiAtIHNhOiBTdHJpbmdbXS4gVmFsdWUgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5ncy4gVG8gZW1iZWQgYSBjb21tYSBpbnRvIGEgc3RyaW5nLFxuICogZXNjYXBlIGl0IHVzaW5nIFwiXFwsXCJcbiAqIC0gc2FsOiBMaXN0PFN0cmluZz4uIFZhbHVlIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkIHN0cmluZ3MuIFRvIGVtYmVkIGEgY29tbWEgaW50byBhIHN0cmluZyxcbiAqIGVzY2FwZSBpdCB1c2luZyBcIlxcLFwiXG4gKiBGb3IgZXhhbXBsZTogW1sncycsICd2YXJOYW1lMScsICdNeSBTdHJpbmcxJ10sIFsncycsICd2YXJOYW1lMicsICdNeSBTdHJpbmcyJ10sIFsnaWEnLCAnYXJyTmFtZScsICcxLDIsMyw0J11dXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGZsYWdzIC0gSW50ZW50IHN0YXJ0dXAtc3BlY2lmaWMgZmxhZ3MgYXMgYSBoZXhhZGVjaW1hbCBzdHJpbmcuXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9JbnRlbnQuaHRtbFxuICogZm9yIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBmbGFnIHZhbHVlcyAoY29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggRkxBR19BQ1RJVklUWV8pLlxuICogRmxhZyB2YWx1ZXMgY291bGQgYmUgbWVyZ2VkIHVzaW5nIHRoZSBsb2dpY2FsICdvcicgb3BlcmF0aW9uLlxuICogRm9yIGV4YW1wbGUsIDB4MTAyMDAwMDAgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIHR3byBmbGFnczpcbiAqIDB4MTAwMDAwMDAgYEZMQUdfQUNUSVZJVFlfTkVXX1RBU0tgIHwgMHgwMDIwMDAwMCBgRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRGBcbiAqL1xuXG4vKipcbiAqIFN0YXJ0cyB0aGUgZ2l2ZW4gYWN0aXZpdHkgaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7U3RhcnRBY3Rpdml0eU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21tYW5kIG91dHB1dFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc3RhcnRpbmcgdGhlIGFjdGl2aXR5XG4gKiBvciByZXF1aXJlZCBvcHRpb25zIGFyZSBtaXNzaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0YXJ0QWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdGFydEFjdGl2aXR5IChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVzZXIsXG4gICAgd2FpdCxcbiAgICBzdG9wLFxuICAgIHdpbmRvd2luZ01vZGUsXG4gICAgYWN0aXZpdHlUeXBlLFxuICAgIGRpc3BsYXksXG4gIH0gPSBvcHRzO1xuICBjb25zdCBjbWQgPSBbXG4gICAgJ2FtJywgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCBBUElfTEVWRUxfQU5EUk9JRF84KSA/ICdzdGFydCcgOiAnc3RhcnQtYWN0aXZpdHknLFxuICBdO1xuICBpZiAoIV8uaXNOaWwodXNlcikpIHtcbiAgICBjbWQucHVzaCgnLS11c2VyJywgdXNlcik7XG4gIH1cbiAgaWYgKHdhaXQpIHtcbiAgICBjbWQucHVzaCgnLVcnKTtcbiAgfVxuICBpZiAoc3RvcCkge1xuICAgIGNtZC5wdXNoKCctUycpO1xuICB9XG4gIGlmICghXy5pc05pbCh3aW5kb3dpbmdNb2RlKSkge1xuICAgIGNtZC5wdXNoKCctLXdpbmRvd2luZ01vZGUnLCB3aW5kb3dpbmdNb2RlKTtcbiAgfVxuICBpZiAoIV8uaXNOaWwoYWN0aXZpdHlUeXBlKSkge1xuICAgIGNtZC5wdXNoKCctLWFjdGl2aXR5VHlwZScsIGFjdGl2aXR5VHlwZSk7XG4gIH1cbiAgaWYgKCFfLmlzTmlsKGRpc3BsYXkpKSB7XG4gICAgY21kLnB1c2goJy0tZGlzcGxheScsIGRpc3BsYXkpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUludGVudFNwZWMob3B0cykpKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEJyb2FkY2FzdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHVzZXIgWydhbGwnXSAtIFRoZSB1c2VyIElEIGZvciB3aGljaCB0aGUgYnJvYWRjYXN0IGlzIHNlbnQuXG4gKiBUaGUgYGN1cnJlbnRgIGFsaWFzIGFzc3VtZXMgdGhlIGN1cnJlbnQgdXNlciBJRC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcmVjZWl2ZXJQZXJtaXNzaW9uIC0gUmVxdWlyZSByZWNlaXZlciB0byBob2xkIHRoZSBnaXZlbiBwZXJtaXNzaW9uLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gYWxsb3dCYWNrZ3JvdW5kQWN0aXZpdHlTdGFydHMgW2ZhbHNlXSAtIFdoZXRoZXIgdGhlIHJlY2VpdmVyIG1heVxuICogc3RhcnQgYWN0aXZpdGllcyBldmVuIGlmIGluIHRoZSBiYWNrZ3JvdW5kLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgaW50ZW50IHRvIGJyb2FkY2FzdCB0bywgZm9yIGV4YW1wbGVcbiAqIGBjb20uc29tZS5wYWNrYWdlLm5hbWUvLllvdXJTZXJ2aWNlU3ViQ2xhc3NOYW1lYC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aW9uIC0gQWN0aW9uIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXJpIC0gVW5pZmllZCByZXNvdXJjZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1pbWVUeXBlIC0gTWltZSB0eXBlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkZW50aWZpZXIgLSBPcHRpb25hbCBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8QXJyYXk8c3RyaW5nPn0gY2F0ZWdvcmllcyAtIE9uZSBvciBtb3JlIGNhdGVnb3J5IG5hbWVzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGNvbXBvbmVudCAtIENvbXBvbmVudCBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBhY2thZ2UgLSBQYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8QXJyYXk8c3RyaW5nPj59IGV4dHJhcyAtIE9wdGlvbmFsIGludGVudCBhcmd1bWVudHMuXG4gKiBTZWUgYWJvdmUgZm9yIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZmxhZ3MgLSBJbnRlbnQgc3RhcnR1cC1zcGVjaWZpYyBmbGFncyBhcyBhIGhleGFkZWNpbWFsIHN0cmluZy5cbiAqIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICovXG5cblxuLyoqXG4gKiBTZW5kIGEgYnJvYWRjYXN0IGludGVudC5cbiAqXG4gKiBAcGFyYW0ge0Jyb2FkY2FzdE9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21tYW5kIG91dHB1dFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc3RhcnRpbmcgdGhlIGFjdGl2aXR5XG4gKiBvciByZXF1aXJlZCBvcHRpb25zIGFyZSBtaXNzaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUJyb2FkY2FzdCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUJyb2FkY2FzdCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB1c2VyLFxuICAgIHJlY2VpdmVyUGVybWlzc2lvbixcbiAgICBhbGxvd0JhY2tncm91bmRBY3Rpdml0eVN0YXJ0cyxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGNtZCA9IFsnYW0nLCAnYnJvYWRjYXN0J107XG4gIGlmICghXy5pc05pbCh1c2VyKSkge1xuICAgIGNtZC5wdXNoKCctLXVzZXInLCB1c2VyKTtcbiAgfVxuICBpZiAocmVjZWl2ZXJQZXJtaXNzaW9uKSB7XG4gICAgY21kLnB1c2goJy0tcmVjZWl2ZXItcGVybWlzc2lvbicsIHJlY2VpdmVyUGVybWlzc2lvbik7XG4gIH1cbiAgaWYgKGFsbG93QmFja2dyb3VuZEFjdGl2aXR5U3RhcnRzKSB7XG4gICAgY21kLnB1c2goJy0tYWxsb3ctYmFja2dyb3VuZC1hY3Rpdml0eS1zdGFydHMnKTtcbiAgfVxuICBjbWQucHVzaCguLi4ocGFyc2VJbnRlbnRTcGVjKG9wdHMpKSk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5zaGVsbChjbWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydFNlcnZpY2VPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB1c2VyIFsnY3VycmVudCddIC0gVGhlIHVzZXIgSUQgZm9yIHdoaWNoIHRoZSBzZXJ2aWNlIGlzIHN0YXJ0ZWQuXG4gKiBUaGUgYGN1cnJlbnRgIHVzZXIgaWQgaXMgdXNlZCBieSBkZWZhdWx0XG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBmb3JlZ3JvdW5kIFtmYWxzZV0gLSBTZXQgaXQgdG8gYHRydWVgIGlmIHlvdXIgc2VydmljZSBtdXN0IGJlXG4gKiBzdGFydGVkIGFzIGZvcmVncm91bmQgc2VydmljZS4gVGhpcyBvcHRpb24gaXMgaWdub3JlZCBpZiB0aGUgQVBJIGxldmVsIG9mIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3QgaXMgYmVsb3cgMjYgKEFuZHJvaWQgOCkuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGludGVudCB0byBzdGFydCwgZm9yIGV4YW1wbGVcbiAqIGBjb20uc29tZS5wYWNrYWdlLm5hbWUvLllvdXJTZXJ2aWNlU3ViQ2xhc3NOYW1lYC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aW9uIC0gQWN0aW9uIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXJpIC0gVW5pZmllZCByZXNvdXJjZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1pbWVUeXBlIC0gTWltZSB0eXBlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkZW50aWZpZXIgLSBPcHRpb25hbCBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8QXJyYXk8c3RyaW5nPn0gY2F0ZWdvcmllcyAtIE9uZSBvciBtb3JlIGNhdGVnb3J5IG5hbWVzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGNvbXBvbmVudCAtIENvbXBvbmVudCBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBhY2thZ2UgLSBQYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8QXJyYXk8c3RyaW5nPj59IGV4dHJhcyAtIE9wdGlvbmFsIGludGVudCBhcmd1bWVudHMuXG4gKiBTZWUgYWJvdmUgZm9yIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZmxhZ3MgLSBJbnRlbnQgc3RhcnR1cC1zcGVjaWZpYyBmbGFncyBhcyBhIGhleGFkZWNpbWFsIHN0cmluZy5cbiAqIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICovXG5cbi8qKlxuICogU3RhcnRzIHRoZSBnaXZlbiBzZXJ2aWNlIGludGVudC5cbiAqXG4gKiBAcGFyYW0ge1N0YXJ0U2VydmljZU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21tYW5kIG91dHB1dFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc3RhcnRpbmcgdGhlIHNlcnZpY2VcbiAqIG9yIHJlcXVpcmVkIG9wdGlvbnMgYXJlIG1pc3NpbmdcbiAqL1xuY29tbWFuZHMubW9iaWxlU3RhcnRTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRTZXJ2aWNlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVzZXIsXG4gICAgZm9yZWdyb3VuZCxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGNtZCA9IFsnYW0nXTtcbiAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCBBUElfTEVWRUxfQU5EUk9JRF84KSB7XG4gICAgY21kLnB1c2goJ3N0YXJ0c2VydmljZScpO1xuICB9IGVsc2Uge1xuICAgIGNtZC5wdXNoKGZvcmVncm91bmQgPyAnc3RhcnQtZm9yZWdyb3VuZC1zZXJ2aWNlJyA6ICdzdGFydC1zZXJ2aWNlJyk7XG4gIH1cbiAgaWYgKCFfLmlzTmlsKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUludGVudFNwZWMob3B0cykpKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0b3BTZXJ2aWNlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSB1c2VyIFsnY3VycmVudCddIC0gVGhlIHVzZXIgSUQgZm9yIHdoaWNoIHRoZSBzZXJ2aWNlIGlzIHJ1bm5pbmcuXG4gKiBUaGUgYGN1cnJlbnRgIHVzZXIgaWQgaXMgdXNlZCBieSBkZWZhdWx0XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGludGVudCB0byBzdG9wLCBmb3IgZXhhbXBsZVxuICogYGNvbS5zb21lLnBhY2thZ2UubmFtZS8uWW91clNlcnZpY2VTdWJDbGFzc05hbWVgLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBhY3Rpb24gLSBBY3Rpb24gbmFtZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB1cmkgLSBVbmlmaWVkIHJlc291cmNlIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbWltZVR5cGUgLSBNaW1lIHR5cGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaWRlbnRpZmllciAtIE9wdGlvbmFsIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xBcnJheTxzdHJpbmc+fSBjYXRlZ29yaWVzIC0gT25lIG9yIG1vcmUgY2F0ZWdvcnkgbmFtZXNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gY29tcG9uZW50IC0gQ29tcG9uZW50IG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGFja2FnZSAtIFBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHtBcnJheTxBcnJheTxzdHJpbmc+Pn0gZXh0cmFzIC0gT3B0aW9uYWwgaW50ZW50IGFyZ3VtZW50cy5cbiAqIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBmbGFncyAtIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICovXG5cbi8qKlxuICogU3RvcHMgdGhlIGdpdmVuIHNlcnZpY2UgaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7U3RvcFNlcnZpY2VPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tbWFuZCBvdXRwdXRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHN0b3BwaW5nIHRoZSBzZXJ2aWNlXG4gKiBvciByZXF1aXJlZCBvcHRpb25zIGFyZSBtaXNzaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0b3BTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RvcFNlcnZpY2UgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdXNlcixcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGNtZCA9IFtcbiAgICAnYW0nLFxuICAgIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgQVBJX0xFVkVMX0FORFJPSURfOCkgPyAnc3RvcHNlcnZpY2UnIDogJ3N0b3Atc2VydmljZSdcbiAgXTtcbiAgaWYgKCFfLmlzTmlsKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUludGVudFNwZWMob3B0cykpKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG59O1xuXG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQSxNQUFNQSxpQkFBaUIsR0FBRyxJQUExQjtBQUNBLE1BQU1DLHFCQUFxQixHQUFHLENBQzVCLEdBRDRCLEVBQ3ZCRCxpQkFEdUIsRUFD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
170
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOT19WQUxVRV9BUkdfVFlQRSIsIlNVUFBPUlRFRF9FWFRSQV9UWVBFUyIsIkFQSV9MRVZFTF9BTkRST0lEXzgiLCJjb21tYW5kcyIsInBhcnNlSW50ZW50U3BlYyIsIm9wdHMiLCJpbnRlbnQiLCJhY3Rpb24iLCJ1cmkiLCJtaW1lVHlwZSIsImlkZW50aWZpZXIiLCJjYXRlZ29yaWVzIiwiY29tcG9uZW50IiwiZXh0cmFzIiwiZmxhZ3MiLCJyZXN1bHRBcmdzIiwicHVzaCIsIl8iLCJpc05pbCIsImlzQXJyYXkiLCJmbGF0TWFwIiwibWFwIiwiY05hbWUiLCJwYWNrYWdlIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJpdGVtIiwidHlwZSIsImtleSIsInZhbHVlIiwiaW5jbHVkZXMiLCJpc0VtcHR5IiwiaXNTdHJpbmciLCJ0cmltIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzVW5kZWZpbmVkIiwibW9iaWxlU3RhcnRBY3Rpdml0eSIsInVzZXIiLCJ3YWl0Iiwic3RvcCIsIndpbmRvd2luZ01vZGUiLCJhY3Rpdml0eVR5cGUiLCJkaXNwbGF5IiwiY21kIiwiYWRiIiwiZ2V0QXBpTGV2ZWwiLCJzaGVsbCIsIm1vYmlsZUJyb2FkY2FzdCIsInJlY2VpdmVyUGVybWlzc2lvbiIsImFsbG93QmFja2dyb3VuZEFjdGl2aXR5U3RhcnRzIiwibW9iaWxlU3RhcnRTZXJ2aWNlIiwiZm9yZWdyb3VuZCIsIm1vYmlsZVN0b3BTZXJ2aWNlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2ludGVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IE5PX1ZBTFVFX0FSR19UWVBFID0gJ3NuJztcbmNvbnN0IFNVUFBPUlRFRF9FWFRSQV9UWVBFUyA9IFtcbiAgJ3MnLCBOT19WQUxVRV9BUkdfVFlQRSwgJ3onLCAnaScsICdsJywgJ2YnLCAndScsICdjbicsXG4gICdpYScsICdpYWwnLCAnbGEnLCAnbGFsJywgJ2ZhJywgJ2ZhbCcsICdzYScsICdzYWwnLFxuXTtcbmNvbnN0IEFQSV9MRVZFTF9BTkRST0lEXzggPSAyNjtcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuZnVuY3Rpb24gcGFyc2VJbnRlbnRTcGVjIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGludGVudCxcbiAgICBhY3Rpb24sXG4gICAgdXJpLFxuICAgIG1pbWVUeXBlLFxuICAgIGlkZW50aWZpZXIsXG4gICAgY2F0ZWdvcmllcyxcbiAgICBjb21wb25lbnQsXG4gICAgZXh0cmFzLFxuICAgIGZsYWdzLFxuICB9ID0gb3B0cztcbiAgY29uc3QgcmVzdWx0QXJncyA9IFtdO1xuICBpZiAoaW50ZW50KSB7XG4gICAgcmVzdWx0QXJncy5wdXNoKGludGVudCk7XG4gIH1cbiAgaWYgKGFjdGlvbikge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLWEnLCBhY3Rpb24pO1xuICB9XG4gIGlmICh1cmkpIHtcbiAgICByZXN1bHRBcmdzLnB1c2goJy1kJywgdXJpKTtcbiAgfVxuICBpZiAobWltZVR5cGUpIHtcbiAgICByZXN1bHRBcmdzLnB1c2goJy10JywgbWltZVR5cGUpO1xuICB9XG4gIGlmICghXy5pc05pbChpZGVudGlmaWVyKSkge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLWknLCBpZGVudGlmaWVyKTtcbiAgfVxuICBpZiAoY2F0ZWdvcmllcykge1xuICAgIGlmIChfLmlzQXJyYXkoY2F0ZWdvcmllcykpIHtcbiAgICAgIHJlc3VsdEFyZ3MucHVzaCguLi4oXy5mbGF0TWFwKGNhdGVnb3JpZXMubWFwKChjTmFtZSkgPT4gWyctYycsIGNOYW1lXSkpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdEFyZ3MucHVzaCgnLWMnLCBjYXRlZ29yaWVzKTtcbiAgICB9XG4gIH1cbiAgaWYgKGNvbXBvbmVudCkge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLW4nLCBjb21wb25lbnQpO1xuICB9XG4gIGlmIChvcHRzLnBhY2thZ2UpIHtcbiAgICByZXN1bHRBcmdzLnB1c2goJy1wJywgb3B0cy5wYWNrYWdlKTtcbiAgfVxuICBpZiAoZXh0cmFzKSB7XG4gICAgaWYgKCFfLmlzQXJyYXkoZXh0cmFzKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ2V4dHJhcycgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXh0cmFzKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShpdGVtKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBFeHRyYSBhcmd1bWVudCAnJHtpdGVtfScgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgICAgfVxuICAgICAgY29uc3QgW3R5cGUsIGtleSwgdmFsdWVdID0gaXRlbTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhTVVBQT1JURURfRVhUUkFfVFlQRVMsIHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEV4dHJhIGFyZ3VtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCBrbm93bi4gYCArXG4gICAgICAgICAgYFN1cHBvcnRlZCBpbnRlbnQgYXJndW1lbnQgdHlwZXMgYXJlOiAke1NVUFBPUlRFRF9FWFRSQV9UWVBFU31gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc0VtcHR5KGtleSkgfHwgKF8uaXNTdHJpbmcoa2V5KSAmJiBfLnRyaW0oa2V5KSA9PT0gJycpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEV4dHJhIGFyZ3VtZW50J3Mga2V5IGluICcke0pTT04uc3RyaW5naWZ5KGl0ZW0pfScgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBpZGVudGlmaWVyYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09IE5PX1ZBTFVFX0FSR19UWVBFKSB7XG4gICAgICAgIHJlc3VsdEFyZ3MucHVzaChgLS1lJHt0eXBlfWAsIGtleSk7XG4gICAgICB9IGVsc2UgaWYgKF8uaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEludGVudCBhcmd1bWVudCB0eXBlICcke3R5cGV9JyBpbiAnJHtKU09OLnN0cmluZ2lmeShpdGVtKX0nIHJlcXVpcmVzIGEgYCArXG4gICAgICAgICAgYHZhbGlkIHZhbHVlIHRvIGJlIHByb3ZpZGVkYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0QXJncy5wdXNoKGAtLWUke3R5cGV9YCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChmbGFncykge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLWYnLCBmbGFncyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdEFyZ3M7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRBY3Rpdml0eU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHVzZXIgWydjdXJyZW50J10gLSBUaGUgdXNlciBJRCBmb3Igd2hpY2ggdGhlIHNlcnZpY2UgaXMgc3RhcnRlZC5cbiAqIFRoZSBgY3VycmVudGAgdXNlciBpZCBpcyB1c2VkIGJ5IGRlZmF1bHRcbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHdhaXQgW2ZhbHNlXSAtIFNldCBpdCB0byBgdHJ1ZWAgaWYgeW91IHdhbnQgdG8gYmxvY2sgdGhlIG1ldGhvZCBjYWxsXG4gKiB1bnRpbCB0aGUgYWN0aXZpdHkgbWFuYWdlcidzIHByb2Nlc3MgcmV0dXJucyB0aGUgY29udHJvbCB0byB0aGUgc3lzdGVtLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gc3RvcCBbZmFsc2VdIC0gU2V0IGl0IHRvIGB0cnVlYCB0byBmb3JjZSBzdG9wIHRoZSB0YXJnZXRcbiAqIGFwcCBiZWZvcmUgc3RhcnRpbmcgdGhlIGFjdGl2aXR5XG4gKiBAcHJvcGVydHkgez9udW1iZXJ8c3RyaW5nfSB3aW5kb3dpbmdNb2RlIC0gVGhlIHdpbmRvd2luZyBtb2RlIHRvIGxhdW5jaCB0aGUgYWN0aXZpdHkgaW50by5cbiAqIENoZWNrIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL21hc3Rlci9jb3JlL2phdmEvYW5kcm9pZC9hcHAvV2luZG93Q29uZmlndXJhdGlvbi5qYXZhXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHBvc3NpYmxlIHdpbmRvd2luZyBtb2RlcyAoY29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggYFdJTkRPV0lOR19NT0RFX2ApLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfHN0cmluZ30gYWN0aXZpdHlUeXBlIC0gVGhlIGFjdGl2aXR5IHR5cGUgdG8gbGF1bmNoIHRoZSBhY3Rpdml0eSBhcy5cbiAqIENoZWNrIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL21hc3Rlci9jb3JlL2phdmEvYW5kcm9pZC9hcHAvV2luZG93Q29uZmlndXJhdGlvbi5qYXZhXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHBvc3NpYmxlIGFjdGl2aXR5IHR5cGVzIChjb25zdGFudHMgc3RhcnRpbmcgd2l0aCBgQUNUSVZJVFlfVFlQRV9gKS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IGRpc3BsYXkgLSBUaGUgZGlzcGxheSBpZGVudGlmaWVyIHRvIGxhdW5jaCB0aGUgYWN0aXZpdHkgaW50by5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGFjdGl2aXR5IGludGVudCB0byBzdGFydCwgZm9yIGV4YW1wbGVcbiAqIGBjb20uc29tZS5wYWNrYWdlLm5hbWUvLllvdXJTZXJ2aWNlU3ViQ2xhc3NOYW1lYFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBhY3Rpb24gLSBBY3Rpb24gbmFtZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwYWNrYWdlIC0gUGFja2FnZSBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHVyaSAtIFVuaWZpZWQgcmVzb3VyY2UgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBtaW1lVHlwZSAtIE1pbWUgdHlwZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpZGVudGlmaWVyIC0gT3B0aW9uYWwgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHs/c3RyaW5nfEFycmF5PHN0cmluZz59IGNhdGVnb3JpZXMgLSBPbmUgb3IgbW9yZSBjYXRlZ29yeSBuYW1lc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBjb21wb25lbnQgLSBDb21wb25lbnQgbmFtZVxuICogQHByb3BlcnR5IHtBcnJheTxzdHJpbmd8QXJyYXk8c3RyaW5nPj59IGV4dHJhcyAtIE9wdGlvbmFsIGludGVudCBhcmd1bWVudHMuIE11c3QgYmUgcmVwcmVzZW50ZWRcbiAqIGFzIGFycmF5IG9mIGFycmF5cywgd2hlcmUgZWFjaCBzdWJhcnJheSBpdGVtIGNvbnRhaW5zIHR3byBvciB0aHJlZSBzdHJpbmcgaXRlbXM6XG4gKiB2YWx1ZSB0eXBlLCBrZXkgbmFtZSBhbmQgdGhlIHZhbHVlIGl0c2VsZi5cbiAqIFN1cHBvcnRlZCB2YWx1ZSB0eXBlcyBhcmU6XG4gKiAtIHM6IHN0cmluZy4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIHN0cmluZ1xuICogLSBzbjogbnVsbC4gVmFsdWUgaXMgaWdub3JlZCBmb3IgdGhpcyB0eXBlXG4gKiAtIHo6IGJvb2xlYW4uIFZhbHVlIG11c3QgYmUgZWl0aGVyIGB0cnVlYCBvciBgZmFsc2VgXG4gKiAtIGk6IGludGVnZXIuIFZhbHVlIG11c3QgYmUgYSB2YWxpZCA0LWJ5dGUgaW50ZWdlciBudW1iZXJcbiAqIC0gbDogbG9uZy4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIDgtYnl0ZSBsb25nIG51bWJlclxuICogLSBmOiBmbG9hdDogVmFsdWUgbXVzdCBiZSBhIHZhbGlkIGZsb2F0IG51bWJlclxuICogLSB1OiB1cmkuIFZhbHVlIG11c3QgYmUgYSB2YWxpZCB1bmlmb3JtIHJlc291cmNlIGlkZW50aWZpZXIgc3RyaW5nXG4gKiAtIGNuOiBjb21wb25lbnQgbmFtZS4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIGNvbXBvbmVudCBuYW1lIHN0cmluZ1xuICogLSBpYTogSW50ZWdlcltdLiBWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9mIGNvbW1hLXNlcGFyYXRlZCBpbnRlZ2Vyc1xuICogLSBpYWw6IExpc3Q8SW50ZWdlcj4uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGludGVnZXJzXG4gKiAtIGxhOiBMb25nW10uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGxvbmcgbnVtYmVyc1xuICogLSBsYWw6IExpc3Q8TG9uZz4uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGxvbmcgbnVtYmVyc1xuICogLSBmYTogRmxvYXRbXS4gVmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvZiBjb21tYS1zZXBhcmF0ZWQgZmxvYXQgbnVtYmVyc1xuICogLSBmYWw6IExpc3Q8RmxvYXQ+LiBWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9mIGNvbW1hLXNlcGFyYXRlZCBmbG9hdCBudW1iZXJzXG4gKiAtIHNhOiBTdHJpbmdbXS4gVmFsdWUgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5ncy4gVG8gZW1iZWQgYSBjb21tYSBpbnRvIGEgc3RyaW5nLFxuICogZXNjYXBlIGl0IHVzaW5nIFwiXFwsXCJcbiAqIC0gc2FsOiBMaXN0PFN0cmluZz4uIFZhbHVlIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkIHN0cmluZ3MuIFRvIGVtYmVkIGEgY29tbWEgaW50byBhIHN0cmluZyxcbiAqIGVzY2FwZSBpdCB1c2luZyBcIlxcLFwiXG4gKiBGb3IgZXhhbXBsZTogW1sncycsICd2YXJOYW1lMScsICdNeSBTdHJpbmcxJ10sIFsncycsICd2YXJOYW1lMicsICdNeSBTdHJpbmcyJ10sIFsnaWEnLCAnYXJyTmFtZScsICcxLDIsMyw0J11dXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGZsYWdzIC0gSW50ZW50IHN0YXJ0dXAtc3BlY2lmaWMgZmxhZ3MgYXMgYSBoZXhhZGVjaW1hbCBzdHJpbmcuXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9JbnRlbnQuaHRtbFxuICogZm9yIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBmbGFnIHZhbHVlcyAoY29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggRkxBR19BQ1RJVklUWV8pLlxuICogRmxhZyB2YWx1ZXMgY291bGQgYmUgbWVyZ2VkIHVzaW5nIHRoZSBsb2dpY2FsICdvcicgb3BlcmF0aW9uLlxuICogRm9yIGV4YW1wbGUsIDB4MTAyMDAwMDAgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIHR3byBmbGFnczpcbiAqIDB4MTAwMDAwMDAgYEZMQUdfQUNUSVZJVFlfTkVXX1RBU0tgIHwgMHgwMDIwMDAwMCBgRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRGBcbiAqL1xuXG4vKipcbiAqIFN0YXJ0cyB0aGUgZ2l2ZW4gYWN0aXZpdHkgaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7U3RhcnRBY3Rpdml0eU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21tYW5kIG91dHB1dFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc3RhcnRpbmcgdGhlIGFjdGl2aXR5XG4gKiBvciByZXF1aXJlZCBvcHRpb25zIGFyZSBtaXNzaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0YXJ0QWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdGFydEFjdGl2aXR5IChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVzZXIsXG4gICAgd2FpdCxcbiAgICBzdG9wLFxuICAgIHdpbmRvd2luZ01vZGUsXG4gICAgYWN0aXZpdHlUeXBlLFxuICAgIGRpc3BsYXksXG4gIH0gPSBvcHRzO1xuICBjb25zdCBjbWQgPSBbXG4gICAgJ2FtJywgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCBBUElfTEVWRUxfQU5EUk9JRF84KSA/ICdzdGFydCcgOiAnc3RhcnQtYWN0aXZpdHknLFxuICBdO1xuICBpZiAoIV8uaXNOaWwodXNlcikpIHtcbiAgICBjbWQucHVzaCgnLS11c2VyJywgdXNlcik7XG4gIH1cbiAgaWYgKHdhaXQpIHtcbiAgICBjbWQucHVzaCgnLVcnKTtcbiAgfVxuICBpZiAoc3RvcCkge1xuICAgIGNtZC5wdXNoKCctUycpO1xuICB9XG4gIGlmICghXy5pc05pbCh3aW5kb3dpbmdNb2RlKSkge1xuICAgIGNtZC5wdXNoKCctLXdpbmRvd2luZ01vZGUnLCB3aW5kb3dpbmdNb2RlKTtcbiAgfVxuICBpZiAoIV8uaXNOaWwoYWN0aXZpdHlUeXBlKSkge1xuICAgIGNtZC5wdXNoKCctLWFjdGl2aXR5VHlwZScsIGFjdGl2aXR5VHlwZSk7XG4gIH1cbiAgaWYgKCFfLmlzTmlsKGRpc3BsYXkpKSB7XG4gICAgY21kLnB1c2goJy0tZGlzcGxheScsIGRpc3BsYXkpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUludGVudFNwZWMob3B0cykpKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEJyb2FkY2FzdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHVzZXIgWydhbGwnXSAtIFRoZSB1c2VyIElEIGZvciB3aGljaCB0aGUgYnJvYWRjYXN0IGlzIHNlbnQuXG4gKiBUaGUgYGN1cnJlbnRgIGFsaWFzIGFzc3VtZXMgdGhlIGN1cnJlbnQgdXNlciBJRC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcmVjZWl2ZXJQZXJtaXNzaW9uIC0gUmVxdWlyZSByZWNlaXZlciB0byBob2xkIHRoZSBnaXZlbiBwZXJtaXNzaW9uLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gYWxsb3dCYWNrZ3JvdW5kQWN0aXZpdHlTdGFydHMgW2ZhbHNlXSAtIFdoZXRoZXIgdGhlIHJlY2VpdmVyIG1heVxuICogc3RhcnQgYWN0aXZpdGllcyBldmVuIGlmIGluIHRoZSBiYWNrZ3JvdW5kLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgaW50ZW50IHRvIGJyb2FkY2FzdCB0bywgZm9yIGV4YW1wbGVcbiAqIGBjb20uc29tZS5wYWNrYWdlLm5hbWUvLllvdXJTZXJ2aWNlU3ViQ2xhc3NOYW1lYC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aW9uIC0gQWN0aW9uIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXJpIC0gVW5pZmllZCByZXNvdXJjZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1pbWVUeXBlIC0gTWltZSB0eXBlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkZW50aWZpZXIgLSBPcHRpb25hbCBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8QXJyYXk8c3RyaW5nPn0gY2F0ZWdvcmllcyAtIE9uZSBvciBtb3JlIGNhdGVnb3J5IG5hbWVzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGNvbXBvbmVudCAtIENvbXBvbmVudCBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBhY2thZ2UgLSBQYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8QXJyYXk8c3RyaW5nPj59IGV4dHJhcyAtIE9wdGlvbmFsIGludGVudCBhcmd1bWVudHMuXG4gKiBTZWUgYWJvdmUgZm9yIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZmxhZ3MgLSBJbnRlbnQgc3RhcnR1cC1zcGVjaWZpYyBmbGFncyBhcyBhIGhleGFkZWNpbWFsIHN0cmluZy5cbiAqIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICovXG5cblxuLyoqXG4gKiBTZW5kIGEgYnJvYWRjYXN0IGludGVudC5cbiAqXG4gKiBAcGFyYW0ge0Jyb2FkY2FzdE9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21tYW5kIG91dHB1dFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc3RhcnRpbmcgdGhlIGFjdGl2aXR5XG4gKiBvciByZXF1aXJlZCBvcHRpb25zIGFyZSBtaXNzaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUJyb2FkY2FzdCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUJyb2FkY2FzdCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB1c2VyLFxuICAgIHJlY2VpdmVyUGVybWlzc2lvbixcbiAgICBhbGxvd0JhY2tncm91bmRBY3Rpdml0eVN0YXJ0cyxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGNtZCA9IFsnYW0nLCAnYnJvYWRjYXN0J107XG4gIGlmICghXy5pc05pbCh1c2VyKSkge1xuICAgIGNtZC5wdXNoKCctLXVzZXInLCB1c2VyKTtcbiAgfVxuICBpZiAocmVjZWl2ZXJQZXJtaXNzaW9uKSB7XG4gICAgY21kLnB1c2goJy0tcmVjZWl2ZXItcGVybWlzc2lvbicsIHJlY2VpdmVyUGVybWlzc2lvbik7XG4gIH1cbiAgaWYgKGFsbG93QmFja2dyb3VuZEFjdGl2aXR5U3RhcnRzKSB7XG4gICAgY21kLnB1c2goJy0tYWxsb3ctYmFja2dyb3VuZC1hY3Rpdml0eS1zdGFydHMnKTtcbiAgfVxuICBjbWQucHVzaCguLi4ocGFyc2VJbnRlbnRTcGVjKG9wdHMpKSk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5zaGVsbChjbWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydFNlcnZpY2VPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB1c2VyIFsnY3VycmVudCddIC0gVGhlIHVzZXIgSUQgZm9yIHdoaWNoIHRoZSBzZXJ2aWNlIGlzIHN0YXJ0ZWQuXG4gKiBUaGUgYGN1cnJlbnRgIHVzZXIgaWQgaXMgdXNlZCBieSBkZWZhdWx0XG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBmb3JlZ3JvdW5kIFtmYWxzZV0gLSBTZXQgaXQgdG8gYHRydWVgIGlmIHlvdXIgc2VydmljZSBtdXN0IGJlXG4gKiBzdGFydGVkIGFzIGZvcmVncm91bmQgc2VydmljZS4gVGhpcyBvcHRpb24gaXMgaWdub3JlZCBpZiB0aGUgQVBJIGxldmVsIG9mIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3QgaXMgYmVsb3cgMjYgKEFuZHJvaWQgOCkuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGludGVudCB0byBzdGFydCwgZm9yIGV4YW1wbGVcbiAqIGBjb20uc29tZS5wYWNrYWdlLm5hbWUvLllvdXJTZXJ2aWNlU3ViQ2xhc3NOYW1lYC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aW9uIC0gQWN0aW9uIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXJpIC0gVW5pZmllZCByZXNvdXJjZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1pbWVUeXBlIC0gTWltZSB0eXBlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkZW50aWZpZXIgLSBPcHRpb25hbCBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8QXJyYXk8c3RyaW5nPn0gY2F0ZWdvcmllcyAtIE9uZSBvciBtb3JlIGNhdGVnb3J5IG5hbWVzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGNvbXBvbmVudCAtIENvbXBvbmVudCBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBhY2thZ2UgLSBQYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8QXJyYXk8c3RyaW5nPj59IGV4dHJhcyAtIE9wdGlvbmFsIGludGVudCBhcmd1bWVudHMuXG4gKiBTZWUgYWJvdmUgZm9yIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZmxhZ3MgLSBJbnRlbnQgc3RhcnR1cC1zcGVjaWZpYyBmbGFncyBhcyBhIGhleGFkZWNpbWFsIHN0cmluZy5cbiAqIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICovXG5cbi8qKlxuICogU3RhcnRzIHRoZSBnaXZlbiBzZXJ2aWNlIGludGVudC5cbiAqXG4gKiBAcGFyYW0ge1N0YXJ0U2VydmljZU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21tYW5kIG91dHB1dFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc3RhcnRpbmcgdGhlIHNlcnZpY2VcbiAqIG9yIHJlcXVpcmVkIG9wdGlvbnMgYXJlIG1pc3NpbmdcbiAqL1xuY29tbWFuZHMubW9iaWxlU3RhcnRTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRTZXJ2aWNlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVzZXIsXG4gICAgZm9yZWdyb3VuZCxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGNtZCA9IFsnYW0nXTtcbiAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCBBUElfTEVWRUxfQU5EUk9JRF84KSB7XG4gICAgY21kLnB1c2goJ3N0YXJ0c2VydmljZScpO1xuICB9IGVsc2Uge1xuICAgIGNtZC5wdXNoKGZvcmVncm91bmQgPyAnc3RhcnQtZm9yZWdyb3VuZC1zZXJ2aWNlJyA6ICdzdGFydC1zZXJ2aWNlJyk7XG4gIH1cbiAgaWYgKCFfLmlzTmlsKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUludGVudFNwZWMob3B0cykpKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0b3BTZXJ2aWNlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSB1c2VyIFsnY3VycmVudCddIC0gVGhlIHVzZXIgSUQgZm9yIHdoaWNoIHRoZSBzZXJ2aWNlIGlzIHJ1bm5pbmcuXG4gKiBUaGUgYGN1cnJlbnRgIHVzZXIgaWQgaXMgdXNlZCBieSBkZWZhdWx0XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGludGVudCB0byBzdG9wLCBmb3IgZXhhbXBsZVxuICogYGNvbS5zb21lLnBhY2thZ2UubmFtZS8uWW91clNlcnZpY2VTdWJDbGFzc05hbWVgLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBhY3Rpb24gLSBBY3Rpb24gbmFtZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB1cmkgLSBVbmlmaWVkIHJlc291cmNlIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbWltZVR5cGUgLSBNaW1lIHR5cGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaWRlbnRpZmllciAtIE9wdGlvbmFsIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xBcnJheTxzdHJpbmc+fSBjYXRlZ29yaWVzIC0gT25lIG9yIG1vcmUgY2F0ZWdvcnkgbmFtZXNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gY29tcG9uZW50IC0gQ29tcG9uZW50IG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGFja2FnZSAtIFBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHtBcnJheTxBcnJheTxzdHJpbmc+Pn0gZXh0cmFzIC0gT3B0aW9uYWwgaW50ZW50IGFyZ3VtZW50cy5cbiAqIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBmbGFncyAtIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICovXG5cbi8qKlxuICogU3RvcHMgdGhlIGdpdmVuIHNlcnZpY2UgaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7U3RvcFNlcnZpY2VPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tbWFuZCBvdXRwdXRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHN0b3BwaW5nIHRoZSBzZXJ2aWNlXG4gKiBvciByZXF1aXJlZCBvcHRpb25zIGFyZSBtaXNzaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0b3BTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RvcFNlcnZpY2UgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdXNlcixcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGNtZCA9IFtcbiAgICAnYW0nLFxuICAgIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgQVBJX0xFVkVMX0FORFJPSURfOCkgPyAnc3RvcHNlcnZpY2UnIDogJ3N0b3Atc2VydmljZSdcbiAgXTtcbiAgaWYgKCFfLmlzTmlsKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUludGVudFNwZWMob3B0cykpKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG59O1xuXG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBRUEsTUFBTUEsaUJBQWlCLEdBQUcsSUFBSTtBQUM5QixNQUFNQyxxQkFBcUIsR0FBRyxDQUM1QixHQUFHLEVBQUVELGlCQUFpQixFQUFFLEdBQUcs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
@@ -1 +1 @@
1
- {"version":3,"file":"intent.js","names":["NO_VALUE_ARG_TYPE","SUPPORTED_EXTRA_TYPES","API_LEVEL_ANDROID_8","commands","parseIntentSpec","opts","intent","action","uri","mimeType","identifier","categories","component","extras","flags","resultArgs","push","_","isNil","isArray","flatMap","map","cName","package","errors","InvalidArgumentError","item","type","key","value","includes","isEmpty","isString","trim","JSON","stringify","isUndefined","mobileStartActivity","user","wait","stop","windowingMode","activityType","display","cmd","adb","getApiLevel","shell","mobileBroadcast","receiverPermission","allowBackgroundActivityStarts","mobileStartService","foreground","mobileStopService"],"sources":["../../../lib/commands/intent.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nconst NO_VALUE_ARG_TYPE = 'sn';\nconst SUPPORTED_EXTRA_TYPES = [\n 's', NO_VALUE_ARG_TYPE, 'z', 'i', 'l', 'f', 'u', 'cn',\n 'ia', 'ial', 'la', 'lal', 'fa', 'fal', 'sa', 'sal',\n];\nconst API_LEVEL_ANDROID_8 = 26;\n\nconst commands = {};\n\nfunction parseIntentSpec (opts = {}) {\n const {\n intent,\n action,\n uri,\n mimeType,\n identifier,\n categories,\n component,\n extras,\n flags,\n } = opts;\n const resultArgs = [];\n if (intent) {\n resultArgs.push(intent);\n }\n if (action) {\n resultArgs.push('-a', action);\n }\n if (uri) {\n resultArgs.push('-d', uri);\n }\n if (mimeType) {\n resultArgs.push('-t', mimeType);\n }\n if (!_.isNil(identifier)) {\n resultArgs.push('-i', identifier);\n }\n if (categories) {\n if (_.isArray(categories)) {\n resultArgs.push(...(_.flatMap(categories.map((cName) => ['-c', cName]))));\n } else {\n resultArgs.push('-c', categories);\n }\n }\n if (component) {\n resultArgs.push('-n', component);\n }\n if (opts.package) {\n resultArgs.push('-p', opts.package);\n }\n if (extras) {\n if (!_.isArray(extras)) {\n throw new errors.InvalidArgumentError(`'extras' must be an array`);\n }\n for (const item of extras) {\n if (!_.isArray(item)) {\n throw new errors.InvalidArgumentError(`Extra argument '${item}' must be an array`);\n }\n const [type, key, value] = item;\n if (!_.includes(SUPPORTED_EXTRA_TYPES, type)) {\n throw new errors.InvalidArgumentError(\n `Extra argument type '${type}' is not known. ` +\n `Supported intent argument types are: ${SUPPORTED_EXTRA_TYPES}`\n );\n }\n if (_.isEmpty(key) || (_.isString(key) && _.trim(key) === '')) {\n throw new errors.InvalidArgumentError(\n `Extra argument's key in '${JSON.stringify(item)}' must be a valid string identifier`\n );\n }\n if (type === NO_VALUE_ARG_TYPE) {\n resultArgs.push(`--e${type}`, key);\n } else if (_.isUndefined(value)) {\n throw new errors.InvalidArgumentError(\n `Intent argument type '${type}' in '${JSON.stringify(item)}' requires a ` +\n `valid value to be provided`\n );\n } else {\n resultArgs.push(`--e${type}`, key, value);\n }\n }\n }\n if (flags) {\n resultArgs.push('-f', flags);\n }\n return resultArgs;\n}\n\n/**\n * @typedef {Object} StartActivityOptions\n * @property {?string|number} user ['current'] - The user ID for which the service is started.\n * The `current` user id is used by default\n * @property {?boolean} wait [false] - Set it to `true` if you want to block the method call\n * until the activity manager's process returns the control to the system.\n * @property {?boolean} stop [false] - Set it to `true` to force stop the target\n * app before starting the activity\n * @property {?number|string} windowingMode - The windowing mode to launch the activity into.\n * Check https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java\n * for more details on possible windowing modes (constants starting with `WINDOWING_MODE_`).\n * @property {?number|string} activityType - The activity type to launch the activity as.\n * Check https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java\n * for more details on possible activity types (constants starting with `ACTIVITY_TYPE_`).\n * @property {?number|string} display - The display identifier to launch the activity into.\n * @property {?string} intent - The name of the activity intent to start, for example\n * `com.some.package.name/.YourServiceSubClassName`\n * @property {?string} action - Action name\n * @property {?string} package - Package name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {Array<string|Array<string>>} extras - Optional intent arguments. Must be represented\n * as array of arrays, where each subarray item contains two or three string items:\n * value type, key name and the value itself.\n * Supported value types are:\n * - s: string. Value must be a valid string\n * - sn: null. Value is ignored for this type\n * - z: boolean. Value must be either `true` or `false`\n * - i: integer. Value must be a valid 4-byte integer number\n * - l: long. Value must be a valid 8-byte long number\n * - f: float: Value must be a valid float number\n * - u: uri. Value must be a valid uniform resource identifier string\n * - cn: component name. Value must be a valid component name string\n * - ia: Integer[]. Value must be a string of comma-separated integers\n * - ial: List<Integer>. Value must be a string of comma-separated integers\n * - la: Long[]. Value must be a string of comma-separated long numbers\n * - lal: List<Long>. Value must be a string of comma-separated long numbers\n * - fa: Float[]. Value must be a string of comma-separated float numbers\n * - fal: List<Float>. Value must be a string of comma-separated float numbers\n * - sa: String[]. Value must be comma-separated strings. To embed a comma into a string,\n * escape it using \"\\,\"\n * - sal: List<String>. Value must be comma-separated strings. To embed a comma into a string,\n * escape it using \"\\,\"\n * For example: [['s', 'varName1', 'My String1'], ['s', 'varName2', 'My String2'], ['ia', 'arrName', '1,2,3,4']]\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See https://developer.android.com/reference/android/content/Intent.html\n * for the list of available flag values (constants starting with FLAG_ACTIVITY_).\n * Flag values could be merged using the logical 'or' operation.\n * For example, 0x10200000 is the combination of two flags:\n * 0x10000000 `FLAG_ACTIVITY_NEW_TASK` | 0x00200000 `FLAG_ACTIVITY_RESET_TASK_IF_NEEDED`\n */\n\n/**\n * Starts the given activity intent.\n *\n * @param {StartActivityOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the activity\n * or required options are missing\n */\ncommands.mobileStartActivity = async function mobileStartActivity (opts = {}) {\n const {\n user,\n wait,\n stop,\n windowingMode,\n activityType,\n display,\n } = opts;\n const cmd = [\n 'am', (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) ? 'start' : 'start-activity',\n ];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n if (wait) {\n cmd.push('-W');\n }\n if (stop) {\n cmd.push('-S');\n }\n if (!_.isNil(windowingMode)) {\n cmd.push('--windowingMode', windowingMode);\n }\n if (!_.isNil(activityType)) {\n cmd.push('--activityType', activityType);\n }\n if (!_.isNil(display)) {\n cmd.push('--display', display);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} BroadcastOptions\n * @property {?string|number} user ['all'] - The user ID for which the broadcast is sent.\n * The `current` alias assumes the current user ID.\n * @property {?string} receiverPermission - Require receiver to hold the given permission.\n * @property {?boolean} allowBackgroundActivityStarts [false] - Whether the receiver may\n * start activities even if in the background.\n * @property {?string} intent - The name of the intent to broadcast to, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See above for the detailed description.\n */\n\n\n/**\n * Send a broadcast intent.\n *\n * @param {BroadcastOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the activity\n * or required options are missing\n */\ncommands.mobileBroadcast = async function mobileBroadcast (opts = {}) {\n const {\n user,\n receiverPermission,\n allowBackgroundActivityStarts,\n } = opts;\n const cmd = ['am', 'broadcast'];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n if (receiverPermission) {\n cmd.push('--receiver-permission', receiverPermission);\n }\n if (allowBackgroundActivityStarts) {\n cmd.push('--allow-background-activity-starts');\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} StartServiceOptions\n * @property {?string|number} user ['current'] - The user ID for which the service is started.\n * The `current` user id is used by default\n * @property {?boolean} foreground [false] - Set it to `true` if your service must be\n * started as foreground service. This option is ignored if the API level of the\n * device under test is below 26 (Android 8).\n * @property {?string} intent - The name of the service intent to start, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See above for the detailed description.\n */\n\n/**\n * Starts the given service intent.\n *\n * @param {StartServiceOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the service\n * or required options are missing\n */\ncommands.mobileStartService = async function mobileStartService (opts = {}) {\n const {\n user,\n foreground,\n } = opts;\n const cmd = ['am'];\n if (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) {\n cmd.push('startservice');\n } else {\n cmd.push(foreground ? 'start-foreground-service' : 'start-service');\n }\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} StopServiceOptions\n * @property {string|number} user ['current'] - The user ID for which the service is running.\n * The `current` user id is used by default\n * @property {?string} intent - The name of the service intent to stop, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - See above for the detailed description.\n */\n\n/**\n * Stops the given service intent.\n *\n * @param {StopServiceOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while stopping the service\n * or required options are missing\n */\ncommands.mobileStopService = async function mobileStopService (opts = {}) {\n const {\n user,\n } = opts;\n const cmd = [\n 'am',\n (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) ? 'stopservice' : 'stop-service'\n ];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
1
+ {"version":3,"file":"intent.js","names":["NO_VALUE_ARG_TYPE","SUPPORTED_EXTRA_TYPES","API_LEVEL_ANDROID_8","commands","parseIntentSpec","opts","intent","action","uri","mimeType","identifier","categories","component","extras","flags","resultArgs","push","_","isNil","isArray","flatMap","map","cName","package","errors","InvalidArgumentError","item","type","key","value","includes","isEmpty","isString","trim","JSON","stringify","isUndefined","mobileStartActivity","user","wait","stop","windowingMode","activityType","display","cmd","adb","getApiLevel","shell","mobileBroadcast","receiverPermission","allowBackgroundActivityStarts","mobileStartService","foreground","mobileStopService"],"sources":["../../../lib/commands/intent.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nconst NO_VALUE_ARG_TYPE = 'sn';\nconst SUPPORTED_EXTRA_TYPES = [\n 's', NO_VALUE_ARG_TYPE, 'z', 'i', 'l', 'f', 'u', 'cn',\n 'ia', 'ial', 'la', 'lal', 'fa', 'fal', 'sa', 'sal',\n];\nconst API_LEVEL_ANDROID_8 = 26;\n\nconst commands = {};\n\nfunction parseIntentSpec (opts = {}) {\n const {\n intent,\n action,\n uri,\n mimeType,\n identifier,\n categories,\n component,\n extras,\n flags,\n } = opts;\n const resultArgs = [];\n if (intent) {\n resultArgs.push(intent);\n }\n if (action) {\n resultArgs.push('-a', action);\n }\n if (uri) {\n resultArgs.push('-d', uri);\n }\n if (mimeType) {\n resultArgs.push('-t', mimeType);\n }\n if (!_.isNil(identifier)) {\n resultArgs.push('-i', identifier);\n }\n if (categories) {\n if (_.isArray(categories)) {\n resultArgs.push(...(_.flatMap(categories.map((cName) => ['-c', cName]))));\n } else {\n resultArgs.push('-c', categories);\n }\n }\n if (component) {\n resultArgs.push('-n', component);\n }\n if (opts.package) {\n resultArgs.push('-p', opts.package);\n }\n if (extras) {\n if (!_.isArray(extras)) {\n throw new errors.InvalidArgumentError(`'extras' must be an array`);\n }\n for (const item of extras) {\n if (!_.isArray(item)) {\n throw new errors.InvalidArgumentError(`Extra argument '${item}' must be an array`);\n }\n const [type, key, value] = item;\n if (!_.includes(SUPPORTED_EXTRA_TYPES, type)) {\n throw new errors.InvalidArgumentError(\n `Extra argument type '${type}' is not known. ` +\n `Supported intent argument types are: ${SUPPORTED_EXTRA_TYPES}`\n );\n }\n if (_.isEmpty(key) || (_.isString(key) && _.trim(key) === '')) {\n throw new errors.InvalidArgumentError(\n `Extra argument's key in '${JSON.stringify(item)}' must be a valid string identifier`\n );\n }\n if (type === NO_VALUE_ARG_TYPE) {\n resultArgs.push(`--e${type}`, key);\n } else if (_.isUndefined(value)) {\n throw new errors.InvalidArgumentError(\n `Intent argument type '${type}' in '${JSON.stringify(item)}' requires a ` +\n `valid value to be provided`\n );\n } else {\n resultArgs.push(`--e${type}`, key, value);\n }\n }\n }\n if (flags) {\n resultArgs.push('-f', flags);\n }\n return resultArgs;\n}\n\n/**\n * @typedef {Object} StartActivityOptions\n * @property {?string|number} user ['current'] - The user ID for which the service is started.\n * The `current` user id is used by default\n * @property {?boolean} wait [false] - Set it to `true` if you want to block the method call\n * until the activity manager's process returns the control to the system.\n * @property {?boolean} stop [false] - Set it to `true` to force stop the target\n * app before starting the activity\n * @property {?number|string} windowingMode - The windowing mode to launch the activity into.\n * Check https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java\n * for more details on possible windowing modes (constants starting with `WINDOWING_MODE_`).\n * @property {?number|string} activityType - The activity type to launch the activity as.\n * Check https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java\n * for more details on possible activity types (constants starting with `ACTIVITY_TYPE_`).\n * @property {?number|string} display - The display identifier to launch the activity into.\n * @property {?string} intent - The name of the activity intent to start, for example\n * `com.some.package.name/.YourServiceSubClassName`\n * @property {?string} action - Action name\n * @property {?string} package - Package name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {Array<string|Array<string>>} extras - Optional intent arguments. Must be represented\n * as array of arrays, where each subarray item contains two or three string items:\n * value type, key name and the value itself.\n * Supported value types are:\n * - s: string. Value must be a valid string\n * - sn: null. Value is ignored for this type\n * - z: boolean. Value must be either `true` or `false`\n * - i: integer. Value must be a valid 4-byte integer number\n * - l: long. Value must be a valid 8-byte long number\n * - f: float: Value must be a valid float number\n * - u: uri. Value must be a valid uniform resource identifier string\n * - cn: component name. Value must be a valid component name string\n * - ia: Integer[]. Value must be a string of comma-separated integers\n * - ial: List<Integer>. Value must be a string of comma-separated integers\n * - la: Long[]. Value must be a string of comma-separated long numbers\n * - lal: List<Long>. Value must be a string of comma-separated long numbers\n * - fa: Float[]. Value must be a string of comma-separated float numbers\n * - fal: List<Float>. Value must be a string of comma-separated float numbers\n * - sa: String[]. Value must be comma-separated strings. To embed a comma into a string,\n * escape it using \"\\,\"\n * - sal: List<String>. Value must be comma-separated strings. To embed a comma into a string,\n * escape it using \"\\,\"\n * For example: [['s', 'varName1', 'My String1'], ['s', 'varName2', 'My String2'], ['ia', 'arrName', '1,2,3,4']]\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See https://developer.android.com/reference/android/content/Intent.html\n * for the list of available flag values (constants starting with FLAG_ACTIVITY_).\n * Flag values could be merged using the logical 'or' operation.\n * For example, 0x10200000 is the combination of two flags:\n * 0x10000000 `FLAG_ACTIVITY_NEW_TASK` | 0x00200000 `FLAG_ACTIVITY_RESET_TASK_IF_NEEDED`\n */\n\n/**\n * Starts the given activity intent.\n *\n * @param {StartActivityOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the activity\n * or required options are missing\n */\ncommands.mobileStartActivity = async function mobileStartActivity (opts = {}) {\n const {\n user,\n wait,\n stop,\n windowingMode,\n activityType,\n display,\n } = opts;\n const cmd = [\n 'am', (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) ? 'start' : 'start-activity',\n ];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n if (wait) {\n cmd.push('-W');\n }\n if (stop) {\n cmd.push('-S');\n }\n if (!_.isNil(windowingMode)) {\n cmd.push('--windowingMode', windowingMode);\n }\n if (!_.isNil(activityType)) {\n cmd.push('--activityType', activityType);\n }\n if (!_.isNil(display)) {\n cmd.push('--display', display);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} BroadcastOptions\n * @property {?string|number} user ['all'] - The user ID for which the broadcast is sent.\n * The `current` alias assumes the current user ID.\n * @property {?string} receiverPermission - Require receiver to hold the given permission.\n * @property {?boolean} allowBackgroundActivityStarts [false] - Whether the receiver may\n * start activities even if in the background.\n * @property {?string} intent - The name of the intent to broadcast to, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See above for the detailed description.\n */\n\n\n/**\n * Send a broadcast intent.\n *\n * @param {BroadcastOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the activity\n * or required options are missing\n */\ncommands.mobileBroadcast = async function mobileBroadcast (opts = {}) {\n const {\n user,\n receiverPermission,\n allowBackgroundActivityStarts,\n } = opts;\n const cmd = ['am', 'broadcast'];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n if (receiverPermission) {\n cmd.push('--receiver-permission', receiverPermission);\n }\n if (allowBackgroundActivityStarts) {\n cmd.push('--allow-background-activity-starts');\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} StartServiceOptions\n * @property {?string|number} user ['current'] - The user ID for which the service is started.\n * The `current` user id is used by default\n * @property {?boolean} foreground [false] - Set it to `true` if your service must be\n * started as foreground service. This option is ignored if the API level of the\n * device under test is below 26 (Android 8).\n * @property {?string} intent - The name of the service intent to start, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See above for the detailed description.\n */\n\n/**\n * Starts the given service intent.\n *\n * @param {StartServiceOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the service\n * or required options are missing\n */\ncommands.mobileStartService = async function mobileStartService (opts = {}) {\n const {\n user,\n foreground,\n } = opts;\n const cmd = ['am'];\n if (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) {\n cmd.push('startservice');\n } else {\n cmd.push(foreground ? 'start-foreground-service' : 'start-service');\n }\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} StopServiceOptions\n * @property {string|number} user ['current'] - The user ID for which the service is running.\n * The `current` user id is used by default\n * @property {?string} intent - The name of the service intent to stop, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - See above for the detailed description.\n */\n\n/**\n * Stops the given service intent.\n *\n * @param {StopServiceOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while stopping the service\n * or required options are missing\n */\ncommands.mobileStopService = async function mobileStopService (opts = {}) {\n const {\n user,\n } = opts;\n const cmd = [\n 'am',\n (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) ? 'stopservice' : 'stop-service'\n ];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
@@ -1,31 +1,22 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.helpers = exports.default = exports.commands = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _logger = _interopRequireDefault(require("../logger"));
13
-
14
10
  var _os = _interopRequireDefault(require("os"));
15
-
16
11
  var _lodash = _interopRequireDefault(require("lodash"));
17
-
18
12
  var _ws = _interopRequireDefault(require("ws"));
19
-
20
13
  var _driver = require("appium/driver");
21
-
22
14
  const GET_SERVER_LOGS_FEATURE = 'get_server_logs';
23
15
  let commands = {},
24
- helpers = {},
25
- extensions = {};
16
+ helpers = {},
17
+ extensions = {};
26
18
  exports.helpers = helpers;
27
19
  exports.commands = commands;
28
-
29
20
  const WEBSOCKET_ENDPOINT = sessionId => `${_driver.DEFAULT_WS_PATHNAME_PREFIX}/session/${sessionId}/appium/device/logcat`;
30
21
 
31
22
  function toLogRecord(timestamp, level, message) {
@@ -35,7 +26,6 @@ function toLogRecord(timestamp, level, message) {
35
26
  message
36
27
  };
37
28
  }
38
-
39
29
  extensions.supportedLogTypes = {
40
30
  logcat: {
41
31
  description: 'Logs for Android applications on real device and emulators via ADB',
@@ -61,29 +51,22 @@ extensions.supportedLogTypes = {
61
51
 
62
52
  commands.mobileStartLogsBroadcast = async function mobileStartLogsBroadcast() {
63
53
  const pathname = WEBSOCKET_ENDPOINT(this.sessionId);
64
-
65
54
  if (!_lodash.default.isEmpty(await this.server.getWebSocketHandlers(pathname))) {
66
55
  _logger.default.debug(`The logcat broadcasting web socket server is already listening at ${pathname}`);
67
-
68
56
  return;
69
57
  }
70
-
71
58
  _logger.default.info(`Assigning logcat broadcasting web socket server to ${pathname}`);
72
-
73
59
  const wss = new _ws.default.Server({
74
60
  noServer: true
75
61
  });
76
62
  wss.on('connection', (ws, req) => {
77
63
  if (req) {
78
64
  var _req$connection;
79
-
80
65
  const remoteIp = _lodash.default.isEmpty(req.headers['x-forwarded-for']) ? (_req$connection = req.connection) === null || _req$connection === void 0 ? void 0 : _req$connection.remoteAddress : req.headers['x-forwarded-for'];
81
-
82
66
  _logger.default.debug(`Established a new logcat listener web socket connection from ${remoteIp}`);
83
67
  } else {
84
68
  _logger.default.debug('Established a new logcat listener web socket connection');
85
69
  }
86
-
87
70
  if (_lodash.default.isEmpty(this._logcatWebsocketListener)) {
88
71
  this._logcatWebsocketListener = logRecord => {
89
72
  if ((ws === null || ws === void 0 ? void 0 : ws.readyState) === _ws.default.OPEN) {
@@ -91,27 +74,21 @@ commands.mobileStartLogsBroadcast = async function mobileStartLogsBroadcast() {
91
74
  }
92
75
  };
93
76
  }
94
-
95
77
  this.adb.setLogcatListener(this._logcatWebsocketListener);
96
78
  ws.on('close', (code, reason) => {
97
79
  if (!_lodash.default.isEmpty(this._logcatWebsocketListener)) {
98
80
  try {
99
81
  this.adb.removeLogcatListener(this._logcatWebsocketListener);
100
82
  } catch (ign) {}
101
-
102
83
  this._logcatWebsocketListener = null;
103
84
  }
104
-
105
85
  let closeMsg = 'Logcat listener web socket is closed.';
106
-
107
86
  if (!_lodash.default.isEmpty(code)) {
108
87
  closeMsg += ` Code: ${code}.`;
109
88
  }
110
-
111
89
  if (!_lodash.default.isEmpty(reason)) {
112
90
  closeMsg += ` Reason: ${reason.toString()}.`;
113
91
  }
114
-
115
92
  _logger.default.debug(closeMsg);
116
93
  });
117
94
  });
@@ -120,38 +97,29 @@ commands.mobileStartLogsBroadcast = async function mobileStartLogsBroadcast() {
120
97
 
121
98
  commands.mobileStopLogsBroadcast = async function mobileStopLogsBroadcast() {
122
99
  const pathname = WEBSOCKET_ENDPOINT(this.sessionId);
123
-
124
100
  if (_lodash.default.isEmpty(await this.server.getWebSocketHandlers(pathname))) {
125
101
  return;
126
102
  }
127
-
128
103
  _logger.default.debug('Stopping the logcat broadcasting web socket server');
129
-
130
104
  await this.server.removeWebSocketHandler(pathname);
131
105
  };
132
-
133
106
  commands.getLogTypes = async function getLogTypes() {
134
107
  const nativeLogTypes = await _driver.BaseDriver.prototype.getLogTypes.call(this);
135
-
136
108
  if (this.isWebContext()) {
137
109
  const webLogTypes = await this.chromedriver.jwproxy.command('/log/types', 'GET');
138
110
  return [...nativeLogTypes, ...webLogTypes];
139
111
  }
140
-
141
112
  return nativeLogTypes;
142
113
  };
143
-
144
114
  commands.getLog = async function getLog(logType) {
145
115
  if (this.isWebContext() && !_lodash.default.keys(this.supportedLogTypes).includes(logType)) {
146
116
  return await this.chromedriver.jwproxy.command('/log', 'POST', {
147
117
  type: logType
148
118
  });
149
119
  }
150
-
151
120
  return await _driver.BaseDriver.prototype.getLog.call(this, logType);
152
121
  };
153
-
154
122
  Object.assign(extensions, commands, helpers);
155
123
  var _default = extensions;
156
124
  exports.default = _default;
157
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJHRVRfU0VSVkVSX0xPR1NfRkVBVFVSRSIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJXRUJTT0NLRVRfRU5EUE9JTlQiLCJzZXNzaW9uSWQiLCJERUZBVUxUX1dTX1BBVEhOQU1FX1BSRUZJWCIsInRvTG9nUmVjb3JkIiwidGltZXN0YW1wIiwibGV2ZWwiLCJtZXNzYWdlIiwic3VwcG9ydGVkTG9nVHlwZXMiLCJsb2djYXQiLCJkZXNjcmlwdGlvbiIsImdldHRlciIsInNlbGYiLCJhZGIiLCJnZXRMb2djYXRMb2dzIiwiYnVncmVwb3J0Iiwib3V0cHV0IiwiRGF0ZSIsIm5vdyIsInNwbGl0Iiwib3MiLCJFT0wiLCJtYXAiLCJ4Iiwic2VydmVyIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJsb2ciLCJ1bndyYXAiLCJyZWNvcmQiLCJfIiwiaXNFbXB0eSIsInByZWZpeCIsIm1vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCIsInBhdGhuYW1lIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJkZWJ1ZyIsImluZm8iLCJ3c3MiLCJXZWJTb2NrZXQiLCJTZXJ2ZXIiLCJub1NlcnZlciIsIm9uIiwid3MiLCJyZXEiLCJyZW1vdGVJcCIsImhlYWRlcnMiLCJjb25uZWN0aW9uIiwicmVtb3RlQWRkcmVzcyIsIl9sb2djYXRXZWJzb2NrZXRMaXN0ZW5lciIsImxvZ1JlY29yZCIsInJlYWR5U3RhdGUiLCJPUEVOIiwic2VuZCIsInNldExvZ2NhdExpc3RlbmVyIiwiY29kZSIsInJlYXNvbiIsInJlbW92ZUxvZ2NhdExpc3RlbmVyIiwiaWduIiwiY2xvc2VNc2ciLCJ0b1N0cmluZyIsImFkZFdlYlNvY2tldEhhbmRsZXIiLCJtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCIsInJlbW92ZVdlYlNvY2tldEhhbmRsZXIiLCJnZXRMb2dUeXBlcyIsIm5hdGl2ZUxvZ1R5cGVzIiwiQmFzZURyaXZlciIsInByb3RvdHlwZSIsImNhbGwiLCJpc1dlYkNvbnRleHQiLCJ3ZWJMb2dUeXBlcyIsImNocm9tZWRyaXZlciIsImp3cHJveHkiLCJjb21tYW5kIiwiZ2V0TG9nIiwibG9nVHlwZSIsImtleXMiLCJpbmNsdWRlcyIsInR5cGUiLCJPYmplY3QiLCJhc3NpZ24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvbG9nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFdlYlNvY2tldCBmcm9tICd3cyc7XG5pbXBvcnQgeyBERUZBVUxUX1dTX1BBVEhOQU1FX1BSRUZJWCwgQmFzZURyaXZlciB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5jb25zdCBHRVRfU0VSVkVSX0xPR1NfRkVBVFVSRSA9ICdnZXRfc2VydmVyX2xvZ3MnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IFdFQlNPQ0tFVF9FTkRQT0lOVCA9IChzZXNzaW9uSWQpID0+IGAke0RFRkFVTFRfV1NfUEFUSE5BTUVfUFJFRklYfS9zZXNzaW9uLyR7c2Vzc2lvbklkfS9hcHBpdW0vZGV2aWNlL2xvZ2NhdGA7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9TZWxlbml1bUhRL3NlbGVuaXVtL2Jsb2IvMGQ0MjU2NzZiM2M5ZGYyNjFkZDY0MTkxN2Y4NjdkNGQ1Y2U3Nzc0ZC9qYXZhL2NsaWVudC9zcmMvb3JnL29wZW5xYS9zZWxlbml1bS9sb2dnaW5nL0xvZ0VudHJ5LmphdmFcbmZ1bmN0aW9uIHRvTG9nUmVjb3JkICh0aW1lc3RhbXAsIGxldmVsLCBtZXNzYWdlKSB7XG4gIHJldHVybiB7XG4gICAgdGltZXN0YW1wLFxuICAgIGxldmVsLFxuICAgIG1lc3NhZ2UsXG4gIH07XG59XG5cbmV4dGVuc2lvbnMuc3VwcG9ydGVkTG9nVHlwZXMgPSB7XG4gIGxvZ2NhdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnTG9ncyBmb3IgQW5kcm9pZCBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2UgYW5kIGVtdWxhdG9ycyB2aWEgQURCJyxcbiAgICBnZXR0ZXI6IGFzeW5jIChzZWxmKSA9PiBhd2FpdCBzZWxmLmFkYi5nZXRMb2djYXRMb2dzKCksXG4gIH0sXG4gIGJ1Z3JlcG9ydDoge1xuICAgIGRlc2NyaXB0aW9uOiBgJ2FkYiBidWdyZXBvcnQnIG91dHB1dCBmb3IgYWR2YW5jZWQgaXNzdWVzIGRpYWdub3N0aWNgLFxuICAgIGdldHRlcjogYXN5bmMgKHNlbGYpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHNlbGYuYWRiLmJ1Z3JlcG9ydCgpO1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIHJldHVybiBvdXRwdXQuc3BsaXQob3MuRU9MKVxuICAgICAgICAubWFwKCh4KSA9PiB0b0xvZ1JlY29yZCh0aW1lc3RhbXAsICdBTEwnLCB4KSk7XG4gICAgfSxcbiAgfSxcbiAgc2VydmVyOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcHBpdW0gc2VydmVyIGxvZ3MnLFxuICAgIGdldHRlcjogKHNlbGYpID0+IHtcbiAgICAgIHNlbGYuZW5zdXJlRmVhdHVyZUVuYWJsZWQoR0VUX1NFUlZFUl9MT0dTX0ZFQVRVUkUpO1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIHJldHVybiBsb2cudW53cmFwKCkucmVjb3JkXG4gICAgICAgIC5tYXAoKHgpID0+IHRvTG9nUmVjb3JkKHRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FMTCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uaXNFbXB0eSh4LnByZWZpeCkgPyB4Lm1lc3NhZ2UgOiBgWyR7eC5wcmVmaXh9XSAke3gubWVzc2FnZX1gKVxuICAgICAgICApO1xuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIFN0YXJ0cyBBbmRyb2lkIGxvZ2NhdCBicm9hZGNhc3Qgd2Vic29ja2V0IG9uIHRoZSBzYW1lIGhvc3QgYW5kIHBvcnRcbiAqIHdoZXJlIEFwcGl1bSBzZXJ2ZXIgaXMgcnVubmluZyBhdCBgL3dzL3Nlc3Npb24vOnNlc3Npb25JZDovYXBwaXVtL2xvZ2NhdGAgZW5kcG9pbnQuIFRoZSBtZXRob2RcbiAqIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSB3ZWIgc29ja2V0IGlzIGFscmVhZHkgbGlzdGVuaW5nLlxuICpcbiAqIEVhY2ggY29ubmVjdGVkIHdlYnNvY2tldCBsaXN0ZW5lciB3aWxsIHJlY2VpdmUgbG9nY2F0IGxvZyBsaW5lc1xuICogYXMgc29vbiBhcyB0aGV5IGFyZSB2aXNpYmxlIHRvIEFwcGl1bS5cbiAqL1xuY29tbWFuZHMubW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0ICgpIHtcbiAgY29uc3QgcGF0aG5hbWUgPSBXRUJTT0NLRVRfRU5EUE9JTlQodGhpcy5zZXNzaW9uSWQpO1xuICBpZiAoIV8uaXNFbXB0eShhd2FpdCB0aGlzLnNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycyhwYXRobmFtZSkpKSB7XG4gICAgbG9nLmRlYnVnKGBUaGUgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZWIgc29ja2V0IHNlcnZlciBpcyBhbHJlYWR5IGxpc3RlbmluZyBhdCAke3BhdGhuYW1lfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5pbmZvKGBBc3NpZ25pbmcgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZWIgc29ja2V0IHNlcnZlciB0byAke3BhdGhuYW1lfWApO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2Vic29ja2V0cy93cy9ibG9iL21hc3Rlci9kb2Mvd3MubWRcbiAgY29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldC5TZXJ2ZXIoe1xuICAgIG5vU2VydmVyOiB0cnVlLFxuICB9KTtcbiAgd3NzLm9uKCdjb25uZWN0aW9uJywgKHdzLCByZXEpID0+IHtcbiAgICBpZiAocmVxKSB7XG4gICAgICBjb25zdCByZW1vdGVJcCA9IF8uaXNFbXB0eShyZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ10pXG4gICAgICAgID8gcmVxLmNvbm5lY3Rpb24/LnJlbW90ZUFkZHJlc3NcbiAgICAgICAgOiByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ107XG4gICAgICBsb2cuZGVidWcoYEVzdGFibGlzaGVkIGEgbmV3IGxvZ2NhdCBsaXN0ZW5lciB3ZWIgc29ja2V0IGNvbm5lY3Rpb24gZnJvbSAke3JlbW90ZUlwfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoJ0VzdGFibGlzaGVkIGEgbmV3IGxvZ2NhdCBsaXN0ZW5lciB3ZWIgc29ja2V0IGNvbm5lY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyKSkge1xuICAgICAgdGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIgPSAobG9nUmVjb3JkKSA9PiB7XG4gICAgICAgIGlmICh3cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICB3cy5zZW5kKGxvZ1JlY29yZC5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5hZGIuc2V0TG9nY2F0TGlzdGVuZXIodGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIpO1xuXG4gICAgd3Mub24oJ2Nsb3NlJywgKGNvZGUsIHJlYXNvbikgPT4ge1xuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5hZGIucmVtb3ZlTG9nY2F0TGlzdGVuZXIodGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIpO1xuICAgICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICAgIHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbGV0IGNsb3NlTXNnID0gJ0xvZ2NhdCBsaXN0ZW5lciB3ZWIgc29ja2V0IGlzIGNsb3NlZC4nO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoY29kZSkpIHtcbiAgICAgICAgY2xvc2VNc2cgKz0gYCBDb2RlOiAke2NvZGV9LmA7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNFbXB0eShyZWFzb24pKSB7XG4gICAgICAgIGNsb3NlTXNnICs9IGAgUmVhc29uOiAke3JlYXNvbi50b1N0cmluZygpfS5gO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGNsb3NlTXNnKTtcbiAgICB9KTtcbiAgfSk7XG4gIGF3YWl0IHRoaXMuc2VydmVyLmFkZFdlYlNvY2tldEhhbmRsZXIocGF0aG5hbWUsIHdzcyk7XG59O1xuXG4vKipcbiAqIFN0b3BzIHRoZSBwcmV2aW91c2x5IHN0YXJ0ZWQgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZXNvY2tldCBzZXJ2ZXIuXG4gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSBpZiBubyBzZXJ2ZXIgaXMgcnVubmluZy5cbiAqL1xuY29tbWFuZHMubW9iaWxlU3RvcExvZ3NCcm9hZGNhc3QgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCAoKSB7XG4gIGNvbnN0IHBhdGhuYW1lID0gV0VCU09DS0VUX0VORFBPSU5UKHRoaXMuc2Vzc2lvbklkKTtcbiAgaWYgKF8uaXNFbXB0eShhd2FpdCB0aGlzLnNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycyhwYXRobmFtZSkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nLmRlYnVnKCdTdG9wcGluZyB0aGUgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZWIgc29ja2V0IHNlcnZlcicpO1xuICBhd2FpdCB0aGlzLnNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbn07XG5cbmNvbW1hbmRzLmdldExvZ1R5cGVzID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9nVHlwZXMgKCkge1xuICBjb25zdCBuYXRpdmVMb2dUeXBlcyA9IGF3YWl0IEJhc2VEcml2ZXIucHJvdG90eXBlLmdldExvZ1R5cGVzLmNhbGwodGhpcyk7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgY29uc3Qgd2ViTG9nVHlwZXMgPSBhd2FpdCB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQoJy9sb2cvdHlwZXMnLCAnR0VUJyk7XG4gICAgcmV0dXJuIFsuLi5uYXRpdmVMb2dUeXBlcywgLi4ud2ViTG9nVHlwZXNdO1xuICB9XG4gIHJldHVybiBuYXRpdmVMb2dUeXBlcztcbn07XG5cbmNvbW1hbmRzLmdldExvZyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvZyAobG9nVHlwZSkge1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSAmJiAhXy5rZXlzKHRoaXMuc3VwcG9ydGVkTG9nVHlwZXMpLmluY2x1ZGVzKGxvZ1R5cGUpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZCgnL2xvZycsICdQT1NUJywge3R5cGU6IGxvZ1R5cGV9KTtcbiAgfVxuICByZXR1cm4gYXdhaXQgQmFzZURyaXZlci5wcm90b3R5cGUuZ2V0TG9nLmNhbGwodGhpcywgbG9nVHlwZSk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLHVCQUF1QixHQUFHLGlCQUFoQztBQUVBLElBQUlDLFFBQVEsR0FBRyxFQUFmO0FBQUEsSUFBbUJDLE9BQU8sR0FBRyxFQUE3QjtBQUFBLElBQWlDQyxVQUFVLEdBQUcsRUFBOUM7Ozs7QUFFQSxNQUFN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
125
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJHRVRfU0VSVkVSX0xPR1NfRkVBVFVSRSIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJXRUJTT0NLRVRfRU5EUE9JTlQiLCJzZXNzaW9uSWQiLCJERUZBVUxUX1dTX1BBVEhOQU1FX1BSRUZJWCIsInRvTG9nUmVjb3JkIiwidGltZXN0YW1wIiwibGV2ZWwiLCJtZXNzYWdlIiwic3VwcG9ydGVkTG9nVHlwZXMiLCJsb2djYXQiLCJkZXNjcmlwdGlvbiIsImdldHRlciIsInNlbGYiLCJhZGIiLCJnZXRMb2djYXRMb2dzIiwiYnVncmVwb3J0Iiwib3V0cHV0IiwiRGF0ZSIsIm5vdyIsInNwbGl0Iiwib3MiLCJFT0wiLCJtYXAiLCJ4Iiwic2VydmVyIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJsb2ciLCJ1bndyYXAiLCJyZWNvcmQiLCJfIiwiaXNFbXB0eSIsInByZWZpeCIsIm1vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCIsInBhdGhuYW1lIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJkZWJ1ZyIsImluZm8iLCJ3c3MiLCJXZWJTb2NrZXQiLCJTZXJ2ZXIiLCJub1NlcnZlciIsIm9uIiwid3MiLCJyZXEiLCJyZW1vdGVJcCIsImhlYWRlcnMiLCJjb25uZWN0aW9uIiwicmVtb3RlQWRkcmVzcyIsIl9sb2djYXRXZWJzb2NrZXRMaXN0ZW5lciIsImxvZ1JlY29yZCIsInJlYWR5U3RhdGUiLCJPUEVOIiwic2VuZCIsInNldExvZ2NhdExpc3RlbmVyIiwiY29kZSIsInJlYXNvbiIsInJlbW92ZUxvZ2NhdExpc3RlbmVyIiwiaWduIiwiY2xvc2VNc2ciLCJ0b1N0cmluZyIsImFkZFdlYlNvY2tldEhhbmRsZXIiLCJtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCIsInJlbW92ZVdlYlNvY2tldEhhbmRsZXIiLCJnZXRMb2dUeXBlcyIsIm5hdGl2ZUxvZ1R5cGVzIiwiQmFzZURyaXZlciIsInByb3RvdHlwZSIsImNhbGwiLCJpc1dlYkNvbnRleHQiLCJ3ZWJMb2dUeXBlcyIsImNocm9tZWRyaXZlciIsImp3cHJveHkiLCJjb21tYW5kIiwiZ2V0TG9nIiwibG9nVHlwZSIsImtleXMiLCJpbmNsdWRlcyIsInR5cGUiLCJPYmplY3QiLCJhc3NpZ24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvbG9nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFdlYlNvY2tldCBmcm9tICd3cyc7XG5pbXBvcnQgeyBERUZBVUxUX1dTX1BBVEhOQU1FX1BSRUZJWCwgQmFzZURyaXZlciB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5jb25zdCBHRVRfU0VSVkVSX0xPR1NfRkVBVFVSRSA9ICdnZXRfc2VydmVyX2xvZ3MnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IFdFQlNPQ0tFVF9FTkRQT0lOVCA9IChzZXNzaW9uSWQpID0+IGAke0RFRkFVTFRfV1NfUEFUSE5BTUVfUFJFRklYfS9zZXNzaW9uLyR7c2Vzc2lvbklkfS9hcHBpdW0vZGV2aWNlL2xvZ2NhdGA7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9TZWxlbml1bUhRL3NlbGVuaXVtL2Jsb2IvMGQ0MjU2NzZiM2M5ZGYyNjFkZDY0MTkxN2Y4NjdkNGQ1Y2U3Nzc0ZC9qYXZhL2NsaWVudC9zcmMvb3JnL29wZW5xYS9zZWxlbml1bS9sb2dnaW5nL0xvZ0VudHJ5LmphdmFcbmZ1bmN0aW9uIHRvTG9nUmVjb3JkICh0aW1lc3RhbXAsIGxldmVsLCBtZXNzYWdlKSB7XG4gIHJldHVybiB7XG4gICAgdGltZXN0YW1wLFxuICAgIGxldmVsLFxuICAgIG1lc3NhZ2UsXG4gIH07XG59XG5cbmV4dGVuc2lvbnMuc3VwcG9ydGVkTG9nVHlwZXMgPSB7XG4gIGxvZ2NhdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnTG9ncyBmb3IgQW5kcm9pZCBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2UgYW5kIGVtdWxhdG9ycyB2aWEgQURCJyxcbiAgICBnZXR0ZXI6IGFzeW5jIChzZWxmKSA9PiBhd2FpdCBzZWxmLmFkYi5nZXRMb2djYXRMb2dzKCksXG4gIH0sXG4gIGJ1Z3JlcG9ydDoge1xuICAgIGRlc2NyaXB0aW9uOiBgJ2FkYiBidWdyZXBvcnQnIG91dHB1dCBmb3IgYWR2YW5jZWQgaXNzdWVzIGRpYWdub3N0aWNgLFxuICAgIGdldHRlcjogYXN5bmMgKHNlbGYpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHNlbGYuYWRiLmJ1Z3JlcG9ydCgpO1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIHJldHVybiBvdXRwdXQuc3BsaXQob3MuRU9MKVxuICAgICAgICAubWFwKCh4KSA9PiB0b0xvZ1JlY29yZCh0aW1lc3RhbXAsICdBTEwnLCB4KSk7XG4gICAgfSxcbiAgfSxcbiAgc2VydmVyOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcHBpdW0gc2VydmVyIGxvZ3MnLFxuICAgIGdldHRlcjogKHNlbGYpID0+IHtcbiAgICAgIHNlbGYuZW5zdXJlRmVhdHVyZUVuYWJsZWQoR0VUX1NFUlZFUl9MT0dTX0ZFQVRVUkUpO1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIHJldHVybiBsb2cudW53cmFwKCkucmVjb3JkXG4gICAgICAgIC5tYXAoKHgpID0+IHRvTG9nUmVjb3JkKHRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FMTCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uaXNFbXB0eSh4LnByZWZpeCkgPyB4Lm1lc3NhZ2UgOiBgWyR7eC5wcmVmaXh9XSAke3gubWVzc2FnZX1gKVxuICAgICAgICApO1xuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIFN0YXJ0cyBBbmRyb2lkIGxvZ2NhdCBicm9hZGNhc3Qgd2Vic29ja2V0IG9uIHRoZSBzYW1lIGhvc3QgYW5kIHBvcnRcbiAqIHdoZXJlIEFwcGl1bSBzZXJ2ZXIgaXMgcnVubmluZyBhdCBgL3dzL3Nlc3Npb24vOnNlc3Npb25JZDovYXBwaXVtL2xvZ2NhdGAgZW5kcG9pbnQuIFRoZSBtZXRob2RcbiAqIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSB3ZWIgc29ja2V0IGlzIGFscmVhZHkgbGlzdGVuaW5nLlxuICpcbiAqIEVhY2ggY29ubmVjdGVkIHdlYnNvY2tldCBsaXN0ZW5lciB3aWxsIHJlY2VpdmUgbG9nY2F0IGxvZyBsaW5lc1xuICogYXMgc29vbiBhcyB0aGV5IGFyZSB2aXNpYmxlIHRvIEFwcGl1bS5cbiAqL1xuY29tbWFuZHMubW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0ICgpIHtcbiAgY29uc3QgcGF0aG5hbWUgPSBXRUJTT0NLRVRfRU5EUE9JTlQodGhpcy5zZXNzaW9uSWQpO1xuICBpZiAoIV8uaXNFbXB0eShhd2FpdCB0aGlzLnNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycyhwYXRobmFtZSkpKSB7XG4gICAgbG9nLmRlYnVnKGBUaGUgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZWIgc29ja2V0IHNlcnZlciBpcyBhbHJlYWR5IGxpc3RlbmluZyBhdCAke3BhdGhuYW1lfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5pbmZvKGBBc3NpZ25pbmcgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZWIgc29ja2V0IHNlcnZlciB0byAke3BhdGhuYW1lfWApO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2Vic29ja2V0cy93cy9ibG9iL21hc3Rlci9kb2Mvd3MubWRcbiAgY29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldC5TZXJ2ZXIoe1xuICAgIG5vU2VydmVyOiB0cnVlLFxuICB9KTtcbiAgd3NzLm9uKCdjb25uZWN0aW9uJywgKHdzLCByZXEpID0+IHtcbiAgICBpZiAocmVxKSB7XG4gICAgICBjb25zdCByZW1vdGVJcCA9IF8uaXNFbXB0eShyZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ10pXG4gICAgICAgID8gcmVxLmNvbm5lY3Rpb24/LnJlbW90ZUFkZHJlc3NcbiAgICAgICAgOiByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ107XG4gICAgICBsb2cuZGVidWcoYEVzdGFibGlzaGVkIGEgbmV3IGxvZ2NhdCBsaXN0ZW5lciB3ZWIgc29ja2V0IGNvbm5lY3Rpb24gZnJvbSAke3JlbW90ZUlwfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoJ0VzdGFibGlzaGVkIGEgbmV3IGxvZ2NhdCBsaXN0ZW5lciB3ZWIgc29ja2V0IGNvbm5lY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyKSkge1xuICAgICAgdGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIgPSAobG9nUmVjb3JkKSA9PiB7XG4gICAgICAgIGlmICh3cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICB3cy5zZW5kKGxvZ1JlY29yZC5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5hZGIuc2V0TG9nY2F0TGlzdGVuZXIodGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIpO1xuXG4gICAgd3Mub24oJ2Nsb3NlJywgKGNvZGUsIHJlYXNvbikgPT4ge1xuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5hZGIucmVtb3ZlTG9nY2F0TGlzdGVuZXIodGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIpO1xuICAgICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICAgIHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbGV0IGNsb3NlTXNnID0gJ0xvZ2NhdCBsaXN0ZW5lciB3ZWIgc29ja2V0IGlzIGNsb3NlZC4nO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoY29kZSkpIHtcbiAgICAgICAgY2xvc2VNc2cgKz0gYCBDb2RlOiAke2NvZGV9LmA7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNFbXB0eShyZWFzb24pKSB7XG4gICAgICAgIGNsb3NlTXNnICs9IGAgUmVhc29uOiAke3JlYXNvbi50b1N0cmluZygpfS5gO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGNsb3NlTXNnKTtcbiAgICB9KTtcbiAgfSk7XG4gIGF3YWl0IHRoaXMuc2VydmVyLmFkZFdlYlNvY2tldEhhbmRsZXIocGF0aG5hbWUsIHdzcyk7XG59O1xuXG4vKipcbiAqIFN0b3BzIHRoZSBwcmV2aW91c2x5IHN0YXJ0ZWQgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZXNvY2tldCBzZXJ2ZXIuXG4gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSBpZiBubyBzZXJ2ZXIgaXMgcnVubmluZy5cbiAqL1xuY29tbWFuZHMubW9iaWxlU3RvcExvZ3NCcm9hZGNhc3QgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCAoKSB7XG4gIGNvbnN0IHBhdGhuYW1lID0gV0VCU09DS0VUX0VORFBPSU5UKHRoaXMuc2Vzc2lvbklkKTtcbiAgaWYgKF8uaXNFbXB0eShhd2FpdCB0aGlzLnNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycyhwYXRobmFtZSkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nLmRlYnVnKCdTdG9wcGluZyB0aGUgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZWIgc29ja2V0IHNlcnZlcicpO1xuICBhd2FpdCB0aGlzLnNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbn07XG5cbmNvbW1hbmRzLmdldExvZ1R5cGVzID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9nVHlwZXMgKCkge1xuICBjb25zdCBuYXRpdmVMb2dUeXBlcyA9IGF3YWl0IEJhc2VEcml2ZXIucHJvdG90eXBlLmdldExvZ1R5cGVzLmNhbGwodGhpcyk7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgY29uc3Qgd2ViTG9nVHlwZXMgPSBhd2FpdCB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQoJy9sb2cvdHlwZXMnLCAnR0VUJyk7XG4gICAgcmV0dXJuIFsuLi5uYXRpdmVMb2dUeXBlcywgLi4ud2ViTG9nVHlwZXNdO1xuICB9XG4gIHJldHVybiBuYXRpdmVMb2dUeXBlcztcbn07XG5cbmNvbW1hbmRzLmdldExvZyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvZyAobG9nVHlwZSkge1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSAmJiAhXy5rZXlzKHRoaXMuc3VwcG9ydGVkTG9nVHlwZXMpLmluY2x1ZGVzKGxvZ1R5cGUpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZCgnL2xvZycsICdQT1NUJywge3R5cGU6IGxvZ1R5cGV9KTtcbiAgfVxuICByZXR1cm4gYXdhaXQgQmFzZURyaXZlci5wcm90b3R5cGUuZ2V0TG9nLmNhbGwodGhpcywgbG9nVHlwZSk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSx1QkFBdUIsR0FBRyxpQkFBaUI7QUFFakQsSUFBSUMsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFBQztBQUFBO0FBRWpELE1BQU1DLGtCQUFrQixHQUFJQyxTQUFTLElBQU0sR0FBRUMsa0NBQTJCLFlBQVdELFNBQVUsdUJBQXNCOztBQUduSCxTQUFTRSxXQUFXLENBQUVDLFNBQVMsRUFBRUMsS0FBSyxFQUFFQyxPQUFPLEVBQUU7RUFDL0MsT0FBTztJQUNMRixTQUFTO0lBQ1RDLEtBQUs7SUFDTEM7RUFDRixDQUFDO0FBQ0g7QUFFQVAsVUFBVSxDQUFDUSxpQkFBaUIsR0FBRztFQUM3QkMsTUFBTSxFQUFFO0lBQ05DLFdBQVcsRUFBRSxvRUFBb0U7SUFDakZDLE1BQU0sRUFBRSxNQUFPQyxJQUFJLElBQUssTUFBTUEsSUFBSSxDQUFDQyxHQUFHLENBQUNDLGFBQWE7RUFDdEQsQ0FBQztFQUNEQyxTQUFTLEVBQUU7SUFDVEwsV0FBVyxFQUFHLHVEQUFzRDtJQUNwRUMsTUFBTSxFQUFFLE1BQU9DLElBQUksSUFBSztNQUN0QixNQUFNSSxNQUFNLEdBQUcsTUFBTUosSUFBSSxDQUFDQyxHQUFHLENBQUNFLFNBQVMsRUFBRTtNQUN6QyxNQUFNVixTQUFTLEdBQUdZLElBQUksQ0FBQ0MsR0FBRyxFQUFFO01BQzVCLE9BQU9GLE1BQU0sQ0FBQ0csS0FBSyxDQUFDQyxXQUFFLENBQUNDLEdBQUcsQ0FBQyxDQUN4QkMsR0FBRyxDQUFFQyxDQUFDLElBQUtuQixXQUFXLENBQUNDLFNBQVMsRUFBRSxLQUFLLEVBQUVrQixDQUFDLENBQUMsQ0FBQztJQUNqRDtFQUNGLENBQUM7RUFDREMsTUFBTSxFQUFFO0lBQ05kLFdBQVcsRUFBRSxvQkFBb0I7SUFDakNDLE1BQU0sRUFBR0MsSUFBSSxJQUFLO01BQ2hCQSxJQUFJLENBQUNhLG9CQUFvQixDQUFDNUIsdUJBQXVCLENBQUM7TUFDbEQsTUFBTVEsU0FBUyxHQUFHWSxJQUFJLENBQUNDLEdBQUcsRUFBRTtNQUM1QixPQUFPUSxlQUFHLENBQUNDLE1BQU0sRUFBRSxDQUFDQyxNQUFNLENBQ3ZCTixHQUFHLENBQUVDLENBQUMsSUFBS25CLFdBQVcsQ0FBQ0MsU0FBUyxFQUNULEtBQUssRUFDTHdCLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDUCxDQUFDLENBQUNRLE1BQU0sQ0FBQyxHQUFHUixDQUFDLENBQUNoQixPQUFPLEdBQUksSUFBR2dCLENBQUMsQ0FBQ1EsTUFBTyxLQUFJUixDQUFDLENBQUNoQixPQUFRLEVBQUMsQ0FBQyxDQUN0RjtJQUNMO0VBQ0Y7QUFDRixDQUFDOztBQVVEVCxRQUFRLENBQUNrQyx3QkFBd0IsR0FBRyxlQUFlQSx3QkFBd0IsR0FBSTtFQUM3RSxNQUFNQyxRQUFRLEdBQUdoQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUNDLFNBQVMsQ0FBQztFQUNuRCxJQUFJLENBQUMyQixlQUFDLENBQUNDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQ04sTUFBTSxDQUFDVSxvQkFBb0IsQ0FBQ0QsUUFBUSxDQUFDLENBQUMsRUFBRTtJQUNoRVAsZUFBRyxDQUFDUyxLQUFLLENBQUUscUVBQW9FRixRQUFTLEVBQUMsQ0FBQztJQUMxRjtFQUNGO0VBRUFQLGVBQUcsQ0FBQ1UsSUFBSSxDQUFFLHNEQUFxREgsUUFBUyxFQUFDLENBQUM7RUFFMUUsTUFBTUksR0FBRyxHQUFHLElBQUlDLFdBQVMsQ0FBQ0MsTUFBTSxDQUFDO0lBQy9CQyxRQUFRLEVBQUU7RUFDWixDQUFDLENBQUM7RUFDRkgsR0FBRyxDQUFDSSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUNDLEVBQUUsRUFBRUMsR0FBRyxLQUFLO0lBQ2hDLElBQUlBLEdBQUcsRUFBRTtNQUFBO01BQ1AsTUFBTUMsUUFBUSxHQUFHZixlQUFDLENBQUNDLE9BQU8sQ0FBQ2EsR0FBRyxDQUFDRSxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxzQkFDdERGLEdBQUcsQ0FBQ0csVUFBVSxvREFBZCxnQkFBZ0JDLGFBQWEsR0FDN0JKLEdBQUcsQ0FBQ0UsT0FBTyxDQUFDLGlCQUFpQixDQUFDO01BQ2xDbkIsZUFBRyxDQUFDUyxLQUFLLENBQUUsZ0VBQStEUyxRQUFTLEVBQUMsQ0FBQztJQUN2RixDQUFDLE1BQU07TUFDTGxCLGVBQUcsQ0FBQ1MsS0FBSyxDQUFDLHlEQUF5RCxDQUFDO0lBQ3RFO0lBRUEsSUFBSU4sZUFBQyxDQUFDQyxPQUFPLENBQUMsSUFBSSxDQUFDa0Isd0JBQXdCLENBQUMsRUFBRTtNQUM1QyxJQUFJLENBQUNBLHdCQUF3QixHQUFJQyxTQUFTLElBQUs7UUFDN0MsSUFBSSxDQUFBUCxFQUFFLGFBQUZBLEVBQUUsdUJBQUZBLEVBQUUsQ0FBRVEsVUFBVSxNQUFLWixXQUFTLENBQUNhLElBQUksRUFBRTtVQUNyQ1QsRUFBRSxDQUFDVSxJQUFJLENBQUNILFNBQVMsQ0FBQzFDLE9BQU8sQ0FBQztRQUM1QjtNQUNGLENBQUM7SUFDSDtJQUNBLElBQUksQ0FBQ00sR0FBRyxDQUFDd0MsaUJBQWlCLENBQUMsSUFBSSxDQUFDTCx3QkFBd0IsQ0FBQztJQUV6RE4sRUFBRSxDQUFDRCxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUNhLElBQUksRUFBRUMsTUFBTSxLQUFLO01BQy9CLElBQUksQ0FBQzFCLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDLElBQUksQ0FBQ2tCLHdCQUF3QixDQUFDLEVBQUU7UUFDN0MsSUFBSTtVQUNGLElBQUksQ0FBQ25DLEdBQUcsQ0FBQzJDLG9CQUFvQixDQUFDLElBQUksQ0FBQ1Isd0JBQXdCLENBQUM7UUFDOUQsQ0FBQyxDQUFDLE9BQU9TLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDVCx3QkFBd0IsR0FBRyxJQUFJO01BQ3RDO01BRUEsSUFBSVUsUUFBUSxHQUFHLHVDQUF1QztNQUN0RCxJQUFJLENBQUM3QixlQUFDLENBQUNDLE9BQU8sQ0FBQ3dCLElBQUksQ0FBQyxFQUFFO1FBQ3BCSSxRQUFRLElBQUssVUFBU0osSUFBSyxHQUFFO01BQy9CO01BQ0EsSUFBSSxDQUFDekIsZUFBQyxDQUFDQyxPQUFPLENBQUN5QixNQUFNLENBQUMsRUFBRTtRQUN0QkcsUUFBUSxJQUFLLFlBQVdILE1BQU0sQ0FBQ0ksUUFBUSxFQUFHLEdBQUU7TUFDOUM7TUFDQWpDLGVBQUcsQ0FBQ1MsS0FBSyxDQUFDdUIsUUFBUSxDQUFDO0lBQ3JCLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUNGLE1BQU0sSUFBSSxDQUFDbEMsTUFBTSxDQUFDb0MsbUJBQW1CLENBQUMzQixRQUFRLEVBQUVJLEdBQUcsQ0FBQztBQUN0RCxDQUFDOztBQU1EdkMsUUFBUSxDQUFDK0QsdUJBQXVCLEdBQUcsZUFBZUEsdUJBQXVCLEdBQUk7RUFDM0UsTUFBTTVCLFFBQVEsR0FBR2hDLGtCQUFrQixDQUFDLElBQUksQ0FBQ0MsU0FBUyxDQUFDO0VBQ25ELElBQUkyQixlQUFDLENBQUNDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQ04sTUFBTSxDQUFDVSxvQkFBb0IsQ0FBQ0QsUUFBUSxDQUFDLENBQUMsRUFBRTtJQUMvRDtFQUNGO0VBRUFQLGVBQUcsQ0FBQ1MsS0FBSyxDQUFDLG9EQUFvRCxDQUFDO0VBQy9ELE1BQU0sSUFBSSxDQUFDWCxNQUFNLENBQUNzQyxzQkFBc0IsQ0FBQzdCLFFBQVEsQ0FBQztBQUNwRCxDQUFDO0FBRURuQyxRQUFRLENBQUNpRSxXQUFXLEdBQUcsZUFBZUEsV0FBVyxHQUFJO0VBQ25ELE1BQU1DLGNBQWMsR0FBRyxNQUFNQyxrQkFBVSxDQUFDQyxTQUFTLENBQUNILFdBQVcsQ0FBQ0ksSUFBSSxDQUFDLElBQUksQ0FBQztFQUN4RSxJQUFJLElBQUksQ0FBQ0MsWUFBWSxFQUFFLEVBQUU7SUFDdkIsTUFBTUMsV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDQyxZQUFZLENBQUNDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUM7SUFDaEYsT0FBTyxDQUFDLEdBQUdSLGNBQWMsRUFBRSxHQUFHSyxXQUFXLENBQUM7RUFDNUM7RUFDQSxPQUFPTCxjQUFjO0FBQ3ZCLENBQUM7QUFFRGxFLFFBQVEsQ0FBQzJFLE1BQU0sR0FBRyxlQUFlQSxNQUFNLENBQUVDLE9BQU8sRUFBRTtFQUNoRCxJQUFJLElBQUksQ0FBQ04sWUFBWSxFQUFFLElBQUksQ0FBQ3ZDLGVBQUMsQ0FBQzhDLElBQUksQ0FBQyxJQUFJLENBQUNuRSxpQkFBaUIsQ0FBQyxDQUFDb0UsUUFBUSxDQUFDRixPQUFPLENBQUMsRUFBRTtJQUM1RSxPQUFPLE1BQU0sSUFBSSxDQUFDSixZQUFZLENBQUNDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUU7TUFBQ0ssSUFBSSxFQUFFSDtJQUFPLENBQUMsQ0FBQztFQUNqRjtFQUNBLE9BQU8sTUFBTVQsa0JBQVUsQ0FBQ0MsU0FBUyxDQUFDTyxNQUFNLENBQUNOLElBQUksQ0FBQyxJQUFJLEVBQUVPLE9BQU8sQ0FBQztBQUM5RCxDQUFDO0FBRURJLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDL0UsVUFBVSxFQUFFRixRQUFRLEVBQUVDLE9BQU8sQ0FBQztBQUFDLGVBRTlCQyxVQUFVO0FBQUEifQ==