appium-adb 8.18.0 → 9.2.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.
@@ -19,7 +19,7 @@ var _path = _interopRequireDefault(require("path"));
19
19
 
20
20
  var _logger = _interopRequireDefault(require("../logger.js"));
21
21
 
22
- var _appiumSupport = require("appium-support");
22
+ var _support = require("@appium/support");
23
23
 
24
24
  var _lruCache = _interopRequireDefault(require("lru-cache"));
25
25
 
@@ -48,13 +48,14 @@ apkSigningMethods.executeApksigner = async function executeApksigner(args = [])
48
48
  const apkSignerJar = await (0, _helpers.getApksignerForOs)(this);
49
49
  const fullCmd = [await (0, _helpers.getJavaForOs)(), '-Xmx1024M', '-Xss1m', '-jar', apkSignerJar, ...args];
50
50
 
51
- _logger.default.debug(`Starting apksigner: ${_appiumSupport.util.quote(fullCmd)}`);
51
+ _logger.default.debug(`Starting apksigner: ${_support.util.quote(fullCmd)}`);
52
52
 
53
53
  const {
54
54
  stdout,
55
55
  stderr
56
56
  } = await (0, _teen_process.exec)(fullCmd[0], fullCmd.slice(1), {
57
- cwd: _path.default.dirname(apkSignerJar)
57
+ cwd: _path.default.dirname(apkSignerJar),
58
+ windowsVerbatimArguments: _support.system.isWindows()
58
59
  });
59
60
 
60
61
  for (let [name, stream] of [['stdout', stdout], ['stderr', stderr]]) {
@@ -75,7 +76,7 @@ apkSigningMethods.executeApksigner = async function executeApksigner(args = [])
75
76
  apkSigningMethods.signWithDefaultCert = async function signWithDefaultCert(apk) {
76
77
  _logger.default.debug(`Signing '${apk}' with default cert`);
77
78
 
78
- if (!(await _appiumSupport.fs.exists(apk))) {
79
+ if (!(await _support.fs.exists(apk))) {
79
80
  throw new Error(`${apk} file doesn't exist.`);
80
81
  }
81
82
 
@@ -91,11 +92,11 @@ apkSigningMethods.signWithDefaultCert = async function signWithDefaultCert(apk)
91
92
  apkSigningMethods.signWithCustomCert = async function signWithCustomCert(apk) {
92
93
  _logger.default.debug(`Signing '${apk}' with custom cert`);
93
94
 
94
- if (!(await _appiumSupport.fs.exists(this.keystorePath))) {
95
+ if (!(await _support.fs.exists(this.keystorePath))) {
95
96
  throw new Error(`Keystore: ${this.keystorePath} doesn't exist.`);
96
97
  }
97
98
 
98
- if (!(await _appiumSupport.fs.exists(apk))) {
99
+ if (!(await _support.fs.exists(apk))) {
99
100
  throw new Error(`'${apk}' doesn't exist.`);
100
101
  }
101
102
 
@@ -111,13 +112,15 @@ apkSigningMethods.signWithCustomCert = async function signWithCustomCert(apk) {
111
112
  _logger.default.debug(`'${apk}' does not need to be unsigned`);
112
113
  }
113
114
 
114
- const jarsigner = _path.default.resolve(await (0, _helpers.getJavaHome)(), 'bin', `jarsigner${_appiumSupport.system.isWindows() ? '.exe' : ''}`);
115
+ const jarsigner = _path.default.resolve(await (0, _helpers.getJavaHome)(), 'bin', `jarsigner${_support.system.isWindows() ? '.exe' : ''}`);
115
116
 
116
117
  const fullCmd = [jarsigner, '-sigalg', 'MD5withRSA', '-digestalg', 'SHA1', '-keystore', this.keystorePath, '-storepass', this.keystorePassword, '-keypass', this.keyPassword, apk, this.keyAlias];
117
118
 
118
- _logger.default.debug(`Starting jarsigner: ${_appiumSupport.util.quote(fullCmd)}`);
119
+ _logger.default.debug(`Starting jarsigner: ${_support.util.quote(fullCmd)}`);
119
120
 
120
- await (0, _teen_process.exec)(fullCmd[0], fullCmd.slice(1));
121
+ await (0, _teen_process.exec)(fullCmd[0], fullCmd.slice(1), {
122
+ windowsVerbatimArguments: _support.system.isWindows()
123
+ });
121
124
  } catch (e) {
122
125
  throw new Error(`Could not sign with custom certificate. ` + `Original error: ${e.stderr || e.message}`);
123
126
  }
@@ -162,26 +165,26 @@ apkSigningMethods.zipAlignApk = async function zipAlignApk(apk) {
162
165
  }
163
166
 
164
167
  try {
165
- await _appiumSupport.fs.access(apk, _fs2.default.W_OK);
168
+ await _support.fs.access(apk, _fs2.default.W_OK);
166
169
  } catch (e) {
167
170
  throw new Error(`The file at '${apk}' is not writeable. ` + `Please grant write permissions to this file or to its parent folder '${_path.default.dirname(apk)}' ` + `for the Appium process, so it can zip-align the file`);
168
171
  }
169
172
 
170
- const alignedApk = await _appiumSupport.tempDir.path({
173
+ const alignedApk = await _support.tempDir.path({
171
174
  prefix: 'appium',
172
175
  suffix: '.tmp'
173
176
  });
174
- await (0, _appiumSupport.mkdirp)(_path.default.dirname(alignedApk));
177
+ await (0, _support.mkdirp)(_path.default.dirname(alignedApk));
175
178
 
176
179
  try {
177
180
  await (0, _teen_process.exec)(this.binaries.zipalign, ['-f', '4', apk, alignedApk]);
178
- await _appiumSupport.fs.mv(alignedApk, apk, {
181
+ await _support.fs.mv(alignedApk, apk, {
179
182
  mkdirp: true
180
183
  });
181
184
  return true;
182
185
  } catch (e) {
183
- if (await _appiumSupport.fs.exists(alignedApk)) {
184
- await _appiumSupport.fs.unlink(alignedApk);
186
+ if (await _support.fs.exists(alignedApk)) {
187
+ await _support.fs.unlink(alignedApk);
185
188
  }
186
189
 
187
190
  throw new Error(`zipAlignApk failed. Original error: ${e.stderr || e.message}`);
@@ -191,7 +194,7 @@ apkSigningMethods.zipAlignApk = async function zipAlignApk(apk) {
191
194
  apkSigningMethods.checkApkCert = async function checkApkCert(appPath, pkg, opts = {}) {
192
195
  _logger.default.debug(`Checking app cert for ${appPath}`);
193
196
 
194
- if (!(await _appiumSupport.fs.exists(appPath))) {
197
+ if (!(await _support.fs.exists(appPath))) {
195
198
  _logger.default.debug(`'${appPath}' does not exist`);
196
199
 
197
200
  return false;
@@ -216,7 +219,7 @@ apkSigningMethods.checkApkCert = async function checkApkCert(appPath, pkg, opts
216
219
  const {
217
220
  requireDefaultCert = true
218
221
  } = opts;
219
- const appHash = await _appiumSupport.fs.hash(appPath);
222
+ const appHash = await _support.fs.hash(appPath);
220
223
 
221
224
  if (SIGNED_APPS_CACHE.has(appHash)) {
222
225
  _logger.default.debug(`Using the previously cached signature entry for '${_path.default.basename(appPath)}'`);
@@ -280,20 +283,22 @@ apkSigningMethods.checkApkCert = async function checkApkCert(appPath, pkg, opts
280
283
  apkSigningMethods.getKeystoreHash = async function getKeystoreHash() {
281
284
  _logger.default.debug(`Getting hash of the '${this.keystorePath}' keystore`);
282
285
 
283
- const keytool = _path.default.resolve(await (0, _helpers.getJavaHome)(), 'bin', `keytool${_appiumSupport.system.isWindows() ? '.exe' : ''}`);
286
+ const keytool = _path.default.resolve(await (0, _helpers.getJavaHome)(), 'bin', `keytool${_support.system.isWindows() ? '.exe' : ''}`);
284
287
 
285
- if (!(await _appiumSupport.fs.exists(keytool))) {
288
+ if (!(await _support.fs.exists(keytool))) {
286
289
  throw new Error(`The keytool utility cannot be found at '${keytool}'`);
287
290
  }
288
291
 
289
292
  const args = ['-v', '-list', '-alias', this.keyAlias, '-keystore', this.keystorePath, '-storepass', this.keystorePassword];
290
293
 
291
- _logger.default.info(`Running '${keytool}' with arguments: ${_appiumSupport.util.quote(args)}`);
294
+ _logger.default.info(`Running '${keytool}' with arguments: ${_support.util.quote(args)}`);
292
295
 
293
296
  try {
294
297
  const {
295
298
  stdout
296
- } = await (0, _teen_process.exec)(keytool, args);
299
+ } = await (0, _teen_process.exec)(keytool, args, {
300
+ windowsVerbatimArguments: _support.system.isWindows()
301
+ });
297
302
  const result = {};
298
303
 
299
304
  for (const hashName of [SHA512, SHA256, SHA1, MD5]) {
@@ -325,4 +330,4 @@ var _default = apkSigningMethods;
325
330
  exports.default = _default;require('source-map-support').install();
326
331
 
327
332
 
328
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hcGstc2lnbmluZy5qcyJdLCJuYW1lcyI6WyJERUZBVUxUX1BSSVZBVEVfS0VZIiwicGF0aCIsInJlc29sdmUiLCJyb290RGlyIiwiREVGQVVMVF9DRVJUSUZJQ0FURSIsIkJVTkRMRVRPT0xfVFVUT1JJQUwiLCJBUEtTSUdORVJfVkVSSUZZX0ZBSUwiLCJTSEExIiwiU0hBMjU2IiwiU0hBNTEyIiwiTUQ1IiwiREVGQVVMVF9DRVJUX0hBU0giLCJKQVZBX1BST1BTX0lOSVRfRVJST1IiLCJTSUdORURfQVBQU19DQUNIRSIsIkxSVSIsIm1heCIsImFwa1NpZ25pbmdNZXRob2RzIiwiZXhlY3V0ZUFwa3NpZ25lciIsImFyZ3MiLCJhcGtTaWduZXJKYXIiLCJmdWxsQ21kIiwibG9nIiwiZGVidWciLCJ1dGlsIiwicXVvdGUiLCJzdGRvdXQiLCJzdGRlcnIiLCJzbGljZSIsImN3ZCIsImRpcm5hbWUiLCJuYW1lIiwic3RyZWFtIiwiXyIsInRyaW0iLCJzcGxpdCIsImZpbHRlciIsImxpbmUiLCJpbmNsdWRlcyIsImpvaW4iLCJzaWduV2l0aERlZmF1bHRDZXJ0IiwiYXBrIiwiZnMiLCJleGlzdHMiLCJFcnJvciIsImUiLCJtZXNzYWdlIiwic2lnbldpdGhDdXN0b21DZXJ0Iiwia2V5c3RvcmVQYXRoIiwia2V5QWxpYXMiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5UGFzc3dvcmQiLCJlcnIiLCJ3YXJuIiwiamFyc2lnbmVyIiwic3lzdGVtIiwiaXNXaW5kb3dzIiwic2lnbiIsImFwcFBhdGgiLCJlbmRzV2l0aCIsIkFQS1NfRVhURU5TSU9OIiwidXNlS2V5c3RvcmUiLCJ6aXBBbGlnbkFwayIsImluaXRaaXBBbGlnbiIsImJpbmFyaWVzIiwiemlwYWxpZ24iLCJhY2Nlc3MiLCJfZnMiLCJXX09LIiwiYWxpZ25lZEFwayIsInRlbXBEaXIiLCJwcmVmaXgiLCJzdWZmaXgiLCJtdiIsIm1rZGlycCIsInVubGluayIsImNoZWNrQXBrQ2VydCIsInBrZyIsIm9wdHMiLCJleHRuYW1lIiwiZXh0cmFjdEJhc2VBcGsiLCJoYXNoTWF0Y2hlcyIsImFwa3NpZ25lck91dHB1dCIsImV4cGVjdGVkSGFzaGVzIiwidmFsdWUiLCJ0b1BhaXJzIiwiUmVnRXhwIiwidGVzdCIsImJhc2VuYW1lIiwicmVxdWlyZURlZmF1bHRDZXJ0IiwiYXBwSGFzaCIsImhhc2giLCJoYXMiLCJvdXRwdXQiLCJleHBlY3RlZCIsImdldCIsImdldEtleXN0b3JlSGFzaCIsImhhc01hdGNoIiwiaW5mbyIsImlzU2lnbmVkIiwic2V0IiwiZXJyTXNnIiwia2V5dG9vbCIsInJlc3VsdCIsImhhc2hOYW1lIiwiaGFzaFJlIiwibWF0Y2giLCJleGVjIiwicmVwbGFjZSIsInRvTG93ZXJDYXNlIiwiaXNFbXB0eSIsIkpTT04iLCJzdHJpbmdpZnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0EsTUFBTUEsbUJBQW1CLEdBQUdDLGNBQUtDLE9BQUwsQ0FBYUMsZ0JBQWIsRUFBc0IsTUFBdEIsRUFBOEIsYUFBOUIsQ0FBNUI7O0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUdILGNBQUtDLE9BQUwsQ0FBYUMsZ0JBQWIsRUFBc0IsTUFBdEIsRUFBOEIsa0JBQTlCLENBQTVCOztBQUNBLE1BQU1FLG1CQUFtQixHQUFHLDhEQUE1QjtBQUNBLE1BQU1DLHFCQUFxQixHQUFHLGlCQUE5QjtBQUNBLE1BQU1DLElBQUksR0FBRyxNQUFiO0FBQ0EsTUFBTUMsTUFBTSxHQUFHLFFBQWY7QUFDQSxNQUFNQyxNQUFNLEdBQUcsUUFBZjtBQUNBLE1BQU1DLEdBQUcsR0FBRyxLQUFaO0FBQ0EsTUFBTUMsaUJBQWlCLEdBQUc7QUFDeEIsR0FBQ0gsTUFBRCxHQUFVO0FBRGMsQ0FBMUI7QUFHQSxNQUFNSSxxQkFBcUIsR0FBRyxrQ0FBOUI7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxJQUFJQyxpQkFBSixDQUFRO0FBQ2hDQyxFQUFB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LEdBQUcsSUFBSW5CLE1BQUosQ0FBWSxRQUFPa0IsUUFBUyxtQkFBNUIsRUFBZ0QsSUFBaEQsQ0FBZjtBQUNBLFlBQU1FLEtBQUssR0FBR0QsTUFBTSxDQUFDRSxJQUFQLENBQVlqRixNQUFaLENBQWQ7O0FBQ0EsVUFBSSxDQUFDZ0YsS0FBTCxFQUFZO0FBQ1Y7QUFDRDs7QUFDREgsTUFBQUEsTUFBTSxDQUFDQyxRQUFELENBQU4sR0FBbUJFLEtBQUssQ0FBQyxDQUFELENBQUwsQ0FBU0UsT0FBVCxDQUFpQixJQUFqQixFQUF1QixFQUF2QixFQUEyQkMsV0FBM0IsRUFBbkI7QUFDRDs7QUFDRCxRQUFJNUUsZ0JBQUU2RSxPQUFGLENBQVVQLE1BQVYsQ0FBSixFQUF1QjtBQUNyQmpGLHNCQUFJQyxLQUFKLENBQVVHLE1BQVY7O0FBQ0EsWUFBTSxJQUFJa0IsS0FBSixDQUFVLHFEQUFWLENBQU47QUFDRDs7QUFDRHRCLG9CQUFJQyxLQUFKLENBQVcsa0JBQWlCd0YsSUFBSSxDQUFDQyxTQUFMLENBQWVULE1BQWYsQ0FBdUIsRUFBbkQ7O0FBQ0EsV0FBT0EsTUFBUDtBQUNELEdBakJELENBaUJFLE9BQU8xRCxDQUFQLEVBQVU7QUFDVixVQUFNLElBQUlELEtBQUosQ0FBVywyQkFBMEIsS0FBS0ksWUFBYSxjQUE3QyxHQUNiLG1CQUFrQkgsQ0FBQyxDQUFDbEIsTUFBRixJQUFZa0IsQ0FBQyxDQUFDQyxPQUFRLEVBRHJDLENBQU47QUFFRDtBQUNGLENBbkNEOztlQXFDZTdCLGlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBfZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IHRlbXBEaXIsIHN5c3RlbSwgbWtkaXJwLCBmcywgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBMUlUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCB7XG4gIGdldEphdmFGb3JPcywgZ2V0QXBrc2lnbmVyRm9yT3MsIGdldEphdmFIb21lLFxuICByb290RGlyLCBBUEtTX0VYVEVOU0lPTiwgdW5zaWduQXBrLFxufSBmcm9tICcuLi9oZWxwZXJzLmpzJztcblxuY29uc3QgREVGQVVMVF9QUklWQVRFX0tFWSA9IHBhdGgucmVzb2x2ZShyb290RGlyLCAna2V5cycsICd0ZXN0a2V5LnBrOCcpO1xuY29uc3QgREVGQVVMVF9DRVJUSUZJQ0FURSA9IHBhdGgucmVzb2x2ZShyb290RGlyLCAna2V5cycsICd0ZXN0a2V5Lng1MDkucGVtJyk7XG5jb25zdCBCVU5ETEVUT09MX1RVVE9SSUFMID0gJ2h0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3N0dWRpby9jb21tYW5kLWxpbmUvYnVuZGxldG9vbCc7XG5jb25zdCBBUEtTSUdORVJfVkVSSUZZX0ZBSUwgPSAnRE9FUyBOT1QgVkVSSUZZJztcbmNvbnN0IFNIQTEgPSAnc2hhMSc7XG5jb25zdCBTSEEyNTYgPSAnc2hhMjU2JztcbmNvbnN0IFNIQTUxMiA9ICdzaGE1MTInO1xuY29uc3QgTUQ1ID0gJ21kNSc7XG5jb25zdCBERUZBVUxUX0NFUlRfSEFTSCA9IHtcbiAgW1NIQTI1Nl06ICdhNDBkYTgwYTU5ZDE3MGNhYTk1MGNmMTVjMThjNDU0ZDQ3YTM5YjI2OTg5ZDhiNjQwZWNkNzQ1YmE3MWJmNWRjJ1xufTtcbmNvbnN0IEpBVkFfUFJPUFNfSU5JVF9FUlJPUiA9ICdqYXZhLmxhbmcuRXJyb3I6IFByb3BlcnRpZXMgaW5pdCc7XG5jb25zdCBTSUdORURfQVBQU19DQUNIRSA9IG5ldyBMUlUoe1xuICBtYXg6IDMwLFxufSk7XG5cblxuY29uc3QgYXBrU2lnbmluZ01ldGhvZHMgPSB7fTtcblxuLyoqXG4gKiBFeGVjdXRlIGFwa3NpZ25lciB1dGlsaXR5IHdpdGggZ2l2ZW4gYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7P0FycmF5PFN0cmluZz59IGFyZ3MgLSBUaGUgbGlzdCBvZiB0b29sIGFyZ3VtZW50cy5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBDb21tYW5kIHN0ZG91dFxuICogQHRocm93cyB7RXJyb3J9IElmIGFwa3NpZ25lciBiaW5hcnkgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtXG4gKiAgICAgICAgICAgICAgICAgb3IgdGhlIHJldHVybiBjb2RlIGlzIG5vdCBlcXVhbCB0byB6ZXJvLlxuICovXG5hcGtTaWduaW5nTWV0aG9kcy5leGVjdXRlQXBrc2lnbmVyID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFwa3NpZ25lciAoYXJncyA9IFtdKSB7XG4gIGNvbnN0IGFwa1NpZ25lckphciA9IGF3YWl0IGdldEFwa3NpZ25lckZvck9zKHRoaXMpO1xuICBjb25zdCBmdWxsQ21kID0gW1xuICAgIGF3YWl0IGdldEphdmFGb3JPcygpLCAnLVhteDEwMjRNJywgJy1Yc3MxbScsXG4gICAgJy1qYXInLCBhcGtTaWduZXJKYXIsXG4gICAgLi4uYXJnc1xuICBdO1xuICBsb2cuZGVidWcoYFN0YXJ0aW5nIGFwa3NpZ25lcjogJHt1dGlsLnF1b3RlKGZ1bGxDbWQpfWApO1xuICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gc3BlY2lmeSBDV0QgZXhwbGljaXRseTsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNDcyNCNpc3N1ZWNvbW1lbnQtNzM3NDQ2NzE1XG4gIGNvbnN0IHtzdGRvdXQsIHN0ZGVycn0gPSBhd2FpdCBleGVjKGZ1bGxDbWRbMF0sIGZ1bGxDbWQuc2xpY2UoMSksIHtcbiAgICBjd2Q6IHBhdGguZGlybmFtZShhcGtTaWduZXJKYXIpXG4gIH0pO1xuICBmb3IgKGxldCBbbmFtZSwgc3RyZWFtXSBvZiBbWydzdGRvdXQnLCBzdGRvdXRdLCBbJ3N0ZGVycicsIHN0ZGVycl1dKSB7XG4gICAgaWYgKCFfLnRyaW0oc3RyZWFtKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgPT09ICdzdGRvdXQnKSB7XG4gICAgICAvLyBNYWtlIHRoZSBvdXRwdXQgbGVzcyB0YWxrYXRpdmVcbiAgICAgIHN0cmVhbSA9IHN0cmVhbS5zcGxpdCgnXFxuJylcbiAgICAgICAgLmZpbHRlcigobGluZSkgPT4gIWxpbmUuaW5jbHVkZXMoJ1dBUk5JTkc6JykpXG4gICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBhcGtzaWduZXIgJHtuYW1lfTogJHtzdHJlYW19YCk7XG4gIH1cbiAgcmV0dXJuIHN0ZG91dDtcbn07XG5cbi8qKlxuICogKFJlKXNpZ24gdGhlIGdpdmVuIGFwayBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSB3aXRoIHRoZSBkZWZhdWx0IGNlcnRpZmljYXRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGsgLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhbCBhcGsgZmlsZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBzaWduaW5nIGZhaWxzLlxuICovXG5hcGtTaWduaW5nTWV0aG9kcy5zaWduV2l0aERlZmF1bHRDZXJ0ID0gYXN5bmMgZnVuY3Rpb24gc2lnbldpdGhEZWZhdWx0Q2VydCAoYXBrKSB7XG4gIGxvZy5kZWJ1ZyhgU2lnbmluZyAnJHthcGt9JyB3aXRoIGRlZmF1bHQgY2VydGApO1xuICBpZiAoIShhd2FpdCBmcy5leGlzdHMoYXBrKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YXBrfSBmaWxlIGRvZXNuJ3QgZXhpc3QuYCk7XG4gIH1cblxuICBjb25zdCBhcmdzID0gW1xuICAgICdzaWduJyxcbiAgICAnLS1rZXknLCBERUZBVUxUX1BSSVZBVEVfS0VZLFxuICAgICctLWNlcnQnLCBERUZBVUxUX0NFUlRJRklDQVRFLFxuICAgIGFwayxcbiAgXTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVBcGtzaWduZXIoYXJncyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBzaWduICcke2Fwa30nIHdpdGggdGhlIGRlZmF1bHQgY2VydGlmaWNhdGUuIGAgK1xuICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Uuc3RkZXJyIHx8IGUuc3Rkb3V0IHx8IGUubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiAoUmUpc2lnbiB0aGUgZ2l2ZW4gYXBrIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIHdpdGggYSBjdXN0b20gY2VydGlmaWNhdGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwayAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIGxvY2FsIGFwayBmaWxlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHNpZ25pbmcgZmFpbHMuXG4gKi9cbmFwa1NpZ25pbmdNZXRob2RzLnNpZ25XaXRoQ3VzdG9tQ2VydCA9IGFzeW5jIGZ1bmN0aW9uIHNpZ25XaXRoQ3VzdG9tQ2VydCAoYXBrKSB7XG4gIGxvZy5kZWJ1ZyhgU2lnbmluZyAnJHthcGt9JyB3aXRoIGN1c3RvbSBjZXJ0YCk7XG4gIGlmICghKGF3YWl0IGZzLmV4aXN0cyh0aGlzLmtleXN0b3JlUGF0aCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBLZXlzdG9yZTogJHt0aGlzLmtleXN0b3JlUGF0aH0gZG9lc24ndCBleGlzdC5gKTtcbiAgfVxuICBpZiAoIShhd2FpdCBmcy5leGlzdHMoYXBrKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2Fwa30nIGRvZXNuJ3QgZXhpc3QuYCk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUFwa3NpZ25lcihbJ3NpZ24nLFxuICAgICAgJy0ta3MnLCB0aGlzLmtleXN0b3JlUGF0aCxcbiAgICAgICctLWtzLWtleS1hbGlhcycsIHRoaXMua2V5QWxpYXMsXG4gICAgICAnLS1rcy1wYXNzJywgYHBhc3M6JHt0aGlzLmtleXN0b3JlUGFzc3dvcmR9YCxcbiAgICAgICctLWtleS1wYXNzJywgYHBhc3M6JHt0aGlzLmtleVBhc3N3b3JkfWAsXG4gICAgICBhcGtdKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCB1c2UgYXBrc2lnbmVyIHRvb2wgZm9yIHNpZ25pbmcuIERlZmF1bHRpbmcgdG8gamFyc2lnbmVyLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIuc3RkZXJyIHx8IGVyci5zdGRvdXQgfHwgZXJyLm1lc3NhZ2V9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhd2FpdCB1bnNpZ25BcGsoYXBrKSkge1xuICAgICAgICBsb2cuZGVidWcoYCcke2Fwa30nIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1bnNpZ25lZGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmRlYnVnKGAnJHthcGt9JyBkb2VzIG5vdCBuZWVkIHRvIGJlIHVuc2lnbmVkYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBqYXJzaWduZXIgPSBwYXRoLnJlc29sdmUoYXdhaXQgZ2V0SmF2YUhvbWUoKSwgJ2JpbicsXG4gICAgICAgIGBqYXJzaWduZXIke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWApO1xuICAgICAgY29uc3QgZnVsbENtZCA9IFtqYXJzaWduZXIsXG4gICAgICAgICctc2lnYWxnJywgJ01ENXdpdGhSU0EnLFxuICAgICAgICAnLWRpZ2VzdGFsZycsICdTSEExJyxcbiAgICAgICAgJy1rZXlzdG9yZScsIHRoaXMua2V5c3RvcmVQYXRoLFxuICAgICAgICAnLXN0b3JlcGFzcycsIHRoaXMua2V5c3RvcmVQYXNzd29yZCxcbiAgICAgICAgJy1rZXlwYXNzJywgdGhpcy5rZXlQYXNzd29yZCxcbiAgICAgICAgYXBrLCB0aGlzLmtleUFsaWFzXTtcbiAgICAgIGxvZy5kZWJ1ZyhgU3RhcnRpbmcgamFyc2lnbmVyOiAke3V0aWwucXVvdGUoZnVsbENtZCl9YCk7XG4gICAgICBhd2FpdCBleGVjKGZ1bGxDbWRbMF0sIGZ1bGxDbWQuc2xpY2UoMSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHNpZ24gd2l0aCBjdXN0b20gY2VydGlmaWNhdGUuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiAoUmUpc2lnbiB0aGUgZ2l2ZW4gYXBrIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIHdpdGggZWl0aGVyXG4gKiBjdXN0b20gb3IgZGVmYXVsdCBjZXJ0aWZpY2F0ZSBiYXNlZCBvbiBfdGhpcy51c2VLZXlzdG9yZV8gcHJvcGVydHkgdmFsdWVcbiAqIGFuZCBaaXAtYWxpZ25zIGl0IGFmdGVyIHNpZ25pbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhbCAuYXBrKHMpIGZpbGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2lnbmluZyBmYWlscy5cbiAqL1xuYXBrU2lnbmluZ01ldGhvZHMuc2lnbiA9IGFzeW5jIGZ1bmN0aW9uIHNpZ24gKGFwcFBhdGgpIHtcbiAgaWYgKGFwcFBhdGguZW5kc1dpdGgoQVBLU19FWFRFTlNJT04pKSB7XG4gICAgbGV0IG1lc3NhZ2UgPSAnU2lnbmluZyBvZiAuYXBrcy1maWxlcyBpcyBub3Qgc3VwcG9ydGVkLiAnO1xuICAgIGlmICh0aGlzLnVzZUtleXN0b3JlKSB7XG4gICAgICBtZXNzYWdlICs9ICdDb25zaWRlciBtYW51YWwgYXBwbGljYXRpb24gYnVuZGxlIHNpZ25pbmcgd2l0aCB0aGUgY3VzdG9tIGtleXN0b3JlICcgK1xuICAgICAgICBgbGlrZSBpdCBpcyBkZXNjcmliZWQgYXQgJHtCVU5ETEVUT09MX1RVVE9SSUFMfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lc3NhZ2UgKz0gYENvbnNpZGVyIG1hbnVhbCBhcHBsaWNhdGlvbiBidW5kbGUgc2lnbmluZyB3aXRoIHRoZSBrZXkgYXQgJyR7REVGQVVMVF9QUklWQVRFX0tFWX0nIGAgK1xuICAgICAgICBgYW5kIHRoZSBjZXJ0aWZpY2F0ZSBhdCAnJHtERUZBVUxUX0NFUlRJRklDQVRFfScuIFJlYWQgJHtCVU5ETEVUT09MX1RVVE9SSUFMfSBmb3IgbW9yZSBkZXRhaWxzLmA7XG4gICAgfVxuICAgIGxvZy53YXJuKG1lc3NhZ2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGl0IGlzIG5lY2Vzc2FyeSB0byBhcHBseSB6aXBhbGlnbiBvbmx5IGJlZm9yZSBzaWduaW5nXG4gIC8vIGlmIGFwa3NpZ25lciBpcyB1c2VkXG4gIGF3YWl0IHRoaXMuemlwQWxpZ25BcGsoYXBwUGF0aCk7XG5cbiAgaWYgKHRoaXMudXNlS2V5c3RvcmUpIHtcbiAgICBhd2FpdCB0aGlzLnNpZ25XaXRoQ3VzdG9tQ2VydChhcHBQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCB0aGlzLnNpZ25XaXRoRGVmYXVsdENlcnQoYXBwUGF0aCk7XG4gIH1cbn07XG5cbi8qKlxuICogUGVyZm9ybSB6aXAtYWxpZ25pbmcgdG8gdGhlIGdpdmVuIGxvY2FsIGFwayBmaWxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGsgLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhbCBhcGsgZmlsZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBhcGsgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGFsaWduZWRcbiAqIG9yIGZhbHNlIGlmIHRoZSBhcGsgaGFzIGJlZW4gYWxyZWFkeSBhbGlnbmVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHppcC1hbGlnbiBmYWlscy5cbiAqL1xuYXBrU2lnbmluZ01ldGhvZHMuemlwQWxpZ25BcGsgPSBhc3luYyBmdW5jdGlvbiB6aXBBbGlnbkFwayAoYXBrKSB7XG4gIGF3YWl0IHRoaXMuaW5pdFppcEFsaWduKCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlYyh0aGlzLmJpbmFyaWVzLnppcGFsaWduLCBbJy1jJywgJzQnLCBhcGtdKTtcbiAgICBsb2cuZGVidWcoYCR7YXBrfScgaXMgYWxyZWFkeSB6aXAtYWxpZ25lZC4gRG9pbmcgbm90aGluZ2ApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1ZyhgJyR7YXBrfScgaXMgbm90IHppcC1hbGlnbmVkLiBBbGlnbmluZ2ApO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMuYWNjZXNzKGFwaywgX2ZzLldfT0spO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZmlsZSBhdCAnJHthcGt9JyBpcyBub3Qgd3JpdGVhYmxlLiBgICtcbiAgICAgIGBQbGVhc2UgZ3JhbnQgd3JpdGUgcGVybWlzc2lvbnMgdG8gdGhpcyBmaWxlIG9yIHRvIGl0cyBwYXJlbnQgZm9sZGVyICcke3BhdGguZGlybmFtZShhcGspfScgYCArXG4gICAgICBgZm9yIHRoZSBBcHBpdW0gcHJvY2Vzcywgc28gaXQgY2FuIHppcC1hbGlnbiB0aGUgZmlsZWApO1xuICB9XG4gIGNvbnN0IGFsaWduZWRBcGsgPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe3ByZWZpeDogJ2FwcGl1bScsIHN1ZmZpeDogJy50bXAnfSk7XG4gIGF3YWl0IG1rZGlycChwYXRoLmRpcm5hbWUoYWxpZ25lZEFwaykpO1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWModGhpcy5iaW5hcmllcy56aXBhbGlnbiwgWyctZicsICc0JywgYXBrLCBhbGlnbmVkQXBrXSk7XG4gICAgYXdhaXQgZnMubXYoYWxpZ25lZEFwaywgYXBrLCB7IG1rZGlycDogdHJ1ZSB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMoYWxpZ25lZEFwaykpIHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhhbGlnbmVkQXBrKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGB6aXBBbGlnbkFwayBmYWlsZWQuIE9yaWdpbmFsIGVycm9yOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDZXJ0Q2hlY2tPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcXVpcmVEZWZhdWx0Q2VydCBbdHJ1ZV0gV2hldGhlciB0byByZXF1aXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIEFQS1xuICogaXMgc2lnbmVkIHdpdGggdGhlIGRlZmF1bHQgQXBwaXVtIGNlcnRpZmljYXRlIG9yIGFueSB2YWxpZCBjZXJ0aWZpY2F0ZS4gVGhpcyBvcHRpb25cbiAqIG9ubHkgaGFzIGVmZmVjdCBpZiBgdXNlS2V5c3RvcmVgIHByb3BlcnR5IGlzIHVuc2V0LlxuICovXG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGFwcCBpcyBhbHJlYWR5IHNpZ25lZCB3aXRoIHRoZSBkZWZhdWx0IEFwcGl1bSBjZXJ0aWZpY2F0ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIGxvY2FsIC5hcGsocykgZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZ2sgLSBUaGUgbmFtZSBvZiBhcHBsaWNhdGlvbiBwYWNrYWdlLlxuICogQHBhcmFtIHtDZXJ0Q2hlY2tPcHRpb25zfSBvcHRzIC0gQ2VydGlmaWNhdGUgY2hlY2tpbmcgb3B0aW9uc1xuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBnaXZlbiBhcHBsaWNhdGlvbiBpcyBhbHJlYWR5IHNpZ25lZC5cbiAqL1xuYXBrU2lnbmluZ01ldGhvZHMuY2hlY2tBcGtDZXJ0ID0gYXN5bmMgZnVuY3Rpb24gY2hlY2tBcGtDZXJ0IChhcHBQYXRoLCBwa2csIG9wdHMgPSB7fSkge1xuICBsb2cuZGVidWcoYENoZWNraW5nIGFwcCBjZXJ0IGZvciAke2FwcFBhdGh9YCk7XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKGFwcFBhdGgpKSB7XG4gICAgbG9nLmRlYnVnKGAnJHthcHBQYXRofScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocGF0aC5leHRuYW1lKGFwcFBhdGgpID09PSBBUEtTX0VYVEVOU0lPTikge1xuICAgIGFwcFBhdGggPSBhd2FpdCB0aGlzLmV4dHJhY3RCYXNlQXBrKGFwcFBhdGgpO1xuICB9XG5cbiAgY29uc3QgaGFzaE1hdGNoZXMgPSAoYXBrc2lnbmVyT3V0cHV0LCBleHBlY3RlZEhhc2hlcykgPT4ge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBfLnRvUGFpcnMoZXhwZWN0ZWRIYXNoZXMpKSB7XG4gICAgICBpZiAobmV3IFJlZ0V4cChgZGlnZXN0OlxcXFxzKyR7dmFsdWV9XFxcXGJgLCAnaScpLnRlc3QoYXBrc2lnbmVyT3V0cHV0KSkge1xuICAgICAgICBsb2cuZGVidWcoYCR7bmFtZX0gaGFzaCBkaWQgbWF0Y2ggZm9yICcke3BhdGguYmFzZW5hbWUoYXBwUGF0aCl9J2ApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IHtcbiAgICByZXF1aXJlRGVmYXVsdENlcnQgPSB0cnVlLFxuICB9ID0gb3B0cztcblxuICBjb25zdCBhcHBIYXNoID0gYXdhaXQgZnMuaGFzaChhcHBQYXRoKTtcbiAgaWYgKFNJR05FRF9BUFBTX0NBQ0hFLmhhcyhhcHBIYXNoKSkge1xuICAgIGxvZy5kZWJ1ZyhgVXNpbmcgdGhlIHByZXZpb3VzbHkgY2FjaGVkIHNpZ25hdHVyZSBlbnRyeSBmb3IgJyR7cGF0aC5iYXNlbmFtZShhcHBQYXRoKX0nYCk7XG4gICAgY29uc3Qge2tleXN0b3JlUGF0aCwgb3V0cHV0LCBleHBlY3RlZH0gPSBTSUdORURfQVBQU19DQUNIRS5nZXQoYXBwSGFzaCk7XG4gICAgaWYgKHRoaXMudXNlS2V5c3RvcmUgJiYgdGhpcy5rZXlzdG9yZVBhdGggPT09IGtleXN0b3JlUGF0aCB8fCAhdGhpcy51c2VLZXlzdG9yZSkge1xuICAgICAgcmV0dXJuICghdGhpcy51c2VLZXlzdG9yZSAmJiAhcmVxdWlyZURlZmF1bHRDZXJ0KSB8fCBoYXNoTWF0Y2hlcyhvdXRwdXQsIGV4cGVjdGVkKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBleHBlY3RlZCA9IHRoaXMudXNlS2V5c3RvcmVcbiAgICA/IGF3YWl0IHRoaXMuZ2V0S2V5c3RvcmVIYXNoKGFwcFBhdGgsIHBrZylcbiAgICA6IERFRkFVTFRfQ0VSVF9IQVNIO1xuICB0cnkge1xuICAgIGF3YWl0IGdldEFwa3NpZ25lckZvck9zKHRoaXMpO1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUFwa3NpZ25lcihbJ3ZlcmlmeScsICctLXByaW50LWNlcnRzJywgYXBwUGF0aF0pO1xuICAgIGNvbnN0IGhhc01hdGNoID0gaGFzaE1hdGNoZXMob3V0cHV0LCBleHBlY3RlZCk7XG4gICAgaWYgKGhhc01hdGNoKSB7XG4gICAgICBsb2cuaW5mbyhgJyR7YXBwUGF0aH0nIGlzIHNpZ25lZCB3aXRoIHRoZSBgICtcbiAgICAgICAgYCR7dGhpcy51c2VLZXlzdG9yZSA/ICdrZXlzdG9yZScgOiAnZGVmYXVsdCd9IGNlcnRpZmljYXRlYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5pbmZvKGAnJHthcHBQYXRofScgaXMgc2lnbmVkIHdpdGggYSBgICtcbiAgICAgICAgYG5vbi0ke3RoaXMudXNlS2V5c3RvcmUgPyAna2V5c3RvcmUnIDogJ2RlZmF1bHQnfSBjZXJ0aWZpY2F0ZWApO1xuICAgIH1cbiAgICBjb25zdCBpc1NpZ25lZCA9ICghdGhpcy51c2VLZXlzdG9yZSAmJiAhcmVxdWlyZURlZmF1bHRDZXJ0KSB8fCBoYXNNYXRjaDtcbiAgICBpZiAoaXNTaWduZWQpIHtcbiAgICAgIFNJR05FRF9BUFBTX0NBQ0hFLnNldChhcHBIYXNoLCB7XG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgZXhwZWN0ZWQsXG4gICAgICAgIGtleXN0b3JlUGF0aDogdGhpcy5rZXlzdG9yZVBhdGgsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGlzU2lnbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyBzaWduYXR1cmVcbiAgICBpZiAoXy5pbmNsdWRlcyhlcnIuc3RkZXJyLCBBUEtTSUdORVJfVkVSSUZZX0ZBSUwpKSB7XG4gICAgICBsb2cuaW5mbyhgJyR7YXBwUGF0aH0nIGlzIG5vdCBzaWduZWRgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZXJyTXNnID0gZXJyLnN0ZGVyciB8fCBlcnIuc3Rkb3V0IHx8IGVyci5tZXNzYWdlO1xuICAgIGlmIChfLmluY2x1ZGVzKGVyck1zZywgSkFWQV9QUk9QU19JTklUX0VSUk9SKSkge1xuICAgICAgLy8gVGhpcyBlcnJvciBwb3BzIHVwIHJhbmRvbWx5IGFuZCB3ZSBhcmUgbm90IHF1aXRlIHN1cmUgd2h5LlxuICAgICAgLy8gTXkgZ3Vlc3MgLSBhIHJhY2UgY29uZGl0aW9uIGluIGphdmEgdm0gaW5pdGlhbGl6YXRpb24uXG4gICAgICAvLyBOZXZlcnRoZWxlc3MsIGxldHMgbWFrZSBBcHBpdW0gdG8gYmVsaWV2ZSB0aGUgZmlsZSBpcyBhbHJlYWR5IHNpZ25lZCxcbiAgICAgIC8vIGJlY2F1c2UgaXQgd291bGQgYmUgdHJ1ZSBmb3IgOTklIG9mIFVJQXV0b21hdG9yMi1iYXNlZFxuICAgICAgLy8gdGVzdHMsIHdoZXJlIHdlIHByZXNpZ24gc2VydmVyIGJpbmFyaWVzIHdoaWxlIHB1Ymxpc2hpbmcgdGhlaXIgTlBNIG1vZHVsZS5cbiAgICAgIC8vIElmIHRoZXNlIGFyZSBub3Qgc2lnbmVkLCBlLmcuIGluIGNhc2Ugb2YgRXNwcmVzc28sIHRoZW4gdGhlIG5leHQgc3RlcChzKVxuICAgICAgLy8gd291bGQgYW55d2F5IGZhaWwuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE0NzI0IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICBsb2cud2FybihlcnJNc2cpO1xuICAgICAgbG9nLndhcm4oYEFzc3VtaW5nICcke2FwcFBhdGh9JyBpcyBhbHJlYWR5IHNpZ25lZCBhbmQgY29udGludWluZyBhbnl3YXlgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBvZiAnJHthcHBQYXRofScuIGAgK1xuICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Vyck1zZ31gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBLZXlzdG9yZUhhc2hcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbWQ1IHRoZSBtZDUgaGFzaCB2YWx1ZSBvZiB0aGUga2V5c3RvcmVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gc2hhMSB0aGUgc2hhMSBoYXNoIHZhbHVlIG9mIHRoZSBrZXlzdG9yZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBzaGEyNTYgdGhlIHNoYTI1NiBoYXNoIHZhbHVlIG9mIHRoZSBrZXlzdG9yZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBzaGE1MTIgdGhlIHNoYTUxMiBoYXNoIHZhbHVlIG9mIHRoZSBrZXlzdG9yZVxuICovXG5cbi8qKlxuICogUmV0cmlldmUgdGhlIHRoZSBoYXNoIG9mIHRoZSBnaXZlbiBrZXlzdG9yZS5cbiAqXG4gKiBAcmV0dXJuIHtLZXlzdG9yZUhhc2h9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgZ2V0dGluZyBrZXlzdG9yZSBoYXNoIGZhaWxzLlxuICovXG5hcGtTaWduaW5nTWV0aG9kcy5nZXRLZXlzdG9yZUhhc2ggPSBhc3luYyBmdW5jdGlvbiBnZXRLZXlzdG9yZUhhc2ggKCkge1xuICBsb2cuZGVidWcoYEdldHRpbmcgaGFzaCBvZiB0aGUgJyR7dGhpcy5rZXlzdG9yZVBhdGh9JyBrZXlzdG9yZWApO1xuICBjb25zdCBrZXl0b29sID0gcGF0aC5yZXNvbHZlKGF3YWl0IGdldEphdmFIb21lKCksICdiaW4nLFxuICAgIGBrZXl0b29sJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMoa2V5dG9vbCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBrZXl0b29sIHV0aWxpdHkgY2Fubm90IGJlIGZvdW5kIGF0ICcke2tleXRvb2x9J2ApO1xuICB9XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJy12JywgJy1saXN0JyxcbiAgICAnLWFsaWFzJywgdGhpcy5rZXlBbGlhcyxcbiAgICAnLWtleXN0b3JlJywgdGhpcy5rZXlzdG9yZVBhdGgsXG4gICAgJy1zdG9yZXBhc3MnLCB0aGlzLmtleXN0b3JlUGFzc3dvcmRcbiAgXTtcbiAgbG9nLmluZm8oYFJ1bm5pbmcgJyR7a2V5dG9vbH0nIHdpdGggYXJndW1lbnRzOiAke3V0aWwucXVvdGUoYXJncyl9YCk7XG4gIHRyeSB7XG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKGtleXRvb2wsIGFyZ3MpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgaGFzaE5hbWUgb2YgW1NIQTUxMiwgU0hBMjU2LCBTSEExLCBNRDVdKSB7XG4gICAgICBjb25zdCBoYXNoUmUgPSBuZXcgUmVnRXhwKGBeXFxcXHMqJHtoYXNoTmFtZX06XFxcXHMqKFthLWYwLTk6XSspYCwgJ21pJyk7XG4gICAgICBjb25zdCBtYXRjaCA9IGhhc2hSZS5leGVjKHN0ZG91dCk7XG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0W2hhc2hOYW1lXSA9IG1hdGNoWzFdLnJlcGxhY2UoLzovZywgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmIChfLmlzRW1wdHkocmVzdWx0KSkge1xuICAgICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBwYXJzZSB0aGUgaGFzaCB2YWx1ZSBmcm9tIHRoZSBrZXl0b29sIG91dHB1dCcpO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYEtleXN0b3JlIGhhc2g6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZ2V0IHRoZSBoYXNoIG9mICcke3RoaXMua2V5c3RvcmVQYXRofScga2V5c3RvcmUuIGAgK1xuICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgYXBrU2lnbmluZ01ldGhvZHM7XG4iXSwiZmlsZSI6ImxpYi90b29scy9hcGstc2lnbmluZy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
333
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hcGstc2lnbmluZy5qcyJdLCJuYW1lcyI6WyJERUZBVUxUX1BSSVZBVEVfS0VZIiwicGF0aCIsInJlc29sdmUiLCJyb290RGlyIiwiREVGQVVMVF9DRVJUSUZJQ0FURSIsIkJVTkRMRVRPT0xfVFVUT1JJQUwiLCJBUEtTSUdORVJfVkVSSUZZX0ZBSUwiLCJTSEExIiwiU0hBMjU2IiwiU0hBNTEyIiwiTUQ1IiwiREVGQVVMVF9DRVJUX0hBU0giLCJKQVZBX1BST1BTX0lOSVRfRVJST1IiLCJTSUdORURfQVBQU19DQUNIRSIsIkxSVSIsIm1heCIsImFwa1NpZ25pbmdNZXRob2RzIiwiZXhlY3V0ZUFwa3NpZ25lciIsImFyZ3MiLCJhcGtTaWduZXJKYXIiLCJmdWxsQ21kIiwibG9nIiwiZGVidWciLCJ1dGlsIiwicXVvdGUiLCJzdGRvdXQiLCJzdGRlcnIiLCJzbGljZSIsImN3ZCIsImRpcm5hbWUiLCJ3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJuYW1lIiwic3RyZWFtIiwiXyIsInRyaW0iLCJzcGxpdCIsImZpbHRlciIsImxpbmUiLCJpbmNsdWRlcyIsImpvaW4iLCJzaWduV2l0aERlZmF1bHRDZXJ0IiwiYXBrIiwiZnMiLCJleGlzdHMiLCJFcnJvciIsImUiLCJtZXNzYWdlIiwic2lnbldpdGhDdXN0b21DZXJ0Iiwia2V5c3RvcmVQYXRoIiwia2V5QWxpYXMiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5UGFzc3dvcmQiLCJlcnIiLCJ3YXJuIiwiamFyc2lnbmVyIiwic2lnbiIsImFwcFBhdGgiLCJlbmRzV2l0aCIsIkFQS1NfRVhURU5TSU9OIiwidXNlS2V5c3RvcmUiLCJ6aXBBbGlnbkFwayIsImluaXRaaXBBbGlnbiIsImJpbmFyaWVzIiwiemlwYWxpZ24iLCJhY2Nlc3MiLCJfZnMiLCJXX09LIiwiYWxpZ25lZEFwayIsInRlbXBEaXIiLCJwcmVmaXgiLCJzdWZmaXgiLCJtdiIsIm1rZGlycCIsInVubGluayIsImNoZWNrQXBrQ2VydCIsInBrZyIsIm9wdHMiLCJleHRuYW1lIiwiZXh0cmFjdEJhc2VBcGsiLCJoYXNoTWF0Y2hlcyIsImFwa3NpZ25lck91dHB1dCIsImV4cGVjdGVkSGFzaGVzIiwidmFsdWUiLCJ0b1BhaXJzIiwiUmVnRXhwIiwidGVzdCIsImJhc2VuYW1lIiwicmVxdWlyZURlZmF1bHRDZXJ0IiwiYXBwSGFzaCIsImhhc2giLCJoYXMiLCJvdXRwdXQiLCJleHBlY3RlZCIsImdldCIsImdldEtleXN0b3JlSGFzaCIsImhhc01hdGNoIiwiaW5mbyIsImlzU2lnbmVkIiwic2V0IiwiZXJyTXNnIiwia2V5dG9vbCIsInJlc3VsdCIsImhhc2hOYW1lIiwiaGFzaFJlIiwibWF0Y2giLCJleGVjIiwicmVwbGFjZSIsInRvTG93ZXJDYXNlIiwiaXNFbXB0eSIsIkpTT04iLCJzdHJpbmdpZnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0EsTUFBTUEsbUJBQW1CLEdBQUdDLGNBQUtDLE9BQUwsQ0FBYUMsZ0JBQWIsRUFBc0IsTUFBdEIsRUFBOEIsYUFBOUIsQ0FBNUI7O0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUdILGNBQUtDLE9BQUwsQ0FBYUMsZ0JBQWIsRUFBc0IsTUFBdEIsRUFBOEIsa0JBQTlCLENBQTVCOztBQUNBLE1BQU1FLG1CQUFtQixHQUFHLDhEQUE1QjtBQUNBLE1BQU1DLHFCQUFxQixHQUFHLGlCQUE5QjtBQUNBLE1BQU1DLElBQUksR0FBRyxNQUFiO0FBQ0EsTUFBTUMsTUFBTSxHQUFHLFFBQWY7QUFDQSxNQUFNQyxNQUFNLEdBQUcsUUFBZjtBQUNBLE1BQU1DLEdBQUcsR0FBRyxLQUFaO0FBQ0EsTUFBTUMsaUJBQWlCLEdBQUc7QUFDeEIsR0FBQ0gsTUFBRCxHQUFVO0FBRGMsQ0FBMUI7QUFHQSxNQUFNSSxxQkFBcUIsR0FBRyxrQ0FBOUI7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxJ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Z0JBQU9DLFNBQVA7QUFBNUIsS0FBcEIsQ0FBdkI7QUFDQSxVQUFNdUUsTUFBTSxHQUFHLEVBQWY7O0FBQ0EsU0FBSyxNQUFNQyxRQUFYLElBQXVCLENBQUMvRixNQUFELEVBQVNELE1BQVQsRUFBaUJELElBQWpCLEVBQXVCRyxHQUF2QixDQUF2QixFQUFvRDtBQUNsRCxZQUFNK0YsTUFBTSxHQUFHLElBQUluQixNQUFKLENBQVksUUFBT2tCLFFBQVMsbUJBQTVCLEVBQWdELElBQWhELENBQWY7QUFDQSxZQUFNRSxLQUFLLEdBQUdELE1BQU0sQ0FBQ0UsSUFBUCxDQUFZbEYsTUFBWixDQUFkOztBQUNBLFVBQUksQ0FBQ2lGLEtBQUwsRUFBWTtBQUNWO0FBQ0Q7O0FBQ0RILE1BQUFBLE1BQU0sQ0FBQ0MsUUFBRCxDQUFOLEdBQW1CRSxLQUFLLENBQUMsQ0FBRCxDQUFMLENBQVNFLE9BQVQsQ0FBaUIsSUFBakIsRUFBdUIsRUFBdkIsRUFBMkJDLFdBQTNCLEVBQW5CO0FBQ0Q7O0FBQ0QsUUFBSTFFLGdCQUFFMkUsT0FBRixDQUFVUCxNQUFWLENBQUosRUFBdUI7QUFDckJsRixzQkFBSUMsS0FBSixDQUFVRyxNQUFWOztBQUNBLFlBQU0sSUFBSXFCLEtBQUosQ0FBVSxxREFBVixDQUFOO0FBQ0Q7O0FBQ0R6QixvQkFBSUMsS0FBSixDQUFXLGtCQUFpQnlGLElBQUksQ0FBQ0MsU0FBTCxDQUFlVCxNQUFmLENBQXVCLEVBQW5EOztBQUNBLFdBQU9BLE1BQVA7QUFDRCxHQWpCRCxDQWlCRSxPQUFPeEQsQ0FBUCxFQUFVO0FBQ1YsVUFBTSxJQUFJRCxLQUFKLENBQVcsMkJBQTBCLEtBQUtJLFlBQWEsY0FBN0MsR0FDYixtQkFBa0JILENBQUMsQ0FBQ3JCLE1BQUYsSUFBWXFCLENBQUMsQ0FBQ0MsT0FBUSxFQURyQyxDQUFOO0FBRUQ7QUFDRixDQW5DRDs7ZUFxQ2VoQyxpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgX2ZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyB0ZW1wRGlyLCBzeXN0ZW0sIG1rZGlycCwgZnMsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IHtcbiAgZ2V0SmF2YUZvck9zLCBnZXRBcGtzaWduZXJGb3JPcywgZ2V0SmF2YUhvbWUsXG4gIHJvb3REaXIsIEFQS1NfRVhURU5TSU9OLCB1bnNpZ25BcGssXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuXG5jb25zdCBERUZBVUxUX1BSSVZBVEVfS0VZID0gcGF0aC5yZXNvbHZlKHJvb3REaXIsICdrZXlzJywgJ3Rlc3RrZXkucGs4Jyk7XG5jb25zdCBERUZBVUxUX0NFUlRJRklDQVRFID0gcGF0aC5yZXNvbHZlKHJvb3REaXIsICdrZXlzJywgJ3Rlc3RrZXkueDUwOS5wZW0nKTtcbmNvbnN0IEJVTkRMRVRPT0xfVFVUT1JJQUwgPSAnaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc3R1ZGlvL2NvbW1hbmQtbGluZS9idW5kbGV0b29sJztcbmNvbnN0IEFQS1NJR05FUl9WRVJJRllfRkFJTCA9ICdET0VTIE5PVCBWRVJJRlknO1xuY29uc3QgU0hBMSA9ICdzaGExJztcbmNvbnN0IFNIQTI1NiA9ICdzaGEyNTYnO1xuY29uc3QgU0hBNTEyID0gJ3NoYTUxMic7XG5jb25zdCBNRDUgPSAnbWQ1JztcbmNvbnN0IERFRkFVTFRfQ0VSVF9IQVNIID0ge1xuICBbU0hBMjU2XTogJ2E0MGRhODBhNTlkMTcwY2FhOTUwY2YxNWMxOGM0NTRkNDdhMzliMjY5ODlkOGI2NDBlY2Q3NDViYTcxYmY1ZGMnXG59O1xuY29uc3QgSkFWQV9QUk9QU19JTklUX0VSUk9SID0gJ2phdmEubGFuZy5FcnJvcjogUHJvcGVydGllcyBpbml0JztcbmNvbnN0IFNJR05FRF9BUFBTX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogMzAsXG59KTtcblxuXG5jb25zdCBhcGtTaWduaW5nTWV0aG9kcyA9IHt9O1xuXG4vKipcbiAqIEV4ZWN1dGUgYXBrc2lnbmVyIHV0aWxpdHkgd2l0aCBnaXZlbiBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHs/QXJyYXk8U3RyaW5nPn0gYXJncyAtIFRoZSBsaXN0IG9mIHRvb2wgYXJndW1lbnRzLlxuICogQHJldHVybiB7c3RyaW5nfSAtIENvbW1hbmQgc3Rkb3V0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYXBrc2lnbmVyIGJpbmFyeSBpcyBub3QgcHJlc2VudCBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW1cbiAqICAgICAgICAgICAgICAgICBvciB0aGUgcmV0dXJuIGNvZGUgaXMgbm90IGVxdWFsIHRvIHplcm8uXG4gKi9cbmFwa1NpZ25pbmdNZXRob2RzLmV4ZWN1dGVBcGtzaWduZXIgPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlQXBrc2lnbmVyIChhcmdzID0gW10pIHtcbiAgY29uc3QgYXBrU2lnbmVySmFyID0gYXdhaXQgZ2V0QXBrc2lnbmVyRm9yT3ModGhpcyk7XG4gIGNvbnN0IGZ1bGxDbWQgPSBbXG4gICAgYXdhaXQgZ2V0SmF2YUZvck9zKCksICctWG14MTAyNE0nLCAnLVhzczFtJyxcbiAgICAnLWphcicsIGFwa1NpZ25lckphcixcbiAgICAuLi5hcmdzXG4gIF07XG4gIGxvZy5kZWJ1ZyhgU3RhcnRpbmcgYXBrc2lnbmVyOiAke3V0aWwucXVvdGUoZnVsbENtZCl9YCk7XG4gIC8vIEl0IGlzIG5lY2Vzc2FyeSB0byBzcGVjaWZ5IENXRCBleHBsaWNpdGx5OyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE0NzI0I2lzc3VlY29tbWVudC03Mzc0NDY3MTVcbiAgY29uc3Qge3N0ZG91dCwgc3RkZXJyfSA9IGF3YWl0IGV4ZWMoZnVsbENtZFswXSwgZnVsbENtZC5zbGljZSgxKSwge1xuICAgIGN3ZDogcGF0aC5kaXJuYW1lKGFwa1NpZ25lckphciksIHdpbmRvd3NWZXJiYXRpbUFyZ3VtZW50czogc3lzdGVtLmlzV2luZG93cygpXG4gIH0pO1xuICBmb3IgKGxldCBbbmFtZSwgc3RyZWFtXSBvZiBbWydzdGRvdXQnLCBzdGRvdXRdLCBbJ3N0ZGVycicsIHN0ZGVycl1dKSB7XG4gICAgaWYgKCFfLnRyaW0oc3RyZWFtKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgPT09ICdzdGRvdXQnKSB7XG4gICAgICAvLyBNYWtlIHRoZSBvdXRwdXQgbGVzcyB0YWxrYXRpdmVcbiAgICAgIHN0cmVhbSA9IHN0cmVhbS5zcGxpdCgnXFxuJylcbiAgICAgICAgLmZpbHRlcigobGluZSkgPT4gIWxpbmUuaW5jbHVkZXMoJ1dBUk5JTkc6JykpXG4gICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBhcGtzaWduZXIgJHtuYW1lfTogJHtzdHJlYW19YCk7XG4gIH1cbiAgcmV0dXJuIHN0ZG91dDtcbn07XG5cbi8qKlxuICogKFJlKXNpZ24gdGhlIGdpdmVuIGFwayBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSB3aXRoIHRoZSBkZWZhdWx0IGNlcnRpZmljYXRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGsgLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhbCBhcGsgZmlsZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBzaWduaW5nIGZhaWxzLlxuICovXG5hcGtTaWduaW5nTWV0aG9kcy5zaWduV2l0aERlZmF1bHRDZXJ0ID0gYXN5bmMgZnVuY3Rpb24gc2lnbldpdGhEZWZhdWx0Q2VydCAoYXBrKSB7XG4gIGxvZy5kZWJ1ZyhgU2lnbmluZyAnJHthcGt9JyB3aXRoIGRlZmF1bHQgY2VydGApO1xuICBpZiAoIShhd2FpdCBmcy5leGlzdHMoYXBrKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YXBrfSBmaWxlIGRvZXNuJ3QgZXhpc3QuYCk7XG4gIH1cblxuICBjb25zdCBhcmdzID0gW1xuICAgICdzaWduJyxcbiAgICAnLS1rZXknLCBERUZBVUxUX1BSSVZBVEVfS0VZLFxuICAgICctLWNlcnQnLCBERUZBVUxUX0NFUlRJRklDQVRFLFxuICAgIGFwayxcbiAgXTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVBcGtzaWduZXIoYXJncyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBzaWduICcke2Fwa30nIHdpdGggdGhlIGRlZmF1bHQgY2VydGlmaWNhdGUuIGAgK1xuICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Uuc3RkZXJyIHx8IGUuc3Rkb3V0IHx8IGUubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiAoUmUpc2lnbiB0aGUgZ2l2ZW4gYXBrIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIHdpdGggYSBjdXN0b20gY2VydGlmaWNhdGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwayAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIGxvY2FsIGFwayBmaWxlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHNpZ25pbmcgZmFpbHMuXG4gKi9cbmFwa1NpZ25pbmdNZXRob2RzLnNpZ25XaXRoQ3VzdG9tQ2VydCA9IGFzeW5jIGZ1bmN0aW9uIHNpZ25XaXRoQ3VzdG9tQ2VydCAoYXBrKSB7XG4gIGxvZy5kZWJ1ZyhgU2lnbmluZyAnJHthcGt9JyB3aXRoIGN1c3RvbSBjZXJ0YCk7XG4gIGlmICghKGF3YWl0IGZzLmV4aXN0cyh0aGlzLmtleXN0b3JlUGF0aCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBLZXlzdG9yZTogJHt0aGlzLmtleXN0b3JlUGF0aH0gZG9lc24ndCBleGlzdC5gKTtcbiAgfVxuICBpZiAoIShhd2FpdCBmcy5leGlzdHMoYXBrKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2Fwa30nIGRvZXNuJ3QgZXhpc3QuYCk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUFwa3NpZ25lcihbJ3NpZ24nLFxuICAgICAgJy0ta3MnLCB0aGlzLmtleXN0b3JlUGF0aCxcbiAgICAgICctLWtzLWtleS1hbGlhcycsIHRoaXMua2V5QWxpYXMsXG4gICAgICAnLS1rcy1wYXNzJywgYHBhc3M6JHt0aGlzLmtleXN0b3JlUGFzc3dvcmR9YCxcbiAgICAgICctLWtleS1wYXNzJywgYHBhc3M6JHt0aGlzLmtleVBhc3N3b3JkfWAsXG4gICAgICBhcGtdKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCB1c2UgYXBrc2lnbmVyIHRvb2wgZm9yIHNpZ25pbmcuIERlZmF1bHRpbmcgdG8gamFyc2lnbmVyLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIuc3RkZXJyIHx8IGVyci5zdGRvdXQgfHwgZXJyLm1lc3NhZ2V9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhd2FpdCB1bnNpZ25BcGsoYXBrKSkge1xuICAgICAgICBsb2cuZGVidWcoYCcke2Fwa30nIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1bnNpZ25lZGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmRlYnVnKGAnJHthcGt9JyBkb2VzIG5vdCBuZWVkIHRvIGJlIHVuc2lnbmVkYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBqYXJzaWduZXIgPSBwYXRoLnJlc29sdmUoYXdhaXQgZ2V0SmF2YUhvbWUoKSwgJ2JpbicsXG4gICAgICAgIGBqYXJzaWduZXIke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWApO1xuICAgICAgY29uc3QgZnVsbENtZCA9IFtqYXJzaWduZXIsXG4gICAgICAgICctc2lnYWxnJywgJ01ENXdpdGhSU0EnLFxuICAgICAgICAnLWRpZ2VzdGFsZycsICdTSEExJyxcbiAgICAgICAgJy1rZXlzdG9yZScsIHRoaXMua2V5c3RvcmVQYXRoLFxuICAgICAgICAnLXN0b3JlcGFzcycsIHRoaXMua2V5c3RvcmVQYXNzd29yZCxcbiAgICAgICAgJy1rZXlwYXNzJywgdGhpcy5rZXlQYXNzd29yZCxcbiAgICAgICAgYXBrLCB0aGlzLmtleUFsaWFzXTtcbiAgICAgIGxvZy5kZWJ1ZyhgU3RhcnRpbmcgamFyc2lnbmVyOiAke3V0aWwucXVvdGUoZnVsbENtZCl9YCk7XG4gICAgICBhd2FpdCBleGVjKGZ1bGxDbWRbMF0sIGZ1bGxDbWQuc2xpY2UoMSksIHsgd2luZG93c1ZlcmJhdGltQXJndW1lbnRzOiBzeXN0ZW0uaXNXaW5kb3dzKCkgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3Qgc2lnbiB3aXRoIGN1c3RvbSBjZXJ0aWZpY2F0ZS4gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLnN0ZGVyciB8fCBlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIChSZSlzaWduIHRoZSBnaXZlbiBhcGsgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gd2l0aCBlaXRoZXJcbiAqIGN1c3RvbSBvciBkZWZhdWx0IGNlcnRpZmljYXRlIGJhc2VkIG9uIF90aGlzLnVzZUtleXN0b3JlXyBwcm9wZXJ0eSB2YWx1ZVxuICogYW5kIFppcC1hbGlnbnMgaXQgYWZ0ZXIgc2lnbmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIGxvY2FsIC5hcGsocykgZmlsZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBzaWduaW5nIGZhaWxzLlxuICovXG5hcGtTaWduaW5nTWV0aG9kcy5zaWduID0gYXN5bmMgZnVuY3Rpb24gc2lnbiAoYXBwUGF0aCkge1xuICBpZiAoYXBwUGF0aC5lbmRzV2l0aChBUEtTX0VYVEVOU0lPTikpIHtcbiAgICBsZXQgbWVzc2FnZSA9ICdTaWduaW5nIG9mIC5hcGtzLWZpbGVzIGlzIG5vdCBzdXBwb3J0ZWQuICc7XG4gICAgaWYgKHRoaXMudXNlS2V5c3RvcmUpIHtcbiAgICAgIG1lc3NhZ2UgKz0gJ0NvbnNpZGVyIG1hbnVhbCBhcHBsaWNhdGlvbiBidW5kbGUgc2lnbmluZyB3aXRoIHRoZSBjdXN0b20ga2V5c3RvcmUgJyArXG4gICAgICAgIGBsaWtlIGl0IGlzIGRlc2NyaWJlZCBhdCAke0JVTkRMRVRPT0xfVFVUT1JJQUx9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVzc2FnZSArPSBgQ29uc2lkZXIgbWFudWFsIGFwcGxpY2F0aW9uIGJ1bmRsZSBzaWduaW5nIHdpdGggdGhlIGtleSBhdCAnJHtERUZBVUxUX1BSSVZBVEVfS0VZfScgYCArXG4gICAgICAgIGBhbmQgdGhlIGNlcnRpZmljYXRlIGF0ICcke0RFRkFVTFRfQ0VSVElGSUNBVEV9Jy4gUmVhZCAke0JVTkRMRVRPT0xfVFVUT1JJQUx9IGZvciBtb3JlIGRldGFpbHMuYDtcbiAgICB9XG4gICAgbG9nLndhcm4obWVzc2FnZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gaXQgaXMgbmVjZXNzYXJ5IHRvIGFwcGx5IHppcGFsaWduIG9ubHkgYmVmb3JlIHNpZ25pbmdcbiAgLy8gaWYgYXBrc2lnbmVyIGlzIHVzZWRcbiAgYXdhaXQgdGhpcy56aXBBbGlnbkFwayhhcHBQYXRoKTtcblxuICBpZiAodGhpcy51c2VLZXlzdG9yZSkge1xuICAgIGF3YWl0IHRoaXMuc2lnbldpdGhDdXN0b21DZXJ0KGFwcFBhdGgpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuc2lnbldpdGhEZWZhdWx0Q2VydChhcHBQYXRoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBQZXJmb3JtIHppcC1hbGlnbmluZyB0byB0aGUgZ2l2ZW4gbG9jYWwgYXBrIGZpbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwayAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIGxvY2FsIGFwayBmaWxlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGFwayBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgYWxpZ25lZFxuICogb3IgZmFsc2UgaWYgdGhlIGFwayBoYXMgYmVlbiBhbHJlYWR5IGFsaWduZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgemlwLWFsaWduIGZhaWxzLlxuICovXG5hcGtTaWduaW5nTWV0aG9kcy56aXBBbGlnbkFwayA9IGFzeW5jIGZ1bmN0aW9uIHppcEFsaWduQXBrIChhcGspIHtcbiAgYXdhaXQgdGhpcy5pbml0WmlwQWxpZ24oKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjKHRoaXMuYmluYXJpZXMuemlwYWxpZ24sIFsnLWMnLCAnNCcsIGFwa10pO1xuICAgIGxvZy5kZWJ1ZyhgJHthcGt9JyBpcyBhbHJlYWR5IHppcC1hbGlnbmVkLiBEb2luZyBub3RoaW5nYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmRlYnVnKGAnJHthcGt9JyBpcyBub3QgemlwLWFsaWduZWQuIEFsaWduaW5nYCk7XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5hY2Nlc3MoYXBrLCBfZnMuV19PSyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBmaWxlIGF0ICcke2Fwa30nIGlzIG5vdCB3cml0ZWFibGUuIGAgK1xuICAgICAgYFBsZWFzZSBncmFudCB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGlzIGZpbGUgb3IgdG8gaXRzIHBhcmVudCBmb2xkZXIgJyR7cGF0aC5kaXJuYW1lKGFwayl9JyBgICtcbiAgICAgIGBmb3IgdGhlIEFwcGl1bSBwcm9jZXNzLCBzbyBpdCBjYW4gemlwLWFsaWduIHRoZSBmaWxlYCk7XG4gIH1cbiAgY29uc3QgYWxpZ25lZEFwayA9IGF3YWl0IHRlbXBEaXIucGF0aCh7cHJlZml4OiAnYXBwaXVtJywgc3VmZml4OiAnLnRtcCd9KTtcbiAgYXdhaXQgbWtkaXJwKHBhdGguZGlybmFtZShhbGlnbmVkQXBrKSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlYyh0aGlzLmJpbmFyaWVzLnppcGFsaWduLCBbJy1mJywgJzQnLCBhcGssIGFsaWduZWRBcGtdKTtcbiAgICBhd2FpdCBmcy5tdihhbGlnbmVkQXBrLCBhcGssIHsgbWtkaXJwOiB0cnVlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhbGlnbmVkQXBrKSkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGFsaWduZWRBcGspO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHppcEFsaWduQXBrIGZhaWxlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENlcnRDaGVja09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVxdWlyZURlZmF1bHRDZXJ0IFt0cnVlXSBXaGV0aGVyIHRvIHJlcXVpcmUgdGhhdCB0aGUgZGVzdGluYXRpb24gQVBLXG4gKiBpcyBzaWduZWQgd2l0aCB0aGUgZGVmYXVsdCBBcHBpdW0gY2VydGlmaWNhdGUgb3IgYW55IHZhbGlkIGNlcnRpZmljYXRlLiBUaGlzIG9wdGlvblxuICogb25seSBoYXMgZWZmZWN0IGlmIGB1c2VLZXlzdG9yZWAgcHJvcGVydHkgaXMgdW5zZXQuXG4gKi9cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgYXBwIGlzIGFscmVhZHkgc2lnbmVkIHdpdGggdGhlIGRlZmF1bHQgQXBwaXVtIGNlcnRpZmljYXRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgbG9jYWwgLmFwayhzKSBmaWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBnayAtIFRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uIHBhY2thZ2UuXG4gKiBAcGFyYW0ge0NlcnRDaGVja09wdGlvbnN9IG9wdHMgLSBDZXJ0aWZpY2F0ZSBjaGVja2luZyBvcHRpb25zXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGdpdmVuIGFwcGxpY2F0aW9uIGlzIGFscmVhZHkgc2lnbmVkLlxuICovXG5hcGtTaWduaW5nTWV0aG9kcy5jaGVja0Fwa0NlcnQgPSBhc3luYyBmdW5jdGlvbiBjaGVja0Fwa0NlcnQgKGFwcFBhdGgsIHBrZywgb3B0cyA9IHt9KSB7XG4gIGxvZy5kZWJ1ZyhgQ2hlY2tpbmcgYXBwIGNlcnQgZm9yICR7YXBwUGF0aH1gKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMoYXBwUGF0aCkpIHtcbiAgICBsb2cuZGVidWcoYCcke2FwcFBhdGh9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChwYXRoLmV4dG5hbWUoYXBwUGF0aCkgPT09IEFQS1NfRVhURU5TSU9OKSB7XG4gICAgYXBwUGF0aCA9IGF3YWl0IHRoaXMuZXh0cmFjdEJhc2VBcGsoYXBwUGF0aCk7XG4gIH1cblxuICBjb25zdCBoYXNoTWF0Y2hlcyA9IChhcGtzaWduZXJPdXRwdXQsIGV4cGVjdGVkSGFzaGVzKSA9PiB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIF8udG9QYWlycyhleHBlY3RlZEhhc2hlcykpIHtcbiAgICAgIGlmIChuZXcgUmVnRXhwKGBkaWdlc3Q6XFxcXHMrJHt2YWx1ZX1cXFxcYmAsICdpJykudGVzdChhcGtzaWduZXJPdXRwdXQpKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgJHtuYW1lfSBoYXNoIGRpZCBtYXRjaCBmb3IgJyR7cGF0aC5iYXNlbmFtZShhcHBQYXRoKX0nYCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgY29uc3Qge1xuICAgIHJlcXVpcmVEZWZhdWx0Q2VydCA9IHRydWUsXG4gIH0gPSBvcHRzO1xuXG4gIGNvbnN0IGFwcEhhc2ggPSBhd2FpdCBmcy5oYXNoKGFwcFBhdGgpO1xuICBpZiAoU0lHTkVEX0FQUFNfQ0FDSEUuaGFzKGFwcEhhc2gpKSB7XG4gICAgbG9nLmRlYnVnKGBVc2luZyB0aGUgcHJldmlvdXNseSBjYWNoZWQgc2lnbmF0dXJlIGVudHJ5IGZvciAnJHtwYXRoLmJhc2VuYW1lKGFwcFBhdGgpfSdgKTtcbiAgICBjb25zdCB7a2V5c3RvcmVQYXRoLCBvdXRwdXQsIGV4cGVjdGVkfSA9IFNJR05FRF9BUFBTX0NBQ0hFLmdldChhcHBIYXNoKTtcbiAgICBpZiAodGhpcy51c2VLZXlzdG9yZSAmJiB0aGlzLmtleXN0b3JlUGF0aCA9PT0ga2V5c3RvcmVQYXRoIHx8ICF0aGlzLnVzZUtleXN0b3JlKSB7XG4gICAgICByZXR1cm4gKCF0aGlzLnVzZUtleXN0b3JlICYmICFyZXF1aXJlRGVmYXVsdENlcnQpIHx8IGhhc2hNYXRjaGVzKG91dHB1dCwgZXhwZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGV4cGVjdGVkID0gdGhpcy51c2VLZXlzdG9yZVxuICAgID8gYXdhaXQgdGhpcy5nZXRLZXlzdG9yZUhhc2goYXBwUGF0aCwgcGtnKVxuICAgIDogREVGQVVMVF9DRVJUX0hBU0g7XG4gIHRyeSB7XG4gICAgYXdhaXQgZ2V0QXBrc2lnbmVyRm9yT3ModGhpcyk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5leGVjdXRlQXBrc2lnbmVyKFsndmVyaWZ5JywgJy0tcHJpbnQtY2VydHMnLCBhcHBQYXRoXSk7XG4gICAgY29uc3QgaGFzTWF0Y2ggPSBoYXNoTWF0Y2hlcyhvdXRwdXQsIGV4cGVjdGVkKTtcbiAgICBpZiAoaGFzTWF0Y2gpIHtcbiAgICAgIGxvZy5pbmZvKGAnJHthcHBQYXRofScgaXMgc2lnbmVkIHdpdGggdGhlIGAgK1xuICAgICAgICBgJHt0aGlzLnVzZUtleXN0b3JlID8gJ2tleXN0b3JlJyA6ICdkZWZhdWx0J30gY2VydGlmaWNhdGVgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmluZm8oYCcke2FwcFBhdGh9JyBpcyBzaWduZWQgd2l0aCBhIGAgK1xuICAgICAgICBgbm9uLSR7dGhpcy51c2VLZXlzdG9yZSA/ICdrZXlzdG9yZScgOiAnZGVmYXVsdCd9IGNlcnRpZmljYXRlYCk7XG4gICAgfVxuICAgIGNvbnN0IGlzU2lnbmVkID0gKCF0aGlzLnVzZUtleXN0b3JlICYmICFyZXF1aXJlRGVmYXVsdENlcnQpIHx8IGhhc01hdGNoO1xuICAgIGlmIChpc1NpZ25lZCkge1xuICAgICAgU0lHTkVEX0FQUFNfQ0FDSEUuc2V0KGFwcEhhc2gsIHtcbiAgICAgICAgb3V0cHV0LFxuICAgICAgICBleHBlY3RlZCxcbiAgICAgICAga2V5c3RvcmVQYXRoOiB0aGlzLmtleXN0b3JlUGF0aCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaXNTaWduZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIG5vIHNpZ25hdHVyZVxuICAgIGlmIChfLmluY2x1ZGVzKGVyci5zdGRlcnIsIEFQS1NJR05FUl9WRVJJRllfRkFJTCkpIHtcbiAgICAgIGxvZy5pbmZvKGAnJHthcHBQYXRofScgaXMgbm90IHNpZ25lZGApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBlcnJNc2cgPSBlcnIuc3RkZXJyIHx8IGVyci5zdGRvdXQgfHwgZXJyLm1lc3NhZ2U7XG4gICAgaWYgKF8uaW5jbHVkZXMoZXJyTXNnLCBKQVZBX1BST1BTX0lOSVRfRVJST1IpKSB7XG4gICAgICAvLyBUaGlzIGVycm9yIHBvcHMgdXAgcmFuZG9tbHkgYW5kIHdlIGFyZSBub3QgcXVpdGUgc3VyZSB3aHkuXG4gICAgICAvLyBNeSBndWVzcyAtIGEgcmFjZSBjb25kaXRpb24gaW4gamF2YSB2bSBpbml0aWFsaXphdGlvbi5cbiAgICAgIC8vIE5ldmVydGhlbGVzcywgbGV0cyBtYWtlIEFwcGl1bSB0byBiZWxpZXZlIHRoZSBmaWxlIGlzIGFscmVhZHkgc2lnbmVkLFxuICAgICAgLy8gYmVjYXVzZSBpdCB3b3VsZCBiZSB0cnVlIGZvciA5OSUgb2YgVUlBdXRvbWF0b3IyLWJhc2VkXG4gICAgICAvLyB0ZXN0cywgd2hlcmUgd2UgcHJlc2lnbiBzZXJ2ZXIgYmluYXJpZXMgd2hpbGUgcHVibGlzaGluZyB0aGVpciBOUE0gbW9kdWxlLlxuICAgICAgLy8gSWYgdGhlc2UgYXJlIG5vdCBzaWduZWQsIGUuZy4gaW4gY2FzZSBvZiBFc3ByZXNzbywgdGhlbiB0aGUgbmV4dCBzdGVwKHMpXG4gICAgICAvLyB3b3VsZCBhbnl3YXkgZmFpbC5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTQ3MjQgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGxvZy53YXJuKGVyck1zZyk7XG4gICAgICBsb2cud2FybihgQXNzdW1pbmcgJyR7YXBwUGF0aH0nIGlzIGFscmVhZHkgc2lnbmVkIGFuZCBjb250aW51aW5nIGFueXdheWApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHZlcmlmeSB0aGUgc2lnbmF0dXJlIG9mICcke2FwcFBhdGh9Jy4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyTXNnfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEtleXN0b3JlSGFzaFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBtZDUgdGhlIG1kNSBoYXNoIHZhbHVlIG9mIHRoZSBrZXlzdG9yZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBzaGExIHRoZSBzaGExIGhhc2ggdmFsdWUgb2YgdGhlIGtleXN0b3JlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHNoYTI1NiB0aGUgc2hhMjU2IGhhc2ggdmFsdWUgb2YgdGhlIGtleXN0b3JlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHNoYTUxMiB0aGUgc2hhNTEyIGhhc2ggdmFsdWUgb2YgdGhlIGtleXN0b3JlXG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgdGhlIGhhc2ggb2YgdGhlIGdpdmVuIGtleXN0b3JlLlxuICpcbiAqIEByZXR1cm4ge0tleXN0b3JlSGFzaH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBnZXR0aW5nIGtleXN0b3JlIGhhc2ggZmFpbHMuXG4gKi9cbmFwa1NpZ25pbmdNZXRob2RzLmdldEtleXN0b3JlSGFzaCA9IGFzeW5jIGZ1bmN0aW9uIGdldEtleXN0b3JlSGFzaCAoKSB7XG4gIGxvZy5kZWJ1ZyhgR2V0dGluZyBoYXNoIG9mIHRoZSAnJHt0aGlzLmtleXN0b3JlUGF0aH0nIGtleXN0b3JlYCk7XG4gIGNvbnN0IGtleXRvb2wgPSBwYXRoLnJlc29sdmUoYXdhaXQgZ2V0SmF2YUhvbWUoKSwgJ2JpbicsXG4gICAgYGtleXRvb2wke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWApO1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhrZXl0b29sKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGtleXRvb2wgdXRpbGl0eSBjYW5ub3QgYmUgZm91bmQgYXQgJyR7a2V5dG9vbH0nYCk7XG4gIH1cbiAgY29uc3QgYXJncyA9IFtcbiAgICAnLXYnLCAnLWxpc3QnLFxuICAgICctYWxpYXMnLCB0aGlzLmtleUFsaWFzLFxuICAgICcta2V5c3RvcmUnLCB0aGlzLmtleXN0b3JlUGF0aCxcbiAgICAnLXN0b3JlcGFzcycsIHRoaXMua2V5c3RvcmVQYXNzd29yZFxuICBdO1xuICBsb2cuaW5mbyhgUnVubmluZyAnJHtrZXl0b29sfScgd2l0aCBhcmd1bWVudHM6ICR7dXRpbC5xdW90ZShhcmdzKX1gKTtcbiAgdHJ5IHtcbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoa2V5dG9vbCwgYXJncywgeyB3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHM6IHN5c3RlbS5pc1dpbmRvd3MoKSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGhhc2hOYW1lIG9mIFtTSEE1MTIsIFNIQTI1NiwgU0hBMSwgTUQ1XSkge1xuICAgICAgY29uc3QgaGFzaFJlID0gbmV3IFJlZ0V4cChgXlxcXFxzKiR7aGFzaE5hbWV9OlxcXFxzKihbYS1mMC05Ol0rKWAsICdtaScpO1xuICAgICAgY29uc3QgbWF0Y2ggPSBoYXNoUmUuZXhlYyhzdGRvdXQpO1xuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdFtoYXNoTmFtZV0gPSBtYXRjaFsxXS5yZXBsYWNlKC86L2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHJlc3VsdCkpIHtcbiAgICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcGFyc2UgdGhlIGhhc2ggdmFsdWUgZnJvbSB0aGUga2V5dG9vbCBvdXRwdXQnKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBLZXlzdG9yZSBoYXNoOiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGdldCB0aGUgaGFzaCBvZiAnJHt0aGlzLmtleXN0b3JlUGF0aH0nIGtleXN0b3JlLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLnN0ZGVyciB8fCBlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGFwa1NpZ25pbmdNZXRob2RzO1xuIl0sImZpbGUiOiJsaWIvdG9vbHMvYXBrLXNpZ25pbmcuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==