appium-android-driver 4.48.1 → 4.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -29,103 +29,77 @@ const FINGERPRINT_UNLOCK = 'fingerprint';
29
29
  exports.FINGERPRINT_UNLOCK = FINGERPRINT_UNLOCK;
30
30
  const UNLOCK_TYPES = [PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, PASSWORD_UNLOCK, PATTERN_UNLOCK, FINGERPRINT_UNLOCK];
31
31
  const KEYCODE_NUMPAD_ENTER = 66;
32
- const KEYCODE_POWER = 26;
33
- const KEYCODE_WAKEUP = 224;
34
32
  const UNLOCK_WAIT_TIME = 100;
35
- const HIDE_KEYBOARD_WAIT_TIME = 100;
36
33
  const INPUT_KEYS_WAIT_TIME = 100;
37
34
  const NUMBER_ZERO_KEYCODE = 7;
38
- let helpers = {};
35
+ const helpers = {};
39
36
  exports.helpers = helpers;
40
37
 
41
- helpers.isValidUnlockType = function isValidUnlockType(type) {
42
- return UNLOCK_TYPES.includes(type);
43
- };
44
-
45
- helpers.isValidKey = function isValidKey(type, key) {
46
- if (_lodash.default.isUndefined(key)) {
47
- return false;
48
- }
38
+ helpers.validateUnlockCapabilities = function validateUnlockCapabilities(caps = {}) {
39
+ const {
40
+ unlockKey,
41
+ unlockType
42
+ } = caps;
49
43
 
50
- if ([PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, FINGERPRINT_UNLOCK].includes(type)) {
51
- return /^[0-9]+$/.test(key.trim());
44
+ if (_lodash.default.isNil(unlockKey) || unlockKey === '') {
45
+ throw new Error('A non-empty unlock key value must be provided');
52
46
  }
53
47
 
54
- if (type === PATTERN_UNLOCK) {
55
- if (!/^[1-9]{2,9}$/.test(key.trim())) {
56
- return false;
48
+ if ([PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, FINGERPRINT_UNLOCK].includes(unlockType)) {
49
+ if (!/^[0-9]+$/.test(_lodash.default.trim(unlockKey))) {
50
+ throw new Error(`Unlock key value '${unlockKey}' must only consist of digits`);
51
+ }
52
+ } else if (unlockType === PATTERN_UNLOCK) {
53
+ if (!/^[1-9]{2,9}$/.test(_lodash.default.trim(unlockKey))) {
54
+ throw new Error(`Unlock key value '${unlockKey}' must only include from two to nine digits in range 1..9`);
57
55
  }
58
56
 
59
- return !/([1-9]).*?\1/.test(key.trim());
60
- }
61
-
62
- if (type === PASSWORD_UNLOCK) {
63
- return /.{4,}/g.test(key);
57
+ if (/([1-9]).*?\1/.test(_lodash.default.trim(unlockKey))) {
58
+ throw new Error(`Unlock key value '${unlockKey}' must define a valid pattern where repeats are not allowed`);
59
+ }
60
+ } else if (unlockType === PASSWORD_UNLOCK) {
61
+ if (!/.{4,}/g.test(unlockKey)) {
62
+ throw new Error(`The minimum allowed length of unlock key value '${unlockKey}' is 4 characters`);
63
+ }
64
+ } else {
65
+ throw new Error(`Invalid unlock type '${unlockType}'. ` + `Only the following unlock types are supported: ${UNLOCK_TYPES}`);
64
66
  }
65
67
 
66
- throw new Error(`Invalid unlock type ${type}`);
68
+ return caps;
67
69
  };
68
70
 
69
- helpers.dismissKeyguard = async function dismissKeyguard(driver, adb) {
70
- _logger.default.info('Waking up the device to unlock it');
71
-
72
- await driver.pressKeyCode(KEYCODE_POWER);
73
- await driver.pressKeyCode(KEYCODE_WAKEUP);
74
- let isKeyboardShown = await driver.isKeyboardShown();
75
-
76
- if (isKeyboardShown) {
77
- await driver.hideKeyboard();
78
- await (0, _asyncbox.sleep)(HIDE_KEYBOARD_WAIT_TIME);
79
- }
80
-
81
- _logger.default.info('Dismiss notifications from unlock view');
71
+ helpers.fastUnlock = async function fastUnlock(adb, opts = {}) {
72
+ const {
73
+ credential,
74
+ credentialType
75
+ } = opts;
82
76
 
83
- await adb.shell(['service', 'call', 'notification', '1']);
84
- await adb.back();
77
+ _logger.default.info(`Unlocking the device via ADB using ${credentialType} credential '${credential}'`);
85
78
 
86
- if ((await adb.getApiLevel()) > 21) {
87
- _logger.default.info('Trying to dismiss keyguard');
79
+ const wasLockEnabled = await adb.isLockEnabled();
88
80
 
89
- await adb.shell(['wm', 'dismiss-keyguard']);
90
- return;
81
+ if (wasLockEnabled) {
82
+ await adb.clearLockCredential(credential);
83
+ await adb.cycleWakeUp();
84
+ } else {
85
+ _logger.default.info('No active lock has been detected. Proceeding to the keyguard dismissal');
91
86
  }
92
87
 
93
- _logger.default.info('Swiping up to dismiss keyguard');
94
-
95
- await helpers.swipeUp(driver);
96
- };
97
-
98
- helpers.swipeUp = async function swipeUp(driver) {
99
- let windowSize = await driver.getWindowSize();
100
- let x0 = parseInt(windowSize.x / 2, 10);
101
- let y0 = windowSize.y - 10;
102
- let yP = 100;
103
- let actions = [{
104
- action: 'press',
105
- options: {
106
- element: null,
107
- x: x0,
108
- y: y0
109
- }
110
- }, {
111
- action: 'moveTo',
112
- options: {
113
- element: null,
114
- x: x0,
115
- y: yP
88
+ try {
89
+ await adb.dismissKeyguard();
90
+ } finally {
91
+ if (wasLockEnabled) {
92
+ await adb.setLockCredential(credentialType, credential);
116
93
  }
117
- }, {
118
- action: 'release'
119
- }];
120
- await driver.performTouch(actions);
94
+ }
121
95
  };
122
96
 
123
97
  helpers.encodePassword = function encodePassword(key) {
124
- return key.replace(/\s/ig, '%s');
98
+ return `${key}`.replace(/\s/ig, '%s');
125
99
  };
126
100
 
127
101
  helpers.stringKeyToArr = function stringKeyToArr(key) {
128
- return key.trim().replace(/\s+/g, '').split(/\s*/);
102
+ return `${key}`.trim().replace(/\s+/g, '').split(/\s*/);
129
103
  };
130
104
 
131
105
  helpers.fingerprintUnlock = async function fingerprintUnlock(adb, driver, capabilities) {
@@ -140,30 +114,30 @@ helpers.fingerprintUnlock = async function fingerprintUnlock(adb, driver, capabi
140
114
  helpers.pinUnlock = async function pinUnlock(adb, driver, capabilities) {
141
115
  _logger.default.info(`Trying to unlock device using pin ${capabilities.unlockKey}`);
142
116
 
143
- await helpers.dismissKeyguard(driver, adb);
144
- let keys = helpers.stringKeyToArr(capabilities.unlockKey);
117
+ await adb.dismissKeyguard();
118
+ const keys = helpers.stringKeyToArr(capabilities.unlockKey);
145
119
 
146
120
  if ((await adb.getApiLevel()) >= 21) {
147
- let els = await driver.findElOrEls('id', 'com.android.systemui:id/digit_text', true);
121
+ const els = await driver.findElOrEls('id', 'com.android.systemui:id/digit_text', true);
148
122
 
149
123
  if (_lodash.default.isEmpty(els)) {
150
124
  return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);
151
125
  }
152
126
 
153
- let pins = {};
127
+ const pins = {};
154
128
 
155
- for (let el of els) {
156
- let text = await driver.getAttribute('text', _appiumSupport.util.unwrapElement(el));
129
+ for (const el of els) {
130
+ const text = await driver.getAttribute('text', _appiumSupport.util.unwrapElement(el));
157
131
  pins[text] = el;
158
132
  }
159
133
 
160
- for (let pin of keys) {
161
- let el = pins[pin];
134
+ for (const pin of keys) {
135
+ const el = pins[pin];
162
136
  await driver.click(_appiumSupport.util.unwrapElement(el));
163
137
  }
164
138
  } else {
165
- for (let pin of keys) {
166
- let el = await driver.findElOrEls('id', `com.android.keyguard:id/key${pin}`, false);
139
+ for (const pin of keys) {
140
+ const el = await driver.findElOrEls('id', `com.android.keyguard:id/key${pin}`, false);
167
141
 
168
142
  if (el === null) {
169
143
  return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);
@@ -173,24 +147,24 @@ helpers.pinUnlock = async function pinUnlock(adb, driver, capabilities) {
173
147
  }
174
148
  }
175
149
 
176
- await waitForUnlock(adb, driver);
150
+ await waitForUnlock(adb);
177
151
  };
178
152
 
179
- async function waitForUnlock(adb, driver) {
153
+ async function waitForUnlock(adb) {
180
154
  await (0, _asyncbox.sleep)(UNLOCK_WAIT_TIME);
181
155
 
182
156
  if (!(await adb.isScreenLocked())) {
183
157
  return;
184
158
  }
185
159
 
186
- await driver.pressKeyCode(KEYCODE_NUMPAD_ENTER);
160
+ await adb.keyevent(KEYCODE_NUMPAD_ENTER);
187
161
  await (0, _asyncbox.sleep)(UNLOCK_WAIT_TIME);
188
162
  }
189
163
 
190
164
  helpers.pinUnlockWithKeyEvent = async function pinUnlockWithKeyEvent(adb, driver, capabilities) {
191
165
  _logger.default.info(`Trying to unlock device using pin with keycode ${capabilities.unlockKey}`);
192
166
 
193
- await helpers.dismissKeyguard(driver, adb);
167
+ await adb.dismissKeyguard();
194
168
  const keys = helpers.stringKeyToArr(capabilities.unlockKey);
195
169
 
196
170
  for (const pin of keys) {
@@ -201,11 +175,14 @@ helpers.pinUnlockWithKeyEvent = async function pinUnlockWithKeyEvent(adb, driver
201
175
  };
202
176
 
203
177
  helpers.passwordUnlock = async function passwordUnlock(adb, driver, capabilities) {
204
- _logger.default.info(`Trying to unlock device using password ${capabilities.unlockKey}`);
178
+ const {
179
+ unlockKey
180
+ } = capabilities;
181
+
182
+ _logger.default.info(`Trying to unlock device using password ${unlockKey}`);
205
183
 
206
- await helpers.dismissKeyguard(driver, adb);
207
- let key = capabilities.unlockKey;
208
- key = helpers.encodePassword(key);
184
+ await adb.dismissKeyguard();
185
+ const key = helpers.encodePassword(unlockKey);
209
186
  await adb.shell(['input', 'text', key]);
210
187
  await (0, _asyncbox.sleep)(INPUT_KEYS_WAIT_TIME);
211
188
  await adb.shell(['input', 'keyevent', KEYCODE_NUMPAD_ENTER]);
@@ -227,11 +204,11 @@ helpers.getPatternKeyPosition = function getPatternKeyPosition(key, initPos, pie
227
204
  };
228
205
 
229
206
  helpers.getPatternActions = function getPatternActions(keys, initPos, piece) {
230
- let actions = [];
207
+ const actions = [];
231
208
  let lastPos;
232
209
 
233
210
  for (let key of keys) {
234
- let keyPos = helpers.getPatternKeyPosition(key, initPos, piece);
211
+ const keyPos = helpers.getPatternKeyPosition(key, initPos, piece);
235
212
 
236
213
  if (key === keys[0]) {
237
214
  actions.push({
@@ -246,11 +223,11 @@ helpers.getPatternActions = function getPatternActions(keys, initPos, piece) {
246
223
  continue;
247
224
  }
248
225
 
249
- let moveTo = {
226
+ const moveTo = {
250
227
  x: 0,
251
228
  y: 0
252
229
  };
253
- let diffX = keyPos.x - lastPos.x;
230
+ const diffX = keyPos.x - lastPos.x;
254
231
 
255
232
  if (diffX > 0) {
256
233
  moveTo.x = piece;
@@ -266,7 +243,7 @@ helpers.getPatternActions = function getPatternActions(keys, initPos, piece) {
266
243
  }
267
244
  }
268
245
 
269
- let diffY = keyPos.y - lastPos.y;
246
+ const diffY = keyPos.y - lastPos.y;
270
247
 
271
248
  if (diffY > 0) {
272
249
  moveTo.y = piece;
@@ -300,15 +277,19 @@ helpers.getPatternActions = function getPatternActions(keys, initPos, piece) {
300
277
  };
301
278
 
302
279
  helpers.patternUnlock = async function patternUnlock(adb, driver, capabilities) {
303
- _logger.default.info(`Trying to unlock device using pattern ${capabilities.unlockKey}`);
304
-
305
- await helpers.dismissKeyguard(driver, adb);
306
- let keys = helpers.stringKeyToArr(capabilities.unlockKey);
307
- let apiLevel = await adb.getApiLevel();
308
- let el = await driver.findElOrEls('id', `com.android.${apiLevel >= 21 ? 'systemui' : 'keyguard'}:id/lockPatternView`, false);
309
- let initPos = await driver.getLocation(_appiumSupport.util.unwrapElement(el));
310
- let size = await driver.getSize(_appiumSupport.util.unwrapElement(el));
311
- let actions = helpers.getPatternActions(keys, initPos, size.width / 3);
280
+ const {
281
+ unlockKey
282
+ } = capabilities;
283
+
284
+ _logger.default.info(`Trying to unlock device using pattern ${unlockKey}`);
285
+
286
+ await adb.dismissKeyguard();
287
+ const keys = helpers.stringKeyToArr(unlockKey);
288
+ const apiLevel = await adb.getApiLevel();
289
+ const el = await driver.findElOrEls('id', `com.android.${apiLevel >= 21 ? 'systemui' : 'keyguard'}:id/lockPatternView`, false);
290
+ const initPos = await driver.getLocation(_appiumSupport.util.unwrapElement(el));
291
+ const size = await driver.getSize(_appiumSupport.util.unwrapElement(el));
292
+ const actions = helpers.getPatternActions(keys, initPos, size.width / 3);
312
293
  await driver.performTouch(actions);
313
294
  await (0, _asyncbox.sleep)(UNLOCK_WAIT_TIME);
314
295
  };
@@ -322,4 +303,4 @@ var _default = helpers;
322
303
  exports.default = _default;require('source-map-support').install();
323
304
 
324
305
 
325
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91bmxvY2staGVscGVycy5qcyJdLCJuYW1lcyI6WyJQSU5fVU5MT0NLIiwiUElOX1VOTE9DS19LRVlfRVZFTlQiLCJQQVNTV09SRF9VTkxPQ0siLCJQQVRURVJOX1VOTE9DSyIsIkZJTkdFUlBSSU5UX1VOTE9DSyIsIlVOTE9DS19UWVBFUyIsIktFWUNPREVfTlVNUEFEX0VOVEVSIiwiS0VZQ09ERV9QT1dFUiIsIktFWUNPREVfV0FLRVVQIiwiVU5MT0NLX1dBSVRfVElNRSIsIkhJREVfS0VZQk9BUkRfV0FJVF9USU1FIiwiSU5QVVRfS0VZU19XQUlUX1RJTUUiLCJOVU1CRVJfWkVST19LRVlDT0RFIiwiaGVscGVycyIsImlzVmFsaWRVbmxvY2tUeXBlIiwidHlwZSIsImluY2x1ZGVzIiwiaXNWYWxpZEtleSIsImtleSIsIl8iLCJpc1VuZGVmaW5lZCIsInRlc3QiLCJ0cmltIiwiRXJyb3IiLCJkaXNtaXNzS2V5Z3VhcmQiLCJkcml2ZXIiLCJhZGIiLCJsb2dnZXIiLCJpbmZvIiwicHJlc3NLZXlDb2RlIiwiaXNLZXlib2FyZFNob3duIiwiaGlkZUtleWJvYXJkIiwic2hlbGwiLCJiYWNrIiwiZ2V0QXBpTGV2ZWwiLCJzd2lwZVVwIiwid2luZG93U2l6ZSIsImdldFdpbmRvd1NpemUiLCJ4MCIsInBhcnNlSW50IiwieCIsInkwIiwieSIsInlQIiwiYWN0aW9ucyIsImFjdGlvbiIsIm9wdGlvbnMiLCJlbGVtZW50IiwicGVyZm9ybVRvdWNoIiwiZW5jb2RlUGFzc3dvcmQiLCJyZXBsYWNlIiwic3RyaW5nS2V5VG9BcnIiLCJzcGxpdCIsImZpbmdlcnByaW50VW5sb2NrIiwiY2FwYWJpbGl0aWVzIiwiZmluZ2VycHJpbnQiLCJ1bmxvY2tLZXkiLCJwaW5VbmxvY2siLCJrZXlzIiwiZWxzIiwiZmluZEVsT3JFbHMiLCJpc0VtcHR5IiwicGluVW5sb2NrV2l0aEtleUV2ZW50IiwicGlucyIsImVsIiwidGV4dCIsImdldEF0dHJpYnV0ZSIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwicGluIiwiY2xpY2siLCJ3YWl0Rm9yVW5sb2NrIiwiaXNTY3JlZW5Mb2NrZWQiLCJwYXNzd29yZFVubG9jayIsImdldFBhdHRlcm5LZXlQb3NpdGlvbiIsImluaXRQb3MiLCJwaWVjZSIsImNvbHMiLCJ4UG9zIiwiTWF0aCIsInJvdW5kIiwieVBvcyIsImNlaWwiLCJnZXRQYXR0ZXJuQWN0aW9ucyIsImxhc3RQb3MiLCJrZXlQb3MiLCJwdXNoIiwibW92ZVRvIiwiZGlmZlgiLCJhYnMiLCJkaWZmWSIsInBhdHRlcm5VbmxvY2siLCJhcGlMZXZlbCIsImdldExvY2F0aW9uIiwic2l6ZSIsImdldFNpemUiLCJ3aWR0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUcsS0FBbkI7O0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsaUJBQTdCOztBQUNBLE1BQU1DLGVBQWUsR0FBRyxVQUF4Qjs7QUFDQSxNQUFNQyxjQUFjLEdBQUcsU0FBdkI7O0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsYUFBM0I7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHLENBQUNMLFVBQUQsRUFBYUMsb0JBQWIsRUFBbUNDLGVBQW5DLEVBQW9EQyxjQUFwRCxFQUFvRUMsa0JBQXBFLENBQXJCO0FBQ0EsTUFBTUUsb0JBQW9CLEdBQUcsRUFBN0I7QUFDQSxNQUFNQyxhQUFhLEdBQUcsRUFBdEI7QUFDQSxNQUFNQyxjQUFjLEdBQUcsR0FBdkI7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxHQUF6QjtBQUNBLE1BQU1DLHVCQUF1QixHQUFHLEdBQWhDO0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsR0FBN0I7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxDQUE1QjtBQUVBLElBQUlDLE9BQU8sR0FBRyxFQUFkOzs7QUFDQUEsT0FBTyxDQUFDQyxpQkFBUixHQUE0QixTQUFTQSxpQkFBVCxDQUE0QkMsSUFBNUIsRUFBa0M7QUFDNUQsU0FBT1YsWUFBWSxDQUFDVyxR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b2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcblxuY29uc3QgUElOX1VOTE9DSyA9ICdwaW4nO1xuY29uc3QgUElOX1VOTE9DS19LRVlfRVZFTlQgPSAncGluV2l0aEtleUV2ZW50JztcbmNvbnN0IFBBU1NXT1JEX1VOTE9DSyA9ICdwYXNzd29yZCc7XG5jb25zdCBQQVRURVJOX1VOTE9DSyA9ICdwYXR0ZXJuJztcbmNvbnN0IEZJTkdFUlBSSU5UX1VOTE9DSyA9ICdmaW5nZXJwcmludCc7XG5jb25zdCBVTkxPQ0tfVFlQRVMgPSBbUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIFBBU1NXT1JEX1VOTE9DSywgUEFUVEVSTl9VTkxPQ0ssIEZJTkdFUlBSSU5UX1VOTE9DS107XG5jb25zdCBLRVlDT0RFX05VTVBBRF9FTlRFUiA9IDY2O1xuY29uc3QgS0VZQ09ERV9QT1dFUiA9IDI2O1xuY29uc3QgS0VZQ09ERV9XQUtFVVAgPSAyMjQ7IC8vIENhbiB3b3JrIG92ZXIgQVBJIExldmVsIDIwXG5jb25zdCBVTkxPQ0tfV0FJVF9USU1FID0gMTAwO1xuY29uc3QgSElERV9LRVlCT0FSRF9XQUlUX1RJTUUgPSAxMDA7XG5jb25zdCBJTlBVVF9LRVlTX1dBSVRfVElNRSA9IDEwMDtcbmNvbnN0IE5VTUJFUl9aRVJPX0tFWUNPREUgPSA3O1xuXG5sZXQgaGVscGVycyA9IHt9O1xuaGVscGVycy5pc1ZhbGlkVW5sb2NrVHlwZSA9IGZ1bmN0aW9uIGlzVmFsaWRVbmxvY2tUeXBlICh0eXBlKSB7XG4gIHJldHVybiBVTkxPQ0tfVFlQRVMuaW5jbHVkZXModHlwZSk7XG59O1xuXG5oZWxwZXJzLmlzVmFsaWRLZXkgPSBmdW5jdGlvbiBpc1ZhbGlkS2V5ICh0eXBlLCBrZXkpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQoa2V5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoW1BJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULCBGSU5HRVJQUklOVF9VTkxPQ0tdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgcmV0dXJuIC9eWzAtOV0rJC8udGVzdChrZXkudHJpbSgpKTtcbiAgfVxuICBpZiAodHlwZSA9PT0gUEFUVEVSTl9VTkxPQ0spIHtcbiAgICBpZiAoIS9eWzEtOV17Miw5fSQvLnRlc3Qoa2V5LnRyaW0oKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEoLyhbMS05XSkuKj9cXDEvLnRlc3Qoa2V5LnRyaW0oKSkpO1xuICB9XG4gIC8vIERvbnQgdHJpbSBwYXNzd29yZCBrZXksIHlvdSBjYW4gdXNlIGJsYW5rIHNwYWNlcyBpbiB5b3VyIGFuZHJvaWQgcGFzc3dvcmRcbiAgLy8gwq9cXF8o44OEKV8vwq9cbiAgaWYgKHR5cGUgPT09IFBBU1NXT1JEX1VOTE9DSykge1xuICAgIHJldHVybiAvLns0LH0vZy50ZXN0KGtleSk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVubG9jayB0eXBlICR7dHlwZX1gKTtcbn07XG5cbmhlbHBlcnMuZGlzbWlzc0tleWd1YXJkID0gYXN5bmMgZnVuY3Rpb24gZGlzbWlzc0tleWd1YXJkIChkcml2ZXIsIGFkYikge1xuICBsb2dnZXIuaW5mbygnV2FraW5nIHVwIHRoZSBkZXZpY2UgdG8gdW5sb2NrIGl0Jyk7XG4gIC8vIFNjcmVlbiBvZmYgb25jZSB0byBmb3JjZSBwcmUtaW5wdXR0ZWQgdGV4dCBmaWVsZCBjbGVhbiBhZnRlciB3YWtlLXVwXG4gIC8vIEp1c3Qgc2NyZWVuIG9uIGlmIHRoZSBzY3JlZW4gZGVmYXVsdHMgb2ZmXG4gIGF3YWl0IGRyaXZlci5wcmVzc0tleUNvZGUoS0VZQ09ERV9QT1dFUik7XG4gIGF3YWl0IGRyaXZlci5wcmVzc0tleUNvZGUoS0VZQ09ERV9XQUtFVVApO1xuICBsZXQgaXNLZXlib2FyZFNob3duID0gYXdhaXQgZHJpdmVyLmlzS2V5Ym9hcmRTaG93bigpO1xuICBpZiAoaXNLZXlib2FyZFNob3duKSB7XG4gICAgYXdhaXQgZHJpdmVyLmhpZGVLZXlib2FyZCgpO1xuICAgIC8vIFdhaXRzIGEgYml0IGZvciB0aGUga2V5Ym9hcmQgdG8gaGlkZVxuICAgIGF3YWl0IHNsZWVwKEhJREVfS0VZQk9BUkRfV0FJVF9USU1FKTtcbiAgfVxuICAvLyBkaXNtaXNzIG5vdGlmaWNhdGlvbnNcbiAgbG9nZ2VyLmluZm8oJ0Rpc21pc3Mgbm90aWZpY2F0aW9ucyBmcm9tIHVubG9jayB2aWV3Jyk7XG4gIGF3YWl0IGFkYi5zaGVsbChbJ3NlcnZpY2UnLCAnY2FsbCcsICdub3RpZmljYXRpb24nLCAnMSddKTtcbiAgYXdhaXQgYWRiLmJhY2soKTtcbiAgaWYgKGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpID4gMjEpIHtcbiAgICBsb2dnZXIuaW5mbygnVHJ5aW5nIHRvIGRpc21pc3Mga2V5Z3VhcmQnKTtcbiAgICBhd2FpdCBhZGIuc2hlbGwoWyd3bScsICdkaXNtaXNzLWtleWd1YXJkJ10pO1xuICAgIHJldHVybjtcbiAgfVxuICBsb2dnZXIuaW5mbygnU3dpcGluZyB1cCB0byBkaXNtaXNzIGtleWd1YXJkJyk7XG4gIGF3YWl0IGhlbHBlcnMuc3dpcGVVcChkcml2ZXIpO1xufTtcblxuaGVscGVycy5zd2lwZVVwID0gYXN5bmMgZnVuY3Rpb24gc3dpcGVVcCAoZHJpdmVyKSB7XG4gIGxldCB3aW5kb3dTaXplID0gYXdhaXQgZHJpdmVyLmdldFdpbmRvd1NpemUoKTtcbiAgbGV0IHgwID0gcGFyc2VJbnQod2luZG93U2l6ZS54IC8gMiwgMTApO1xuICBsZXQgeTAgPSB3aW5kb3dTaXplLnkgLSAxMDtcbiAgbGV0IHlQID0gMTAwO1xuICBsZXQgYWN0aW9ucyA9IFtcbiAgICB7YWN0aW9uOiAncHJlc3MnLCBvcHRpb25zOiB7ZWxlbWVudDogbnVsbCwgeDogeDAsIHk6IHkwfX0sXG4gICAge2FjdGlvbjogJ21vdmVUbycsIG9wdGlvbnM6IHtlbGVtZW50OiBudWxsLCB4OiB4MCwgeTogeVB9fSxcbiAgICB7YWN0aW9uOiAncmVsZWFzZSd9XG4gIF07XG4gIGF3YWl0IGRyaXZlci5wZXJmb3JtVG91Y2goYWN0aW9ucyk7XG59O1xuXG5oZWxwZXJzLmVuY29kZVBhc3N3b3JkID0gZnVuY3Rpb24gZW5jb2RlUGFzc3dvcmQgKGtleSkge1xuICByZXR1cm4ga2V5LnJlcGxhY2UoL1xccy9pZywgJyVzJyk7XG59O1xuXG5oZWxwZXJzLnN0cmluZ0tleVRvQXJyID0gZnVuY3Rpb24gc3RyaW5nS2V5VG9BcnIgKGtleSkge1xuICByZXR1cm4ga2V5LnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcnKS5zcGxpdCgvXFxzKi8pO1xufTtcblxuaGVscGVycy5maW5nZXJwcmludFVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIGZpbmdlcnByaW50VW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaW5nZXJwcmludCB1bmxvY2sgb25seSB3b3JrcyBmb3IgQW5kcm9pZCA2KyBlbXVsYXRvcnMnKTtcbiAgfVxuICBhd2FpdCBhZGIuZmluZ2VycHJpbnQoY2FwYWJpbGl0aWVzLnVubG9ja0tleSk7XG4gIGF3YWl0IHNsZWVwKFVOTE9DS19XQUlUX1RJTUUpO1xufTtcblxuaGVscGVycy5waW5VbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBwaW5VbmxvY2sgKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpIHtcbiAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byB1bmxvY2sgZGV2aWNlIHVzaW5nIHBpbiAke2NhcGFiaWxpdGllcy51bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGhlbHBlcnMuZGlzbWlzc0tleWd1YXJkKGRyaXZlciwgYWRiKTtcbiAgbGV0IGtleXMgPSBoZWxwZXJzLnN0cmluZ0tleVRvQXJyKGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPj0gMjEpIHtcbiAgICBsZXQgZWxzID0gYXdhaXQgZHJpdmVyLmZpbmRFbE9yRWxzKCdpZCcsICdjb20uYW5kcm9pZC5zeXN0ZW11aTppZC9kaWdpdF90ZXh0JywgdHJ1ZSk7XG4gICAgaWYgKF8uaXNFbXB0eShlbHMpKSB7XG4gICAgICAvLyBmYWxsYmFjayB0byBwaW4gd2l0aCBrZXkgZXZlbnRcbiAgICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLnBpblVubG9ja1dpdGhLZXlFdmVudChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgICB9XG4gICAgbGV0IHBpbnMgPSB7fTtcbiAgICBmb3IgKGxldCBlbCBvZiBlbHMpIHtcbiAgICAgIGxldCB0ZXh0ID0gYXdhaXQgZHJpdmVyLmdldEF0dHJpYnV0ZSgndGV4dCcsIHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICAgICAgcGluc1t0ZXh0XSA9IGVsO1xuICAgIH1cbiAgICBmb3IgKGxldCBwaW4gb2Yga2V5cykge1xuICAgICAgbGV0IGVsID0gcGluc1twaW5dO1xuICAgICAgYXdhaXQgZHJpdmVyLmNsaWNrKHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBwaW4gb2Yga2V5cykge1xuICAgICAgbGV0IGVsID0gYXdhaXQgZHJpdmVyLmZpbmRFbE9yRWxzKCdpZCcsIGBjb20uYW5kcm9pZC5rZXlndWFyZDppZC9rZXkke3Bpbn1gLCBmYWxzZSk7XG4gICAgICBpZiAoZWwgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZmFsbGJhY2sgdG8gcGluIHdpdGgga2V5IGV2ZW50XG4gICAgICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLnBpblVubG9ja1dpdGhLZXlFdmVudChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRyaXZlci5jbGljayh1dGlsLnVud3JhcEVsZW1lbnQoZWwpKTtcbiAgICB9XG4gIH1cbiAgYXdhaXQgd2FpdEZvclVubG9jayhhZGIsIGRyaXZlcik7XG59O1xuXG5cbi8qKlxuICogV2FpdCBmb3IgdGhlIGRpc3BsYXkgdG8gYmUgdW5sb2NrZWQuXG4gKiBTb21lIGRldmljZXMgYXV0b21hdGljYWxseSBhY2NlcHQgdHlwZWQgJ3BpbicgYW5kICdwYXNzd29yZCcgY29kZVxuICogd2l0aG91dCBwcmVzc2luZyB0aGUgRW50ZXIga2V5LiBCdXQgc29tZSBkZXZpY2VzIG5lZWQgaXQuXG4gKiBUaGlzIG1ldGhvZCB3YWl0cyBhIGZldyBzZWNvbmRzIGZpcnN0IGZvciBzdWNoIGF1dG9tYXRpYyBhY2NlcHRhbmNlIGNhc2UuXG4gKiBJZiB0aGUgZGV2aWNlIGlzIHN0aWxsIGxvY2tlZCwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRyeSB0byBzZW5kXG4gKiB0aGUgZW50ZXIga2V5IGNvZGUuXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBUaGUgaW5zdGFuY2Ugb2YgQURCXG4gKiBAcGFyYW0ge0FuZHJvaWREcml2ZXJ9IGRyaXZlciBUaGUgaW5zdGFuY2Ugb2YgQW5kcm9pZERyaXZlclxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yVW5sb2NrIChhZGIsIGRyaXZlcikge1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbiAgaWYgKCFhd2FpdCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGRyaXZlci5wcmVzc0tleUNvZGUoS0VZQ09ERV9OVU1QQURfRU5URVIpO1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbn1cblxuaGVscGVycy5waW5VbmxvY2tXaXRoS2V5RXZlbnQgPSBhc3luYyBmdW5jdGlvbiBwaW5VbmxvY2tXaXRoS2V5RXZlbnQgKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpIHtcbiAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byB1bmxvY2sgZGV2aWNlIHVzaW5nIHBpbiB3aXRoIGtleWNvZGUgJHtjYXBhYmlsaXRpZXMudW5sb2NrS2V5fWApO1xuICBhd2FpdCBoZWxwZXJzLmRpc21pc3NLZXlndWFyZChkcml2ZXIsIGFkYik7XG4gIGNvbnN0IGtleXMgPSBoZWxwZXJzLnN0cmluZ0tleVRvQXJyKGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuXG4gIC8vIFNvbWUgZGV2aWNlIGRvZXMgbm90IGhhdmUgc3lzdGVtIGtleSBpZHMgbGlrZSAnY29tLmFuZHJvaWQua2V5Z3VhcmQ6aWQva2V5J1xuICAvLyBUaGVuLCBzZW5kaW5nIGtleWV2ZW50cyBhcmUgbW9yZSByZWxpYWJsZSB0byB1bmxvY2sgdGhlIHNjcmVlbi5cbiAgZm9yIChjb25zdCBwaW4gb2Yga2V5cykge1xuICAgIC8vICdwaW4nIGlzIG51bWJlciAoMC05KSBpbiBzdHJpbmcuXG4gICAgLy8gTnVtYmVyICcwJyBpcyBrZXljb2RlICc3Jy4gbnVtYmVyICc5JyBpcyBrZXljb2RlICcxNicuXG4gICAgYXdhaXQgYWRiLnNoZWxsKFsnaW5wdXQnLCAna2V5ZXZlbnQnLCBwYXJzZUludChwaW4sIDEwKSArIE5VTUJFUl9aRVJPX0tFWUNPREVdKTtcbiAgfVxuICBhd2FpdCB3YWl0Rm9yVW5sb2NrKGFkYiwgZHJpdmVyKTtcbn07XG5cbmhlbHBlcnMucGFzc3dvcmRVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBwYXNzd29yZFVubG9jayAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvIHVubG9jayBkZXZpY2UgdXNpbmcgcGFzc3dvcmQgJHtjYXBhYmlsaXRpZXMudW5sb2NrS2V5fWApO1xuICBhd2FpdCBoZWxwZXJzLmRpc21pc3NLZXlndWFyZChkcml2ZXIsIGFkYik7XG4gIGxldCBrZXkgPSBjYXBhYmlsaXRpZXMudW5sb2NrS2V5O1xuICAvLyBSZXBsYWNlIGJsYW5rIHNwYWNlcyB3aXRoICVzXG4gIGtleSA9IGhlbHBlcnMuZW5jb2RlUGFzc3dvcmQoa2V5KTtcbiAgLy8gV2h5IGFkYiA/IEl0IHdhcyBsZXNzIGZsYWt5XG4gIGF3YWl0IGFkYi5zaGVsbChbJ2lucHV0JywgJ3RleHQnLCBrZXldKTtcbiAgLy8gV2h5IHNsZWVwcyA/IEF2b2lkIHNvbWUgZmxha3luZXNzIHdhaXRpbmcgZm9yIHRoZSBpbnB1dCB0byByZWNlaXZlIHRoZSBrZXlzXG4gIGF3YWl0IHNsZWVwKElOUFVUX0tFWVNfV0FJVF9USU1FKTtcbiAgYXdhaXQgYWRiLnNoZWxsKFsnaW5wdXQnLCAna2V5ZXZlbnQnLCBLRVlDT0RFX05VTVBBRF9FTlRFUl0pO1xuICAvLyBXYWl0cyBhIGJpdCBmb3IgdGhlIGRldmljZSB0byBiZSB1bmxvY2tlZFxuICBhd2FpdCB3YWl0Rm9yVW5sb2NrKGFkYiwgZHJpdmVyKTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybktleVBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0UGF0dGVybktleVBvc2l0aW9uIChrZXksIGluaXRQb3MsIHBpZWNlKSB7XG4gIC8qXG4gIEhvdyB0aGUgbWF0aCB3b3JrczpcbiAgV2UgaGF2ZSA5IGJ1dHRvbnMgZGl2aWRlZCBpbiAzIGNvbHVtbnMgYW5kIDMgcm93cyBpbnNpZGUgdGhlIGxvY2tQYXR0ZXJuVmlldyxcbiAgZXZlcnkgYnV0dG9uIGhhcyBhIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4gY29ycmVzcG9uZGluZyB0byB0aGUgbG9ja1BhdHRlcm5WaWV3IHNpbmNlXG4gIGl0IGlzIHRoZSBwYXJlbnQgdmlldyByaWdodCBhdCB0aGUgbWlkZGxlIG9mIGVhY2ggY29sdW1uIG9yIHJvdy5cbiAgKi9cbiAgY29uc3QgY29scyA9IDM7XG4gIGNvbnN0IHBpbnMgPSA5O1xuICBjb25zdCB4UG9zID0gKGtleSwgeCwgcGllY2UpID0+IE1hdGgucm91bmQoeCArICgoa2V5ICUgY29scykgfHwgY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMik7XG4gIGNvbnN0IHlQb3MgPSAoa2V5LCB5LCBwaWVjZSkgPT4gTWF0aC5yb3VuZCh5ICsgKE1hdGguY2VpbCgoKGtleSAlIHBpbnMpIHx8IHBpbnMpIC8gY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMikpO1xuICByZXR1cm4ge3g6IHhQb3Moa2V5LCBpbml0UG9zLngsIHBpZWNlKSwgeTogeVBvcyhrZXksIGluaXRQb3MueSwgcGllY2UpfTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybkFjdGlvbnMgPSBmdW5jdGlvbiBnZXRQYXR0ZXJuQWN0aW9ucyAoa2V5cywgaW5pdFBvcywgcGllY2UpIHtcbiAgbGV0IGFjdGlvbnMgPSBbXTtcbiAgbGV0IGxhc3RQb3M7XG4gIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgbGV0IGtleVBvcyA9IGhlbHBlcnMuZ2V0UGF0dGVybktleVBvc2l0aW9uKGtleSwgaW5pdFBvcywgcGllY2UpO1xuICAgIGlmIChrZXkgPT09IGtleXNbMF0pIHtcbiAgICAgIGFjdGlvbnMucHVzaCh7YWN0aW9uOiAncHJlc3MnLCBvcHRpb25zOiB7ZWxlbWVudDogbnVsbCwgeDoga2V5UG9zLngsIHk6IGtleVBvcy55fX0pO1xuICAgICAgbGFzdFBvcyA9IGtleVBvcztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBsZXQgbW92ZVRvID0ge3g6IDAsIHk6IDB9O1xuICAgIGxldCBkaWZmWCA9IGtleVBvcy54IC0gbGFzdFBvcy54O1xuICAgIGlmIChkaWZmWCA+IDApIHtcbiAgICAgIG1vdmVUby54ID0gcGllY2U7XG4gICAgICBpZiAoTWF0aC5hYnMoZGlmZlgpID4gcGllY2UpIHtcbiAgICAgICAgbW92ZVRvLnggKz0gcGllY2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkaWZmWCA8IDApIHtcbiAgICAgIG1vdmVUby54ID0gLTEgKiBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWCkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueCAtPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGRpZmZZID0ga2V5UG9zLnkgLSBsYXN0UG9zLnk7XG4gICAgaWYgKGRpZmZZID4gMCkge1xuICAgICAgbW92ZVRvLnkgPSBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWSkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueSArPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpZmZZIDwgMCkge1xuICAgICAgbW92ZVRvLnkgPSAtMSAqIHBpZWNlO1xuICAgICAgaWYgKE1hdGguYWJzKGRpZmZZKSA+IHBpZWNlKSB7XG4gICAgICAgIG1vdmVUby55IC09IHBpZWNlO1xuICAgICAgfVxuICAgIH1cbiAgICBhY3Rpb25zLnB1c2goe2FjdGlvbjogJ21vdmVUbycsIG9wdGlvbnM6IHtlbGVtZW50OiBudWxsLCB4OiBtb3ZlVG8ueCArIGxhc3RQb3MueCwgeTogbW92ZVRvLnkgKyBsYXN0UG9zLnl9fSk7XG4gICAgbGFzdFBvcyA9IGtleVBvcztcbiAgfVxuICBhY3Rpb25zLnB1c2goe2FjdGlvbjogJ3JlbGVhc2UnfSk7XG4gIHJldHVybiBhY3Rpb25zO1xufTtcblxuaGVscGVycy5wYXR0ZXJuVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gcGF0dGVyblVubG9jayAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvIHVubG9jayBkZXZpY2UgdXNpbmcgcGF0dGVybiAke2NhcGFiaWxpdGllcy51bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGhlbHBlcnMuZGlzbWlzc0tleWd1YXJkKGRyaXZlciwgYWRiKTtcbiAgbGV0IGtleXMgPSBoZWxwZXJzLnN0cmluZ0tleVRvQXJyKGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICAvKiBXZSBzZXQgdGhlIGRldmljZSBwYXR0ZXJuIGJ1dHRvbnMgYXMgbnVtYmVyIG9mIGEgcmVndWxhciBwaG9uZVxuICAgKiAgfCDigKIg4oCiIOKAoiB8ICAgICB8IDEgMiAzIHxcbiAgICogIHwg4oCiIOKAoiDigKIgfCAtLT4gfCA0IDUgNiB8XG4gICAqICB8IOKAoiDigKIg4oCiIHwgICAgIHwgNyA4IDkgfFxuXG4gIFRoZSBwYXR0ZXJuIHZpZXcgYnV0dG9ucyBhcmUgbm90IHNlZWluZyBieSB0aGUgdWlhdXRvbWF0b3Igc2luY2UgdGhleSBhcmVcbiAgaW5jbHVkZWQgaW5zaWRlIGEgRnJhbWVMYXlvdXQsIHNvIHdlIGFyZSBnb2luZyB0byB0cnkgY2xpY2tpbmcgb24gdGhlIGJ1dHRvbnNcbiAgdXNpbmcgdGhlIHBhcmVudCB2aWV3IGJvdW5kcyBhbmQgbWF0aC5cbiAgKi9cbiAgbGV0IGFwaUxldmVsID0gYXdhaXQgYWRiLmdldEFwaUxldmVsKCk7XG4gIGxldCBlbCA9IGF3YWl0IGRyaXZlci5maW5kRWxPckVscygnaWQnLFxuICAgIGBjb20uYW5kcm9pZC4ke2FwaUxldmVsID49IDIxID8gJ3N5c3RlbXVpJyA6ICdrZXlndWFyZCd9OmlkL2xvY2tQYXR0ZXJuVmlld2AsXG4gICAgZmFsc2VcbiAgKTtcbiAgbGV0IGluaXRQb3MgPSBhd2FpdCBkcml2ZXIuZ2V0TG9jYXRpb24odXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gIGxldCBzaXplID0gYXdhaXQgZHJpdmVyLmdldFNpemUodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gIC8vIEdldCBhY3Rpb25zIHRvIHBlcmZvcm1cbiAgbGV0IGFjdGlvbnMgPSBoZWxwZXJzLmdldFBhdHRlcm5BY3Rpb25zKGtleXMsIGluaXRQb3MsIHNpemUud2lkdGggLyAzKTtcbiAgLy8gUGVyZm9ybSBnZXN0dXJlXG4gIGF3YWl0IGRyaXZlci5wZXJmb3JtVG91Y2goYWN0aW9ucyk7XG4gIC8vIFdhaXRzIGEgYml0IGZvciB0aGUgZGV2aWNlIHRvIGJlIHVubG9ja2VkXG4gIGF3YWl0IHNsZWVwKFVOTE9DS19XQUlUX1RJTUUpO1xufTtcblxuaGVscGVycy5QSU5fVU5MT0NLID0gUElOX1VOTE9DSztcbmhlbHBlcnMuUElOX1VOTE9DS19LRVlfRVZFTlQgPSBQSU5fVU5MT0NLX0tFWV9FVkVOVDtcbmhlbHBlcnMuUEFTU1dPUkRfVU5MT0NLID0gUEFTU1dPUkRfVU5MT0NLO1xuaGVscGVycy5QQVRURVJOX1VOTE9DSyA9IFBBVFRFUk5fVU5MT0NLO1xuaGVscGVycy5GSU5HRVJQUklOVF9VTkxPQ0sgPSBGSU5HRVJQUklOVF9VTkxPQ0s7XG5cbmV4cG9ydCB7IFBJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULCBQQVNTV09SRF9VTkxPQ0ssIFBBVFRFUk5fVU5MT0NLLCBGSU5HRVJQUklOVF9VTkxPQ0ssIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG4iXSwiZmlsZSI6ImxpYi91bmxvY2staGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
306
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91bmxvY2staGVscGVycy5qcyJdLCJuYW1lcyI6WyJQSU5fVU5MT0NLIiwiUElOX1VOTE9DS19LRVlfRVZFTlQiLCJQQVNTV09SRF9VTkxPQ0siLCJQQVRURVJOX1VOTE9DSyIsIkZJTkdFUlBSSU5UX1VOTE9DSyIsIlVOTE9DS19UWVBFUyIsIktFWUNPREVfTlVNUEFEX0VOVEVSIiwiVU5MT0NLX1dBSVRfVElNRSIsIklOUFVUX0tFWVNfV0FJVF9USU1FIiwiTlVNQkVSX1pFUk9fS0VZQ09ERSIsImhlbHBlcnMiLCJ2YWxpZGF0ZVVubG9ja0NhcGFiaWxpdGllcyIsImNhcHMiLCJ1bmxvY2tLZXkiLCJ1bmxvY2tUeXBlIiwiXyIsImlzTmlsIiwiRXJyb3IiLCJpbmNsdWRlcyIsInRlc3QiLCJ0cmltIiwiZmFzdFVubG9jayIsImFkYiIsIm9wdHMiLCJjcmVkZW50aWFsIiwiY3JlZGVudGlhbFR5cGUiLCJsb2dnZXIiLCJpbmZvIiwid2FzTG9ja0VuYWJsZWQiLCJpc0xvY2tFbmFibGVkIiwiY2xlYXJMb2NrQ3JlZGVudGlhbCIsImN5Y2xlV2FrZVVwIiwiZGlzbWlzc0tleWd1YXJkIiwic2V0TG9ja0NyZWRlbnRpYWwiLCJlbmNvZGVQYXNzd29yZCIsImtleSIsInJlcGxhY2UiLCJzdHJpbmdLZXlUb0FyciIsInNwbGl0IiwiZmluZ2VycHJpbnRVbmxvY2siLCJkcml2ZXIiLCJjYXBhYmlsaXRpZXMiLCJnZXRBcGlMZXZlbCIsImZpbmdlcnByaW50IiwicGluVW5sb2NrIiwia2V5cyIsImVscyIsImZpbmRFbE9yRWxzIiwiaXNFbXB0eSIsInBpblVubG9ja1dpdGhLZXlFdmVudCIsInBpbnMiLCJlbCIsInRleHQiLCJnZXRBdHRyaWJ1dGUiLCJ1dGlsIiwidW53cmFwRWxlbWVudCIsInBpbiIsImNsaWNrIiwid2FpdEZvclVubG9jayIsImlzU2NyZWVuTG9ja2VkIiwia2V5ZXZlbnQiLCJzaGVsbCIsInBhcnNlSW50IiwicGFzc3dvcmRVbmxvY2siLCJnZXRQYXR0ZXJuS2V5UG9zaXRpb24iLCJpbml0UG9zIiwicGllY2UiLCJjb2xzIiwieFBvcyIsIngiLCJNYXRoIiwicm91bmQiLCJ5UG9zIiwieSIsImNlaWwiLCJnZXRQYXR0ZXJuQWN0aW9ucyIsImFjdGlvbnMiLCJsYXN0UG9zIiwia2V5UG9zIiwicHVzaCIsImFjdGlvbiIsIm9wdGlvbnMiLCJlbGVtZW50IiwibW92ZVRvIiwiZGlmZlgiLCJhYnMiLCJkaWZmWSIsInBhdHRlcm5VbmxvY2siLCJhcGlMZXZlbCIsImdldExvY2F0aW9uIiwic2l6ZSIsImdldFNpemUiLCJ3aWR0aCIsInBlcmZvcm1Ub3VjaCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUcsS0FBbkI7O0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsaUJBQTdCOztBQUNBLE1BQU1DLGVBQWUsR0FBRyxVQUF4Qjs7QUFDQSxNQUFNQyxjQUFjLEdBQUcsU0FBdkI7O0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsYUFBM0I7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHLENBQ25CTCxVQURtQixFQUNQQyxvQkFETyxFQUNlQyxlQURmLEVBRW5CQyxjQUZtQixFQUVIQyxrQkFGRyxDQUFyQjtBQUlBLE1BQU1FLG9CQUFvQixHQUFHLEVBQTdCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsR0FBekI7QUFDQSxNQUFNQyxvQkFBb0IsR0FBRyxHQUE3QjtBQUNBLE1BQU1DLG1CQUFtQixHQUFHLENBQTVCO0FBRUEsTUFBTUMsT0FBTyxHQUFHLEVBQWhCOzs7QUFFQUEsT0FBTyxDQUFDQywwQkFBUixHQUFxQyxTQUFTQSwwQkFBVCxDQUFxQ0MsSUFBSSxHQUFHLEVBQTVDLEVBQWdEO0FBQ25GLFFBQU07QUFDSkMsSUFBQUEsU0FESTtBQUVKQyxJQUFBQTtBQUZJLE1BR0ZGLElBSEo7O0FBSUEsTUFBSUcsZ0JBQUVDLEtBQUYsQ0FBUUgsU0FBUixLQUFzQkEsU0FBUyxLQUFLLEVBQXhD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QUNBTyxPQUFPLENBQUNOLGtCQUFSLEdBQTZCQSxrQkFBN0I7ZUFNZU0sTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcblxuY29uc3QgUElOX1VOTE9DSyA9ICdwaW4nO1xuY29uc3QgUElOX1VOTE9DS19LRVlfRVZFTlQgPSAncGluV2l0aEtleUV2ZW50JztcbmNvbnN0IFBBU1NXT1JEX1VOTE9DSyA9ICdwYXNzd29yZCc7XG5jb25zdCBQQVRURVJOX1VOTE9DSyA9ICdwYXR0ZXJuJztcbmNvbnN0IEZJTkdFUlBSSU5UX1VOTE9DSyA9ICdmaW5nZXJwcmludCc7XG5jb25zdCBVTkxPQ0tfVFlQRVMgPSBbXG4gIFBJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULCBQQVNTV09SRF9VTkxPQ0ssXG4gIFBBVFRFUk5fVU5MT0NLLCBGSU5HRVJQUklOVF9VTkxPQ0tcbl07XG5jb25zdCBLRVlDT0RFX05VTVBBRF9FTlRFUiA9IDY2O1xuY29uc3QgVU5MT0NLX1dBSVRfVElNRSA9IDEwMDtcbmNvbnN0IElOUFVUX0tFWVNfV0FJVF9USU1FID0gMTAwO1xuY29uc3QgTlVNQkVSX1pFUk9fS0VZQ09ERSA9IDc7XG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuaGVscGVycy52YWxpZGF0ZVVubG9ja0NhcGFiaWxpdGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzIChjYXBzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tUeXBlLFxuICB9ID0gY2FwcztcbiAgaWYgKF8uaXNOaWwodW5sb2NrS2V5KSB8fCB1bmxvY2tLZXkgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vbi1lbXB0eSB1bmxvY2sga2V5IHZhbHVlIG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGlmIChbUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIEZJTkdFUlBSSU5UX1VOTE9DS10uaW5jbHVkZXModW5sb2NrVHlwZSkpIHtcbiAgICBpZiAoIS9eWzAtOV0rJC8udGVzdChfLnRyaW0odW5sb2NrS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5sb2NrIGtleSB2YWx1ZSAnJHt1bmxvY2tLZXl9JyBtdXN0IG9ubHkgY29uc2lzdCBvZiBkaWdpdHNgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodW5sb2NrVHlwZSA9PT0gUEFUVEVSTl9VTkxPQ0spIHtcbiAgICBpZiAoIS9eWzEtOV17Miw5fSQvLnRlc3QoXy50cmltKHVubG9ja0tleSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgbXVzdCBvbmx5IGluY2x1ZGUgZnJvbSB0d28gdG8gbmluZSBkaWdpdHMgaW4gcmFuZ2UgMS4uOWApO1xuICAgIH1cbiAgICBpZiAoLyhbMS05XSkuKj9cXDEvLnRlc3QoXy50cmltKHVubG9ja0tleSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgbXVzdCBkZWZpbmUgYSB2YWxpZCBwYXR0ZXJuIHdoZXJlIHJlcGVhdHMgYXJlIG5vdCBhbGxvd2VkYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHVubG9ja1R5cGUgPT09IFBBU1NXT1JEX1VOTE9DSykge1xuICAgIC8vIERvbnQgdHJpbSBwYXNzd29yZCBrZXksIHlvdSBjYW4gdXNlIGJsYW5rIHNwYWNlcyBpbiB5b3VyIGFuZHJvaWQgcGFzc3dvcmRcbiAgICAvLyDCr1xcXyjjg4QpXy/Cr1xuICAgIGlmICghLy57NCx9L2cudGVzdCh1bmxvY2tLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBtaW5pbXVtIGFsbG93ZWQgbGVuZ3RoIG9mIHVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgaXMgNCBjaGFyYWN0ZXJzYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1bmxvY2sgdHlwZSAnJHt1bmxvY2tUeXBlfScuIGAgK1xuICAgICAgYE9ubHkgdGhlIGZvbGxvd2luZyB1bmxvY2sgdHlwZXMgYXJlIHN1cHBvcnRlZDogJHtVTkxPQ0tfVFlQRVN9YCk7XG4gIH1cbiAgcmV0dXJuIGNhcHM7XG59O1xuXG5oZWxwZXJzLmZhc3RVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBmYXN0VW5sb2NrIChhZGIsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgY3JlZGVudGlhbCxcbiAgICBjcmVkZW50aWFsVHlwZSxcbiAgfSA9IG9wdHM7XG4gIGxvZ2dlci5pbmZvKGBVbmxvY2tpbmcgdGhlIGRldmljZSB2aWEgQURCIHVzaW5nICR7Y3JlZGVudGlhbFR5cGV9IGNyZWRlbnRpYWwgJyR7Y3JlZGVudGlhbH0nYCk7XG4gIGNvbnN0IHdhc0xvY2tFbmFibGVkID0gYXdhaXQgYWRiLmlzTG9ja0VuYWJsZWQoKTtcbiAgaWYgKHdhc0xvY2tFbmFibGVkKSB7XG4gICAgYXdhaXQgYWRiLmNsZWFyTG9ja0NyZWRlbnRpYWwoY3JlZGVudGlhbCk7XG4gICAgLy8gbm90IHN1cmUgd2h5LCBidXQgdGhlIGRldmljZSdzIHNjcmVlbiBzdGlsbCByZW1haW5zIGxvY2tlZFxuICAgIC8vIGlmIGEgcHJlbGltaW5hcnkgd2FrZSB1cCBjeWNsZSBoYXMgbm90IGJlZW4gcGVyZm9ybWVkXG4gICAgYXdhaXQgYWRiLmN5Y2xlV2FrZVVwKCk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oJ05vIGFjdGl2ZSBsb2NrIGhhcyBiZWVuIGRldGVjdGVkLiBQcm9jZWVkaW5nIHRvIHRoZSBrZXlndWFyZCBkaXNtaXNzYWwnKTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAod2FzTG9ja0VuYWJsZWQpIHtcbiAgICAgIGF3YWl0IGFkYi5zZXRMb2NrQ3JlZGVudGlhbChjcmVkZW50aWFsVHlwZSwgY3JlZGVudGlhbCk7XG4gICAgfVxuICB9XG59O1xuXG5oZWxwZXJzLmVuY29kZVBhc3N3b3JkID0gZnVuY3Rpb24gZW5jb2RlUGFzc3dvcmQgKGtleSkge1xuICByZXR1cm4gYCR7a2V5fWAucmVwbGFjZSgvXFxzL2lnLCAnJXMnKTtcbn07XG5cbmhlbHBlcnMuc3RyaW5nS2V5VG9BcnIgPSBmdW5jdGlvbiBzdHJpbmdLZXlUb0FyciAoa2V5KSB7XG4gIHJldHVybiBgJHtrZXl9YC50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnJykuc3BsaXQoL1xccyovKTtcbn07XG5cbmhlbHBlcnMuZmluZ2VycHJpbnRVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBmaW5nZXJwcmludFVubG9jayAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIHRocm93IG5ldyBFcnJvcignRmluZ2VycHJpbnQgdW5sb2NrIG9ubHkgd29ya3MgZm9yIEFuZHJvaWQgNisgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgYWRiLmZpbmdlcnByaW50KGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbn07XG5cbmhlbHBlcnMucGluVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gcGluVW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gdW5sb2NrIGRldmljZSB1c2luZyBwaW4gJHtjYXBhYmlsaXRpZXMudW5sb2NrS2V5fWApO1xuICBhd2FpdCBhZGIuZGlzbWlzc0tleWd1YXJkKCk7XG4gIGNvbnN0IGtleXMgPSBoZWxwZXJzLnN0cmluZ0tleVRvQXJyKGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPj0gMjEpIHtcbiAgICBjb25zdCBlbHMgPSBhd2FpdCBkcml2ZXIuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLnN5c3RlbXVpOmlkL2RpZ2l0X3RleHQnLCB0cnVlKTtcbiAgICBpZiAoXy5pc0VtcHR5KGVscykpIHtcbiAgICAgIC8vIGZhbGxiYWNrIHRvIHBpbiB3aXRoIGtleSBldmVudFxuICAgICAgcmV0dXJuIGF3YWl0IGhlbHBlcnMucGluVW5sb2NrV2l0aEtleUV2ZW50KGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpO1xuICAgIH1cbiAgICBjb25zdCBwaW5zID0ge307XG4gICAgZm9yIChjb25zdCBlbCBvZiBlbHMpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBkcml2ZXIuZ2V0QXR0cmlidXRlKCd0ZXh0JywgdXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gICAgICBwaW5zW3RleHRdID0gZWw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGluIG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGVsID0gcGluc1twaW5dO1xuICAgICAgYXdhaXQgZHJpdmVyLmNsaWNrKHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBpbiBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBlbCA9IGF3YWl0IGRyaXZlci5maW5kRWxPckVscygnaWQnLCBgY29tLmFuZHJvaWQua2V5Z3VhcmQ6aWQva2V5JHtwaW59YCwgZmFsc2UpO1xuICAgICAgaWYgKGVsID09PSBudWxsKSB7XG4gICAgICAgIC8vIGZhbGxiYWNrIHRvIHBpbiB3aXRoIGtleSBldmVudFxuICAgICAgICByZXR1cm4gYXdhaXQgaGVscGVycy5waW5VbmxvY2tXaXRoS2V5RXZlbnQoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcyk7XG4gICAgICB9XG4gICAgICBhd2FpdCBkcml2ZXIuY2xpY2sodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gICAgfVxuICB9XG4gIGF3YWl0IHdhaXRGb3JVbmxvY2soYWRiKTtcbn07XG5cbi8qKlxuICogV2FpdCBmb3IgdGhlIGRpc3BsYXkgdG8gYmUgdW5sb2NrZWQuXG4gKiBTb21lIGRldmljZXMgYXV0b21hdGljYWxseSBhY2NlcHQgdHlwZWQgJ3BpbicgYW5kICdwYXNzd29yZCcgY29kZVxuICogd2l0aG91dCBwcmVzc2luZyB0aGUgRW50ZXIga2V5LiBCdXQgc29tZSBkZXZpY2VzIG5lZWQgaXQuXG4gKiBUaGlzIG1ldGhvZCB3YWl0cyBhIGZldyBzZWNvbmRzIGZpcnN0IGZvciBzdWNoIGF1dG9tYXRpYyBhY2NlcHRhbmNlIGNhc2UuXG4gKiBJZiB0aGUgZGV2aWNlIGlzIHN0aWxsIGxvY2tlZCwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRyeSB0byBzZW5kXG4gKiB0aGUgZW50ZXIga2V5IGNvZGUuXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBUaGUgaW5zdGFuY2Ugb2YgQURCXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JVbmxvY2sgKGFkYikge1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbiAgaWYgKCFhd2FpdCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGFkYi5rZXlldmVudChLRVlDT0RFX05VTVBBRF9FTlRFUik7XG4gIGF3YWl0IHNsZWVwKFVOTE9DS19XQUlUX1RJTUUpO1xufVxuXG5oZWxwZXJzLnBpblVubG9ja1dpdGhLZXlFdmVudCA9IGFzeW5jIGZ1bmN0aW9uIHBpblVubG9ja1dpdGhLZXlFdmVudCAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvIHVubG9jayBkZXZpY2UgdXNpbmcgcGluIHdpdGgga2V5Y29kZSAke2NhcGFiaWxpdGllcy51bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgY29uc3Qga2V5cyA9IGhlbHBlcnMuc3RyaW5nS2V5VG9BcnIoY2FwYWJpbGl0aWVzLnVubG9ja0tleSk7XG5cbiAgLy8gU29tZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBzeXN0ZW0ga2V5IGlkcyBsaWtlICdjb20uYW5kcm9pZC5rZXlndWFyZDppZC9rZXknXG4gIC8vIFRoZW4sIHNlbmRpbmcga2V5ZXZlbnRzIGFyZSBtb3JlIHJlbGlhYmxlIHRvIHVubG9jayB0aGUgc2NyZWVuLlxuICBmb3IgKGNvbnN0IHBpbiBvZiBrZXlzKSB7XG4gICAgLy8gJ3BpbicgaXMgbnVtYmVyICgwLTkpIGluIHN0cmluZy5cbiAgICAvLyBOdW1iZXIgJzAnIGlzIGtleWNvZGUgJzcnLiBudW1iZXIgJzknIGlzIGtleWNvZGUgJzE2Jy5cbiAgICBhd2FpdCBhZGIuc2hlbGwoWydpbnB1dCcsICdrZXlldmVudCcsIHBhcnNlSW50KHBpbiwgMTApICsgTlVNQkVSX1pFUk9fS0VZQ09ERV0pO1xuICB9XG4gIGF3YWl0IHdhaXRGb3JVbmxvY2soYWRiLCBkcml2ZXIpO1xufTtcblxuaGVscGVycy5wYXNzd29yZFVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHBhc3N3b3JkVW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGNvbnN0IHsgdW5sb2NrS2V5IH0gPSBjYXBhYmlsaXRpZXM7XG4gIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gdW5sb2NrIGRldmljZSB1c2luZyBwYXNzd29yZCAke3VubG9ja0tleX1gKTtcbiAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICAvLyBSZXBsYWNlIGJsYW5rIHNwYWNlcyB3aXRoICVzXG4gIGNvbnN0IGtleSA9IGhlbHBlcnMuZW5jb2RlUGFzc3dvcmQodW5sb2NrS2V5KTtcbiAgLy8gV2h5IGFkYiA/IEl0IHdhcyBsZXNzIGZsYWt5XG4gIGF3YWl0IGFkYi5zaGVsbChbJ2lucHV0JywgJ3RleHQnLCBrZXldKTtcbiAgLy8gV2h5IHNsZWVwcyA/IEF2b2lkIHNvbWUgZmxha3luZXNzIHdhaXRpbmcgZm9yIHRoZSBpbnB1dCB0byByZWNlaXZlIHRoZSBrZXlzXG4gIGF3YWl0IHNsZWVwKElOUFVUX0tFWVNfV0FJVF9USU1FKTtcbiAgYXdhaXQgYWRiLnNoZWxsKFsnaW5wdXQnLCAna2V5ZXZlbnQnLCBLRVlDT0RFX05VTVBBRF9FTlRFUl0pO1xuICAvLyBXYWl0cyBhIGJpdCBmb3IgdGhlIGRldmljZSB0byBiZSB1bmxvY2tlZFxuICBhd2FpdCB3YWl0Rm9yVW5sb2NrKGFkYiwgZHJpdmVyKTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybktleVBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0UGF0dGVybktleVBvc2l0aW9uIChrZXksIGluaXRQb3MsIHBpZWNlKSB7XG4gIC8qXG4gIEhvdyB0aGUgbWF0aCB3b3JrczpcbiAgV2UgaGF2ZSA5IGJ1dHRvbnMgZGl2aWRlZCBpbiAzIGNvbHVtbnMgYW5kIDMgcm93cyBpbnNpZGUgdGhlIGxvY2tQYXR0ZXJuVmlldyxcbiAgZXZlcnkgYnV0dG9uIGhhcyBhIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4gY29ycmVzcG9uZGluZyB0byB0aGUgbG9ja1BhdHRlcm5WaWV3IHNpbmNlXG4gIGl0IGlzIHRoZSBwYXJlbnQgdmlldyByaWdodCBhdCB0aGUgbWlkZGxlIG9mIGVhY2ggY29sdW1uIG9yIHJvdy5cbiAgKi9cbiAgY29uc3QgY29scyA9IDM7XG4gIGNvbnN0IHBpbnMgPSA5O1xuICBjb25zdCB4UG9zID0gKGtleSwgeCwgcGllY2UpID0+IE1hdGgucm91bmQoeCArICgoa2V5ICUgY29scykgfHwgY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMik7XG4gIGNvbnN0IHlQb3MgPSAoa2V5LCB5LCBwaWVjZSkgPT4gTWF0aC5yb3VuZCh5ICsgKE1hdGguY2VpbCgoKGtleSAlIHBpbnMpIHx8IHBpbnMpIC8gY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMikpO1xuICByZXR1cm4ge1xuICAgIHg6IHhQb3Moa2V5LCBpbml0UG9zLngsIHBpZWNlKSxcbiAgICB5OiB5UG9zKGtleSwgaW5pdFBvcy55LCBwaWVjZSlcbiAgfTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybkFjdGlvbnMgPSBmdW5jdGlvbiBnZXRQYXR0ZXJuQWN0aW9ucyAoa2V5cywgaW5pdFBvcywgcGllY2UpIHtcbiAgY29uc3QgYWN0aW9ucyA9IFtdO1xuICBsZXQgbGFzdFBvcztcbiAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCBrZXlQb3MgPSBoZWxwZXJzLmdldFBhdHRlcm5LZXlQb3NpdGlvbihrZXksIGluaXRQb3MsIHBpZWNlKTtcbiAgICBpZiAoa2V5ID09PSBrZXlzWzBdKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe2FjdGlvbjogJ3ByZXNzJywgb3B0aW9uczoge2VsZW1lbnQ6IG51bGwsIHg6IGtleVBvcy54LCB5OiBrZXlQb3MueX19KTtcbiAgICAgIGxhc3RQb3MgPSBrZXlQb3M7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbW92ZVRvID0ge3g6IDAsIHk6IDB9O1xuICAgIGNvbnN0IGRpZmZYID0ga2V5UG9zLnggLSBsYXN0UG9zLng7XG4gICAgaWYgKGRpZmZYID4gMCkge1xuICAgICAgbW92ZVRvLnggPSBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWCkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueCArPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpZmZYIDwgMCkge1xuICAgICAgbW92ZVRvLnggPSAtMSAqIHBpZWNlO1xuICAgICAgaWYgKE1hdGguYWJzKGRpZmZYKSA+IHBpZWNlKSB7XG4gICAgICAgIG1vdmVUby54IC09IHBpZWNlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaWZmWSA9IGtleVBvcy55IC0gbGFzdFBvcy55O1xuICAgIGlmIChkaWZmWSA+IDApIHtcbiAgICAgIG1vdmVUby55ID0gcGllY2U7XG4gICAgICBpZiAoTWF0aC5hYnMoZGlmZlkpID4gcGllY2UpIHtcbiAgICAgICAgbW92ZVRvLnkgKz0gcGllY2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkaWZmWSA8IDApIHtcbiAgICAgIG1vdmVUby55ID0gLTEgKiBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWSkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueSAtPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ21vdmVUbycsXG4gICAgICBvcHRpb25zOiB7ZWxlbWVudDogbnVsbCwgeDogbW92ZVRvLnggKyBsYXN0UG9zLngsIHk6IG1vdmVUby55ICsgbGFzdFBvcy55fVxuICAgIH0pO1xuICAgIGxhc3RQb3MgPSBrZXlQb3M7XG4gIH1cbiAgYWN0aW9ucy5wdXNoKHthY3Rpb246ICdyZWxlYXNlJ30pO1xuICByZXR1cm4gYWN0aW9ucztcbn07XG5cbmhlbHBlcnMucGF0dGVyblVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHBhdHRlcm5VbmxvY2sgKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpIHtcbiAgY29uc3QgeyB1bmxvY2tLZXkgfSA9IGNhcGFiaWxpdGllcztcbiAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byB1bmxvY2sgZGV2aWNlIHVzaW5nIHBhdHRlcm4gJHt1bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgY29uc3Qga2V5cyA9IGhlbHBlcnMuc3RyaW5nS2V5VG9BcnIodW5sb2NrS2V5KTtcbiAgLyogV2Ugc2V0IHRoZSBkZXZpY2UgcGF0dGVybiBidXR0b25zIGFzIG51bWJlciBvZiBhIHJlZ3VsYXIgcGhvbmVcbiAgICogIHwg4oCiIOKAoiDigKIgfCAgICAgfCAxIDIgMyB8XG4gICAqICB8IOKAoiDigKIg4oCiIHwgLS0+IHwgNCA1IDYgfFxuICAgKiAgfCDigKIg4oCiIOKAoiB8ICAgICB8IDcgOCA5IHxcblxuICBUaGUgcGF0dGVybiB2aWV3IGJ1dHRvbnMgYXJlIG5vdCBzZWVpbmcgYnkgdGhlIHVpYXV0b21hdG9yIHNpbmNlIHRoZXkgYXJlXG4gIGluY2x1ZGVkIGluc2lkZSBhIEZyYW1lTGF5b3V0LCBzbyB3ZSBhcmUgZ29pbmcgdG8gdHJ5IGNsaWNraW5nIG9uIHRoZSBidXR0b25zXG4gIHVzaW5nIHRoZSBwYXJlbnQgdmlldyBib3VuZHMgYW5kIG1hdGguXG4gICovXG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgYWRiLmdldEFwaUxldmVsKCk7XG4gIGNvbnN0IGVsID0gYXdhaXQgZHJpdmVyLmZpbmRFbE9yRWxzKCdpZCcsXG4gICAgYGNvbS5hbmRyb2lkLiR7YXBpTGV2ZWwgPj0gMjEgPyAnc3lzdGVtdWknIDogJ2tleWd1YXJkJ306aWQvbG9ja1BhdHRlcm5WaWV3YCxcbiAgICBmYWxzZVxuICApO1xuICBjb25zdCBpbml0UG9zID0gYXdhaXQgZHJpdmVyLmdldExvY2F0aW9uKHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICBjb25zdCBzaXplID0gYXdhaXQgZHJpdmVyLmdldFNpemUodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gIC8vIEdldCBhY3Rpb25zIHRvIHBlcmZvcm1cbiAgY29uc3QgYWN0aW9ucyA9IGhlbHBlcnMuZ2V0UGF0dGVybkFjdGlvbnMoa2V5cywgaW5pdFBvcywgc2l6ZS53aWR0aCAvIDMpO1xuICAvLyBQZXJmb3JtIGdlc3R1cmVcbiAgYXdhaXQgZHJpdmVyLnBlcmZvcm1Ub3VjaChhY3Rpb25zKTtcbiAgLy8gV2FpdHMgYSBiaXQgZm9yIHRoZSBkZXZpY2UgdG8gYmUgdW5sb2NrZWRcbiAgYXdhaXQgc2xlZXAoVU5MT0NLX1dBSVRfVElNRSk7XG59O1xuXG5oZWxwZXJzLlBJTl9VTkxPQ0sgPSBQSU5fVU5MT0NLO1xuaGVscGVycy5QSU5fVU5MT0NLX0tFWV9FVkVOVCA9IFBJTl9VTkxPQ0tfS0VZX0VWRU5UO1xuaGVscGVycy5QQVNTV09SRF9VTkxPQ0sgPSBQQVNTV09SRF9VTkxPQ0s7XG5oZWxwZXJzLlBBVFRFUk5fVU5MT0NLID0gUEFUVEVSTl9VTkxPQ0s7XG5oZWxwZXJzLkZJTkdFUlBSSU5UX1VOTE9DSyA9IEZJTkdFUlBSSU5UX1VOTE9DSztcblxuZXhwb3J0IHtcbiAgUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIFBBU1NXT1JEX1VOTE9DSywgUEFUVEVSTl9VTkxPQ0ssXG4gIEZJTkdFUlBSSU5UX1VOTE9DSywgaGVscGVyc1xufTtcbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG4iXSwiZmlsZSI6ImxpYi91bmxvY2staGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9