appium-webdriveragent 4.2.0 → 4.4.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.
@@ -42,9 +42,10 @@ const LIB_SCHEME_TV = 'WebDriverAgentLib_tvOS';
42
42
  const xcodeLog = _support.logger.getLogger('Xcode');
43
43
 
44
44
  class XcodeBuild {
45
- constructor(xcodeVersion, device, args = {}) {
45
+ constructor(xcodeVersion, device, args = {}, log = null) {
46
46
  this.xcodeVersion = xcodeVersion;
47
47
  this.device = device;
48
+ this.log = log !== null && log !== void 0 ? log : _logger.default;
48
49
  this.realDevice = args.realDevice;
49
50
  this.agentPath = args.agentPath;
50
51
  this.bootstrapPath = args.bootstrapPath;
@@ -112,8 +113,7 @@ class XcodeBuild {
112
113
  stdout
113
114
  } = await (0, _teen_process.exec)('xcodebuild', ['-project', this.agentPath, '-showBuildSettings']));
114
115
  } catch (err) {
115
- _logger.default.warn(`Cannot retrieve WDA build settings. Original error: ${err.message}`);
116
-
116
+ this.log.warn(`Cannot retrieve WDA build settings. Original error: ${err.message}`);
117
117
  return;
118
118
  }
119
119
 
@@ -121,19 +121,15 @@ class XcodeBuild {
121
121
  const match = pattern.exec(stdout);
122
122
 
123
123
  if (!match) {
124
- _logger.default.warn(`Cannot parse WDA build dir from ${_lodash.default.truncate(stdout, {
124
+ this.log.warn(`Cannot parse WDA build dir from ${_lodash.default.truncate(stdout, {
125
125
  length: 300
126
126
  })}`);
127
-
128
127
  return;
129
128
  }
130
129
 
131
- _logger.default.debug(`Parsed BUILD_DIR configuration value: '${match[1]}'`);
132
-
130
+ this.log.debug(`Parsed BUILD_DIR configuration value: '${match[1]}'`);
133
131
  this.derivedDataPath = _path.default.dirname(_path.default.dirname(_path.default.normalize(match[1])));
134
-
135
- _logger.default.debug(`Got derived data root: '${this.derivedDataPath}'`);
136
-
132
+ this.log.debug(`Got derived data root: '${this.derivedDataPath}'`);
137
133
  return this.derivedDataPath;
138
134
  })();
139
135
 
@@ -147,8 +143,7 @@ class XcodeBuild {
147
143
  }
148
144
 
149
145
  async prebuild() {
150
- _logger.default.debug('Pre-building WDA before launching test');
151
-
146
+ this.log.debug('Pre-building WDA before launching test');
152
147
  this.usePrebuiltWDA = true;
153
148
  await this.start(true);
154
149
  this.xcodebuild = null;
@@ -161,8 +156,7 @@ class XcodeBuild {
161
156
  const runnerScheme = tmpIsTvOS ? RUNNER_SCHEME_TV : RUNNER_SCHEME_IOS;
162
157
 
163
158
  for (const scheme of [libScheme, runnerScheme]) {
164
- _logger.default.debug(`Cleaning the project scheme '${scheme}' to make sure there are no leftovers from previous installs`);
165
-
159
+ this.log.debug(`Cleaning the project scheme '${scheme}' to make sure there are no leftovers from previous installs`);
166
160
  await (0, _teen_process.exec)('xcodebuild', ['clean', '-project', this.agentPath, '-scheme', scheme]);
167
161
  }
168
162
  }
@@ -209,12 +203,11 @@ class XcodeBuild {
209
203
  if (versionMatch) {
210
204
  args.push(`IPHONEOS_DEPLOYMENT_TARGET=${versionMatch[1]}.${versionMatch[2]}`);
211
205
  } else {
212
- _logger.default.warn(`Cannot parse major and minor version numbers from platformVersion "${this.platformVersion}". ` + 'Will build for the default platform instead');
206
+ this.log.warn(`Cannot parse major and minor version numbers from platformVersion "${this.platformVersion}". ` + 'Will build for the default platform instead');
213
207
  }
214
208
 
215
209
  if (this.realDevice && this.xcodeConfigFile) {
216
- _logger.default.debug(`Using Xcode configuration file: '${this.xcodeConfigFile}'`);
217
-
210
+ this.log.debug(`Using Xcode configuration file: '${this.xcodeConfigFile}'`);
218
211
  args.push('-xcconfig', this.xcodeConfigFile);
219
212
  }
220
213
 
@@ -244,9 +237,7 @@ class XcodeBuild {
244
237
  cmd,
245
238
  args
246
239
  } = this.getCommand(buildOnly);
247
-
248
- _logger.default.debug(`Beginning ${buildOnly ? 'build' : 'test'} with command '${cmd} ${args.join(' ')}' ` + `in directory '${this.bootstrapPath}'`);
249
-
240
+ this.log.debug(`Beginning ${buildOnly ? 'build' : 'test'} with command '${cmd} ${args.join(' ')}' ` + `in directory '${this.bootstrapPath}'`);
250
241
  const env = Object.assign({}, process.env, {
251
242
  USE_PORT: this.wdaRemotePort,
252
243
  WDA_PRODUCT_BUNDLE_IDENTIFIER: this.updatedWDABundleId || _constants.WDA_RUNNER_BUNDLE_ID
@@ -270,16 +261,13 @@ class XcodeBuild {
270
261
  });
271
262
  let logXcodeOutput = !!this.showXcodeLog;
272
263
  const logMsg = _lodash.default.isBoolean(this.showXcodeLog) ? `Output from xcodebuild ${this.showXcodeLog ? 'will' : 'will not'} be logged` : 'Output from xcodebuild will only be logged if any errors are present there';
273
-
274
- _logger.default.debug(`${logMsg}. To change this, use 'showXcodeLog' desired capability`);
275
-
264
+ this.log.debug(`${logMsg}. To change this, use 'showXcodeLog' desired capability`);
276
265
  xcodebuild.on('output', (stdout, stderr) => {
277
266
  let out = stdout || stderr;
278
267
 
279
268
  if (out.includes('Writing diagnostic log for test session to')) {
280
269
  xcodebuild.logLocation = _lodash.default.first(_lodash.default.remove(out.trim().split('\n'), v => v.startsWith(_path.default.sep)));
281
-
282
- _logger.default.debug(`Log file for xcodebuild test: ${xcodebuild.logLocation}`);
270
+ xcodeLog.debug(`Log file for xcodebuild test: ${xcodebuild.logLocation}`);
283
271
  }
284
272
 
285
273
  const ignoreError = IGNORED_ERRORS.some(x => out.includes(x));
@@ -307,7 +295,7 @@ class XcodeBuild {
307
295
  this.xcodebuild._wda_error_message = '';
308
296
  return await new _bluebird.default((resolve, reject) => {
309
297
  this.xcodebuild.on('exit', async (code, signal) => {
310
- _logger.default.error(`xcodebuild exited with code '${code}' and signal '${signal}'`);
298
+ xcodeLog.error(`xcodebuild exited with code '${code}' and signal '${signal}'`);
311
299
 
312
300
  if (this.showXcodeLog && this.xcodebuild.logLocation) {
313
301
  xcodeLog.error(`Contents of xcodebuild log file '${this.xcodebuild.logLocation}':`);
@@ -319,7 +307,7 @@ class XcodeBuild {
319
307
  xcodeLog.error(line);
320
308
  }
321
309
  } catch (err) {
322
- _logger.default.error(`Unable to access xcodebuild log file: '${err.message}'`);
310
+ xcodeLog.error(`Unable to access xcodebuild log file: '${err.message}'`);
323
311
  }
324
312
  }
325
313
 
@@ -344,9 +332,7 @@ class XcodeBuild {
344
332
  }
345
333
  } catch (err) {
346
334
  let msg = `Unable to start WebDriverAgent: ${err}`;
347
-
348
- _logger.default.error(msg);
349
-
335
+ this.log.error(msg);
350
336
  reject(new Error(msg));
351
337
  }
352
338
  })();
@@ -354,8 +340,7 @@ class XcodeBuild {
354
340
  }
355
341
 
356
342
  async waitForStart(timer) {
357
- _logger.default.debug(`Waiting up to ${this.launchTimeout}ms for WebDriverAgent to start`);
358
-
343
+ this.log.debug(`Waiting up to ${this.launchTimeout}ms for WebDriverAgent to start`);
359
344
  let currentStatus = null;
360
345
 
361
346
  try {
@@ -375,9 +360,8 @@ class XcodeBuild {
375
360
  this.agentUrl = currentStatus.ios.ip;
376
361
  }
377
362
 
378
- _logger.default.debug(`WebDriverAgent information:`);
379
-
380
- _logger.default.debug(JSON.stringify(currentStatus, null, 2));
363
+ this.log.debug(`WebDriverAgent information:`);
364
+ this.log.debug(JSON.stringify(currentStatus, null, 2));
381
365
  } catch (err) {
382
366
  throw new Error(`Unable to connect to running WebDriverAgent: ${err.message}`);
383
367
  } finally {
@@ -389,11 +373,10 @@ class XcodeBuild {
389
373
  return currentStatus;
390
374
  }
391
375
 
392
- _logger.default.debug(`WebDriverAgent successfully started after ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
376
+ this.log.debug(`WebDriverAgent successfully started after ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
393
377
  } catch (err) {
394
- _logger.default.debug(err.message);
395
-
396
- _logger.default.warn(`Getting status of WebDriverAgent on device timed out. Continuing`);
378
+ this.log.debug(err.message);
379
+ this.log.warn(`Getting status of WebDriverAgent on device timed out. Continuing`);
397
380
  }
398
381
 
399
382
  return currentStatus;
@@ -410,4 +393,4 @@ var _default = XcodeBuild;
410
393
  exports.default = _default;require('source-map-support').install();
411
394
 
412
395
 
413
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi94Y29kZWJ1aWxkLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfU0lHTklOR19JRCIsIlBSRUJVSUxEX0RFTEFZIiwiUlVOTkVSX1NDSEVNRV9JT1MiLCJMSUJfU0NIRU1FX0lPUyIsIkVSUk9SX1dSSVRJTkdfQVRUQUNITUVOVCIsIkVSUk9SX0NPUFlJTkdfQVRUQUNITUVOVCIsIklHTk9SRURfRVJST1JTIiwiUlVOTkVSX1NDSEVNRV9UViIsIkxJQl9TQ0hFTUVfVFYiLCJ4Y29kZUxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsIlhjb2RlQnVpbGQiLCJjb25zdHJ1Y3RvciIsInhjb2RlVmVyc2lvbiIsImRldmljZSIsImFyZ3MiLCJyZWFsRGV2aWNlIiwiYWdlbnRQYXRoIiwiYm9vdHN0cmFwUGF0aCIsInBsYXRmb3JtVmVyc2lvbiIsInBsYXRmb3JtTmFtZSIsImlvc1Nka1ZlcnNpb24iLCJzaG93WGNvZGVMb2ciLCJ4Y29kZUNvbmZpZ0ZpbGUiLCJ4Y29kZU9yZ0lkIiwieGNvZGVTaWduaW5nSWQiLCJrZXljaGFpblBhdGgiLCJrZXljaGFpblBhc3N3b3JkIiwicHJlYnVpbGRXREEiLCJ1c2VQcmVidWlsdFdEQSIsInVzZVNpbXBsZUJ1aWxkVGVzdCIsInVzZVhjdGVzdHJ1bkZpbGUiLCJsYXVuY2hUaW1lb3V0Iiwid2RhUmVtb3RlUG9ydCIsInVwZGF0ZWRXREFCdW5kbGVJZCIsImRlcml2ZWREYXRhUGF0aCIsIm1qcGVnU2VydmVyUG9ydCIsInByZWJ1aWxkRGVsYXkiLCJfIiwiaXNOdW1iZXIiLCJhbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiIsInJlc3VsdEJ1bmRsZVBhdGgiLCJyZXN1bHRCdW5kbGVWZXJzaW9uIiwiaW5pdCIsIm5vU2Vzc2lvblByb3h5IiwiZGV2aXZlSW5mbyIsImlzUmVhbERldmljZSIsInVkaWQiLCJ4Y3Rlc3RydW5GaWxlUGF0aCIsInJldHJpZXZlRGVyaXZlZERhdGFQYXRoIiwiX2Rlcml2ZWREYXRhUGF0aFByb21pc2UiLCJzdGRvdXQiLCJlcnIiLCJsb2ciLCJ3YXJuIiwibWVzc2FnZSIsInBhdHRlcm4iLCJtYXRjaCIsImV4ZWMiLCJ0cnVuY2F0ZSIsImxlbmd0aCIsImRlYnVnIiwicGF0aCIsImRpcm5hbWUiLCJub3JtYWxpemUiLCJyZXNldCIsInByZWJ1aWxkIiwic3RhcnQiLCJ4Y29kZWJ1aWxkIiwiQiIsImRlbGF5IiwiY2xlYW5Qcm9qZWN0IiwidG1wSXNUdk9TIiwibGliU2NoZW1lIiwicnVubmVyU2NoZW1lIiwic2NoZW1lIiwiZ2V0Q29tbWFuZCIsImJ1aWxkT25seSIsImNtZCIsImJ1aWxkQ21kIiwidGVzdENtZCIsInB1c2giLCJ2ZXJzaW9uTWF0Y2giLCJSZWdFeHAiLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX1hDVUlURVNUX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUyIsImNyZWF0ZVN1YlByb2Nlc3MiLCJqb2luIiwiT2JqZWN0IiwiYXNzaWduIiwiVVNFX1BPUlQiLCJXREFfUFJPRFVDVF9CVU5ETEVfSURFTlRJRklFUiIsIldEQV9SVU5ORVJfQlVORExFX0lEIiwiTUpQRUdfU0VSVkVSX1BPUlQiLCJ1cGdyYWRlVGltZXN0YW1wIiwiVVBHUkFERV9USU1FU1RBTVAiLCJTdWJQcm9jZXNzIiwiY3dkIiwiZGV0YWNoZWQiLCJzdGRpbyIsImxvZ1hjb2RlT3V0cHV0IiwibG9nTXNnIiwiaXNCb29sZWFuIiwib24iLCJzdGRlcnIiLCJvdXQiLCJpbmNsdWRlcyIsImxvZ0xvY2F0aW9uIiwiZmlyc3QiLCJyZW1vdmUiLCJ0cmltIiwic3BsaXQiLCJ2Iiwic3RhcnRzV2l0aCIsInNlcCIsImlnbm9yZUVycm9yIiwic29tZSIsIngiLCJfd2RhX2Vycm9yX29jY3VycmVkIiwibGluZSIsIkVPTCIsImVycm9yIiwiX3dkYV9lcnJvcl9tZXNzYWdlIiwicmVzb2x2ZSIsInJlamVjdCIsImNvZGUiLCJzaWduYWwiLCJkYXRhIiwiZnMiLCJyZWFkRmlsZSIsInByb2Nlc3NFeGl0ZWQiLCJFcnJvciIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGF0dXMiLCJ3YWl0Rm9yU3RhcnQiLCJtc2ciLCJjdXJyZW50U3RhdHVzIiwicmV0cmllcyIsInBhcnNlSW50IiwicHJveHlUaW1lb3V0IiwidGltZW91dCIsImNvbW1hbmQiLCJpb3MiLCJpcCIsImFnZW50VXJsIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwicXVpdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxrQkFBa0IsR0FBRyxrQkFBM0I7QUFDQSxNQUFNQyxjQUFjLEdBQUcsQ0FBdkI7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxzQkFBMUI7QUFDQSxNQUFNQyxjQUFjLEdBQUcsbUJBQXZCO0FBRUEsTUFBTUMsd0JBQXdCLEdBQUcsdUNBQWpDO0FBQ0EsTUFBTUMsd0JBQXdCLEdBQUcsa0NBQWpDO0FBQ0EsTUFBTUMsY0FBYyxHQUFHLENBQ3JCRix3QkFEcUIsRUFFckJDLHdCQUZxQixFQUdyQixxQ0FIcUIsQ0FBdkI7QUFNQSxNQUFNRSxnQkFBZ0IsR0FBRywyQkFBekI7QUFDQSxNQUFNQyxhQUFhLEdBQUcsd0JBQXRCOztBQUVBLE1BQU1DLFFBQVEsR0FBR0MsZ0JBQU9DLFNBQVAsQ0FBaUIsT0FBakIsQ0FBakI7O0FBR0EsTUFBTUMsVUFBTixDQUFpQjtBQUNmQyxFQUFBQSxXQUFXLENBQUVDLFlBQUYsRUFBZ0JDLE1BQWhCLEVBQXdCQyxJQUFJLEdBQUcsRUFBL0IsRUFBbUM7QUFDNUMsU0FBS0YsWUFBTCxHQUFvQkEsWUFBcEI7QUFFQSxTQUFLQyxNQUFMLEdBQWNBLE1BQWQ7QUFFQSxTQUFLRSxVQUFMLEdBQWtCRCxJQUFJLENBQUNDLFVBQXZCO0FBRUEsU0FBS0MsU0FBTCxHQUFpQkYsSUFBSSxDQUFDRSxTQUF0QjtBQUNBLFNBQUtD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OEJELFlBQTlCO0FBQ0Q7QUFDRixPQW5CSyxDQUFOOztBQXFCQSxVQUFJLEtBQUsxRSxVQUFMLENBQWdCK0QsYUFBcEIsRUFBbUM7QUFFakMsZUFBT1EsYUFBUDtBQUNEOztBQUVEdEYsc0JBQUlRLEtBQUosQ0FBVyw2Q0FBNEN3RSxLQUFLLENBQUNpQixXQUFOLEdBQW9CQyxjQUFwQixDQUFtQ0MsT0FBbkMsQ0FBMkMsQ0FBM0MsQ0FBOEMsSUFBckc7QUFDRCxLQTdCRCxDQTZCRSxPQUFPcEcsR0FBUCxFQUFZO0FBR1pDLHNCQUFJUSxLQUFKLENBQVVULEdBQUcsQ0FBQ0csT0FBZDs7QUFDQUYsc0JBQUlDLElBQUosQ0FBVSxrRUFBVjtBQUNEOztBQUNELFdBQU9xRixhQUFQO0FBQ0Q7O0FBRVMsUUFBSmMsSUFBSSxHQUFJO0FBQ1osVUFBTSx3QkFBWSxZQUFaLEVBQTBCLEtBQUtyRixVQUEvQixDQUFOO0FBQ0Q7O0FBcFhjOzs7ZUF3WEZ6RCxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIGxvZ2dlciwgdGltaW5nIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtcbiAgc2V0UmVhbERldmljZVNlY3VyaXR5LCBnZW5lcmF0ZVhjb2RlQ29uZmlnRmlsZSwgc2V0WGN0ZXN0cnVuRmlsZSxcbiAgdXBkYXRlUHJvamVjdEZpbGUsIHJlc2V0UHJvamVjdEZpbGUsIGtpbGxQcm9jZXNzLFxuICBnZXRXREFVcGdyYWRlVGltZXN0YW1wLCBpc1R2T1MgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEVPTCB9IGZyb20gJ29zJztcbmltcG9ydCB7IFdEQV9SVU5ORVJfQlVORExFX0lEIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5cbmNvbnN0IERFRkFVTFRfU0lHTklOR19JRCA9ICdpUGhvbmUgRGV2ZWxvcGVyJztcbmNvbnN0IFBSRUJVSUxEX0RFTEFZID0gMDtcbmNvbnN0IFJVTk5FUl9TQ0hFTUVfSU9TID0gJ1dlYkRyaXZlckFnZW50UnVubmVyJztcbmNvbnN0IExJQl9TQ0hFTUVfSU9TID0gJ1dlYkRyaXZlckFnZW50TGliJztcblxuY29uc3QgRVJST1JfV1JJVElOR19BVFRBQ0hNRU5UID0gJ0Vycm9yIHdyaXRpbmcgYXR0YWNobWVudCBkYXRhIHRvIGZpbGUnO1xuY29uc3QgRVJST1JfQ09QWUlOR19BVFRBQ0hNRU5UID0gJ0Vycm9yIGNvcHlpbmcgdGVzdGluZyBhdHRhY2htZW50JztcbmNvbnN0IElHTk9SRURfRVJST1JTID0gW1xuICBFUlJPUl9XUklUSU5HX0FUVEFDSE1FTlQsXG4gIEVSUk9SX0NPUFlJTkdfQVRUQUNITUVOVCxcbiAgJ0ZhaWxlZCB0byByZW1vdmUgc2NyZWVuc2hvdCBhdCBwYXRoJyxcbl07XG5cbmNvbnN0IFJVTk5FUl9TQ0hFTUVfVFYgPSAnV2ViRHJpdmVyQWdlbnRSdW5uZXJfdHZPUyc7XG5jb25zdCBMSUJfU0NIRU1FX1RWID0gJ1dlYkRyaXZlckFnZW50TGliX3R2T1MnO1xuXG5jb25zdCB4Y29kZUxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1hjb2RlJyk7XG5cblxuY2xhc3MgWGNvZGVCdWlsZCB7XG4gIGNvbnN0cnVjdG9yICh4Y29kZVZlcnNpb24sIGRldmljZSwgYXJncyA9IHt9KSB7XG4gICAgdGhpcy54Y29kZVZlcnNpb24gPSB4Y29kZVZlcnNpb247XG5cbiAgICB0aGlzLmRldmljZSA9IGRldmljZTtcblxuICAgIHRoaXMucmVhbERldmljZSA9IGFyZ3MucmVhbERldmljZTtcblxuICAgIHRoaXMuYWdlbnRQYXRoID0gYXJncy5hZ2VudFBhdGg7XG4gICAgdGhpcy5ib290c3RyYXBQYXRoID0gYXJncy5ib290c3RyYXBQYXRoO1xuXG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcblxuICAgIHRoaXMuc2hvd1hjb2RlTG9nID0gYXJncy5zaG93WGNvZGVMb2c7XG5cbiAgICB0aGlzLnhjb2RlQ29uZmlnRmlsZSA9IGFyZ3MueGNvZGVDb25maWdGaWxlO1xuICAgIHRoaXMueGNvZGVPcmdJZCA9IGFyZ3MueGNvZGVPcmdJZDtcbiAgICB0aGlzLnhjb2RlU2lnbmluZ0lkID0gYXJncy54Y29kZVNpZ25pbmdJZCB8fCBERUZBVUxUX1NJR05JTkdfSUQ7XG4gICAgdGhpcy5rZXljaGFpblBhdGggPSBhcmdzLmtleWNoYWluUGF0aDtcbiAgICB0aGlzLmtleWNoYWluUGFzc3dvcmQgPSBhcmdzLmtleWNoYWluUGFzc3dvcmQ7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLnVzZVNpbXBsZUJ1aWxkVGVzdCA9IGFyZ3MudXNlU2ltcGxlQnVpbGRUZXN0O1xuXG4gICAgdGhpcy51c2VYY3Rlc3RydW5GaWxlID0gYXJncy51c2VYY3Rlc3RydW5GaWxlO1xuXG4gICAgdGhpcy5sYXVuY2hUaW1lb3V0ID0gYXJncy5sYXVuY2hUaW1lb3V0O1xuXG4gICAgdGhpcy53ZGFSZW1vdGVQb3J0ID0gYXJncy53ZGFSZW1vdGVQb3J0O1xuXG4gICAgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgPSBhcmdzLnVwZGF0ZWRXREFCdW5kbGVJZDtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuXG4gICAgdGhpcy5tanBlZ1NlcnZlclBvcnQgPSBhcmdzLm1qcGVnU2VydmVyUG9ydDtcblxuICAgIHRoaXMucHJlYnVpbGREZWxheSA9IF8uaXNOdW1iZXIoYXJncy5wcmVidWlsZERlbGF5KSA/IGFyZ3MucHJlYnVpbGREZWxheSA6IFBSRUJVSUxEX0RFTEFZO1xuXG4gICAgdGhpcy5hbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiA9IGFyZ3MuYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb247XG5cbiAgICB0aGlzLnJlc3VsdEJ1bmRsZVBhdGggPSBhcmdzLnJlc3VsdEJ1bmRsZVBhdGg7XG4gICAgdGhpcy5yZXN1bHRCdW5kbGVWZXJzaW9uID0gYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgaW5pdCAobm9TZXNzaW9uUHJveHkpIHtcbiAgICB0aGlzLm5vU2Vzc2lvblByb3h5ID0gbm9TZXNzaW9uUHJveHk7XG5cbiAgICBpZiAodGhpcy51c2VYY3Rlc3RydW5GaWxlKSB7XG4gICAgICBjb25zdCBkZXZpdmVJbmZvID0ge1xuICAgICAgICBpc1JlYWxEZXZpY2U6IHRoaXMucmVhbERldmljZSxcbiAgICAgICAgdWRpZDogdGhpcy5kZXZpY2UudWRpZCxcbiAgICAgICAgcGxhdGZvcm1WZXJzaW9uOiB0aGlzLnBsYXRmb3JtVmVyc2lvbixcbiAgICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZVxuICAgICAgfTtcbiAgICAgIHRoaXMueGN0ZXN0cnVuRmlsZVBhdGggPSBhd2FpdCBzZXRYY3Rlc3RydW5GaWxlKGRldml2ZUluZm8sIHRoaXMuaW9zU2RrVmVyc2lvbiwgdGhpcy5ib290c3RyYXBQYXRoLCB0aGlzLndkYVJlbW90ZVBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIG5lY2Vzc2FyeSwgdXBkYXRlIHRoZSBidW5kbGVJZCB0byB1c2VyJ3Mgc3BlY2lmaWNhdGlvblxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UpIHtcbiAgICAgIC8vIEluIGNhc2UgdGhlIHByb2plY3Qgc3RpbGwgaGFzIHRoZSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRCwgcmVzZXQgdGhlIHByb2plY3QgZmlsZSBmaXJzdC5cbiAgICAgIC8vIC0gV2UgZG8gdGhpcyByZXNldCBldmVuIGlmIHVwZGF0ZWRXREFCdW5kbGVJZCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAgLy8gICBzaW5jZSB0aGUgcHJldmlvdXMgdXBkYXRlZFdEQUJ1bmRsZUlkIHRlc3QgaGFzIGdlbmVyYXRlZCB0aGUgdXNlciBzcGVjaWZpYyBidW5kbGUgSUQgcHJvamVjdCBmaWxlLlxuICAgICAgLy8gLSBXZSBkb24ndCBjYWxsIHJlc2V0UHJvamVjdEZpbGUgZm9yIHNpbXVsYXRvcixcbiAgICAgIC8vICAgc2luY2Ugc2ltdWxhdG9yIHRlc3QgcnVuIHdpbGwgd29yayB3aXRoIGFueSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRC5cbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgICAgaWYgKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZVByb2plY3RGaWxlKHRoaXMuYWdlbnRQYXRoLCB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEZXJpdmVkRGF0YVBhdGggKCkge1xuICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVyaXZlZERhdGFQYXRoO1xuICAgIH1cblxuICAgIC8vIGF2b2lkIHJhY2UgY29uZGl0aW9uc1xuICAgIGlmICh0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBzdGRvdXQ7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgWyctcHJvamVjdCcsIHRoaXMuYWdlbnRQYXRoLCAnLXNob3dCdWlsZFNldHRpbmdzJ10pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2cud2FybihgQ2Fubm90IHJldHJpZXZlIFdEQSBidWlsZCBzZXR0aW5ncy4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF0dGVybiA9IC9eXFxzKkJVSUxEX0RJUlxccys9XFxzKyhcXC8uKikvbTtcbiAgICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKHN0ZG91dCk7XG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIGxvZy53YXJuKGBDYW5ub3QgcGFyc2UgV0RBIGJ1aWxkIGRpciBmcm9tICR7Xy50cnVuY2F0ZShzdGRvdXQsIHtsZW5ndGg6IDMwMH0pfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFBhcnNlZCBCVUlMRF9ESVIgY29uZmlndXJhdGlvbiB2YWx1ZTogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgLy8gRGVyaXZlZCBkYXRhIHJvb3QgaXMgdHdvIGxldmVscyBoaWdoZXIgb3ZlciB0aGUgYnVpbGQgZGlyXG4gICAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUocGF0aC5ub3JtYWxpemUobWF0Y2hbMV0pKSk7XG4gICAgICBsb2cuZGVidWcoYEdvdCBkZXJpdmVkIGRhdGEgcm9vdDogJyR7dGhpcy5kZXJpdmVkRGF0YVBhdGh9J2ApO1xuICAgICAgcmV0dXJuIHRoaXMuZGVyaXZlZERhdGFQYXRoO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2Rlcml2ZWREYXRhUGF0aFByb21pc2U7XG4gIH1cblxuICBhc3luYyByZXNldCAoKSB7XG4gICAgLy8gaWYgbmVjZXNzYXJ5LCByZXNldCB0aGUgYnVuZGxlSWQgdG8gb3JpZ2luYWwgdmFsdWVcbiAgICBpZiAodGhpcy5yZWFsRGV2aWNlICYmIHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSB7XG4gICAgICBhd2FpdCByZXNldFByb2plY3RGaWxlKHRoaXMuYWdlbnRQYXRoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBwcmVidWlsZCAoKSB7XG4gICAgLy8gZmlyc3QgZG8gYSBidWlsZCBwaGFzZVxuICAgIGxvZy5kZWJ1ZygnUHJlLWJ1aWxkaW5nIFdEQSBiZWZvcmUgbGF1bmNoaW5nIHRlc3QnKTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gdHJ1ZTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0KHRydWUpO1xuXG4gICAgdGhpcy54Y29kZWJ1aWxkID0gbnVsbDtcblxuICAgIC8vIHBhdXNlIGEgbW9tZW50XG4gICAgYXdhaXQgQi5kZWxheSh0aGlzLnByZWJ1aWxkRGVsYXkpO1xuICB9XG5cbiAgYXN5bmMgY2xlYW5Qcm9qZWN0ICgpIHtcbiAgICBjb25zdCB0bXBJc1R2T1MgPSBpc1R2T1ModGhpcy5wbGF0Zm9ybU5hbWUpO1xuICAgIGNvbnN0IGxpYlNjaGVtZSA9IHRtcElzVHZPUyA/IExJQl9TQ0hFTUVfVFYgOiBMSUJfU0NIRU1FX0lPUztcbiAgICBjb25zdCBydW5uZXJTY2hlbWUgPSB0bXBJc1R2T1MgPyBSVU5ORVJfU0NIRU1FX1RWIDogUlVOTkVSX1NDSEVNRV9JT1M7XG5cbiAgICBmb3IgKGNvbnN0IHNjaGVtZSBvZiBbbGliU2NoZW1lLCBydW5uZXJTY2hlbWVdKSB7XG4gICAgICBsb2cuZGVidWcoYENsZWFuaW5nIHRoZSBwcm9qZWN0IHNjaGVtZSAnJHtzY2hlbWV9JyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGxlZnRvdmVycyBmcm9tIHByZXZpb3VzIGluc3RhbGxzYCk7XG4gICAgICBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgW1xuICAgICAgICAnY2xlYW4nLFxuICAgICAgICAnLXByb2plY3QnLCB0aGlzLmFnZW50UGF0aCxcbiAgICAgICAgJy1zY2hlbWUnLCBzY2hlbWUsXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb21tYW5kIChidWlsZE9ubHkgPSBmYWxzZSkge1xuICAgIGxldCBjbWQgPSAneGNvZGVidWlsZCc7XG4gICAgbGV0IGFyZ3M7XG5cbiAgICAvLyBmaWd1cmUgb3V0IHRoZSB0YXJnZXRzIGZvciB4Y29kZWJ1aWxkXG4gICAgY29uc3QgW2J1aWxkQ21kLCB0ZXN0Q21kXSA9IHRoaXMudXNlU2ltcGxlQnVpbGRUZXN0ID8gWydidWlsZCcsICd0ZXN0J10gOiBbJ2J1aWxkLWZvci10ZXN0aW5nJywgJ3Rlc3Qtd2l0aG91dC1idWlsZGluZyddO1xuICAgIGlmIChidWlsZE9ubHkpIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWRdO1xuICAgIH0gZWxzZSBpZiAodGhpcy51c2VQcmVidWlsdFdEQSB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUpIHtcbiAgICAgIGFyZ3MgPSBbdGVzdENtZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWQsIHRlc3RDbWRdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgICAvLyBUbyAtYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24gZmxhZyB0YWtlcyBlZmZlY3QsIC1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMgbmVlZHMgdG8gYmUgcGFzc2VkIGFzIHdlbGwuXG4gICAgICBhcmdzLnB1c2goJy1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMnLCAnLWFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlUGF0aCkge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlUGF0aCcsIHRoaXMucmVzdWx0QnVuZGxlUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbikge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlVmVyc2lvbicsIHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlWGN0ZXN0cnVuRmlsZSkge1xuICAgICAgYXJncy5wdXNoKCcteGN0ZXN0cnVuJywgdGhpcy54Y3Rlc3RydW5GaWxlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJ1bm5lclNjaGVtZSA9IGlzVHZPUyh0aGlzLnBsYXRmb3JtTmFtZSkgPyBSVU5ORVJfU0NIRU1FX1RWIDogUlVOTkVSX1NDSEVNRV9JT1M7XG4gICAgICBhcmdzLnB1c2goJy1wcm9qZWN0JywgdGhpcy5hZ2VudFBhdGgsICctc2NoZW1lJywgcnVubmVyU2NoZW1lKTtcbiAgICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgICBhcmdzLnB1c2goJy1kZXJpdmVkRGF0YVBhdGgnLCB0aGlzLmRlcml2ZWREYXRhUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLWRlc3RpbmF0aW9uJywgYGlkPSR7dGhpcy5kZXZpY2UudWRpZH1gKTtcblxuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IG5ldyBSZWdFeHAoL14oXFxkKylcXC4oXFxkKykvKS5leGVjKHRoaXMucGxhdGZvcm1WZXJzaW9uKTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICBhcmdzLnB1c2goYElQSE9ORU9TX0RFUExPWU1FTlRfVEFSR0VUPSR7dmVyc2lvbk1hdGNoWzFdfS4ke3ZlcnNpb25NYXRjaFsyXX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCBwYXJzZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzIGZyb20gcGxhdGZvcm1WZXJzaW9uIFwiJHt0aGlzLnBsYXRmb3JtVmVyc2lvbn1cIi4gYCArXG4gICAgICAgICdXaWxsIGJ1aWxkIGZvciB0aGUgZGVmYXVsdCBwbGF0Zm9ybSBpbnN0ZWFkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhbERldmljZSAmJiB0aGlzLnhjb2RlQ29uZmlnRmlsZSkge1xuICAgICAgbG9nLmRlYnVnKGBVc2luZyBYY29kZSBjb25maWd1cmF0aW9uIGZpbGU6ICcke3RoaXMueGNvZGVDb25maWdGaWxlfSdgKTtcbiAgICAgIGFyZ3MucHVzaCgnLXhjY29uZmlnJywgdGhpcy54Y29kZUNvbmZpZ0ZpbGUpO1xuICAgIH1cblxuICAgIGlmICghcHJvY2Vzcy5lbnYuQVBQSVVNX1hDVUlURVNUX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUykge1xuICAgICAgLy8gVGhpcyBzb21ldGltZXMgaGVscHMgdG8gc3Vydml2ZSBYY29kZSB1cGRhdGVzXG4gICAgICBhcmdzLnB1c2goJ0dDQ19UUkVBVF9XQVJOSU5HU19BU19FUlJPUlM9MCcpO1xuICAgIH1cblxuICAgIC8vIEJlbG93IG9wdGlvbiBzbGlnaHRseSByZWR1Y2VzIGJ1aWxkIHRpbWUgaW4gZGVidWcgYnVpbGRcbiAgICAvLyB3aXRoIHByZXZlbnRpbmcgdG8gZ2VuZXJhdGUgYC9JbmRleC9EYXRhU3RvcmVgIHdoaWNoIGlzIHVzZWQgYnkgZGV2ZWxvcG1lbnRcbiAgICBhcmdzLnB1c2goJ0NPTVBJTEVSX0lOREVYX1NUT1JFX0VOQUJMRT1OTycpO1xuXG4gICAgcmV0dXJuIHtjbWQsIGFyZ3N9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlU3ViUHJvY2VzcyAoYnVpbGRPbmx5ID0gZmFsc2UpIHtcbiAgICBpZiAoIXRoaXMudXNlWGN0ZXN0cnVuRmlsZSAmJiB0aGlzLnJlYWxEZXZpY2UpIHtcbiAgICAgIGlmICh0aGlzLmtleWNoYWluUGF0aCAmJiB0aGlzLmtleWNoYWluUGFzc3dvcmQpIHtcbiAgICAgICAgYXdhaXQgc2V0UmVhbERldmljZVNlY3VyaXR5KHRoaXMua2V5Y2hhaW5QYXRoLCB0aGlzLmtleWNoYWluUGFzc3dvcmQpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMueGNvZGVPcmdJZCAmJiB0aGlzLnhjb2RlU2lnbmluZ0lkICYmICF0aGlzLnhjb2RlQ29uZmlnRmlsZSkge1xuICAgICAgICB0aGlzLnhjb2RlQ29uZmlnRmlsZSA9IGF3YWl0IGdlbmVyYXRlWGNvZGVDb25maWdGaWxlKHRoaXMueGNvZGVPcmdJZCwgdGhpcy54Y29kZVNpZ25pbmdJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qge2NtZCwgYXJnc30gPSB0aGlzLmdldENvbW1hbmQoYnVpbGRPbmx5KTtcbiAgICBsb2cuZGVidWcoYEJlZ2lubmluZyAke2J1aWxkT25seSA/ICdidWlsZCcgOiAndGVzdCd9IHdpdGggY29tbWFuZCAnJHtjbWR9ICR7YXJncy5qb2luKCcgJyl9JyBgICtcbiAgICAgICAgICAgICAgYGluIGRpcmVjdG9yeSAnJHt0aGlzLmJvb3RzdHJhcFBhdGh9J2ApO1xuICAgIGNvbnN0IGVudiA9IE9iamVjdC5hc3NpZ24oe30sIHByb2Nlc3MuZW52LCB7XG4gICAgICBVU0VfUE9SVDogdGhpcy53ZGFSZW1vdGVQb3J0LFxuICAgICAgV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVI6IHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkIHx8IFdEQV9SVU5ORVJfQlVORExFX0lELFxuICAgIH0pO1xuICAgIGlmICh0aGlzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9XZWJEcml2ZXJBZ2VudC9wdWxsLzEwNVxuICAgICAgZW52Lk1KUEVHX1NFUlZFUl9QT1JUID0gdGhpcy5tanBlZ1NlcnZlclBvcnQ7XG4gICAgfVxuICAgIGNvbnN0IHVwZ3JhZGVUaW1lc3RhbXAgPSBhd2FpdCBnZXRXREFVcGdyYWRlVGltZXN0YW1wKHRoaXMuYm9vdHN0cmFwUGF0aCk7XG4gICAgaWYgKHVwZ3JhZGVUaW1lc3RhbXApIHtcbiAgICAgIGVudi5VUEdSQURFX1RJTUVTVEFNUCA9IHVwZ3JhZGVUaW1lc3RhbXA7XG4gICAgfVxuICAgIGNvbnN0IHhjb2RlYnVpbGQgPSBuZXcgU3ViUHJvY2VzcyhjbWQsIGFyZ3MsIHtcbiAgICAgIGN3ZDogdGhpcy5ib290c3RyYXBQYXRoLFxuICAgICAgZW52LFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG5cbiAgICBsZXQgbG9nWGNvZGVPdXRwdXQgPSAhIXRoaXMuc2hvd1hjb2RlTG9nO1xuICAgIGNvbnN0IGxvZ01zZyA9IF8uaXNCb29sZWFuKHRoaXMuc2hvd1hjb2RlTG9nKVxuICAgICAgPyBgT3V0cHV0IGZyb20geGNvZGVidWlsZCAke3RoaXMuc2hvd1hjb2RlTG9nID8gJ3dpbGwnIDogJ3dpbGwgbm90J30gYmUgbG9nZ2VkYFxuICAgICAgOiAnT3V0cHV0IGZyb20geGNvZGVidWlsZCB3aWxsIG9ubHkgYmUgbG9nZ2VkIGlmIGFueSBlcnJvcnMgYXJlIHByZXNlbnQgdGhlcmUnO1xuICAgIGxvZy5kZWJ1ZyhgJHtsb2dNc2d9LiBUbyBjaGFuZ2UgdGhpcywgdXNlICdzaG93WGNvZGVMb2cnIGRlc2lyZWQgY2FwYWJpbGl0eWApO1xuICAgIHhjb2RlYnVpbGQub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgbGV0IG91dCA9IHN0ZG91dCB8fCBzdGRlcnI7XG4gICAgICAvLyB3ZSB3YW50IHRvIHB1bGwgb3V0IHRoZSBsb2cgZmlsZSB0aGF0IGlzIGNyZWF0ZWQsIGFuZCBoaWdobGlnaHQgaXRcbiAgICAgIC8vIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzXG4gICAgICBpZiAob3V0LmluY2x1ZGVzKCdXcml0aW5nIGRpYWdub3N0aWMgbG9nIGZvciB0ZXN0IHNlc3Npb24gdG8nKSkge1xuICAgICAgICAvLyBwdWxsIG91dCB0aGUgZmlyc3QgbGluZSB0aGF0IGJlZ2lucyB3aXRoIHRoZSBwYXRoIHNlcGFyYXRvclxuICAgICAgICAvLyB3aGljaCAqc2hvdWxkKiBiZSB0aGUgbGluZSBpbmRpY2F0aW5nIHRoZSBsb2cgZmlsZSBnZW5lcmF0ZWRcbiAgICAgICAgeGNvZGVidWlsZC5sb2dMb2NhdGlvbiA9IF8uZmlyc3QoXy5yZW1vdmUob3V0LnRyaW0oKS5zcGxpdCgnXFxuJyksICh2KSA9PiB2LnN0YXJ0c1dpdGgocGF0aC5zZXApKSk7XG4gICAgICAgIGxvZy5kZWJ1ZyhgTG9nIGZpbGUgZm9yIHhjb2RlYnVpbGQgdGVzdDogJHt4Y29kZWJ1aWxkLmxvZ0xvY2F0aW9ufWApO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB3ZSBoYXZlIGFuIGVycm9yIHdlIHdhbnQgdG8gb3V0cHV0IHRoZSBsb2dzXG4gICAgICAvLyBvdGhlcndpc2UgdGhlIGZhaWx1cmUgaXMgaW5zY3J1dGlibGVcbiAgICAgIC8vIGJ1dCBkbyBub3QgbG9nIHBlcm1pc3Npb24gZXJyb3JzIGZyb20gdHJ5aW5nIHRvIHdyaXRlIHRvIGF0dGFjaG1lbnRzIGZvbGRlclxuICAgICAgY29uc3QgaWdub3JlRXJyb3IgPSBJR05PUkVEX0VSUk9SUy5zb21lKCh4KSA9PiBvdXQuaW5jbHVkZXMoeCkpO1xuICAgICAgaWYgKHRoaXMuc2hvd1hjb2RlTG9nICE9PSBmYWxzZSAmJiBvdXQuaW5jbHVkZXMoJ0Vycm9yIERvbWFpbj0nKSAmJiAhaWdub3JlRXJyb3IpIHtcbiAgICAgICAgbG9nWGNvZGVPdXRwdXQgPSB0cnVlO1xuXG4gICAgICAgIC8vIHRlcnJpYmxlIGhhY2sgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgeGNvZGUgcmV0dXJuIDAgYnV0IGlzIGZhaWxpbmdcbiAgICAgICAgeGNvZGVidWlsZC5fd2RhX2Vycm9yX29jY3VycmVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZG8gbm90IGxvZyBwZXJtaXNzaW9uIGVycm9ycyBmcm9tIHRyeWluZyB0byB3cml0ZSB0byBhdHRhY2htZW50cyBmb2xkZXJcbiAgICAgIGlmIChsb2dYY29kZU91dHB1dCAmJiAhaWdub3JlRXJyb3IpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG91dC5zcGxpdChFT0wpKSB7XG4gICAgICAgICAgeGNvZGVMb2cuZXJyb3IobGluZSk7XG4gICAgICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgICAgIHhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlICs9IGAke0VPTH0ke2xpbmV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB4Y29kZWJ1aWxkO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQgKGJ1aWxkT25seSA9IGZhbHNlKSB7XG4gICAgdGhpcy54Y29kZWJ1aWxkID0gYXdhaXQgdGhpcy5jcmVhdGVTdWJQcm9jZXNzKGJ1aWxkT25seSk7XG4gICAgLy8gU3RvcmUgeGNvZGVidWlsZCBtZXNzYWdlXG4gICAgdGhpcy54Y29kZWJ1aWxkLl93ZGFfZXJyb3JfbWVzc2FnZSA9ICcnO1xuXG4gICAgLy8gd3JhcCB0aGUgc3RhcnQgcHJvY2VkdXJlIGluIGEgcHJvbWlzZSBzbyB0aGF0IHdlIGNhbiBjYXRjaCwgYW5kIHJlcG9ydCxcbiAgICAvLyBhbnkgc3RhcnR1cCBlcnJvcnMgdGhhdCBhcmUgdGhyb3duIGFzIGV2ZW50c1xuICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnhjb2RlYnVpbGQub24oJ2V4aXQnLCBhc3luYyAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIGxvZy5lcnJvcihgeGNvZGVidWlsZCBleGl0ZWQgd2l0aCBjb2RlICcke2NvZGV9JyBhbmQgc2lnbmFsICcke3NpZ25hbH0nYCk7XG4gICAgICAgIC8vIHByaW50IG91dCB0aGUgeGNvZGVidWlsZCBmaWxlIGlmIHVzZXJzIGhhdmUgYXNrZWQgZm9yIGl0XG4gICAgICAgIGlmICh0aGlzLnNob3dYY29kZUxvZyAmJiB0aGlzLnhjb2RlYnVpbGQubG9nTG9jYXRpb24pIHtcbiAgICAgICAgICB4Y29kZUxvZy5lcnJvcihgQ29udGVudHMgb2YgeGNvZGVidWlsZCBsb2cgZmlsZSAnJHt0aGlzLnhjb2RlYnVpbGQubG9nTG9jYXRpb259JzpgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBmcy5yZWFkRmlsZSh0aGlzLnhjb2RlYnVpbGQubG9nTG9jYXRpb24sICd1dGY4Jyk7XG4gICAgICAgICAgICBmb3IgKGxldCBsaW5lIG9mIGRhdGEuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgICAgIHhjb2RlTG9nLmVycm9yKGxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nLmVycm9yKGBVbmFibGUgdG8gYWNjZXNzIHhjb2RlYnVpbGQgbG9nIGZpbGU6ICcke2Vyci5tZXNzYWdlfSdgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54Y29kZWJ1aWxkLnByb2Nlc3NFeGl0ZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy54Y29kZWJ1aWxkLl93ZGFfZXJyb3Jfb2NjdXJyZWQgfHwgKCFzaWduYWwgJiYgY29kZSAhPT0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgeGNvZGVidWlsZCBmYWlsZWQgd2l0aCBjb2RlICR7Y29kZX0ke0VPTH1gICtcbiAgICAgICAgICAgIGB4Y29kZWJ1aWxkIGVycm9yIG1lc3NhZ2U6JHtFT0x9JHt0aGlzLnhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBqdXN0IGJ1aWxkaW5nLCB0aGUgcHJvY2VzcyB3aWxsIGV4aXQgYW5kIHRoYXQgaXMgb3VyIGZpbmlzaFxuICAgICAgICBpZiAoYnVpbGRPbmx5KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnN0YXJ0KHRydWUpO1xuICAgICAgICAgIGlmICghYnVpbGRPbmx5KSB7XG4gICAgICAgICAgICBsZXQgc3RhdHVzID0gYXdhaXQgdGhpcy53YWl0Rm9yU3RhcnQodGltZXIpO1xuICAgICAgICAgICAgcmVzb2x2ZShzdGF0dXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbGV0IG1zZyA9IGBVbmFibGUgdG8gc3RhcnQgV2ViRHJpdmVyQWdlbnQ6ICR7ZXJyfWA7XG4gICAgICAgICAgbG9nLmVycm9yKG1zZyk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihtc2cpKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JTdGFydCAodGltZXIpIHtcbiAgICAvLyB0cnkgdG8gY29ubmVjdCBvbmNlIGV2ZXJ5IDAuNSBzZWNvbmRzLCB1bnRpbCBgbGF1bmNoVGltZW91dGAgaXMgdXBcbiAgICBsb2cuZGVidWcoYFdhaXRpbmcgdXAgdG8gJHt0aGlzLmxhdW5jaFRpbWVvdXR9bXMgZm9yIFdlYkRyaXZlckFnZW50IHRvIHN0YXJ0YCk7XG4gICAgbGV0IGN1cnJlbnRTdGF0dXMgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBsZXQgcmV0cmllcyA9IHBhcnNlSW50KHRoaXMubGF1bmNoVGltZW91dCAvIDUwMCwgMTApO1xuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCAxMDAwLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnhjb2RlYnVpbGQucHJvY2Vzc0V4aXRlZCkge1xuICAgICAgICAgIC8vIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIGVsc2V3aGVyZSBhbmQgd2UgbmVlZCB0byBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3h5VGltZW91dCA9IHRoaXMubm9TZXNzaW9uUHJveHkudGltZW91dDtcbiAgICAgICAgdGhpcy5ub1Nlc3Npb25Qcm94eS50aW1lb3V0ID0gMTAwMDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjdXJyZW50U3RhdHVzID0gYXdhaXQgdGhpcy5ub1Nlc3Npb25Qcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgICAgICAgIGlmIChjdXJyZW50U3RhdHVzICYmIGN1cnJlbnRTdGF0dXMuaW9zICYmIGN1cnJlbnRTdGF0dXMuaW9zLmlwKSB7XG4gICAgICAgICAgICB0aGlzLmFnZW50VXJsID0gY3VycmVudFN0YXR1cy5pb3MuaXA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZy5kZWJ1ZyhgV2ViRHJpdmVyQWdlbnQgaW5mb3JtYXRpb246YCk7XG4gICAgICAgICAgbG9nLmRlYnVnKEpTT04uc3RyaW5naWZ5KGN1cnJlbnRTdGF0dXMsIG51bGwsIDIpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY29ubmVjdCB0byBydW5uaW5nIFdlYkRyaXZlckFnZW50OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMubm9TZXNzaW9uUHJveHkudGltZW91dCA9IHByb3h5VGltZW91dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLnhjb2RlYnVpbGQucHJvY2Vzc0V4aXRlZCkge1xuICAgICAgICAvLyB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciBlbHNld2hlcmUgYW5kIHdlIG5lZWQgdG8gc2hvcnQtY2lyY3VpdFxuICAgICAgICByZXR1cm4gY3VycmVudFN0YXR1cztcbiAgICAgIH1cblxuICAgICAgbG9nLmRlYnVnKGBXZWJEcml2ZXJBZ2VudCBzdWNjZXNzZnVsbHkgc3RhcnRlZCBhZnRlciAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gYXQgdGhpcyBwb2ludCwgaWYgd2UgaGF2ZSBub3QgaGFkIGFueSBlcnJvcnMgZnJvbSB4Y29kZSBpdHNlbGYgKHJlcG9ydGVkXG4gICAgICAvLyBlbHNld2hlcmUpLCB3ZSBjYW4gbGV0IHRoaXMgZ28gdGhyb3VnaCBhbmQgdHJ5IHRvIGNyZWF0ZSB0aGUgc2Vzc2lvblxuICAgICAgbG9nLmRlYnVnKGVyci5tZXNzYWdlKTtcbiAgICAgIGxvZy53YXJuKGBHZXR0aW5nIHN0YXR1cyBvZiBXZWJEcml2ZXJBZ2VudCBvbiBkZXZpY2UgdGltZWQgb3V0LiBDb250aW51aW5nYCk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50U3RhdHVzO1xuICB9XG5cbiAgYXN5bmMgcXVpdCAoKSB7XG4gICAgYXdhaXQga2lsbFByb2Nlc3MoJ3hjb2RlYnVpbGQnLCB0aGlzLnhjb2RlYnVpbGQpO1xuICB9XG59XG5cbmV4cG9ydCB7IFhjb2RlQnVpbGQgfTtcbmV4cG9ydCBkZWZhdWx0IFhjb2RlQnVpbGQ7XG4iXSwiZmlsZSI6ImxpYi94Y29kZWJ1aWxkLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
396
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi94Y29kZWJ1aWxkLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfU0lHTklOR19JRCIsIlBSRUJVSUxEX0RFTEFZIiwiUlVOTkVSX1NDSEVNRV9JT1MiLCJMSUJfU0NIRU1FX0lPUyIsIkVSUk9SX1dSSVRJTkdfQVRUQUNITUVOVCIsIkVSUk9SX0NPUFlJTkdfQVRUQUNITUVOVCIsIklHTk9SRURfRVJST1JTIiwiUlVOTkVSX1NDSEVNRV9UViIsIkxJQl9TQ0hFTUVfVFYiLCJ4Y29kZUxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsIlhjb2RlQnVpbGQiLCJjb25zdHJ1Y3RvciIsInhjb2RlVmVyc2lvbiIsImRldmljZSIsImFyZ3MiLCJsb2ciLCJkZWZhdWx0TG9nZ2VyIiwicmVhbERldmljZSIsImFnZW50UGF0aCIsImJvb3RzdHJhcFBhdGgiLCJwbGF0Zm9ybVZlcnNpb24iLCJwbGF0Zm9ybU5hbWUiLCJpb3NTZGtWZXJzaW9uIiwic2hvd1hjb2RlTG9nIiwieGNvZGVDb25maWdGaWxlIiwieGNvZGVPcmdJZCIsInhjb2RlU2lnbmluZ0lkIiwia2V5Y2hhaW5QYXRoIiwia2V5Y2hhaW5QYXNzd29yZCIsInByZWJ1aWxkV0RBIiwidXNlUHJlYnVpbHRXREEiLCJ1c2VTaW1wbGVCdWlsZFRlc3QiLCJ1c2VYY3Rlc3RydW5GaWxlIiwibGF1bmNoVGltZW91dCIsIndkYVJlbW90ZVBvcnQiLCJ1cGRhdGVkV0RBQnVuZGxlSWQiLCJkZXJpdmVkRGF0YVBhdGgiLCJtanBlZ1NlcnZlclBvcnQiLCJwcmVidWlsZERlbGF5IiwiXyIsImlzTnVtYmVyIiwiYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24iLCJyZXN1bHRCdW5kbGVQYXRoIiwicmVzdWx0QnVuZGxlVmVyc2lvbiIsImluaXQiLCJub1Nlc3Npb25Qcm94eSIsImRldml2ZUluZm8iLCJpc1JlYWxEZXZpY2UiLCJ1ZGlkIiwieGN0ZXN0cnVuRmlsZVBhdGgiLCJyZXRyaWV2ZURlcml2ZWREYXRhUGF0aCIsIl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlIiwic3Rkb3V0IiwiZXJyIiwid2FybiIsIm1lc3NhZ2UiLCJwYXR0ZXJuIiwibWF0Y2giLCJleGVjIiwidHJ1bmNhdGUiLCJsZW5ndGgiLCJkZWJ1ZyIsInBhdGgiLCJkaXJuYW1lIiwibm9ybWFsaXplIiwicmVzZXQiLCJwcmVidWlsZCIsInN0YXJ0IiwieGNvZGVidWlsZCIsIkIiLCJkZWxheSIsImNsZWFuUHJvamVjdCIsInRtcElzVHZPUyIsImxpYlNjaGVtZSIsInJ1bm5lclNjaGVtZSIsInNjaGVtZSIsImdldENvbW1hbmQiLCJidWlsZE9ubHkiLCJjbWQiLCJidWlsZENtZCIsInRlc3RDbWQiLCJwdXNoIiwidmVyc2lvbk1hdGNoIiwiUmVnRXhwIiwicHJvY2VzcyIsImVudiIsIkFQUElVTV9YQ1VJVEVTVF9UUkVBVF9XQVJOSU5HU19BU19FUlJPUlMiLCJjcmVhdGVTdWJQcm9jZXNzIiwiam9pbiIsIk9iamVjdCIsImFzc2lnbiIsIlVTRV9QT1JUIiwiV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVIiLCJXREFfUlVOTkVSX0JVTkRMRV9JRCIsIk1KUEVHX1NFUlZFUl9QT1JUIiwidXBncmFkZVRpbWVzdGFtcCIsIlVQR1JBREVfVElNRVNUQU1QIiwiU3ViUHJvY2VzcyIsImN3ZCIsImRldGFjaGVkIiwic3RkaW8iLCJsb2dYY29kZU91dHB1dCIsImxvZ01zZyIsImlzQm9vbGVhbiIsIm9uIiwic3RkZXJyIiwib3V0IiwiaW5jbHVkZXMiLCJsb2dMb2NhdGlvbiIsImZpcnN0IiwicmVtb3ZlIiwidHJpbSIsInNwbGl0IiwidiIsInN0YXJ0c1dpdGgiLCJzZXAiLCJpZ25vcmVFcnJvciIsInNvbWUiLCJ4IiwiX3dkYV9lcnJvcl9vY2N1cnJlZCIsImxpbmUiLCJFT0wiLCJlcnJvciIsIl93ZGFfZXJyb3JfbWVzc2FnZSIsInJlc29sdmUiLCJyZWplY3QiLCJjb2RlIiwic2lnbmFsIiwiZGF0YSIsImZzIiwicmVhZEZpbGUiLCJwcm9jZXNzRXhpdGVkIiwiRXJyb3IiLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhdHVzIiwid2FpdEZvclN0YXJ0IiwibXNnIiwiY3VycmVudFN0YXR1cyIsInJldHJpZXMiLCJwYXJzZUludCIsInByb3h5VGltZW91dCIsInRpbWVvdXQiLCJjb21tYW5kIiwiaW9zIiwiaXAiLCJhZ2VudFVybCIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXREdXJhdGlvbiIsImFzTWlsbGlTZWNvbmRzIiwidG9GaXhlZCIsInF1aXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBSUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsa0JBQWtCLEdBQUcsa0JBQTNCO0FBQ0EsTUFBTUMsY0FBYyxHQUFHLENBQXZCO0FBQ0EsTUFBTUMsaUJBQWlCLEdBQUcsc0JBQTFCO0FBQ0EsTUFBTUMsY0FBYyxHQUFHLG1CQUF2QjtBQUVBLE1BQU1DLHdCQUF3QixHQUFHLHVDQUFqQztBQUNBLE1BQU1DLHdCQUF3QixHQUFHLGtDQUFqQztBQUNBLE1BQU1DLGNBQWMsR0FBRyxDQUNyQkYsd0JBRHFCLEVBRXJCQyx3QkFGcUIsRUFHckIscUNBSHFCLENBQXZCO0FBTUEsTUFBTUUsZ0JBQWdCLEdBQUcsMkJBQXpCO0FBQ0EsTUFBTUMsYUFBYSxHQUFHLHdCQUF0Qjs7QUFFQSxNQUFNQyxRQUFRLEdBQUdDLGdCQUFPQyxTQUFQLENBQWlCLE9BQWpCLENBQWpCOztBQUdBLE1BQU1DLFVBQU4sQ0FBaUI7QUFDZkMsRUFBQUEsV0FBVyxDQUFFQyxZQUFGLEVBQWdCQyxNQUFoQixFQUF3QkMsSUFBSSxHQUFHLEVBQS9CLEVBQW1DQyxHQUFHLEdBQUcsSUFBekMsRUFBK0M7QUFDeEQsU0FBS0gsWUFBTCxHQUFvQkEsWUFBcEI7QUFFQSxTQUFLQyxNQUFMLEdBQWNBLE1BQWQ7QUFDQSxTQUFLRSxHQUFMLEdBQVdBLEdBQVgsYUFBV0EsR0FBWCxjQUFXQSxHQUFYLEdB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Q0QsZUFBS25JLEdBQUwsQ0FBUzhDLEtBQVQsQ0FBZ0IsNkJBQWhCO0FBQ0EsZUFBSzlDLEdBQUwsQ0FBUzhDLEtBQVQsQ0FBZXVGLElBQUksQ0FBQ0MsU0FBTCxDQUFlVixhQUFmLEVBQThCLElBQTlCLEVBQW9DLENBQXBDLENBQWY7QUFDRCxTQVBELENBT0UsT0FBT3RGLEdBQVAsRUFBWTtBQUNaLGdCQUFNLElBQUkrRSxLQUFKLENBQVcsZ0RBQStDL0UsR0FBRyxDQUFDRSxPQUFRLEVBQXRFLENBQU47QUFDRCxTQVRELFNBU1U7QUFDUixlQUFLVixjQUFMLENBQW9Ca0csT0FBcEIsR0FBOEJELFlBQTlCO0FBQ0Q7QUFDRixPQW5CSyxDQUFOOztBQXFCQSxVQUFJLEtBQUsxRSxVQUFMLENBQWdCK0QsYUFBcEIsRUFBbUM7QUFFakMsZUFBT1EsYUFBUDtBQUNEOztBQUVELFdBQUs1SCxHQUFMLENBQVM4QyxLQUFULENBQWdCLDZDQUE0Q3dFLEtBQUssQ0FBQ2lCLFdBQU4sR0FBb0JDLGNBQXBCLENBQW1DQyxPQUFuQyxDQUEyQyxDQUEzQyxDQUE4QyxJQUExRztBQUNELEtBN0JELENBNkJFLE9BQU9uRyxHQUFQLEVBQVk7QUFHWixXQUFLdEMsR0FBTCxDQUFTOEMsS0FBVCxDQUFlUixHQUFHLENBQUNFLE9BQW5CO0FBQ0EsV0FBS3hDLEdBQUwsQ0FBU3VDLElBQVQsQ0FBZSxrRUFBZjtBQUNEOztBQUNELFdBQU9xRixhQUFQO0FBQ0Q7O0FBRVMsUUFBSmMsSUFBSSxHQUFJO0FBQ1osVUFBTSx3QkFBWSxZQUFaLEVBQTBCLEtBQUtyRixVQUEvQixDQUFOO0FBQ0Q7O0FBclhjOzs7ZUF5WEYxRCxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIGxvZ2dlciwgdGltaW5nIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBkZWZhdWx0TG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7XG4gIHNldFJlYWxEZXZpY2VTZWN1cml0eSwgZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUsIHNldFhjdGVzdHJ1bkZpbGUsXG4gIHVwZGF0ZVByb2plY3RGaWxlLCByZXNldFByb2plY3RGaWxlLCBraWxsUHJvY2VzcyxcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgaXNUdk9TIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBXREFfUlVOTkVSX0JVTkRMRV9JRCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuXG5jb25zdCBERUZBVUxUX1NJR05JTkdfSUQgPSAnaVBob25lIERldmVsb3Blcic7XG5jb25zdCBQUkVCVUlMRF9ERUxBWSA9IDA7XG5jb25zdCBSVU5ORVJfU0NIRU1FX0lPUyA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lcic7XG5jb25zdCBMSUJfU0NIRU1FX0lPUyA9ICdXZWJEcml2ZXJBZ2VudExpYic7XG5cbmNvbnN0IEVSUk9SX1dSSVRJTkdfQVRUQUNITUVOVCA9ICdFcnJvciB3cml0aW5nIGF0dGFjaG1lbnQgZGF0YSB0byBmaWxlJztcbmNvbnN0IEVSUk9SX0NPUFlJTkdfQVRUQUNITUVOVCA9ICdFcnJvciBjb3B5aW5nIHRlc3RpbmcgYXR0YWNobWVudCc7XG5jb25zdCBJR05PUkVEX0VSUk9SUyA9IFtcbiAgRVJST1JfV1JJVElOR19BVFRBQ0hNRU5ULFxuICBFUlJPUl9DT1BZSU5HX0FUVEFDSE1FTlQsXG4gICdGYWlsZWQgdG8gcmVtb3ZlIHNjcmVlbnNob3QgYXQgcGF0aCcsXG5dO1xuXG5jb25zdCBSVU5ORVJfU0NIRU1FX1RWID0gJ1dlYkRyaXZlckFnZW50UnVubmVyX3R2T1MnO1xuY29uc3QgTElCX1NDSEVNRV9UViA9ICdXZWJEcml2ZXJBZ2VudExpYl90dk9TJztcblxuY29uc3QgeGNvZGVMb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdYY29kZScpO1xuXG5cbmNsYXNzIFhjb2RlQnVpbGQge1xuICBjb25zdHJ1Y3RvciAoeGNvZGVWZXJzaW9uLCBkZXZpY2UsIGFyZ3MgPSB7fSwgbG9nID0gbnVsbCkge1xuICAgIHRoaXMueGNvZGVWZXJzaW9uID0geGNvZGVWZXJzaW9uO1xuXG4gICAgdGhpcy5kZXZpY2UgPSBkZXZpY2U7XG4gICAgdGhpcy5sb2cgPSBsb2cgPz8gZGVmYXVsdExvZ2dlcjtcblxuICAgIHRoaXMucmVhbERldmljZSA9IGFyZ3MucmVhbERldmljZTtcblxuICAgIHRoaXMuYWdlbnRQYXRoID0gYXJncy5hZ2VudFBhdGg7XG4gICAgdGhpcy5ib290c3RyYXBQYXRoID0gYXJncy5ib290c3RyYXBQYXRoO1xuXG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcblxuICAgIHRoaXMuc2hvd1hjb2RlTG9nID0gYXJncy5zaG93WGNvZGVMb2c7XG5cbiAgICB0aGlzLnhjb2RlQ29uZmlnRmlsZSA9IGFyZ3MueGNvZGVDb25maWdGaWxlO1xuICAgIHRoaXMueGNvZGVPcmdJZCA9IGFyZ3MueGNvZGVPcmdJZDtcbiAgICB0aGlzLnhjb2RlU2lnbmluZ0lkID0gYXJncy54Y29kZVNpZ25pbmdJZCB8fCBERUZBVUxUX1NJR05JTkdfSUQ7XG4gICAgdGhpcy5rZXljaGFpblBhdGggPSBhcmdzLmtleWNoYWluUGF0aDtcbiAgICB0aGlzLmtleWNoYWluUGFzc3dvcmQgPSBhcmdzLmtleWNoYWluUGFzc3dvcmQ7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLnVzZVNpbXBsZUJ1aWxkVGVzdCA9IGFyZ3MudXNlU2ltcGxlQnVpbGRUZXN0O1xuXG4gICAgdGhpcy51c2VYY3Rlc3RydW5GaWxlID0gYXJncy51c2VYY3Rlc3RydW5GaWxlO1xuXG4gICAgdGhpcy5sYXVuY2hUaW1lb3V0ID0gYXJncy5sYXVuY2hUaW1lb3V0O1xuXG4gICAgdGhpcy53ZGFSZW1vdGVQb3J0ID0gYXJncy53ZGFSZW1vdGVQb3J0O1xuXG4gICAgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgPSBhcmdzLnVwZGF0ZWRXREFCdW5kbGVJZDtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuXG4gICAgdGhpcy5tanBlZ1NlcnZlclBvcnQgPSBhcmdzLm1qcGVnU2VydmVyUG9ydDtcblxuICAgIHRoaXMucHJlYnVpbGREZWxheSA9IF8uaXNOdW1iZXIoYXJncy5wcmVidWlsZERlbGF5KSA/IGFyZ3MucHJlYnVpbGREZWxheSA6IFBSRUJVSUxEX0RFTEFZO1xuXG4gICAgdGhpcy5hbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiA9IGFyZ3MuYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb247XG5cbiAgICB0aGlzLnJlc3VsdEJ1bmRsZVBhdGggPSBhcmdzLnJlc3VsdEJ1bmRsZVBhdGg7XG4gICAgdGhpcy5yZXN1bHRCdW5kbGVWZXJzaW9uID0gYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgaW5pdCAobm9TZXNzaW9uUHJveHkpIHtcbiAgICB0aGlzLm5vU2Vzc2lvblByb3h5ID0gbm9TZXNzaW9uUHJveHk7XG5cbiAgICBpZiAodGhpcy51c2VYY3Rlc3RydW5GaWxlKSB7XG4gICAgICBjb25zdCBkZXZpdmVJbmZvID0ge1xuICAgICAgICBpc1JlYWxEZXZpY2U6IHRoaXMucmVhbERldmljZSxcbiAgICAgICAgdWRpZDogdGhpcy5kZXZpY2UudWRpZCxcbiAgICAgICAgcGxhdGZvcm1WZXJzaW9uOiB0aGlzLnBsYXRmb3JtVmVyc2lvbixcbiAgICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZVxuICAgICAgfTtcbiAgICAgIHRoaXMueGN0ZXN0cnVuRmlsZVBhdGggPSBhd2FpdCBzZXRYY3Rlc3RydW5GaWxlKGRldml2ZUluZm8sIHRoaXMuaW9zU2RrVmVyc2lvbiwgdGhpcy5ib290c3RyYXBQYXRoLCB0aGlzLndkYVJlbW90ZVBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIG5lY2Vzc2FyeSwgdXBkYXRlIHRoZSBidW5kbGVJZCB0byB1c2VyJ3Mgc3BlY2lmaWNhdGlvblxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UpIHtcbiAgICAgIC8vIEluIGNhc2UgdGhlIHByb2plY3Qgc3RpbGwgaGFzIHRoZSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRCwgcmVzZXQgdGhlIHByb2plY3QgZmlsZSBmaXJzdC5cbiAgICAgIC8vIC0gV2UgZG8gdGhpcyByZXNldCBldmVuIGlmIHVwZGF0ZWRXREFCdW5kbGVJZCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAgLy8gICBzaW5jZSB0aGUgcHJldmlvdXMgdXBkYXRlZFdEQUJ1bmRsZUlkIHRlc3QgaGFzIGdlbmVyYXRlZCB0aGUgdXNlciBzcGVjaWZpYyBidW5kbGUgSUQgcHJvamVjdCBmaWxlLlxuICAgICAgLy8gLSBXZSBkb24ndCBjYWxsIHJlc2V0UHJvamVjdEZpbGUgZm9yIHNpbXVsYXRvcixcbiAgICAgIC8vICAgc2luY2Ugc2ltdWxhdG9yIHRlc3QgcnVuIHdpbGwgd29yayB3aXRoIGFueSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRC5cbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgICAgaWYgKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZVByb2plY3RGaWxlKHRoaXMuYWdlbnRQYXRoLCB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEZXJpdmVkRGF0YVBhdGggKCkge1xuICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVyaXZlZERhdGFQYXRoO1xuICAgIH1cblxuICAgIC8vIGF2b2lkIHJhY2UgY29uZGl0aW9uc1xuICAgIGlmICh0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBzdGRvdXQ7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgWyctcHJvamVjdCcsIHRoaXMuYWdlbnRQYXRoLCAnLXNob3dCdWlsZFNldHRpbmdzJ10pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgcmV0cmlldmUgV0RBIGJ1aWxkIHNldHRpbmdzLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gL15cXHMqQlVJTERfRElSXFxzKz1cXHMrKFxcLy4qKS9tO1xuICAgICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoc3Rkb3V0KTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHBhcnNlIFdEQSBidWlsZCBkaXIgZnJvbSAke18udHJ1bmNhdGUoc3Rkb3V0LCB7bGVuZ3RoOiAzMDB9KX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBCVUlMRF9ESVIgY29uZmlndXJhdGlvbiB2YWx1ZTogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgLy8gRGVyaXZlZCBkYXRhIHJvb3QgaXMgdHdvIGxldmVscyBoaWdoZXIgb3ZlciB0aGUgYnVpbGQgZGlyXG4gICAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUocGF0aC5ub3JtYWxpemUobWF0Y2hbMV0pKSk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgR290IGRlcml2ZWQgZGF0YSByb290OiAnJHt0aGlzLmRlcml2ZWREYXRhUGF0aH0nYCk7XG4gICAgICByZXR1cm4gdGhpcy5kZXJpdmVkRGF0YVBhdGg7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIHJlc2V0ICgpIHtcbiAgICAvLyBpZiBuZWNlc3NhcnksIHJlc2V0IHRoZSBidW5kbGVJZCB0byBvcmlnaW5hbCB2YWx1ZVxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UgJiYgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQpIHtcbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHByZWJ1aWxkICgpIHtcbiAgICAvLyBmaXJzdCBkbyBhIGJ1aWxkIHBoYXNlXG4gICAgdGhpcy5sb2cuZGVidWcoJ1ByZS1idWlsZGluZyBXREEgYmVmb3JlIGxhdW5jaGluZyB0ZXN0Jyk7XG4gICAgdGhpcy51c2VQcmVidWlsdFdEQSA9IHRydWU7XG4gICAgYXdhaXQgdGhpcy5zdGFydCh0cnVlKTtcblxuICAgIHRoaXMueGNvZGVidWlsZCA9IG51bGw7XG5cbiAgICAvLyBwYXVzZSBhIG1vbWVudFxuICAgIGF3YWl0IEIuZGVsYXkodGhpcy5wcmVidWlsZERlbGF5KTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFuUHJvamVjdCAoKSB7XG4gICAgY29uc3QgdG1wSXNUdk9TID0gaXNUdk9TKHRoaXMucGxhdGZvcm1OYW1lKTtcbiAgICBjb25zdCBsaWJTY2hlbWUgPSB0bXBJc1R2T1MgPyBMSUJfU0NIRU1FX1RWIDogTElCX1NDSEVNRV9JT1M7XG4gICAgY29uc3QgcnVubmVyU2NoZW1lID0gdG1wSXNUdk9TID8gUlVOTkVSX1NDSEVNRV9UViA6IFJVTk5FUl9TQ0hFTUVfSU9TO1xuXG4gICAgZm9yIChjb25zdCBzY2hlbWUgb2YgW2xpYlNjaGVtZSwgcnVubmVyU2NoZW1lXSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsZWFuaW5nIHRoZSBwcm9qZWN0IHNjaGVtZSAnJHtzY2hlbWV9JyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGxlZnRvdmVycyBmcm9tIHByZXZpb3VzIGluc3RhbGxzYCk7XG4gICAgICBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgW1xuICAgICAgICAnY2xlYW4nLFxuICAgICAgICAnLXByb2plY3QnLCB0aGlzLmFnZW50UGF0aCxcbiAgICAgICAgJy1zY2hlbWUnLCBzY2hlbWUsXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb21tYW5kIChidWlsZE9ubHkgPSBmYWxzZSkge1xuICAgIGxldCBjbWQgPSAneGNvZGVidWlsZCc7XG4gICAgbGV0IGFyZ3M7XG5cbiAgICAvLyBmaWd1cmUgb3V0IHRoZSB0YXJnZXRzIGZvciB4Y29kZWJ1aWxkXG4gICAgY29uc3QgW2J1aWxkQ21kLCB0ZXN0Q21kXSA9IHRoaXMudXNlU2ltcGxlQnVpbGRUZXN0ID8gWydidWlsZCcsICd0ZXN0J10gOiBbJ2J1aWxkLWZvci10ZXN0aW5nJywgJ3Rlc3Qtd2l0aG91dC1idWlsZGluZyddO1xuICAgIGlmIChidWlsZE9ubHkpIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWRdO1xuICAgIH0gZWxzZSBpZiAodGhpcy51c2VQcmVidWlsdFdEQSB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUpIHtcbiAgICAgIGFyZ3MgPSBbdGVzdENtZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWQsIHRlc3RDbWRdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgICAvLyBUbyAtYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24gZmxhZyB0YWtlcyBlZmZlY3QsIC1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMgbmVlZHMgdG8gYmUgcGFzc2VkIGFzIHdlbGwuXG4gICAgICBhcmdzLnB1c2goJy1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMnLCAnLWFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlUGF0aCkge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlUGF0aCcsIHRoaXMucmVzdWx0QnVuZGxlUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbikge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlVmVyc2lvbicsIHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlWGN0ZXN0cnVuRmlsZSkge1xuICAgICAgYXJncy5wdXNoKCcteGN0ZXN0cnVuJywgdGhpcy54Y3Rlc3RydW5GaWxlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJ1bm5lclNjaGVtZSA9IGlzVHZPUyh0aGlzLnBsYXRmb3JtTmFtZSkgPyBSVU5ORVJfU0NIRU1FX1RWIDogUlVOTkVSX1NDSEVNRV9JT1M7XG4gICAgICBhcmdzLnB1c2goJy1wcm9qZWN0JywgdGhpcy5hZ2VudFBhdGgsICctc2NoZW1lJywgcnVubmVyU2NoZW1lKTtcbiAgICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgICBhcmdzLnB1c2goJy1kZXJpdmVkRGF0YVBhdGgnLCB0aGlzLmRlcml2ZWREYXRhUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLWRlc3RpbmF0aW9uJywgYGlkPSR7dGhpcy5kZXZpY2UudWRpZH1gKTtcblxuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IG5ldyBSZWdFeHAoL14oXFxkKylcXC4oXFxkKykvKS5leGVjKHRoaXMucGxhdGZvcm1WZXJzaW9uKTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICBhcmdzLnB1c2goYElQSE9ORU9TX0RFUExPWU1FTlRfVEFSR0VUPSR7dmVyc2lvbk1hdGNoWzFdfS4ke3ZlcnNpb25NYXRjaFsyXX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHBhcnNlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlcnMgZnJvbSBwbGF0Zm9ybVZlcnNpb24gXCIke3RoaXMucGxhdGZvcm1WZXJzaW9ufVwiLiBgICtcbiAgICAgICAgJ1dpbGwgYnVpbGQgZm9yIHRoZSBkZWZhdWx0IHBsYXRmb3JtIGluc3RlYWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWFsRGV2aWNlICYmIHRoaXMueGNvZGVDb25maWdGaWxlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgVXNpbmcgWGNvZGUgY29uZmlndXJhdGlvbiBmaWxlOiAnJHt0aGlzLnhjb2RlQ29uZmlnRmlsZX0nYCk7XG4gICAgICBhcmdzLnB1c2goJy14Y2NvbmZpZycsIHRoaXMueGNvZGVDb25maWdGaWxlKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb2Nlc3MuZW52LkFQUElVTV9YQ1VJVEVTVF9UUkVBVF9XQVJOSU5HU19BU19FUlJPUlMpIHtcbiAgICAgIC8vIFRoaXMgc29tZXRpbWVzIGhlbHBzIHRvIHN1cnZpdmUgWGNvZGUgdXBkYXRlc1xuICAgICAgYXJncy5wdXNoKCdHQ0NfVFJFQVRfV0FSTklOR1NfQVNfRVJST1JTPTAnKTtcbiAgICB9XG5cbiAgICAvLyBCZWxvdyBvcHRpb24gc2xpZ2h0bHkgcmVkdWNlcyBidWlsZCB0aW1lIGluIGRlYnVnIGJ1aWxkXG4gICAgLy8gd2l0aCBwcmV2ZW50aW5nIHRvIGdlbmVyYXRlIGAvSW5kZXgvRGF0YVN0b3JlYCB3aGljaCBpcyB1c2VkIGJ5IGRldmVsb3BtZW50XG4gICAgYXJncy5wdXNoKCdDT01QSUxFUl9JTkRFWF9TVE9SRV9FTkFCTEU9Tk8nKTtcblxuICAgIHJldHVybiB7Y21kLCBhcmdzfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVN1YlByb2Nlc3MgKGJ1aWxkT25seSA9IGZhbHNlKSB7XG4gICAgaWYgKCF0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgJiYgdGhpcy5yZWFsRGV2aWNlKSB7XG4gICAgICBpZiAodGhpcy5rZXljaGFpblBhdGggJiYgdGhpcy5rZXljaGFpblBhc3N3b3JkKSB7XG4gICAgICAgIGF3YWl0IHNldFJlYWxEZXZpY2VTZWN1cml0eSh0aGlzLmtleWNoYWluUGF0aCwgdGhpcy5rZXljaGFpblBhc3N3b3JkKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnhjb2RlT3JnSWQgJiYgdGhpcy54Y29kZVNpZ25pbmdJZCAmJiAhdGhpcy54Y29kZUNvbmZpZ0ZpbGUpIHtcbiAgICAgICAgdGhpcy54Y29kZUNvbmZpZ0ZpbGUgPSBhd2FpdCBnZW5lcmF0ZVhjb2RlQ29uZmlnRmlsZSh0aGlzLnhjb2RlT3JnSWQsIHRoaXMueGNvZGVTaWduaW5nSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHtjbWQsIGFyZ3N9ID0gdGhpcy5nZXRDb21tYW5kKGJ1aWxkT25seSk7XG4gICAgdGhpcy5sb2cuZGVidWcoYEJlZ2lubmluZyAke2J1aWxkT25seSA/ICdidWlsZCcgOiAndGVzdCd9IHdpdGggY29tbWFuZCAnJHtjbWR9ICR7YXJncy5qb2luKCcgJyl9JyBgICtcbiAgICAgIGBpbiBkaXJlY3RvcnkgJyR7dGhpcy5ib290c3RyYXBQYXRofSdgKTtcbiAgICBjb25zdCBlbnYgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwge1xuICAgICAgVVNFX1BPUlQ6IHRoaXMud2RhUmVtb3RlUG9ydCxcbiAgICAgIFdEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCB8fCBXREFfUlVOTkVSX0JVTkRMRV9JRCxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5tanBlZ1NlcnZlclBvcnQpIHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vV2ViRHJpdmVyQWdlbnQvcHVsbC8xMDVcbiAgICAgIGVudi5NSlBFR19TRVJWRVJfUE9SVCA9IHRoaXMubWpwZWdTZXJ2ZXJQb3J0O1xuICAgIH1cbiAgICBjb25zdCB1cGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCh0aGlzLmJvb3RzdHJhcFBhdGgpO1xuICAgIGlmICh1cGdyYWRlVGltZXN0YW1wKSB7XG4gICAgICBlbnYuVVBHUkFERV9USU1FU1RBTVAgPSB1cGdyYWRlVGltZXN0YW1wO1xuICAgIH1cbiAgICBjb25zdCB4Y29kZWJ1aWxkID0gbmV3IFN1YlByb2Nlc3MoY21kLCBhcmdzLCB7XG4gICAgICBjd2Q6IHRoaXMuYm9vdHN0cmFwUGF0aCxcbiAgICAgIGVudixcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuXG4gICAgbGV0IGxvZ1hjb2RlT3V0cHV0ID0gISF0aGlzLnNob3dYY29kZUxvZztcbiAgICBjb25zdCBsb2dNc2cgPSBfLmlzQm9vbGVhbih0aGlzLnNob3dYY29kZUxvZylcbiAgICAgID8gYE91dHB1dCBmcm9tIHhjb2RlYnVpbGQgJHt0aGlzLnNob3dYY29kZUxvZyA/ICd3aWxsJyA6ICd3aWxsIG5vdCd9IGJlIGxvZ2dlZGBcbiAgICAgIDogJ091dHB1dCBmcm9tIHhjb2RlYnVpbGQgd2lsbCBvbmx5IGJlIGxvZ2dlZCBpZiBhbnkgZXJyb3JzIGFyZSBwcmVzZW50IHRoZXJlJztcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgJHtsb2dNc2d9LiBUbyBjaGFuZ2UgdGhpcywgdXNlICdzaG93WGNvZGVMb2cnIGRlc2lyZWQgY2FwYWJpbGl0eWApO1xuICAgIHhjb2RlYnVpbGQub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgbGV0IG91dCA9IHN0ZG91dCB8fCBzdGRlcnI7XG4gICAgICAvLyB3ZSB3YW50IHRvIHB1bGwgb3V0IHRoZSBsb2cgZmlsZSB0aGF0IGlzIGNyZWF0ZWQsIGFuZCBoaWdobGlnaHQgaXRcbiAgICAgIC8vIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzXG4gICAgICBpZiAob3V0LmluY2x1ZGVzKCdXcml0aW5nIGRpYWdub3N0aWMgbG9nIGZvciB0ZXN0IHNlc3Npb24gdG8nKSkge1xuICAgICAgICAvLyBwdWxsIG91dCB0aGUgZmlyc3QgbGluZSB0aGF0IGJlZ2lucyB3aXRoIHRoZSBwYXRoIHNlcGFyYXRvclxuICAgICAgICAvLyB3aGljaCAqc2hvdWxkKiBiZSB0aGUgbGluZSBpbmRpY2F0aW5nIHRoZSBsb2cgZmlsZSBnZW5lcmF0ZWRcbiAgICAgICAgeGNvZGVidWlsZC5sb2dMb2NhdGlvbiA9IF8uZmlyc3QoXy5yZW1vdmUob3V0LnRyaW0oKS5zcGxpdCgnXFxuJyksICh2KSA9PiB2LnN0YXJ0c1dpdGgocGF0aC5zZXApKSk7XG4gICAgICAgIHhjb2RlTG9nLmRlYnVnKGBMb2cgZmlsZSBmb3IgeGNvZGVidWlsZCB0ZXN0OiAke3hjb2RlYnVpbGQubG9nTG9jYXRpb259YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHdlIGhhdmUgYW4gZXJyb3Igd2Ugd2FudCB0byBvdXRwdXQgdGhlIGxvZ3NcbiAgICAgIC8vIG90aGVyd2lzZSB0aGUgZmFpbHVyZSBpcyBpbnNjcnV0aWJsZVxuICAgICAgLy8gYnV0IGRvIG5vdCBsb2cgcGVybWlzc2lvbiBlcnJvcnMgZnJvbSB0cnlpbmcgdG8gd3JpdGUgdG8gYXR0YWNobWVudHMgZm9sZGVyXG4gICAgICBjb25zdCBpZ25vcmVFcnJvciA9IElHTk9SRURfRVJST1JTLnNvbWUoKHgpID0+IG91dC5pbmNsdWRlcyh4KSk7XG4gICAgICBpZiAodGhpcy5zaG93WGNvZGVMb2cgIT09IGZhbHNlICYmIG91dC5pbmNsdWRlcygnRXJyb3IgRG9tYWluPScpICYmICFpZ25vcmVFcnJvcikge1xuICAgICAgICBsb2dYY29kZU91dHB1dCA9IHRydWU7XG5cbiAgICAgICAgLy8gdGVycmlibGUgaGFjayB0byBoYW5kbGUgY2FzZSB3aGVyZSB4Y29kZSByZXR1cm4gMCBidXQgaXMgZmFpbGluZ1xuICAgICAgICB4Y29kZWJ1aWxkLl93ZGFfZXJyb3Jfb2NjdXJyZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBkbyBub3QgbG9nIHBlcm1pc3Npb24gZXJyb3JzIGZyb20gdHJ5aW5nIHRvIHdyaXRlIHRvIGF0dGFjaG1lbnRzIGZvbGRlclxuICAgICAgaWYgKGxvZ1hjb2RlT3V0cHV0ICYmICFpZ25vcmVFcnJvcikge1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygb3V0LnNwbGl0KEVPTCkpIHtcbiAgICAgICAgICB4Y29kZUxvZy5lcnJvcihsaW5lKTtcbiAgICAgICAgICBpZiAobGluZSkge1xuICAgICAgICAgICAgeGNvZGVidWlsZC5fd2RhX2Vycm9yX21lc3NhZ2UgKz0gYCR7RU9MfSR7bGluZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHhjb2RlYnVpbGQ7XG4gIH1cblxuICBhc3luYyBzdGFydCAoYnVpbGRPbmx5ID0gZmFsc2UpIHtcbiAgICB0aGlzLnhjb2RlYnVpbGQgPSBhd2FpdCB0aGlzLmNyZWF0ZVN1YlByb2Nlc3MoYnVpbGRPbmx5KTtcbiAgICAvLyBTdG9yZSB4Y29kZWJ1aWxkIG1lc3NhZ2VcbiAgICB0aGlzLnhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlID0gJyc7XG5cbiAgICAvLyB3cmFwIHRoZSBzdGFydCBwcm9jZWR1cmUgaW4gYSBwcm9taXNlIHNvIHRoYXQgd2UgY2FuIGNhdGNoLCBhbmQgcmVwb3J0LFxuICAgIC8vIGFueSBzdGFydHVwIGVycm9ycyB0aGF0IGFyZSB0aHJvd24gYXMgZXZlbnRzXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMueGNvZGVidWlsZC5vbignZXhpdCcsIGFzeW5jIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgeGNvZGVMb2cuZXJyb3IoYHhjb2RlYnVpbGQgZXhpdGVkIHdpdGggY29kZSAnJHtjb2RlfScgYW5kIHNpZ25hbCAnJHtzaWduYWx9J2ApO1xuICAgICAgICAvLyBwcmludCBvdXQgdGhlIHhjb2RlYnVpbGQgZmlsZSBpZiB1c2VycyBoYXZlIGFza2VkIGZvciBpdFxuICAgICAgICBpZiAodGhpcy5zaG93WGNvZGVMb2cgJiYgdGhpcy54Y29kZWJ1aWxkLmxvZ0xvY2F0aW9uKSB7XG4gICAgICAgICAgeGNvZGVMb2cuZXJyb3IoYENvbnRlbnRzIG9mIHhjb2RlYnVpbGQgbG9nIGZpbGUgJyR7dGhpcy54Y29kZWJ1aWxkLmxvZ0xvY2F0aW9ufSc6YCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy54Y29kZWJ1aWxkLmxvZ0xvY2F0aW9uLCAndXRmOCcpO1xuICAgICAgICAgICAgZm9yIChsZXQgbGluZSBvZiBkYXRhLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgICAgICB4Y29kZUxvZy5lcnJvcihsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHhjb2RlTG9nLmVycm9yKGBVbmFibGUgdG8gYWNjZXNzIHhjb2RlYnVpbGQgbG9nIGZpbGU6ICcke2Vyci5tZXNzYWdlfSdgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54Y29kZWJ1aWxkLnByb2Nlc3NFeGl0ZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy54Y29kZWJ1aWxkLl93ZGFfZXJyb3Jfb2NjdXJyZWQgfHwgKCFzaWduYWwgJiYgY29kZSAhPT0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgeGNvZGVidWlsZCBmYWlsZWQgd2l0aCBjb2RlICR7Y29kZX0ke0VPTH1gICtcbiAgICAgICAgICAgIGB4Y29kZWJ1aWxkIGVycm9yIG1lc3NhZ2U6JHtFT0x9JHt0aGlzLnhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBqdXN0IGJ1aWxkaW5nLCB0aGUgcHJvY2VzcyB3aWxsIGV4aXQgYW5kIHRoYXQgaXMgb3VyIGZpbmlzaFxuICAgICAgICBpZiAoYnVpbGRPbmx5KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnN0YXJ0KHRydWUpO1xuICAgICAgICAgIGlmICghYnVpbGRPbmx5KSB7XG4gICAgICAgICAgICBsZXQgc3RhdHVzID0gYXdhaXQgdGhpcy53YWl0Rm9yU3RhcnQodGltZXIpO1xuICAgICAgICAgICAgcmVzb2x2ZShzdGF0dXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbGV0IG1zZyA9IGBVbmFibGUgdG8gc3RhcnQgV2ViRHJpdmVyQWdlbnQ6ICR7ZXJyfWA7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3IobXNnKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKG1zZykpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgd2FpdEZvclN0YXJ0ICh0aW1lcikge1xuICAgIC8vIHRyeSB0byBjb25uZWN0IG9uY2UgZXZlcnkgMC41IHNlY29uZHMsIHVudGlsIGBsYXVuY2hUaW1lb3V0YCBpcyB1cFxuICAgIHRoaXMubG9nLmRlYnVnKGBXYWl0aW5nIHVwIHRvICR7dGhpcy5sYXVuY2hUaW1lb3V0fW1zIGZvciBXZWJEcml2ZXJBZ2VudCB0byBzdGFydGApO1xuICAgIGxldCBjdXJyZW50U3RhdHVzID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgbGV0IHJldHJpZXMgPSBwYXJzZUludCh0aGlzLmxhdW5jaFRpbWVvdXQgLyA1MDAsIDEwKTtcbiAgICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgMTAwMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy54Y29kZWJ1aWxkLnByb2Nlc3NFeGl0ZWQpIHtcbiAgICAgICAgICAvLyB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciBlbHNld2hlcmUgYW5kIHdlIG5lZWQgdG8gc2hvcnQtY2lyY3VpdFxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm94eVRpbWVvdXQgPSB0aGlzLm5vU2Vzc2lvblByb3h5LnRpbWVvdXQ7XG4gICAgICAgIHRoaXMubm9TZXNzaW9uUHJveHkudGltZW91dCA9IDEwMDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY3VycmVudFN0YXR1cyA9IGF3YWl0IHRoaXMubm9TZXNzaW9uUHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgICAgICBpZiAoY3VycmVudFN0YXR1cyAmJiBjdXJyZW50U3RhdHVzLmlvcyAmJiBjdXJyZW50U3RhdHVzLmlvcy5pcCkge1xuICAgICAgICAgICAgdGhpcy5hZ2VudFVybCA9IGN1cnJlbnRTdGF0dXMuaW9zLmlwO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgV2ViRHJpdmVyQWdlbnQgaW5mb3JtYXRpb246YCk7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoSlNPTi5zdHJpbmdpZnkoY3VycmVudFN0YXR1cywgbnVsbCwgMikpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBjb25uZWN0IHRvIHJ1bm5pbmcgV2ViRHJpdmVyQWdlbnQ6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5ub1Nlc3Npb25Qcm94eS50aW1lb3V0ID0gcHJveHlUaW1lb3V0O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMueGNvZGVidWlsZC5wcm9jZXNzRXhpdGVkKSB7XG4gICAgICAgIC8vIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIGVsc2V3aGVyZSBhbmQgd2UgbmVlZCB0byBzaG9ydC1jaXJjdWl0XG4gICAgICAgIHJldHVybiBjdXJyZW50U3RhdHVzO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgV2ViRHJpdmVyQWdlbnQgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgYWZ0ZXIgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIGlmIHdlIGhhdmUgbm90IGhhZCBhbnkgZXJyb3JzIGZyb20geGNvZGUgaXRzZWxmIChyZXBvcnRlZFxuICAgICAgLy8gZWxzZXdoZXJlKSwgd2UgY2FuIGxldCB0aGlzIGdvIHRocm91Z2ggYW5kIHRyeSB0byBjcmVhdGUgdGhlIHNlc3Npb25cbiAgICAgIHRoaXMubG9nLmRlYnVnKGVyci5tZXNzYWdlKTtcbiAgICAgIHRoaXMubG9nLndhcm4oYEdldHRpbmcgc3RhdHVzIG9mIFdlYkRyaXZlckFnZW50IG9uIGRldmljZSB0aW1lZCBvdXQuIENvbnRpbnVpbmdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0dXM7XG4gIH1cblxuICBhc3luYyBxdWl0ICgpIHtcbiAgICBhd2FpdCBraWxsUHJvY2VzcygneGNvZGVidWlsZCcsIHRoaXMueGNvZGVidWlsZCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgWGNvZGVCdWlsZCB9O1xuZXhwb3J0IGRlZmF1bHQgWGNvZGVCdWlsZDtcbiJdLCJmaWxlIjoibGliL3hjb2RlYnVpbGQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -4,7 +4,7 @@ import url from 'url';
4
4
  import B from 'bluebird';
5
5
  import { JWProxy } from '@appium/base-driver';
6
6
  import { fs, util, plist, mkdirp } from '@appium/support';
7
- import log from './logger';
7
+ import defaultLogger from './logger';
8
8
  import { NoSessionProxy } from './no-session-proxy';
9
9
  import {
10
10
  getWDAUpgradeTimestamp, resetTestProcesses, getPIDsListeningOnPort
@@ -24,10 +24,11 @@ const WDA_CF_BUNDLE_NAME = 'WebDriverAgentRunner-Runner';
24
24
  const SHARED_RESOURCES_GUARD = new AsyncLock();
25
25
 
26
26
  class WebDriverAgent {
27
- constructor (xcodeVersion, args = {}) {
27
+ constructor (xcodeVersion, args = {}, log = null) {
28
28
  this.xcodeVersion = xcodeVersion;
29
29
 
30
30
  this.args = _.clone(args);
31
+ this.log = log ?? defaultLogger;
31
32
 
32
33
  this.device = args.device;
33
34
  this.platformVersion = args.platformVersion;
@@ -83,18 +84,18 @@ class WebDriverAgent {
83
84
  allowProvisioningDeviceRegistration: args.allowProvisioningDeviceRegistration,
84
85
  resultBundlePath: args.resultBundlePath,
85
86
  resultBundleVersion: args.resultBundleVersion,
86
- });
87
+ }, this.log);
87
88
  }
88
89
 
89
90
  setWDAPaths (bootstrapPath, agentPath) {
90
91
  // allow the user to specify a place for WDA. This is undocumented and
91
92
  // only here for the purposes of testing development of WDA
92
93
  this.bootstrapPath = bootstrapPath || BOOTSTRAP_PATH;
93
- log.info(`Using WDA path: '${this.bootstrapPath}'`);
94
+ this.log.info(`Using WDA path: '${this.bootstrapPath}'`);
94
95
 
95
96
  // for backward compatibility we need to be able to specify agentPath too
96
97
  this.agentPath = agentPath || path.resolve(this.bootstrapPath, 'WebDriverAgent.xcodeproj');
97
- log.info(`Using WDA agent: '${this.agentPath}'`);
98
+ this.log.info(`Using WDA agent: '${this.agentPath}'`);
98
99
  }
99
100
 
100
101
  async cleanupObsoleteProcesses () {
@@ -103,17 +104,17 @@ class WebDriverAgent {
103
104
  !cmdLine.toLowerCase().includes(this.device.udid.toLowerCase()));
104
105
 
105
106
  if (_.isEmpty(obsoletePids)) {
106
- log.debug(`No obsolete cached processes from previous WDA sessions ` +
107
+ this.log.debug(`No obsolete cached processes from previous WDA sessions ` +
107
108
  `listening on port ${this.url.port} have been found`);
108
109
  return;
109
110
  }
110
111
 
111
- log.info(`Detected ${obsoletePids.length} obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} ` +
112
+ this.log.info(`Detected ${obsoletePids.length} obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} ` +
112
113
  `from previous WDA sessions. Cleaning them up`);
113
114
  try {
114
115
  await exec('kill', obsoletePids);
115
116
  } catch (e) {
116
- log.warn(`Failed to kill obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} '${obsoletePids}'. ` +
117
+ this.log.warn(`Failed to kill obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} '${obsoletePids}'. ` +
117
118
  `Original error: ${e.message}`);
118
119
  }
119
120
  }
@@ -166,7 +167,7 @@ class WebDriverAgent {
166
167
  try {
167
168
  return await noSessionProxy.command('/status', 'GET');
168
169
  } catch (err) {
169
- log.debug(`WDA is not listening at '${this.url.href}'`);
170
+ this.log.debug(`WDA is not listening at '${this.url.href}'`);
170
171
  return null;
171
172
  }
172
173
  }
@@ -180,17 +181,17 @@ class WebDriverAgent {
180
181
  try {
181
182
  const bundleIds = await this.device.getUserInstalledBundleIdsByBundleName(WDA_CF_BUNDLE_NAME);
182
183
  if (_.isEmpty(bundleIds)) {
183
- log.debug('No WDAs on the device.');
184
+ this.log.debug('No WDAs on the device.');
184
185
  return;
185
186
  }
186
187
 
187
- log.debug(`Uninstalling WDAs: '${bundleIds}'`);
188
+ this.log.debug(`Uninstalling WDAs: '${bundleIds}'`);
188
189
  for (const bundleId of bundleIds) {
189
190
  await this.device.removeApp(bundleId);
190
191
  }
191
192
  } catch (e) {
192
- log.debug(e);
193
- log.warn(`WebDriverAgent uninstall failed. Perhaps, it is already uninstalled? ` +
193
+ this.log.debug(e);
194
+ this.log.warn(`WebDriverAgent uninstall failed. Perhaps, it is already uninstalled? ` +
194
195
  `Original error: ${e.message}`);
195
196
  }
196
197
  }
@@ -198,13 +199,13 @@ class WebDriverAgent {
198
199
  async _cleanupProjectIfFresh () {
199
200
  const homeFolder = process.env.HOME;
200
201
  if (!homeFolder) {
201
- log.info('The HOME folder path cannot be determined');
202
+ this.log.info('The HOME folder path cannot be determined');
202
203
  return;
203
204
  }
204
205
 
205
206
  const currentUpgradeTimestamp = await getWDAUpgradeTimestamp();
206
207
  if (!_.isInteger(currentUpgradeTimestamp)) {
207
- log.info('It is impossible to determine the timestamp of the package');
208
+ this.log.info('It is impossible to determine the timestamp of the package');
208
209
  return;
209
210
  }
210
211
 
@@ -213,31 +214,31 @@ class WebDriverAgent {
213
214
  try {
214
215
  await fs.access(timestampPath, fs.W_OK);
215
216
  } catch (ign) {
216
- log.info(`WebDriverAgent upgrade timestamp at '${timestampPath}' is not writeable. ` +
217
+ this.log.info(`WebDriverAgent upgrade timestamp at '${timestampPath}' is not writeable. ` +
217
218
  `Skipping sources cleanup`);
218
219
  return;
219
220
  }
220
221
  const recentUpgradeTimestamp = parseInt(await fs.readFile(timestampPath, 'utf8'), 10);
221
222
  if (_.isInteger(recentUpgradeTimestamp)) {
222
223
  if (recentUpgradeTimestamp >= currentUpgradeTimestamp) {
223
- log.info(`WebDriverAgent does not need a cleanup. The sources are up to date ` +
224
+ this.log.info(`WebDriverAgent does not need a cleanup. The sources are up to date ` +
224
225
  `(${recentUpgradeTimestamp} >= ${currentUpgradeTimestamp})`);
225
226
  return;
226
227
  }
227
- log.info(`WebDriverAgent sources have been upgraded ` +
228
+ this.log.info(`WebDriverAgent sources have been upgraded ` +
228
229
  `(${recentUpgradeTimestamp} < ${currentUpgradeTimestamp})`);
229
230
  } else {
230
- log.warn(`The recent upgrade timestamp at '${timestampPath}' is corrupted. Trying to fix it`);
231
+ this.log.warn(`The recent upgrade timestamp at '${timestampPath}' is corrupted. Trying to fix it`);
231
232
  }
232
233
  }
233
234
 
234
235
  try {
235
236
  await mkdirp(path.dirname(timestampPath));
236
237
  await fs.writeFile(timestampPath, `${currentUpgradeTimestamp}`, 'utf8');
237
- log.debug(`Stored the recent WebDriverAgent upgrade timestamp ${currentUpgradeTimestamp} ` +
238
+ this.log.debug(`Stored the recent WebDriverAgent upgrade timestamp ${currentUpgradeTimestamp} ` +
238
239
  `at '${timestampPath}'`);
239
240
  } catch (e) {
240
- log.info(`Unable to create the recent WebDriverAgent upgrade timestamp at '${timestampPath}'. ` +
241
+ this.log.info(`Unable to create the recent WebDriverAgent upgrade timestamp at '${timestampPath}'. ` +
241
242
  `Original error: ${e.message}`);
242
243
  return;
243
244
  }
@@ -245,7 +246,7 @@ class WebDriverAgent {
245
246
  try {
246
247
  await this.xcodebuild.cleanProject();
247
248
  } catch (e) {
248
- log.warn(`Cannot perform WebDriverAgent project cleanup. Original error: ${e.message}`);
249
+ this.log.warn(`Cannot perform WebDriverAgent project cleanup. Original error: ${e.message}`);
249
250
  }
250
251
  }
251
252
 
@@ -274,13 +275,13 @@ class WebDriverAgent {
274
275
  */
275
276
  async launch (sessionId) {
276
277
  if (this.webDriverAgentUrl) {
277
- log.info(`Using provided WebdriverAgent at '${this.webDriverAgentUrl}'`);
278
+ this.log.info(`Using provided WebdriverAgent at '${this.webDriverAgentUrl}'`);
278
279
  this.url = this.webDriverAgentUrl;
279
280
  this.setupProxies(sessionId);
280
281
  return await this.getStatus();
281
282
  }
282
283
 
283
- log.info('Launching WebDriverAgent on the device');
284
+ this.log.info('Launching WebDriverAgent on the device');
284
285
 
285
286
  this.setupProxies(sessionId);
286
287
 
@@ -292,7 +293,7 @@ class WebDriverAgent {
292
293
  // useXctestrunFile and usePrebuiltWDA use existing dependencies
293
294
  // It depends on user side
294
295
  if (this.idb || this.useXctestrunFile || (this.derivedDataPath && this.usePrebuiltWDA)) {
295
- log.info('Skipped WDA project cleanup according to the provided capabilities');
296
+ this.log.info('Skipped WDA project cleanup according to the provided capabilities');
296
297
  } else {
297
298
  const synchronizationKey = path.normalize(this.bootstrapPath);
298
299
  await SHARED_RESOURCES_GUARD.acquire(synchronizationKey,
@@ -316,7 +317,7 @@ class WebDriverAgent {
316
317
  }
317
318
 
318
319
  async startWithIDB () {
319
- log.info('Will launch WDA with idb instead of xcodebuild since the corresponding flag is enabled');
320
+ this.log.info('Will launch WDA with idb instead of xcodebuild since the corresponding flag is enabled');
320
321
  const {wdaBundleId, testBundleId} = await this.prepareWDA();
321
322
  const env = {
322
323
  USE_PORT: this.wdaRemotePort,
@@ -371,6 +372,7 @@ class WebDriverAgent {
371
372
 
372
373
  setupProxies (sessionId) {
373
374
  const proxyOpts = {
375
+ log: this.log,
374
376
  server: this.url.hostname,
375
377
  port: this.url.port,
376
378
  base: this.basePath,
@@ -386,7 +388,7 @@ class WebDriverAgent {
386
388
  }
387
389
 
388
390
  async quit () {
389
- log.info('Shutting down sub-processes');
391
+ this.log.info('Shutting down sub-processes');
390
392
 
391
393
  await this.xcodebuild.quit();
392
394
  await this.xcodebuild.reset();
@@ -443,7 +445,7 @@ class WebDriverAgent {
443
445
  async setupCaching () {
444
446
  const status = await this.getStatus();
445
447
  if (!status || !status.build) {
446
- log.debug('WDA is currently not running. There is nothing to cache');
448
+ this.log.debug('WDA is currently not running. There is nothing to cache');
447
449
  return;
448
450
  }
449
451
 
@@ -453,20 +455,20 @@ class WebDriverAgent {
453
455
  } = status.build;
454
456
  // for real device
455
457
  if (util.hasValue(productBundleIdentifier) && util.hasValue(this.updatedWDABundleId) && this.updatedWDABundleId !== productBundleIdentifier) {
456
- log.info(`Will uninstall running WDA since it has different bundle id. The actual value is '${productBundleIdentifier}'.`);
458
+ this.log.info(`Will uninstall running WDA since it has different bundle id. The actual value is '${productBundleIdentifier}'.`);
457
459
  return await this.uninstall();
458
460
  }
459
461
  // for simulator
460
462
  if (util.hasValue(productBundleIdentifier) && !util.hasValue(this.updatedWDABundleId) && WDA_RUNNER_BUNDLE_ID !== productBundleIdentifier) {
461
- log.info(`Will uninstall running WDA since its bundle id is not equal to the default value ${WDA_RUNNER_BUNDLE_ID}`);
463
+ this.log.info(`Will uninstall running WDA since its bundle id is not equal to the default value ${WDA_RUNNER_BUNDLE_ID}`);
462
464
  return await this.uninstall();
463
465
  }
464
466
 
465
467
  const actualUpgradeTimestamp = await getWDAUpgradeTimestamp();
466
- log.debug(`Upgrade timestamp of the currently bundled WDA: ${actualUpgradeTimestamp}`);
467
- log.debug(`Upgrade timestamp of the WDA on the device: ${upgradedAt}`);
468
+ this.log.debug(`Upgrade timestamp of the currently bundled WDA: ${actualUpgradeTimestamp}`);
469
+ this.log.debug(`Upgrade timestamp of the WDA on the device: ${upgradedAt}`);
468
470
  if (actualUpgradeTimestamp && upgradedAt && _.toLower(`${actualUpgradeTimestamp}`) !== _.toLower(`${upgradedAt}`)) {
469
- log.info('Will uninstall running WDA since it has different version in comparison to the one ' +
471
+ this.log.info('Will uninstall running WDA since it has different version in comparison to the one ' +
470
472
  `which is bundled with appium-xcuitest-driver module (${actualUpgradeTimestamp} != ${upgradedAt})`);
471
473
  return await this.uninstall();
472
474
  }
@@ -474,7 +476,7 @@ class WebDriverAgent {
474
476
  const message = util.hasValue(productBundleIdentifier)
475
477
  ? `Will reuse previously cached WDA instance at '${this.url.href}' with '${productBundleIdentifier}'`
476
478
  : `Will reuse previously cached WDA instance at '${this.url.href}'`;
477
- log.info(`${message}. Set the wdaLocalPort capability to a value different from ${this.url.port} if this is an undesired behavior.`);
479
+ this.log.info(`${message}. Set the wdaLocalPort capability to a value different from ${this.url.port} if this is an undesired behavior.`);
478
480
  this.webDriverAgentUrl = this.url.href;
479
481
  }
480
482