oxygen-cli 1.30.3 → 1.31.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.
- package/CHANGELOG.md +12 -0
- package/build/core/OxygenCore.js +7 -1
- package/build/lib/util.js +70 -1
- package/build/model/case-result.js +3 -2
- package/build/ox_modules/module-log.js +3 -3
- package/build/ox_modules/module-web/commands/index.js +14 -1
- package/build/ox_modules/module-web/commands/mock.js +49 -0
- package/build/ox_modules/module-web/commands/waitForAngular.js +7 -3
- package/build/ox_modules/module-web.js +61 -7
- package/build/ox_modules/utils.js +13 -2
- package/build/reporter/ReportAggregator.js +41 -2
- package/build/runners/oxygen/index.js +6 -9
- package/package.json +2 -1
|
@@ -236,6 +236,22 @@ class WebModule extends _WebDriverModule.default {
|
|
|
236
236
|
};
|
|
237
237
|
}
|
|
238
238
|
|
|
239
|
+
this.seleniumUrlBase = `${protocol}://${host}:${port}`; // check if selenium hub is based on Selenoid, then enable video recording
|
|
240
|
+
|
|
241
|
+
this.isRunningOnSelenoid = await this._isSelenoidHub(this.seleniumUrlBase);
|
|
242
|
+
|
|
243
|
+
if (this.isRunningOnSelenoid) {
|
|
244
|
+
if (!this.caps['selenoid:options']) {
|
|
245
|
+
this.caps['selenoid:options'] = {};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (this.caps['selenoid:options'].enableVideo === undefined) {
|
|
249
|
+
this.caps['selenoid:options'].enableVideo = true;
|
|
250
|
+
this.caps['selenoid:options'].videoFrameRate = 4;
|
|
251
|
+
}
|
|
252
|
+
} // generate Webdriver.io options
|
|
253
|
+
|
|
254
|
+
|
|
239
255
|
const wdioOpts = { ...(this.options.wdioOpts || {}),
|
|
240
256
|
protocol: protocol,
|
|
241
257
|
hostname: host,
|
|
@@ -293,6 +309,7 @@ class WebModule extends _WebDriverModule.default {
|
|
|
293
309
|
|
|
294
310
|
try {
|
|
295
311
|
this.driver = await wdio.remote(wdioOpts);
|
|
312
|
+
this.sessionId = this.driver.sessionId;
|
|
296
313
|
this.driver.provider = provider;
|
|
297
314
|
|
|
298
315
|
if (this.options.seleniumBrowserTimeout) {
|
|
@@ -435,12 +452,7 @@ class WebModule extends _WebDriverModule.default {
|
|
|
435
452
|
if (status && 'FAILED' === status.toUpperCase() && this.options && this.options.seleniumPid) {
|
|
436
453
|
this.disposeContinue(status);
|
|
437
454
|
} else {
|
|
438
|
-
|
|
439
|
-
await this.deleteSession();
|
|
440
|
-
} catch (e) {
|
|
441
|
-
this.logger.warn('Failed to close browser windows:', e);
|
|
442
|
-
}
|
|
443
|
-
|
|
455
|
+
await this.deleteSession();
|
|
444
456
|
this.disposeContinue();
|
|
445
457
|
}
|
|
446
458
|
}
|
|
@@ -540,6 +552,9 @@ class WebModule extends _WebDriverModule.default {
|
|
|
540
552
|
}
|
|
541
553
|
|
|
542
554
|
this.rs.har = this.transactions;
|
|
555
|
+
const hasFailed = error !== undefined && error !== null;
|
|
556
|
+
|
|
557
|
+
this._addSelenoidVideoAsTestAttachment(hasFailed);
|
|
543
558
|
}
|
|
544
559
|
|
|
545
560
|
_isAction(name) {
|
|
@@ -911,7 +926,46 @@ class WebModule extends _WebDriverModule.default {
|
|
|
911
926
|
});
|
|
912
927
|
}
|
|
913
928
|
|
|
929
|
+
async _isSelenoidHub(seleniumUrl) {
|
|
930
|
+
return new Promise((resolve, reject) => {
|
|
931
|
+
const options = {
|
|
932
|
+
url: `${seleniumUrl}`,
|
|
933
|
+
method: 'GET',
|
|
934
|
+
json: false,
|
|
935
|
+
rejectUnauthorized: false
|
|
936
|
+
};
|
|
937
|
+
|
|
938
|
+
try {
|
|
939
|
+
(0, _request.default)(options, (err, res, body) => {
|
|
940
|
+
if (err) {
|
|
941
|
+
reject(err);
|
|
942
|
+
} else {
|
|
943
|
+
if (body && body.length && body.indexOf('You are using Selenoid') > -1) {
|
|
944
|
+
resolve(true);
|
|
945
|
+
} else {
|
|
946
|
+
resolve(false);
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
});
|
|
950
|
+
} catch (e) {
|
|
951
|
+
this.logger.error('Unable to send result status to Browserstack: ' + e.toString());
|
|
952
|
+
resolve();
|
|
953
|
+
}
|
|
954
|
+
});
|
|
955
|
+
} // if the test is running inside Selenoid, then download the video if test has failed
|
|
956
|
+
|
|
957
|
+
|
|
958
|
+
async _addSelenoidVideoAsTestAttachment(hasFailed = false) {
|
|
959
|
+
if (!this.isRunningOnSelenoid || !hasFailed) {
|
|
960
|
+
return;
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
const videoFileUrl = `${this.seleniumUrlBase}/video/${this.sessionId}.mp4`;
|
|
964
|
+
const fileName = `${this.sessionId}.mp4`;
|
|
965
|
+
this.rs.attachments.push(_utils.default.newVideoAttachment(fileName, videoFileUrl));
|
|
966
|
+
}
|
|
967
|
+
|
|
914
968
|
}
|
|
915
969
|
|
|
916
970
|
exports.default = WebModule;
|
|
917
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS13ZWIuanMiXSwibmFtZXMiOlsiTU9EVUxFX05BTUUiLCJERUZBVUxUX1NFTEVOSVVNX1VSTCIsIkRFRkFVTFRfQlJPV1NFUl9OQU1FIiwiREVGQVVMVF9NT0JJTEVfQlJPV1NFUiIsIk5PX1NDUkVFTlNIT1RfQ09NTUFORFMiLCJBQ1RJT05fQ09NTUFORFMiLCJERUZBVUxUX1dBSVRfVElNRU9VVCIsIldlYk1vZHVsZSIsIldlYkRyaXZlck1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsInRyYW5zYWN0aW9ucyIsImxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lIiwiaGVscGVycyIsIl9sb2FkSGVscGVyRnVuY3Rpb25zIiwiT3hFcnJvciIsImVyckhlbHBlciIsIndhaXRGb3JUaW1lb3V0IiwibmFtZSIsImdldERyaXZlciIsImdldENhcGFiaWxpdGllcyIsImNhcHMiLCJpbml0Iiwic2VsZW5pdW1VcmwiLCJpc0luaXRpYWxpemVkIiwiYXBwaXVtVXJsIiwic3RhcnRzV2l0aCIsImN0eCIsImRlZmF1bHRCcm93c2VyIiwiYnJvd3Nlck5hbWUiLCJlcnJvckNvZGUiLCJJTlZBTElEX0NBUEFCSUxJVElFUyIsInRvTG93ZXJDYXNlIiwicmVjb3JkSEFSIiwiYnJvd3NlciIsInBlcmZvcm1hbmNlIiwidXJsIiwiVVJMIiwicGFyc2UiLCJwcm90b2NvbCIsInJlcGxhY2UiLCJob3N0IiwiaG9zdG5hbWUiLCJwb3J0IiwicGFyc2VJbnQiLCJwYXRoIiwicGF0aG5hbWUiLCJhdXRoIiwic3BsaXQiLCJ3ZGlvT3B0cyIsInVzZXIiLCJrZXkiLCJjYXBhYmlsaXRpZXMiLCJsb2dMZXZlbCIsInJ1bm5lciIsIndhaXRmb3JUaW1lb3V0IiwiY29ubmVjdGlvblJldHJ5VGltZW91dCIsImNvbm5lY3Rpb25SZXRyeUNvdW50IiwiaW5pdEVycm9yIiwiX3RoaXMiLCJwcm92aWRlciIsIm1vZFV0aWxzIiwiZGV0ZXJtaW5lUHJvdmlkZXIiLCJQRVJGRUNUTyIsIm9wZW5EZXZpY2VUaW1lb3V0IiwiZHJpdmVyIiwid2RpbyIsInJlbW90ZSIsInNlbGVuaXVtQnJvd3NlclRpbWVvdXQiLCJzZWxlbml1bVRpbWVvdXQiLCJwZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQiLCJwZXJmZWN0b1JlcG9ydGluZyIsIlBlcmZlY3RvIiwiUGVyZmVjdG9FeGVjdXRpb25Db250ZXh0Iiwid2ViZHJpdmVyIiwiZXhlY3V0ZVNjcmlwdCIsImNvbW1hbmQiLCJwYXJhbXMiLCJleGVjdXRlIiwicmVwb3J0aW5nQ2xpZW50IiwiUGVyZmVjdG9SZXBvcnRpbmdDbGllbnQiLCJ0ZXN0U3RhcnQiLCJlIiwiZ2V0U2VsZW5pdW1Jbml0RXJyb3IiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJnZXRCcm93c2VyTG9ncyIsImVycm9yIiwiTEFNQkRBVEVTVCIsIkJST1dTRVJTVEFDSyIsImluY2x1ZGVzIiwibWF4aW1pemVXaW5kb3ciLCJzZXRUaW1lb3V0IiwiZXJyIiwiVU5LTk9XTl9FUlJPUiIsIm1lc3NhZ2UiLCJ1dGlsIiwiaW5zcGVjdCIsImRpc3Bvc2UiLCJzdGF0dXMiLCJfd2hlbldlYk1vZHVsZURpc3Bvc2UiLCJzdGVwcyIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsImZhaWxlZEZpbmRlZCIsImZpbmQiLCJpdGVtIiwidG9VcHBlckNhc2UiLCJTQVVDRUxBQlMiLCJ1c2VybmFtZSIsImFjY2Vzc0tleSIsInBhc3NlZCIsImlkIiwic2Vzc2lvbklkIiwiYm9keSIsIm15QWNjb3VudCIsIlNhdWNlTGFicyIsInVwZGF0ZUpvYiIsInN0b3BKb2IiLCJfc2VuZFJlc3VsdFN0YXR1c1RvTGFtYmRhVGVzdCIsImRlbGV0ZVNlc3Npb24iLCJURVNUSU5HQk9UIiwiX3NlbmRSZXN1bHRTdGF0dXNUb1Rlc3RpbmdCb3QiLCJ0ZXN0U3RvcCIsIkNvbnN0YW50cyIsInJlc3VsdHMiLCJmYWlsZWQiLCJfc2VuZFJlc3VsdFN0YXR1c1RvQnJvd3NlcnN0YWNrIiwiY2xvc2VCcm93c2VyV2luZG93cyIsImRpc3Bvc2VDb250aW51ZSIsIndhcm4iLCJwcm9taXNlIiwic2VsZW5pdW1TZXNzaW9uVGltZW91dCIsInNlbGVuaXVtUGlkIiwicHJvY2VzcyIsInBsYXRmb3JtIiwic3RkaW8iLCJwZ3JlcFJlc3VsdCIsInRvU3RyaW5nIiwicmVzb2x2ZSIsIl9pdGVyYXRpb25TdGFydCIsImdsb2JhbCIsIl9sYXN0VHJhbnNhY3Rpb25OYW1lIiwiX2l0ZXJhdGlvbkVuZCIsInR5cGUiLCJlcnJvckhlbHBlciIsIlNFTEVOSVVNX1NFU1NJT05fVElNRU9VVCIsImxvZ3MiLCJsb2ciLCJwdXNoIiwiX2FkanVzdEJyb3dzZXJMb2ciLCJfZ2V0SEFSIiwiaGFyIiwiX2lzQWN0aW9uIiwiX3Rha2VTY3JlZW5zaG90U2lsZW50IiwidGFrZVNjcmVlbnNob3QiLCJyZXR2YWwiLCJjYWxsIiwiUHJvbWlzZSIsInJlamVjdCIsIndhaXRVbnRpbFJldFZhbCIsIndhaXRVbnRpbCIsImltYWdlcyIsImhhbmRsZXMiLCJnZXRXaW5kb3dIYW5kbGVzIiwiaGFuZGxlIiwic3dpdGNoVG9XaW5kb3ciLCJpbWFnZSIsInRpdGxlIiwiZ2V0VGl0bGUiLCJ0ZXh0VG9JbWFnZSIsInJlcXVpcmUiLCJ0aXRsZUltYWdlIiwiZ2VuZXJhdGUiLCJtZXJnZWRJbWFnZSIsImRpcmVjdGlvbiIsInRpbWVvdXQiLCJ0aGVuIiwiY2F0Y2giLCJ0aW1lIiwidGltZXN0YW1wIiwibXNnIiwibGV2ZWwiLCJzcmMiLCJfZ2V0U3RhdHMiLCJjb21tYW5kTmFtZSIsImZldGNoU3RhdHMiLCJuYXZpZ2F0aW9uU3RhcnQiLCJkb21Db250ZW50TG9hZGVkIiwibG9hZCIsInNhbWVQYWdlIiwibGFzdEVycm9yIiwidGltaW5ncyIsIndpbmRvdyIsInRpbWluZyIsImRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0IiwibG9hZEV2ZW50U3RhcnQiLCJleGVjdXRlRXJyb3IiLCJjb25zb2xlIiwiRG9tQ29udGVudExvYWRlZEV2ZW50IiwiTG9hZEV2ZW50IiwidHJhbnNhY3Rpb24iLCJjb3VudGVyIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsImdldFdkaW9Mb2NhdG9yIiwibWF0Y2hQYXR0ZXJuIiwiZ2V0RWxlbWVudCIsImdldEVsZW1lbnRzIiwiZ2V0Q2hpbGRFbGVtZW50IiwiZ2V0Q2hpbGRFbGVtZW50cyIsInNldFRpbWVvdXRJbXBsaWNpdCIsInJlc3RvcmVUaW1lb3V0SW1wbGljaXQiLCJhc3NlcnRBcmd1bWVudCIsImFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmciLCJhc3NlcnRBcmd1bWVudE51bWJlciIsImFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUiLCJhc3NlcnRBcmd1bWVudEJvb2wiLCJhc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCIsImFzc2VydEFyZ3VtZW50VGltZW91dCIsImFzc2VydEFyZ3VtZW50U3RyaW5nIiwidHlwZXMiLCJnZXRMb2dUeXBlcyIsImdldExvZ3MiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJldmVudHMiLCJtc2dPYmoiLCJjaGVja1dhaXRGb3JBbmd1bGFyIiwiYXV0b1dhaXRGb3JBbmd1bGFyIiwid2FpdEZvckFuZ3VsYXIiLCJhdXRvV2FpdEZvckFuZ3VsYXJSb290U2VsZWN0b3IiLCJhdXRvV2FpdEZvckFuZ3VsYXJUaW1lb3V0IiwibGFtYmRhQ3JlZGVudGlhbHMiLCJsYW1iZGFBdXRvbWF0aW9uQ2xpZW50IiwibGFtYmRhUmVzdENsaWVudCIsIkF1dG9tYXRpb25DbGllbnQiLCJyZXF1ZXN0Qm9keSIsInN0YXR1c19pbmQiLCJ1cGRhdGVTZXNzaW9uQnlJZCIsInRiIiwiVGVzdGluZ0JvdCIsImFwaV9rZXkiLCJhcGlfc2VjcmV0IiwidGVzdERhdGEiLCJ1cGRhdGVUZXN0IiwidGVzdERldGFpbHMiLCJtZXRob2QiLCJqc29uIiwicmVq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QW1ESixDQUFDLENBQUN3RCxRQUFGLEVBQXJFO0FBQ0FDLFFBQUFBLE9BQU87QUFDVjtBQUNKLEtBMUJNLENBQVA7QUEyQkg7O0FBM3dCa0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xyXG4vKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbid1c2Ugc3RyaWN0JztcclxuLyoqXHJcbiAqIEBuYW1lIHdlYlxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3IgYnJvd3NlciBhdXRvbWF0aW9uLlxyXG4gKiBAc2FtcGxlICoqTm90ZXM6KiogIFxyXG4gKiAgIFxyXG4gKiBDb21tYW5kcyB3aGljaCBvcGVyYXRlIG9uIGVsZW1lbnRzIHN1Y2ggYXMgY2xpY2ssIGFzc2VydCwgd2FpdEZvciwgdHlwZSwgc2VsZWN0LCBhbmQgb3RoZXJzIHdpbGwgYXV0b21hdGljYWxseSB3YWl0IGZvciBhIHBlcmlvZCBvZiB0aW1lIGZvciB0aGUgZWxlbWVudCB0byBhcHBlYXIgaW4gRE9NIGFuZCBiZWNvbWUgdmlzaWJsZS4gQnkgZGVmYXVsdCB0aGlzIHBlcmlvZCBlcXVhbHMgdG8gNjAgc2Vjb25kcywgYnV0IGNhbiBiZSBjaGFuZ2VkIHVzaW5nIHRoZSBgc2V0VGltZW91dGBjb21tYW5kLlxyXG4gKiAgIFxyXG4gKiAqKlN0cmluZyBtYXRjaGluZyBwYXR0ZXJuczoqKiBcclxuICogXHJcbiAqICBDb21tYW5kcyB3aGljaCBleHBlY3QgYSBzdHJpbmcgbWF0Y2hpbmcgcGF0dGVybiBpbiB0aGVpciBhcmd1bWVudHMsIHN1cHBvcnQgZm9sbG93aW5nIHBhdHRlcm5zIHVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlOlxyXG4gKiBcclxuICogICogYHJlZ2V4OlBBVFRFUk5gIC0gTWF0Y2ggdXNpbmcgcmVndWxhciBleHByZXNzaW9uLlxyXG4gKiAgKiBgcmVnZXhpOlBBVFRFUk5gIC0gTWF0Y2ggdXNpbmcgY2FzZS1pbnNlbnNpdGl2ZSByZWd1bGFyIGV4cHJlc3Npb24uXHJcbiAqICAqIGBleGFjdDpTVFJJTkdgIC0gTWF0Y2ggdGhlIHN0cmluZyB2ZXJiYXRpbS5cclxuICogICogYGdsb2I6UEFUVEVSTmAgLSBNYXRjaCB1c2luZyBjYXNlLWluc2Vuc2l0aXZlIGdsb2IgcGF0dGVybi4gYD9gIHdpbGwgbWF0Y2ggYW55IHNpbmdsZSBjaGFyYWN0ZXIgZXhjZXB0IG5ldyBsaW5lIFxcKFxcblxcKS4gYCpgIHdpbGwgbWF0Y2ggYW55IHNlcXVlbmNlIFxcKDAgb3IgbW9yZVxcKSBvZiBjaGFyYWN0ZXJzIGV4Y2VwdCBuZXcgbGluZS4gRW1wdHkgICAgIFBBVFRFUk4gd2lsbCBtYXRjaCBvbmx5IG90aGVyIGVtcHR5IHN0cmluZ3MuXHJcbiAqICAqIGBQQVRURVJOYCAtIFNhbWUgYXMgZ2xvYiBtYXRjaGluZy4gIFxyXG4gKlxyXG4gKiAqKkxvY2F0b3JzOioqIFxyXG4gKiBcclxuICogIENvbW1hbmRzIHdoaWNoIGV4cGVjdCBhbiBlbGVtZW50IGxvY2F0b3IgaW4gdGhlaXIgYXJndW1lbnRzLCBzdXBwb3J0IGZvbGxvd2luZyBsb2NhdG9yIHR5cGVzIHVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlOlxyXG4gKiBcclxuICogICogYGlkPUlEYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgSUQgYXR0cmlidXRlLlxyXG4gKiAgKiBgY3NzPUNTU19TRUxFQ1RPUmAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYSBDU1Mgc2VsZWN0b3IuXHJcbiAqICAqIGBsaW5rPVRFWFRgIC0gTG9jYXRlcyBsaW5rIGVsZW1lbnQgd2hvc2UgdmlzaWJsZSB0ZXh0IG1hdGNoZXMgdGhlIGdpdmVuIHN0cmluZy5cclxuICogICogYGxpbmstY29udGFpbnM9VEVYVGAgLSBMb2NhdGVzIGxpbmsgZWxlbWVudCB3aG9zZSB2aXNpYmxlIHRleHQgY29udGFpbnMgdGhlIGdpdmVuIHN0cmluZy5cclxuICogICogYG5hbWU9TkFNRWAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIE5BTUUgYXR0cmlidXRlLlxyXG4gKiAgKiBgdGFnPU5BTUVgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyB0YWcgbmFtZS5cclxuICogICogYC9YUEFUSGAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYW4gWFBhdGggMS4wIGV4cHJlc3Npb24uXHJcbiAqICAqIGAoWFBBVEgpW11gIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGFuIFhQYXRoIDEuMCBleHByZXNzaW9uLlxyXG4gKi9cclxuXHJcbi8qIGVzbGludC1kaXNhYmxlIHF1b3RlcyAqL1xyXG5pbXBvcnQgeyBoYXJGcm9tTWVzc2FnZXMgfSBmcm9tICdjaHJvbWUtaGFyJztcclxuaW1wb3J0IFVSTCBmcm9tICd1cmwnO1xyXG5pbXBvcnQgKiBhcyB3ZGlvIGZyb20gJ3dlYmRyaXZlcmlvJztcclxuaW1wb3J0IFdlYkRyaXZlck1vZHVsZSBmcm9tICcuLi9jb3JlL1dlYkRyaXZlck1vZHVsZSc7XHJcbmltcG9ydCB7IGRlZmVyIH0gZnJvbSAnd2hlbic7XHJcbmltcG9ydCBtb2RVdGlscyBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuaW1wb3J0IHV0aWwgZnJvbSAndXRpbCc7XHJcbmltcG9ydCBTYXVjZUxhYnMgZnJvbSAnc2F1Y2VsYWJzJztcclxuaW1wb3J0IGxhbWJkYVJlc3RDbGllbnQgZnJvbSAnQGxhbWJkYXRlc3Qvbm9kZS1yZXN0LWNsaWVudCc7XHJcbmltcG9ydCBUZXN0aW5nQm90IGZyb20gJ3Rlc3Rpbmdib3QtYXBpJztcclxuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcclxuaW1wb3J0IHBlcmZlY3RvUmVwb3J0aW5nIGZyb20gJ3BlcmZlY3RvLXJlcG9ydGluZyc7XHJcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3JlcXVlc3QnO1xyXG5pbXBvcnQgbWVyZ2VJbWFnZXMgZnJvbSAnLi4vbGliL2ltZy1tZXJnZSc7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuXHJcbmNvbnN0IE1PRFVMRV9OQU1FID0gJ3dlYic7XHJcbmNvbnN0IERFRkFVTFRfU0VMRU5JVU1fVVJMID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6NDQ0NC93ZC9odWInO1xyXG5jb25zdCBERUZBVUxUX0JST1dTRVJfTkFNRSA9ICdjaHJvbWUnO1xyXG5jb25zdCBERUZBVUxUX01PQklMRV9CUk9XU0VSID0gJ2RlZmF1bHQnO1xyXG5jb25zdCBOT19TQ1JFRU5TSE9UX0NPTU1BTkRTID0gWydpbml0JywgJ2Fzc2VydEFsZXJ0J107XHJcbmNvbnN0IEFDVElPTl9DT01NQU5EUyA9IFsnb3BlbicsICdjbGljayddO1xyXG5jb25zdCBERUZBVUxUX1dBSVRfVElNRU9VVCA9IDYwICogMTAwMDsgICAgICAgICAgICAvLyBkZWZhdWx0IDYwcyB3YWl0IHRpbWVvdXRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYk1vZHVsZSBleHRlbmRzIFdlYkRyaXZlck1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKTtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucyA9IHt9OyAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbi0+aGFyIGRpY3Rpb25hcnlcclxuICAgICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gbnVsbDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMgPSB7fTtcclxuICAgICAgICB0aGlzLl9sb2FkSGVscGVyRnVuY3Rpb25zKCk7XHJcbiAgICAgICAgLy8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IChzb21lIG1vZHVsZSBjb21tYW5kcyBtaWdodCByZWZlciB0byB0aGlzLk94RXJyb3IgYW5kIHRoaXMuZXJySGVscGVyKVxyXG4gICAgICAgIHRoaXMuT3hFcnJvciA9IE94RXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJIZWxwZXIgPSBlcnJIZWxwZXI7XHJcbiAgICAgICAgLy8gaG9sZHMgZWxlbWVudCBvcGVyYXRpb24gdGltZW91dCB2YWx1ZVxyXG4gICAgICAgIHRoaXMud2FpdEZvclRpbWVvdXQgPSBERUZBVUxUX1dBSVRfVElNRU9VVDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gTU9EVUxFX05BTUU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0RHJpdmVyXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIFdESU8gZHJpdmVyLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBXRElPIGRyaXZlci5cclxuICAgICAqL1xyXG4gICAgZ2V0RHJpdmVyKCkge1xyXG4gICAgICAgIHJldHVybiBzdXBlci5nZXREcml2ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBnZXRDYXBhYmlsaXRpZXNcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgY3VycmVudGx5IGRlZmluZWQgY2FwYWJpbGl0aWVzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldENhcGFiaWxpdGllcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYXBzIHx8IHN1cGVyLmdldENhcGFiaWxpdGllcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGluaXRcclxuICAgICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIG5ldyBTZWxlbml1bSBzZXNzaW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBjYXBzIC0gRGVzaXJlZCBjYXBhYmlsaXRpZXMuIElmIG5vdCBzcGVjaWZpZWQgY2FwYWJpbGl0aWVzIHdpbGwgYmUgdGFrZW4gZnJvbSBzdWl0ZSBkZWZpbml0aW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBzZWxlbml1bVVybCAtIFJlbW90ZSBzZXJ2ZXIgVVJMIChkZWZhdWx0OiBodHRwOi8vbG9jYWxob3N0OjQ0NDQvd2QvaHViKS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgaW5pdChjYXBzLCBzZWxlbml1bVVybCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZWxlbml1bVVybCkge1xyXG4gICAgICAgICAgICAvLyBpZiBhcHBpdW1VcmwgcG9pbnRzIHRvIGFuIGV4dGVybmFsIGV4ZWN1dGlvbiBncmlkIChzdWNoIGFzIEJTKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFwcGl1bVVybCAmJiAhdGhpcy5vcHRpb25zLmFwcGl1bVVybC5zdGFydHNXaXRoKCdodHRwOi8vbG9jYWxob3N0JykpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVuaXVtVXJsID0gdGhpcy5vcHRpb25zLmFwcGl1bVVybDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGVuaXVtVXJsID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtVXJsIHx8IERFRkFVTFRfU0VMRU5JVU1fVVJMO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB0YWtlIGNhcGFiaWxpdGllcyBlaXRoZXIgZnJvbSBpbml0IG1ldGhvZCBhcmd1bWVudCBvciBmcm9tIGNvbnRleHQgcGFyYW1ldGVycyBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgLy8gbWVyZ2UgY2FwYWJpbGl0aWVzIGZyb20gY29udGV4dCBhbmQgZnJvbSBpbml0IGZ1bmN0aW9uIGFyZ3VtZW50LCBnaXZlIHByZWZlcmVuY2UgdG8gY29udGV4dC1wYXNzZWQgY2FwYWJpbGl0aWVzXHJcbiAgICAgICAgdGhpcy5jYXBzID0ge307XHJcbiAgICAgICAgaWYgKHRoaXMuY3R4LmNhcHMpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzID0geyAuLi50aGlzLmN0eC5jYXBzIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjYXBzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FwcyA9IHsgLi4udGhpcy5jYXBzLCAuLi5jYXBzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwb3B1bGF0ZSBicm93c2VyTmFtZSBjYXBzIGZyb20gb3B0aW9ucy4gRklYTUU6IHdoeSBpcyB0aGlzIGV2ZW4gbmVlZGVkP1xyXG4gICAgICAgIGxldCBkZWZhdWx0QnJvd3NlciA9IGZhbHNlO1xyXG4gICAgICAgIGlmICghdGhpcy5jYXBzLmJyb3dzZXJOYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9IHRoaXMub3B0aW9ucy5icm93c2VyTmFtZSB8fCBERUZBVUxUX0JST1dTRVJfTkFNRTtcclxuICAgICAgICAgICAgZGVmYXVsdEJyb3dzZXIgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBGSVhNRTogc2hhbGwgd2UgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGJyb3dzZXJOYW1lIGlzIG5vdCBzcGVjaWZpZWQsIG5laXRoZXIgaW4gY2FwcyBub3IgaW4gb3B0aW9ucz8hXHJcbiAgICAgICAgaWYgKCF0aGlzLmNhcHMuYnJvd3Nlck5hbWUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5JTlZBTElEX0NBUEFCSUxJVElFUyxcclxuICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBgd2ViYCBtb2R1bGUgLSBicm93c2VyTmFtZSBtdXN0IGJlIHNwZWNpZmllZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGFkanVzdCBicm93c2VyTmFtZS1zXHJcbiAgICAgICAgaWYgKHRoaXMuY2Fwcy5icm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaWUnKSB7XHJcbiAgICAgICAgICAgIC8vIElFIGlzIHNwZWNpZmllZCBhcyAnaWUnIHRocm91Z2ggdGhlIGNvbW1hbmQgbGluZSBhbmQgcG9zc2libHkgc3VpdGVzXHJcbiAgICAgICAgICAgIC8vIGJ1dCBzZWxlbml1bSBzdGFuZGFsb25lIHNlcnZlciBleHBlY3RzICdpbnRlcm5ldCBleHBsb3JlcidcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gJ2ludGVybmV0IGV4cGxvcmVyJztcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2Fwc1snbGFtYmRhOm9wdGlvbnMnXSkge1xyXG4gICAgICAgICAgICAvLyBsYW1iZGF0ZXN0IGV4cGVjdHMgb3JpZ2luYWwgY2FzZSBuYW1lc1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYXBzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgLy8gcGVyZmVjdG9Nb2JpbGUgZXhwZWN0cyBvcmlnaW5hbCBjYXNlIG5hbWVzXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcHMuYnJvd3Nlck5hbWUgIT09ICdNaWNyb3NvZnRFZGdlJykge1xyXG4gICAgICAgICAgICAvLyBzZWxlbml1bSBzdGFuZGFsb25lIHNlcnZlciBleHBlY3RzIGFsbCBicm93c2VyTmFtZXMgdG8gYmUgbG93ZXJjYXNlXHJcbiAgICAgICAgICAgIC8vIGV4Y2VwdCBcIk1pY3Jvc29mdEVkZ2VcIlxyXG4gICAgICAgICAgICB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPSB0aGlzLmNhcHMuYnJvd3Nlck5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGFkanVzdCBjYXBhYmlsaXRpZXMgdG8gZW5hYmxlIGNvbGxlY3RpbmcgYnJvd3NlciBhbmQgcGVyZm9ybWFuY2Ugc3RhdHMgaW4gQ2hyb21lIFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVjb3JkSEFSICYmIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9PT0gJ2Nocm9tZScpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzWydnb29nOmxvZ2dpbmdQcmVmcyddID0geyAgICAgLy8gZm9yIENocm9tZURyaXZlciA+PSA3NVxyXG4gICAgICAgICAgICAgICAgYnJvd3NlcjogJ0FMTCcsXHJcbiAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZTogJ0FMTCdcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgLy8gc3BlY2lmeWluZyB0aGlzIGxlYWRzIENocm9tZSA3NysgdG8gcmVmdXNlIGxvYWRpbmdcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmxvZ2dpbmdQcmVmcyA9IHsgICAgICAgICAgICAgLy8gZm9yIENocm9tZURyaXZlciA8IDc1XHJcbiAgICAgICAgICAgICAgICBicm93c2VyOiAnQUxMJyxcclxuICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlOiAnQUxMJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMuY2hyb21lT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIHBlcmZMb2dnaW5nUHJlZnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVOZXR3b3JrOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZVBhZ2U6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwb3B1bGF0ZSBXRElPIG9wdGlvbnNcclxuICAgICAgICBjb25zdCB1cmwgPSBVUkwucGFyc2Uoc2VsZW5pdW1VcmwgfHwgREVGQVVMVF9TRUxFTklVTV9VUkwpO1xyXG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gdXJsLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpO1xyXG4gICAgICAgIGNvbnN0IGhvc3QgPSB1cmwuaG9zdG5hbWU7XHJcbiAgICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHVybC5wb3J0IHx8IChwcm90b2NvbCA9PT0gJ2h0dHBzJyA/IDQ0MyA6IDgwKSk7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHVybC5wYXRobmFtZTtcclxuXHJcbiAgICAgICAgLy8gYXV0aCBpcyBuZWVkZWQgbW9zdGx5IGZvciBjbG91ZCBwcm92aWRlcnMgc3VjaCBhcyBMYW1iZGFUZXN0XHJcbiAgICAgICAgaWYgKHVybC5hdXRoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF1dGggPSB1cmwuYXV0aC5zcGxpdCgnOicpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMud2Rpb09wdHMgPSB7XHJcbiAgICAgICAgICAgICAgICB1c2VyOiBhdXRoWzBdLFxyXG4gICAgICAgICAgICAgICAga2V5OiBhdXRoWzFdXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB3ZGlvT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5vcHRpb25zLndkaW9PcHRzIHx8IHt9LFxyXG4gICAgICAgICAgICBwcm90b2NvbDogcHJvdG9jb2wsXHJcbiAgICAgICAgICAgIGhvc3RuYW1lOiBob3N0LFxyXG4gICAgICAgICAgICBwb3J0OiBwb3J0LFxyXG4gICAgICAgICAgICBwYXRoOiBwYXRoLFxyXG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IHRoaXMuY2FwcyxcclxuICAgICAgICAgICAgbG9nTGV2ZWw6ICdzaWxlbnQnLFxyXG4gICAgICAgICAgICBydW5uZXI6ICdyZXBsJyxcclxuICAgICAgICAgICAgd2FpdGZvclRpbWVvdXQ6IDUwMDAsIC8vIGluY3JlYXNlIHRoZSBkZWZhdWx0IDMwMDBcclxuICAgICAgICAgICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogMzEwKjEwMDAsXHJcbiAgICAgICAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiAxXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IGluaXRFcnJvciA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gbW9kVXRpbHMuZGV0ZXJtaW5lUHJvdmlkZXIod2Rpb09wdHMpO1xyXG5cclxuICAgICAgICBpZiAocHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPKSB7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnBhdGggPSAnL25leHBlcmllbmNlL3BlcmZlY3RvbW9iaWxlL3dkL2h1Yic7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnBvcnQgPSA4MDtcclxuICAgICAgICAgICAgd2Rpb09wdHMucHJvdG9jb2wgPSAnaHR0cCc7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLm9wZW5EZXZpY2VUaW1lb3V0ID0gMTU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbmFtZSA9ICduYW1lJztcclxuICAgICAgICBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ11bJ25hbWUnXSkge1xyXG4gICAgICAgICAgICBuYW1lID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ11bJ25hbWUnXTtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddICYmIHdkaW9PcHRzLmNhcGFiaWxpdGllc1snbGFtYmRhOm9wdGlvbnMnXVsnbmFtZSddKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2xhbWJkYTpvcHRpb25zJ11bJ25hbWUnXTtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllc1snbGFtYmRhOm9wdGlvbnMnXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWyd0ZXN0aW5nQm90Om9wdGlvbnMnXVsnbmFtZSddKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3Rlc3RpbmdCb3Q6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3Rlc3RpbmdCb3Q6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddICYmIHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXVsnbmFtZSddKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ11bJ25hbWUnXTtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2V0IGRlZmF1bHQgYnJvd3NlciBmb3IgbW9iaWxlIHdlYiB0ZXN0cywgaWYgZXhlY3V0ZWQgYWdhaW5zdCByZW1vdGUgZGV2aWNlcyBvZiBhIGNsb3VkIHByb3ZpZGVyXHJcbiAgICAgICAgaWYgKGRlZmF1bHRCcm93c2VyICYmIHByb3ZpZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9IERFRkFVTFRfTU9CSUxFX0JST1dTRVI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMud2Rpb09wdHMgPSB3ZGlvT3B0cztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmRyaXZlciA9IGF3YWl0IHdkaW8ucmVtb3RlKHdkaW9PcHRzKTtcclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIucHJvdmlkZXIgPSBwcm92aWRlcjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZW5pdW1Ccm93c2VyVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuc2VsZW5pdW1Ccm93c2VyVGltZW91dCA9IHRoaXMub3B0aW9ucy5zZWxlbml1bUJyb3dzZXJUaW1lb3V0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVuaXVtVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuc2VsZW5pdW1UaW1lb3V0ID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtVGltZW91dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5QRVJGRUNUTykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGVyZmVjdG9FeGVjdXRpb25Db250ZXh0ID0gYXdhaXQgbmV3IHBlcmZlY3RvUmVwb3J0aW5nLlBlcmZlY3RvLlBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCh7XHJcbiAgICAgICAgICAgICAgICAgICAgd2ViZHJpdmVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTY3JpcHQ6IGFzeW5jIChjb21tYW5kLCBwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRyaXZlci5leGVjdXRlKGNvbW1hbmQsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0aW5nQ2xpZW50ID0gbmV3IHBlcmZlY3RvUmVwb3J0aW5nLlBlcmZlY3RvLlBlcmZlY3RvUmVwb3J0aW5nQ2xpZW50KHBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlcG9ydGluZ0NsaWVudC50ZXN0U3RhcnQobmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJySGVscGVyLmdldFNlbGVuaXVtSW5pdEVycm9yKGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcmVzZXQgYnJvd3NlciBsb2dzIGlmIGF1dG8gY29sbGVjdCBsb2dzIG9wdGlvbiBpcyBlbmFibGVkXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsZWN0QnJvd3NlckxvZ3MgJiYgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID09PSAnY2hyb21lJykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgLy8gc2ltcGx5IGNhbGwgdGhpcyB0byBjbGVhciB0aGUgcHJldmlvdXMgbG9ncyBhbmQgc3RhcnQgdGhlIHRlc3Qgd2l0aCB0aGUgY2xlYW4gbG9nc1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRCcm93c2VyTG9ncygpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IHJldHJpZXZlIGJyb3dzZXIgbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgW21vZFV0aWxzLnByb3ZpZGVyLkxBTUJEQVRFU1QsIG1vZFV0aWxzLnByb3ZpZGVyLkJST1dTRVJTVEFDSywgbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE9dLmluY2x1ZGVzKHRoaXMuZHJpdmVyLnByb3ZpZGVyKVxyXG4gICAgICAgICAgICAgICAgLy9bJ01pY3Jvc29mdEVkZ2UnLCAnbXNlZGdlJywgJ0VkZ2UnLCAnSW50ZXJuZXQgRXhwbG9yZXInXS5pbmNsdWRlcyh0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgLy8gZG8gbm90IG1heGltaXplIHdpbmRvdyBpZiB0aGUgdGVzdCBpcyBleGVjdXRlZCBhZ2FpbnN0IGV4dGVybmFsIGNsb3VkIHByb3ZpZGVyIGluZnJhc3RydWN0dXJlXHJcbiAgICAgICAgICAgICAgICAvLyBhcyBtb3N0IG9mIGNsb3VkIHByb3ZpZGVycyBkbyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIG1heGltaXplIGJyb3dzZXIgd2luZG93XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5tYXhpbWl6ZVdpbmRvdygpO1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0IGluaXRpYWwgVGltZW91dFxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc2V0VGltZW91dCh7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2ltcGxpY2l0JzogdGhpcy53YWl0Rm9yVGltZW91dCxcclxuICAgICAgICAgICAgICAgICAgICAncGFnZUxvYWQnOiB0aGlzLndhaXRGb3JUaW1lb3V0XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5VTktOT1dOX0VSUk9SLCBlcnIubWVzc2FnZSwgdXRpbC5pbnNwZWN0KGVycikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5pbml0KHRoaXMuZHJpdmVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBkaXNwb3NlXHJcbiAgICAgKiBAc3VtbWFyeSBFbmRzIHRoZSBjdXJyZW50IHNlc3Npb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IHN0YXR1cyAtIFRlc3Qgc3RhdHVzLCBlaXRoZXIgYHBhc3NlZGAgb3IgYGZhaWxlZGAuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB7fTtcclxuICAgICAgICB0aGlzLl93aGVuV2ViTW9kdWxlRGlzcG9zZSA9IGRlZmVyKCk7XHJcblxyXG4gICAgICAgIGlmICghc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHN0YXR1cyA9ICdwYXNzZWQnO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucnMuc3RlcHMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnJzLnN0ZXBzKSAmJiB0aGlzLnJzLnN0ZXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZhaWxlZEZpbmRlZCA9IHRoaXMucnMuc3RlcHMuZmluZCgoaXRlbSkgPT4gaXRlbS5zdGF0dXMgPT09ICdmYWlsZWQnKTtcclxuICAgICAgICAgICAgICAgIGlmIChmYWlsZWRGaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnZmFpbGVkJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyICYmIHRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdHVzLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5TQVVDRUxBQlMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydzYXVjZTpvcHRpb25zJ11bJ3VzZXJuYW1lJ107XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzS2V5ID0gdGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3NhdWNlOm9wdGlvbnMnXVsnYWNjZXNzS2V5J107XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzc2VkID0gc3RhdHVzID09PSAnUEFTU0VEJztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuZHJpdmVyLnNlc3Npb25JZDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gXCJ7XFxcInBhc3NlZFxcXCI6XCIrcGFzc2VkK1wifVwiO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBteUFjY291bnQgPSBuZXcgU2F1Y2VMYWJzKHsgdXNlcjogdXNlcm5hbWUsIGtleTogYWNjZXNzS2V5fSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbXlBY2NvdW50LnVwZGF0ZUpvYih1c2VybmFtZSwgaWQsIGJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG15QWNjb3VudC5zdG9wSm9iKHVzZXJuYW1lLCBpZCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5MQU1CREFURVNUKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2VuZFJlc3VsdFN0YXR1c1RvTGFtYmRhVGVzdChzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuVEVTVElOR0JPVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NlbmRSZXN1bHRTdGF0dXNUb1Rlc3RpbmdCb3Qoc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXBvcnRpbmdDbGllbnQudGVzdFN0b3Aoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZWN0b1JlcG9ydGluZy5Db25zdGFudHMucmVzdWx0cy5wYXNzZWQgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZWN0b1JlcG9ydGluZy5Db25zdGFudHMucmVzdWx0cy5mYWlsZWRcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLkJST1dTRVJTVEFDSykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NlbmRSZXN1bHRTdGF0dXNUb0Jyb3dzZXJzdGFjayhzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbnVsbCAmJiBbJ1BBU1NFRCcsJ0ZBSUxFRCddLmluY2x1ZGVzKHN0YXR1cykpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsb3NlQnJvd3NlcldpbmRvd3Moc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FuY2VsZWQgb3Igb3RoZXIgc3RhdHVzXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ29udGludWUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybignRXJyb3IgZGlzcG9zaW5nIGRyaXZlcjogJywgZSk7ICAgIC8vIGlnbm9yZSBhbnkgZXJyb3JzIGF0IGRpc3Bvc2FsIHN0YWdlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VDb250aW51ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3doZW5XZWJNb2R1bGVEaXNwb3NlLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGVsZXRlU2Vzc2lvbigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIgJiYgdGhpcy5kcml2ZXIuZGVsZXRlU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZW5pdW1TZXNzaW9uVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZVNlc3Npb24gd2lsbCB0YWtlIDUgbWluIHRvIGNhbGxcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZGVsZXRlU2Vzc2lvbiBlcnJvcicsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjbG9zZUJyb3dzZXJXaW5kb3dzKHN0YXR1cykge1xyXG4gICAgICAgIGlmIChzdGF0dXMgJiYgJ0ZBSUxFRCcgPT09IHN0YXR1cy50b1VwcGVyQ2FzZSgpICYmIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc2VsZW5pdW1QaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ29udGludWUoc3RhdHVzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBjbG9zZSBicm93c2VyIHdpbmRvd3M6JywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ29udGludWUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcG9zZUNvbnRpbnVlKHN0YXR1cykge1xyXG4gICAgICAgIHRoaXMuZHJpdmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gbnVsbDtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcblxyXG4gICAgICAgIC8vIGNsZWFudXAgY2hyb21lZHJpdmVyJ3Mgb25seSB3aGVuIHJ1bm5pbmcgZnJvbSB3aXRoaW4gdGhlIElERSBhbmQgdGVzdCBkaWQgbm90IGZhaWxcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5zZWxlbml1bVBpZCAmJiAoIXN0YXR1cyB8fCAnRkFJTEVEJyAhPT0gc3RhdHVzLnRvVXBwZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWNTeW5jKCd0YXNra2lsbCAvSU0gY2hyb21lZHJpdmVyLmV4ZSAvRicsIHsgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXSB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBncmVwUmVzdWx0ID0gZXhlY1N5bmMoXCJwZ3JlcCAtZCcgJyBjaHJvbWVkcml2ZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBncmVwUmVzdWx0ICYmIHBncmVwUmVzdWx0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBncmVwUmVzdWx0ID0gcGdyZXBSZXN1bHQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBncmVwUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjU3luYygna2lsbCAtOSAnICsgcGdyZXBSZXN1bHQsIHsgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjbGVhbnVwIGVkZ2Vkcml2ZXIncyBvbmx5IHdoZW4gcnVubmluZyBmcm9tIHdpdGhpbiB0aGUgSURFIGFuZCB0ZXN0IGRpZCBub3QgZmFpbFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnNlbGVuaXVtUGlkICYmICghc3RhdHVzIHx8ICdGQUlMRUQnICE9PSBzdGF0dXMudG9VcHBlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGZvciBub3dcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBncmVwUmVzdWx0ID0gZXhlY1N5bmMoXCJwZ3JlcCAtZCcgJyBtc2VkZ2Vkcml2ZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBncmVwUmVzdWx0ICYmIHBncmVwUmVzdWx0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBncmVwUmVzdWx0ID0gcGdyZXBSZXN1bHQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBncmVwUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjU3luYygna2lsbCAtOSAnICsgcGdyZXBSZXN1bHQsIHsgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl93aGVuV2ViTW9kdWxlRGlzcG9zZS5yZXNvbHZlKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIF9pdGVyYXRpb25TdGFydCgpIHtcclxuICAgICAgICAvLyBjbGVhciB0cmFuc2FjdGlvbiBuYW1lIHNhdmVkIGluIHByZXZpb3VzIGl0ZXJhdGlvbiBpZiBhbnlcclxuICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9pdGVyYXRpb25FbmQoZXJyb3IpIHtcclxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLlNFTEVOSVVNX1NFU1NJT05fVElNRU9VVCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVuaXVtU2Vzc2lvblRpbWVvdXQgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbGxlY3QgYnJvd3NlciBsb2dzIGZvciB0aGlzIHNlc3Npb25cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbGxlY3RCcm93c2VyTG9ncyA9PT0gdHJ1ZSAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dzID0gYXdhaXQgdGhpcy5nZXRCcm93c2VyTG9ncygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ3MgJiYgQXJyYXkuaXNBcnJheShsb2dzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGxvZyBvZiBsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnMubG9ncy5wdXNoKHRoaXMuX2FkanVzdEJyb3dzZXJMb2cobG9nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IHJldHJpZXZlIGJyb3dzZXIgbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPOiBzaG91bGQgY2xlYXIgdHJhbnNhY3Rpb25zIHRvIGF2b2lkIGR1cGxpY2F0ZSBuYW1lcyBhY3Jvc3MgaXRlcmF0aW9uc1xyXG4gICAgICAgIC8vIGFsc28gc2hvdWxkIHRocm93IG9uIGR1cGxpY2F0ZSBuYW1lcy5cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIG5vIHRyYW5zYWN0aW9ucyBzZXQgaWYgdGVzdCBmYWlscyBiZWZvcmUgd2ViLnRyYW5zYWN0aW9uIGNvbW1hbmRcclxuICAgICAgICAgICAgaWYgKGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnNbZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lXSA9IGF3YWl0IHRoaXMuX2dldEhBUigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJzLmhhciA9IHRoaXMudHJhbnNhY3Rpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIF9pc0FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIEFDVElPTl9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBfdGFrZVNjcmVlbnNob3RTaWxlbnQobmFtZSkge1xyXG4gICAgICAgIGlmICghTk9fU0NSRUVOU0hPVF9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3I7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci50YWtlU2NyZWVuc2hvdFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldHZhbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYWxsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRVbnRpbFJldFZhbCA9IHRoaXMuZHJpdmVyLndhaXRVbnRpbChhc3luYygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1hZ2VzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCAoc2NyZWVuc2hvdCBhbmQgdGl0bGUpIGltYWdlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVzID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0V2luZG93SGFuZGxlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGhhbmRsZXMpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZSBvZiBoYW5kbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc3dpdGNoVG9XaW5kb3coaGFuZGxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuZHJpdmVyLnRha2VTY3JlZW5zaG90KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRUaXRsZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFRvSW1hZ2UgPSByZXF1aXJlKCcuLi9saWIvdGV4dC10by1pbWFnZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGVJbWFnZSA9IGF3YWl0IHRleHRUb0ltYWdlLmdlbmVyYXRlKHRpdGxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlSW1hZ2UgJiYgdHlwZW9mIHRpdGxlSW1hZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUltYWdlID0gdGl0bGVJbWFnZS5yZXBsYWNlKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsJywgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2godGl0bGVJbWFnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKGltYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGltYWdlcyBpbnRvIG9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWRJbWFnZSA9IGF3YWl0IG1lcmdlSW1hZ2VzKGltYWdlcywgeyBkaXJlY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXJnZWRJbWFnZSAmJiB0eXBlb2YgbWVyZ2VkSW1hZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBtZXJnZWRJbWFnZS5yZXBsYWNlKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcsICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0aW1lb3V0OiAzMCoxMDAwIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0VW50aWxSZXRWYWwgJiYgd2FpdFVudGlsUmV0VmFsLnRoZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0VW50aWxSZXRWYWwudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc2NyZWVuc2hvdCcsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QnLCBlKTtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QgaW5uZXIgZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfYWRqdXN0QnJvd3NlckxvZyhsb2cpIHtcclxuICAgICAgICBpZiAoIWxvZyB8fCB0eXBlb2YgbG9nICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETzogY29udmVydCBsb2cudGltZXN0YW1wIGZyb20gdGhlIGJyb3dzZXIgdGltZSB6b25lIHRvIHRoZSBsb2NhbCBvbmUgKHNvIHdlIGNhbiBsYXRlciBjb3JyZWxhdGUgYmV0d2VlbiBzdGVwcyBhbmQgbG9ncylcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0aW1lOiBsb2cudGltZXN0YW1wLFxyXG4gICAgICAgICAgICBtc2c6IGxvZy5tZXNzYWdlLFxyXG4gICAgICAgICAgICAvLyBjb252ZXJ0IFNFVkVSRSBsb2cgbGV2ZWwgdG8gRVJST1JcclxuICAgICAgICAgICAgbGV2ZWw6IGxvZy5sZXZlbCA9PT0gJ1NFVkVSRScgPyAnRVJST1InIDogbG9nLmxldmVsLFxyXG4gICAgICAgICAgICBzcmM6ICdicm93c2VyJ1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIEZJWE1FOiBUaGVyZSBpcyBhIGJ1ZyB3aXRoIElFLiBTZWUgdGhlIGNvbW1lbnQgd2l0aGluIGZ1bmN0aW9uIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogIGRvbUNvbnRlbnRMb2FkZWQgKGFrYSBGaXJzdCBWaXN1YWwgVGltZSktIFJlcHJlc2VudHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCBhbmQgbmF2aWdhdGlvblN0YXJ0LlxyXG4gICAgICogIGxvYWQgKGFrYSBGdWxsIExvYWQgVGltZSkgICAgICAgICAgICAgICAtIFJlcHJlc2VudHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBsb2FkRXZlbnRTdGFydCBhbmQgbmF2aWdhdGlvblN0YXJ0LlxyXG4gICAgICpcclxuICAgICAqIFRoZSBwcm9jZXNzaW5nIG1vZGVsOlxyXG4gICAgICpcclxuICAgICAqICAxLiBuYXZpZ2F0aW9uU3RhcnQgICAgICAgICAgICAgIC0gVGhlIGJyb3dzZXIgaGFzIHJlcXVlc3RlZCB0aGUgZG9jdW1lbnQuXHJcbiAgICAgKiAgMi4gLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAtIE5vdCByZWxldmFudCB0byB1cy4gU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL25hdmlnYXRpb24tdGltaW5nLyNwcm9jZXNzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxyXG4gICAgICogIDMuIGRvbUxvYWRpbmcgICAgICAgICAgICAgICAgICAgLSBUaGUgYnJvd3NlciBzdGFydHMgcGFyc2luZyB0aGUgZG9jdW1lbnQuXHJcbiAgICAgKiAgNC4gZG9tSW50ZXJhY3RpdmUgICAgICAgICAgICAgICAtIFRoZSBicm93c2VyIGhhcyBmaW5pc2hlZCBwYXJzaW5nIHRoZSBkb2N1bWVudCBhbmQgdGhlIHVzZXIgY2FuIGludGVyYWN0IHdpdGggdGhlIHBhZ2UuXHJcbiAgICAgKiAgNS4gZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgICAtIFRoZSBkb2N1bWVudCBoYXMgYmVlbiBjb21wbGV0ZWx5IGxvYWRlZCBhbmQgcGFyc2VkIGFuZCBkZWZlcnJlZCBzY3JpcHRzLCBpZiBhbnksIGhhdmUgZXhlY3V0ZWQuIFxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luYyBzY3JpcHRzLCBpZiBhbnksIG1pZ2h0IG9yIG1pZ2h0IG5vdCBoYXZlIGV4ZWN1dGVkLlxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHlsZXNoZWV0c1sxXSwgaW1hZ2VzLCBhbmQgc3ViZnJhbWVzIG1pZ2h0IG9yIG1pZ2h0IG5vdCBoYXZlIGZpbmlzaGVkIGxvYWRpbmcuXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzFdIC0gU3R5bGVzaGVldHMgL3VzdWFsbHkvIGRlZmVyIHRoaXMgZXZlbnQhIC0gaHR0cDovL21vbGlseS5kZS93ZWJsb2cvZG9tY29udGVudGxvYWRlZFxyXG4gICAgICogIDYuIGRvbUNvbnRlbnRMb2FkZWRFdmVudEVuZCAgICAgLSBUaGUgRE9NQ29udGVudExvYWRlZCBldmVudCBjYWxsYmFjaywgaWYgYW55LCBmaW5pc2hlZCBleGVjdXRpbmcuIEUuZy5cclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRPTSBmdWxseSBsb2FkZWQgYW5kIHBhcnNlZFwiKTtcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAqICA3LiBkb21Db21wbGV0ZSAgICAgICAgICAgICAgICAgIC0gVGhlIERPTSB0cmVlIGlzIGNvbXBsZXRlbHkgYnVpbHQuIEFzeW5jIHNjcmlwdHMsIGlmIGFueSwgaGF2ZSBleGVjdXRlZC5cclxuICAgICAqICA4LiBsb2FkRXZlbnRTdGFydCAgICAgICAgICAgICAgIC0gVGhlIGJyb3dzZXIgaGF2ZSBmaW5pc2hlZCBsb2FkaW5nIGFsbCB0aGUgcmVzb3VyY2VzIGxpa2UgaW1hZ2VzLCBzd2YsIGV0Yy5cclxuICAgICAqICA5LiBsb2FkRXZlbnRFbmQgICAgICAgICAgICAgICAgIC0gVGhlIGxvYWQgZXZlbnQgY2FsbGJhY2ssIGlmIGFueSwgZmluaXNoZWQgZXhlY3V0aW5nLlxyXG4gICAgICovXHJcbiAgICBfZ2V0U3RhdHMoY29tbWFuZE5hbWUpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZldGNoU3RhdHMgJiYgdGhpcy5pc0luaXRpYWxpemVkICYmIHRoaXMuX2lzQWN0aW9uKGNvbW1hbmROYW1lKSkge1xyXG4gICAgICAgICAgICB2YXIgbmF2aWdhdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICB2YXIgZG9tQ29udGVudExvYWRlZCA9IDA7XHJcbiAgICAgICAgICAgIHZhciBsb2FkID0gMDtcclxuICAgICAgICAgICAgdmFyIHNhbWVQYWdlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZm9sbG93aW5nIHNpdHVhdGlvbjpcclxuICAgICAgICAgICAgLy8gaWYgbmF2aWdhdGVTdGFydCBlcXVhbHMgdG8gdGhlIG9uZSB3ZSBnb3QgZnJvbSBwcmV2aW91cyBhdHRlbXB0ICh3ZSBuZWVkIHRvIHNhdmUgaXQpXHJcbiAgICAgICAgICAgIC8vIGl0IG1lYW5zIHdlIGFyZSBzdGlsbCBvbiB0aGUgc2FtZSBwYWdlIGFuZCBkb24ndCBuZWVkIHRvIHJlY29yZCBsb2FkL2RvbUNvbnRlbnRMb2FkZWQgdGltZXNcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNhbGwoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0RXJyb3IgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FpdFVudGlsUmV0VmFsID0gdGhpcy5kcml2ZXIud2FpdFVudGlsKGFzeW5jKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmdsb2JhbCB3aW5kb3cqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aW1pbmdzID0gYXdhaXQgdGhpcy5kcml2ZXIuZXhlY3V0ZShmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25TdGFydDogd2luZG93LnBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydDogd2luZG93LnBlcmZvcm1hbmNlLnRpbWluZy5kb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRFdmVudFN0YXJ0OiB3aW5kb3cucGVyZm9ybWFuY2UudGltaW5nLmxvYWRFdmVudFN0YXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVycm9yID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1pbmdzLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0ID4gMCAmJiB0aW1pbmdzLmxvYWRFdmVudFN0YXJ0ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lUGFnZSA9IHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgJiYgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9PSB0aW1pbmdzLm5hdmlnYXRpb25TdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvblN0YXJ0ID0gdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IHRpbWluZ3MubmF2aWdhdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgPSB0aW1pbmdzLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9hZEV2ZW50U3RhcnQgPSB0aW1pbmdzLmxvYWRFdmVudFN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tQ29udGVudExvYWRlZCA9IGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0IC0gbmF2aWdhdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkID0gbG9hZEV2ZW50U3RhcnQgLSBuYXZpZ2F0aW9uU3RhcnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgPiAwICYmIGxvYWRFdmVudFN0YXJ0ID4gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXhlY3V0ZUVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBlcnJvciBpbnNpZGUgZHJpdmVyLmV4ZWN1dGUgb3IgZHJpdmVyLndhaXRVbnRpbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFcnJvciA9IGV4ZWN1dGVFcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0aW1lb3V0OiAzMCoxMDAwIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhaXRVbnRpbFJldFZhbCAmJiB3YWl0VW50aWxSZXRWYWwudGhlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFVudGlsUmV0VmFsLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbnQgZXJyb3IgZnJvbSBkcml2ZXIuZXhlY3V0ZSBvciBkcml2ZXIud2FpdFVudGlsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxhc3RFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW50IGVycm9yIGZyb20gZHJpdmVyLmV4ZWN1dGUgb3IgZHJpdmVyLndhaXRVbnRpbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsYXN0RXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgICAgICAgICAgLy8gY291bGRuJ3QgZ2V0IHRpbWluZ3MuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgPSBuYXZpZ2F0aW9uU3RhcnQ7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc2FtZVBhZ2UgPyB7fSA6IHsgRG9tQ29udGVudExvYWRlZEV2ZW50OiBkb21Db250ZW50TG9hZGVkLCBMb2FkRXZlbnQ6IGxvYWQgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IE9wZW5zIG5ldyB0cmFuc2FjdGlvbi5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBUaGUgdHJhbnNhY3Rpb24gd2lsbCBwZXJzaXN0IHRpbGwgYSBuZXcgb25lIGlzIG9wZW5lZC4gVHJhbnNhY3Rpb24gbmFtZXMgbXVzdCBiZSB1bmlxdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gdHJhbnNhY3Rpb25cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIHRyYW5zYWN0aW9uIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHRyYW5zYWN0aW9uKG5hbWUpIHtcclxuICAgICAgICBpZiAoIW5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBqdXN0IGluIGNhc2UgdXNlciBwYXNzZWQgYSBjb21wbGV4IG9iamVjdCBieSBtaXN0YWtlXHJcbiAgICAgICAgbmFtZSA9IG5hbWUudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgaWYgKGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uc1tnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWVdID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVjb3JkSEFSICYmIHRoaXMuaXNJbml0aWFsaXplZCAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uc1tnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWVdID0gYXdhaXQgdGhpcy5fZ2V0SEFSKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc2FjdGlvbnNbbmFtZV0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ZXIgPSBPYmplY3Qua2V5cyh0aGlzLnRyYW5zYWN0aW9ucykuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnN0YXJ0c1dpdGgobmFtZSkpLmxlbmd0aCArIDE7XHJcbiAgICAgICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG5hbWUrJyAoIycrY291bnRlcisnKSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRIZWxwZXJGdW5jdGlvbnMoKSB7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldFdkaW9Mb2NhdG9yID0gbW9kVXRpbHMuZ2V0V2Rpb0xvY2F0b3I7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLm1hdGNoUGF0dGVybiA9IG1vZFV0aWxzLm1hdGNoUGF0dGVybjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0RWxlbWVudCA9IG1vZFV0aWxzLmdldEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldEVsZW1lbnRzID0gbW9kVXRpbHMuZ2V0RWxlbWVudHM7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldENoaWxkRWxlbWVudCA9IG1vZFV0aWxzLmdldENoaWxkRWxlbWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0Q2hpbGRFbGVtZW50cyA9IG1vZFV0aWxzLmdldENoaWxkRWxlbWVudHM7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLnNldFRpbWVvdXRJbXBsaWNpdCA9IG1vZFV0aWxzLnNldFRpbWVvdXRJbXBsaWNpdDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdCA9IG1vZFV0aWxzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50ID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmcgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE51bWJlciA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZTtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRCb29sID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRCb29sO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudFRpbWVvdXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50U3RyaW5nID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRTdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2dldEhBUigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlcyA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldExvZ1R5cGVzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZXMuaW5jbHVkZXMoJ3BlcmZvcm1hbmNlJykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRMb2dzKCdwZXJmb3JtYW5jZScpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGluIG9uZSBpbnN0YW5jZSwgbG9ncyB3YXMgbm90IGl0ZXJhYmxlIGZvciBzb21lIHJlYXNvbiAtIGhlbmNlIHRoZSBmb2xsb3dpbmcgY2hlY2s6XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvZ3MgfHwgdHlwZW9mIGxvZ3NbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdnZXRIQVI6IGxvZ3Mgbm90IGl0ZXJhYmxlOiAnICsgSlNPTi5zdHJpbmdpZnkobG9ncykpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbG9nIG9mIGxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2dPYmogPSBKU09OLnBhcnNlKGxvZy5tZXNzYWdlKTsgICAvLyByZXR1cm5lZCBhcyBzdHJpbmdcclxuICAgICAgICAgICAgICAgICAgICBldmVudHMucHVzaChtc2dPYmoubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgaGFyID0gaGFyRnJvbU1lc3NhZ2VzKGV2ZW50cyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoaGFyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5hYmxlIHRvIGZldGNoIEhBUjogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjaGVja1dhaXRGb3JBbmd1bGFyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmF1dG9XYWl0Rm9yQW5ndWxhcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JBbmd1bGFyKHRoaXMuYXV0b1dhaXRGb3JBbmd1bGFyUm9vdFNlbGVjdG9yLCB0aGlzLmF1dG9XYWl0Rm9yQW5ndWxhclRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfc2VuZFJlc3VsdFN0YXR1c1RvTGFtYmRhVGVzdChzdGF0dXMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsYW1iZGFDcmVkZW50aWFscyA9IHtcclxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLndkaW9PcHRzLnVzZXIsXHJcbiAgICAgICAgICAgICAgICBhY2Nlc3NLZXk6IHRoaXMud2Rpb09wdHMua2V5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHRoaXMuZHJpdmVyLnNlc3Npb25JZDtcclxuICAgICAgICAgICAgY29uc3QgbGFtYmRhQXV0b21hdGlvbkNsaWVudCA9IGxhbWJkYVJlc3RDbGllbnQuQXV0b21hdGlvbkNsaWVudChcclxuICAgICAgICAgICAgICAgIGxhbWJkYUNyZWRlbnRpYWxzXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzX2luZDogc3RhdHVzID09PSAnUEFTU0VEJyA/ICdwYXNzZWQnIDogJ2ZhaWxlZCdcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGxhbWJkYUF1dG9tYXRpb25DbGllbnQudXBkYXRlU2Vzc2lvbkJ5SWQoc2Vzc2lvbklkLCByZXF1ZXN0Qm9keSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gc2VuZCByZXN1bHQgc3RhdHVzIHRvIExhbWJkYVRlc3Q6ICcgKyBlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3NlbmRSZXN1bHRTdGF0dXNUb1Rlc3RpbmdCb3Qoc3RhdHVzKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5kcml2ZXIuc2Vzc2lvbklkO1xyXG4gICAgICAgICAgICBjb25zdCB0YiA9IG5ldyBUZXN0aW5nQm90KHtcclxuICAgICAgICAgICAgICAgIGFwaV9rZXk6IHRoaXMud2Rpb09wdHMudXNlcixcclxuICAgICAgICAgICAgICAgIGFwaV9zZWNyZXQ6IHRoaXMud2Rpb09wdHMua2V5XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCB0ZXN0RGF0YSA9IHsgXCJ0ZXN0W3N1Y2Nlc3NdXCIgOiBzdGF0dXMgPT09ICdQQVNTRUQnID8gXCIxXCIgOiBcIjBcIiB9O1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGIudXBkYXRlVGVzdCh0ZXN0RGF0YSwgc2Vzc2lvbklkLCBmdW5jdGlvbihlcnJvciwgdGVzdERldGFpbHMpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBzZW5kIHJlc3VsdCBzdGF0dXMgdG8gVGVzdGluZ0JvdDogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfc2VuZFJlc3VsdFN0YXR1c1RvQnJvd3NlcnN0YWNrKHN0YXR1cykge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgPT09ICdQQVNTRUQnID8gJ3Bhc3NlZCcgOiAnZmFpbGVkJ1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIHVybDogYGh0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20vYXV0b21hdGUvc2Vzc2lvbnMvJHt0aGlzLmRyaXZlci5zZXNzaW9uSWR9Lmpzb25gLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcclxuICAgICAgICAgICAgICAgIGpzb246IHRydWUsXHJcbiAgICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdEJvZHksXHJcbiAgICAgICAgICAgICAgICAnYXV0aCc6IHtcclxuICAgICAgICAgICAgICAgICAgICAndXNlcic6IHRoaXMud2Rpb09wdHMudXNlcixcclxuICAgICAgICAgICAgICAgICAgICAncGFzcyc6IHRoaXMud2Rpb09wdHMua2V5LFxyXG4gICAgICAgICAgICAgICAgICAgICdzZW5kSW1tZWRpYXRlbHknOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0KG9wdGlvbnMsIChlcnIsIHJlcywgYm9keSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHNlbmQgcmVzdWx0IHN0YXR1cyB0byBCcm93c2Vyc3RhY2s6ICcgKyBlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiJdfQ==
|
|
971
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS13ZWIuanMiXSwibmFtZXMiOlsiTU9EVUxFX05BTUUiLCJERUZBVUxUX1NFTEVOSVVNX1VSTCIsIkRFRkFVTFRfQlJPV1NFUl9OQU1FIiwiREVGQVVMVF9NT0JJTEVfQlJPV1NFUiIsIk5PX1NDUkVFTlNIT1RfQ09NTUFORFMiLCJBQ1RJT05fQ09NTUFORFMiLCJERUZBVUxUX1dBSVRfVElNRU9VVCIsIldlYk1vZHVsZSIsIldlYkRyaXZlck1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsInRyYW5zYWN0aW9ucyIsImxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lIiwiaGVscGVycyIsIl9sb2FkSGVscGVyRnVuY3Rpb25zIiwiT3hFcnJvciIsImVyckhlbHBlciIsIndhaXRGb3JUaW1lb3V0IiwibmFtZSIsImdldERyaXZlciIsImdldENhcGFiaWxpdGllcyIsImNhcHMiLCJpbml0Iiwic2VsZW5pdW1VcmwiLCJpc0luaXRpYWxpemVkIiwiYXBwaXVtVXJsIiwic3RhcnRzV2l0aCIsImN0eCIsImRlZmF1bHRCcm93c2VyIiwiYnJvd3Nlck5hbWUiLCJlcnJvckNvZGUiLCJJTlZBTElEX0NBUEFCSUxJVElFUyIsInRvTG93ZXJDYXNlIiwicmVjb3JkSEFSIiwiYnJvd3NlciIsInBlcmZvcm1hbmNlIiwidXJsIiwiVVJMIiwicGFyc2UiLCJwcm90b2NvbCIsInJlcGxhY2UiLCJob3N0IiwiaG9zdG5hbWUiLCJwb3J0IiwicGFyc2VJbnQiLCJwYXRoIiwicGF0aG5hbWUiLCJhdXRoIiwic3BsaXQiLCJ3ZGlvT3B0cyIsInVzZXIiLCJrZXkiLCJzZWxlbml1bVVybEJhc2UiLCJpc1J1bm5pbmdPblNlbGVub2lkIiwiX2lzU2VsZW5vaWRIdWIiLCJlbmFibGVWaWRlbyIsInVuZGVmaW5lZCIsInZpZGVvRnJhbWVSYXRlIiwiY2FwYWJpbGl0aWVzIiwibG9nTGV2ZWwiLCJydW5uZXIiLCJ3YWl0Zm9yVGltZW91dCIsImNvbm5lY3Rpb25SZXRyeVRpbWVvdXQiLCJjb25uZWN0aW9uUmV0cnlDb3VudCIsImluaXRFcnJvciIsIl90aGlzIiwicHJvdmlkZXIiLCJtb2RVdGlscyIsImRldGVybWluZVByb3ZpZGVyIiwiUEVSRkVDVE8iLCJvcGVuRGV2aWNlVGltZW91dCIsImRyaXZlciIsIndkaW8iLCJyZW1vdGUiLCJzZXNzaW9uSWQiLCJzZWxlbml1bUJyb3dzZXJUaW1lb3V0Iiwic2VsZW5pdW1UaW1lb3V0IiwicGVyZmVjdG9FeGVjdXRpb25Db250ZXh0IiwicGVyZmVjdG9SZXBvcnRpbmciLCJQZXJmZWN0byIsIlBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCIsIndlYmRyaXZlciIsImV4ZWN1dGVTY3JpcHQiLCJjb21tYW5kIiwicGFyYW1zIiwiZXhlY3V0ZSIsInJlcG9ydGluZ0NsaWVudCIsIlBlcmZlY3RvUmVwb3J0aW5nQ2xpZW50IiwidGVzdFN0YXJ0IiwiZSIsImdldFNlbGVuaXVtSW5pdEVycm9yIiwiY29sbGVjdEJyb3dzZXJMb2dzIiwiZ2V0QnJvd3NlckxvZ3MiLCJlcnJvciIsIkxBTUJEQVRFU1QiLCJCUk9XU0VSU1RBQ0siLCJpbmNsdWRlcyIsIm1heGltaXplV2luZG93Iiwic2V0VGltZW91dCIsImVyciIsIlVOS05PV05fRVJST1IiLCJtZXNzYWdlIiwidXRpbCIsImluc3BlY3QiLCJkaXNwb3NlIiwic3RhdHVzIiwiX3doZW5XZWJNb2R1bGVEaXNwb3NlIiwic3RlcHMiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJmYWlsZWRGaW5kZWQiLCJmaW5kIiwiaXRlbSIsInRvVXBwZXJDYXNlIiwiU0FVQ0VMQUJTIiwidXNlcm5hbWUiLCJhY2Nlc3NLZXkiLCJwYXNzZWQiLCJpZCIsImJvZHkiLCJteUFjY291bnQiLCJTYXVjZUxhYnMiLCJ1cGRhdGVKb2IiLCJzdG9wSm9iIiwiX3NlbmRSZXN1bHRTdGF0dXNUb0xhbWJkYVRlc3QiLCJkZWxldGVTZXNzaW9uIiwiVEVTVElOR0JPVCIsIl9zZW5kUmVzdWx0U3RhdHVzVG9UZXN0aW5nQm90IiwidGVzdFN0b3AiLCJDb25zdGFudHMiLCJyZXN1bHRzIiwiZmFpbGVkIiwiX3NlbmRSZXN1bHRTdGF0dXNUb0Jyb3dzZXJzdGFjayIsImNsb3NlQnJvd3NlcldpbmRvd3MiLCJkaXNwb3NlQ29udGludWUiLCJ3YXJuIiwicHJvbWlzZSIsInNlbGVuaXVtU2Vzc2lvblRpbWVvdXQiLCJzZWxlbml1bVBpZCIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsInN0ZGlvIiwicGdyZXBSZXN1bHQiLCJ0b1N0cmluZyIsInJlc29sdmUiLCJfaXRlcmF0aW9uU3RhcnQiLCJnbG9iYWwiLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsIl9pdGVyYXRpb25FbmQiLCJ0eXBlIiwiZXJyb3JIZWxwZXIiLCJTRUxFTklVTV9TRVNTSU9OX1RJTUVPVVQiLCJsb2dzIiwibG9nIiwicHVzaCIsIl9hZGp1c3RCcm93c2VyTG9nIiwiX2dldEhBUiIsImhhciIsImhhc0ZhaWxlZCIsIl9hZGRTZWxlbm9pZFZpZGVvQXNUZXN0QXR0YWNobWVudCIsIl9pc0FjdGlvbiIsIl90YWtlU2NyZWVuc2hvdFNpbGVudCIsInRha2VTY3JlZW5zaG90IiwicmV0dmFsIiwiY2FsbCIsIlByb21pc2UiLCJyZWplY3QiLCJ3YWl0VW50aWxSZXRWYWwiLCJ3YWl0VW50aWwiLCJpbWFnZXMiLCJoYW5kbGVzIiwiZ2V0V2luZG93SGFuZGxlcyIsImhhbmRsZSIsInN3aXRjaFRvV2luZG93IiwiaW1hZ2UiLCJ0aXRsZSIsImdldFRpdGxlIiwidGV4dFRvSW1hZ2UiLCJyZXF1aXJlIiwidGl0bGVJbWFnZSIsImdlbmVyYXRlIiwibWVyZ2VkSW1hZ2UiLCJkaXJlY3Rpb24iLCJ0aW1lb3V0IiwidGhlbiIsImNhdGNoIiwidGltZSIsInRpbWVzdGFtcCIsIm1zZyIsImxldmVsIiwic3JjIiwiX2dldFN0YXRzIiwiY29tbWFuZE5hbWUiLCJmZXRjaFN0YXRzIiwibmF2aWdhdGlvblN0YXJ0IiwiZG9tQ29udGVudExvYWRlZCIsImxvYWQiLCJzYW1lUGFnZSIsImxhc3RFcnJvciIsInRpbWluZ3MiLCJ3aW5kb3ciLCJ0aW1pbmciLCJkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCIsImxvYWRFdmVudFN0YXJ0IiwiZXhlY3V0ZUVycm9yIiwiY29uc29sZSIsIkRvbUNvbnRlbnRMb2FkZWRFdmVudCIsIkxvYWRFdmVudCIsInRyYW5zYWN0aW9uIiwiY291bnRlciIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJnZXRXZGlvTG9jYXRvciIsIm1hdGNoUGF0dGVybiIsImdldEVsZW1lbnQiLCJnZXRFbGVtZW50cyIsImdldENoaWxkRWxlbWVudCIsImdldENoaWxkRWxlbWVudHMiLCJzZXRUaW1lb3V0SW1wbGljaXQiLCJyZXN0b3JlVGltZW91dEltcGxpY2l0IiwiYXNzZXJ0QXJndW1lbnQiLCJhc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nIiwiYXNzZXJ0QXJndW1lbnROdW1iZXIiLCJhc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlIiwiYXNzZXJ0QXJndW1lbnRCb29sIiwiYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWwiLCJhc3NlcnRBcmd1bWVudFRpbWVvdXQiLCJhc3NlcnRBcmd1bWVudFN0cmluZyIsInR5cGVzIiwiZ2V0TG9nVHlwZXMiLCJnZXRMb2dzIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJKU09OIiwic3RyaW5naWZ5IiwiZXZlbnRzIiwibXNnT2JqIiwiY2hlY2tXYWl0Rm9yQW5ndWxhciIsImF1dG9XYWl0Rm9yQW5ndWxhciIsIndhaXRGb3JBbmd1bGFyIiwiYXV0b1dhaXRGb3JBbmd1bGFyUm9vdFNlbGVjdG9yIiwiYXV0b1dhaXRGb3JBbmd1bGFyVGltZW91dCIsImxhbWJkYUNyZWRlbnRpYWxzIiwibGFtYmRhQXV0b21hdGlvbkNsaWVudCIsImxhbWJkYVJlc3RDbGllbnQiLCJBdXRvbWF0aW9uQ2xpZW50IiwicmVxdWVzdEJvZHkiLCJzdGF0dXNfaW5kIiwidXBkYXRlU2Vzc2lvbkJ5SWQiLCJ0YiIsIlRlc3RpbmdCb3QiLCJhcGlfa2V5IiwiYXBpX3NlY3JldCIsInRlc3REYXRhIiwidXBkYXRlVGVzdCIsInRlc3REZXRhaWxzIiwibWV0aG9kIiwianNvbiIsInJlamVjdFVuYXV0aG9yaXplZCIsInJlcyIsImluZGV4T2YiLCJ2aWRlb0ZpbGVVcmwiLCJmaWxlTmFtZSIsImF0dGFjaG1lbnRzIiwibmV3VmlkZW9BdHRhY2htZW50Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7OztBQUdBLE1BQU1BLFdBQVcsR0FBRyxLQUFwQjtBQUNBLE1BQU1DLG9CQUFvQixHQUFHLDhCQUE3QjtBQUNBLE1BQU1DLG9CQUFvQixHQUFHLFFBQTdCO0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUcsU0FBL0I7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxDQUFDLE1BQUQsRUFBUyxhQUFULENBQS9CO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLENBQUMsTUFBRCxFQUFTLE9BQVQsQ0FBeEI7QUFDQSxNQUFNQyxvQkFBb0IsR0FBRyxLQUFLLElBQWxDLEMsQ0FBbUQ7O0FBRXBDLE1BQU1DLFNBQU4sU0FBd0JDLHdCQUF4QixDQUF3QztBQUNuREMsRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVVDLE9B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OUcsSUFBcEIsQ0FBeUJ4RixlQUFTdU0sa0JBQVQsQ0FBNEJGLFFBQTVCLEVBQXNDRCxZQUF0QyxDQUF6QjtBQUNIOztBQTl6QmtEIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cclxuLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4ndXNlIHN0cmljdCc7XHJcbi8qKlxyXG4gKiBAbmFtZSB3ZWJcclxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGJyb3dzZXIgYXV0b21hdGlvbi5cclxuICogQHNhbXBsZSAqKk5vdGVzOioqICBcclxuICogICBcclxuICogQ29tbWFuZHMgd2hpY2ggb3BlcmF0ZSBvbiBlbGVtZW50cyBzdWNoIGFzIGNsaWNrLCBhc3NlcnQsIHdhaXRGb3IsIHR5cGUsIHNlbGVjdCwgYW5kIG90aGVycyB3aWxsIGF1dG9tYXRpY2FsbHkgd2FpdCBmb3IgYSBwZXJpb2Qgb2YgdGltZSBmb3IgdGhlIGVsZW1lbnQgdG8gYXBwZWFyIGluIERPTSBhbmQgYmVjb21lIHZpc2libGUuIEJ5IGRlZmF1bHQgdGhpcyBwZXJpb2QgZXF1YWxzIHRvIDYwIHNlY29uZHMsIGJ1dCBjYW4gYmUgY2hhbmdlZCB1c2luZyB0aGUgYHNldFRpbWVvdXRgY29tbWFuZC5cclxuICogICBcclxuICogKipTdHJpbmcgbWF0Y2hpbmcgcGF0dGVybnM6KiogXHJcbiAqIFxyXG4gKiAgQ29tbWFuZHMgd2hpY2ggZXhwZWN0IGEgc3RyaW5nIG1hdGNoaW5nIHBhdHRlcm4gaW4gdGhlaXIgYXJndW1lbnRzLCBzdXBwb3J0IGZvbGxvd2luZyBwYXR0ZXJucyB1bmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZTpcclxuICogXHJcbiAqICAqIGByZWdleDpQQVRURVJOYCAtIE1hdGNoIHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbi5cclxuICogICogYHJlZ2V4aTpQQVRURVJOYCAtIE1hdGNoIHVzaW5nIGNhc2UtaW5zZW5zaXRpdmUgcmVndWxhciBleHByZXNzaW9uLlxyXG4gKiAgKiBgZXhhY3Q6U1RSSU5HYCAtIE1hdGNoIHRoZSBzdHJpbmcgdmVyYmF0aW0uXHJcbiAqICAqIGBnbG9iOlBBVFRFUk5gIC0gTWF0Y2ggdXNpbmcgY2FzZS1pbnNlbnNpdGl2ZSBnbG9iIHBhdHRlcm4uIGA/YCB3aWxsIG1hdGNoIGFueSBzaW5nbGUgY2hhcmFjdGVyIGV4Y2VwdCBuZXcgbGluZSBcXChcXG5cXCkuIGAqYCB3aWxsIG1hdGNoIGFueSBzZXF1ZW5jZSBcXCgwIG9yIG1vcmVcXCkgb2YgY2hhcmFjdGVycyBleGNlcHQgbmV3IGxpbmUuIEVtcHR5ICAgICBQQVRURVJOIHdpbGwgbWF0Y2ggb25seSBvdGhlciBlbXB0eSBzdHJpbmdzLlxyXG4gKiAgKiBgUEFUVEVSTmAgLSBTYW1lIGFzIGdsb2IgbWF0Y2hpbmcuICBcclxuICpcclxuICogKipMb2NhdG9yczoqKiBcclxuICogXHJcbiAqICBDb21tYW5kcyB3aGljaCBleHBlY3QgYW4gZWxlbWVudCBsb2NhdG9yIGluIHRoZWlyIGFyZ3VtZW50cywgc3VwcG9ydCBmb2xsb3dpbmcgbG9jYXRvciB0eXBlcyB1bmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZTpcclxuICogXHJcbiAqICAqIGBpZD1JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIElEIGF0dHJpYnV0ZS5cclxuICogICogYGNzcz1DU1NfU0VMRUNUT1JgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGEgQ1NTIHNlbGVjdG9yLlxyXG4gKiAgKiBgbGluaz1URVhUYCAtIExvY2F0ZXMgbGluayBlbGVtZW50IHdob3NlIHZpc2libGUgdGV4dCBtYXRjaGVzIHRoZSBnaXZlbiBzdHJpbmcuXHJcbiAqICAqIGBsaW5rLWNvbnRhaW5zPVRFWFRgIC0gTG9jYXRlcyBsaW5rIGVsZW1lbnQgd2hvc2UgdmlzaWJsZSB0ZXh0IGNvbnRhaW5zIHRoZSBnaXZlbiBzdHJpbmcuXHJcbiAqICAqIGBuYW1lPU5BTUVgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBOQU1FIGF0dHJpYnV0ZS5cclxuICogICogYHRhZz1OQU1FYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgdGFnIG5hbWUuXHJcbiAqICAqIGAvWFBBVEhgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGFuIFhQYXRoIDEuMCBleHByZXNzaW9uLlxyXG4gKiAgKiBgKFhQQVRIKVtdYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhbiBYUGF0aCAxLjAgZXhwcmVzc2lvbi5cclxuICovXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBxdW90ZXMgKi9cclxuaW1wb3J0IHsgaGFyRnJvbU1lc3NhZ2VzIH0gZnJvbSAnY2hyb21lLWhhcic7XHJcbmltcG9ydCBVUkwgZnJvbSAndXJsJztcclxuaW1wb3J0ICogYXMgd2RpbyBmcm9tICd3ZWJkcml2ZXJpbyc7XHJcbmltcG9ydCBXZWJEcml2ZXJNb2R1bGUgZnJvbSAnLi4vY29yZS9XZWJEcml2ZXJNb2R1bGUnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5pbXBvcnQgbW9kVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCBlcnJIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCB1dGlsIGZyb20gJ3V0aWwnO1xyXG5pbXBvcnQgU2F1Y2VMYWJzIGZyb20gJ3NhdWNlbGFicyc7XHJcbmltcG9ydCBsYW1iZGFSZXN0Q2xpZW50IGZyb20gJ0BsYW1iZGF0ZXN0L25vZGUtcmVzdC1jbGllbnQnO1xyXG5pbXBvcnQgVGVzdGluZ0JvdCBmcm9tICd0ZXN0aW5nYm90LWFwaSc7XHJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XHJcbmltcG9ydCBwZXJmZWN0b1JlcG9ydGluZyBmcm9tICdwZXJmZWN0by1yZXBvcnRpbmcnO1xyXG5pbXBvcnQgcmVxdWVzdCBmcm9tICdyZXF1ZXN0JztcclxuaW1wb3J0IG1lcmdlSW1hZ2VzIGZyb20gJy4uL2xpYi9pbWctbWVyZ2UnO1xyXG5pbXBvcnQgZXJyb3JIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICd3ZWInO1xyXG5jb25zdCBERUZBVUxUX1NFTEVOSVVNX1VSTCA9ICdodHRwOi8vbG9jYWxob3N0OjQ0NDQvd2QvaHViJztcclxuY29uc3QgREVGQVVMVF9CUk9XU0VSX05BTUUgPSAnY2hyb21lJztcclxuY29uc3QgREVGQVVMVF9NT0JJTEVfQlJPV1NFUiA9ICdkZWZhdWx0JztcclxuY29uc3QgTk9fU0NSRUVOU0hPVF9DT01NQU5EUyA9IFsnaW5pdCcsICdhc3NlcnRBbGVydCddO1xyXG5jb25zdCBBQ1RJT05fQ09NTUFORFMgPSBbJ29wZW4nLCAnY2xpY2snXTtcclxuY29uc3QgREVGQVVMVF9XQUlUX1RJTUVPVVQgPSA2MCAqIDEwMDA7ICAgICAgICAgICAgLy8gZGVmYXVsdCA2MHMgd2FpdCB0aW1lb3V0XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJNb2R1bGUgZXh0ZW5kcyBXZWJEcml2ZXJNb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB7fTsgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24tPmhhciBkaWN0aW9uYXJ5XHJcbiAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzID0ge307XHJcbiAgICAgICAgdGhpcy5fbG9hZEhlbHBlckZ1bmN0aW9ucygpO1xyXG4gICAgICAgIC8vIHN1cHBvcnQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAoc29tZSBtb2R1bGUgY29tbWFuZHMgbWlnaHQgcmVmZXIgdG8gdGhpcy5PeEVycm9yIGFuZCB0aGlzLmVyckhlbHBlcilcclxuICAgICAgICB0aGlzLk94RXJyb3IgPSBPeEVycm9yO1xyXG4gICAgICAgIHRoaXMuZXJySGVscGVyID0gZXJySGVscGVyO1xyXG4gICAgICAgIC8vIGhvbGRzIGVsZW1lbnQgb3BlcmF0aW9uIHRpbWVvdXQgdmFsdWVcclxuICAgICAgICB0aGlzLndhaXRGb3JUaW1lb3V0ID0gREVGQVVMVF9XQUlUX1RJTUVPVVQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1PRFVMRV9OQU1FO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGdldERyaXZlclxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdW5kZXJseWluZyBXRElPIGRyaXZlci5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gV0RJTyBkcml2ZXIuXHJcbiAgICAgKi9cclxuICAgIGdldERyaXZlcigpIHtcclxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RHJpdmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0Q2FwYWJpbGl0aWVzXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGN1cnJlbnRseSBkZWZpbmVkIGNhcGFiaWxpdGllcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gQ3VycmVudCBjYXBhYmlsaXRpZXMgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRDYXBhYmlsaXRpZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FwcyB8fCBzdXBlci5nZXRDYXBhYmlsaXRpZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBpbml0XHJcbiAgICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBuZXcgU2VsZW5pdW0gc2Vzc2lvbi5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gY2FwcyAtIERlc2lyZWQgY2FwYWJpbGl0aWVzLiBJZiBub3Qgc3BlY2lmaWVkIGNhcGFiaWxpdGllcyB3aWxsIGJlIHRha2VuIGZyb20gc3VpdGUgZGVmaW5pdGlvbi5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gc2VsZW5pdW1VcmwgLSBSZW1vdGUgc2VydmVyIFVSTCAoZGVmYXVsdDogaHR0cDovL2xvY2FsaG9zdDo0NDQ0L3dkL2h1YikuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXQoY2Fwcywgc2VsZW5pdW1VcmwpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2VsZW5pdW1VcmwpIHtcclxuICAgICAgICAgICAgLy8gaWYgYXBwaXVtVXJsIHBvaW50cyB0byBhbiBleHRlcm5hbCBleGVjdXRpb24gZ3JpZCAoc3VjaCBhcyBCUylcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hcHBpdW1VcmwgJiYgIXRoaXMub3B0aW9ucy5hcHBpdW1Vcmwuc3RhcnRzV2l0aCgnaHR0cDovL2xvY2FsaG9zdCcpKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlbml1bVVybCA9IHRoaXMub3B0aW9ucy5hcHBpdW1Vcmw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlbml1bVVybCA9IHRoaXMub3B0aW9ucy5zZWxlbml1bVVybCB8fCBERUZBVUxUX1NFTEVOSVVNX1VSTDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gdGFrZSBjYXBhYmlsaXRpZXMgZWl0aGVyIGZyb20gaW5pdCBtZXRob2QgYXJndW1lbnQgb3IgZnJvbSBjb250ZXh0IHBhcmFtZXRlcnMgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvclxyXG4gICAgICAgIC8vIG1lcmdlIGNhcGFiaWxpdGllcyBmcm9tIGNvbnRleHQgYW5kIGZyb20gaW5pdCBmdW5jdGlvbiBhcmd1bWVudCwgZ2l2ZSBwcmVmZXJlbmNlIHRvIGNvbnRleHQtcGFzc2VkIGNhcGFiaWxpdGllc1xyXG4gICAgICAgIHRoaXMuY2FwcyA9IHt9O1xyXG4gICAgICAgIGlmICh0aGlzLmN0eC5jYXBzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FwcyA9IHsgLi4udGhpcy5jdHguY2FwcyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2Fwcykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMgPSB7IC4uLnRoaXMuY2FwcywgLi4uY2FwcyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcG9wdWxhdGUgYnJvd3Nlck5hbWUgY2FwcyBmcm9tIG9wdGlvbnMuIEZJWE1FOiB3aHkgaXMgdGhpcyBldmVuIG5lZWRlZD9cclxuICAgICAgICBsZXQgZGVmYXVsdEJyb3dzZXIgPSBmYWxzZTtcclxuICAgICAgICBpZiAoIXRoaXMuY2Fwcy5icm93c2VyTmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWUgfHwgREVGQVVMVF9CUk9XU0VSX05BTUU7XHJcbiAgICAgICAgICAgIGRlZmF1bHRCcm93c2VyID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRklYTUU6IHNoYWxsIHdlIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBicm93c2VyTmFtZSBpcyBub3Qgc3BlY2lmaWVkLCBuZWl0aGVyIGluIGNhcHMgbm9yIGluIG9wdGlvbnM/IVxyXG4gICAgICAgIGlmICghdGhpcy5jYXBzLmJyb3dzZXJOYW1lKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSU5WQUxJRF9DQVBBQklMSVRJRVMsXHJcbiAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIGluaXRpYWxpemUgYHdlYmAgbW9kdWxlIC0gYnJvd3Nlck5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGp1c3QgYnJvd3Nlck5hbWUtc1xyXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYnJvd3Nlck5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2llJykge1xyXG4gICAgICAgICAgICAvLyBJRSBpcyBzcGVjaWZpZWQgYXMgJ2llJyB0aHJvdWdoIHRoZSBjb21tYW5kIGxpbmUgYW5kIHBvc3NpYmx5IHN1aXRlc1xyXG4gICAgICAgICAgICAvLyBidXQgc2VsZW5pdW0gc3RhbmRhbG9uZSBzZXJ2ZXIgZXhwZWN0cyAnaW50ZXJuZXQgZXhwbG9yZXInXHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9ICdpbnRlcm5ldCBleHBsb3Jlcic7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcHNbJ2xhbWJkYTpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgLy8gbGFtYmRhdGVzdCBleHBlY3RzIG9yaWdpbmFsIGNhc2UgbmFtZXNcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2Fwc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIC8vIHBlcmZlY3RvTW9iaWxlIGV4cGVjdHMgb3JpZ2luYWwgY2FzZSBuYW1lc1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lICE9PSAnTWljcm9zb2Z0RWRnZScpIHtcclxuICAgICAgICAgICAgLy8gc2VsZW5pdW0gc3RhbmRhbG9uZSBzZXJ2ZXIgZXhwZWN0cyBhbGwgYnJvd3Nlck5hbWVzIHRvIGJlIGxvd2VyY2FzZVxyXG4gICAgICAgICAgICAvLyBleGNlcHQgXCJNaWNyb3NvZnRFZGdlXCJcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gdGhpcy5jYXBzLmJyb3dzZXJOYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGp1c3QgY2FwYWJpbGl0aWVzIHRvIGVuYWJsZSBjb2xsZWN0aW5nIGJyb3dzZXIgYW5kIHBlcmZvcm1hbmNlIHN0YXRzIGluIENocm9tZSBcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwc1snZ29vZzpsb2dnaW5nUHJlZnMnXSA9IHsgICAgIC8vIGZvciBDaHJvbWVEcml2ZXIgPj0gNzVcclxuICAgICAgICAgICAgICAgIGJyb3dzZXI6ICdBTEwnLFxyXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2U6ICdBTEwnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgIC8vIHNwZWNpZnlpbmcgdGhpcyBsZWFkcyBDaHJvbWUgNzcrIHRvIHJlZnVzZSBsb2FkaW5nXHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5sb2dnaW5nUHJlZnMgPSB7ICAgICAgICAgICAgIC8vIGZvciBDaHJvbWVEcml2ZXIgPCA3NVxyXG4gICAgICAgICAgICAgICAgYnJvd3NlcjogJ0FMTCcsXHJcbiAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZTogJ0FMTCdcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmNocm9tZU9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICBwZXJmTG9nZ2luZ1ByZWZzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlTmV0d29yazogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVQYWdlOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcG9wdWxhdGUgV0RJTyBvcHRpb25zXHJcbiAgICAgICAgY29uc3QgdXJsID0gVVJMLnBhcnNlKHNlbGVuaXVtVXJsIHx8IERFRkFVTFRfU0VMRU5JVU1fVVJMKTtcclxuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHVybC5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKTtcclxuICAgICAgICBjb25zdCBob3N0ID0gdXJsLmhvc3RuYW1lO1xyXG4gICAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludCh1cmwucG9ydCB8fCAocHJvdG9jb2wgPT09ICdodHRwcycgPyA0NDMgOiA4MCkpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB1cmwucGF0aG5hbWU7XHJcblxyXG4gICAgICAgIC8vIGF1dGggaXMgbmVlZGVkIG1vc3RseSBmb3IgY2xvdWQgcHJvdmlkZXJzIHN1Y2ggYXMgTGFtYmRhVGVzdFxyXG4gICAgICAgIGlmICh1cmwuYXV0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBhdXRoID0gdXJsLmF1dGguc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLndkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAgICAgdXNlcjogYXV0aFswXSxcclxuICAgICAgICAgICAgICAgIGtleTogYXV0aFsxXVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVuaXVtVXJsQmFzZSA9IGAke3Byb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fWA7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgc2VsZW5pdW0gaHViIGlzIGJhc2VkIG9uIFNlbGVub2lkLCB0aGVuIGVuYWJsZSB2aWRlbyByZWNvcmRpbmdcclxuICAgICAgICB0aGlzLmlzUnVubmluZ09uU2VsZW5vaWQgPSBhd2FpdCB0aGlzLl9pc1NlbGVub2lkSHViKHRoaXMuc2VsZW5pdW1VcmxCYXNlKTtcclxuICAgICAgICBpZiAodGhpcy5pc1J1bm5pbmdPblNlbGVub2lkKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jYXBzWydzZWxlbm9pZDpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2Fwc1snc2VsZW5vaWQ6b3B0aW9ucyddID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuY2Fwc1snc2VsZW5vaWQ6b3B0aW9ucyddLmVuYWJsZVZpZGVvID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2Fwc1snc2VsZW5vaWQ6b3B0aW9ucyddLmVuYWJsZVZpZGVvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2Fwc1snc2VsZW5vaWQ6b3B0aW9ucyddLnZpZGVvRnJhbWVSYXRlID0gNDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBnZW5lcmF0ZSBXZWJkcml2ZXIuaW8gb3B0aW9uc1xyXG4gICAgICAgIGNvbnN0IHdkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMud2Rpb09wdHMgfHwge30sXHJcbiAgICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbCxcclxuICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3QsXHJcbiAgICAgICAgICAgIHBvcnQ6IHBvcnQsXHJcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXHJcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogdGhpcy5jYXBzLFxyXG4gICAgICAgICAgICBsb2dMZXZlbDogJ3NpbGVudCcsXHJcbiAgICAgICAgICAgIHJ1bm5lcjogJ3JlcGwnLFxyXG4gICAgICAgICAgICB3YWl0Zm9yVGltZW91dDogNTAwMCwgLy8gaW5jcmVhc2UgdGhlIGRlZmF1bHQgMzAwMFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiAzMTAqMTAwMCxcclxuICAgICAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IDFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgaW5pdEVycm9yID0gbnVsbDtcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBtb2RVdGlscy5kZXRlcm1pbmVQcm92aWRlcih3ZGlvT3B0cyk7XHJcblxyXG4gICAgICAgIGlmIChwcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgd2Rpb09wdHMucGF0aCA9ICcvbmV4cGVyaWVuY2UvcGVyZmVjdG9tb2JpbGUvd2QvaHViJztcclxuICAgICAgICAgICAgd2Rpb09wdHMucG9ydCA9IDgwO1xyXG4gICAgICAgICAgICB3ZGlvT3B0cy5wcm90b2NvbCA9ICdodHRwJztcclxuICAgICAgICAgICAgd2Rpb09wdHMub3BlbkRldmljZVRpbWVvdXQgPSAxNTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuYW1lID0gJ25hbWUnO1xyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXVsnbmFtZSddKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2xhbWJkYTpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snbGFtYmRhOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWyd0ZXN0aW5nQm90Om9wdGlvbnMnXSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3Rlc3RpbmdCb3Q6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ11bJ25hbWUnXTtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzZXQgZGVmYXVsdCBicm93c2VyIGZvciBtb2JpbGUgd2ViIHRlc3RzLCBpZiBleGVjdXRlZCBhZ2FpbnN0IHJlbW90ZSBkZXZpY2VzIG9mIGEgY2xvdWQgcHJvdmlkZXJcclxuICAgICAgICBpZiAoZGVmYXVsdEJyb3dzZXIgJiYgcHJvdmlkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lID0gREVGQVVMVF9NT0JJTEVfQlJPV1NFUjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy53ZGlvT3B0cyA9IHdkaW9PcHRzO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyID0gYXdhaXQgd2Rpby5yZW1vdGUod2Rpb09wdHMpO1xyXG4gICAgICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHRoaXMuZHJpdmVyLnNlc3Npb25JZDtcclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIucHJvdmlkZXIgPSBwcm92aWRlcjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZW5pdW1Ccm93c2VyVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuc2VsZW5pdW1Ccm93c2VyVGltZW91dCA9IHRoaXMub3B0aW9ucy5zZWxlbml1bUJyb3dzZXJUaW1lb3V0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVuaXVtVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuc2VsZW5pdW1UaW1lb3V0ID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtVGltZW91dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5QRVJGRUNUTykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGVyZmVjdG9FeGVjdXRpb25Db250ZXh0ID0gYXdhaXQgbmV3IHBlcmZlY3RvUmVwb3J0aW5nLlBlcmZlY3RvLlBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCh7XHJcbiAgICAgICAgICAgICAgICAgICAgd2ViZHJpdmVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTY3JpcHQ6IGFzeW5jIChjb21tYW5kLCBwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRyaXZlci5leGVjdXRlKGNvbW1hbmQsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0aW5nQ2xpZW50ID0gbmV3IHBlcmZlY3RvUmVwb3J0aW5nLlBlcmZlY3RvLlBlcmZlY3RvUmVwb3J0aW5nQ2xpZW50KHBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlcG9ydGluZ0NsaWVudC50ZXN0U3RhcnQobmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJySGVscGVyLmdldFNlbGVuaXVtSW5pdEVycm9yKGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcmVzZXQgYnJvd3NlciBsb2dzIGlmIGF1dG8gY29sbGVjdCBsb2dzIG9wdGlvbiBpcyBlbmFibGVkXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsZWN0QnJvd3NlckxvZ3MgJiYgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID09PSAnY2hyb21lJykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgLy8gc2ltcGx5IGNhbGwgdGhpcyB0byBjbGVhciB0aGUgcHJldmlvdXMgbG9ncyBhbmQgc3RhcnQgdGhlIHRlc3Qgd2l0aCB0aGUgY2xlYW4gbG9nc1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRCcm93c2VyTG9ncygpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IHJldHJpZXZlIGJyb3dzZXIgbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgW21vZFV0aWxzLnByb3ZpZGVyLkxBTUJEQVRFU1QsIG1vZFV0aWxzLnByb3ZpZGVyLkJST1dTRVJTVEFDSywgbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE9dLmluY2x1ZGVzKHRoaXMuZHJpdmVyLnByb3ZpZGVyKVxyXG4gICAgICAgICAgICAgICAgLy9bJ01pY3Jvc29mdEVkZ2UnLCAnbXNlZGdlJywgJ0VkZ2UnLCAnSW50ZXJuZXQgRXhwbG9yZXInXS5pbmNsdWRlcyh0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgLy8gZG8gbm90IG1heGltaXplIHdpbmRvdyBpZiB0aGUgdGVzdCBpcyBleGVjdXRlZCBhZ2FpbnN0IGV4dGVybmFsIGNsb3VkIHByb3ZpZGVyIGluZnJhc3RydWN0dXJlXHJcbiAgICAgICAgICAgICAgICAvLyBhcyBtb3N0IG9mIGNsb3VkIHByb3ZpZGVycyBkbyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIG1heGltaXplIGJyb3dzZXIgd2luZG93XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5tYXhpbWl6ZVdpbmRvdygpO1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0IGluaXRpYWwgVGltZW91dFxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc2V0VGltZW91dCh7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2ltcGxpY2l0JzogdGhpcy53YWl0Rm9yVGltZW91dCxcclxuICAgICAgICAgICAgICAgICAgICAncGFnZUxvYWQnOiB0aGlzLndhaXRGb3JUaW1lb3V0XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5VTktOT1dOX0VSUk9SLCBlcnIubWVzc2FnZSwgdXRpbC5pbnNwZWN0KGVycikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5pbml0KHRoaXMuZHJpdmVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBkaXNwb3NlXHJcbiAgICAgKiBAc3VtbWFyeSBFbmRzIHRoZSBjdXJyZW50IHNlc3Npb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IHN0YXR1cyAtIFRlc3Qgc3RhdHVzLCBlaXRoZXIgYHBhc3NlZGAgb3IgYGZhaWxlZGAuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB7fTtcclxuICAgICAgICB0aGlzLl93aGVuV2ViTW9kdWxlRGlzcG9zZSA9IGRlZmVyKCk7XHJcblxyXG4gICAgICAgIGlmICghc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHN0YXR1cyA9ICdwYXNzZWQnO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucnMuc3RlcHMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnJzLnN0ZXBzKSAmJiB0aGlzLnJzLnN0ZXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZhaWxlZEZpbmRlZCA9IHRoaXMucnMuc3RlcHMuZmluZCgoaXRlbSkgPT4gaXRlbS5zdGF0dXMgPT09ICdmYWlsZWQnKTtcclxuICAgICAgICAgICAgICAgIGlmIChmYWlsZWRGaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnZmFpbGVkJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyICYmIHRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdHVzLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5TQVVDRUxBQlMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydzYXVjZTpvcHRpb25zJ11bJ3VzZXJuYW1lJ107XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzS2V5ID0gdGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3NhdWNlOm9wdGlvbnMnXVsnYWNjZXNzS2V5J107XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzc2VkID0gc3RhdHVzID09PSAnUEFTU0VEJztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuZHJpdmVyLnNlc3Npb25JZDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gXCJ7XFxcInBhc3NlZFxcXCI6XCIrcGFzc2VkK1wifVwiO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBteUFjY291bnQgPSBuZXcgU2F1Y2VMYWJzKHsgdXNlcjogdXNlcm5hbWUsIGtleTogYWNjZXNzS2V5fSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbXlBY2NvdW50LnVwZGF0ZUpvYih1c2VybmFtZSwgaWQsIGJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG15QWNjb3VudC5zdG9wSm9iKHVzZXJuYW1lLCBpZCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5MQU1CREFURVNUKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2VuZFJlc3VsdFN0YXR1c1RvTGFtYmRhVGVzdChzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuVEVTVElOR0JPVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NlbmRSZXN1bHRTdGF0dXNUb1Rlc3RpbmdCb3Qoc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXBvcnRpbmdDbGllbnQudGVzdFN0b3Aoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZWN0b1JlcG9ydGluZy5Db25zdGFudHMucmVzdWx0cy5wYXNzZWQgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZWN0b1JlcG9ydGluZy5Db25zdGFudHMucmVzdWx0cy5mYWlsZWRcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLkJST1dTRVJTVEFDSykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NlbmRSZXN1bHRTdGF0dXNUb0Jyb3dzZXJzdGFjayhzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbnVsbCAmJiBbJ1BBU1NFRCcsJ0ZBSUxFRCddLmluY2x1ZGVzKHN0YXR1cykpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsb3NlQnJvd3NlcldpbmRvd3Moc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FuY2VsZWQgb3Igb3RoZXIgc3RhdHVzXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ29udGludWUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybignRXJyb3IgZGlzcG9zaW5nIGRyaXZlcjogJywgZSk7ICAgIC8vIGlnbm9yZSBhbnkgZXJyb3JzIGF0IGRpc3Bvc2FsIHN0YWdlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VDb250aW51ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3doZW5XZWJNb2R1bGVEaXNwb3NlLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGVsZXRlU2Vzc2lvbigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIgJiYgdGhpcy5kcml2ZXIuZGVsZXRlU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZW5pdW1TZXNzaW9uVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZVNlc3Npb24gd2lsbCB0YWtlIDUgbWluIHRvIGNhbGxcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZGVsZXRlU2Vzc2lvbiBlcnJvcicsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjbG9zZUJyb3dzZXJXaW5kb3dzKHN0YXR1cykge1xyXG4gICAgICAgIGlmIChzdGF0dXMgJiYgJ0ZBSUxFRCcgPT09IHN0YXR1cy50b1VwcGVyQ2FzZSgpICYmIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc2VsZW5pdW1QaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ29udGludWUoc3RhdHVzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ29udGludWUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcG9zZUNvbnRpbnVlKHN0YXR1cykge1xyXG4gICAgICAgIHRoaXMuZHJpdmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gbnVsbDtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcblxyXG4gICAgICAgIC8vIGNsZWFudXAgY2hyb21lZHJpdmVyJ3Mgb25seSB3aGVuIHJ1bm5pbmcgZnJvbSB3aXRoaW4gdGhlIElERSBhbmQgdGVzdCBkaWQgbm90IGZhaWxcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5zZWxlbml1bVBpZCAmJiAoIXN0YXR1cyB8fCAnRkFJTEVEJyAhPT0gc3RhdHVzLnRvVXBwZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWNTeW5jKCd0YXNra2lsbCAvSU0gY2hyb21lZHJpdmVyLmV4ZSAvRicsIHsgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXSB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBncmVwUmVzdWx0ID0gZXhlY1N5bmMoXCJwZ3JlcCAtZCcgJyBjaHJvbWVkcml2ZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBncmVwUmVzdWx0ICYmIHBncmVwUmVzdWx0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBncmVwUmVzdWx0ID0gcGdyZXBSZXN1bHQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBncmVwUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjU3luYygna2lsbCAtOSAnICsgcGdyZXBSZXN1bHQsIHsgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjbGVhbnVwIGVkZ2Vkcml2ZXIncyBvbmx5IHdoZW4gcnVubmluZyBmcm9tIHdpdGhpbiB0aGUgSURFIGFuZCB0ZXN0IGRpZCBub3QgZmFpbFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnNlbGVuaXVtUGlkICYmICghc3RhdHVzIHx8ICdGQUlMRUQnICE9PSBzdGF0dXMudG9VcHBlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGZvciBub3dcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBncmVwUmVzdWx0ID0gZXhlY1N5bmMoXCJwZ3JlcCAtZCcgJyBtc2VkZ2Vkcml2ZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBncmVwUmVzdWx0ICYmIHBncmVwUmVzdWx0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBncmVwUmVzdWx0ID0gcGdyZXBSZXN1bHQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBncmVwUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjU3luYygna2lsbCAtOSAnICsgcGdyZXBSZXN1bHQsIHsgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl93aGVuV2ViTW9kdWxlRGlzcG9zZS5yZXNvbHZlKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIF9pdGVyYXRpb25TdGFydCgpIHtcclxuICAgICAgICAvLyBjbGVhciB0cmFuc2FjdGlvbiBuYW1lIHNhdmVkIGluIHByZXZpb3VzIGl0ZXJhdGlvbiBpZiBhbnlcclxuICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9pdGVyYXRpb25FbmQoZXJyb3IpIHtcclxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLlNFTEVOSVVNX1NFU1NJT05fVElNRU9VVCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVuaXVtU2Vzc2lvblRpbWVvdXQgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbGxlY3QgYnJvd3NlciBsb2dzIGZvciB0aGlzIHNlc3Npb25cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbGxlY3RCcm93c2VyTG9ncyA9PT0gdHJ1ZSAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dzID0gYXdhaXQgdGhpcy5nZXRCcm93c2VyTG9ncygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ3MgJiYgQXJyYXkuaXNBcnJheShsb2dzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGxvZyBvZiBsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnMubG9ncy5wdXNoKHRoaXMuX2FkanVzdEJyb3dzZXJMb2cobG9nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IHJldHJpZXZlIGJyb3dzZXIgbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPOiBzaG91bGQgY2xlYXIgdHJhbnNhY3Rpb25zIHRvIGF2b2lkIGR1cGxpY2F0ZSBuYW1lcyBhY3Jvc3MgaXRlcmF0aW9uc1xyXG4gICAgICAgIC8vIGFsc28gc2hvdWxkIHRocm93IG9uIGR1cGxpY2F0ZSBuYW1lcy5cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIG5vIHRyYW5zYWN0aW9ucyBzZXQgaWYgdGVzdCBmYWlscyBiZWZvcmUgd2ViLnRyYW5zYWN0aW9uIGNvbW1hbmRcclxuICAgICAgICAgICAgaWYgKGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnNbZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lXSA9IGF3YWl0IHRoaXMuX2dldEhBUigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJzLmhhciA9IHRoaXMudHJhbnNhY3Rpb25zO1xyXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZCA9IGVycm9yICE9PSB1bmRlZmluZWQgJiYgZXJyb3IgIT09IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYWRkU2VsZW5vaWRWaWRlb0FzVGVzdEF0dGFjaG1lbnQoaGFzRmFpbGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBfaXNBY3Rpb24obmFtZSkge1xyXG4gICAgICAgIHJldHVybiBBQ1RJT05fQ09NTUFORFMuaW5jbHVkZXMobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3Rha2VTY3JlZW5zaG90U2lsZW50KG5hbWUpIHtcclxuICAgICAgICBpZiAoIU5PX1NDUkVFTlNIT1RfQ09NTUFORFMuaW5jbHVkZXMobmFtZSkpIHtcclxuICAgICAgICAgICAgbGV0IGVycm9yO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIudGFrZVNjcmVlbnNob3RcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXR2YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FsbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0VW50aWxSZXRWYWwgPSB0aGlzLmRyaXZlci53YWl0VW50aWwoYXN5bmMoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltYWdlcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgKHNjcmVlbnNob3QgYW5kIHRpdGxlKSBpbWFnZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlcyA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldFdpbmRvd0hhbmRsZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShoYW5kbGVzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGUgb2YgaGFuZGxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnN3aXRjaFRvV2luZG93KGhhbmRsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCB0aGlzLmRyaXZlci50YWtlU2NyZWVuc2hvdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0VGl0bGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRUb0ltYWdlID0gcmVxdWlyZSgnLi4vbGliL3RleHQtdG8taW1hZ2UnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlSW1hZ2UgPSBhd2FpdCB0ZXh0VG9JbWFnZS5nZW5lcmF0ZSh0aXRsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aXRsZUltYWdlICYmIHR5cGVvZiB0aXRsZUltYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVJbWFnZSA9IHRpdGxlSW1hZ2UucmVwbGFjZSgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcsICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKHRpdGxlSW1hZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMucHVzaChpbWFnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIGFsbCBpbWFnZXMgaW50byBvbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkSW1hZ2UgPSBhd2FpdCBtZXJnZUltYWdlcyhpbWFnZXMsIHsgZGlyZWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVyZ2VkSW1hZ2UgJiYgdHlwZW9mIG1lcmdlZEltYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gbWVyZ2VkSW1hZ2UucmVwbGFjZSgnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdGltZW91dDogMzAqMTAwMCB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdFVudGlsUmV0VmFsICYmIHdhaXRVbnRpbFJldFZhbC50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFVudGlsUmV0VmFsLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QnLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzY3JlZW5zaG90JywgZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzY3JlZW5zaG90IGlubmVyIGVycm9yJywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2FkanVzdEJyb3dzZXJMb2cobG9nKSB7XHJcbiAgICAgICAgaWYgKCFsb2cgfHwgdHlwZW9mIGxvZyAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRPRE86IGNvbnZlcnQgbG9nLnRpbWVzdGFtcCBmcm9tIHRoZSBicm93c2VyIHRpbWUgem9uZSB0byB0aGUgbG9jYWwgb25lIChzbyB3ZSBjYW4gbGF0ZXIgY29ycmVsYXRlIGJldHdlZW4gc3RlcHMgYW5kIGxvZ3MpXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdGltZTogbG9nLnRpbWVzdGFtcCxcclxuICAgICAgICAgICAgbXNnOiBsb2cubWVzc2FnZSxcclxuICAgICAgICAgICAgLy8gY29udmVydCBTRVZFUkUgbG9nIGxldmVsIHRvIEVSUk9SXHJcbiAgICAgICAgICAgIGxldmVsOiBsb2cubGV2ZWwgPT09ICdTRVZFUkUnID8gJ0VSUk9SJyA6IGxvZy5sZXZlbCxcclxuICAgICAgICAgICAgc3JjOiAnYnJvd3NlcidcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgKiBGSVhNRTogVGhlcmUgaXMgYSBidWcgd2l0aCBJRS4gU2VlIHRoZSBjb21tZW50IHdpdGhpbiBmdW5jdGlvbiBib2R5LlxyXG4gICAgICpcclxuICAgICAqICBkb21Db250ZW50TG9hZGVkIChha2EgRmlyc3QgVmlzdWFsIFRpbWUpLSBSZXByZXNlbnRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgYW5kIG5hdmlnYXRpb25TdGFydC5cclxuICAgICAqICBsb2FkIChha2EgRnVsbCBMb2FkIFRpbWUpICAgICAgICAgICAgICAgLSBSZXByZXNlbnRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gbG9hZEV2ZW50U3RhcnQgYW5kIG5hdmlnYXRpb25TdGFydC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgcHJvY2Vzc2luZyBtb2RlbDpcclxuICAgICAqXHJcbiAgICAgKiAgMS4gbmF2aWdhdGlvblN0YXJ0ICAgICAgICAgICAgICAtIFRoZSBicm93c2VyIGhhcyByZXF1ZXN0ZWQgdGhlIGRvY3VtZW50LlxyXG4gICAgICogIDIuIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBOb3QgcmVsZXZhbnQgdG8gdXMuIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9uYXZpZ2F0aW9uLXRpbWluZy8jcHJvY2VzcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cclxuICAgICAqICAzLiBkb21Mb2FkaW5nICAgICAgICAgICAgICAgICAgIC0gVGhlIGJyb3dzZXIgc3RhcnRzIHBhcnNpbmcgdGhlIGRvY3VtZW50LlxyXG4gICAgICogIDQuIGRvbUludGVyYWN0aXZlICAgICAgICAgICAgICAgLSBUaGUgYnJvd3NlciBoYXMgZmluaXNoZWQgcGFyc2luZyB0aGUgZG9jdW1lbnQgYW5kIHRoZSB1c2VyIGNhbiBpbnRlcmFjdCB3aXRoIHRoZSBwYWdlLlxyXG4gICAgICogIDUuIGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0ICAgLSBUaGUgZG9jdW1lbnQgaGFzIGJlZW4gY29tcGxldGVseSBsb2FkZWQgYW5kIHBhcnNlZCBhbmQgZGVmZXJyZWQgc2NyaXB0cywgaWYgYW55LCBoYXZlIGV4ZWN1dGVkLiBcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmMgc2NyaXB0cywgaWYgYW55LCBtaWdodCBvciBtaWdodCBub3QgaGF2ZSBleGVjdXRlZC5cclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVzaGVldHNbMV0sIGltYWdlcywgYW5kIHN1YmZyYW1lcyBtaWdodCBvciBtaWdodCBub3QgaGF2ZSBmaW5pc2hlZCBsb2FkaW5nLlxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXSAtIFN0eWxlc2hlZXRzIC91c3VhbGx5LyBkZWZlciB0aGlzIGV2ZW50ISAtIGh0dHA6Ly9tb2xpbHkuZGUvd2VibG9nL2RvbWNvbnRlbnRsb2FkZWRcclxuICAgICAqICA2LiBkb21Db250ZW50TG9hZGVkRXZlbnRFbmQgICAgIC0gVGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgY2FsbGJhY2ssIGlmIGFueSwgZmluaXNoZWQgZXhlY3V0aW5nLiBFLmcuXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJET00gZnVsbHkgbG9hZGVkIGFuZCBwYXJzZWRcIik7XHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgKiAgNy4gZG9tQ29tcGxldGUgICAgICAgICAgICAgICAgICAtIFRoZSBET00gdHJlZSBpcyBjb21wbGV0ZWx5IGJ1aWx0LiBBc3luYyBzY3JpcHRzLCBpZiBhbnksIGhhdmUgZXhlY3V0ZWQuXHJcbiAgICAgKiAgOC4gbG9hZEV2ZW50U3RhcnQgICAgICAgICAgICAgICAtIFRoZSBicm93c2VyIGhhdmUgZmluaXNoZWQgbG9hZGluZyBhbGwgdGhlIHJlc291cmNlcyBsaWtlIGltYWdlcywgc3dmLCBldGMuXHJcbiAgICAgKiAgOS4gbG9hZEV2ZW50RW5kICAgICAgICAgICAgICAgICAtIFRoZSBsb2FkIGV2ZW50IGNhbGxiYWNrLCBpZiBhbnksIGZpbmlzaGVkIGV4ZWN1dGluZy5cclxuICAgICAqL1xyXG4gICAgX2dldFN0YXRzKGNvbW1hbmROYW1lKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mZXRjaFN0YXRzICYmIHRoaXMuaXNJbml0aWFsaXplZCAmJiB0aGlzLl9pc0FjdGlvbihjb21tYW5kTmFtZSkpIHtcclxuICAgICAgICAgICAgdmFyIG5hdmlnYXRpb25TdGFydDtcclxuICAgICAgICAgICAgdmFyIGRvbUNvbnRlbnRMb2FkZWQgPSAwO1xyXG4gICAgICAgICAgICB2YXIgbG9hZCA9IDA7XHJcbiAgICAgICAgICAgIHZhciBzYW1lUGFnZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZvbGxvd2luZyBzaXR1YXRpb246XHJcbiAgICAgICAgICAgIC8vIGlmIG5hdmlnYXRlU3RhcnQgZXF1YWxzIHRvIHRoZSBvbmUgd2UgZ290IGZyb20gcHJldmlvdXMgYXR0ZW1wdCAod2UgbmVlZCB0byBzYXZlIGl0KVxyXG4gICAgICAgICAgICAvLyBpdCBtZWFucyB3ZSBhcmUgc3RpbGwgb24gdGhlIHNhbWUgcGFnZSBhbmQgZG9uJ3QgbmVlZCB0byByZWNvcmQgbG9hZC9kb21Db250ZW50TG9hZGVkIHRpbWVzXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYWxsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdEVycm9yID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRVbnRpbFJldFZhbCA9IHRoaXMuZHJpdmVyLndhaXRVbnRpbChhc3luYygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypnbG9iYWwgd2luZG93Ki9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGltaW5ncyA9IGF3YWl0IHRoaXMuZHJpdmVyLmV4ZWN1dGUoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uU3RhcnQ6IHdpbmRvdy5wZXJmb3JtYW5jZS50aW1pbmcubmF2aWdhdGlvblN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQ6IHdpbmRvdy5wZXJmb3JtYW5jZS50aW1pbmcuZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkRXZlbnRTdGFydDogd2luZG93LnBlcmZvcm1hbmNlLnRpbWluZy5sb2FkRXZlbnRTdGFydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFcnJvciA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltaW5ncy5kb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCA+IDAgJiYgdGltaW5ncy5sb2FkRXZlbnRTdGFydCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZVBhZ2UgPSB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lICYmIHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgPT0gdGltaW5ncy5uYXZpZ2F0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25TdGFydCA9IHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgPSB0aW1pbmdzLm5hdmlnYXRpb25TdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0ID0gdGltaW5ncy5kb21Db250ZW50TG9hZGVkRXZlbnRTdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRFdmVudFN0YXJ0ID0gdGltaW5ncy5sb2FkRXZlbnRTdGFydDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbUNvbnRlbnRMb2FkZWQgPSBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCAtIG5hdmlnYXRpb25TdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCA9IGxvYWRFdmVudFN0YXJ0IC0gbmF2aWdhdGlvblN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0ID4gMCAmJiBsb2FkRXZlbnRTdGFydCA+IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4ZWN1dGVFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgZXJyb3IgaW5zaWRlIGRyaXZlci5leGVjdXRlIG9yIGRyaXZlci53YWl0VW50aWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSBleGVjdXRlRXJyb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgdGltZW91dDogMzAqMTAwMCB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0VW50aWxSZXRWYWwgJiYgd2FpdFVudGlsUmV0VmFsLnRoZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRVbnRpbFJldFZhbC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW50IGVycm9yIGZyb20gZHJpdmVyLmV4ZWN1dGUgb3IgZHJpdmVyLndhaXRVbnRpbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsYXN0RXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmludCBlcnJvciBmcm9tIGRyaXZlci5leGVjdXRlIG9yIGRyaXZlci53YWl0VW50aWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobGFzdEVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcclxuICAgICAgICAgICAgICAgIC8vIGNvdWxkbid0IGdldCB0aW1pbmdzLlxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gbmF2aWdhdGlvblN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHNhbWVQYWdlID8ge30gOiB7IERvbUNvbnRlbnRMb2FkZWRFdmVudDogZG9tQ29udGVudExvYWRlZCwgTG9hZEV2ZW50OiBsb2FkIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBPcGVucyBuZXcgdHJhbnNhY3Rpb24uXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVGhlIHRyYW5zYWN0aW9uIHdpbGwgcGVyc2lzdCB0aWxsIGEgbmV3IG9uZSBpcyBvcGVuZWQuIFRyYW5zYWN0aW9uIG5hbWVzIG11c3QgYmUgdW5pcXVlLlxyXG4gICAgICogQGZ1bmN0aW9uIHRyYW5zYWN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRoZSB0cmFuc2FjdGlvbiBuYW1lLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB0cmFuc2FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgaWYgKCFuYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8ganVzdCBpbiBjYXNlIHVzZXIgcGFzc2VkIGEgY29tcGxleCBvYmplY3QgYnkgbWlzdGFrZVxyXG4gICAgICAgIG5hbWUgPSBuYW1lLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgIGlmIChnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUpIHtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnNbZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lXSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID09PSAnY2hyb21lJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnNbZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lXSA9IGF3YWl0IHRoaXMuX2dldEhBUigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNhY3Rpb25zW25hbWVdICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICBjb25zdCBjb3VudGVyID0gT2JqZWN0LmtleXModGhpcy50cmFuc2FjdGlvbnMpLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5zdGFydHNXaXRoKG5hbWUpKS5sZW5ndGggKyAxO1xyXG4gICAgICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBuYW1lKycgKCMnK2NvdW50ZXIrJyknO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG5hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkSGVscGVyRnVuY3Rpb25zKCkge1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRXZGlvTG9jYXRvciA9IG1vZFV0aWxzLmdldFdkaW9Mb2NhdG9yO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5tYXRjaFBhdHRlcm4gPSBtb2RVdGlscy5tYXRjaFBhdHRlcm47XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldEVsZW1lbnQgPSBtb2RVdGlscy5nZXRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRFbGVtZW50cyA9IG1vZFV0aWxzLmdldEVsZW1lbnRzO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRDaGlsZEVsZW1lbnQgPSBtb2RVdGlscy5nZXRDaGlsZEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldENoaWxkRWxlbWVudHMgPSBtb2RVdGlscy5nZXRDaGlsZEVsZW1lbnRzO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5zZXRUaW1lb3V0SW1wbGljaXQgPSBtb2RVdGlscy5zZXRUaW1lb3V0SW1wbGljaXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQgPSBtb2RVdGlscy5yZXN0b3JlVGltZW91dEltcGxpY2l0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZztcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnROdW1iZXIgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE51bWJlcjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmU7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Qm9vbCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Qm9vbDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWwgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0ID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudFN0cmluZyA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50U3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9nZXRIQVIoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgdHlwZXMgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRMb2dUeXBlcygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVzLmluY2x1ZGVzKCdwZXJmb3JtYW5jZScpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dzID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0TG9ncygncGVyZm9ybWFuY2UnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpbiBvbmUgaW5zdGFuY2UsIGxvZ3Mgd2FzIG5vdCBpdGVyYWJsZSBmb3Igc29tZSByZWFzb24gLSBoZW5jZSB0aGUgZm9sbG93aW5nIGNoZWNrOlxyXG4gICAgICAgICAgICAgICAgaWYgKCFsb2dzIHx8IHR5cGVvZiBsb2dzW1N5bWJvbC5pdGVyYXRvcl0gIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZ2V0SEFSOiBsb2dzIG5vdCBpdGVyYWJsZTogJyArIEpTT04uc3RyaW5naWZ5KGxvZ3MpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGxvZyBvZiBsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNnT2JqID0gSlNPTi5wYXJzZShsb2cubWVzc2FnZSk7ICAgLy8gcmV0dXJuZWQgYXMgc3RyaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzLnB1c2gobXNnT2JqLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGhhciA9IGhhckZyb21NZXNzYWdlcyhldmVudHMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGhhcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBmZXRjaCBIQVI6ICcgKyBlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY2hlY2tXYWl0Rm9yQW5ndWxhcigpIHtcclxuICAgICAgICBpZiAodGhpcy5hdXRvV2FpdEZvckFuZ3VsYXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQW5ndWxhcih0aGlzLmF1dG9XYWl0Rm9yQW5ndWxhclJvb3RTZWxlY3RvciwgdGhpcy5hdXRvV2FpdEZvckFuZ3VsYXJUaW1lb3V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3NlbmRSZXN1bHRTdGF0dXNUb0xhbWJkYVRlc3Qoc3RhdHVzKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbGFtYmRhQ3JlZGVudGlhbHMgPSB7XHJcbiAgICAgICAgICAgICAgICB1c2VybmFtZTogdGhpcy53ZGlvT3B0cy51c2VyLFxyXG4gICAgICAgICAgICAgICAgYWNjZXNzS2V5OiB0aGlzLndkaW9PcHRzLmtleVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSB0aGlzLmRyaXZlci5zZXNzaW9uSWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhbWJkYUF1dG9tYXRpb25DbGllbnQgPSBsYW1iZGFSZXN0Q2xpZW50LkF1dG9tYXRpb25DbGllbnQoXHJcbiAgICAgICAgICAgICAgICBsYW1iZGFDcmVkZW50aWFsc1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcclxuICAgICAgICAgICAgICAgIHN0YXR1c19pbmQ6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgPyAncGFzc2VkJyA6ICdmYWlsZWQnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBsYW1iZGFBdXRvbWF0aW9uQ2xpZW50LnVwZGF0ZVNlc3Npb25CeUlkKHNlc3Npb25JZCwgcmVxdWVzdEJvZHksIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHNlbmQgcmVzdWx0IHN0YXR1cyB0byBMYW1iZGFUZXN0OiAnICsgZS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zZW5kUmVzdWx0U3RhdHVzVG9UZXN0aW5nQm90KHN0YXR1cykge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHRoaXMuZHJpdmVyLnNlc3Npb25JZDtcclxuICAgICAgICAgICAgY29uc3QgdGIgPSBuZXcgVGVzdGluZ0JvdCh7XHJcbiAgICAgICAgICAgICAgICBhcGlfa2V5OiB0aGlzLndkaW9PcHRzLnVzZXIsXHJcbiAgICAgICAgICAgICAgICBhcGlfc2VjcmV0OiB0aGlzLndkaW9PcHRzLmtleVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgdGVzdERhdGEgPSB7IFwidGVzdFtzdWNjZXNzXVwiIDogc3RhdHVzID09PSAnUEFTU0VEJyA/IFwiMVwiIDogXCIwXCIgfTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRiLnVwZGF0ZVRlc3QodGVzdERhdGEsIHNlc3Npb25JZCwgZnVuY3Rpb24oZXJyb3IsIHRlc3REZXRhaWxzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gc2VuZCByZXN1bHQgc3RhdHVzIHRvIFRlc3RpbmdCb3Q6ICcgKyBlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3NlbmRSZXN1bHRTdGF0dXNUb0Jyb3dzZXJzdGFjayhzdGF0dXMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcclxuICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzID09PSAnUEFTU0VEJyA/ICdwYXNzZWQnIDogJ2ZhaWxlZCdcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICB1cmw6IGBodHRwczovL2FwaS5icm93c2Vyc3RhY2suY29tL2F1dG9tYXRlL3Nlc3Npb25zLyR7dGhpcy5kcml2ZXIuc2Vzc2lvbklkfS5qc29uYCxcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICAgICAgICAgICAgICBqc29uOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGJvZHk6IHJlcXVlc3RCb2R5LFxyXG4gICAgICAgICAgICAgICAgJ2F1dGgnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgJ3VzZXInOiB0aGlzLndkaW9PcHRzLnVzZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3Bhc3MnOiB0aGlzLndkaW9PcHRzLmtleSxcclxuICAgICAgICAgICAgICAgICAgICAnc2VuZEltbWVkaWF0ZWx5JzogZmFsc2VcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdChvcHRpb25zLCAoZXJyLCByZXMsIGJvZHkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBzZW5kIHJlc3VsdCBzdGF0dXMgdG8gQnJvd3NlcnN0YWNrOiAnICsgZS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9pc1NlbGVub2lkSHViKHNlbGVuaXVtVXJsKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIHVybDogYCR7c2VsZW5pdW1Vcmx9YCxcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgICAgICAgICBqc29uOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdChvcHRpb25zLCAoZXJyLCByZXMsIGJvZHkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHkgJiYgYm9keS5sZW5ndGggJiYgYm9keS5pbmRleE9mKCdZb3UgYXJlIHVzaW5nIFNlbGVub2lkJykgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gc2VuZCByZXN1bHQgc3RhdHVzIHRvIEJyb3dzZXJzdGFjazogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiB0aGUgdGVzdCBpcyBydW5uaW5nIGluc2lkZSBTZWxlbm9pZCwgdGhlbiBkb3dubG9hZCB0aGUgdmlkZW8gaWYgdGVzdCBoYXMgZmFpbGVkXHJcbiAgICBhc3luYyBfYWRkU2VsZW5vaWRWaWRlb0FzVGVzdEF0dGFjaG1lbnQoaGFzRmFpbGVkID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNSdW5uaW5nT25TZWxlbm9pZCB8fCAhaGFzRmFpbGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmlkZW9GaWxlVXJsID0gYCR7dGhpcy5zZWxlbml1bVVybEJhc2V9L3ZpZGVvLyR7dGhpcy5zZXNzaW9uSWR9Lm1wNGA7XHJcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBgJHt0aGlzLnNlc3Npb25JZH0ubXA0YDtcclxuICAgICAgICB0aGlzLnJzLmF0dGFjaG1lbnRzLnB1c2gobW9kVXRpbHMubmV3VmlkZW9BdHRhY2htZW50KGZpbGVOYW1lLCB2aWRlb0ZpbGVVcmwpKTtcclxuICAgIH1cclxufVxyXG5cclxuIl19
|