oxygen-cli 1.41.0 → 1.43.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 +16 -0
- package/build/core/OxygenCore.js +93 -283
- package/build/core/OxygenEvents.js +2 -12
- package/build/core/OxygenModule.js +1 -16
- package/build/core/OxygenService.js +1 -12
- package/build/core/OxygenSubModule.js +1 -10
- package/build/core/WebDriverModule.js +2 -32
- package/build/core/utils.js +22 -21
- package/build/errors/HookError.js +2 -8
- package/build/errors/ModuleError.js +2 -8
- package/build/errors/ModuleUnavailableError.js +1 -3
- package/build/errors/OxygenError.js +3 -36
- package/build/errors/ScriptNotFound.js +2 -8
- package/build/errors/helper.js +50 -82
- package/build/index.js +8 -22
- package/build/lib/cli-util.js +36 -105
- package/build/lib/cli.js +3 -30
- package/build/lib/debugger.js +2 -145
- package/build/lib/img-merge.js +2 -16
- package/build/lib/launcher.js +3 -31
- package/build/lib/moduleRequire.js +1 -4
- package/build/lib/parallel-launcher.js +44 -84
- package/build/lib/param-manager.js +2 -29
- package/build/lib/param-reader-csv.js +1 -15
- package/build/lib/param-reader-excel.js +1 -14
- package/build/lib/param-reader-json.js +1 -10
- package/build/lib/text-to-image.js +5 -26
- package/build/lib/util.js +13 -84
- package/build/model/case-result.js +1 -2
- package/build/model/failure.js +1 -2
- package/build/model/status.js +1 -2
- package/build/model/step-result.js +1 -2
- package/build/model/suite-result.js +1 -2
- package/build/model/test-result.js +1 -2
- package/build/model/testcase.js +1 -2
- package/build/model/testsuite.js +1 -2
- package/build/ox_modules/index.js +20 -41
- package/build/ox_modules/module-assert.js +9 -28
- package/build/ox_modules/module-date.js +3 -8
- package/build/ox_modules/module-db.js +8 -29
- package/build/ox_modules/module-email.js +14 -45
- package/build/ox_modules/module-eyes.js +6 -47
- package/build/ox_modules/module-http/ntlm-util.js +3 -7
- package/build/ox_modules/module-http/ntlm.js +9 -78
- package/build/ox_modules/module-http.js +69 -172
- package/build/ox_modules/module-log.js +10 -23
- package/build/ox_modules/module-mailinator.js +11 -33
- package/build/ox_modules/module-mob/commands/alertAccept.js +1 -3
- package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -3
- package/build/ox_modules/module-mob/commands/assertAlert.js +1 -7
- package/build/ox_modules/module-mob/commands/assertText.js +1 -4
- package/build/ox_modules/module-mob/commands/assertTitle.js +1 -5
- package/build/ox_modules/module-mob/commands/assertValue.js +9 -17
- package/build/ox_modules/module-mob/commands/back.js +1 -3
- package/build/ox_modules/module-mob/commands/clear.js +1 -5
- package/build/ox_modules/module-mob/commands/click.js +3 -5
- package/build/ox_modules/module-mob/commands/clickHidden.js +3 -10
- package/build/ox_modules/module-mob/commands/clickLong.js +1 -3
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -5
- package/build/ox_modules/module-mob/commands/closeApp.js +1 -3
- package/build/ox_modules/module-mob/commands/debug.js +2 -3
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -3
- package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -13
- package/build/ox_modules/module-mob/commands/execute.js +1 -3
- package/build/ox_modules/module-mob/commands/findElement.js +1 -4
- package/build/ox_modules/module-mob/commands/findElements.js +1 -5
- package/build/ox_modules/module-mob/commands/getAlertText.js +1 -3
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -3
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -11
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -3
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -3
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -10
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -3
- package/build/ox_modules/module-mob/commands/getLocation.js +1 -3
- package/build/ox_modules/module-mob/commands/getSource.js +1 -3
- package/build/ox_modules/module-mob/commands/getText.js +1 -5
- package/build/ox_modules/module-mob/commands/getTitle.js +1 -3
- package/build/ox_modules/module-mob/commands/getUrl.js +1 -3
- package/build/ox_modules/module-mob/commands/getValue.js +5 -10
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -3
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -3
- package/build/ox_modules/module-mob/commands/index.js +1 -148
- package/build/ox_modules/module-mob/commands/installApp.js +1 -3
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -3
- package/build/ox_modules/module-mob/commands/isCheckable.js +1 -3
- package/build/ox_modules/module-mob/commands/isChecked.js +1 -3
- package/build/ox_modules/module-mob/commands/isClickable.js +1 -3
- package/build/ox_modules/module-mob/commands/isExist.js +1 -4
- package/build/ox_modules/module-mob/commands/isSelected.js +1 -3
- package/build/ox_modules/module-mob/commands/isVisible.js +1 -4
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -3
- package/build/ox_modules/module-mob/commands/launchApp.js +1 -3
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -3
- package/build/ox_modules/module-mob/commands/open.js +1 -4
- package/build/ox_modules/module-mob/commands/pause.js +1 -3
- package/build/ox_modules/module-mob/commands/removeApp.js +1 -3
- package/build/ox_modules/module-mob/commands/resetApp.js +1 -3
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -7
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -3
- package/build/ox_modules/module-mob/commands/select.js +1 -5
- package/build/ox_modules/module-mob/commands/selectFrame.js +1 -5
- package/build/ox_modules/module-mob/commands/selectWindow.js +5 -27
- package/build/ox_modules/module-mob/commands/sendKeys.js +6 -10
- package/build/ox_modules/module-mob/commands/setContext.js +1 -3
- package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -3
- package/build/ox_modules/module-mob/commands/setTimeout.js +1 -3
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -7
- package/build/ox_modules/module-mob/commands/shake.js +1 -3
- package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -3
- package/build/ox_modules/module-mob/commands/smsGetText.js +3 -7
- package/build/ox_modules/module-mob/commands/swipe.js +1 -3
- package/build/ox_modules/module-mob/commands/swipeElement.js +1 -3
- package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -3
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -3
- package/build/ox_modules/module-mob/commands/tap.js +1 -3
- package/build/ox_modules/module-mob/commands/type.js +3 -8
- package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -11
- package/build/ox_modules/module-mob/commands/waitForExist.js +1 -3
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -4
- package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -3
- package/build/ox_modules/module-mob.js +107 -217
- package/build/ox_modules/module-mongo.js +14 -51
- package/build/ox_modules/module-pdf.js +24 -65
- package/build/ox_modules/module-proxy.js +9 -69
- package/build/ox_modules/module-serial.js +8 -33
- package/build/ox_modules/module-shell.js +10 -30
- package/build/ox_modules/module-soap.js +17 -52
- package/build/ox_modules/module-twilio.js +11 -54
- package/build/ox_modules/module-utils.js +22 -58
- package/build/ox_modules/module-web/commands/alertAccept.js +1 -3
- package/build/ox_modules/module-web/commands/alertDismiss.js +1 -3
- package/build/ox_modules/module-web/commands/assertAlert.js +1 -7
- package/build/ox_modules/module-web/commands/assertExist.js +1 -3
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -5
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -4
- package/build/ox_modules/module-web/commands/assertText.js +1 -4
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -7
- package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -7
- package/build/ox_modules/module-web/commands/assertTitle.js +1 -4
- package/build/ox_modules/module-web/commands/assertValue.js +1 -4
- package/build/ox_modules/module-web/commands/back.js +1 -3
- package/build/ox_modules/module-web/commands/clear.js +1 -6
- package/build/ox_modules/module-web/commands/click.js +4 -15
- package/build/ox_modules/module-web/commands/clickHidden.js +2 -8
- package/build/ox_modules/module-web/commands/closeWindow.js +1 -3
- package/build/ox_modules/module-web/commands/debug.js +2 -3
- package/build/ox_modules/module-web/commands/deleteCookies.js +1 -3
- package/build/ox_modules/module-web/commands/deselect.js +1 -3
- package/build/ox_modules/module-web/commands/doubleClick.js +3 -10
- package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -3
- package/build/ox_modules/module-web/commands/execute.js +1 -3
- package/build/ox_modules/module-web/commands/fileBrowse.js +4 -11
- package/build/ox_modules/module-web/commands/findElement.js +1 -4
- package/build/ox_modules/module-web/commands/findElements.js +1 -5
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -3
- package/build/ox_modules/module-web/commands/getAlertText.js +1 -3
- package/build/ox_modules/module-web/commands/getAttribute.js +1 -5
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -4
- package/build/ox_modules/module-web/commands/getCookies.js +1 -3
- package/build/ox_modules/module-web/commands/getCssValue.js +1 -5
- package/build/ox_modules/module-web/commands/getElementCount.js +1 -3
- package/build/ox_modules/module-web/commands/getHTML.js +1 -3
- package/build/ox_modules/module-web/commands/getSource.js +1 -3
- package/build/ox_modules/module-web/commands/getText.js +1 -5
- package/build/ox_modules/module-web/commands/getTitle.js +1 -3
- package/build/ox_modules/module-web/commands/getUrl.js +1 -3
- package/build/ox_modules/module-web/commands/getValue.js +1 -6
- package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -3
- package/build/ox_modules/module-web/commands/getWindowSize.js +1 -3
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -6
- package/build/ox_modules/module-web/commands/index.js +1 -184
- package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -3
- package/build/ox_modules/module-web/commands/isChecked.js +1 -3
- package/build/ox_modules/module-web/commands/isExist.js +1 -4
- package/build/ox_modules/module-web/commands/isInteractable.js +1 -3
- package/build/ox_modules/module-web/commands/isSelected.js +1 -3
- package/build/ox_modules/module-web/commands/isVisible.js +1 -4
- package/build/ox_modules/module-web/commands/makeVisible.js +2 -11
- package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -3
- package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -3
- package/build/ox_modules/module-web/commands/mock.js +1 -3
- package/build/ox_modules/module-web/commands/mockClearAll.js +1 -3
- package/build/ox_modules/module-web/commands/mockRestoreAll.js +1 -3
- package/build/ox_modules/module-web/commands/newWindow.js +1 -3
- package/build/ox_modules/module-web/commands/open.js +1 -5
- package/build/ox_modules/module-web/commands/pause.js +1 -3
- package/build/ox_modules/module-web/commands/point.js +1 -3
- package/build/ox_modules/module-web/commands/pointJS.js +2 -9
- package/build/ox_modules/module-web/commands/refresh.js +1 -3
- package/build/ox_modules/module-web/commands/rightClick.js +3 -9
- package/build/ox_modules/module-web/commands/rightClickActions.js +1 -3
- package/build/ox_modules/module-web/commands/scrollToElement.js +1 -3
- package/build/ox_modules/module-web/commands/select.js +1 -6
- package/build/ox_modules/module-web/commands/selectFrame.js +1 -4
- package/build/ox_modules/module-web/commands/selectWindow.js +5 -27
- package/build/ox_modules/module-web/commands/sendKeys.js +3 -7
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -3
- package/build/ox_modules/module-web/commands/setTimeout.js +1 -3
- package/build/ox_modules/module-web/commands/setWindowSize.js +1 -3
- package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -6
- package/build/ox_modules/module-web/commands/type.js +1 -6
- package/build/ox_modules/module-web/commands/verifyAlert.js +1 -7
- package/build/ox_modules/module-web/commands/verifyExist.js +2 -7
- package/build/ox_modules/module-web/commands/verifySelectedLabel.js +1 -5
- package/build/ox_modules/module-web/commands/verifySelectedValue.js +1 -4
- package/build/ox_modules/module-web/commands/verifyText.js +1 -4
- package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +1 -7
- package/build/ox_modules/module-web/commands/verifyTextPresent.js +1 -7
- package/build/ox_modules/module-web/commands/verifyTitle.js +1 -4
- package/build/ox_modules/module-web/commands/verifyValue.js +1 -4
- package/build/ox_modules/module-web/commands/waitForAngular.js +11 -14
- package/build/ox_modules/module-web/commands/waitForExist.js +1 -3
- package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -3
- package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -9
- package/build/ox_modules/module-web/commands/waitForNotText.js +1 -4
- package/build/ox_modules/module-web/commands/waitForNotValue.js +1 -4
- package/build/ox_modules/module-web/commands/waitForText.js +1 -4
- package/build/ox_modules/module-web/commands/waitForValue.js +1 -4
- package/build/ox_modules/module-web/commands/waitForVisible.js +1 -3
- package/build/ox_modules/module-web/commands/waitForWindow.js +4 -22
- package/build/ox_modules/module-web/webdriver/ChromeWDM.js +287 -0
- package/build/ox_modules/module-web/webdriver/auto-start.js +25 -0
- package/build/ox_modules/module-web.js +169 -233
- package/build/ox_modules/module-win/commands/assertText.js +1 -4
- package/build/ox_modules/module-win/commands/assertTitle.js +1 -5
- package/build/ox_modules/module-win/commands/assertValue.js +9 -17
- package/build/ox_modules/module-win/commands/back.js +1 -3
- package/build/ox_modules/module-win/commands/clear.js +1 -5
- package/build/ox_modules/module-win/commands/click.js +1 -3
- package/build/ox_modules/module-win/commands/clickLong.js +1 -3
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -5
- package/build/ox_modules/module-win/commands/findElement.js +1 -4
- package/build/ox_modules/module-win/commands/findElements.js +1 -5
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -3
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -3
- package/build/ox_modules/module-win/commands/getLocation.js +1 -3
- package/build/ox_modules/module-win/commands/getSource.js +1 -3
- package/build/ox_modules/module-win/commands/getText.js +1 -5
- package/build/ox_modules/module-win/commands/getValue.js +5 -10
- package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -3
- package/build/ox_modules/module-win/commands/index.js +1 -74
- package/build/ox_modules/module-win/commands/isCheckable.js +1 -3
- package/build/ox_modules/module-win/commands/isChecked.js +1 -3
- package/build/ox_modules/module-win/commands/isClickable.js +1 -3
- package/build/ox_modules/module-win/commands/isExist.js +1 -4
- package/build/ox_modules/module-win/commands/isSelected.js +1 -3
- package/build/ox_modules/module-win/commands/isVisible.js +1 -4
- package/build/ox_modules/module-win/commands/open.js +1 -3
- package/build/ox_modules/module-win/commands/pause.js +1 -3
- package/build/ox_modules/module-win/commands/rightClick.js +1 -3
- package/build/ox_modules/module-win/commands/selectWindow.js +1 -16
- package/build/ox_modules/module-win/commands/sendKeys.js +1 -5
- package/build/ox_modules/module-win/commands/setTimeout.js +1 -3
- package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -3
- package/build/ox_modules/module-win/commands/tap.js +1 -3
- package/build/ox_modules/module-win/commands/type.js +1 -5
- package/build/ox_modules/module-win/commands/waitForExist.js +1 -3
- package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -5
- package/build/ox_modules/module-win/commands/waitForVisible.js +1 -3
- package/build/ox_modules/module-win.js +54 -95
- package/build/ox_modules/utils.js +97 -79
- package/build/ox_reporters/reporter-excel.js +2 -59
- package/build/ox_reporters/reporter-html.js +2 -29
- package/build/ox_reporters/reporter-json.js +2 -15
- package/build/ox_reporters/reporter-junit.js +2 -25
- package/build/ox_reporters/reporter-pdf.js +2 -20
- package/build/ox_reporters/reporter-rp.js +4 -92
- package/build/ox_reporters/reporter-xml.js +2 -18
- package/build/ox_services/service-devtools/submodule-network.js +4 -86
- package/build/ox_services/service-devtools.js +2 -24
- package/build/reporter/FileReporterBase.js +6 -45
- package/build/reporter/ReportAggregator.js +7 -121
- package/build/reporter/ReporterBase.js +1 -6
- package/build/reporter/WebSocketReporter.js +1 -39
- package/build/runners/WorkerProcess.js +2 -107
- package/build/runners/cucumber/CucumberEventListener.js +4 -29
- package/build/runners/cucumber/CucumberReporter.js +2 -57
- package/build/runners/cucumber/CucumberWorker.js +3 -69
- package/build/runners/cucumber/index.js +2 -31
- package/build/runners/cucumber/worker.js +2 -19
- package/build/runners/index.js +4 -11
- package/build/runners/oxygen/OxygenWorker.js +3 -61
- package/build/runners/oxygen/index.js +18 -179
- package/build/runners/oxygen/worker.js +3 -27
- package/package.json +4 -1
|
@@ -4,17 +4,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
require("source-map-support/register");
|
|
9
|
-
|
|
10
8
|
var _ReporterBase = _interopRequireDefault(require("../reporter/ReporterBase"));
|
|
11
|
-
|
|
12
9
|
var _status = _interopRequireDefault(require("../model/status"));
|
|
13
|
-
|
|
14
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
11
|
const RPClient = require('@oxygenhq/rp-client-javascript');
|
|
17
|
-
|
|
18
12
|
const LAUNCH_MODES = {
|
|
19
13
|
DEFAULT: 'DEFAULT',
|
|
20
14
|
DEBUG: 'DEBUG'
|
|
@@ -25,7 +19,6 @@ const TEST_ITEM_TYPES = {
|
|
|
25
19
|
STEP: 'STEP'
|
|
26
20
|
};
|
|
27
21
|
const MAX_NAME_LENGTH = 128;
|
|
28
|
-
|
|
29
22
|
class ReportPortalReporter extends _ReporterBase.default {
|
|
30
23
|
constructor(options, reporterOpts, aggregator) {
|
|
31
24
|
super(options);
|
|
@@ -39,18 +32,15 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
39
32
|
this.cbCaseToCurrentTransactionId = {};
|
|
40
33
|
this.cbCaseToCurrentSubStepId = {};
|
|
41
34
|
this.promises = [];
|
|
42
|
-
|
|
43
35
|
if (!this.reporterOpts || !this.reporterOpts.apiKey || !this.reporterOpts.endpoint || !this.reporterOpts.project) {
|
|
44
36
|
throw new Error('ReportPortal options are missing in oxygen.conf file.');
|
|
45
37
|
}
|
|
46
|
-
|
|
47
38
|
this.aggregator = aggregator;
|
|
48
39
|
this.rpClient = new RPClient({
|
|
49
40
|
launch: this.reporterOpts.launch || this.options.name,
|
|
50
41
|
...this.reporterOpts
|
|
51
42
|
});
|
|
52
43
|
}
|
|
53
|
-
|
|
54
44
|
async init() {
|
|
55
45
|
try {
|
|
56
46
|
await this.rpClient.checkConnect();
|
|
@@ -58,9 +48,7 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
58
48
|
throw new Error(`RP - Error connecting to the server: ${e.message}`);
|
|
59
49
|
}
|
|
60
50
|
}
|
|
61
|
-
|
|
62
51
|
async generate(results) {}
|
|
63
|
-
|
|
64
52
|
async onLaunchStart({
|
|
65
53
|
options
|
|
66
54
|
}) {
|
|
@@ -70,7 +58,8 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
70
58
|
promise
|
|
71
59
|
} = this.rpClient.startLaunch({
|
|
72
60
|
mode: this.reporterOpts.mode || LAUNCH_MODES.DEFAULT,
|
|
73
|
-
debug: false
|
|
61
|
+
debug: false,
|
|
62
|
+
attributes: this.reporterOpts.attributes
|
|
74
63
|
});
|
|
75
64
|
this.tempLaunchId = tempId;
|
|
76
65
|
this.handlePromise(promise);
|
|
@@ -78,13 +67,11 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
78
67
|
console.dir(`RP - Failed to start launch: ${e}`);
|
|
79
68
|
}
|
|
80
69
|
}
|
|
81
|
-
|
|
82
70
|
async onLaunchEnd({
|
|
83
71
|
results
|
|
84
72
|
}) {
|
|
85
73
|
await this._reportEndOfStartedSuites();
|
|
86
74
|
const hasFailed = results.some(x => x.status === _status.default.FAILED);
|
|
87
|
-
|
|
88
75
|
try {
|
|
89
76
|
await Promise.all(this.promises);
|
|
90
77
|
const {
|
|
@@ -97,36 +84,30 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
97
84
|
console.dir(`RP - Failed to end launch: ${e}`);
|
|
98
85
|
}
|
|
99
86
|
}
|
|
100
|
-
|
|
101
87
|
async onRunnerStart({
|
|
102
88
|
rid,
|
|
103
89
|
opts,
|
|
104
90
|
caps
|
|
105
91
|
}) {}
|
|
106
|
-
|
|
107
92
|
async onRunnerEnd({
|
|
108
93
|
rid,
|
|
109
94
|
result
|
|
110
95
|
}) {}
|
|
111
|
-
|
|
112
96
|
async onSuiteStart({
|
|
113
97
|
rid,
|
|
114
98
|
suiteId,
|
|
115
99
|
suite: suiteDef
|
|
116
100
|
}) {
|
|
117
101
|
const suiteRefId = suiteDef.refId;
|
|
118
|
-
|
|
119
102
|
if (this.cbSuiteToRpIdHash[suiteRefId]) {
|
|
120
103
|
return;
|
|
121
104
|
}
|
|
122
|
-
|
|
123
105
|
this.cbSuiteToRpIdHash[suiteRefId] = {};
|
|
124
106
|
this.cbSuiteResultListByRefId[suiteRefId] = [];
|
|
125
107
|
const startTestItemReq = {
|
|
126
108
|
name: suiteDef.name || this.options.name,
|
|
127
109
|
type: TEST_ITEM_TYPES.SUITE
|
|
128
110
|
};
|
|
129
|
-
|
|
130
111
|
try {
|
|
131
112
|
const {
|
|
132
113
|
tempId,
|
|
@@ -138,7 +119,6 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
138
119
|
console.dir(`RP - Failed to start suite item: ${e}`);
|
|
139
120
|
}
|
|
140
121
|
}
|
|
141
|
-
|
|
142
122
|
async onSuiteEnd({
|
|
143
123
|
rid,
|
|
144
124
|
suiteId,
|
|
@@ -147,7 +127,6 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
147
127
|
const suiteRefId = result.refId;
|
|
148
128
|
this.cbSuiteResultListByRefId[suiteRefId] && this.cbSuiteResultListByRefId[suiteRefId].push(result);
|
|
149
129
|
}
|
|
150
|
-
|
|
151
130
|
async onCaseStart({
|
|
152
131
|
rid,
|
|
153
132
|
suiteId,
|
|
@@ -161,11 +140,9 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
161
140
|
codeRef: caseDef.path
|
|
162
141
|
};
|
|
163
142
|
const rpSuiteId = this.cbSuiteToRpIdHash[suiteRefId];
|
|
164
|
-
|
|
165
143
|
if (!rpSuiteId) {
|
|
166
144
|
return;
|
|
167
145
|
}
|
|
168
|
-
|
|
169
146
|
try {
|
|
170
147
|
const {
|
|
171
148
|
tempId,
|
|
@@ -177,7 +154,6 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
177
154
|
console.dir(`RP - Failed to start case item: ${e}`);
|
|
178
155
|
}
|
|
179
156
|
}
|
|
180
|
-
|
|
181
157
|
async onCaseEnd({
|
|
182
158
|
rid,
|
|
183
159
|
suiteId,
|
|
@@ -186,28 +162,22 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
186
162
|
result
|
|
187
163
|
}) {
|
|
188
164
|
const rpTestId = this.cbCaseToRpIdHash[caseId];
|
|
189
|
-
|
|
190
165
|
if (!rpTestId) {
|
|
191
166
|
return;
|
|
192
167
|
}
|
|
193
|
-
|
|
194
168
|
const status = result.status.toLowerCase();
|
|
195
|
-
|
|
196
169
|
if (status === 'failed' && result.failure) {
|
|
197
170
|
const rpFile = result.screenshot ? {
|
|
198
171
|
name: 'screenshot',
|
|
199
172
|
type: 'image/png',
|
|
200
173
|
content: result.screenshot
|
|
201
174
|
} : undefined;
|
|
202
|
-
|
|
203
175
|
const logMsg = this._stringify(result.failure.message);
|
|
204
|
-
|
|
205
176
|
if (logMsg) {
|
|
206
177
|
const logReq = {
|
|
207
178
|
message: logMsg,
|
|
208
179
|
level: 'error'
|
|
209
180
|
};
|
|
210
|
-
|
|
211
181
|
try {
|
|
212
182
|
const {
|
|
213
183
|
promise
|
|
@@ -218,14 +188,11 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
218
188
|
}
|
|
219
189
|
}
|
|
220
190
|
}
|
|
221
|
-
|
|
222
191
|
const transId = this.cbCaseToCurrentTransactionId[caseId];
|
|
223
|
-
|
|
224
192
|
if (transId) {
|
|
225
193
|
const finishTransactionReq = {
|
|
226
194
|
status: 'passed'
|
|
227
195
|
};
|
|
228
|
-
|
|
229
196
|
try {
|
|
230
197
|
const transRpId = this.cbStepToRpIdHash[transId];
|
|
231
198
|
const {
|
|
@@ -235,14 +202,11 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
235
202
|
} catch (e) {
|
|
236
203
|
console.dir(`RP - Failed to finish transaction item on case end: ${e}`);
|
|
237
204
|
}
|
|
238
|
-
|
|
239
205
|
delete this.cbCaseToCurrentTransactionId[caseId];
|
|
240
206
|
}
|
|
241
|
-
|
|
242
207
|
const finishTestItemReq = {
|
|
243
208
|
status: result.status.toLowerCase()
|
|
244
209
|
};
|
|
245
|
-
|
|
246
210
|
try {
|
|
247
211
|
const {
|
|
248
212
|
promise
|
|
@@ -252,7 +216,6 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
252
216
|
console.dir(`RP - Failed to finish case item: ${e}`);
|
|
253
217
|
}
|
|
254
218
|
}
|
|
255
|
-
|
|
256
219
|
async onStepStart({
|
|
257
220
|
rid,
|
|
258
221
|
caseId,
|
|
@@ -261,22 +224,18 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
261
224
|
if (!this.reportSteps) {
|
|
262
225
|
return;
|
|
263
226
|
}
|
|
264
|
-
|
|
265
227
|
if (step.module && step.module === 'log') {
|
|
266
228
|
await this.reportLogStep(caseId, step);
|
|
267
229
|
return;
|
|
268
230
|
}
|
|
269
|
-
|
|
270
231
|
const rpCaseId = this.cbCaseToRpIdHash[caseId];
|
|
271
232
|
let rpParentId;
|
|
272
233
|
const transId = this.cbCaseToCurrentTransactionId[caseId];
|
|
273
|
-
|
|
274
234
|
if (step.name === 'transaction') {
|
|
275
235
|
if (transId) {
|
|
276
236
|
const finishTransactionReq = {
|
|
277
237
|
status: 'passed'
|
|
278
238
|
};
|
|
279
|
-
|
|
280
239
|
try {
|
|
281
240
|
const transRpId = this.cbStepToRpIdHash[transId];
|
|
282
241
|
const {
|
|
@@ -287,7 +246,6 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
287
246
|
console.dir(`RP - Failed to finish transaction item on case end: ${e}`);
|
|
288
247
|
}
|
|
289
248
|
}
|
|
290
|
-
|
|
291
249
|
this.cbCaseToCurrentTransactionId[caseId] = step.id;
|
|
292
250
|
delete this.cbCaseToCurrentSubStepId[caseId];
|
|
293
251
|
rpParentId = rpCaseId;
|
|
@@ -295,13 +253,10 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
295
253
|
this.cbCaseToCurrentSubStepId[caseId] = step.id;
|
|
296
254
|
rpParentId = transId ? this.cbStepToRpIdHash[transId] : rpCaseId;
|
|
297
255
|
}
|
|
298
|
-
|
|
299
256
|
if (!rpParentId || !rpCaseId) {
|
|
300
257
|
return;
|
|
301
258
|
}
|
|
302
|
-
|
|
303
259
|
const stepName = this._getStepName(step);
|
|
304
|
-
|
|
305
260
|
const startTestItemReq = {
|
|
306
261
|
name: stepName,
|
|
307
262
|
type: TEST_ITEM_TYPES.STEP,
|
|
@@ -309,7 +264,6 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
309
264
|
testCaseId: rpCaseId,
|
|
310
265
|
hasStats: false
|
|
311
266
|
};
|
|
312
|
-
|
|
313
267
|
try {
|
|
314
268
|
const {
|
|
315
269
|
tempId,
|
|
@@ -321,7 +275,6 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
321
275
|
console.dir(`RP - Failed to start step item: ${e}`);
|
|
322
276
|
}
|
|
323
277
|
}
|
|
324
|
-
|
|
325
278
|
async onStepEnd({
|
|
326
279
|
rid,
|
|
327
280
|
caseId,
|
|
@@ -330,36 +283,28 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
330
283
|
if (!this.reportSteps) {
|
|
331
284
|
return;
|
|
332
285
|
}
|
|
333
|
-
|
|
334
286
|
if (result.name && (result.name.startsWith('log.') || result.name.startsWith('web.transaction') || result.name.startsWith('mob.transaction'))) {
|
|
335
287
|
return;
|
|
336
288
|
}
|
|
337
|
-
|
|
338
289
|
const rpStepId = this.cbStepToRpIdHash[result.id];
|
|
339
|
-
|
|
340
290
|
if (!rpStepId) {
|
|
341
291
|
return;
|
|
342
292
|
}
|
|
343
|
-
|
|
344
293
|
delete this.cbCaseToCurrentSubStepId[caseId];
|
|
345
294
|
const status = result.status.toLowerCase();
|
|
346
|
-
|
|
347
295
|
if (status === 'failed' && result.failure) {
|
|
348
296
|
const rpFile = result.screenshot ? {
|
|
349
297
|
name: 'screenshot',
|
|
350
298
|
type: 'image/png',
|
|
351
299
|
content: result.screenshot
|
|
352
300
|
} : undefined;
|
|
353
|
-
|
|
354
301
|
const logMsg = this._stringify(result.failure.message);
|
|
355
|
-
|
|
356
302
|
if (logMsg) {
|
|
357
303
|
const logReq = {
|
|
358
304
|
message: logMsg,
|
|
359
305
|
level: 'error',
|
|
360
306
|
file: rpFile
|
|
361
307
|
};
|
|
362
|
-
|
|
363
308
|
try {
|
|
364
309
|
const {
|
|
365
310
|
promise
|
|
@@ -370,11 +315,9 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
370
315
|
}
|
|
371
316
|
}
|
|
372
317
|
}
|
|
373
|
-
|
|
374
318
|
const finishTestItemReq = {
|
|
375
319
|
status: result.status.toLowerCase()
|
|
376
320
|
};
|
|
377
|
-
|
|
378
321
|
try {
|
|
379
322
|
const {
|
|
380
323
|
promise
|
|
@@ -384,7 +327,6 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
384
327
|
console.dir(`RP - Failed to finish step item: ${e}`);
|
|
385
328
|
}
|
|
386
329
|
}
|
|
387
|
-
|
|
388
330
|
async onLog({
|
|
389
331
|
suiteId,
|
|
390
332
|
caseId,
|
|
@@ -397,24 +339,18 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
397
339
|
if (!this.reportLogs) {
|
|
398
340
|
return;
|
|
399
341
|
}
|
|
400
|
-
|
|
401
342
|
if (!this.tempLaunchId) {
|
|
402
343
|
return;
|
|
403
344
|
}
|
|
404
|
-
|
|
405
345
|
const rpParentId = stepId ? this.cbStepToRpIdHash[stepId] : caseId ? this.cbCaseToRpIdHash[caseId] : suiteId ? this.cbSuiteToRpIdHash[suiteId] : undefined;
|
|
406
|
-
|
|
407
346
|
const rpLevel = this._getRpLevel(level);
|
|
408
|
-
|
|
409
347
|
const logMsg = this._stringify(msg);
|
|
410
|
-
|
|
411
348
|
if (logMsg) {
|
|
412
349
|
const logReq = {
|
|
413
350
|
message: logMsg,
|
|
414
351
|
level: rpLevel,
|
|
415
352
|
time: time
|
|
416
353
|
};
|
|
417
|
-
|
|
418
354
|
try {
|
|
419
355
|
const {
|
|
420
356
|
promise
|
|
@@ -425,23 +361,19 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
425
361
|
}
|
|
426
362
|
}
|
|
427
363
|
}
|
|
428
|
-
|
|
429
364
|
async reportLogStep(caseId, step) {
|
|
430
365
|
if (!step.args || !step.args.length) {
|
|
431
366
|
return;
|
|
432
367
|
}
|
|
433
|
-
|
|
434
368
|
const level = step.name;
|
|
435
369
|
const msg = step.args[0];
|
|
436
370
|
const time = step.time;
|
|
437
371
|
let stepId = undefined;
|
|
438
|
-
|
|
439
372
|
if (this.cbCaseToCurrentSubStepId[caseId]) {
|
|
440
373
|
stepId = this.cbCaseToCurrentSubStepId[caseId];
|
|
441
374
|
} else if (this.cbCaseToCurrentTransactionId[caseId]) {
|
|
442
375
|
stepId = this.cbCaseToCurrentTransactionId[caseId];
|
|
443
376
|
}
|
|
444
|
-
|
|
445
377
|
await this.sendRpLog({
|
|
446
378
|
suiteId: undefined,
|
|
447
379
|
caseId,
|
|
@@ -451,7 +383,6 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
451
383
|
time
|
|
452
384
|
});
|
|
453
385
|
}
|
|
454
|
-
|
|
455
386
|
async sendRpLog({
|
|
456
387
|
suiteId,
|
|
457
388
|
caseId,
|
|
@@ -463,20 +394,15 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
463
394
|
if (!this.tempLaunchId) {
|
|
464
395
|
return;
|
|
465
396
|
}
|
|
466
|
-
|
|
467
397
|
const rpParentId = stepId ? this.cbStepToRpIdHash[stepId] : caseId ? this.cbCaseToRpIdHash[caseId] : suiteId ? this.cbSuiteToRpIdHash[suiteId] : undefined;
|
|
468
|
-
|
|
469
398
|
const rpLevel = this._getRpLevel(level);
|
|
470
|
-
|
|
471
399
|
const logMsg = this._stringify(msg);
|
|
472
|
-
|
|
473
400
|
if (logMsg) {
|
|
474
401
|
const logReq = {
|
|
475
402
|
message: logMsg,
|
|
476
403
|
level: rpLevel,
|
|
477
404
|
time: time
|
|
478
405
|
};
|
|
479
|
-
|
|
480
406
|
try {
|
|
481
407
|
const {
|
|
482
408
|
promise
|
|
@@ -487,7 +413,6 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
487
413
|
}
|
|
488
414
|
}
|
|
489
415
|
}
|
|
490
|
-
|
|
491
416
|
async _reportEndOfStartedSuites() {
|
|
492
417
|
for (const suiteRefId of Object.keys(this.cbSuiteToRpIdHash)) {
|
|
493
418
|
const rpSuiteId = this.cbSuiteToRpIdHash[suiteRefId];
|
|
@@ -497,7 +422,6 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
497
422
|
const finishTestItemReq = {
|
|
498
423
|
status: hasFailedSuite ? 'failed' : 'passed'
|
|
499
424
|
};
|
|
500
|
-
|
|
501
425
|
try {
|
|
502
426
|
const {
|
|
503
427
|
promise
|
|
@@ -508,18 +432,14 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
508
432
|
}
|
|
509
433
|
}
|
|
510
434
|
}
|
|
511
|
-
|
|
512
435
|
_getRpLevel(oxLevel) {
|
|
513
436
|
if (oxLevel) {
|
|
514
437
|
return oxLevel.toLowerCase();
|
|
515
438
|
}
|
|
516
|
-
|
|
517
439
|
return 'info';
|
|
518
440
|
}
|
|
519
|
-
|
|
520
441
|
_getStepName(step) {
|
|
521
442
|
let name;
|
|
522
|
-
|
|
523
443
|
if (step.name === 'transaction' && step.args.length > 0) {
|
|
524
444
|
name = step.args[0];
|
|
525
445
|
} else if (step.signature) {
|
|
@@ -529,38 +449,30 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
529
449
|
} else {
|
|
530
450
|
name = step.name;
|
|
531
451
|
}
|
|
532
|
-
|
|
533
452
|
if (name.length > MAX_NAME_LENGTH) {
|
|
534
453
|
name = name.substring(0, MAX_NAME_LENGTH - 3) + '...';
|
|
535
454
|
}
|
|
536
|
-
|
|
537
455
|
return name;
|
|
538
456
|
}
|
|
539
|
-
|
|
540
457
|
_stringify(msg) {
|
|
541
458
|
if (typeof msg === 'undefined' || msg === null) {
|
|
542
459
|
return null;
|
|
543
460
|
}
|
|
544
|
-
|
|
545
461
|
if (typeof msg === 'string' || msg instanceof String) {
|
|
546
462
|
return msg;
|
|
547
463
|
}
|
|
548
|
-
|
|
549
464
|
try {
|
|
550
465
|
return JSON.stringify(msg);
|
|
551
466
|
} catch (e) {
|
|
552
467
|
console.error('RP - error sending log: msg object cannot be serialized');
|
|
553
468
|
}
|
|
554
469
|
}
|
|
555
|
-
|
|
556
470
|
handlePromise(promise) {
|
|
557
471
|
promise.catch(err => {
|
|
558
472
|
console.log('RP error: ', err);
|
|
559
473
|
});
|
|
560
474
|
this.promises.push(promise);
|
|
561
475
|
}
|
|
562
|
-
|
|
563
476
|
}
|
|
564
|
-
|
|
565
477
|
exports.default = ReportPortalReporter;
|
|
566
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9yZXBvcnRlcnMvcmVwb3J0ZXItcnAuanMiXSwibmFtZXMiOlsiUlBDbGllbnQiLCJyZXF1aXJlIiwiTEFVTkNIX01PREVTIiwiREVGQVVMVCIsIkRFQlVHIiwiVEVTVF9JVEVNX1RZUEVTIiwiU1VJVEUiLCJURVNUIiwiU1RFUCIsIk1BWF9OQU1FX0xFTkdUSCIsIlJlcG9ydFBvcnRhbFJlcG9ydGVyIiwiUmVwb3J0ZXJCYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwicmVwb3J0ZXJPcHRzIiwiYWdncmVnYXRvciIsInJwIiwicmVwb3J0U3RlcHMiLCJyZXBvcnRMb2dzIiwiY2JTdWl0ZVRvUnBJZEhhc2giLCJjYkNhc2VUb1JwSWRIYXNoIiwiY2JTdGVwVG9ScElkSGFzaCIsImNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZCIsImNiQ2FzZVRvQ3VycmVudFRyYW5zYWN0aW9uSWQiLCJjYkNhc2VUb0N1cnJlbnRTdWJTdGVwSWQiLCJwcm9taXNlcyIsImFwaUtleSIsImVuZHBvaW50IiwicHJvamVjdCIsIkVycm9yIiwicnBDbGllbnQiLCJsYXVuY2giLCJuYW1lIiwiaW5pdCIsImNoZWNrQ29ubmVjdCIsImUiLCJtZXNzYWdlIiwiZ2VuZXJhdGUiLCJyZXN1bHRzIiwib25MYXVuY2hTdGFydCIsInRlbXBJZCIsInByb21pc2UiLCJzdGFydExhdW5jaCIsIm1vZGUiLCJkZWJ1ZyIsInRlbXBMYXVuY2hJZCIsImhhbmRsZVByb21pc2UiLCJjb25zb2xlIiwiZGlyIiwib25MYXVuY2hFbmQiLCJfcmVwb3J0RW5kT2ZTdGFydGVkU3VpdGVzIiwiaGFzRmFpbGVkIiwic29tZSIsIngiLCJzdGF0dXMiLCJTdGF0dXMiLCJGQUlMRUQiLCJQcm9taXNlIiwiYWxsIiwiZmluaXNoTGF1bmNoIiwib25SdW5uZXJTdGFydCIsInJpZCIsIm9wdHMiLCJjYXBzIiwib25SdW5uZXJFbmQiLCJyZXN1bHQiLCJvblN1aXRlU3RhcnQiLCJzdWl0ZUlkIiwic3VpdGUiLCJzdWl0ZURlZiIsInN1aXRlUmVmSWQiLCJyZWZJZCIsInN0YXJ0VGVzdEl0ZW1SZXEiLCJ0eXBlIiwic3RhcnRUZXN0SXRlbSIsIm9uU3VpdGVFbmQiLCJwdXNoIiwib25DYXNlU3RhcnQiLCJjYXNlSWQiLCJjYXNlRGVmIiwiY29kZVJlZiIsInBhdGgiLCJycFN1aXRlSWQiLCJvbkNhc2VFbmQiLCJycFRlc3RJZCIsInRvTG93ZXJDYXNlIiwiZmFpbHVyZSIsInJwRmlsZSIsInNjcmVlbnNob3QiLCJjb250ZW50IiwidW5kZWZpbmVkIiwibG9nTXNnIiwiX3N0cmluZ2lmeSIsImxvZ1JlcSIsImxldmVsIiwic2VuZExvZyIsInRyYW5zSWQiLCJmaW5pc2hUcmFuc2FjdGlvblJlcSIsInRyYW5zUnBJZCIsImZpbmlzaFRlc3RJdGVtIiwiZmluaXNoVGVzdEl0ZW1SZXEiLCJvblN0ZXBTdGFydCIsInN0ZXAiLCJtb2R1bGUiLCJyZXBvcnRMb2dTdGVwIiwicnBDYXNlSWQiLCJycFBhcmVudElkIiwiaWQiLCJzdGVwTmFtZSIsIl9nZXRTdGVwTmFtZSIsImxvY2F0aW9uIiwidGVzdENhc2VJZCIsImhhc1N0YXRzIiwib25TdGVwRW5kIiwic3RhcnRzV2l0aCIsInJwU3RlcElkIiwiZmlsZSIsIm9uTG9nIiwic3RlcElkIiwibXNnIiwidGltZSIsInNyYyIsInJwTGV2ZWwiLCJfZ2V0UnBMZXZlbCIsImFyZ3MiLCJsZW5ndGgiLCJzZW5kUnBMb2ciLCJPYmplY3QiLCJrZXlzIiwiaGFzRmFpbGVkU3VpdGUiLCJveExldmVsIiwic2lnbmF0dXJlIiwic3Vic3RyaW5nIiwiU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsImVycm9yIiwiY2F0Y2giLCJlcnIiLCJsb2ciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVlBOztBQUNBOzs7O0FBQ0EsTUFBTUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsZ0NBQUQsQ0FBeEI7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHO0FBQ2pCQyxFQUFBQSxPQUFPLEVBQUUsU0FEUTtBQUVqQkMsRUFBQUEsS0FBSyxFQUFFO0FBRlUsQ0FBckI7QUFJQSxNQUFNQyxlQUFlLEdBQUc7QUFDcEJDLEVBQUFBLEtBQUssRUFBRSxPQURhO0FBRXBCQyxFQUFBQSxJQUFJLEVBQUUsTUFGYztBQUdwQkMsRUFBQUEsSUFBSSxFQUFFO0FBSGMsQ0FBeEI7QUFLQSxNQUFNQyxlQUFlLEdBQUcsR0FBeEI7O0FBRWUsTUFBTUMsb0JBQU4sU0FBbUNDLHFCQUFuQyxDQUFnRDtBQUMzREMsRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVVDLFlBQVYsRUFBd0JDLFVBQXhCLEVBQW9DO0FBQzNDLFVBQU1GLE9BQU47QUFDQSxTQUFLQyxZQUFMLEdBQW9CQSxZQUFZLElBQUlELE9BQU8sQ0FBQ0csRUFBNUM7QUFDQSxTQUFLQyxXQUFMLEdBQW1CSCxZQUFZLENBQUNHLFdBQWIsSUFBNEIsSUFBL0M7QUFDQSxTQUFLQyxVQUFMLEdBQWtCSixZQUFZLENBQUNJLFVBQWIsSUFBMkIsS0FBN0M7QUFDQSxTQUFLQyxpQkFBTCxHQUF5QixFQUF6QjtBQUNBLFNBQUtDLGdCQUFMLEdBQXdCLEVBQXhCO0FBQ0EsU0FBS0MsZ0JBQUwsR0FBd0IsRUFBeEI7QUFDQSxTQUFLQyx3QkFBTCxHQUFnQyxFQUFoQztBQUNBLFNBQUtDLDRCQUFMLEdBQW9DLEVBQXBDO0FBQ0EsU0FBS0Msd0JBQUwsR0FBZ0MsRUFBaEM7QUFDQSxTQUFLQyxRQUFMLEdBQWdCLEVBQWhCOztBQUVBLFFBQ0ksQ0FBQyxLQUFLWCxZQUFOLElBQ0csQ0FBQyxLQUFLQSxZQUFMLENBQWtCWSxNQUR0QixJQUVHLENBQUMsS0FBS1osWUFBTCxDQUFrQmEsUUFGdEIsSUFHRyxDQUFDLEtBQUtiLFlBQUwsQ0FBa0JjLE9BSjFCLEVBS0U7QUFDRSxZQUFNLElBQUlDLEtBQUosQ0FBVSx1REFBVixDQUFOO0FBQ0g7O0FBQ0QsU0FBS2QsVUFBTCxHQUFrQkEsVUFBbEI7QUFDQSxTQUFLZSxRQUFMLEdBQWdCLElBQUk5QixRQUFKLENBQWE7QUFDekIrQixNQUFBQSxNQUFNLEVBQUUsS0FBS2pCLFlBQUwsQ0FBa0JpQixNQUFsQixJQUE0QixLQUFLbEIsT0FBTCxDQUFhbUIsSUFEeEI7QUFFekIsU0FBRyxLQUFLbEI7QUFGaUIsS0FBYixDQUFoQjtBQUlIOztBQUVTLFFBQUptQixJQUFJLEdBQUc7QUFDVCxRQUFJO0FBQ0EsWUFBTSxLQUFLSCxRQUFMLENBQWNJLFlBQWQsRUFBTjtBQUNILEtBRkQsQ0FHQSxPQUFPQyxDQUFQLEVBQVU7QUFDTixZQUFNLElBQUlOLEtBQUosQ0FBVyx3Q0FBdUNNLENBQUMsQ0FBQ0MsT0FBUSxFQUE1RCxDQUFOO0FBQ0g7QUFDSjs7QUFDYSxRQUFSQyxRQUFRLENBQUNDLE9BQUQsRUFBVSxDQUN2Qjs7QUFFa0IsUUFBYkMsYUFBYSxDQUFDO0FBQUUxQixJQUFBQTtBQUFGLEdBQUQsRUFBYztBQUM3QixRQUFJO0FBQ0EsWUFBTTtBQUFFMkIsUUFBQUEsTUFBRjtBQUFVQyxRQUFBQTtBQUFWLFVBQXNCLEtBQUtYLFFBQUwsQ0FBY1ksV0FBZCxDQUEwQjtBQUNsREMsUUFBQUEsSUFBSSxFQUFFLEtBQUs3QixZQUFMLENBQWtCNkIsSUFBbEIsSUFBMEJ6QyxZQUFZLENBQUNDLE9BREs7QUFFbER5QyxRQUFBQSxLQUFLLEVBQUU7QUFGMkMsT0FBMUIsQ0FBNUI7QUFJQSxXQUFLQyxZQUFMLEdBQW9CTCxNQUFwQjtBQUVBLFdBQUtNLGFBQUwsQ0FBbUJMLE9BQW5CO0FBQ0gsS0FSRCxDQVNBLE9BQU9OLENBQVAsRUFBVTtBQUNOWSxNQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxnQ0FBK0JiLENBQUUsRUFBOUM7QUFDSDtBQUNKOztBQUNnQixRQUFYYyxXQUFXLENBQUM7QUFBRVgsSUFBQUE7QUFBRixHQUFELEVBQWM7QUFFM0IsVUFBTSxLQUFLWSx5QkFBTCxFQUFOO0FBRUEsVUFBTUMsU0FBUyxHQUFHYixPQUFPLENBQUNjLElBQVIsQ0FBYUMsQ0FBQyxJQUFJQSxDQUFDLENBQUNDLE1BQUYsS0FBYUMsZ0JBQU9DLE1BQXRDLENBQWxCOztBQUVBLFFBQUk7QUFDQSxZQUFNQyxPQUFPLENBQUNDLEdBQVIsQ0FBWSxLQUFLakMsUUFBakIsQ0FBTjtBQUVBLFlBQU07QUFBRWdCLFFBQUFBO0FBQUYsVUFBYyxNQUFNLEtBQUtYLFFBQUwsQ0FBYzZCLFlBQWQsQ0FBMkIsS0FBS2QsWUFBaEMsRUFBOEM7QUFDcEVTLFFBQUFBLE1BQU0sRUFBRUgsU0FBUyxHQUFHLFFBQUgsR0FBYztBQURxQyxPQUE5QyxDQUExQjtBQUdBLFlBQU1WLE9BQU47QUFDSCxLQVBELENBUUEsT0FBT04sQ0FBUCxFQUFVO0FBQ05ZLE1BQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLDhCQUE2QmIsQ0FBRSxFQUE1QztBQUNIO0FBQ0o7O0FBQ2tCLFFBQWJ5QixhQUFhLENBQUM7QUFBRUMsSUFBQUEsR0FBRjtBQUFPQyxJQUFBQSxJQUFQO0FBQWFDLElBQUFBO0FBQWIsR0FBRCxFQUFzQixDQUN4Qzs7QUFDZ0IsUUFBWEMsV0FBVyxDQUFDO0FBQUVILElBQUFBLEdBQUY7QUFBT0ksSUFBQUE7QUFBUCxHQUFELEVBQWtCLENBQ2xDOztBQUNpQixRQUFaQyxZQUFZLENBQUM7QUFBRUwsSUFBQUEsR0FBRjtBQUFPTSxJQUFBQSxPQUFQO0FBQWdCQyxJQUFBQSxLQUFLLEVBQUVDO0FBQXZCLEdBQUQsRUFBb0M7QUFHbEQsVUFBTUMsVUFBVSxHQUFHRCxRQUFRLENBQUNFLEtBQTVCOztBQUNBLFFBQUksS0FBS3BELGlCQUFMLENBQXVCbUQsVUFBdkIsQ0FBSixFQUF3QztBQUNwQztBQUNIOztBQUlELFNBQUtuRCxpQkFBTCxDQUF1Qm1ELFVBQXZCLElBQXFDLEVBQXJDO0FBQ0EsU0FBS2hELHdCQUFMLENBQThCZ0QsVUFBOUIsSUFBNEMsRUFBNUM7QUFDQSxVQUFNRSxnQkFBZ0IsR0FBRztBQUNyQnhDLE1BQUFBLElBQUksRUFBRXFDLFFBQVEsQ0FBQ3JDLElBQVQsSUFBaUIsS0FBS25CLE9BQUwsQ0FBYW1CLElBRGY7QUFFckJ5QyxNQUFBQSxJQUFJLEVBQUVwRSxlQUFlLENBQUNDO0FBRkQsS0FBekI7O0FBS0EsUUFBSTtBQUNBLFlBQU07QUFBRWtDLFFBQUFBLE1BQUY7QUFBVUMsUUFBQUE7QUFBVixVQUFzQixLQUFLWCxRQUFMLENBQWM0QyxhQUFkLENBQTRCRixnQkFBNUIsRUFBOEMsS0FBSzNCLFlBQW5ELENBQTVCO0FBQ0EsV0FBSzFCLGlCQUFMLENBQXVCbUQsVUFBdkIsSUFBcUM5QixNQUFyQztBQUNBLFdBQUtNLGFBQUwsQ0FBbUJMLE9BQW5CO0FBQ0gsS0FKRCxDQUtBLE9BQU9OLENBQVAsRUFBVTtBQUNOWSxNQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxvQ0FBbUNiLENBQUUsRUFBbEQ7QUFDSDtBQUNKOztBQUNlLFFBQVZ3QyxVQUFVLENBQUM7QUFBRWQsSUFBQUEsR0FBRjtBQUFPTSxJQUFBQSxPQUFQO0FBQWdCRixJQUFBQTtBQUFoQixHQUFELEVBQTJCO0FBQ3ZDLFVBQU1LLFVBQVUsR0FBR0wsTUFBTSxDQUFDTSxLQUExQjtBQUNBLFNBQUtqRCx3QkFBTCxDQUE4QmdELFVBQTlCLEtBQTZDLEtBQUtoRCx3QkFBTCxDQUE4QmdELFVBQTlCLEVBQTBDTSxJQUExQyxDQUErQ1gsTUFBL0MsQ0FBN0M7QUFDSDs7QUFDZ0IsUUFBWFksV0FBVyxDQUFDO0FBQUVoQixJQUFBQSxHQUFGO0FBQU9NLElBQUFBLE9BQVA7QUFBZ0JHLElBQUFBLFVBQWhCO0FBQTRCUSxJQUFBQSxNQUE1QjtBQUFvQyxZQUFRQztBQUE1QyxHQUFELEVBQXdEO0FBQ3JFLFVBQU1QLGdCQUFnQixHQUFHO0FBQ3JCeEMsTUFBQUEsSUFBSSxFQUFFK0MsT0FBTyxDQUFDL0MsSUFETztBQUVyQnlDLE1BQUFBLElBQUksRUFBRXBFLGVBQWUsQ0FBQ0UsSUFGRDtBQUdyQnlFLE1BQUFBLE9BQU8sRUFBRUQsT0FBTyxDQUFDRTtBQUhJLEtBQXpCO0FBS0EsVUFBTUMsU0FBUyxHQUFHLEtBQUsvRCxpQkFBTCxDQUF1Qm1ELFVBQXZCLENBQWxCOztBQUNBLFFBQUksQ0FBQ1ksU0FBTCxFQUFnQjtBQUNaO0FBQ0g7O0FBRUQsUUFBSTtBQUNBLFlBQU07QUFBRTFDLFFBQUFBLE1BQUY7QUFBVUMsUUFBQUE7QUFBVixVQUFzQixLQUFLWCxRQUFMLENBQWM0QyxhQUFkLENBQTRCRixnQkFBNUIsRUFBOEMsS0FBSzNCLFlBQW5ELEVBQWlFcUMsU0FBakUsQ0FBNUI7QUFDQSxXQUFLOUQsZ0JBQUwsQ0FBc0IwRCxNQUF0QixJQUFnQ3RDLE1BQWhDO0FBQ0EsV0FBS00sYUFBTCxDQUFtQkwsT0FBbkI7QUFDSCxLQUpELENBS0EsT0FBT04sQ0FBUCxFQUFVO0FBQ05ZLE1BQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLG1DQUFrQ2IsQ0FBRSxFQUFqRDtBQUNIO0FBQ0o7O0FBQ2MsUUFBVGdELFNBQVMsQ0FBQztBQUFFdEIsSUFBQUEsR0FBRjtBQUFPTSxJQUFBQSxPQUFQO0FBQWdCRyxJQUFBQSxVQUFoQjtBQUE0QlEsSUFBQUEsTUFBNUI7QUFBb0NiLElBQUFBO0FBQXBDLEdBQUQsRUFBK0M7QUFDMUQsVUFBTW1CLFFBQVEsR0FBRyxLQUFLaEUsZ0JBQUwsQ0FBc0IwRCxNQUF0QixDQUFqQjs7QUFDQSxRQUFJLENBQUNNLFFBQUwsRUFBZTtBQUNYO0FBQ0g7O0FBQ0QsVUFBTTlCLE1BQU0sR0FBR1csTUFBTSxDQUFDWCxNQUFQLENBQWMrQixXQUFkLEVBQWY7O0FBQ0EsUUFBSS9CLE1BQU0sS0FBSyxRQUFYLElBQXVCVyxNQUFNLENBQUNxQixPQUFsQyxFQUEyQztBQUN2QyxZQUFNQyxNQUFNLEdBQUd0QixNQUFNLENBQUN1QixVQUFQLEdBQ2Y7QUFDSXhELFFBQUFBLElBQUksRUFBRSxZQURWO0FBRUl5QyxRQUFBQSxJQUFJLEVBQUUsV0FGVjtBQUdJZ0IsUUFBQUEsT0FBTyxFQUFFeEIsTUFBTSxDQUFDdUI7QUFIcEIsT0FEZSxHQUtYRSxTQUxKOztBQU9BLFlBQU1DLE1BQU0sR0FBRyxLQUFLQyxVQUFMLENBQWdCM0IsTUFBTSxDQUFDcUIsT0FBUCxDQUFlbEQsT0FBL0IsQ0FBZjs7QUFDQSxVQUFJdUQsTUFBSixFQUFZO0FBQ1IsY0FBTUUsTUFBTSxHQUFHO0FBQ1h6RCxVQUFBQSxPQUFPLEVBQUV1RCxNQURFO0FBRVhHLFVBQUFBLEtBQUssRUFBRTtBQUZJLFNBQWY7O0FBS0EsWUFBSTtBQUNBLGdCQUFNO0FBQUVyRCxZQUFBQTtBQUFGLGNBQWMsS0FBS1gsUUFBTCxDQUFjaUUsT0FBZCxDQUFzQlgsUUFBdEIsRUFBZ0NTLE1BQWhDLEVBQXdDTixNQUF4QyxDQUFwQjtBQUNBLGVBQUt6QyxhQUFMLENBQW1CTCxPQUFuQjtBQUNILFNBSEQsQ0FHRSxPQUFPTixDQUFQLEVBQVU7QUFDUlksVUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsbURBQWtEYixDQUFFLEVBQWpFO0FBQ0g7QUFDSjtBQUNKOztBQUVELFVBQU02RCxPQUFPLEdBQUcsS0FBS3pFLDRCQUFMLENBQWtDdUQsTUFBbEMsQ0FBaEI7O0FBRUEsUUFBSWtCLE9BQUosRUFBYTtBQUVULFlBQU1DLG9CQUFvQixHQUFHO0FBQ3pCM0MsUUFBQUEsTUFBTSxFQUFFO0FBRGlCLE9BQTdCOztBQUlBLFVBQUk7QUFDQSxjQUFNNEMsU0FBUyxHQUFHLEtBQUs3RSxnQkFBTCxDQUFzQjJFLE9BQXRCLENBQWxCO0FBRUEsY0FBTTtBQUFFdkQsVUFBQUE7QUFBRixZQUFjLEtBQUtYLFFBQUwsQ0FBY3FFLGNBQWQsQ0FBNkJELFNBQTdCLEVBQXdDRCxvQkFBeEMsQ0FBcEI7QUFDQSxhQUFLbkQsYUFBTCxDQUFtQkwsT0FBbkI7QUFDSCxPQUxELENBTUEsT0FBT04sQ0FBUCxFQUFVO0FBQ05ZLFFBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLHVEQUFzRGIsQ0FBRSxFQUFyRTtBQUNIOztBQUVELGFBQU8sS0FBS1osNEJBQUwsQ0FBa0N1RCxNQUFsQyxDQUFQO0FBQ0g7O0FBRUQsVUFBTXNCLGlCQUFpQixHQUFHO0FBQ3RCOUMsTUFBQUEsTUFBTSxFQUFFVyxNQUFNLENBQUNYLE1BQVAsQ0FBYytCLFdBQWQ7QUFEYyxLQUExQjs7QUFJQSxRQUFJO0FBQ0EsWUFBTTtBQUFFNUMsUUFBQUE7QUFBRixVQUFjLEtBQUtYLFFBQUwsQ0FBY3FFLGNBQWQsQ0FBNkJmLFFBQTdCLEVBQXVDZ0IsaUJBQXZDLENBQXBCO0FBQ0EsV0FBS3RELGFBQUwsQ0FBbUJMLE9BQW5CO0FBQ0gsS0FIRCxDQUlBLE9BQU9OLENBQVAsRUFBVTtBQUNOWSxNQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxvQ0FBbUNiLENBQUUsRUFBbEQ7QUFDSDtBQUNKOztBQUVnQixRQUFYa0UsV0FBVyxDQUFDO0FBQUV4QyxJQUFBQSxHQUFGO0FBQU9pQixJQUFBQSxNQUFQO0FBQWV3QixJQUFBQTtBQUFmLEdBQUQsRUFBd0I7QUFDckMsUUFBSSxDQUFDLEtBQUtyRixXQUFWLEVBQXVCO0FBQ25CO0FBQ0g7O0FBQ0QsUUFBSXFGLElBQUksQ0FBQ0MsTUFBTCxJQUFlRCxJQUFJLENBQUNDLE1BQUwsS0FBZ0IsS0FBbkMsRUFBMEM7QUFDdEMsWUFBTSxLQUFLQyxhQUFMLENBQW1CMUIsTUFBbkIsRUFBMkJ3QixJQUEzQixDQUFOO0FBQ0E7QUFDSDs7QUFDRCxVQUFNRyxRQUFRLEdBQUcsS0FBS3JGLGdCQUFMLENBQXNCMEQsTUFBdEIsQ0FBakI7QUFDQSxRQUFJNEIsVUFBSjtBQUVBLFVBQU1WLE9BQU8sR0FBRyxLQUFLekUsNEJBQUwsQ0FBa0N1RCxNQUFsQyxDQUFoQjs7QUFFQSxRQUFJd0IsSUFBSSxDQUFDdEUsSUFBTCxLQUFjLGFBQWxCLEVBQWlDO0FBQzdCLFVBQUlnRSxPQUFKLEVBQWE7QUFFVCxjQUFNQyxvQkFBb0IsR0FBRztBQUN6QjNDLFVBQUFBLE1BQU0sRUFBRTtBQURpQixTQUE3Qjs7QUFJQSxZQUFJO0FBQ0EsZ0JBQU00QyxTQUFTLEdBQUcsS0FBSzdFLGdCQUFMLENBQXNCMkUsT0FBdEIsQ0FBbEI7QUFDQSxnQkFBTTtBQUFFdkQsWUFBQUE7QUFBRixjQUFjLEtBQUtYLFFBQUwsQ0FBY3FFLGNBQWQsQ0FBNkJELFNBQTdCLEVBQXdDRCxvQkFBeEMsQ0FBcEI7QUFDQSxlQUFLbkQsYUFBTCxDQUFtQkwsT0FBbkI7QUFDSCxTQUpELENBS0EsT0FBT04sQ0FBUCxFQUFVO0FBQ05ZLFVBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLHVEQUFzRGIsQ0FBRSxFQUFyRTtBQUNIO0FBQ0o7O0FBRUQsV0FBS1osNEJBQUwsQ0FBa0N1RCxNQUFsQyxJQUE0Q3dCLElBQUksQ0FBQ0ssRUFBakQ7QUFDQSxhQUFPLEtBQUtuRix3QkFBTCxDQUE4QnNELE1BQTlCLENBQVA7QUFDQTRCLE1BQUFBLFVBQVUsR0FBR0QsUUFBYjtBQUNILEtBcEJELE1BcUJLO0FBQ0QsV0FBS2pGLHdCQUFMLENBQThCc0QsTUFBOUIsSUFBd0N3QixJQUFJLENBQUNLLEVBQTdDO0FBQ0FELE1BQUFBLFVBQVUsR0FBR1YsT0FBTyxHQUFHLEtBQUszRSxnQkFBTCxDQUFzQjJFLE9BQXRCLENBQUgsR0FBb0NTLFFBQXhEO0FBQ0g7O0FBRUQsUUFBSSxDQUFDQyxVQUFELElBQWUsQ0FBQ0QsUUFBcEIsRUFBOEI7QUFDMUI7QUFDSDs7QUFDRCxVQUFNRyxRQUFRLEdBQUcsS0FBS0MsWUFBTCxDQUFrQlAsSUFBbEIsQ0FBakI7O0FBQ0EsVUFBTTlCLGdCQUFnQixHQUFHO0FBQ3JCeEMsTUFBQUEsSUFBSSxFQUFFNEUsUUFEZTtBQUVyQm5DLE1BQUFBLElBQUksRUFBRXBFLGVBQWUsQ0FBQ0csSUFGRDtBQU9yQndFLE1BQUFBLE9BQU8sRUFBRXNCLElBQUksQ0FBQ1EsUUFQTztBQVFyQkMsTUFBQUEsVUFBVSxFQUFFTixRQVJTO0FBU3JCTyxNQUFBQSxRQUFRLEVBQUU7QUFUVyxLQUF6Qjs7QUFZQSxRQUFJO0FBQ0EsWUFBTTtBQUFFeEUsUUFBQUEsTUFBRjtBQUFVQyxRQUFBQTtBQUFWLFVBQXNCLEtBQUtYLFFBQUwsQ0FBYzRDLGFBQWQsQ0FBNEJGLGdCQUE1QixFQUE4QyxLQUFLM0IsWUFBbkQsRUFBaUU2RCxVQUFqRSxDQUE1QjtBQUNBLFdBQUtyRixnQkFBTCxDQUFzQmlGLElBQUksQ0FBQ0ssRUFBM0IsSUFBaUNuRSxNQUFqQztBQUNBLFdBQUtNLGFBQUwsQ0FBbUJMLE9BQW5CO0FBQ0gsS0FKRCxDQUtBLE9BQU9OLENBQVAsRUFBVTtBQUNOWSxNQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxtQ0FBa0NiLENBQUUsRUFBakQ7QUFDSDtBQUNKOztBQUNjLFFBQVQ4RSxTQUFTLENBQUM7QUFBRXBELElBQUFBLEdBQUY7QUFBT2lCLElBQUFBLE1BQVA7QUFBZXdCLElBQUFBLElBQUksRUFBRXJDO0FBQXJCLEdBQUQsRUFBZ0M7QUFDM0MsUUFBSSxDQUFDLEtBQUtoRCxXQUFWLEVBQXVCO0FBQ25CO0FBQ0g7O0FBQ0QsUUFBSWdELE1BQU0sQ0FBQ2pDLElBQVAsS0FBZ0JpQyxNQUFNLENBQUNqQyxJQUFQLENBQVlrRixVQUFaLENBQXVCLE1BQXZCLEtBQ0FqRCxNQUFNLENBQUNqQyxJQUFQLENBQVlrRixVQUFaLENBQXVCLGlCQUF2QixDQURBLElBRUFqRCxNQUFNLENBQUNqQyxJQUFQLENBQVlrRixVQUFaLENBQXVCLGlCQUF2QixDQUZoQixDQUFKLEVBRWdFO0FBQzVEO0FBQ0g7O0FBQ0QsVUFBTUMsUUFBUSxHQUFHLEtBQUs5RixnQkFBTCxDQUFzQjRDLE1BQU0sQ0FBQzBDLEVBQTdCLENBQWpCOztBQUNBLFFBQUksQ0FBQ1EsUUFBTCxFQUFlO0FBQ1g7QUFDSDs7QUFFRCxXQUFPLEtBQUszRix3QkFBTCxDQUE4QnNELE1BQTlCLENBQVA7QUFFQSxVQUFNeEIsTUFBTSxHQUFHVyxNQUFNLENBQUNYLE1BQVAsQ0FBYytCLFdBQWQsRUFBZjs7QUFDQSxRQUFJL0IsTUFBTSxLQUFLLFFBQVgsSUFBdUJXLE1BQU0sQ0FBQ3FCLE9BQWxDLEVBQTJDO0FBQ3ZDLFlBQU1DLE1BQU0sR0FBR3RCLE1BQU0sQ0FBQ3VCLFVBQVAsR0FDZjtBQUNJeEQsUUFBQUEsSUFBSSxFQUFFLFlBRFY7QUFFSXlDLFFBQUFBLElBQUksRUFBRSxXQUZWO0FBR0lnQixRQUFBQSxPQUFPLEVBQUV4QixNQUFNLENBQUN1QjtBQUhwQixPQURlLEdBS1hFLFNBTEo7O0FBT0EsWUFBTUMsTUFBTSxHQUFHLEtBQUtDLFVBQUwsQ0FBZ0IzQixNQUFNLENBQUNxQixPQUFQLENBQWVsRCxPQUEvQixDQUFmOztBQUNBLFVBQUl1RCxNQUFKLEVBQVk7QUFDUixjQUFNRSxNQUFNLEdBQUc7QUFDWHpELFVBQUFBLE9BQU8sRUFBRXVELE1BREU7QUFFWEcsVUFBQUEsS0FBSyxFQUFFLE9BRkk7QUFHWHNCLFVBQUFBLElBQUksRUFBRTdCO0FBSEssU0FBZjs7QUFNQSxZQUFJO0FBQ0EsZ0JBQU07QUFBRTlDLFlBQUFBO0FBQUYsY0FBYyxLQUFLWCxRQUFMLENBQWNpRSxPQUFkLENBQXNCb0IsUUFBdEIsRUFBZ0N0QixNQUFoQyxFQUF3Q04sTUFBeEMsQ0FBcEI7QUFDQSxlQUFLekMsYUFBTCxDQUFtQkwsT0FBbkI7QUFDSCxTQUhELENBR0UsT0FBT04sQ0FBUCxFQUFVO0FBQ1JZLFVBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLG1EQUFrRGIsQ0FBRSxFQUFqRTtBQUNIO0FBQ0o7QUFDSjs7QUFDRCxVQUFNaUUsaUJBQWlCLEdBQUc7QUFDdEI5QyxNQUFBQSxNQUFNLEVBQUVXLE1BQU0sQ0FBQ1gsTUFBUCxDQUFjK0IsV0FBZDtBQURjLEtBQTFCOztBQUlBLFFBQUk7QUFDQSxZQUFNO0FBQUU1QyxRQUFBQTtBQUFGLFVBQWMsS0FBS1gsUUFBTCxDQUFjcUUsY0FBZCxDQUE2QmdCLFFBQTdCLEVBQXVDZixpQkFBdkMsQ0FBcEI7QUFDQSxXQUFLdEQsYUFBTCxDQUFtQkwsT0FBbkI7QUFDSCxLQUhELENBSUEsT0FBT04sQ0FBUCxFQUFVO0FBQ05ZLE1BQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLG9DQUFtQ2IsQ0FBRSxFQUFsRDtBQUNIO0FBQ0o7O0FBQ1UsUUFBTGtGLEtBQUssQ0FBQztBQUFFbEQsSUFBQUEsT0FBRjtBQUFXVyxJQUFBQSxNQUFYO0FBQW1Cd0MsSUFBQUEsTUFBbkI7QUFBMkJ4QixJQUFBQSxLQUEzQjtBQUFrQ3lCLElBQUFBLEdBQWxDO0FBQXVDQyxJQUFBQSxJQUF2QztBQUE2Q0MsSUFBQUE7QUFBN0MsR0FBRCxFQUFxRDtBQUM1RCxRQUFJLENBQUMsS0FBS3ZHLFVBQVYsRUFBc0I7QUFDbEI7QUFDSDs7QUFFRCxRQUFJLENBQUMsS0FBSzJCLFlBQVYsRUFBd0I7QUFDcEI7QUFDSDs7QUFDRCxVQUFNNkQsVUFBVSxHQUFHWSxNQUFNLEdBQ3JCLEtBQUtqRyxnQkFBTCxDQUFzQmlHLE1BQXRCLENBRHFCLEdBRW5CeEMsTUFBTSxHQUFHLEtBQUsxRCxnQkFBTCxDQUFzQjBELE1BQXRCLENBQUgsR0FDTlgsT0FBTyxHQUFHLEtBQUtoRCxpQkFBTCxDQUF1QmdELE9BQXZCLENBQUgsR0FDUHVCLFNBSk47O0FBS0EsVUFBTWdDLE9BQU8sR0FBRyxLQUFLQyxXQUFMLENBQWlCN0IsS0FBakIsQ0FBaEI7O0FBRUEsVUFBTUgsTUFBTSxHQUFHLEtBQUtDLFVBQUwsQ0FBZ0IyQixHQUFoQixDQUFmOztBQUNBLFFBQUk1QixNQUFKLEVBQVk7QUFDUixZQUFNRSxNQUFNLEdBQUc7QUFDWHpELFFBQUFBLE9BQU8sRUFBRXVELE1BREU7QUFFWEcsUUFBQUEsS0FBSyxFQUFFNEIsT0FGSTtBQUdYRixRQUFBQSxJQUFJLEVBQUVBO0FBSEssT0FBZjs7QUFNQSxVQUFJO0FBQ0EsY0FBTTtBQUFFL0UsVUFBQUE7QUFBRixZQUFjLEtBQUtYLFFBQUwsQ0FBY2lFLE9BQWQsQ0FBc0JXLFVBQVUsSUFBSSxLQUFLN0QsWUFBekMsRUFBdURnRCxNQUF2RCxDQUFwQjtBQUNBLGFBQUsvQyxhQUFMLENBQW1CTCxPQUFuQjtBQUNILE9BSEQsQ0FJQSxPQUFPTixDQUFQLEVBQVU7QUFDTlksUUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsbUNBQWtDYixDQUFFLEVBQWpEO0FBQ0g7QUFDSjtBQUNKOztBQUNrQixRQUFicUUsYUFBYSxDQUFDMUIsTUFBRCxFQUFTd0IsSUFBVCxFQUFlO0FBQzlCLFFBQUksQ0FBQ0EsSUFBSSxDQUFDc0IsSUFBTixJQUFjLENBQUN0QixJQUFJLENBQUNzQixJQUFMLENBQVVDLE1BQTdCLEVBQXFDO0FBQ2pDO0FBQ0g7O0FBQ0QsVUFBTS9CLEtBQUssR0FBR1EsSUFBSSxDQUFDdEUsSUFBbkI7QUFDQSxVQUFNdUYsR0FBRyxHQUFHakIsSUFBSSxDQUFDc0IsSUFBTCxDQUFVLENBQVYsQ0FBWjtBQUNBLFVBQU1KLElBQUksR0FBR2xCLElBQUksQ0FBQ2tCLElBQWxCO0FBQ0EsUUFBSUYsTUFBTSxHQUFHNUIsU0FBYjs7QUFDQSxRQUFJLEtBQUtsRSx3QkFBTCxDQUE4QnNELE1BQTlCLENBQUosRUFBMkM7QUFDdkN3QyxNQUFBQSxNQUFNLEdBQUcsS0FBSzlGLHdCQUFMLENBQThCc0QsTUFBOUIsQ0FBVDtBQUNILEtBRkQsTUFFTyxJQUFJLEtBQUt2RCw0QkFBTCxDQUFrQ3VELE1BQWxDLENBQUosRUFBK0M7QUFDbER3QyxNQUFBQSxNQUFNLEdBQUcsS0FBSy9GLDRCQUFMLENBQWtDdUQsTUFBbEMsQ0FBVDtBQUNIOztBQUNELFVBQU0sS0FBS2dELFNBQUwsQ0FBZTtBQUFFM0QsTUFBQUEsT0FBTyxFQUFFdUIsU0FBWDtBQUFzQlosTUFBQUEsTUFBdEI7QUFBOEJ3QyxNQUFBQSxNQUE5QjtBQUFzQ3hCLE1BQUFBLEtBQXRDO0FBQTZDeUIsTUFBQUEsR0FBN0M7QUFBa0RDLE1BQUFBO0FBQWxELEtBQWYsQ0FBTjtBQUNIOztBQUNjLFFBQVRNLFNBQVMsQ0FBQztBQUFFM0QsSUFBQUEsT0FBRjtBQUFXVyxJQUFBQSxNQUFYO0FBQW1Cd0MsSUFBQUEsTUFBbkI7QUFBMkJ4QixJQUFBQSxLQUEzQjtBQUFrQ3lCLElBQUFBLEdBQWxDO0FBQXVDQyxJQUFBQTtBQUF2QyxHQUFELEVBQWdEO0FBRTNELFFBQUksQ0FBQyxLQUFLM0UsWUFBVixFQUF3QjtBQUNwQjtBQUNIOztBQUNELFVBQU02RCxVQUFVLEdBQUdZLE1BQU0sR0FDckIsS0FBS2pHLGdCQUFMLENBQXNCaUcsTUFBdEIsQ0FEcUIsR0FFbkJ4QyxNQUFNLEdBQUcsS0FBSzFELGdCQUFMLENBQXNCMEQsTUFBdEIsQ0FBSCxHQUNOWCxPQUFPLEdBQUcsS0FBS2hELGlCQUFMLENBQXVCZ0QsT0FBdkIsQ0FBSCxHQUNQdUIsU0FKTjs7QUFLQSxVQUFNZ0MsT0FBTyxHQUFHLEtBQUtDLFdBQUwsQ0FBaUI3QixLQUFqQixDQUFoQjs7QUFFQSxVQUFNSCxNQUFNLEdBQUcsS0FBS0MsVUFBTCxDQUFnQjJCLEdBQWhCLENBQWY7O0FBQ0EsUUFBSTVCLE1BQUosRUFBWTtBQUNSLFlBQU1FLE1BQU0sR0FBRztBQUNYekQsUUFBQUEsT0FBTyxFQUFFdUQsTUFERTtBQUVYRyxRQUFBQSxLQUFLLEVBQUU0QixPQUZJO0FBR1hGLFFBQUFBLElBQUksRUFBRUE7QUFISyxPQUFmOztBQU1BLFVBQUk7QUFDQSxjQUFNO0FBQUUvRSxVQUFBQTtBQUFGLFlBQWMsS0FBS1gsUUFBTCxDQUFjaUUsT0FBZCxDQUFzQlcsVUFBVSxJQUFJLEtBQUs3RCxZQUF6QyxFQUF1RGdELE1BQXZELENBQXBCO0FBQ0EsYUFBSy9DLGFBQUwsQ0FBbUJMLE9BQW5CO0FBQ0gsT0FIRCxDQUlBLE9BQU9OLENBQVAsRUFBVTtBQUNOWSxRQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxtQ0FBa0NiLENBQUUsRUFBakQ7QUFDSDtBQUNKO0FBQ0o7O0FBQzhCLFFBQXpCZSx5QkFBeUIsR0FBRztBQUM5QixTQUFLLE1BQU1vQixVQUFYLElBQXlCeUQsTUFBTSxDQUFDQyxJQUFQLENBQVksS0FBSzdHLGlCQUFqQixDQUF6QixFQUE4RDtBQUMxRCxZQUFNK0QsU0FBUyxHQUFHLEtBQUsvRCxpQkFBTCxDQUF1Qm1ELFVBQXZCLENBQWxCO0FBQ0EsWUFBTWhDLE9BQU8sR0FBRyxLQUFLaEIsd0JBQUwsQ0FBOEJnRCxVQUE5QixDQUFoQjtBQUNBLGFBQU8sS0FBS25ELGlCQUFMLENBQXVCbUQsVUFBdkIsQ0FBUDtBQUNBLFlBQU0yRCxjQUFjLEdBQUczRixPQUFPLENBQUNjLElBQVIsQ0FBYUMsQ0FBQyxJQUFJQSxDQUFDLENBQUNDLE1BQUYsS0FBYUMsZ0JBQU9DLE1BQXRDLENBQXZCO0FBQ0EsWUFBTTRDLGlCQUFpQixHQUFHO0FBQ3RCOUMsUUFBQUEsTUFBTSxFQUFFMkUsY0FBYyxHQUFHLFFBQUgsR0FBYztBQURkLE9BQTFCOztBQUlBLFVBQUk7QUFDQSxjQUFNO0FBQUV4RixVQUFBQTtBQUFGLFlBQWMsS0FBS1gsUUFBTCxDQUFjcUUsY0FBZCxDQUE2QmpCLFNBQTdCLEVBQXdDa0IsaUJBQXhDLENBQXBCO0FBQ0EsYUFBS3RELGFBQUwsQ0FBbUJMLE9BQW5CO0FBQ0gsT0FIRCxDQUlBLE9BQU9OLENBQVAsRUFBVTtBQUNOWSxRQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxxQ0FBb0NiLENBQUUsRUFBbkQ7QUFDSDtBQUNKO0FBQ0o7O0FBQ0R3RixFQUFBQSxXQUFXLENBQUNPLE9BQUQsRUFBVTtBQUNqQixRQUFJQSxPQUFKLEVBQWE7QUFDVCxhQUFPQSxPQUFPLENBQUM3QyxXQUFSLEVBQVA7QUFDSDs7QUFDRCxXQUFPLE1BQVA7QUFDSDs7QUFnQkR3QixFQUFBQSxZQUFZLENBQUNQLElBQUQsRUFBTztBQUNmLFFBQUl0RSxJQUFKOztBQUVBLFFBQUlzRSxJQUFJLENBQUN0RSxJQUFMLEtBQWMsYUFBZCxJQUErQnNFLElBQUksQ0FBQ3NCLElBQUwsQ0FBVUMsTUFBVixHQUFtQixDQUF0RCxFQUF5RDtBQUNyRDdGLE1BQUFBLElBQUksR0FBR3NFLElBQUksQ0FBQ3NCLElBQUwsQ0FBVSxDQUFWLENBQVA7QUFDSCxLQUZELE1BR0ssSUFBSXRCLElBQUksQ0FBQzZCLFNBQVQsRUFBb0I7QUFDckJuRyxNQUFBQSxJQUFJLEdBQUdzRSxJQUFJLENBQUM2QixTQUFaO0FBQ0gsS0FGSSxNQUdBLElBQUk3QixJQUFJLENBQUNDLE1BQVQsRUFBaUI7QUFDbEJ2RSxNQUFBQSxJQUFJLEdBQUksR0FBRXNFLElBQUksQ0FBQ0MsTUFBTyxJQUFHRCxJQUFJLENBQUN0RSxJQUFLLEVBQW5DO0FBQ0gsS0FGSSxNQUdBO0FBQ0RBLE1BQUFBLElBQUksR0FBR3NFLElBQUksQ0FBQ3RFLElBQVo7QUFDSDs7QUFJRCxRQUFJQSxJQUFJLENBQUM2RixNQUFMLEdBQWNwSCxlQUFsQixFQUFtQztBQUMvQnVCLE1BQUFBLElBQUksR0FBR0EsSUFBSSxDQUFDb0csU0FBTCxDQUFlLENBQWYsRUFBa0IzSCxlQUFlLEdBQUMsQ0FBbEMsSUFBdUMsS0FBOUM7QUFDSDs7QUFDRCxXQUFPdUIsSUFBUDtBQUNIOztBQUdENEQsRUFBQUEsVUFBVSxDQUFDMkIsR0FBRCxFQUFNO0FBRVosUUFBSSxPQUFPQSxHQUFQLEtBQWUsV0FBZixJQUE4QkEsR0FBRyxLQUFLLElBQTFDLEVBQWdEO0FBQzVDLGFBQU8sSUFBUDtBQUNIOztBQUVELFFBQUksT0FBT0EsR0FBUCxLQUFlLFFBQWYsSUFBMkJBLEdBQUcsWUFBWWMsTUFBOUMsRUFBc0Q7QUFDbEQsYUFBT2QsR0FBUDtBQUNIOztBQUVELFFBQUk7QUFDQSxhQUFPZSxJQUFJLENBQUNDLFNBQUwsQ0FBZWhCLEdBQWYsQ0FBUDtBQUNILEtBRkQsQ0FFRSxPQUFPcEYsQ0FBUCxFQUFVO0FBQ1JZLE1BQUFBLE9BQU8sQ0FBQ3lGLEtBQVIsQ0FBYyx5REFBZDtBQUNIO0FBQ0o7O0FBRUQxRixFQUFBQSxhQUFhLENBQUNMLE9BQUQsRUFBVTtBQUNuQkEsSUFBQUEsT0FBTyxDQUFDZ0csS0FBUixDQUFlQyxHQUFELElBQVM7QUFDbkIzRixNQUFBQSxPQUFPLENBQUM0RixHQUFSLENBQVksWUFBWixFQUEwQkQsR0FBMUI7QUFDSCxLQUZEO0FBR0EsU0FBS2pILFFBQUwsQ0FBY21ELElBQWQsQ0FBbUJuQyxPQUFuQjtBQUNIOztBQXRkMEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qXHJcbiAqIE94eWdlbiBSZXBvcnRlciBmb3IgUmVwb3J0UG9ydGFsXHJcbiAqL1xyXG5pbXBvcnQgUmVwb3J0ZXJCYXNlIGZyb20gJy4uL3JlcG9ydGVyL1JlcG9ydGVyQmFzZSc7XHJcbmltcG9ydCBTdGF0dXMgZnJvbSAnLi4vbW9kZWwvc3RhdHVzJztcclxuY29uc3QgUlBDbGllbnQgPSByZXF1aXJlKCdAb3h5Z2VuaHEvcnAtY2xpZW50LWphdmFzY3JpcHQnKTtcclxuY29uc3QgTEFVTkNIX01PREVTID0ge1xyXG4gICAgREVGQVVMVDogJ0RFRkFVTFQnLFxyXG4gICAgREVCVUc6ICdERUJVRycsXHJcbn07XHJcbmNvbnN0IFRFU1RfSVRFTV9UWVBFUyA9IHtcclxuICAgIFNVSVRFOiAnU1VJVEUnLFxyXG4gICAgVEVTVDogJ1RFU1QnLFxyXG4gICAgU1RFUDogJ1NURVAnLFxyXG59O1xyXG5jb25zdCBNQVhfTkFNRV9MRU5HVEggPSAxMjg7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBvcnRQb3J0YWxSZXBvcnRlciBleHRlbmRzIFJlcG9ydGVyQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCByZXBvcnRlck9wdHMsIGFnZ3JlZ2F0b3IpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICB0aGlzLnJlcG9ydGVyT3B0cyA9IHJlcG9ydGVyT3B0cyB8fCBvcHRpb25zLnJwO1xyXG4gICAgICAgIHRoaXMucmVwb3J0U3RlcHMgPSByZXBvcnRlck9wdHMucmVwb3J0U3RlcHMgfHwgdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlcG9ydExvZ3MgPSByZXBvcnRlck9wdHMucmVwb3J0TG9ncyB8fCBmYWxzZTtcclxuICAgICAgICB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jYkNhc2VUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jYlN1aXRlUmVzdWx0TGlzdEJ5UmVmSWQgPSB7fTtcclxuICAgICAgICB0aGlzLmNiQ2FzZVRvQ3VycmVudFRyYW5zYWN0aW9uSWQgPSB7fTtcclxuICAgICAgICB0aGlzLmNiQ2FzZVRvQ3VycmVudFN1YlN0ZXBJZCA9IHt9O1xyXG4gICAgICAgIHRoaXMucHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhdGhpcy5yZXBvcnRlck9wdHNcclxuICAgICAgICAgICAgfHwgIXRoaXMucmVwb3J0ZXJPcHRzLmFwaUtleVxyXG4gICAgICAgICAgICB8fCAhdGhpcy5yZXBvcnRlck9wdHMuZW5kcG9pbnRcclxuICAgICAgICAgICAgfHwgIXRoaXMucmVwb3J0ZXJPcHRzLnByb2plY3RcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXBvcnRQb3J0YWwgb3B0aW9ucyBhcmUgbWlzc2luZyBpbiBveHlnZW4uY29uZiBmaWxlLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFnZ3JlZ2F0b3IgPSBhZ2dyZWdhdG9yO1xyXG4gICAgICAgIHRoaXMucnBDbGllbnQgPSBuZXcgUlBDbGllbnQoe1xyXG4gICAgICAgICAgICBsYXVuY2g6IHRoaXMucmVwb3J0ZXJPcHRzLmxhdW5jaCB8fCB0aGlzLm9wdGlvbnMubmFtZSxcclxuICAgICAgICAgICAgLi4udGhpcy5yZXBvcnRlck9wdHNcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnBDbGllbnQuY2hlY2tDb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUlAgLSBFcnJvciBjb25uZWN0aW5nIHRvIHRoZSBzZXJ2ZXI6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIGdlbmVyYXRlKHJlc3VsdHMpIHtcclxuICAgIH1cclxuICAgIC8vIEV2ZW50c1xyXG4gICAgYXN5bmMgb25MYXVuY2hTdGFydCh7IG9wdGlvbnMgfSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgdGVtcElkLCBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnN0YXJ0TGF1bmNoKHtcclxuICAgICAgICAgICAgICAgIG1vZGU6IHRoaXMucmVwb3J0ZXJPcHRzLm1vZGUgfHwgTEFVTkNIX01PREVTLkRFRkFVTFQsXHJcbiAgICAgICAgICAgICAgICBkZWJ1ZzogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnRlbXBMYXVuY2hJZCA9IHRlbXBJZDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIHN0YXJ0IGxhdW5jaDogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uTGF1bmNoRW5kKHsgcmVzdWx0cyB9KSB7XHJcbiAgICAgICAgLy8gcmVwb3J0IHRoZSBlbmQgb2YgYWxsIHN0YXJ0ZWQgc3VpdGVzXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fcmVwb3J0RW5kT2ZTdGFydGVkU3VpdGVzKCk7XHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGxhdW5jaCBzdGF0dXNcclxuICAgICAgICBjb25zdCBoYXNGYWlsZWQgPSByZXN1bHRzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMucHJvbWlzZXMpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSBhd2FpdCB0aGlzLnJwQ2xpZW50LmZpbmlzaExhdW5jaCh0aGlzLnRlbXBMYXVuY2hJZCwge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBoYXNGYWlsZWQgPyAnRkFJTEVEJyA6ICdQQVNTRUQnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBhd2FpdCBwcm9taXNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZW5kIGxhdW5jaDogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uUnVubmVyU3RhcnQoeyByaWQsIG9wdHMsIGNhcHMgfSkge1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25SdW5uZXJFbmQoeyByaWQsIHJlc3VsdCB9KSB7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblN1aXRlU3RhcnQoeyByaWQsIHN1aXRlSWQsIHN1aXRlOiBzdWl0ZURlZiB9KSB7XHJcbiAgICAgICAgLy8gaW4gcGFyYWxsZWwgdGVzdCBleGVjdXRpb24sIG9uU3VpdGVTdGFydCB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWUgc3VpdGUgXHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGNhbGwgXCJzdGFydFRlc3RJdGVtXCIgdGhlIHNhbWUgc3VpdGUgb25seSBvbmNlXHJcbiAgICAgICAgY29uc3Qgc3VpdGVSZWZJZCA9IHN1aXRlRGVmLnJlZklkO1xyXG4gICAgICAgIGlmICh0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlUmVmSWRdKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gYXNzaWduIGVtcHR5IG9iamVjdCBhcyBhIGZvcm0gb2YgbXVsdGktdGhyZWFkIGxvY2ssXHJcbiAgICAgICAgLy8gc28gdGhlIHBhcmFsbGVsIGNhbGwgdG8gb25TdWl0ZVN0YXJ0IGZyb20gdGhlIG5leHQgdGhyZWFkXHJcbiAgICAgICAgLy8gd2lsbCBub3QgdHJ5IHRvIHByb2NlZWQgd2l0aCB0aGUgY29kZSBiZWxvd1xyXG4gICAgICAgIHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVSZWZJZF0gPSB7fTtcclxuICAgICAgICB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHN1aXRlRGVmLm5hbWUgfHwgdGhpcy5vcHRpb25zLm5hbWUsXHJcbiAgICAgICAgICAgIHR5cGU6IFRFU1RfSVRFTV9UWVBFUy5TVUlURSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydFRlc3RJdGVtKHN0YXJ0VGVzdEl0ZW1SZXEsIHRoaXMudGVtcExhdW5jaElkKTtcclxuICAgICAgICAgICAgdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZVJlZklkXSA9IHRlbXBJZDtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc3RhcnQgc3VpdGUgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uU3VpdGVFbmQoeyByaWQsIHN1aXRlSWQsIHJlc3VsdCB9KSB7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVSZWZJZCA9IHJlc3VsdC5yZWZJZDtcclxuICAgICAgICB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXSAmJiB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXS5wdXNoKHJlc3VsdCk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkNhc2VTdGFydCh7IHJpZCwgc3VpdGVJZCwgc3VpdGVSZWZJZCwgY2FzZUlkLCAnY2FzZSc6IGNhc2VEZWYgfSkge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IGNhc2VEZWYubmFtZSxcclxuICAgICAgICAgICAgdHlwZTogVEVTVF9JVEVNX1RZUEVTLlRFU1QsXHJcbiAgICAgICAgICAgIGNvZGVSZWY6IGNhc2VEZWYucGF0aCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHJwU3VpdGVJZCA9IHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVSZWZJZF07XHJcbiAgICAgICAgaWYgKCFycFN1aXRlSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgeyB0ZW1wSWQsIHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc3RhcnRUZXN0SXRlbShzdGFydFRlc3RJdGVtUmVxLCB0aGlzLnRlbXBMYXVuY2hJZCwgcnBTdWl0ZUlkKTtcclxuICAgICAgICAgICAgdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF0gPSB0ZW1wSWQ7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIHN0YXJ0IGNhc2UgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uQ2FzZUVuZCh7IHJpZCwgc3VpdGVJZCwgc3VpdGVSZWZJZCwgY2FzZUlkLCByZXN1bHQgfSkge1xyXG4gICAgICAgIGNvbnN0IHJwVGVzdElkID0gdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF07XHJcbiAgICAgICAgaWYgKCFycFRlc3RJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJyAmJiByZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICBjb25zdCBycEZpbGUgPSByZXN1bHQuc2NyZWVuc2hvdCA/XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdzY3JlZW5zaG90JyxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZS9wbmcnLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogcmVzdWx0LnNjcmVlbnNob3QsXHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsb2dNc2cgPSB0aGlzLl9zdHJpbmdpZnkocmVzdWx0LmZhaWx1cmUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGlmIChsb2dNc2cpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ1JlcSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXHJcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcidcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc2VuZExvZyhycFRlc3RJZCwgbG9nUmVxLCBycEZpbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc2VuZCBsb2cgZm9yIGZpbmlzaGVkIGNhc2UgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0cmFuc0lkID0gdGhpcy5jYkNhc2VUb0N1cnJlbnRUcmFuc2FjdGlvbklkW2Nhc2VJZF07XHJcblxyXG4gICAgICAgIGlmICh0cmFuc0lkKSB7XHJcbiAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgY2FsY3VsYXRlIHByb3BlciBzdGF0dXNcclxuICAgICAgICAgICAgY29uc3QgZmluaXNoVHJhbnNhY3Rpb25SZXEgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdwYXNzZWQnIC8vcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zUnBJZCA9IHRoaXMuY2JTdGVwVG9ScElkSGFzaFt0cmFuc0lkXTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuZmluaXNoVGVzdEl0ZW0odHJhbnNScElkLCBmaW5pc2hUcmFuc2FjdGlvblJlcSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVByb21pc2UocHJvbWlzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBmaW5pc2ggdHJhbnNhY3Rpb24gaXRlbSBvbiBjYXNlIGVuZDogJHtlfWApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYkNhc2VUb0N1cnJlbnRUcmFuc2FjdGlvbklkW2Nhc2VJZF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaW5pc2hUZXN0SXRlbVJlcSA9IHtcclxuICAgICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LmZpbmlzaFRlc3RJdGVtKHJwVGVzdElkLCBmaW5pc2hUZXN0SXRlbVJlcSk7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGZpbmlzaCBjYXNlIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdGVwU3RhcnQoeyByaWQsIGNhc2VJZCwgc3RlcCB9KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlcG9ydFN0ZXBzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN0ZXAubW9kdWxlICYmIHN0ZXAubW9kdWxlID09PSAnbG9nJykge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlcG9ydExvZ1N0ZXAoY2FzZUlkLCBzdGVwKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBycENhc2VJZCA9IHRoaXMuY2JDYXNlVG9ScElkSGFzaFtjYXNlSWRdO1xyXG4gICAgICAgIGxldCBycFBhcmVudElkO1xyXG5cclxuICAgICAgICBjb25zdCB0cmFuc0lkID0gdGhpcy5jYkNhc2VUb0N1cnJlbnRUcmFuc2FjdGlvbklkW2Nhc2VJZF07XHJcblxyXG4gICAgICAgIGlmIChzdGVwLm5hbWUgPT09ICd0cmFuc2FjdGlvbicpIHtcclxuICAgICAgICAgICAgaWYgKHRyYW5zSWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgY2FsY3VsYXRlIHByb3BlciBzdGF0dXNcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbmlzaFRyYW5zYWN0aW9uUmVxID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3Bhc3NlZCcgLy9yZXN1bHQuc3RhdHVzLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNScElkID0gdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3RyYW5zSWRdO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5maW5pc2hUZXN0SXRlbSh0cmFuc1JwSWQsIGZpbmlzaFRyYW5zYWN0aW9uUmVxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVByb21pc2UocHJvbWlzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBmaW5pc2ggdHJhbnNhY3Rpb24gaXRlbSBvbiBjYXNlIGVuZDogJHtlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNiQ2FzZVRvQ3VycmVudFRyYW5zYWN0aW9uSWRbY2FzZUlkXSA9IHN0ZXAuaWQ7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNiQ2FzZVRvQ3VycmVudFN1YlN0ZXBJZFtjYXNlSWRdO1xyXG4gICAgICAgICAgICBycFBhcmVudElkID0gcnBDYXNlSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNiQ2FzZVRvQ3VycmVudFN1YlN0ZXBJZFtjYXNlSWRdID0gc3RlcC5pZDtcclxuICAgICAgICAgICAgcnBQYXJlbnRJZCA9IHRyYW5zSWQgPyB0aGlzLmNiU3RlcFRvUnBJZEhhc2hbdHJhbnNJZF0gOiBycENhc2VJZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcnBQYXJlbnRJZCB8fCAhcnBDYXNlSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdGVwTmFtZSA9IHRoaXMuX2dldFN0ZXBOYW1lKHN0ZXApO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHN0ZXBOYW1lLFxyXG4gICAgICAgICAgICB0eXBlOiBURVNUX0lURU1fVFlQRVMuU1RFUCxcclxuICAgICAgICAgICAgLy8gXCJjb2RlUmVmXCIgKyBcInBhcmFtZXRlcnNcIiB1c2VkIGJ5IFJQIGxpYiB0byBnZW5lcmF0ZSB0ZXN0Q2FzZUlkIGlmIHRlc3RDYXNlSWQgaXMgbm90IGRlZmluZWRcclxuICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXBvcnRwb3J0YWwvY2xpZW50LWphdmFzY3JpcHQvYmxvYi80ODZlZjcwYzYzOGE5YTIzMjY3MjkwYzYyZGYxZmFmOTAwZjdkZjZhL2xpYi9yZXBvcnQtcG9ydGFsLWNsaWVudC5qcyNMNDk3XHJcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgZGlzYWJsZWQgZm9yIG5vdy4gbm90IHN1cmUgaWYgYWN0dWFsbHkgbmVlZGVkLi4uXHJcbiAgICAgICAgICAgIC8vcGFyYW1ldGVyczogdGhpcy5fZ2V0UnBBcmdzKHN0ZXAuYXJncyksXHJcbiAgICAgICAgICAgIGNvZGVSZWY6IHN0ZXAubG9jYXRpb24sXHJcbiAgICAgICAgICAgIHRlc3RDYXNlSWQ6IHJwQ2FzZUlkLFxyXG4gICAgICAgICAgICBoYXNTdGF0czogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgeyB0ZW1wSWQsIHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc3RhcnRUZXN0SXRlbShzdGFydFRlc3RJdGVtUmVxLCB0aGlzLnRlbXBMYXVuY2hJZCwgcnBQYXJlbnRJZCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2JTdGVwVG9ScElkSGFzaFtzdGVwLmlkXSA9IHRlbXBJZDtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc3RhcnQgc3RlcCBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25TdGVwRW5kKHsgcmlkLCBjYXNlSWQsIHN0ZXA6IHJlc3VsdCB9KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlcG9ydFN0ZXBzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdC5uYW1lICYmIChyZXN1bHQubmFtZS5zdGFydHNXaXRoKCdsb2cuJykgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5uYW1lLnN0YXJ0c1dpdGgoJ3dlYi50cmFuc2FjdGlvbicpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubmFtZS5zdGFydHNXaXRoKCdtb2IudHJhbnNhY3Rpb24nKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBycFN0ZXBJZCA9IHRoaXMuY2JTdGVwVG9ScElkSGFzaFtyZXN1bHQuaWRdO1xyXG4gICAgICAgIGlmICghcnBTdGVwSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGVsZXRlIHRoaXMuY2JDYXNlVG9DdXJyZW50U3ViU3RlcElkW2Nhc2VJZF07XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJyAmJiByZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICBjb25zdCBycEZpbGUgPSByZXN1bHQuc2NyZWVuc2hvdCA/XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdzY3JlZW5zaG90JyxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZS9wbmcnLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogcmVzdWx0LnNjcmVlbnNob3QsXHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsb2dNc2cgPSB0aGlzLl9zdHJpbmdpZnkocmVzdWx0LmZhaWx1cmUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGlmIChsb2dNc2cpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ1JlcSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXHJcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogcnBGaWxlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zZW5kTG9nKHJwU3RlcElkLCBsb2dSZXEsIHJwRmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBzZW5kIGxvZyBmb3IgZmluaXNoZWQgc3RlcCBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmluaXNoVGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5maW5pc2hUZXN0SXRlbShycFN0ZXBJZCwgZmluaXNoVGVzdEl0ZW1SZXEpO1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVByb21pc2UocHJvbWlzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBmaW5pc2ggc3RlcCBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25Mb2coeyBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXBJZCwgbGV2ZWwsIG1zZywgdGltZSwgc3JjIH0pIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVwb3J0TG9ncykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE94eWdlbiBtaWdodCBzdGFydCBnZW5lcmF0aW5nIGxvZ3MgYmVmb3JlIG9uUnVubmVyU3RhcnQgZXZlbnQsIGlnbm9yZSB0aGVtXHJcbiAgICAgICAgaWYgKCF0aGlzLnRlbXBMYXVuY2hJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwUGFyZW50SWQgPSBzdGVwSWQgP1xyXG4gICAgICAgICAgICB0aGlzLmNiU3RlcFRvUnBJZEhhc2hbc3RlcElkXVxyXG4gICAgICAgICAgICA6IGNhc2VJZCA/IHRoaXMuY2JDYXNlVG9ScElkSGFzaFtjYXNlSWRdXHJcbiAgICAgICAgICAgIDogc3VpdGVJZCA/IHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVJZF1cclxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgcnBMZXZlbCA9IHRoaXMuX2dldFJwTGV2ZWwobGV2ZWwpO1xyXG5cclxuICAgICAgICBjb25zdCBsb2dNc2cgPSB0aGlzLl9zdHJpbmdpZnkobXNnKTtcclxuICAgICAgICBpZiAobG9nTXNnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ1JlcSA9IHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGxvZ01zZyxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBycExldmVsLFxyXG4gICAgICAgICAgICAgICAgdGltZTogdGltZSxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc2VuZExvZyhycFBhcmVudElkIHx8IHRoaXMudGVtcExhdW5jaElkLCBsb2dSZXEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gY3JlYXRlIGxvZyBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyByZXBvcnRMb2dTdGVwKGNhc2VJZCwgc3RlcCkge1xyXG4gICAgICAgIGlmICghc3RlcC5hcmdzIHx8ICFzdGVwLmFyZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBzdGVwLm5hbWU7XHJcbiAgICAgICAgY29uc3QgbXNnID0gc3RlcC5hcmdzWzBdO1xyXG4gICAgICAgIGNvbnN0IHRpbWUgPSBzdGVwLnRpbWU7XHJcbiAgICAgICAgbGV0IHN0ZXBJZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAodGhpcy5jYkNhc2VUb0N1cnJlbnRTdWJTdGVwSWRbY2FzZUlkXSkge1xyXG4gICAgICAgICAgICBzdGVwSWQgPSB0aGlzLmNiQ2FzZVRvQ3VycmVudFN1YlN0ZXBJZFtjYXNlSWRdO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYkNhc2VUb0N1cnJlbnRUcmFuc2FjdGlvbklkW2Nhc2VJZF0pIHtcclxuICAgICAgICAgICAgc3RlcElkID0gdGhpcy5jYkNhc2VUb0N1cnJlbnRUcmFuc2FjdGlvbklkW2Nhc2VJZF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZFJwTG9nKHsgc3VpdGVJZDogdW5kZWZpbmVkLCBjYXNlSWQsIHN0ZXBJZCwgbGV2ZWwsIG1zZywgdGltZSB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIHNlbmRScExvZyh7IHN1aXRlSWQsIGNhc2VJZCwgc3RlcElkLCBsZXZlbCwgbXNnLCB0aW1lIH0pIHtcclxuICAgICAgICAvLyBPeHlnZW4gbWlnaHQgc3RhcnQgZ2VuZXJhdGluZyBsb2dzIGJlZm9yZSBvblJ1bm5lclN0YXJ0IGV2ZW50LCBpZ25vcmUgdGhlbVxyXG4gICAgICAgIGlmICghdGhpcy50ZW1wTGF1bmNoSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBycFBhcmVudElkID0gc3RlcElkID9cclxuICAgICAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3N0ZXBJZF1cclxuICAgICAgICAgICAgOiBjYXNlSWQgPyB0aGlzLmNiQ2FzZVRvUnBJZEhhc2hbY2FzZUlkXVxyXG4gICAgICAgICAgICA6IHN1aXRlSWQgPyB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlSWRdXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IHJwTGV2ZWwgPSB0aGlzLl9nZXRScExldmVsKGxldmVsKTtcclxuXHJcbiAgICAgICAgY29uc3QgbG9nTXNnID0gdGhpcy5fc3RyaW5naWZ5KG1zZyk7XHJcbiAgICAgICAgaWYgKGxvZ01zZykge1xyXG4gICAgICAgICAgICBjb25zdCBsb2dSZXEgPSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXHJcbiAgICAgICAgICAgICAgICBsZXZlbDogcnBMZXZlbCxcclxuICAgICAgICAgICAgICAgIHRpbWU6IHRpbWUsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnNlbmRMb2cocnBQYXJlbnRJZCB8fCB0aGlzLnRlbXBMYXVuY2hJZCwgbG9nUmVxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGNyZWF0ZSBsb2cgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgX3JlcG9ydEVuZE9mU3RhcnRlZFN1aXRlcygpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IHN1aXRlUmVmSWQgb2YgT2JqZWN0LmtleXModGhpcy5jYlN1aXRlVG9ScElkSGFzaCkpIHtcclxuICAgICAgICAgICAgY29uc3QgcnBTdWl0ZUlkID0gdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZVJlZklkXTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuY2JTdWl0ZVJlc3VsdExpc3RCeVJlZklkW3N1aXRlUmVmSWRdO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZVJlZklkXTtcclxuICAgICAgICAgICAgY29uc3QgaGFzRmFpbGVkU3VpdGUgPSByZXN1bHRzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmlzaFRlc3RJdGVtUmVxID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBoYXNGYWlsZWRTdWl0ZSA/ICdmYWlsZWQnIDogJ3Bhc3NlZCcsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LmZpbmlzaFRlc3RJdGVtKHJwU3VpdGVJZCwgZmluaXNoVGVzdEl0ZW1SZXEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZmluaXNoIHN1aXRlIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIF9nZXRScExldmVsKG94TGV2ZWwpIHtcclxuICAgICAgICBpZiAob3hMZXZlbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb3hMZXZlbC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJ2luZm8nO1xyXG4gICAgfVxyXG4gICAgLypfZ2V0UnBBcmdzKGNiQXJncykge1xyXG4gICAgICAgIGlmICghY2JBcmdzIHx8ICFjYkFyZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwQXJncyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGNiQXJncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBhcmcgPSBjYkFyZ3NbaV07XHJcbiAgICAgICAgICAgIGxldCBhcmdTdHIgPSB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fCBhcmcgaW5zdGFuY2VvZiBTdHJpbmcgPyBhcmcgOiBKU09OLnN0cmluZ2lmeShhcmcpO1xyXG4gICAgICAgICAgICBycEFyZ3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBrZXk6IGBhcmcke2l9YCxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBhcmdTdHJcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBycEFyZ3M7XHJcbiAgICB9Ki9cclxuICAgIF9nZXRTdGVwTmFtZShzdGVwKSB7XHJcbiAgICAgICAgbGV0IG5hbWU7XHJcblxyXG4gICAgICAgIGlmIChzdGVwLm5hbWUgPT09ICd0cmFuc2FjdGlvbicgJiYgc3RlcC5hcmdzLmxlbmd0aCA+IDApIHsgIC8vIEZJWE1FOiBzdGVwcyBuZWVkIHRvIGJlIG5lc3RlZCB1bmRlciB0cmFuc2FjdGlvbnNcclxuICAgICAgICAgICAgbmFtZSA9IHN0ZXAuYXJnc1swXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc3RlcC5zaWduYXR1cmUpIHtcclxuICAgICAgICAgICAgbmFtZSA9IHN0ZXAuc2lnbmF0dXJlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzdGVwLm1vZHVsZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogaXMgdGhpcyBldmVyIHJlYWNoZWQ/IFwic3RlcC5zaWduYXR1cmVcIiBzZWVtcyB0byBhbHdheXMgZXhpc3RcclxuICAgICAgICAgICAgbmFtZSA9IGAke3N0ZXAubW9kdWxlfS4ke3N0ZXAubmFtZX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbmFtZSA9IHN0ZXAubmFtZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG1heGltdW0gYWxsb3dlZCBuYW1lIGxlbmd0aCBpbiBSUCBpcyAxMDI0IGJ5dGVzXHJcbiAgICAgICAgLy8gd2UgdHJ1bmNhdGUgaXQgZXZlbiBsb3dlciBzbyBpdCB3aWxsIGRpc3BsYXkgbmljZWx5XHJcbiAgICAgICAgaWYgKG5hbWUubGVuZ3RoID4gTUFYX05BTUVfTEVOR1RIKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBNQVhfTkFNRV9MRU5HVEgtMykgKyAnLi4uJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmV0dXJucyBudWxsIGlmIG1zZyBjYW5ub3QgYmUgc3RyaW5naWZpZWQsIG9yIHN0cmlnaWZpZXMgaXQgaWYgaXQncyBub3QgYSBzdHJpbmcgYWxyZWFkeVxyXG4gICAgX3N0cmluZ2lmeShtc2cpIHtcclxuICAgICAgICAvLyB3ZSB0ZXN0IGZvciB1bmRlZmluZWQgYW5kIG51bGwgZXhwbGljaXRseSBvbiBwdXJwb3NlIGJlY2F1c2Ugb3RoZXIgZmFsc3kgdmFsdWVzIChlLmcuIDApIGFyZSBva1xyXG4gICAgICAgIGlmICh0eXBlb2YgbXNnID09PSAndW5kZWZpbmVkJyB8fCBtc2cgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgfHwgbXNnIGluc3RhbmNlb2YgU3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtc2c7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobXNnKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JQIC0gZXJyb3Igc2VuZGluZyBsb2c6IG1zZyBvYmplY3QgY2Fubm90IGJlIHNlcmlhbGl6ZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlUHJvbWlzZShwcm9taXNlKSB7XHJcbiAgICAgICAgcHJvbWlzZS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSUCBlcnJvcjogJywgZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnByb21pc2VzLnB1c2gocHJvbWlzZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiJdfQ==
|
|
478
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUmVwb3J0ZXJCYXNlIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfc3RhdHVzIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiUlBDbGllbnQiLCJMQVVOQ0hfTU9ERVMiLCJERUZBVUxUIiwiREVCVUciLCJURVNUX0lURU1fVFlQRVMiLCJTVUlURSIsIlRFU1QiLCJTVEVQIiwiTUFYX05BTUVfTEVOR1RIIiwiUmVwb3J0UG9ydGFsUmVwb3J0ZXIiLCJSZXBvcnRlckJhc2UiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJyZXBvcnRlck9wdHMiLCJhZ2dyZWdhdG9yIiwicnAiLCJyZXBvcnRTdGVwcyIsInJlcG9ydExvZ3MiLCJjYlN1aXRlVG9ScElkSGFzaCIsImNiQ2FzZVRvUnBJZEhhc2giLCJjYlN0ZXBUb1JwSWRIYXNoIiwiY2JTdWl0ZVJlc3VsdExpc3RCeVJlZklkIiwiY2JDYXNlVG9DdXJyZW50VHJhbnNhY3Rpb25JZCIsImNiQ2FzZVRvQ3VycmVudFN1YlN0ZXBJZCIsInByb21pc2VzIiwiYXBpS2V5IiwiZW5kcG9pbnQiLCJwcm9qZWN0IiwiRXJyb3IiLCJycENsaWVudCIsImxhdW5jaCIsIm5hbWUiLCJpbml0IiwiY2hlY2tDb25uZWN0IiwibWVzc2FnZSIsImdlbmVyYXRlIiwicmVzdWx0cyIsIm9uTGF1bmNoU3RhcnQiLCJ0ZW1wSWQiLCJwcm9taXNlIiwic3RhcnRMYXVuY2giLCJtb2RlIiwiZGVidWciLCJhdHRyaWJ1dGVzIiwidGVtcExhdW5jaElkIiwiaGFuZGxlUHJvbWlzZSIsImNvbnNvbGUiLCJkaXIiLCJvbkxhdW5jaEVuZCIsIl9yZXBvcnRFbmRPZlN0YXJ0ZWRTdWl0ZXMiLCJoYXNGYWlsZWQiLCJzb21lIiwieCIsInN0YXR1cyIsIlN0YXR1cyIsIkZBSUxFRCIsIlByb21pc2UiLCJhbGwiLCJmaW5pc2hMYXVuY2giLCJvblJ1bm5lclN0YXJ0IiwicmlkIiwib3B0cyIsImNhcHMiLCJvblJ1bm5lckVuZCIsInJlc3VsdCIsIm9uU3VpdGVTdGFydCIsInN1aXRlSWQiLCJzdWl0ZSIsInN1aXRlRGVmIiwic3VpdGVSZWZJZCIsInJlZklkIiwic3RhcnRUZXN0SXRlbVJlcSIsInR5cGUiLCJzdGFydFRlc3RJdGVtIiwib25TdWl0ZUVuZCIsInB1c2giLCJvbkNhc2VTdGFydCIsImNhc2VJZCIsImNhc2VEZWYiLCJjb2RlUmVmIiwicGF0aCIsInJwU3VpdGVJZCIsIm9uQ2FzZUVuZCIsInJwVGVzdElkIiwidG9Mb3dlckNhc2UiLCJmYWlsdXJlIiwicnBGaWxlIiwic2NyZWVuc2hvdCIsImNvbnRlbnQiLCJ1bmRlZmluZWQiLCJsb2dNc2ciLCJfc3RyaW5naWZ5IiwibG9nUmVxIiwibGV2ZWwiLCJzZW5kTG9nIiwidHJhbnNJZCIsImZpbmlzaFRyYW5zYWN0aW9uUmVxIiwidHJhbnNScElkIiwiZmluaXNoVGVzdEl0ZW0iLCJmaW5pc2hUZXN0SXRlbVJlcSIsIm9uU3RlcFN0YXJ0Iiwic3RlcCIsIm1vZHVsZSIsInJlcG9ydExvZ1N0ZXAiLCJycENhc2VJZCIsInJwUGFyZW50SWQiLCJpZCIsInN0ZXBOYW1lIiwiX2dldFN0ZXBOYW1lIiwibG9jYXRpb24iLCJ0ZXN0Q2FzZUlkIiwiaGFzU3RhdHMiLCJvblN0ZXBFbmQiLCJzdGFydHNXaXRoIiwicnBTdGVwSWQiLCJmaWxlIiwib25Mb2ciLCJzdGVwSWQiLCJtc2ciLCJ0aW1lIiwic3JjIiwicnBMZXZlbCIsIl9nZXRScExldmVsIiwiYXJncyIsImxlbmd0aCIsInNlbmRScExvZyIsIk9iamVjdCIsImtleXMiLCJoYXNGYWlsZWRTdWl0ZSIsIm94TGV2ZWwiLCJzaWduYXR1cmUiLCJzdWJzdHJpbmciLCJTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiZXJyb3IiLCJjYXRjaCIsImVyciIsImxvZyIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLXJwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLypcclxuICogT3h5Z2VuIFJlcG9ydGVyIGZvciBSZXBvcnRQb3J0YWxcclxuICovXHJcbmltcG9ydCBSZXBvcnRlckJhc2UgZnJvbSAnLi4vcmVwb3J0ZXIvUmVwb3J0ZXJCYXNlJztcclxuaW1wb3J0IFN0YXR1cyBmcm9tICcuLi9tb2RlbC9zdGF0dXMnO1xyXG5jb25zdCBSUENsaWVudCA9IHJlcXVpcmUoJ0BveHlnZW5ocS9ycC1jbGllbnQtamF2YXNjcmlwdCcpO1xyXG5jb25zdCBMQVVOQ0hfTU9ERVMgPSB7XHJcbiAgICBERUZBVUxUOiAnREVGQVVMVCcsXHJcbiAgICBERUJVRzogJ0RFQlVHJyxcclxufTtcclxuY29uc3QgVEVTVF9JVEVNX1RZUEVTID0ge1xyXG4gICAgU1VJVEU6ICdTVUlURScsXHJcbiAgICBURVNUOiAnVEVTVCcsXHJcbiAgICBTVEVQOiAnU1RFUCcsXHJcbn07XHJcbmNvbnN0IE1BWF9OQU1FX0xFTkdUSCA9IDEyODtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcG9ydFBvcnRhbFJlcG9ydGVyIGV4dGVuZHMgUmVwb3J0ZXJCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIHJlcG9ydGVyT3B0cywgYWdncmVnYXRvcikge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZXJPcHRzID0gcmVwb3J0ZXJPcHRzIHx8IG9wdGlvbnMucnA7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRTdGVwcyA9IHJlcG9ydGVyT3B0cy5yZXBvcnRTdGVwcyB8fCB0cnVlO1xyXG4gICAgICAgIHRoaXMucmVwb3J0TG9ncyA9IHJlcG9ydGVyT3B0cy5yZXBvcnRMb2dzIHx8IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2ggPSB7fTtcclxuICAgICAgICB0aGlzLmNiQ2FzZVRvUnBJZEhhc2ggPSB7fTtcclxuICAgICAgICB0aGlzLmNiU3RlcFRvUnBJZEhhc2ggPSB7fTtcclxuICAgICAgICB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZCA9IHt9O1xyXG4gICAgICAgIHRoaXMuY2JDYXNlVG9DdXJyZW50VHJhbnNhY3Rpb25JZCA9IHt9O1xyXG4gICAgICAgIHRoaXMuY2JDYXNlVG9DdXJyZW50U3ViU3RlcElkID0ge307XHJcbiAgICAgICAgdGhpcy5wcm9taXNlcyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICF0aGlzLnJlcG9ydGVyT3B0c1xyXG4gICAgICAgICAgICB8fCAhdGhpcy5yZXBvcnRlck9wdHMuYXBpS2V5XHJcbiAgICAgICAgICAgIHx8ICF0aGlzLnJlcG9ydGVyT3B0cy5lbmRwb2ludFxyXG4gICAgICAgICAgICB8fCAhdGhpcy5yZXBvcnRlck9wdHMucHJvamVjdFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcG9ydFBvcnRhbCBvcHRpb25zIGFyZSBtaXNzaW5nIGluIG94eWdlbi5jb25mIGZpbGUuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWdncmVnYXRvciA9IGFnZ3JlZ2F0b3I7XHJcbiAgICAgICAgdGhpcy5ycENsaWVudCA9IG5ldyBSUENsaWVudCh7XHJcbiAgICAgICAgICAgIGxhdW5jaDogdGhpcy5yZXBvcnRlck9wdHMubGF1bmNoIHx8IHRoaXMub3B0aW9ucy5uYW1lLFxyXG4gICAgICAgICAgICAuLi50aGlzLnJlcG9ydGVyT3B0c1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ycENsaWVudC5jaGVja0Nvbm5lY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSUCAtIEVycm9yIGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlcjogJHtlLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgZ2VuZXJhdGUocmVzdWx0cykge1xyXG4gICAgfVxyXG4gICAgLy8gRXZlbnRzXHJcbiAgICBhc3luYyBvbkxhdW5jaFN0YXJ0KHsgb3B0aW9ucyB9KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgeyB0ZW1wSWQsIHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc3RhcnRMYXVuY2goe1xyXG4gICAgICAgICAgICAgICAgbW9kZTogdGhpcy5yZXBvcnRlck9wdHMubW9kZSB8fCBMQVVOQ0hfTU9ERVMuREVGQVVMVCxcclxuICAgICAgICAgICAgICAgIGRlYnVnOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRoaXMucmVwb3J0ZXJPcHRzLmF0dHJpYnV0ZXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMudGVtcExhdW5jaElkID0gdGVtcElkO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc3RhcnQgbGF1bmNoOiAke2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25MYXVuY2hFbmQoeyByZXN1bHRzIH0pIHtcclxuICAgICAgICAvLyByZXBvcnQgdGhlIGVuZCBvZiBhbGwgc3RhcnRlZCBzdWl0ZXNcclxuICAgICAgICBhd2FpdCB0aGlzLl9yZXBvcnRFbmRPZlN0YXJ0ZWRTdWl0ZXMoKTtcclxuICAgICAgICAvLyBDYWxjdWxhdGUgbGF1bmNoIHN0YXR1c1xyXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZCA9IHJlc3VsdHMuc29tZSh4ID0+IHguc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5wcm9taXNlcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IGF3YWl0IHRoaXMucnBDbGllbnQuZmluaXNoTGF1bmNoKHRoaXMudGVtcExhdW5jaElkLCB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IGhhc0ZhaWxlZCA/ICdGQUlMRUQnIDogJ1BBU1NFRCdcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHByb21pc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBlbmQgbGF1bmNoOiAke2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25SdW5uZXJTdGFydCh7IHJpZCwgb3B0cywgY2FwcyB9KSB7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblJ1bm5lckVuZCh7IHJpZCwgcmVzdWx0IH0pIHtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uU3VpdGVTdGFydCh7IHJpZCwgc3VpdGVJZCwgc3VpdGU6IHN1aXRlRGVmIH0pIHtcclxuICAgICAgICAvLyBpbiBwYXJhbGxlbCB0ZXN0IGV4ZWN1dGlvbiwgb25TdWl0ZVN0YXJ0IHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciB0aGUgc2FtZSBzdWl0ZSBcclxuICAgICAgICAvLyBtYWtlIHN1cmUgd2UgY2FsbCBcInN0YXJ0VGVzdEl0ZW1cIiB0aGUgc2FtZSBzdWl0ZSBvbmx5IG9uY2VcclxuICAgICAgICBjb25zdCBzdWl0ZVJlZklkID0gc3VpdGVEZWYucmVmSWQ7XHJcbiAgICAgICAgaWYgKHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVSZWZJZF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBhc3NpZ24gZW1wdHkgb2JqZWN0IGFzIGEgZm9ybSBvZiBtdWx0aS10aHJlYWQgbG9jayxcclxuICAgICAgICAvLyBzbyB0aGUgcGFyYWxsZWwgY2FsbCB0byBvblN1aXRlU3RhcnQgZnJvbSB0aGUgbmV4dCB0aHJlYWRcclxuICAgICAgICAvLyB3aWxsIG5vdCB0cnkgdG8gcHJvY2VlZCB3aXRoIHRoZSBjb2RlIGJlbG93XHJcbiAgICAgICAgdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZVJlZklkXSA9IHt9O1xyXG4gICAgICAgIHRoaXMuY2JTdWl0ZVJlc3VsdExpc3RCeVJlZklkW3N1aXRlUmVmSWRdID0gW107XHJcbiAgICAgICAgY29uc3Qgc3RhcnRUZXN0SXRlbVJlcSA9IHtcclxuICAgICAgICAgICAgbmFtZTogc3VpdGVEZWYubmFtZSB8fCB0aGlzLm9wdGlvbnMubmFtZSxcclxuICAgICAgICAgICAgdHlwZTogVEVTVF9JVEVNX1RZUEVTLlNVSVRFLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgdGVtcElkLCBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnN0YXJ0VGVzdEl0ZW0oc3RhcnRUZXN0SXRlbVJlcSwgdGhpcy50ZW1wTGF1bmNoSWQpO1xyXG4gICAgICAgICAgICB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlUmVmSWRdID0gdGVtcElkO1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVByb21pc2UocHJvbWlzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBzdGFydCBzdWl0ZSBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25TdWl0ZUVuZCh7IHJpZCwgc3VpdGVJZCwgcmVzdWx0IH0pIHtcclxuICAgICAgICBjb25zdCBzdWl0ZVJlZklkID0gcmVzdWx0LnJlZklkO1xyXG4gICAgICAgIHRoaXMuY2JTdWl0ZVJlc3VsdExpc3RCeVJlZklkW3N1aXRlUmVmSWRdICYmIHRoaXMuY2JTdWl0ZVJlc3VsdExpc3RCeVJlZklkW3N1aXRlUmVmSWRdLnB1c2gocmVzdWx0KTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uQ2FzZVN0YXJ0KHsgcmlkLCBzdWl0ZUlkLCBzdWl0ZVJlZklkLCBjYXNlSWQsICdjYXNlJzogY2FzZURlZiB9KSB7XHJcbiAgICAgICAgY29uc3Qgc3RhcnRUZXN0SXRlbVJlcSA9IHtcclxuICAgICAgICAgICAgbmFtZTogY2FzZURlZi5uYW1lLFxyXG4gICAgICAgICAgICB0eXBlOiBURVNUX0lURU1fVFlQRVMuVEVTVCxcclxuICAgICAgICAgICAgY29kZVJlZjogY2FzZURlZi5wYXRoLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgcnBTdWl0ZUlkID0gdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZVJlZklkXTtcclxuICAgICAgICBpZiAoIXJwU3VpdGVJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydFRlc3RJdGVtKHN0YXJ0VGVzdEl0ZW1SZXEsIHRoaXMudGVtcExhdW5jaElkLCBycFN1aXRlSWQpO1xyXG4gICAgICAgICAgICB0aGlzLmNiQ2FzZVRvUnBJZEhhc2hbY2FzZUlkXSA9IHRlbXBJZDtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc3RhcnQgY2FzZSBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25DYXNlRW5kKHsgcmlkLCBzdWl0ZUlkLCBzdWl0ZVJlZklkLCBjYXNlSWQsIHJlc3VsdCB9KSB7XHJcbiAgICAgICAgY29uc3QgcnBUZXN0SWQgPSB0aGlzLmNiQ2FzZVRvUnBJZEhhc2hbY2FzZUlkXTtcclxuICAgICAgICBpZiAoIXJwVGVzdElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdmYWlsZWQnICYmIHJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJwRmlsZSA9IHJlc3VsdC5zY3JlZW5zaG90ID9cclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3NjcmVlbnNob3QnLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50OiByZXN1bHQuc2NyZWVuc2hvdCxcclxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ01zZyA9IHRoaXMuX3N0cmluZ2lmeShyZXN1bHQuZmFpbHVyZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgaWYgKGxvZ01zZykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9nUmVxID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGxvZ01zZyxcclxuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJ1xyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zZW5kTG9nKHJwVGVzdElkLCBsb2dSZXEsIHJwRmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBzZW5kIGxvZyBmb3IgZmluaXNoZWQgY2FzZSBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRyYW5zSWQgPSB0aGlzLmNiQ2FzZVRvQ3VycmVudFRyYW5zYWN0aW9uSWRbY2FzZUlkXTtcclxuXHJcbiAgICAgICAgaWYgKHRyYW5zSWQpIHtcclxuICAgICAgICAgICAgLy8gRklYTUU6IHNob3VsZCBjYWxjdWxhdGUgcHJvcGVyIHN0YXR1c1xyXG4gICAgICAgICAgICBjb25zdCBmaW5pc2hUcmFuc2FjdGlvblJlcSA9IHtcclxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3Bhc3NlZCcgLy9yZXN1bHQuc3RhdHVzLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNScElkID0gdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3RyYW5zSWRdO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5maW5pc2hUZXN0SXRlbSh0cmFuc1JwSWQsIGZpbmlzaFRyYW5zYWN0aW9uUmVxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGZpbmlzaCB0cmFuc2FjdGlvbiBpdGVtIG9uIGNhc2UgZW5kOiAke2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNiQ2FzZVRvQ3VycmVudFRyYW5zYWN0aW9uSWRbY2FzZUlkXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZpbmlzaFRlc3RJdGVtUmVxID0ge1xyXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuZmluaXNoVGVzdEl0ZW0ocnBUZXN0SWQsIGZpbmlzaFRlc3RJdGVtUmVxKTtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZmluaXNoIGNhc2UgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblN0ZXBTdGFydCh7IHJpZCwgY2FzZUlkLCBzdGVwIH0pIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVwb3J0U3RlcHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3RlcC5tb2R1bGUgJiYgc3RlcC5tb2R1bGUgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0TG9nU3RlcChjYXNlSWQsIHN0ZXApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwQ2FzZUlkID0gdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF07XHJcbiAgICAgICAgbGV0IHJwUGFyZW50SWQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHRyYW5zSWQgPSB0aGlzLmNiQ2FzZVRvQ3VycmVudFRyYW5zYWN0aW9uSWRbY2FzZUlkXTtcclxuXHJcbiAgICAgICAgaWYgKHN0ZXAubmFtZSA9PT0gJ3RyYW5zYWN0aW9uJykge1xyXG4gICAgICAgICAgICBpZiAodHJhbnNJZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gRklYTUU6IHNob3VsZCBjYWxjdWxhdGUgcHJvcGVyIHN0YXR1c1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmluaXNoVHJhbnNhY3Rpb25SZXEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAncGFzc2VkJyAvL3Jlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc1JwSWQgPSB0aGlzLmNiU3RlcFRvUnBJZEhhc2hbdHJhbnNJZF07XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LmZpbmlzaFRlc3RJdGVtKHRyYW5zUnBJZCwgZmluaXNoVHJhbnNhY3Rpb25SZXEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGZpbmlzaCB0cmFuc2FjdGlvbiBpdGVtIG9uIGNhc2UgZW5kOiAke2V9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2JDYXNlVG9DdXJyZW50VHJhbnNhY3Rpb25JZFtjYXNlSWRdID0gc3RlcC5pZDtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2JDYXNlVG9DdXJyZW50U3ViU3RlcElkW2Nhc2VJZF07XHJcbiAgICAgICAgICAgIHJwUGFyZW50SWQgPSBycENhc2VJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2JDYXNlVG9DdXJyZW50U3ViU3RlcElkW2Nhc2VJZF0gPSBzdGVwLmlkO1xyXG4gICAgICAgICAgICBycFBhcmVudElkID0gdHJhbnNJZCA/IHRoaXMuY2JTdGVwVG9ScElkSGFzaFt0cmFuc0lkXSA6IHJwQ2FzZUlkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFycFBhcmVudElkIHx8ICFycENhc2VJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0ZXBOYW1lID0gdGhpcy5fZ2V0U3RlcE5hbWUoc3RlcCk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnRUZXN0SXRlbVJlcSA9IHtcclxuICAgICAgICAgICAgbmFtZTogc3RlcE5hbWUsXHJcbiAgICAgICAgICAgIHR5cGU6IFRFU1RfSVRFTV9UWVBFUy5TVEVQLFxyXG4gICAgICAgICAgICAvLyBcImNvZGVSZWZcIiArIFwicGFyYW1ldGVyc1wiIHVzZWQgYnkgUlAgbGliIHRvIGdlbmVyYXRlIHRlc3RDYXNlSWQgaWYgdGVzdENhc2VJZCBpcyBub3QgZGVmaW5lZFxyXG4gICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlcG9ydHBvcnRhbC9jbGllbnQtamF2YXNjcmlwdC9ibG9iLzQ4NmVmNzBjNjM4YTlhMjMyNjcyOTBjNjJkZjFmYWY5MDBmN2RmNmEvbGliL3JlcG9ydC1wb3J0YWwtY2xpZW50LmpzI0w0OTdcclxuICAgICAgICAgICAgLy8gdGhpcyBpcyBkaXNhYmxlZCBmb3Igbm93LiBub3Qgc3VyZSBpZiBhY3R1YWxseSBuZWVkZWQuLi5cclxuICAgICAgICAgICAgLy9wYXJhbWV0ZXJzOiB0aGlzLl9nZXRScEFyZ3Moc3RlcC5hcmdzKSxcclxuICAgICAgICAgICAgY29kZVJlZjogc3RlcC5sb2NhdGlvbixcclxuICAgICAgICAgICAgdGVzdENhc2VJZDogcnBDYXNlSWQsXHJcbiAgICAgICAgICAgIGhhc1N0YXRzOiBmYWxzZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydFRlc3RJdGVtKHN0YXJ0VGVzdEl0ZW1SZXEsIHRoaXMudGVtcExhdW5jaElkLCBycFBhcmVudElkKTtcclxuICAgICAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3N0ZXAuaWRdID0gdGVtcElkO1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVByb21pc2UocHJvbWlzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBzdGFydCBzdGVwIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblN0ZXBFbmQoeyByaWQsIGNhc2VJZCwgc3RlcDogcmVzdWx0IH0pIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVwb3J0U3RlcHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzdWx0Lm5hbWUgJiYgKHJlc3VsdC5uYW1lLnN0YXJ0c1dpdGgoJ2xvZy4nKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm5hbWUuc3RhcnRzV2l0aCgnd2ViLnRyYW5zYWN0aW9uJykgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5uYW1lLnN0YXJ0c1dpdGgoJ21vYi50cmFuc2FjdGlvbicpKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwU3RlcElkID0gdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3Jlc3VsdC5pZF07XHJcbiAgICAgICAgaWYgKCFycFN0ZXBJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZWxldGUgdGhpcy5jYkNhc2VUb0N1cnJlbnRTdWJTdGVwSWRbY2FzZUlkXTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdmYWlsZWQnICYmIHJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJwRmlsZSA9IHJlc3VsdC5zY3JlZW5zaG90ID9cclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3NjcmVlbnNob3QnLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50OiByZXN1bHQuc2NyZWVuc2hvdCxcclxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ01zZyA9IHRoaXMuX3N0cmluZ2lmeShyZXN1bHQuZmFpbHVyZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgaWYgKGxvZ01zZykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9nUmVxID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGxvZ01zZyxcclxuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcclxuICAgICAgICAgICAgICAgICAgICBmaWxlOiBycEZpbGUsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnNlbmRMb2cocnBTdGVwSWQsIGxvZ1JlcSwgcnBGaWxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVByb21pc2UocHJvbWlzZSk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIHNlbmQgbG9nIGZvciBmaW5pc2hlZCBzdGVwIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmaW5pc2hUZXN0SXRlbVJlcSA9IHtcclxuICAgICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LmZpbmlzaFRlc3RJdGVtKHJwU3RlcElkLCBmaW5pc2hUZXN0SXRlbVJlcSk7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGZpbmlzaCBzdGVwIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkxvZyh7IHN1aXRlSWQsIGNhc2VJZCwgc3RlcElkLCBsZXZlbCwgbXNnLCB0aW1lLCBzcmMgfSkge1xyXG4gICAgICAgIGlmICghdGhpcy5yZXBvcnRMb2dzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gT3h5Z2VuIG1pZ2h0IHN0YXJ0IGdlbmVyYXRpbmcgbG9ncyBiZWZvcmUgb25SdW5uZXJTdGFydCBldmVudCwgaWdub3JlIHRoZW1cclxuICAgICAgICBpZiAoIXRoaXMudGVtcExhdW5jaElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcnBQYXJlbnRJZCA9IHN0ZXBJZCA/XHJcbiAgICAgICAgICAgIHRoaXMuY2JTdGVwVG9ScElkSGFzaFtzdGVwSWRdXHJcbiAgICAgICAgICAgIDogY2FzZUlkID8gdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF1cclxuICAgICAgICAgICAgOiBzdWl0ZUlkID8gdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZUlkXVxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBycExldmVsID0gdGhpcy5fZ2V0UnBMZXZlbChsZXZlbCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxvZ01zZyA9IHRoaXMuX3N0cmluZ2lmeShtc2cpO1xyXG4gICAgICAgIGlmIChsb2dNc2cpIHtcclxuICAgICAgICAgICAgY29uc3QgbG9nUmVxID0ge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogbG9nTXNnLFxyXG4gICAgICAgICAgICAgICAgbGV2ZWw6IHJwTGV2ZWwsXHJcbiAgICAgICAgICAgICAgICB0aW1lOiB0aW1lLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zZW5kTG9nKHJwUGFyZW50SWQgfHwgdGhpcy50ZW1wTGF1bmNoSWQsIGxvZ1JlcSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVByb21pc2UocHJvbWlzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBjcmVhdGUgbG9nIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIHJlcG9ydExvZ1N0ZXAoY2FzZUlkLCBzdGVwKSB7XHJcbiAgICAgICAgaWYgKCFzdGVwLmFyZ3MgfHwgIXN0ZXAuYXJncy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsZXZlbCA9IHN0ZXAubmFtZTtcclxuICAgICAgICBjb25zdCBtc2cgPSBzdGVwLmFyZ3NbMF07XHJcbiAgICAgICAgY29uc3QgdGltZSA9IHN0ZXAudGltZTtcclxuICAgICAgICBsZXQgc3RlcElkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmICh0aGlzLmNiQ2FzZVRvQ3VycmVudFN1YlN0ZXBJZFtjYXNlSWRdKSB7XHJcbiAgICAgICAgICAgIHN0ZXBJZCA9IHRoaXMuY2JDYXNlVG9DdXJyZW50U3ViU3RlcElkW2Nhc2VJZF07XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNiQ2FzZVRvQ3VycmVudFRyYW5zYWN0aW9uSWRbY2FzZUlkXSkge1xyXG4gICAgICAgICAgICBzdGVwSWQgPSB0aGlzLmNiQ2FzZVRvQ3VycmVudFRyYW5zYWN0aW9uSWRbY2FzZUlkXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kUnBMb2coeyBzdWl0ZUlkOiB1bmRlZmluZWQsIGNhc2VJZCwgc3RlcElkLCBsZXZlbCwgbXNnLCB0aW1lIH0pO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgc2VuZFJwTG9nKHsgc3VpdGVJZCwgY2FzZUlkLCBzdGVwSWQsIGxldmVsLCBtc2csIHRpbWUgfSkge1xyXG4gICAgICAgIC8vIE94eWdlbiBtaWdodCBzdGFydCBnZW5lcmF0aW5nIGxvZ3MgYmVmb3JlIG9uUnVubmVyU3RhcnQgZXZlbnQsIGlnbm9yZSB0aGVtXHJcbiAgICAgICAgaWYgKCF0aGlzLnRlbXBMYXVuY2hJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwUGFyZW50SWQgPSBzdGVwSWQgP1xyXG4gICAgICAgICAgICB0aGlzLmNiU3RlcFRvUnBJZEhhc2hbc3RlcElkXVxyXG4gICAgICAgICAgICA6IGNhc2VJZCA/IHRoaXMuY2JDYXNlVG9ScElkSGFzaFtjYXNlSWRdXHJcbiAgICAgICAgICAgIDogc3VpdGVJZCA/IHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVJZF1cclxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgcnBMZXZlbCA9IHRoaXMuX2dldFJwTGV2ZWwobGV2ZWwpO1xyXG5cclxuICAgICAgICBjb25zdCBsb2dNc2cgPSB0aGlzLl9zdHJpbmdpZnkobXNnKTtcclxuICAgICAgICBpZiAobG9nTXNnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ1JlcSA9IHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGxvZ01zZyxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBycExldmVsLFxyXG4gICAgICAgICAgICAgICAgdGltZTogdGltZSxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc2VuZExvZyhycFBhcmVudElkIHx8IHRoaXMudGVtcExhdW5jaElkLCBsb2dSZXEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gY3JlYXRlIGxvZyBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBfcmVwb3J0RW5kT2ZTdGFydGVkU3VpdGVzKCkge1xyXG4gICAgICAgIGZvciAoY29uc3Qgc3VpdGVSZWZJZCBvZiBPYmplY3Qua2V5cyh0aGlzLmNiU3VpdGVUb1JwSWRIYXNoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBycFN1aXRlSWQgPSB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlUmVmSWRdO1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5jYlN1aXRlUmVzdWx0TGlzdEJ5UmVmSWRbc3VpdGVSZWZJZF07XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlUmVmSWRdO1xyXG4gICAgICAgICAgICBjb25zdCBoYXNGYWlsZWRTdWl0ZSA9IHJlc3VsdHMuc29tZSh4ID0+IHguc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuICAgICAgICAgICAgY29uc3QgZmluaXNoVGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IGhhc0ZhaWxlZFN1aXRlID8gJ2ZhaWxlZCcgOiAncGFzc2VkJyxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuZmluaXNoVGVzdEl0ZW0ocnBTdWl0ZUlkLCBmaW5pc2hUZXN0SXRlbVJlcSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVByb21pc2UocHJvbWlzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBmaW5pc2ggc3VpdGUgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2dldFJwTGV2ZWwob3hMZXZlbCkge1xyXG4gICAgICAgIGlmIChveExldmVsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBveExldmVsLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnaW5mbyc7XHJcbiAgICB9XHJcbiAgICAvKl9nZXRScEFyZ3MoY2JBcmdzKSB7XHJcbiAgICAgICAgaWYgKCFjYkFyZ3MgfHwgIWNiQXJncy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcnBBcmdzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgY2JBcmdzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IGNiQXJnc1tpXTtcclxuICAgICAgICAgICAgbGV0IGFyZ1N0ciA9IHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8IGFyZyBpbnN0YW5jZW9mIFN0cmluZyA/IGFyZyA6IEpTT04uc3RyaW5naWZ5KGFyZyk7XHJcbiAgICAgICAgICAgIHJwQXJncy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGtleTogYGFyZyR7aX1gLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGFyZ1N0clxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJwQXJncztcclxuICAgIH0qL1xyXG4gICAgX2dldFN0ZXBOYW1lKHN0ZXApIHtcclxuICAgICAgICBsZXQgbmFtZTtcclxuXHJcbiAgICAgICAgaWYgKHN0ZXAubmFtZSA9PT0gJ3RyYW5zYWN0aW9uJyAmJiBzdGVwLmFyZ3MubGVuZ3RoID4gMCkgeyAgLy8gRklYTUU6IHN0ZXBzIG5lZWQgdG8gYmUgbmVzdGVkIHVuZGVyIHRyYW5zYWN0aW9uc1xyXG4gICAgICAgICAgICBuYW1lID0gc3RlcC5hcmdzWzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzdGVwLnNpZ25hdHVyZSkge1xyXG4gICAgICAgICAgICBuYW1lID0gc3RlcC5zaWduYXR1cmU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHN0ZXAubW9kdWxlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBpcyB0aGlzIGV2ZXIgcmVhY2hlZD8gXCJzdGVwLnNpZ25hdHVyZVwiIHNlZW1zIHRvIGFsd2F5cyBleGlzdFxyXG4gICAgICAgICAgICBuYW1lID0gYCR7c3RlcC5tb2R1bGV9LiR7c3RlcC5uYW1lfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBuYW1lID0gc3RlcC5uYW1lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbWF4aW11bSBhbGxvd2VkIG5hbWUgbGVuZ3RoIGluIFJQIGlzIDEwMjQgYnl0ZXNcclxuICAgICAgICAvLyB3ZSB0cnVuY2F0ZSBpdCBldmVuIGxvd2VyIHNvIGl0IHdpbGwgZGlzcGxheSBuaWNlbHlcclxuICAgICAgICBpZiAobmFtZS5sZW5ndGggPiBNQVhfTkFNRV9MRU5HVEgpIHtcclxuICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIE1BWF9OQU1FX0xFTkdUSC0zKSArICcuLi4nO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZXR1cm5zIG51bGwgaWYgbXNnIGNhbm5vdCBiZSBzdHJpbmdpZmllZCwgb3Igc3RyaWdpZmllcyBpdCBpZiBpdCdzIG5vdCBhIHN0cmluZyBhbHJlYWR5XHJcbiAgICBfc3RyaW5naWZ5KG1zZykge1xyXG4gICAgICAgIC8vIHdlIHRlc3QgZm9yIHVuZGVmaW5lZCBhbmQgbnVsbCBleHBsaWNpdGx5IG9uIHB1cnBvc2UgYmVjYXVzZSBvdGhlciBmYWxzeSB2YWx1ZXMgKGUuZy4gMCkgYXJlIG9rXHJcbiAgICAgICAgaWYgKHR5cGVvZiBtc2cgPT09ICd1bmRlZmluZWQnIHx8IG1zZyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJyB8fCBtc2cgaW5zdGFuY2VvZiBTdHJpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1zZztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShtc2cpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUlAgLSBlcnJvciBzZW5kaW5nIGxvZzogbXNnIG9iamVjdCBjYW5ub3QgYmUgc2VyaWFsaXplZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVQcm9taXNlKHByb21pc2UpIHtcclxuICAgICAgICBwcm9taXNlLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JQIGVycm9yOiAnLCBlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucHJvbWlzZXMucHVzaChwcm9taXNlKTtcclxuICAgIH1cclxufVxyXG5cclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBWUEsSUFBQUEsYUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQXFDLFNBQUFELHVCQUFBRyxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBQ3JDLE1BQU1HLFFBQVEsR0FBR0wsT0FBTyxDQUFDLGdDQUFnQyxDQUFDO0FBQzFELE1BQU1NLFlBQVksR0FBRztFQUNqQkMsT0FBTyxFQUFFLFNBQVM7RUFDbEJDLEtB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
|