appium-android-driver 5.4.3 → 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 +1 -1
@@ -1,68 +1,49 @@
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.setupNewChromedriver = exports.helpers = exports.default = exports.commands = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _lodash = _interopRequireDefault(require("lodash"));
13
-
14
10
  var _appiumChromedriver = _interopRequireDefault(require("appium-chromedriver"));
15
-
16
11
  var _portfinder = _interopRequireDefault(require("portfinder"));
17
-
18
12
  var _bluebird = _interopRequireDefault(require("bluebird"));
19
-
20
13
  var _support = require("appium/support");
21
-
22
14
  var _driver = require("appium/driver");
23
-
24
15
  var _webviewHelpers = _interopRequireWildcard(require("../webview-helpers"));
25
-
26
16
  var _androidHelpers = require("../android-helpers");
27
-
28
17
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
-
30
18
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
31
-
32
19
  const CHROMEDRIVER_AUTODOWNLOAD_FEATURE = 'chromedriver_autodownload';
33
20
  let commands = {},
34
- helpers = {},
35
- extensions = {};
21
+ helpers = {},
22
+ extensions = {};
23
+
36
24
  exports.helpers = helpers;
37
25
  exports.commands = commands;
38
-
39
26
  commands.getCurrentContext = async function getCurrentContext() {
40
27
  return this.curContext || this.defaultContextName();
41
28
  };
42
-
43
29
  commands.getContexts = async function getContexts() {
44
30
  const webviewsMapping = await _webviewHelpers.default.getWebViewsMapping(this.adb, this.opts);
45
31
  return this.assignContexts(webviewsMapping);
46
32
  };
47
-
48
33
  commands.setContext = async function setContext(name) {
49
34
  if (!_support.util.hasValue(name)) {
50
35
  name = this.defaultContextName();
51
36
  } else if (name === _webviewHelpers.WEBVIEW_WIN) {
52
37
  name = this.defaultWebviewName();
53
38
  }
54
-
55
39
  if (name === this.curContext) {
56
40
  return;
57
41
  }
58
-
59
42
  const webviewsMapping = await _webviewHelpers.default.getWebViewsMapping(this.adb, this.opts);
60
43
  const contexts = this.assignContexts(webviewsMapping);
61
-
62
44
  if (!_lodash.default.includes(contexts, name)) {
63
45
  throw new _driver.errors.NoSuchContextError();
64
46
  }
65
-
66
47
  await this.switchContext(name, webviewsMapping);
67
48
  this.curContext = name;
68
49
  };
@@ -76,19 +57,15 @@ commands.mobileGetContexts = async function mobileGetContexts() {
76
57
  };
77
58
  return await _webviewHelpers.default.getWebViewsMapping(this.adb, opts);
78
59
  };
79
-
80
60
  helpers.assignContexts = function assignContexts(webviewsMapping) {
81
61
  const opts = Object.assign({
82
62
  isChromeSession: this.isChromeSession
83
63
  }, this.opts);
84
-
85
64
  const webviews = _webviewHelpers.default.parseWebviewNames(webviewsMapping, opts);
86
-
87
65
  this.contexts = [_webviewHelpers.NATIVE_WIN, ...webviews];
88
66
  this.log.debug(`Available contexts: ${JSON.stringify(this.contexts)}`);
89
67
  return this.contexts;
90
68
  };
91
-
92
69
  helpers.switchContext = async function switchContext(name, webviewsMapping) {
93
70
  if (this.isChromedriverContext(name)) {
94
71
  await this.startChromedriverProxy(name, webviewsMapping);
@@ -107,11 +84,9 @@ helpers.switchContext = async function switchContext(name, webviewsMapping) {
107
84
  helpers.defaultContextName = function defaultContextName() {
108
85
  return _webviewHelpers.NATIVE_WIN;
109
86
  };
110
-
111
87
  helpers.defaultWebviewName = function defaultWebviewName() {
112
88
  return _webviewHelpers.WEBVIEW_BASE + this.opts.appPackage;
113
89
  };
114
-
115
90
  helpers.isWebContext = function isWebContext() {
116
91
  return this.curContext !== null && this.curContext !== _webviewHelpers.NATIVE_WIN;
117
92
  };
@@ -119,34 +94,27 @@ helpers.isWebContext = function isWebContext() {
119
94
  helpers.startChromedriverProxy = async function startChromedriverProxy(context, webviewsMapping) {
120
95
  this.log.debug(`Connecting to chrome-backed webview context '${context}'`);
121
96
  let cd;
122
-
123
97
  if (this.sessionChromedrivers[context]) {
124
98
  this.log.debug(`Found existing Chromedriver for context '${context}'. Using it.`);
125
99
  cd = this.sessionChromedrivers[context];
126
100
  await setupExistingChromedriver(this.log, cd);
127
101
  } else {
128
102
  let opts = _lodash.default.cloneDeep(this.opts);
129
-
130
103
  opts.chromeUseRunningApp = true;
131
104
 
132
105
  if (opts.extractChromeAndroidPackageFromContextName || context === `${_webviewHelpers.WEBVIEW_BASE}chrome`) {
133
106
  let androidPackage = context.match(`${_webviewHelpers.WEBVIEW_BASE}(.+)`);
134
-
135
107
  if (androidPackage && androidPackage.length > 0) {
136
108
  opts.chromeAndroidPackage = androidPackage[1];
137
109
  }
138
-
139
110
  if (!opts.extractChromeAndroidPackageFromContextName) {
140
111
  if (_lodash.default.has(this.opts, 'enableWebviewDetailsCollection') && !this.opts.enableWebviewDetailsCollection) {
141
112
  const contexts = webviewsMapping.map(wm => wm.webviewName);
142
-
143
113
  for (const knownPackage of _webviewHelpers.KNOWN_CHROME_PACKAGE_NAMES) {
144
114
  if (_lodash.default.includes(contexts, `${_webviewHelpers.WEBVIEW_BASE}${knownPackage}`)) {
145
115
  continue;
146
116
  }
147
-
148
117
  const appState = await this.queryAppState(knownPackage);
149
-
150
118
  if (_lodash.default.includes([_androidHelpers.APP_STATE.RUNNING_IN_BACKGROUND, _androidHelpers.APP_STATE.RUNNING_IN_FOREGROUND], appState)) {
151
119
  opts.chromeAndroidPackage = knownPackage;
152
120
  this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` + `for context '${context}' by querying states of Chrome app packages`);
@@ -164,7 +132,6 @@ helpers.startChromedriverProxy = async function startChromedriverProxy(context,
164
132
  }
165
133
  }
166
134
  }
167
-
168
135
  cd = await this.setupNewChromedriver(opts, this.adb.curDeviceId, this.adb, context);
169
136
  cd.on(_appiumChromedriver.default.EVENT_CHANGED, msg => {
170
137
  if (msg.state === _appiumChromedriver.default.STATE_STOPPED) {
@@ -173,7 +140,6 @@ helpers.startChromedriverProxy = async function startChromedriverProxy(context,
173
140
  });
174
141
  this.sessionChromedrivers[context] = cd;
175
142
  }
176
-
177
143
  this.chromedriver = cd;
178
144
  this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);
179
145
  this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);
@@ -189,7 +155,6 @@ helpers.suspendChromedriverProxy = function suspendChromedriverProxy() {
189
155
 
190
156
  helpers.onChromedriverStop = async function onChromedriverStop(context) {
191
157
  this.log.warn(`Chromedriver for context ${context} stopped unexpectedly`);
192
-
193
158
  if (context === this.curContext) {
194
159
  let err = new Error('Chromedriver quit unexpectedly during session');
195
160
  await this.startUnexpectedShutdown(err);
@@ -201,42 +166,33 @@ helpers.onChromedriverStop = async function onChromedriverStop(context) {
201
166
 
202
167
  helpers.stopChromedriverProxies = async function stopChromedriverProxies() {
203
168
  this.suspendChromedriverProxy();
204
-
205
169
  for (let context of _lodash.default.keys(this.sessionChromedrivers)) {
206
170
  let cd = this.sessionChromedrivers[context];
207
171
  this.log.debug(`Stopping chromedriver for context ${context}`);
208
172
  cd.removeAllListeners(_appiumChromedriver.default.EVENT_CHANGED);
209
-
210
173
  try {
211
174
  await cd.stop();
212
175
  } catch (err) {
213
176
  this.log.warn(`Error stopping Chromedriver: ${err.message}`);
214
177
  }
215
-
216
178
  delete this.sessionChromedrivers[context];
217
179
  }
218
180
  };
219
-
220
181
  helpers.isChromedriverContext = function isChromedriverContext(viewName) {
221
182
  return _lodash.default.includes(viewName, _webviewHelpers.WEBVIEW_WIN) || viewName === _webviewHelpers.CHROMIUM_WIN;
222
183
  };
223
-
224
184
  helpers.shouldDismissChromeWelcome = function shouldDismissChromeWelcome() {
225
185
  return !!this.opts.chromeOptions && _lodash.default.isArray(this.opts.chromeOptions.args) && this.opts.chromeOptions.args.includes('--no-first-run');
226
186
  };
227
-
228
187
  helpers.dismissChromeWelcome = async function dismissChromeWelcome() {
229
188
  this.log.info('Trying to dismiss Chrome welcome');
230
189
  let activity = await this.getCurrentActivity();
231
-
232
190
  if (activity !== 'org.chromium.chrome.browser.firstrun.FirstRunActivity') {
233
191
  this.log.info('Chrome welcome dialog never showed up! Continuing');
234
192
  return;
235
193
  }
236
-
237
194
  let el = await this.findElOrEls('id', 'com.android.chrome:id/terms_accept', false);
238
195
  await this.click(el.ELEMENT);
239
-
240
196
  try {
241
197
  let el = await this.findElOrEls('id', 'com.android.chrome:id/negative_button', false);
242
198
  await this.click(el.ELEMENT);
@@ -244,32 +200,27 @@ helpers.dismissChromeWelcome = async function dismissChromeWelcome() {
244
200
  this.log.warn(`This device did not show Chrome SignIn dialog, ${e.message}`);
245
201
  }
246
202
  };
247
-
248
203
  helpers.startChromeSession = async function startChromeSession() {
249
204
  this.log.info('Starting a chrome-based browser session');
250
-
251
205
  let opts = _lodash.default.cloneDeep(this.opts);
252
-
253
206
  const knownPackages = ['org.chromium.chrome.shell', 'com.android.chrome', 'com.chrome.beta', 'org.chromium.chrome', 'org.chromium.webview_shell'];
254
-
255
207
  if (_lodash.default.includes(knownPackages, this.opts.appPackage)) {
256
208
  opts.chromeBundleId = this.opts.appPackage;
257
209
  } else {
258
210
  opts.chromeAndroidActivity = this.opts.appActivity;
259
211
  }
260
-
261
212
  this.chromedriver = await this.setupNewChromedriver(opts, this.adb.curDeviceId, this.adb);
262
213
  this.chromedriver.on(_appiumChromedriver.default.EVENT_CHANGED, msg => {
263
214
  if (msg.state === _appiumChromedriver.default.STATE_STOPPED) {
264
215
  this.onChromedriverStop(_webviewHelpers.CHROMIUM_WIN);
265
216
  }
266
217
  });
218
+
267
219
  this.curContext = _webviewHelpers.CHROMIUM_WIN;
268
220
  this.sessionChromedrivers[_webviewHelpers.CHROMIUM_WIN] = this.chromedriver;
269
221
  this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);
270
222
  this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);
271
223
  this.jwpProxyActive = true;
272
-
273
224
  if (this.shouldDismissChromeWelcome()) {
274
225
  await this.dismissChromeWelcome();
275
226
  }
@@ -280,7 +231,6 @@ async function setupExistingChromedriver(log, chromedriver) {
280
231
  log.debug('ChromeDriver is not associated with a window. ' + 'Re-initializing the session.');
281
232
  await chromedriver.restart();
282
233
  }
283
-
284
234
  return chromedriver;
285
235
  }
286
236
 
@@ -297,17 +247,14 @@ async function getChromedriverPort(portSpec, log = null) {
297
247
 
298
248
  log === null || log === void 0 ? void 0 : log.debug(`Finding a free port for chromedriver using spec ${JSON.stringify(portSpec)}`);
299
249
  let foundPort = null;
300
-
301
250
  for (const potentialPort of portSpec) {
302
251
  let port, stopPort;
303
-
304
252
  if (_lodash.default.isArray(potentialPort)) {
305
253
  [port, stopPort] = potentialPort;
306
254
  } else {
307
255
  port = parseInt(potentialPort, 10);
308
256
  stopPort = port;
309
257
  }
310
-
311
258
  try {
312
259
  log === null || log === void 0 ? void 0 : log.debug(`Checking port range ${port}:${stopPort}`);
313
260
  foundPort = await getPort({
@@ -319,52 +266,38 @@ async function getChromedriverPort(portSpec, log = null) {
319
266
  log === null || log === void 0 ? void 0 : log.debug(`Nothing in port range ${port}:${stopPort} was available`);
320
267
  }
321
268
  }
322
-
323
269
  if (foundPort === null) {
324
270
  throw new Error(`Could not find a free port for chromedriver using ` + `chromedriverPorts spec ${JSON.stringify(portSpec)}`);
325
271
  }
326
-
327
272
  log === null || log === void 0 ? void 0 : log.debug(`Using free port ${foundPort} for chromedriver`);
328
273
  return foundPort;
329
274
  }
330
-
331
275
  helpers.isChromedriverAutodownloadEnabled = function isChromedriverAutodownloadEnabled() {
332
276
  var _this$log;
333
-
334
277
  if (this.isFeatureEnabled(CHROMEDRIVER_AUTODOWNLOAD_FEATURE)) {
335
278
  return true;
336
279
  }
337
-
338
280
  this === null || this === void 0 ? void 0 : (_this$log = this.log) === null || _this$log === void 0 ? void 0 : _this$log.debug(`Automated Chromedriver download is disabled. ` + `Use '${CHROMEDRIVER_AUTODOWNLOAD_FEATURE}' server feature to enable it`);
339
281
  return false;
340
282
  };
341
-
342
283
  helpers.setupNewChromedriver = async function setupNewChromedriver(opts, curDeviceId, adb, context = null) {
343
284
  var _this$isChromedriverA, _this$log6;
344
-
345
285
  if (opts.chromeDriverPort) {
346
286
  var _this$log2;
347
-
348
287
  this === null || this === void 0 ? void 0 : (_this$log2 = this.log) === null || _this$log2 === void 0 ? void 0 : _this$log2.warn(`The 'chromeDriverPort' capability is deprecated. Please use 'chromedriverPort' instead`);
349
288
  opts.chromedriverPort = opts.chromeDriverPort;
350
289
  }
351
-
352
290
  if (opts.chromedriverPort) {
353
291
  var _this$log3;
354
-
355
292
  this === null || this === void 0 ? void 0 : (_this$log3 = this.log) === null || _this$log3 === void 0 ? void 0 : _this$log3.debug(`Using user-specified port ${opts.chromedriverPort} for chromedriver`);
356
293
  } else {
357
294
  opts.chromedriverPort = await getChromedriverPort(opts.chromedriverPorts, this === null || this === void 0 ? void 0 : this.log);
358
295
  }
359
-
360
296
  const details = context ? _webviewHelpers.default.getWebviewDetails(adb, context) : undefined;
361
-
362
297
  if (!_lodash.default.isEmpty(details)) {
363
298
  var _this$log4;
364
-
365
299
  this === null || this === void 0 ? void 0 : (_this$log4 = this.log) === null || _this$log4 === void 0 ? void 0 : _this$log4.debug('Passing web view details to the Chromedriver constructor: ' + JSON.stringify(details, null, 2));
366
300
  }
367
-
368
301
  const chromedriver = new _appiumChromedriver.default({
369
302
  port: opts.chromedriverPort,
370
303
  executable: opts.chromedriverExecutable,
@@ -379,28 +312,23 @@ helpers.setupNewChromedriver = async function setupNewChromedriver(opts, curDevi
379
312
  details,
380
313
  isAutodownloadEnabled: this === null || this === void 0 ? void 0 : (_this$isChromedriverA = this.isChromedriverAutodownloadEnabled) === null || _this$isChromedriverA === void 0 ? void 0 : _this$isChromedriverA.call(this)
381
314
  });
382
- opts.chromeOptions = opts.chromeOptions || {};
383
315
 
316
+ opts.chromeOptions = opts.chromeOptions || {};
384
317
  for (const opt of _lodash.default.keys(opts)) {
385
318
  if (opt.endsWith(':chromeOptions')) {
386
319
  var _this$log5;
387
-
388
320
  this === null || this === void 0 ? void 0 : (_this$log5 = this.log) === null || _this$log5 === void 0 ? void 0 : _this$log5.warn(`Merging '${opt}' into 'chromeOptions'. This may cause unexpected behavior`);
389
-
390
321
  _lodash.default.merge(opts.chromeOptions, opts[opt]);
391
322
  }
392
323
  }
393
-
394
324
  const caps = _webviewHelpers.default.createChromedriverCaps(opts, curDeviceId, details);
395
-
396
325
  this === null || this === void 0 ? void 0 : (_this$log6 = this.log) === null || _this$log6 === void 0 ? void 0 : _this$log6.debug(`Before starting chromedriver, androidPackage is '${caps.chromeOptions.androidPackage}'`);
397
326
  await chromedriver.start(caps);
398
327
  return chromedriver;
399
328
  };
400
-
401
329
  const setupNewChromedriver = helpers.setupNewChromedriver;
402
330
  exports.setupNewChromedriver = setupNewChromedriver;
403
331
  Object.assign(extensions, commands, helpers);
404
332
  var _default = extensions;
405
333
  exports.default = _default;
406
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZ2V0Q3VycmVudENvbnRleHQiLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiZ2V0Q29udGV4dHMiLCJ3ZWJ2aWV3c01hcHBpbmciLCJ3ZWJ2aWV3SGVscGVycyIsImdldFdlYlZpZXdzTWFwcGluZyIsImFkYiIsIm9wdHMiLCJhc3NpZ25Db250ZXh0cyIsInNldENvbnRleHQiLCJuYW1lIiwidXRpbCIsImhhc1ZhbHVlIiwiV0VCVklFV19XSU4iLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjb250ZXh0cyIsIl8iLCJpbmNsdWRlcyIsImVycm9ycyIsIk5vU3VjaENvbnRleHRFcnJvciIsInN3aXRjaENvbnRleHQiLCJtb2JpbGVHZXRDb250ZXh0cyIsImFuZHJvaWREZXZpY2VTb2NrZXQiLCJlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyIsIndlYnZpZXdEZXZ0b29sc1BvcnQiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJPYmplY3QiLCJhc3NpZ24iLCJpc0Nocm9tZVNlc3Npb24iLCJ3ZWJ2aWV3cyIsInBhcnNlV2Vidmlld05hbWVzIiwiTkFUSVZFX1dJTiIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzQ2hyb21lZHJpdmVyQ29udGV4dCIsInN0YXJ0Q2hyb21lZHJpdmVyUHJveHkiLCJyZWNyZWF0ZUNocm9tZURyaXZlclNlc3Npb25zIiwic3RvcENocm9tZWRyaXZlclByb3hpZXMiLCJzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkiLCJFcnJvciIsIldFQlZJRVdfQkFTRSIsImFwcFBhY2thZ2UiLCJpc1dlYkNvbnRleHQiLCJjb250ZXh0IiwiY2QiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsInNldHVwRXhpc3RpbmdDaHJvbWVkcml2ZXIiLCJjbG9uZURlZXAiLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiZXh0cmFjdENocm9tZUFuZHJvaWRQYWNrYWdlRnJvbUNvbnRleHROYW1lIiwiYW5kcm9pZFBhY2thZ2UiLCJtYXRjaCIsImxlbmd0aCIsImNocm9tZUFuZHJvaWRQYWNrYWdlIiwiaGFzIiwibWFwIiwid20iLCJ3ZWJ2aWV3TmFtZSIsImtub3duUGFja2FnZSIsIktOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIiwiYXBwU3RhdGUiLCJxdWVyeUFwcFN0YXRlIiwiQVBQX1NUQVRFIiwiUlVOTklOR19JTl9CQUNLR1JPVU5EIiwiUlVOTklOR19JTl9GT1JFR1JPVU5EIiwiaW5mbyIsInNldHVwTmV3Q2hyb21lZHJpdmVyIiwiY3VyRGV2aWNlSWQiLCJvbiIsIkNocm9tZWRyaXZlciIsIkVWRU5UX0NIQU5HRUQiLCJtc2ciLCJzdGF0ZSIsIlNUQVRFX1NUT1BQRUQiLCJvbkNocm9tZWRyaXZlclN0b3AiLCJjaHJvbWVkcml2ZXIiLCJwcm94eVJlcVJlcyIsInByb3h5UmVxIiwiYmluZCIsInByb3h5Q29tbWFuZCIsImp3cHJveHkiLCJjb21tYW5kIiwiandwUHJveHlBY3RpdmUiLCJ3YXJuIiwiZXJyIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJrZXlzIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RvcCIsIm1lc3NhZ2UiLCJ2aWV3TmFtZSIsIkNIUk9NSVVNX1dJTiIsInNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lIiwiY2hyb21lT3B0aW9ucyIsImlzQXJyYXkiLCJhcmdzIiwiZGlzbWlzc0Nocm9tZVdlbGNvbWUiLCJhY3Rpdml0eSIsImdldEN1cnJlbnRBY3Rpdml0eSIsImVsIiwiZmluZEVsT3JFbHMiLCJjbGljayIsIkVMRU1FTlQiLCJlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwia25vd25QYWNrYWdlcyIsImNocm9tZUJ1bmRsZUlkIiwiY2hyb21lQW5kcm9pZEFjdGl2aXR5IiwiYXBwQWN0aXZpdHkiLCJoYXNXb3JraW5nV2VidmlldyIsInJlc3RhcnQiLCJnZXRDaHJvbWVkcml2ZXJQb3J0IiwicG9ydFNwZWMiLCJnZXRQb3J0IiwiQiIsInByb21pc2lmeSIsIlBvcnRGaW5kZXIiLCJwb3J0IiwiZm91bmRQb3J0IiwicG90ZW50aWFsUG9ydCIsInN0b3BQb3J0IiwicGFyc2VJbnQiLCJpc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQiLCJpc0ZlYXR1cmVFbmFibGVkIiwiY2hyb21lRHJpdmVyUG9ydCIsImNocm9tZWRyaXZlclBvcnQiLCJjaHJvbWVkcml2ZXJQb3J0cyIsImRldGFpbHMiLCJnZXRXZWJ2aWV3RGV0YWlscyIsInVuZGVmaW5lZCIsImlzRW1wdHkiLCJleGVjdXRhYmxlIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZSIsImNtZEFyZ3MiLCJjaHJvbWVkcml2ZXJBcmdzIiwidmVyYm9zZSIsInNob3dDaHJvbWVkcml2ZXJMb2ciLCJleGVjdXRhYmxlRGlyIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZURpciIsIm1hcHBpbmdQYXRoIiwiY2hyb21lZHJpdmVyQ2hyb21lTWFwcGluZ0ZpbGUiLCJidW5kbGVJZCIsInVzZVN5c3RlbUV4ZWN1dGFibGUiLCJjaHJvbWVkcml2ZXJVc2VTeXN0ZW1FeGVjdXRhYmxlIiwiZGlzYWJsZUJ1aWxkQ2hlY2siLCJjaHJvbWVkcml2ZXJEaXNhYmxlQnVpbGRDaGVjayIsImlzQXV0b2Rvd25sb2FkRW5hYmxlZCIsIm9wdCIsImVuZHNXaXRoIiwibWVyZ2UiLCJjYXBzIiwiY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyIsInN0YXJ0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2NvbnRleHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBDaHJvbWVkcml2ZXIgZnJvbSAnYXBwaXVtLWNocm9tZWRyaXZlcic7XG5pbXBvcnQgUG9ydEZpbmRlciBmcm9tICdwb3J0ZmluZGVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7XG4gIGRlZmF1bHQgYXMgd2Vidmlld0hlbHBlcnMsXG4gIE5BVElWRV9XSU4sIFdFQlZJRVdfQkFTRSwgV0VCVklFV19XSU4sIENIUk9NSVVNX1dJTiwgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVNcbn0gZnJvbSAnLi4vd2Vidmlldy1oZWxwZXJzJztcbmltcG9ydCB7IEFQUF9TVEFURSB9IGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICdjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFjdHVhbCBNSlNPTldQIGNvbW1hbmQgaGFuZGxlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbW1hbmRzLmdldEN1cnJlbnRDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudENvbnRleHQgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgLy8gaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBgbnVsbGAsIGluZGljYXRpbmcgbm8gY29udGV4dFxuICAvLyBleHBsaWNpdGx5IHNldCwgaXQgaXMgdGhlIGRlZmF1bHQgY29udGV4dFxuICByZXR1cm4gdGhpcy5jdXJDb250ZXh0IHx8IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG59O1xuXG5jb21tYW5kcy5nZXRDb250ZXh0cyA9IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHRzICgpIHtcbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICByZXR1cm4gdGhpcy5hc3NpZ25Db250ZXh0cyh3ZWJ2aWV3c01hcHBpbmcpO1xufTtcblxuY29tbWFuZHMuc2V0Q29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHNldENvbnRleHQgKG5hbWUpIHtcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG5hbWUpKSB7XG4gICAgbmFtZSA9IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gV0VCVklFV19XSU4pIHtcbiAgICAvLyBoYW5kbGUgc2V0Q29udGV4dCBcIldFQlZJRVdcIlxuICAgIG5hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICB9XG4gIC8vIGlmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgd2Ugd2FudCwgZG8gbm90aGluZ1xuICBpZiAobmFtZSA9PT0gdGhpcy5jdXJDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBjb25zdCBjb250ZXh0cyA9IHRoaXMuYXNzaWduQ29udGV4dHMod2Vidmlld3NNYXBwaW5nKTtcbiAgLy8gaWYgdGhlIGNvbnRleHQgd2Ugd2FudCBkb2Vzbid0IGV4aXN0LCBmYWlsXG4gIGlmICghXy5pbmNsdWRlcyhjb250ZXh0cywgbmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaENvbnRleHRFcnJvcigpO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5zd2l0Y2hDb250ZXh0KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIHRoaXMuY3VyQ29udGV4dCA9IG5hbWU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdzTWFwcGluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgVGhlIG5hbWUgb2YgdGhlIERldnRvb2xzIFVuaXggc29ja2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBUaGUgd2ViIHZpZXcgYWxpYXMuIExvb2tzIGxpa2UgYFdFQlZJRVdfYFxuICogcHJlZml4IHBsdXMgUElEIG9yIHBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFdlYnZpZXcgaW5mb3JtYXRpb24gYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludFxuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgV2VidmlldyBwYWdlcyBsaXN0IGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vbGlzdCBDRFAgZW5kcG9pbnRcbiAqIEBwcm9wZXJ5IHs/c3RyaW5nfSB3ZWJ2aWV3TmFtZSBBbiBhY3R1YWwgd2VidmlldyBuYW1lIGZvciBzd2l0Y2hpbmcgY29udGV4dC5cbiAqIFRoaXMgdmFsdWUgYmVjb21lcyBudWxsIHdoZW4gZmFpbGluZyB0byBmaW5kIGEgUElEIGZvciBhIHdlYnZpZXcuXG4gKlxuICogVGhlIGZvbGxvd2luZyBqc29uIGRlbW9uc3RyYXRlcyB0aGUgZXhhbXBsZSBvZiBXZWJ2aWV3c01hcHBpbmcgb2JqZWN0LlxuICogTm90ZSB0aGF0IGBkZXNjcmlwdGlvbmAgaW4gYHBhZ2VgIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcgbW9zdCBsaWtlbHkgd2hlbiBpdCBjb21lcyB0byBNb2JpbGUgQ2hyb21lKVxuICoge1xuICogICBcInByb2NcIjogXCJAd2Vidmlld19kZXZ0b29sc19yZW1vdGVfMjIxMzhcIixcbiAqICAgXCJ3ZWJ2aWV3XCI6IFwiV0VCVklFV18yMjEzOFwiLFxuICogICBcImluZm9cIjoge1xuICogICAgIFwiQW5kcm9pZC1QYWNrYWdlXCI6IFwiaW8uYXBwaXVtLnNldHRpbmdzXCIsXG4gKiAgICAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzc0LjAuMzcyOS4xODVcIixcbiAqICAgICBcIlByb3RvY29sLVZlcnNpb25cIjogXCIxLjNcIixcbiAqICAgICBcIlVzZXItQWdlbnRcIjogXCJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IEFuZHJvaWQgU0RLIGJ1aWx0IGZvciB4ODYgQnVpbGQvUVNSMS4xOTA5MjAuMDAxOyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzc0LjAuMzcyOS4xODUgTW9iaWxlIFNhZmFyaS81MzcuMzZcIixcbiAqICAgICBcIlY4LVZlcnNpb25cIjogXCI3LjQuMjg4LjI4XCIsXG4gKiAgICAgXCJXZWJLaXQtVmVyc2lvblwiOiBcIjUzNy4zNiAoQDIyOTU1NjgyZjk0Y2UwOTMzNjE5N2JmYjhkZmZlYTk5MWZhMzJmMGQpXCIsXG4gKiAgICAgXCJ3ZWJTb2NrZXREZWJ1Z2dlclVybFwiOiBcIndzOi8vMTI3LjAuMC4xOjEwOTAwL2RldnRvb2xzL2Jyb3dzZXJcIlxuICogICB9LFxuICogICBcInBhZ2VzXCI6IFtcbiAqICAgICB7XG4gKiAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwie1xcXCJhdHRhY2hlZFxcXCI6dHJ1ZSxcXFwiZW1wdHlcXFwiOmZhbHNlLFxcXCJoZWlnaHRcXFwiOjE0NTgsXFxcInNjcmVlblhcXFwiOjAsXFxcInNjcmVlbllcXFwiOjMzNixcXFwidmlzaWJsZVxcXCI6dHJ1ZSxcXFwid2lkdGhcXFwiOjEwODB9XCIsXG4gKiAgICAgICBcImRldnRvb2xzRnJvbnRlbmRVcmxcIjogXCJodHRwOi8vY2hyb21lLWRldnRvb2xzLWZyb250ZW5kLmFwcHNwb3QuY29tL3NlcnZlX3Jldi9AMjI5NTU2ODJmOTRjZTA5MzM2MTk3YmZiOGRmZmVhOTkxZmEzMmYwZC9pbnNwZWN0b3IuaHRtbD93cz0xMjcuMC4wLjE6MTA5MDAvZGV2dG9vbHMvcGFnZS8yNzMyNUNDNTBCNjAwRDMxQjIzM0Y0NUUwOTQ4N0IxRlwiLFxuICogICAgICAgXCJpZFwiOiBcIjI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCIsXG4gKiAgICAgICBcInRpdGxlXCI6IFwiUmVsZWFzZXMgwrcgYXBwaXVtL2FwcGl1bSDCtyBHaXRIdWJcIixcbiAqICAgICAgIFwidHlwZVwiOiBcInBhZ2VcIixcbiAqICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcmVsZWFzZXNcIixcbiAqICAgICAgIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovLzEyNy4wLjAuMToxMDkwMC9kZXZ0b29scy9wYWdlLzI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCJcbiAqICAgICB9XG4gKiAgIF0sXG4gKiAgIFwid2Vidmlld05hbWVcIjogXCJXRUJWSUVXX2NvbS5pby5hcHBpdW0uc2V0dGluZ1wiXG4gKiB9XG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgd2Vidmlld3NNYXBwaW5nIGJhc2VkIG9uIENEUCBlbmRwb2ludHNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmdcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0Q29udGV4dHMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRDb250ZXh0cyAoKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgYW5kcm9pZERldmljZVNvY2tldDogdGhpcy5vcHRzLmFuZHJvaWREZXZpY2VTb2NrZXQsXG4gICAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXM6IHRydWUsXG4gICAgd2Vidmlld0RldnRvb2xzUG9ydDogdGhpcy5vcHRzLndlYnZpZXdEZXZ0b29sc1BvcnQsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uOiB0cnVlXG4gIH07XG4gIHJldHVybiBhd2FpdCB3ZWJ2aWV3SGVscGVycy5nZXRXZWJWaWV3c01hcHBpbmcodGhpcy5hZGIsIG9wdHMpO1xufTtcblxuaGVscGVycy5hc3NpZ25Db250ZXh0cyA9IGZ1bmN0aW9uIGFzc2lnbkNvbnRleHRzICh3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe2lzQ2hyb21lU2Vzc2lvbjogdGhpcy5pc0Nocm9tZVNlc3Npb259LCB0aGlzLm9wdHMpO1xuICBjb25zdCB3ZWJ2aWV3cyA9IHdlYnZpZXdIZWxwZXJzLnBhcnNlV2Vidmlld05hbWVzKHdlYnZpZXdzTWFwcGluZywgb3B0cyk7XG4gIHRoaXMuY29udGV4dHMgPSBbTkFUSVZFX1dJTiwgLi4ud2Vidmlld3NdO1xuICB0aGlzLmxvZy5kZWJ1ZyhgQXZhaWxhYmxlIGNvbnRleHRzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29udGV4dHMpfWApO1xuICByZXR1cm4gdGhpcy5jb250ZXh0cztcbn07XG5cbmhlbHBlcnMuc3dpdGNoQ29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHN3aXRjaENvbnRleHQgKG5hbWUsIHdlYnZpZXdzTWFwcGluZykge1xuICAvLyBXZSBoYXZlIHNvbWUgb3B0aW9ucyB3aGVuIGl0IGNvbWVzIHRvIHdlYnZpZXdzLiBJZiB3ZSB3YW50IGFcbiAgLy8gQ2hyb21lZHJpdmVyIHdlYnZpZXcsIHdlIGNhbiBvbmx5IGNvbnRyb2wgb25lIGF0IGEgdGltZS5cbiAgaWYgKHRoaXMuaXNDaHJvbWVkcml2ZXJDb250ZXh0KG5hbWUpKSB7XG4gICAgLy8gc3RhcnQgcHJveHlpbmcgY29tbWFuZHMgZGlyZWN0bHkgdG8gY2hyb21lZHJpdmVyXG4gICAgYXdhaXQgdGhpcy5zdGFydENocm9tZWRyaXZlclByb3h5KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIH0gZWxzZSBpZiAodGhpcy5pc0Nocm9tZWRyaXZlckNvbnRleHQodGhpcy5jdXJDb250ZXh0KSkge1xuICAgIC8vIGlmIHdlJ3JlIG1vdmluZyB0byBhIG5vbi1jaHJvbWVkcml2ZXIgd2VidmlldywgYW5kIG91ciBjdXJyZW50IGNvbnRleHRcbiAgICAvLyBfaXNfIGEgY2hyb21lZHJpdmVyIHdlYnZpZXcsIGlmIGNhcHMgcmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucyBpcyBzZXRcbiAgICAvLyB0byB0cnVlIHRoZW4ga2lsbCBjaHJvbWVkcml2ZXIgc2Vzc2lvbiB1c2luZyBzdG9wQ2hyb21lZHJpdmVyUHJveGllcyBvclxuICAgIC8vIGVsc2Ugc2ltcGx5IHN1c3BlbmQgcHJveHlpbmcgdG8gdGhlIGxhdHRlclxuICAgIGlmICh0aGlzLm9wdHMucmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucykge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ3JlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMgc2V0IHRvIHRydWU7IGtpbGxpbmcgZXhpc3RpbmcgY2hyb21lZHJpdmVycycpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERpZG4ndCBrbm93IGhvdyB0byBoYW5kbGUgc3dpdGNoaW5nIHRvIGNvbnRleHQgJyR7bmFtZX0nYCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBPbi1vYmplY3QgY29udGV4dC1yZWxhdGVkIGhlbHBlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBUaGUgcmVhc29uIHRoaXMgaXMgYSBmdW5jdGlvbiBhbmQgbm90IGp1c3QgYSBjb25zdGFudCBpcyB0aGF0IGJvdGggYW5kcm9pZC1cbi8vIGRyaXZlciBhbmQgc2VsZW5kcm9pZC1kcml2ZXIgdXNlIHRoaXMgbG9naWMsIGFuZCBlYWNoIG9uZSByZXR1cm5zXG4vLyBhIGRpZmZlcmVudCBkZWZhdWx0IGNvbnRleHQgbmFtZVxuaGVscGVycy5kZWZhdWx0Q29udGV4dE5hbWUgPSBmdW5jdGlvbiBkZWZhdWx0Q29udGV4dE5hbWUgKCkge1xuICByZXR1cm4gTkFUSVZFX1dJTjtcbn07XG5cbmhlbHBlcnMuZGVmYXVsdFdlYnZpZXdOYW1lID0gZnVuY3Rpb24gZGVmYXVsdFdlYnZpZXdOYW1lICgpIHtcbiAgcmV0dXJuIFdFQlZJRVdfQkFTRSArIHRoaXMub3B0cy5hcHBQYWNrYWdlO1xufTtcblxuaGVscGVycy5pc1dlYkNvbnRleHQgPSBmdW5jdGlvbiBpc1dlYkNvbnRleHQgKCkge1xuICByZXR1cm4gdGhpcy5jdXJDb250ZXh0ICE9PSBudWxsICYmIHRoaXMuY3VyQ29udGV4dCAhPT0gTkFUSVZFX1dJTjtcbn07XG5cbi8vIFR1cm4gb24gcHJveHlpbmcgdG8gYW4gZXhpc3RpbmcgQ2hyb21lZHJpdmVyIHNlc3Npb24gb3IgYSBuZXcgb25lXG5oZWxwZXJzLnN0YXJ0Q2hyb21lZHJpdmVyUHJveHkgPSBhc3luYyBmdW5jdGlvbiBzdGFydENocm9tZWRyaXZlclByb3h5IChjb250ZXh0LCB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgdGhpcy5sb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gY2hyb21lLWJhY2tlZCB3ZWJ2aWV3IGNvbnRleHQgJyR7Y29udGV4dH0nYCk7XG5cbiAgbGV0IGNkO1xuICBpZiAodGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XSkge1xuICAgIC8vIGluIHRoZSBjYXNlIHdoZXJlIHdlJ3ZlIGFscmVhZHkgc2V0IHVwIGEgY2hyb21lZHJpdmVyIGZvciBhIGNvbnRleHQsXG4gICAgLy8gd2Ugd2FudCB0byByZWNvbm5lY3QgdG8gaXQsIG5vdCBjcmVhdGUgYSB3aG9sZSBuZXcgb25lXG4gICAgdGhpcy5sb2cuZGVidWcoYEZvdW5kIGV4aXN0aW5nIENocm9tZWRyaXZlciBmb3IgY29udGV4dCAnJHtjb250ZXh0fScuIFVzaW5nIGl0LmApO1xuICAgIGNkID0gdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgICBhd2FpdCBzZXR1cEV4aXN0aW5nQ2hyb21lZHJpdmVyKHRoaXMubG9nLCBjZCk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IG9wdHMgPSBfLmNsb25lRGVlcCh0aGlzLm9wdHMpO1xuICAgIG9wdHMuY2hyb21lVXNlUnVubmluZ0FwcCA9IHRydWU7XG5cbiAgICAvLyBpZiByZXF1ZXN0ZWQsIHRlbGwgY2hyb21lZHJpdmVyIHRvIGF0dGFjaCB0byB0aGUgYW5kcm9pZCBwYWNrYWdlIHdlIGhhdmVcbiAgICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQgbmFtZSwgcmF0aGVyIHRoYW4gdGhlIHBhY2thZ2Ugb2YgdGhlIEFVVC5cbiAgICAvLyBBbmQgdHVybiB0aGlzIG9uIGJ5IGRlZmF1bHQgZm9yIGNocm9tZS0taWYgY2hyb21lIHBvcHMgdXAgd2l0aCBhIHdlYnZpZXdcbiAgICAvLyBhbmQgc29tZW9uZSB3YW50cyB0byBzd2l0Y2ggdG8gaXQsIHdlIHNob3VsZCBsZXQgY2hyb21lZHJpdmVyIGNvbm5lY3QgdG9cbiAgICAvLyBjaHJvbWUgcmF0aGVyIHRoYW4gc3RheWluZyBzdHVjayBvbiB0aGUgQVVUXG4gICAgaWYgKG9wdHMuZXh0cmFjdENocm9tZUFuZHJvaWRQYWNrYWdlRnJvbUNvbnRleHROYW1lIHx8IGNvbnRleHQgPT09IGAke1dFQlZJRVdfQkFTRX1jaHJvbWVgKSB7XG4gICAgICBsZXQgYW5kcm9pZFBhY2thZ2UgPSBjb250ZXh0Lm1hdGNoKGAke1dFQlZJRVdfQkFTRX0oLispYCk7XG4gICAgICBpZiAoYW5kcm9pZFBhY2thZ2UgJiYgYW5kcm9pZFBhY2thZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlID0gYW5kcm9pZFBhY2thZ2VbMV07XG4gICAgICB9XG4gICAgICBpZiAoIW9wdHMuZXh0cmFjdENocm9tZUFuZHJvaWRQYWNrYWdlRnJvbUNvbnRleHROYW1lKSB7XG4gICAgICAgIGlmIChfLmhhcyh0aGlzLm9wdHMsICdlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24nKSAmJiAhdGhpcy5vcHRzLmVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbikge1xuICAgICAgICAgIC8vIFdoZW4gZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIGNhcGFiaWxpdHkgaXMgZXhwbGljaXRseSBkaXNhYmxlZCwgdHJ5IHRvIGlkZW50aWZ5XG4gICAgICAgICAgLy8gY2hyb21lQW5kcm9pZFBhY2thZ2UgYmFzZWQgb24gY29udGV4dHMsIGtub3duIGNocm9tZSB2YXJpYW50IHBhY2thZ2VzIGFuZCBxdWVyeUFwcFN0YXRlIHJlc3VsdFxuICAgICAgICAgIC8vIHNpbmNlIHdlYnZpZXdzTWFwcGluZyBkb2VzIG5vdCBoYXZlIGluZm8gb2JqZWN0XG4gICAgICAgICAgY29uc3QgY29udGV4dHMgPSB3ZWJ2aWV3c01hcHBpbmcubWFwKCh3bSkgPT4gd20ud2Vidmlld05hbWUpO1xuICAgICAgICAgIGZvciAoY29uc3Qga25vd25QYWNrYWdlIG9mIEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTKSB7XG4gICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhjb250ZXh0cywgYCR7V0VCVklFV19CQVNFfSR7a25vd25QYWNrYWdlfWApKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYXBwU3RhdGUgPSBhd2FpdCB0aGlzLnF1ZXJ5QXBwU3RhdGUoa25vd25QYWNrYWdlKTtcbiAgICAgICAgICAgIGlmIChfLmluY2x1ZGVzKFtBUFBfU1RBVEUuUlVOTklOR19JTl9CQUNLR1JPVU5ELCBBUFBfU1RBVEUuUlVOTklOR19JTl9GT1JFR1JPVU5EXSwgYXBwU3RhdGUpKSB7XG4gICAgICAgICAgICAgIG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2UgPSBrbm93blBhY2thZ2U7XG4gICAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBJZGVudGlmaWVkIGNocm9tZUFuZHJvaWRQYWNrYWdlIGFzICcke29wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2V9JyBgICtcbiAgICAgICAgICAgICAgICBgZm9yIGNvbnRleHQgJyR7Y29udGV4dH0nIGJ5IHF1ZXJ5aW5nIHN0YXRlcyBvZiBDaHJvbWUgYXBwIHBhY2thZ2VzYCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHdtIG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgICAgICAgICAgaWYgKHdtLndlYnZpZXdOYW1lID09PSBjb250ZXh0ICYmIF8uaGFzKHdtPy5pbmZvLCAnQW5kcm9pZC1QYWNrYWdlJykpIHtcbiAgICAgICAgICAgICAgb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSA9IHdtLmluZm9bJ0FuZHJvaWQtUGFja2FnZSddO1xuICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgSWRlbnRpZmllZCBjaHJvbWVBbmRyb2lkUGFja2FnZSBhcyAnJHtvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlfScgYCArXG4gICAgICAgICAgICAgICAgYGZvciBjb250ZXh0ICcke2NvbnRleHR9JyBieSBDRFBgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2QgPSBhd2FpdCB0aGlzLnNldHVwTmV3Q2hyb21lZHJpdmVyKG9wdHMsIHRoaXMuYWRiLmN1ckRldmljZUlkLCB0aGlzLmFkYiwgY29udGV4dCk7XG4gICAgLy8gYmluZCBvdXIgc3RvcC9leGl0IGhhbmRsZXIsIHBhc3NpbmcgaW4gY29udGV4dCBzbyB3ZSBrbm93IHdoaWNoXG4gICAgLy8gb25lIHN0b3BwZWQgdW5leHBlY3RlZGx5XG4gICAgY2Qub24oQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIChtc2cpID0+IHtcbiAgICAgIGlmIChtc2cuc3RhdGUgPT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICAgIHRoaXMub25DaHJvbWVkcml2ZXJTdG9wKGNvbnRleHQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIHNhdmUgdGhlIGNocm9tZWRyaXZlciBvYmplY3QgdW5kZXIgdGhlIGNvbnRleHRcbiAgICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdID0gY2Q7XG4gIH1cbiAgLy8gaG9vayB1cCB0aGUgbG9jYWwgdmFyaWFibGVzIHNvIHdlIGNhbiBwcm94eSB0aGlzIGJpelxuICB0aGlzLmNocm9tZWRyaXZlciA9IGNkO1xuICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5jaHJvbWVkcml2ZXIucHJveHlSZXEuYmluZCh0aGlzLmNocm9tZWRyaXZlcik7XG4gIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIuandwcm94eSk7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xufTtcblxuLy8gU3RvcCBwcm94eWluZyB0byBhbnkgQ2hyb21lZHJpdmVyXG5oZWxwZXJzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSA9IGZ1bmN0aW9uIHN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSAoKSB7XG4gIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IG51bGw7XG4gIHRoaXMucHJveHlDb21tYW5kID0gbnVsbDtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xufTtcblxuLy8gSGFuZGxlIGFuIG91dC1vZi1iYW5kIENocm9tZWRyaXZlciBzdG9wIGV2ZW50XG5oZWxwZXJzLm9uQ2hyb21lZHJpdmVyU3RvcCA9IGFzeW5jIGZ1bmN0aW9uIG9uQ2hyb21lZHJpdmVyU3RvcCAoY29udGV4dCkge1xuICB0aGlzLmxvZy53YXJuKGBDaHJvbWVkcml2ZXIgZm9yIGNvbnRleHQgJHtjb250ZXh0fSBzdG9wcGVkIHVuZXhwZWN0ZWRseWApO1xuICBpZiAoY29udGV4dCA9PT0gdGhpcy5jdXJDb250ZXh0KSB7XG4gICAgLy8gd2UgZXhpdGVkIHVuZXhwZWN0ZWRseSB3aGlsZSBhdXRvbWF0aW5nIHRoZSBjdXJyZW50IGNvbnRleHQgYW5kIHNvIHdhbnRcbiAgICAvLyB0byBzaHV0IGRvd24gdGhlIHNlc3Npb24gYW5kIHJlc3BvbmQgd2l0aCBhbiBlcnJvclxuICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoJ0Nocm9tZWRyaXZlciBxdWl0IHVuZXhwZWN0ZWRseSBkdXJpbmcgc2Vzc2lvbicpO1xuICAgIGF3YWl0IHRoaXMuc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24oZXJyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiBhIENocm9tZWRyaXZlciBpbiB0aGUgbm9uLWFjdGl2ZSBjb250ZXh0IGJhcmZzLCB3ZSBkb24ndCByZWFsbHlcbiAgICAvLyBjYXJlLCB3ZSdsbCBqdXN0IG1ha2UgYSBuZXcgb25lIG5leHQgdGltZSB3ZSBuZWVkIHRoZSBjb250ZXh0LlxuICAgIHRoaXMubG9nLndhcm4oXCJDaHJvbWVkcml2ZXIgcXVpdCB1bmV4cGVjdGVkbHksIGJ1dCBpdCB3YXNuJ3QgdGhlIGFjdGl2ZSBcIiArXG4gICAgICAnY29udGV4dCwgaWdub3JpbmcnKTtcbiAgICBkZWxldGUgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgfVxufTtcblxuLy8gSW50ZW50aW9uYWxseSBzdG9wIGFsbCB0aGUgY2hyb21lZHJpdmVycyBjdXJyZW50bHkgYWN0aXZlLCBhbmQgaWdub3JlXG4vLyB0aGVpciBleGl0IGV2ZW50c1xuaGVscGVycy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcyA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BDaHJvbWVkcml2ZXJQcm94aWVzICgpIHtcbiAgdGhpcy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkoKTsgLy8gbWFrZSBzdXJlIHdlIHR1cm4gb2ZmIHRoZSBwcm94eSBmbGFnXG4gIGZvciAobGV0IGNvbnRleHQgb2YgXy5rZXlzKHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMpKSB7XG4gICAgbGV0IGNkID0gdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgU3RvcHBpbmcgY2hyb21lZHJpdmVyIGZvciBjb250ZXh0ICR7Y29udGV4dH1gKTtcbiAgICAvLyBzdG9wIGxpc3RlbmluZyBmb3IgdGhlIHN0b3BwZWQgc3RhdGUgZXZlbnRcbiAgICBjZC5yZW1vdmVBbGxMaXN0ZW5lcnMoQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjZC5zdG9wKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBFcnJvciBzdG9wcGluZyBDaHJvbWVkcml2ZXI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdO1xuICB9XG59O1xuXG5oZWxwZXJzLmlzQ2hyb21lZHJpdmVyQ29udGV4dCA9IGZ1bmN0aW9uIGlzQ2hyb21lZHJpdmVyQ29udGV4dCAodmlld05hbWUpIHtcbiAgcmV0dXJuIF8uaW5jbHVkZXModmlld05hbWUsIFdFQlZJRVdfV0lOKSB8fCB2aWV3TmFtZSA9PT0gQ0hST01JVU1fV0lOO1xufTtcblxuaGVscGVycy5zaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSA9IGZ1bmN0aW9uIHNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lICgpIHtcbiAgcmV0dXJuICEhdGhpcy5vcHRzLmNocm9tZU9wdGlvbnMgJiZcbiAgICAgICAgIF8uaXNBcnJheSh0aGlzLm9wdHMuY2hyb21lT3B0aW9ucy5hcmdzKSAmJlxuICAgICAgICAgdGhpcy5vcHRzLmNocm9tZU9wdGlvbnMuYXJncy5pbmNsdWRlcygnLS1uby1maXJzdC1ydW4nKTtcbn07XG5cbmhlbHBlcnMuZGlzbWlzc0Nocm9tZVdlbGNvbWUgPSBhc3luYyBmdW5jdGlvbiBkaXNtaXNzQ2hyb21lV2VsY29tZSAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ1RyeWluZyB0byBkaXNtaXNzIENocm9tZSB3ZWxjb21lJyk7XG4gIGxldCBhY3Rpdml0eSA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudEFjdGl2aXR5KCk7XG4gIGlmIChhY3Rpdml0eSAhPT0gJ29yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5maXJzdHJ1bi5GaXJzdFJ1bkFjdGl2aXR5Jykge1xuICAgIHRoaXMubG9nLmluZm8oJ0Nocm9tZSB3ZWxjb21lIGRpYWxvZyBuZXZlciBzaG93ZWQgdXAhIENvbnRpbnVpbmcnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGVsID0gYXdhaXQgdGhpcy5maW5kRWxPckVscygnaWQnLCAnY29tLmFuZHJvaWQuY2hyb21lOmlkL3Rlcm1zX2FjY2VwdCcsIGZhbHNlKTtcbiAgYXdhaXQgdGhpcy5jbGljayhlbC5FTEVNRU5UKTtcbiAgdHJ5IHtcbiAgICBsZXQgZWwgPSBhd2FpdCB0aGlzLmZpbmRFbE9yRWxzKCdpZCcsICdjb20uYW5kcm9pZC5jaHJvbWU6aWQvbmVnYXRpdmVfYnV0dG9uJywgZmFsc2UpO1xuICAgIGF3YWl0IHRoaXMuY2xpY2soZWwuRUxFTUVOVCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBETyBOT1RISU5HLCBUSElTIERFVklDRSBESUROVCBMQVVOQ0ggVEhFIFNJR05JTiBESUFMT0dcbiAgICAvLyBJVCBNVVNUIEJFIEEgTk9OIEdNUyBERVZJQ0VcbiAgICB0aGlzLmxvZy53YXJuKGBUaGlzIGRldmljZSBkaWQgbm90IHNob3cgQ2hyb21lIFNpZ25JbiBkaWFsb2csICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLnN0YXJ0Q2hyb21lU2Vzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hyb21lU2Vzc2lvbiAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ1N0YXJ0aW5nIGEgY2hyb21lLWJhc2VkIGJyb3dzZXIgc2Vzc2lvbicpO1xuICBsZXQgb3B0cyA9IF8uY2xvbmVEZWVwKHRoaXMub3B0cyk7XG5cbiAgY29uc3Qga25vd25QYWNrYWdlcyA9IFtcbiAgICAnb3JnLmNocm9taXVtLmNocm9tZS5zaGVsbCcsXG4gICAgJ2NvbS5hbmRyb2lkLmNocm9tZScsXG4gICAgJ2NvbS5jaHJvbWUuYmV0YScsXG4gICAgJ29yZy5jaHJvbWl1bS5jaHJvbWUnLFxuICAgICdvcmcuY2hyb21pdW0ud2Vidmlld19zaGVsbCcsXG4gIF07XG5cbiAgaWYgKF8uaW5jbHVkZXMoa25vd25QYWNrYWdlcywgdGhpcy5vcHRzLmFwcFBhY2thZ2UpKSB7XG4gICAgb3B0cy5jaHJvbWVCdW5kbGVJZCA9IHRoaXMub3B0cy5hcHBQYWNrYWdlO1xuICB9IGVsc2Uge1xuICAgIG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5ID0gdGhpcy5vcHRzLmFwcEFjdGl2aXR5O1xuICB9XG4gIHRoaXMuY2hyb21lZHJpdmVyID0gYXdhaXQgdGhpcy5zZXR1cE5ld0Nocm9tZWRyaXZlcihvcHRzLCB0aGlzLmFkYi5jdXJEZXZpY2VJZCwgdGhpcy5hZGIpO1xuICB0aGlzLmNocm9tZWRyaXZlci5vbihDaHJvbWVkcml2ZXIuRVZFTlRfQ0hBTkdFRCwgKG1zZykgPT4ge1xuICAgIGlmIChtc2cuc3RhdGUgPT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICB0aGlzLm9uQ2hyb21lZHJpdmVyU3RvcChDSFJPTUlVTV9XSU4pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIENocm9tZSBzZXNzaW9uLCB3ZSBlbnN1cmUgdGhhdCB0aGUgY29udGV4dCBpc1xuICAvLyBhcHByb3ByaWF0ZWx5IHNldCBhbmQgdGhhdCB0aGlzIGNocm9tZWRyaXZlciBpcyBhZGRlZCB0byB0aGUgbGlzdFxuICAvLyBvZiBzZXNzaW9uIGNocm9tZWRyaXZlcnMgc28gd2UgY2FuIHN3aXRjaCBiYWNrIGFuZCBmb3J0aFxuICB0aGlzLmN1ckNvbnRleHQgPSBDSFJPTUlVTV9XSU47XG4gIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbQ0hST01JVU1fV0lOXSA9IHRoaXMuY2hyb21lZHJpdmVyO1xuICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5jaHJvbWVkcml2ZXIucHJveHlSZXEuYmluZCh0aGlzLmNocm9tZWRyaXZlcik7XG4gIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIuandwcm94eSk7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xuXG4gIGlmICh0aGlzLnNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lKCkpIHtcbiAgICAvLyBkaXNtaXNzIENocm9tZSB3ZWxjb21lIGRpYWxvZ1xuICAgIGF3YWl0IHRoaXMuZGlzbWlzc0Nocm9tZVdlbGNvbWUoKTtcbiAgfVxufTtcblxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogSW50ZXJuYWwgbGlicmFyeSBmdW5jdGlvbnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwRXhpc3RpbmdDaHJvbWVkcml2ZXIgKGxvZywgY2hyb21lZHJpdmVyKSB7XG4gIC8vIGNoZWNrIHRoZSBzdGF0dXMgYnkgc2VuZGluZyBhIHNpbXBsZSB3aW5kb3ctYmFzZWQgY29tbWFuZCB0byBDaHJvbWVEcml2ZXJcbiAgLy8gaWYgdGhlcmUgaXMgYW4gZXJyb3IsIHdlIHdhbnQgdG8gcmVjcmVhdGUgdGhlIENocm9tZURyaXZlciBzZXNzaW9uXG4gIGlmICghYXdhaXQgY2hyb21lZHJpdmVyLmhhc1dvcmtpbmdXZWJ2aWV3KCkpIHtcbiAgICBsb2cuZGVidWcoJ0Nocm9tZURyaXZlciBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgd2luZG93LiAnICtcbiAgICAgICAgICAgICAgICAgJ1JlLWluaXRpYWxpemluZyB0aGUgc2Vzc2lvbi4nKTtcbiAgICBhd2FpdCBjaHJvbWVkcml2ZXIucmVzdGFydCgpO1xuICB9XG4gIHJldHVybiBjaHJvbWVkcml2ZXI7XG59XG5cbi8qKlxuICogRmluZCBhIGZyZWUgcG9ydCB0byBoYXZlIENocm9tZWRyaXZlciBsaXN0ZW4gb24uXG4gKlxuICogQHBhcmFtIHthcnJheX0gcG9ydFNwZWMgLSBBcnJheSB3aGljaCBpcyBhIGxpc3Qgb2YgcG9ydHMuIEEgbGlzdCBpdGVtIG1heVxuICogYWxzbyBpdHNlbGYgYmUgYW4gYXJyYXkgb2YgbGVuZ3RoIDIgc3BlY2lmeWluZyBhIHN0YXJ0IGFuZCBlbmQgcG9ydCBvZlxuICogYSByYW5nZS4gU29tZSB2YWxpZCBwb3J0IHNwZWNzOlxuICogICAgLSBbODAwMCwgODAwMSwgODAwMl1cbiAqICAgIC0gW1s4MDAwLCA4MDA1XV1cbiAqICAgIC0gWzgwMDAsIFs5MDAwLCA5MTAwXV1cbiAqIEBwYXJhbSB7T2JqZWN0P30gbG9nIExvZ2dlciBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gQSBmcmVlIHBvcnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hyb21lZHJpdmVyUG9ydCAocG9ydFNwZWMsIGxvZyA9IG51bGwpIHtcbiAgY29uc3QgZ2V0UG9ydCA9IEIucHJvbWlzaWZ5KFBvcnRGaW5kZXIuZ2V0UG9ydCwge2NvbnRleHQ6IFBvcnRGaW5kZXJ9KTtcblxuICAvLyBpZiB0aGUgdXNlciBkaWRuJ3QgZ2l2ZSB1cyBhbnkgc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgY2hyb21lZHJpdmVyXG4gIC8vIHBvcnQgcmFuZ2VzLCBqdXN0IGZpbmQgYW55IGZyZWUgcG9ydFxuICBpZiAoIXBvcnRTcGVjKSB7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGdldFBvcnQoKTtcbiAgICBsb2c/LmRlYnVnKGBBIHBvcnQgd2FzIG5vdCBnaXZlbiwgdXNpbmcgcmFuZG9tIGZyZWUgcG9ydDogJHtwb3J0fWApO1xuICAgIHJldHVybiBwb3J0O1xuICB9XG5cbiAgLy8gb3RoZXJ3aXNlIGZpbmQgdGhlIGZyZWUgcG9ydCBiYXNlZCBvbiBhIGxpc3Qgb3IgcmFuZ2UgcHJvdmlkZWQgYnkgdGhlIHVzZXJcbiAgbG9nPy5kZWJ1ZyhgRmluZGluZyBhIGZyZWUgcG9ydCBmb3IgY2hyb21lZHJpdmVyIHVzaW5nIHNwZWMgJHtKU09OLnN0cmluZ2lmeShwb3J0U3BlYyl9YCk7XG4gIGxldCBmb3VuZFBvcnQgPSBudWxsO1xuICBmb3IgKGNvbnN0IHBvdGVudGlhbFBvcnQgb2YgcG9ydFNwZWMpIHtcbiAgICBsZXQgcG9ydCwgc3RvcFBvcnQ7XG4gICAgaWYgKF8uaXNBcnJheShwb3RlbnRpYWxQb3J0KSkge1xuICAgICAgKFtwb3J0LCBzdG9wUG9ydF0gPSBwb3RlbnRpYWxQb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9ydCA9IHBhcnNlSW50KHBvdGVudGlhbFBvcnQsIDEwKTsgLy8gZW5zdXJlIHdlIGhhdmUgYSBudW1iZXIgYW5kIG5vdCBhIHN0cmluZ1xuICAgICAgc3RvcFBvcnQgPSBwb3J0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbG9nPy5kZWJ1ZyhgQ2hlY2tpbmcgcG9ydCByYW5nZSAke3BvcnR9OiR7c3RvcFBvcnR9YCk7XG4gICAgICBmb3VuZFBvcnQgPSBhd2FpdCBnZXRQb3J0KHtwb3J0LCBzdG9wUG9ydH0pO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nPy5kZWJ1ZyhgTm90aGluZyBpbiBwb3J0IHJhbmdlICR7cG9ydH06JHtzdG9wUG9ydH0gd2FzIGF2YWlsYWJsZWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChmb3VuZFBvcnQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGEgZnJlZSBwb3J0IGZvciBjaHJvbWVkcml2ZXIgdXNpbmcgYCArXG4gICAgICAgICAgICAgICAgICAgIGBjaHJvbWVkcml2ZXJQb3J0cyBzcGVjICR7SlNPTi5zdHJpbmdpZnkocG9ydFNwZWMpfWApO1xuICB9XG5cbiAgbG9nPy5kZWJ1ZyhgVXNpbmcgZnJlZSBwb3J0ICR7Zm91bmRQb3J0fSBmb3IgY2hyb21lZHJpdmVyYCk7XG4gIHJldHVybiBmb3VuZFBvcnQ7XG59XG5cbmhlbHBlcnMuaXNDaHJvbWVkcml2ZXJBdXRvZG93bmxvYWRFbmFibGVkID0gZnVuY3Rpb24gaXNDaHJvbWVkcml2ZXJBdXRvZG93bmxvYWRFbmFibGVkICgpIHtcbiAgaWYgKHRoaXMuaXNGZWF0dXJlRW5hYmxlZChDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdGhpcz8ubG9nPy5kZWJ1ZyhgQXV0b21hdGVkIENocm9tZWRyaXZlciBkb3dubG9hZCBpcyBkaXNhYmxlZC4gYCArXG4gICAgYFVzZSAnJHtDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkV9JyBzZXJ2ZXIgZmVhdHVyZSB0byBlbmFibGUgaXRgKTtcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuaGVscGVycy5zZXR1cE5ld0Nocm9tZWRyaXZlciA9IGFzeW5jIGZ1bmN0aW9uIHNldHVwTmV3Q2hyb21lZHJpdmVyIChvcHRzLCBjdXJEZXZpY2VJZCwgYWRiLCBjb250ZXh0ID0gbnVsbCkge1xuICBpZiAob3B0cy5jaHJvbWVEcml2ZXJQb3J0KSB7XG4gICAgdGhpcz8ubG9nPy53YXJuKGBUaGUgJ2Nocm9tZURyaXZlclBvcnQnIGNhcGFiaWxpdHkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSAnY2hyb21lZHJpdmVyUG9ydCcgaW5zdGVhZGApO1xuICAgIG9wdHMuY2hyb21lZHJpdmVyUG9ydCA9IG9wdHMuY2hyb21lRHJpdmVyUG9ydDtcbiAgfVxuXG4gIGlmIChvcHRzLmNocm9tZWRyaXZlclBvcnQpIHtcbiAgICB0aGlzPy5sb2c/LmRlYnVnKGBVc2luZyB1c2VyLXNwZWNpZmllZCBwb3J0ICR7b3B0cy5jaHJvbWVkcml2ZXJQb3J0fSBmb3IgY2hyb21lZHJpdmVyYCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgYSBzaW5nbGUgcG9ydCB3YXNuJ3QgZ2l2ZW4sIHdlJ2xsIGxvb2sgZm9yIGEgZnJlZSBvbmVcbiAgICBvcHRzLmNocm9tZWRyaXZlclBvcnQgPSBhd2FpdCBnZXRDaHJvbWVkcml2ZXJQb3J0KG9wdHMuY2hyb21lZHJpdmVyUG9ydHMsIHRoaXM/LmxvZyk7XG4gIH1cblxuICBjb25zdCBkZXRhaWxzID0gY29udGV4dCA/IHdlYnZpZXdIZWxwZXJzLmdldFdlYnZpZXdEZXRhaWxzKGFkYiwgY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIGlmICghXy5pc0VtcHR5KGRldGFpbHMpKSB7XG4gICAgdGhpcz8ubG9nPy5kZWJ1ZygnUGFzc2luZyB3ZWIgdmlldyBkZXRhaWxzIHRvIHRoZSBDaHJvbWVkcml2ZXIgY29uc3RydWN0b3I6ICcgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkoZGV0YWlscywgbnVsbCwgMikpO1xuICB9XG5cbiAgY29uc3QgY2hyb21lZHJpdmVyID0gbmV3IENocm9tZWRyaXZlcih7XG4gICAgcG9ydDogb3B0cy5jaHJvbWVkcml2ZXJQb3J0LFxuICAgIGV4ZWN1dGFibGU6IG9wdHMuY2hyb21lZHJpdmVyRXhlY3V0YWJsZSxcbiAgICBhZGIsXG4gICAgY21kQXJnczogb3B0cy5jaHJvbWVkcml2ZXJBcmdzLFxuICAgIHZlcmJvc2U6ICEhb3B0cy5zaG93Q2hyb21lZHJpdmVyTG9nLFxuICAgIGV4ZWN1dGFibGVEaXI6IG9wdHMuY2hyb21lZHJpdmVyRXhlY3V0YWJsZURpcixcbiAgICBtYXBwaW5nUGF0aDogb3B0cy5jaHJvbWVkcml2ZXJDaHJvbWVNYXBwaW5nRmlsZSxcbiAgICBidW5kbGVJZDogb3B0cy5jaHJvbWVCdW5kbGVJZCxcbiAgICB1c2VTeXN0ZW1FeGVjdXRhYmxlOiBvcHRzLmNocm9tZWRyaXZlclVzZVN5c3RlbUV4ZWN1dGFibGUsXG4gICAgZGlzYWJsZUJ1aWxkQ2hlY2s6IG9wdHMuY2hyb21lZHJpdmVyRGlzYWJsZUJ1aWxkQ2hlY2ssXG4gICAgZGV0YWlscyxcbiAgICBpc0F1dG9kb3dubG9hZEVuYWJsZWQ6IHRoaXM/LmlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZD8uKClcbiAgfSk7XG5cbiAgLy8gbWFrZSBzdXJlIHRoZXJlIGFyZSBjaHJvbWVPcHRpb25zXG4gIG9wdHMuY2hyb21lT3B0aW9ucyA9IG9wdHMuY2hyb21lT3B0aW9ucyB8fCB7fTtcbiAgLy8gdHJ5IG91dCBhbnkgcHJlZml4ZWQgY2hyb21lT3B0aW9ucyxcbiAgLy8gYW5kIHN0cmlwIHRoZSBwcmVmaXhcbiAgZm9yIChjb25zdCBvcHQgb2YgXy5rZXlzKG9wdHMpKSB7XG4gICAgaWYgKG9wdC5lbmRzV2l0aCgnOmNocm9tZU9wdGlvbnMnKSkge1xuICAgICAgdGhpcz8ubG9nPy53YXJuKGBNZXJnaW5nICcke29wdH0nIGludG8gJ2Nocm9tZU9wdGlvbnMnLiBUaGlzIG1heSBjYXVzZSB1bmV4cGVjdGVkIGJlaGF2aW9yYCk7XG4gICAgICBfLm1lcmdlKG9wdHMuY2hyb21lT3B0aW9ucywgb3B0c1tvcHRdKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjYXBzID0gd2Vidmlld0hlbHBlcnMuY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyhvcHRzLCBjdXJEZXZpY2VJZCwgZGV0YWlscyk7XG4gIHRoaXM/LmxvZz8uZGVidWcoYEJlZm9yZSBzdGFydGluZyBjaHJvbWVkcml2ZXIsIGFuZHJvaWRQYWNrYWdlIGlzICcke2NhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZX0nYCk7XG4gIGF3YWl0IGNocm9tZWRyaXZlci5zdGFydChjYXBzKTtcbiAgcmV0dXJuIGNocm9tZWRyaXZlcjtcbn07XG5jb25zdCBzZXR1cE5ld0Nocm9tZWRyaXZlciA9IGhlbHBlcnMuc2V0dXBOZXdDaHJvbWVkcml2ZXI7XG5cblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQgeyBjb21tYW5kcywgaGVscGVycywgc2V0dXBOZXdDaHJvbWVk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
334
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZ2V0Q3VycmVudENvbnRleHQiLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiZ2V0Q29udGV4dHMiLCJ3ZWJ2aWV3c01hcHBpbmciLCJ3ZWJ2aWV3SGVscGVycyIsImdldFdlYlZpZXdzTWFwcGluZyIsImFkYiIsIm9wdHMiLCJhc3NpZ25Db250ZXh0cyIsInNldENvbnRleHQiLCJuYW1lIiwidXRpbCIsImhhc1ZhbHVlIiwiV0VCVklFV19XSU4iLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjb250ZXh0cyIsIl8iLCJpbmNsdWRlcyIsImVycm9ycyIsIk5vU3VjaENvbnRleHRFcnJvciIsInN3aXRjaENvbnRleHQiLCJtb2JpbGVHZXRDb250ZXh0cyIsImFuZHJvaWREZXZpY2VTb2NrZXQiLCJlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyIsIndlYnZpZXdEZXZ0b29sc1BvcnQiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJPYmplY3QiLCJhc3NpZ24iLCJpc0Nocm9tZVNlc3Npb24iLCJ3ZWJ2aWV3cyIsInBhcnNlV2Vidmlld05hbWVzIiwiTkFUSVZFX1dJTiIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzQ2hyb21lZHJpdmVyQ29udGV4dCIsInN0YXJ0Q2hyb21lZHJpdmVyUHJveHkiLCJyZWNyZWF0ZUNocm9tZURyaXZlclNlc3Npb25zIiwic3RvcENocm9tZWRyaXZlclByb3hpZXMiLCJzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkiLCJFcnJvciIsIldFQlZJRVdfQkFTRSIsImFwcFBhY2thZ2UiLCJpc1dlYkNvbnRleHQiLCJjb250ZXh0IiwiY2QiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsInNldHVwRXhpc3RpbmdDaHJvbWVkcml2ZXIiLCJjbG9uZURlZXAiLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiZXh0cmFjdENocm9tZUFuZHJvaWRQYWNrYWdlRnJvbUNvbnRleHROYW1lIiwiYW5kcm9pZFBhY2thZ2UiLCJtYXRjaCIsImxlbmd0aCIsImNocm9tZUFuZHJvaWRQYWNrYWdlIiwiaGFzIiwibWFwIiwid20iLCJ3ZWJ2aWV3TmFtZSIsImtub3duUGFja2FnZSIsIktOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIiwiYXBwU3RhdGUiLCJxdWVyeUFwcFN0YXRlIiwiQVBQX1NUQVRFIiwiUlVOTklOR19JTl9CQUNLR1JPVU5EIiwiUlVOTklOR19JTl9GT1JFR1JPVU5EIiwiaW5mbyIsInNldHVwTmV3Q2hyb21lZHJpdmVyIiwiY3VyRGV2aWNlSWQiLCJvbiIsIkNocm9tZWRyaXZlciIsIkVWRU5UX0NIQU5HRUQiLCJtc2ciLCJzdGF0ZSIsIlNUQVRFX1NUT1BQRUQiLCJvbkNocm9tZWRyaXZlclN0b3AiLCJjaHJvbWVkcml2ZXIiLCJwcm94eVJlcVJlcyIsInByb3h5UmVxIiwiYmluZCIsInByb3h5Q29tbWFuZCIsImp3cHJveHkiLCJjb21tYW5kIiwiandwUHJveHlBY3RpdmUiLCJ3YXJuIiwiZXJyIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJrZXlzIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RvcCIsIm1lc3NhZ2UiLCJ2aWV3TmFtZSIsIkNIUk9NSVVNX1dJTiIsInNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lIiwiY2hyb21lT3B0aW9ucyIsImlzQXJyYXkiLCJhcmdzIiwiZGlzbWlzc0Nocm9tZVdlbGNvbWUiLCJhY3Rpdml0eSIsImdldEN1cnJlbnRBY3Rpdml0eSIsImVsIiwiZmluZEVsT3JFbHMiLCJjbGljayIsIkVMRU1FTlQiLCJlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwia25vd25QYWNrYWdlcyIsImNocm9tZUJ1bmRsZUlkIiwiY2hyb21lQW5kcm9pZEFjdGl2aXR5IiwiYXBwQWN0aXZpdHkiLCJoYXNXb3JraW5nV2VidmlldyIsInJlc3RhcnQiLCJnZXRDaHJvbWVkcml2ZXJQb3J0IiwicG9ydFNwZWMiLCJnZXRQb3J0IiwiQiIsInByb21pc2lmeSIsIlBvcnRGaW5kZXIiLCJwb3J0IiwiZm91bmRQb3J0IiwicG90ZW50aWFsUG9ydCIsInN0b3BQb3J0IiwicGFyc2VJbnQiLCJpc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQiLCJpc0ZlYXR1cmVFbmFibGVkIiwiY2hyb21lRHJpdmVyUG9ydCIsImNocm9tZWRyaXZlclBvcnQiLCJjaHJvbWVkcml2ZXJQb3J0cyIsImRldGFpbHMiLCJnZXRXZWJ2aWV3RGV0YWlscyIsInVuZGVmaW5lZCIsImlzRW1wdHkiLCJleGVjdXRhYmxlIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZSIsImNtZEFyZ3MiLCJjaHJvbWVkcml2ZXJBcmdzIiwidmVyYm9zZSIsInNob3dDaHJvbWVkcml2ZXJMb2ciLCJleGVjdXRhYmxlRGlyIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZURpciIsIm1hcHBpbmdQYXRoIiwiY2hyb21lZHJpdmVyQ2hyb21lTWFwcGluZ0ZpbGUiLCJidW5kbGVJZCIsInVzZVN5c3RlbUV4ZWN1dGFibGUiLCJjaHJvbWVkcml2ZXJVc2VTeXN0ZW1FeGVjdXRhYmxlIiwiZGlzYWJsZUJ1aWxkQ2hlY2siLCJjaHJvbWVkcml2ZXJEaXNhYmxlQnVpbGRDaGVjayIsImlzQXV0b2Rvd25sb2FkRW5hYmxlZCIsIm9wdCIsImVuZHNXaXRoIiwibWVyZ2UiLCJjYXBzIiwiY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyIsInN0YXJ0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2NvbnRleHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBDaHJvbWVkcml2ZXIgZnJvbSAnYXBwaXVtLWNocm9tZWRyaXZlcic7XG5pbXBvcnQgUG9ydEZpbmRlciBmcm9tICdwb3J0ZmluZGVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7XG4gIGRlZmF1bHQgYXMgd2Vidmlld0hlbHBlcnMsXG4gIE5BVElWRV9XSU4sIFdFQlZJRVdfQkFTRSwgV0VCVklFV19XSU4sIENIUk9NSVVNX1dJTiwgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVNcbn0gZnJvbSAnLi4vd2Vidmlldy1oZWxwZXJzJztcbmltcG9ydCB7IEFQUF9TVEFURSB9IGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICdjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFjdHVhbCBNSlNPTldQIGNvbW1hbmQgaGFuZGxlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbW1hbmRzLmdldEN1cnJlbnRDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudENvbnRleHQgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgLy8gaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBgbnVsbGAsIGluZGljYXRpbmcgbm8gY29udGV4dFxuICAvLyBleHBsaWNpdGx5IHNldCwgaXQgaXMgdGhlIGRlZmF1bHQgY29udGV4dFxuICByZXR1cm4gdGhpcy5jdXJDb250ZXh0IHx8IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG59O1xuXG5jb21tYW5kcy5nZXRDb250ZXh0cyA9IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHRzICgpIHtcbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICByZXR1cm4gdGhpcy5hc3NpZ25Db250ZXh0cyh3ZWJ2aWV3c01hcHBpbmcpO1xufTtcblxuY29tbWFuZHMuc2V0Q29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHNldENvbnRleHQgKG5hbWUpIHtcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG5hbWUpKSB7XG4gICAgbmFtZSA9IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gV0VCVklFV19XSU4pIHtcbiAgICAvLyBoYW5kbGUgc2V0Q29udGV4dCBcIldFQlZJRVdcIlxuICAgIG5hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICB9XG4gIC8vIGlmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgd2Ugd2FudCwgZG8gbm90aGluZ1xuICBpZiAobmFtZSA9PT0gdGhpcy5jdXJDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBjb25zdCBjb250ZXh0cyA9IHRoaXMuYXNzaWduQ29udGV4dHMod2Vidmlld3NNYXBwaW5nKTtcbiAgLy8gaWYgdGhlIGNvbnRleHQgd2Ugd2FudCBkb2Vzbid0IGV4aXN0LCBmYWlsXG4gIGlmICghXy5pbmNsdWRlcyhjb250ZXh0cywgbmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaENvbnRleHRFcnJvcigpO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5zd2l0Y2hDb250ZXh0KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIHRoaXMuY3VyQ29udGV4dCA9IG5hbWU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdzTWFwcGluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgVGhlIG5hbWUgb2YgdGhlIERldnRvb2xzIFVuaXggc29ja2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBUaGUgd2ViIHZpZXcgYWxpYXMuIExvb2tzIGxpa2UgYFdFQlZJRVdfYFxuICogcHJlZml4IHBsdXMgUElEIG9yIHBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFdlYnZpZXcgaW5mb3JtYXRpb24gYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludFxuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgV2VidmlldyBwYWdlcyBsaXN0IGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vbGlzdCBDRFAgZW5kcG9pbnRcbiAqIEBwcm9wZXJ5IHs/c3RyaW5nfSB3ZWJ2aWV3TmFtZSBBbiBhY3R1YWwgd2VidmlldyBuYW1lIGZvciBzd2l0Y2hpbmcgY29udGV4dC5cbiAqIFRoaXMgdmFsdWUgYmVjb21lcyBudWxsIHdoZW4gZmFpbGluZyB0byBmaW5kIGEgUElEIGZvciBhIHdlYnZpZXcuXG4gKlxuICogVGhlIGZvbGxvd2luZyBqc29uIGRlbW9uc3RyYXRlcyB0aGUgZXhhbXBsZSBvZiBXZWJ2aWV3c01hcHBpbmcgb2JqZWN0LlxuICogTm90ZSB0aGF0IGBkZXNjcmlwdGlvbmAgaW4gYHBhZ2VgIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcgbW9zdCBsaWtlbHkgd2hlbiBpdCBjb21lcyB0byBNb2JpbGUgQ2hyb21lKVxuICoge1xuICogICBcInByb2NcIjogXCJAd2Vidmlld19kZXZ0b29sc19yZW1vdGVfMjIxMzhcIixcbiAqICAgXCJ3ZWJ2aWV3XCI6IFwiV0VCVklFV18yMjEzOFwiLFxuICogICBcImluZm9cIjoge1xuICogICAgIFwiQW5kcm9pZC1QYWNrYWdlXCI6IFwiaW8uYXBwaXVtLnNldHRpbmdzXCIsXG4gKiAgICAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzc0LjAuMzcyOS4xODVcIixcbiAqICAgICBcIlByb3RvY29sLVZlcnNpb25cIjogXCIxLjNcIixcbiAqICAgICBcIlVzZXItQWdlbnRcIjogXCJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IEFuZHJvaWQgU0RLIGJ1aWx0IGZvciB4ODYgQnVpbGQvUVNSMS4xOTA5MjAuMDAxOyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzc0LjAuMzcyOS4xODUgTW9iaWxlIFNhZmFyaS81MzcuMzZcIixcbiAqICAgICBcIlY4LVZlcnNpb25cIjogXCI3LjQuMjg4LjI4XCIsXG4gKiAgICAgXCJXZWJLaXQtVmVyc2lvblwiOiBcIjUzNy4zNiAoQDIyOTU1NjgyZjk0Y2UwOTMzNjE5N2JmYjhkZmZlYTk5MWZhMzJmMGQpXCIsXG4gKiAgICAgXCJ3ZWJTb2NrZXREZWJ1Z2dlclVybFwiOiBcIndzOi8vMTI3LjAuMC4xOjEwOTAwL2RldnRvb2xzL2Jyb3dzZXJcIlxuICogICB9LFxuICogICBcInBhZ2VzXCI6IFtcbiAqICAgICB7XG4gKiAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwie1xcXCJhdHRhY2hlZFxcXCI6dHJ1ZSxcXFwiZW1wdHlcXFwiOmZhbHNlLFxcXCJoZWlnaHRcXFwiOjE0NTgsXFxcInNjcmVlblhcXFwiOjAsXFxcInNjcmVlbllcXFwiOjMzNixcXFwidmlzaWJsZVxcXCI6dHJ1ZSxcXFwid2lkdGhcXFwiOjEwODB9XCIsXG4gKiAgICAgICBcImRldnRvb2xzRnJvbnRlbmRVcmxcIjogXCJodHRwOi8vY2hyb21lLWRldnRvb2xzLWZyb250ZW5kLmFwcHNwb3QuY29tL3NlcnZlX3Jldi9AMjI5NTU2ODJmOTRjZTA5MzM2MTk3YmZiOGRmZmVhOTkxZmEzMmYwZC9pbnNwZWN0b3IuaHRtbD93cz0xMjcuMC4wLjE6MTA5MDAvZGV2dG9vbHMvcGFnZS8yNzMyNUNDNTBCNjAwRDMxQjIzM0Y0NUUwOTQ4N0IxRlwiLFxuICogICAgICAgXCJpZFwiOiBcIjI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCIsXG4gKiAgICAgICBcInRpdGxlXCI6IFwiUmVsZWFzZXMgwrcgYXBwaXVtL2FwcGl1bSDCtyBHaXRIdWJcIixcbiAqICAgICAgIFwidHlwZVwiOiBcInBhZ2VcIixcbiAqICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcmVsZWFzZXNcIixcbiAqICAgICAgIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovLzEyNy4wLjAuMToxMDkwMC9kZXZ0b29scy9wYWdlLzI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCJcbiAqICAgICB9XG4gKiAgIF0sXG4gKiAgIFwid2Vidmlld05hbWVcIjogXCJXRUJWSUVXX2NvbS5pby5hcHBpdW0uc2V0dGluZ1wiXG4gKiB9XG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgd2Vidmlld3NNYXBwaW5nIGJhc2VkIG9uIENEUCBlbmRwb2ludHNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmdcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0Q29udGV4dHMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRDb250ZXh0cyAoKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgYW5kcm9pZERldmljZVNvY2tldDogdGhpcy5vcHRzLmFuZHJvaWREZXZpY2VTb2NrZXQsXG4gICAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXM6IHRydWUsXG4gICAgd2Vidmlld0RldnRvb2xzUG9ydDogdGhpcy5vcHRzLndlYnZpZXdEZXZ0b29sc1BvcnQsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uOiB0cnVlXG4gIH07XG4gIHJldHVybiBhd2FpdCB3ZWJ2aWV3SGVscGVycy5nZXRXZWJWaWV3c01hcHBpbmcodGhpcy5hZGIsIG9wdHMpO1xufTtcblxuaGVscGVycy5hc3NpZ25Db250ZXh0cyA9IGZ1bmN0aW9uIGFzc2lnbkNvbnRleHRzICh3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe2lzQ2hyb21lU2Vzc2lvbjogdGhpcy5pc0Nocm9tZVNlc3Npb259LCB0aGlzLm9wdHMpO1xuICBjb25zdCB3ZWJ2aWV3cyA9IHdlYnZpZXdIZWxwZXJzLnBhcnNlV2Vidmlld05hbWVzKHdlYnZpZXdzTWFwcGluZywgb3B0cyk7XG4gIHRoaXMuY29udGV4dHMgPSBbTkFUSVZFX1dJTiwgLi4ud2Vidmlld3NdO1xuICB0aGlzLmxvZy5kZWJ1ZyhgQXZhaWxhYmxlIGNvbnRleHRzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29udGV4dHMpfWApO1xuICByZXR1cm4gdGhpcy5jb250ZXh0cztcbn07XG5cbmhlbHBlcnMuc3dpdGNoQ29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHN3aXRjaENvbnRleHQgKG5hbWUsIHdlYnZpZXdzTWFwcGluZykge1xuICAvLyBXZSBoYXZlIHNvbWUgb3B0aW9ucyB3aGVuIGl0IGNvbWVzIHRvIHdlYnZpZXdzLiBJZiB3ZSB3YW50IGFcbiAgLy8gQ2hyb21lZHJpdmVyIHdlYnZpZXcsIHdlIGNhbiBvbmx5IGNvbnRyb2wgb25lIGF0IGEgdGltZS5cbiAgaWYgKHRoaXMuaXNDaHJvbWVkcml2ZXJDb250ZXh0KG5hbWUpKSB7XG4gICAgLy8gc3RhcnQgcHJveHlpbmcgY29tbWFuZHMgZGlyZWN0bHkgdG8gY2hyb21lZHJpdmVyXG4gICAgYXdhaXQgdGhpcy5zdGFydENocm9tZWRyaXZlclByb3h5KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIH0gZWxzZSBpZiAodGhpcy5pc0Nocm9tZWRyaXZlckNvbnRleHQodGhpcy5jdXJDb250ZXh0KSkge1xuICAgIC8vIGlmIHdlJ3JlIG1vdmluZyB0byBhIG5vbi1jaHJvbWVkcml2ZXIgd2VidmlldywgYW5kIG91ciBjdXJyZW50IGNvbnRleHRcbiAgICAvLyBfaXNfIGEgY2hyb21lZHJpdmVyIHdlYnZpZXcsIGlmIGNhcHMgcmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucyBpcyBzZXRcbiAgICAvLyB0byB0cnVlIHRoZW4ga2lsbCBjaHJvbWVkcml2ZXIgc2Vzc2lvbiB1c2luZyBzdG9wQ2hyb21lZHJpdmVyUHJveGllcyBvclxuICAgIC8vIGVsc2Ugc2ltcGx5IHN1c3BlbmQgcHJveHlpbmcgdG8gdGhlIGxhdHRlclxuICAgIGlmICh0aGlzLm9wdHMucmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucykge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ3JlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMgc2V0IHRvIHRydWU7IGtpbGxpbmcgZXhpc3RpbmcgY2hyb21lZHJpdmVycycpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERpZG4ndCBrbm93IGhvdyB0byBoYW5kbGUgc3dpdGNoaW5nIHRvIGNvbnRleHQgJyR7bmFtZX0nYCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBPbi1vYmplY3QgY29udGV4dC1yZWxhdGVkIGhlbHBlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBUaGUgcmVhc29uIHRoaXMgaXMgYSBmdW5jdGlvbiBhbmQgbm90IGp1c3QgYSBjb25zdGFudCBpcyB0aGF0IGJvdGggYW5kcm9pZC1cbi8vIGRyaXZlciBhbmQgc2VsZW5kcm9pZC1kcml2ZXIgdXNlIHRoaXMgbG9naWMsIGFuZCBlYWNoIG9uZSByZXR1cm5zXG4vLyBhIGRpZmZlcmVudCBkZWZhdWx0IGNvbnRleHQgbmFtZVxuaGVscGVycy5kZWZhdWx0Q29udGV4dE5hbWUgPSBmdW5jdGlvbiBkZWZhdWx0Q29udGV4dE5hbWUgKCkge1xuICByZXR1cm4gTkFUSVZFX1dJTjtcbn07XG5cbmhlbHBlcnMuZGVmYXVsdFdlYnZpZXdOYW1lID0gZnVuY3Rpb24gZGVmYXVsdFdlYnZpZXdOYW1lICgpIHtcbiAgcmV0dXJuIFdFQlZJRVdfQkFTRSArIHRoaXMub3B0cy5hcHBQYWNrYWdlO1xufTtcblxuaGVscGVycy5pc1dlYkNvbnRleHQgPSBmdW5jdGlvbiBpc1dlYkNvbnRleHQgKCkge1xuICByZXR1cm4gdGhpcy5jdXJDb250ZXh0ICE9PSBudWxsICYmIHRoaXMuY3VyQ29udGV4dCAhPT0gTkFUSVZFX1dJTjtcbn07XG5cbi8vIFR1cm4gb24gcHJveHlpbmcgdG8gYW4gZXhpc3RpbmcgQ2hyb21lZHJpdmVyIHNlc3Npb24gb3IgYSBuZXcgb25lXG5oZWxwZXJzLnN0YXJ0Q2hyb21lZHJpdmVyUHJveHkgPSBhc3luYyBmdW5jdGlvbiBzdGFydENocm9tZWRyaXZlclByb3h5IChjb250ZXh0LCB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgdGhpcy5sb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gY2hyb21lLWJhY2tlZCB3ZWJ2aWV3IGNvbnRleHQgJyR7Y29udGV4dH0nYCk7XG5cbiAgbGV0IGNkO1xuICBpZiAodGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XSkge1xuICAgIC8vIGluIHRoZSBjYXNlIHdoZXJlIHdlJ3ZlIGFscmVhZHkgc2V0IHVwIGEgY2hyb21lZHJpdmVyIGZvciBhIGNvbnRleHQsXG4gICAgLy8gd2Ugd2FudCB0byByZWNvbm5lY3QgdG8gaXQsIG5vdCBjcmVhdGUgYSB3aG9sZSBuZXcgb25lXG4gICAgdGhpcy5sb2cuZGVidWcoYEZvdW5kIGV4aXN0aW5nIENocm9tZWRyaXZlciBmb3IgY29udGV4dCAnJHtjb250ZXh0fScuIFVzaW5nIGl0LmApO1xuICAgIGNkID0gdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgICBhd2FpdCBzZXR1cEV4aXN0aW5nQ2hyb21lZHJpdmVyKHRoaXMubG9nLCBjZCk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IG9wdHMgPSBfLmNsb25lRGVlcCh0aGlzLm9wdHMpO1xuICAgIG9wdHMuY2hyb21lVXNlUnVubmluZ0FwcCA9IHRydWU7XG5cbiAgICAvLyBpZiByZXF1ZXN0ZWQsIHRlbGwgY2hyb21lZHJpdmVyIHRvIGF0dGFjaCB0byB0aGUgYW5kcm9pZCBwYWNrYWdlIHdlIGhhdmVcbiAgICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQgbmFtZSwgcmF0aGVyIHRoYW4gdGhlIHBhY2thZ2Ugb2YgdGhlIEFVVC5cbiAgICAvLyBBbmQgdHVybiB0aGlzIG9uIGJ5IGRlZmF1bHQgZm9yIGNocm9tZS0taWYgY2hyb21lIHBvcHMgdXAgd2l0aCBhIHdlYnZpZXdcbiAgICAvLyBhbmQgc29tZW9uZSB3YW50cyB0byBzd2l0Y2ggdG8gaXQsIHdlIHNob3VsZCBsZXQgY2hyb21lZHJpdmVyIGNvbm5lY3QgdG9cbiAgICAvLyBjaHJvbWUgcmF0aGVyIHRoYW4gc3RheWluZyBzdHVjayBvbiB0aGUgQVVUXG4gICAgaWYgKG9wdHMuZXh0cmFjdENocm9tZUFuZHJvaWRQYWNrYWdlRnJvbUNvbnRleHROYW1lIHx8IGNvbnRleHQgPT09IGAke1dFQlZJRVdfQkFTRX1jaHJvbWVgKSB7XG4gICAgICBsZXQgYW5kcm9pZFBhY2thZ2UgPSBjb250ZXh0Lm1hdGNoKGAke1dFQlZJRVdfQkFTRX0oLispYCk7XG4gICAgICBpZiAoYW5kcm9pZFBhY2thZ2UgJiYgYW5kcm9pZFBhY2thZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlID0gYW5kcm9pZFBhY2thZ2VbMV07XG4gICAgICB9XG4gICAgICBpZiAoIW9wdHMuZXh0cmFjdENocm9tZUFuZHJvaWRQYWNrYWdlRnJvbUNvbnRleHROYW1lKSB7XG4gICAgICAgIGlmIChfLmhhcyh0aGlzLm9wdHMsICdlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24nKSAmJiAhdGhpcy5vcHRzLmVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbikge1xuICAgICAgICAgIC8vIFdoZW4gZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIGNhcGFiaWxpdHkgaXMgZXhwbGljaXRseSBkaXNhYmxlZCwgdHJ5IHRvIGlkZW50aWZ5XG4gICAgICAgICAgLy8gY2hyb21lQW5kcm9pZFBhY2thZ2UgYmFzZWQgb24gY29udGV4dHMsIGtub3duIGNocm9tZSB2YXJpYW50IHBhY2thZ2VzIGFuZCBxdWVyeUFwcFN0YXRlIHJlc3VsdFxuICAgICAgICAgIC8vIHNpbmNlIHdlYnZpZXdzTWFwcGluZyBkb2VzIG5vdCBoYXZlIGluZm8gb2JqZWN0XG4gICAgICAgICAgY29uc3QgY29udGV4dHMgPSB3ZWJ2aWV3c01hcHBpbmcubWFwKCh3bSkgPT4gd20ud2Vidmlld05hbWUpO1xuICAgICAgICAgIGZvciAoY29uc3Qga25vd25QYWNrYWdlIG9mIEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTKSB7XG4gICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhjb250ZXh0cywgYCR7V0VCVklFV19CQVNFfSR7a25vd25QYWNrYWdlfWApKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYXBwU3RhdGUgPSBhd2FpdCB0aGlzLnF1ZXJ5QXBwU3RhdGUoa25vd25QYWNrYWdlKTtcbiAgICAgICAgICAgIGlmIChfLmluY2x1ZGVzKFtBUFBfU1RBVEUuUlVOTklOR19JTl9CQUNLR1JPVU5ELCBBUFBfU1RBVEUuUlVOTklOR19JTl9GT1JFR1JPVU5EXSwgYXBwU3RhdGUpKSB7XG4gICAgICAgICAgICAgIG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2UgPSBrbm93blBhY2thZ2U7XG4gICAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBJZGVudGlmaWVkIGNocm9tZUFuZHJvaWRQYWNrYWdlIGFzICcke29wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2V9JyBgICtcbiAgICAgICAgICAgICAgICBgZm9yIGNvbnRleHQgJyR7Y29udGV4dH0nIGJ5IHF1ZXJ5aW5nIHN0YXRlcyBvZiBDaHJvbWUgYXBwIHBhY2thZ2VzYCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHdtIG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgICAgICAgICAgaWYgKHdtLndlYnZpZXdOYW1lID09PSBjb250ZXh0ICYmIF8uaGFzKHdtPy5pbmZvLCAnQW5kcm9pZC1QYWNrYWdlJykpIHtcbiAgICAgICAgICAgICAgb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSA9IHdtLmluZm9bJ0FuZHJvaWQtUGFja2FnZSddO1xuICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgSWRlbnRpZmllZCBjaHJvbWVBbmRyb2lkUGFja2FnZSBhcyAnJHtvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlfScgYCArXG4gICAgICAgICAgICAgICAgYGZvciBjb250ZXh0ICcke2NvbnRleHR9JyBieSBDRFBgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2QgPSBhd2FpdCB0aGlzLnNldHVwTmV3Q2hyb21lZHJpdmVyKG9wdHMsIHRoaXMuYWRiLmN1ckRldmljZUlkLCB0aGlzLmFkYiwgY29udGV4dCk7XG4gICAgLy8gYmluZCBvdXIgc3RvcC9leGl0IGhhbmRsZXIsIHBhc3NpbmcgaW4gY29udGV4dCBzbyB3ZSBrbm93IHdoaWNoXG4gICAgLy8gb25lIHN0b3BwZWQgdW5leHBlY3RlZGx5XG4gICAgY2Qub24oQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIChtc2cpID0+IHtcbiAgICAgIGlmIChtc2cuc3RhdGUgPT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICAgIHRoaXMub25DaHJvbWVkcml2ZXJTdG9wKGNvbnRleHQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIHNhdmUgdGhlIGNocm9tZWRyaXZlciBvYmplY3QgdW5kZXIgdGhlIGNvbnRleHRcbiAgICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdID0gY2Q7XG4gIH1cbiAgLy8gaG9vayB1cCB0aGUgbG9jYWwgdmFyaWFibGVzIHNvIHdlIGNhbiBwcm94eSB0aGlzIGJpelxuICB0aGlzLmNocm9tZWRyaXZlciA9IGNkO1xuICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5jaHJvbWVkcml2ZXIucHJveHlSZXEuYmluZCh0aGlzLmNocm9tZWRyaXZlcik7XG4gIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIuandwcm94eSk7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xufTtcblxuLy8gU3RvcCBwcm94eWluZyB0byBhbnkgQ2hyb21lZHJpdmVyXG5oZWxwZXJzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSA9IGZ1bmN0aW9uIHN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSAoKSB7XG4gIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IG51bGw7XG4gIHRoaXMucHJveHlDb21tYW5kID0gbnVsbDtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xufTtcblxuLy8gSGFuZGxlIGFuIG91dC1vZi1iYW5kIENocm9tZWRyaXZlciBzdG9wIGV2ZW50XG5oZWxwZXJzLm9uQ2hyb21lZHJpdmVyU3RvcCA9IGFzeW5jIGZ1bmN0aW9uIG9uQ2hyb21lZHJpdmVyU3RvcCAoY29udGV4dCkge1xuICB0aGlzLmxvZy53YXJuKGBDaHJvbWVkcml2ZXIgZm9yIGNvbnRleHQgJHtjb250ZXh0fSBzdG9wcGVkIHVuZXhwZWN0ZWRseWApO1xuICBpZiAoY29udGV4dCA9PT0gdGhpcy5jdXJDb250ZXh0KSB7XG4gICAgLy8gd2UgZXhpdGVkIHVuZXhwZWN0ZWRseSB3aGlsZSBhdXRvbWF0aW5nIHRoZSBjdXJyZW50IGNvbnRleHQgYW5kIHNvIHdhbnRcbiAgICAvLyB0byBzaHV0IGRvd24gdGhlIHNlc3Npb24gYW5kIHJlc3BvbmQgd2l0aCBhbiBlcnJvclxuICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoJ0Nocm9tZWRyaXZlciBxdWl0IHVuZXhwZWN0ZWRseSBkdXJpbmcgc2Vzc2lvbicpO1xuICAgIGF3YWl0IHRoaXMuc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24oZXJyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiBhIENocm9tZWRyaXZlciBpbiB0aGUgbm9uLWFjdGl2ZSBjb250ZXh0IGJhcmZzLCB3ZSBkb24ndCByZWFsbHlcbiAgICAvLyBjYXJlLCB3ZSdsbCBqdXN0IG1ha2UgYSBuZXcgb25lIG5leHQgdGltZSB3ZSBuZWVkIHRoZSBjb250ZXh0LlxuICAgIHRoaXMubG9nLndhcm4oXCJDaHJvbWVkcml2ZXIgcXVpdCB1bmV4cGVjdGVkbHksIGJ1dCBpdCB3YXNuJ3QgdGhlIGFjdGl2ZSBcIiArXG4gICAgICAnY29udGV4dCwgaWdub3JpbmcnKTtcbiAgICBkZWxldGUgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgfVxufTtcblxuLy8gSW50ZW50aW9uYWxseSBzdG9wIGFsbCB0aGUgY2hyb21lZHJpdmVycyBjdXJyZW50bHkgYWN0aXZlLCBhbmQgaWdub3JlXG4vLyB0aGVpciBleGl0IGV2ZW50c1xuaGVscGVycy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcyA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BDaHJvbWVkcml2ZXJQcm94aWVzICgpIHtcbiAgdGhpcy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkoKTsgLy8gbWFrZSBzdXJlIHdlIHR1cm4gb2ZmIHRoZSBwcm94eSBmbGFnXG4gIGZvciAobGV0IGNvbnRleHQgb2YgXy5rZXlzKHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMpKSB7XG4gICAgbGV0IGNkID0gdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgU3RvcHBpbmcgY2hyb21lZHJpdmVyIGZvciBjb250ZXh0ICR7Y29udGV4dH1gKTtcbiAgICAvLyBzdG9wIGxpc3RlbmluZyBmb3IgdGhlIHN0b3BwZWQgc3RhdGUgZXZlbnRcbiAgICBjZC5yZW1vdmVBbGxMaXN0ZW5lcnMoQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjZC5zdG9wKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBFcnJvciBzdG9wcGluZyBDaHJvbWVkcml2ZXI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdO1xuICB9XG59O1xuXG5oZWxwZXJzLmlzQ2hyb21lZHJpdmVyQ29udGV4dCA9IGZ1bmN0aW9uIGlzQ2hyb21lZHJpdmVyQ29udGV4dCAodmlld05hbWUpIHtcbiAgcmV0dXJuIF8uaW5jbHVkZXModmlld05hbWUsIFdFQlZJRVdfV0lOKSB8fCB2aWV3TmFtZSA9PT0gQ0hST01JVU1fV0lOO1xufTtcblxuaGVscGVycy5zaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSA9IGZ1bmN0aW9uIHNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lICgpIHtcbiAgcmV0dXJuICEhdGhpcy5vcHRzLmNocm9tZU9wdGlvbnMgJiZcbiAgICAgICAgIF8uaXNBcnJheSh0aGlzLm9wdHMuY2hyb21lT3B0aW9ucy5hcmdzKSAmJlxuICAgICAgICAgdGhpcy5vcHRzLmNocm9tZU9wdGlvbnMuYXJncy5pbmNsdWRlcygnLS1uby1maXJzdC1ydW4nKTtcbn07XG5cbmhlbHBlcnMuZGlzbWlzc0Nocm9tZVdlbGNvbWUgPSBhc3luYyBmdW5jdGlvbiBkaXNtaXNzQ2hyb21lV2VsY29tZSAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ1RyeWluZyB0byBkaXNtaXNzIENocm9tZSB3ZWxjb21lJyk7XG4gIGxldCBhY3Rpdml0eSA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudEFjdGl2aXR5KCk7XG4gIGlmIChhY3Rpdml0eSAhPT0gJ29yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5maXJzdHJ1bi5GaXJzdFJ1bkFjdGl2aXR5Jykge1xuICAgIHRoaXMubG9nLmluZm8oJ0Nocm9tZSB3ZWxjb21lIGRpYWxvZyBuZXZlciBzaG93ZWQgdXAhIENvbnRpbnVpbmcnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGVsID0gYXdhaXQgdGhpcy5maW5kRWxPckVscygnaWQnLCAnY29tLmFuZHJvaWQuY2hyb21lOmlkL3Rlcm1zX2FjY2VwdCcsIGZhbHNlKTtcbiAgYXdhaXQgdGhpcy5jbGljayhlbC5FTEVNRU5UKTtcbiAgdHJ5IHtcbiAgICBsZXQgZWwgPSBhd2FpdCB0aGlzLmZpbmRFbE9yRWxzKCdpZCcsICdjb20uYW5kcm9pZC5jaHJvbWU6aWQvbmVnYXRpdmVfYnV0dG9uJywgZmFsc2UpO1xuICAgIGF3YWl0IHRoaXMuY2xpY2soZWwuRUxFTUVOVCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBETyBOT1RISU5HLCBUSElTIERFVklDRSBESUROVCBMQVVOQ0ggVEhFIFNJR05JTiBESUFMT0dcbiAgICAvLyBJVCBNVVNUIEJFIEEgTk9OIEdNUyBERVZJQ0VcbiAgICB0aGlzLmxvZy53YXJuKGBUaGlzIGRldmljZSBkaWQgbm90IHNob3cgQ2hyb21lIFNpZ25JbiBkaWFsb2csICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLnN0YXJ0Q2hyb21lU2Vzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hyb21lU2Vzc2lvbiAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ1N0YXJ0aW5nIGEgY2hyb21lLWJhc2VkIGJyb3dzZXIgc2Vzc2lvbicpO1xuICBsZXQgb3B0cyA9IF8uY2xvbmVEZWVwKHRoaXMub3B0cyk7XG5cbiAgY29uc3Qga25vd25QYWNrYWdlcyA9IFtcbiAgICAnb3JnLmNocm9taXVtLmNocm9tZS5zaGVsbCcsXG4gICAgJ2NvbS5hbmRyb2lkLmNocm9tZScsXG4gICAgJ2NvbS5jaHJvbWUuYmV0YScsXG4gICAgJ29yZy5jaHJvbWl1bS5jaHJvbWUnLFxuICAgICdvcmcuY2hyb21pdW0ud2Vidmlld19zaGVsbCcsXG4gIF07XG5cbiAgaWYgKF8uaW5jbHVkZXMoa25vd25QYWNrYWdlcywgdGhpcy5vcHRzLmFwcFBhY2thZ2UpKSB7XG4gICAgb3B0cy5jaHJvbWVCdW5kbGVJZCA9IHRoaXMub3B0cy5hcHBQYWNrYWdlO1xuICB9IGVsc2Uge1xuICAgIG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5ID0gdGhpcy5vcHRzLmFwcEFjdGl2aXR5O1xuICB9XG4gIHRoaXMuY2hyb21lZHJpdmVyID0gYXdhaXQgdGhpcy5zZXR1cE5ld0Nocm9tZWRyaXZlcihvcHRzLCB0aGlzLmFkYi5jdXJEZXZpY2VJZCwgdGhpcy5hZGIpO1xuICB0aGlzLmNocm9tZWRyaXZlci5vbihDaHJvbWVkcml2ZXIuRVZFTlRfQ0hBTkdFRCwgKG1zZykgPT4ge1xuICAgIGlmIChtc2cuc3RhdGUgPT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICB0aGlzLm9uQ2hyb21lZHJpdmVyU3RvcChDSFJPTUlVTV9XSU4pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIENocm9tZSBzZXNzaW9uLCB3ZSBlbnN1cmUgdGhhdCB0aGUgY29udGV4dCBpc1xuICAvLyBhcHByb3ByaWF0ZWx5IHNldCBhbmQgdGhhdCB0aGlzIGNocm9tZWRyaXZlciBpcyBhZGRlZCB0byB0aGUgbGlzdFxuICAvLyBvZiBzZXNzaW9uIGNocm9tZWRyaXZlcnMgc28gd2UgY2FuIHN3aXRjaCBiYWNrIGFuZCBmb3J0aFxuICB0aGlzLmN1ckNvbnRleHQgPSBDSFJPTUlVTV9XSU47XG4gIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbQ0hST01JVU1fV0lOXSA9IHRoaXMuY2hyb21lZHJpdmVyO1xuICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5jaHJvbWVkcml2ZXIucHJveHlSZXEuYmluZCh0aGlzLmNocm9tZWRyaXZlcik7XG4gIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIuandwcm94eSk7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xuXG4gIGlmICh0aGlzLnNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lKCkpIHtcbiAgICAvLyBkaXNtaXNzIENocm9tZSB3ZWxjb21lIGRpYWxvZ1xuICAgIGF3YWl0IHRoaXMuZGlzbWlzc0Nocm9tZVdlbGNvbWUoKTtcbiAgfVxufTtcblxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogSW50ZXJuYWwgbGlicmFyeSBmdW5jdGlvbnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwRXhpc3RpbmdDaHJvbWVkcml2ZXIgKGxvZywgY2hyb21lZHJpdmVyKSB7XG4gIC8vIGNoZWNrIHRoZSBzdGF0dXMgYnkgc2VuZGluZyBhIHNpbXBsZSB3aW5kb3ctYmFzZWQgY29tbWFuZCB0byBDaHJvbWVEcml2ZXJcbiAgLy8gaWYgdGhlcmUgaXMgYW4gZXJyb3IsIHdlIHdhbnQgdG8gcmVjcmVhdGUgdGhlIENocm9tZURyaXZlciBzZXNzaW9uXG4gIGlmICghYXdhaXQgY2hyb21lZHJpdmVyLmhhc1dvcmtpbmdXZWJ2aWV3KCkpIHtcbiAgICBsb2cuZGVidWcoJ0Nocm9tZURyaXZlciBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgd2luZG93LiAnICtcbiAgICAgICAgICAgICAgICAgJ1JlLWluaXRpYWxpemluZyB0aGUgc2Vzc2lvbi4nKTtcbiAgICBhd2FpdCBjaHJvbWVkcml2ZXIucmVzdGFydCgpO1xuICB9XG4gIHJldHVybiBjaHJvbWVkcml2ZXI7XG59XG5cbi8qKlxuICogRmluZCBhIGZyZWUgcG9ydCB0byBoYXZlIENocm9tZWRyaXZlciBsaXN0ZW4gb24uXG4gKlxuICogQHBhcmFtIHthcnJheX0gcG9ydFNwZWMgLSBBcnJheSB3aGljaCBpcyBhIGxpc3Qgb2YgcG9ydHMuIEEgbGlzdCBpdGVtIG1heVxuICogYWxzbyBpdHNlbGYgYmUgYW4gYXJyYXkgb2YgbGVuZ3RoIDIgc3BlY2lmeWluZyBhIHN0YXJ0IGFuZCBlbmQgcG9ydCBvZlxuICogYSByYW5nZS4gU29tZSB2YWxpZCBwb3J0IHNwZWNzOlxuICogICAgLSBbODAwMCwgODAwMSwgODAwMl1cbiAqICAgIC0gW1s4MDAwLCA4MDA1XV1cbiAqICAgIC0gWzgwMDAsIFs5MDAwLCA5MTAwXV1cbiAqIEBwYXJhbSB7T2JqZWN0P30gbG9nIExvZ2dlciBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gQSBmcmVlIHBvcnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hyb21lZHJpdmVyUG9ydCAocG9ydFNwZWMsIGxvZyA9IG51bGwpIHtcbiAgY29uc3QgZ2V0UG9ydCA9IEIucHJvbWlzaWZ5KFBvcnRGaW5kZXIuZ2V0UG9ydCwge2NvbnRleHQ6IFBvcnRGaW5kZXJ9KTtcblxuICAvLyBpZiB0aGUgdXNlciBkaWRuJ3QgZ2l2ZSB1cyBhbnkgc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgY2hyb21lZHJpdmVyXG4gIC8vIHBvcnQgcmFuZ2VzLCBqdXN0IGZpbmQgYW55IGZyZWUgcG9ydFxuICBpZiAoIXBvcnRTcGVjKSB7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGdldFBvcnQoKTtcbiAgICBsb2c/LmRlYnVnKGBBIHBvcnQgd2FzIG5vdCBnaXZlbiwgdXNpbmcgcmFuZG9tIGZyZWUgcG9ydDogJHtwb3J0fWApO1xuICAgIHJldHVybiBwb3J0O1xuICB9XG5cbiAgLy8gb3RoZXJ3aXNlIGZpbmQgdGhlIGZyZWUgcG9ydCBiYXNlZCBvbiBhIGxpc3Qgb3IgcmFuZ2UgcHJvdmlkZWQgYnkgdGhlIHVzZXJcbiAgbG9nPy5kZWJ1ZyhgRmluZGluZyBhIGZyZWUgcG9ydCBmb3IgY2hyb21lZHJpdmVyIHVzaW5nIHNwZWMgJHtKU09OLnN0cmluZ2lmeShwb3J0U3BlYyl9YCk7XG4gIGxldCBmb3VuZFBvcnQgPSBudWxsO1xuICBmb3IgKGNvbnN0IHBvdGVudGlhbFBvcnQgb2YgcG9ydFNwZWMpIHtcbiAgICBsZXQgcG9ydCwgc3RvcFBvcnQ7XG4gICAgaWYgKF8uaXNBcnJheShwb3RlbnRpYWxQb3J0KSkge1xuICAgICAgKFtwb3J0LCBzdG9wUG9ydF0gPSBwb3RlbnRpYWxQb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9ydCA9IHBhcnNlSW50KHBvdGVudGlhbFBvcnQsIDEwKTsgLy8gZW5zdXJlIHdlIGhhdmUgYSBudW1iZXIgYW5kIG5vdCBhIHN0cmluZ1xuICAgICAgc3RvcFBvcnQgPSBwb3J0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbG9nPy5kZWJ1ZyhgQ2hlY2tpbmcgcG9ydCByYW5nZSAke3BvcnR9OiR7c3RvcFBvcnR9YCk7XG4gICAgICBmb3VuZFBvcnQgPSBhd2FpdCBnZXRQb3J0KHtwb3J0LCBzdG9wUG9ydH0pO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nPy5kZWJ1ZyhgTm90aGluZyBpbiBwb3J0IHJhbmdlICR7cG9ydH06JHtzdG9wUG9ydH0gd2FzIGF2YWlsYWJsZWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChmb3VuZFBvcnQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGEgZnJlZSBwb3J0IGZvciBjaHJvbWVkcml2ZXIgdXNpbmcgYCArXG4gICAgICAgICAgICAgICAgICAgIGBjaHJvbWVkcml2ZXJQb3J0cyBzcGVjICR7SlNPTi5zdHJpbmdpZnkocG9ydFNwZWMpfWApO1xuICB9XG5cbiAgbG9nPy5kZWJ1ZyhgVXNpbmcgZnJlZSBwb3J0ICR7Zm91bmRQb3J0fSBmb3IgY2hyb21lZHJpdmVyYCk7XG4gIHJldHVybiBmb3VuZFBvcnQ7XG59XG5cbmhlbHBlcnMuaXNDaHJvbWVkcml2ZXJBdXRvZG93bmxvYWRFbmFibGVkID0gZnVuY3Rpb24gaXNDaHJvbWVkcml2ZXJBdXRvZG93bmxvYWRFbmFibGVkICgpIHtcbiAgaWYgKHRoaXMuaXNGZWF0dXJlRW5hYmxlZChDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdGhpcz8ubG9nPy5kZWJ1ZyhgQXV0b21hdGVkIENocm9tZWRyaXZlciBkb3dubG9hZCBpcyBkaXNhYmxlZC4gYCArXG4gICAgYFVzZSAnJHtDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkV9JyBzZXJ2ZXIgZmVhdHVyZSB0byBlbmFibGUgaXRgKTtcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuaGVscGVycy5zZXR1cE5ld0Nocm9tZWRyaXZlciA9IGFzeW5jIGZ1bmN0aW9uIHNldHVwTmV3Q2hyb21lZHJpdmVyIChvcHRzLCBjdXJEZXZpY2VJZCwgYWRiLCBjb250ZXh0ID0gbnVsbCkge1xuICBpZiAob3B0cy5jaHJvbWVEcml2ZXJQb3J0KSB7XG4gICAgdGhpcz8ubG9nPy53YXJuKGBUaGUgJ2Nocm9tZURyaXZlclBvcnQnIGNhcGFiaWxpdHkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSAnY2hyb21lZHJpdmVyUG9ydCcgaW5zdGVhZGApO1xuICAgIG9wdHMuY2hyb21lZHJpdmVyUG9ydCA9IG9wdHMuY2hyb21lRHJpdmVyUG9ydDtcbiAgfVxuXG4gIGlmIChvcHRzLmNocm9tZWRyaXZlclBvcnQpIHtcbiAgICB0aGlzPy5sb2c/LmRlYnVnKGBVc2luZyB1c2VyLXNwZWNpZmllZCBwb3J0ICR7b3B0cy5jaHJvbWVkcml2ZXJQb3J0fSBmb3IgY2hyb21lZHJpdmVyYCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgYSBzaW5nbGUgcG9ydCB3YXNuJ3QgZ2l2ZW4sIHdlJ2xsIGxvb2sgZm9yIGEgZnJlZSBvbmVcbiAgICBvcHRzLmNocm9tZWRyaXZlclBvcnQgPSBhd2FpdCBnZXRDaHJvbWVkcml2ZXJQb3J0KG9wdHMuY2hyb21lZHJpdmVyUG9ydHMsIHRoaXM/LmxvZyk7XG4gIH1cblxuICBjb25zdCBkZXRhaWxzID0gY29udGV4dCA/IHdlYnZpZXdIZWxwZXJzLmdldFdlYnZpZXdEZXRhaWxzKGFkYiwgY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIGlmICghXy5pc0VtcHR5KGRldGFpbHMpKSB7XG4gICAgdGhpcz8ubG9nPy5kZWJ1ZygnUGFzc2luZyB3ZWIgdmlldyBkZXRhaWxzIHRvIHRoZSBDaHJvbWVkcml2ZXIgY29uc3RydWN0b3I6ICcgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkoZGV0YWlscywgbnVsbCwgMikpO1xuICB9XG5cbiAgY29uc3QgY2hyb21lZHJpdmVyID0gbmV3IENocm9tZWRyaXZlcih7XG4gICAgcG9ydDogb3B0cy5jaHJvbWVkcml2ZXJQb3J0LFxuICAgIGV4ZWN1dGFibGU6IG9wdHMuY2hyb21lZHJpdmVyRXhlY3V0YWJsZSxcbiAgICBhZGIsXG4gICAgY21kQXJnczogb3B0cy5jaHJvbWVkcml2ZXJBcmdzLFxuICAgIHZlcmJvc2U6ICEhb3B0cy5zaG93Q2hyb21lZHJpdmVyTG9nLFxuICAgIGV4ZWN1dGFibGVEaXI6IG9wdHMuY2hyb21lZHJpdmVyRXhlY3V0YWJsZURpcixcbiAgICBtYXBwaW5nUGF0aDogb3B0cy5jaHJvbWVkcml2ZXJDaHJvbWVNYXBwaW5nRmlsZSxcbiAgICBidW5kbGVJZDogb3B0cy5jaHJvbWVCdW5kbGVJZCxcbiAgICB1c2VTeXN0ZW1FeGVjdXRhYmxlOiBvcHRzLmNocm9tZWRyaXZlclVzZVN5c3RlbUV4ZWN1dGFibGUsXG4gICAgZGlzYWJsZUJ1aWxkQ2hlY2s6IG9wdHMuY2hyb21lZHJpdmVyRGlzYWJsZUJ1aWxkQ2hlY2ssXG4gICAgZGV0YWlscyxcbiAgICBpc0F1dG9kb3dubG9hZEVuYWJsZWQ6IHRoaXM/LmlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZD8uKClcbiAgfSk7XG5cbiAgLy8gbWFrZSBzdXJlIHRoZXJlIGFyZSBjaHJvbWVPcHRpb25zXG4gIG9wdHMuY2hyb21lT3B0aW9ucyA9IG9wdHMuY2hyb21lT3B0aW9ucyB8fCB7fTtcbiAgLy8gdHJ5IG91dCBhbnkgcHJlZml4ZWQgY2hyb21lT3B0aW9ucyxcbiAgLy8gYW5kIHN0cmlwIHRoZSBwcmVmaXhcbiAgZm9yIChjb25zdCBvcHQgb2YgXy5rZXlzKG9wdHMpKSB7XG4gICAgaWYgKG9wdC5lbmRzV2l0aCgnOmNocm9tZU9wdGlvbnMnKSkge1xuICAgICAgdGhpcz8ubG9nPy53YXJuKGBNZXJnaW5nICcke29wdH0nIGludG8gJ2Nocm9tZU9wdGlvbnMnLiBUaGlzIG1heSBjYXVzZSB1bmV4cGVjdGVkIGJlaGF2aW9yYCk7XG4gICAgICBfLm1lcmdlKG9wdHMuY2hyb21lT3B0aW9ucywgb3B0c1tvcHRdKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjYXBzID0gd2Vidmlld0hlbHBlcnMuY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyhvcHRzLCBjdXJEZXZpY2VJZCwgZGV0YWlscyk7XG4gIHRoaXM/LmxvZz8uZGVidWcoYEJlZm9yZSBzdGFydGluZyBjaHJvbWVkcml2ZXIsIGFuZHJvaWRQYWNrYWdlIGlzICcke2NhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZX0nYCk7XG4gIGF3YWl0IGNocm9tZWRyaXZlci5zdGFydChjYXBzKTtcbiAgcmV0dXJuIGNocm9tZWRyaXZlcjtcbn07XG5jb25zdCBzZXR1cE5ld0Nocm9tZWRyaXZlciA9IGhlbHBlcnMuc2V0dXBOZXdDaHJvbWVkcml2ZXI7XG5cblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQgeyBjb21tYW5kcywgaGVscGVycywgc2V0dXBOZXdDaHJvbWVk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