oxygen-cli 1.41.0 → 1.42.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 +8 -0
- package/build/core/OxygenCore.js +41 -274
- 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 +2 -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 +35 -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 +4 -75
- 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 +74 -216
- 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 +112 -232
- 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 +91 -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 +2 -91
- 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 +3 -1
|
@@ -4,27 +4,16 @@ 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 _child_process = require("child_process");
|
|
11
|
-
|
|
12
9
|
var _events = require("events");
|
|
13
|
-
|
|
14
10
|
var _when = require("when");
|
|
15
|
-
|
|
16
11
|
var _logger = _interopRequireDefault(require("../lib/logger"));
|
|
17
|
-
|
|
18
12
|
var _debugger = _interopRequireDefault(require("../lib/debugger"));
|
|
19
|
-
|
|
20
13
|
var _util = _interopRequireDefault(require("../lib/util"));
|
|
21
|
-
|
|
22
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
|
-
|
|
14
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
24
15
|
const log = (0, _logger.default)('WorkerProcess');
|
|
25
|
-
|
|
26
16
|
const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
27
|
-
|
|
28
17
|
class WorkerProcess extends _events.EventEmitter {
|
|
29
18
|
constructor(pid, workerPath, debugMode, debugPort, name = null, npmGRootExecution = true) {
|
|
30
19
|
super();
|
|
@@ -43,7 +32,6 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
43
32
|
this._calls = {};
|
|
44
33
|
this._eventHandlers = {};
|
|
45
34
|
}
|
|
46
|
-
|
|
47
35
|
async start() {
|
|
48
36
|
const env = Object.assign(process.env, {
|
|
49
37
|
OX_WORKER: true,
|
|
@@ -57,17 +45,13 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
57
45
|
execArgv: [],
|
|
58
46
|
detached: false
|
|
59
47
|
};
|
|
60
|
-
|
|
61
48
|
if (this._debugPort) {
|
|
62
49
|
forkOpts.execArgv = Object.assign(forkOpts.execArgv, ['--inspect-brk=' + this._debugPort]);
|
|
63
50
|
}
|
|
64
|
-
|
|
65
51
|
forkOpts.execArgv.push('--trace-warnings');
|
|
66
|
-
|
|
67
52
|
if (this._npmGRootExecution) {
|
|
68
53
|
try {
|
|
69
54
|
let globalNpmModulesPath;
|
|
70
|
-
|
|
71
55
|
if (process.platform === 'darwin') {
|
|
72
56
|
await (() => {
|
|
73
57
|
return new Promise((resolve, reject) => {
|
|
@@ -79,7 +63,6 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
79
63
|
console.log('darwin npm root error:', err);
|
|
80
64
|
resolve();
|
|
81
65
|
}
|
|
82
|
-
|
|
83
66
|
if (stdout && stdout.toString) {
|
|
84
67
|
globalNpmModulesPath = stdout.toString().trim();
|
|
85
68
|
resolve();
|
|
@@ -92,12 +75,10 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
92
75
|
})();
|
|
93
76
|
} else {
|
|
94
77
|
const execResult = (0, _child_process.execSync)('npm root -g');
|
|
95
|
-
|
|
96
78
|
if (execResult && execResult.toString) {
|
|
97
79
|
globalNpmModulesPath = execResult.toString().trim();
|
|
98
80
|
}
|
|
99
81
|
}
|
|
100
|
-
|
|
101
82
|
if (globalNpmModulesPath && forkOpts && forkOpts.env) {
|
|
102
83
|
forkOpts.env.NODE_PATH = globalNpmModulesPath;
|
|
103
84
|
}
|
|
@@ -105,31 +86,23 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
105
86
|
console.log('npm root error:', e);
|
|
106
87
|
}
|
|
107
88
|
}
|
|
108
|
-
|
|
109
89
|
this._childProc = (0, _child_process.fork)(this._workerPath, forkOpts);
|
|
110
|
-
|
|
111
90
|
this._hookChildProcEvents();
|
|
112
|
-
|
|
113
91
|
this._isRunning = true;
|
|
114
92
|
return this._childProc;
|
|
115
93
|
}
|
|
116
|
-
|
|
117
94
|
async startDebugger() {
|
|
118
95
|
if (this._debugMode) {
|
|
119
96
|
await this._initializeDebugger();
|
|
120
97
|
}
|
|
121
98
|
}
|
|
122
|
-
|
|
123
99
|
async stopDebugger() {
|
|
124
100
|
if (this._debugger) {
|
|
125
101
|
await this._debugger.close();
|
|
126
|
-
|
|
127
102
|
this._debugger.removeAllListeners();
|
|
128
|
-
|
|
129
103
|
this._debugger = null;
|
|
130
104
|
}
|
|
131
105
|
}
|
|
132
|
-
|
|
133
106
|
async stop(status = null) {
|
|
134
107
|
if (this._isInitialized && this._childProc) {
|
|
135
108
|
if (this._debugger && this._debugger._paused) {
|
|
@@ -139,33 +112,26 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
139
112
|
await this._debugger.resumeTerminate();
|
|
140
113
|
}
|
|
141
114
|
}
|
|
142
|
-
|
|
143
115
|
await this.invoke('dispose', status);
|
|
144
116
|
await snooze(100);
|
|
145
117
|
} else if (this._childProc) {
|
|
146
118
|
await snooze(100);
|
|
147
119
|
}
|
|
148
|
-
|
|
149
120
|
if (this._debugger) {
|
|
150
121
|
await this._debugger.close();
|
|
151
122
|
}
|
|
152
|
-
|
|
153
123
|
this._send({
|
|
154
124
|
type: 'exit',
|
|
155
125
|
status: status
|
|
156
126
|
});
|
|
157
|
-
|
|
158
127
|
this.kill();
|
|
159
|
-
|
|
160
128
|
this._reset();
|
|
161
129
|
}
|
|
162
|
-
|
|
163
130
|
kill() {
|
|
164
131
|
if (this._childProc) {
|
|
165
132
|
this._childProc.kill('SIGINT');
|
|
166
133
|
}
|
|
167
134
|
}
|
|
168
|
-
|
|
169
135
|
async initOxygen(rid, options, caps) {
|
|
170
136
|
if (!this._isInitialized) {
|
|
171
137
|
const beforeTime = new Date().getTime();
|
|
@@ -174,25 +140,19 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
174
140
|
const duration = afterTime - beforeTime;
|
|
175
141
|
this._isInitialized = true;
|
|
176
142
|
let start = '';
|
|
177
|
-
|
|
178
143
|
if (this._name) {
|
|
179
144
|
start = this._name + ' ';
|
|
180
145
|
}
|
|
181
|
-
|
|
182
146
|
log.info(start + 'Worker initialized in ' + duration + ' ms');
|
|
183
147
|
}
|
|
184
148
|
}
|
|
185
|
-
|
|
186
149
|
async startSession() {
|
|
187
150
|
let start = '';
|
|
188
|
-
|
|
189
151
|
if (this._name) {
|
|
190
152
|
start = this._name + ' ';
|
|
191
153
|
}
|
|
192
|
-
|
|
193
154
|
log.info(start + 'Session started');
|
|
194
155
|
}
|
|
195
|
-
|
|
196
156
|
async endSession(status = null, disposeModules = true) {
|
|
197
157
|
if (this._childProc) {
|
|
198
158
|
const beforeTime = new Date().getTime();
|
|
@@ -200,115 +160,89 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
200
160
|
const afterTime = new Date().getTime();
|
|
201
161
|
const duration = afterTime - beforeTime;
|
|
202
162
|
let start = '';
|
|
203
|
-
|
|
204
163
|
if (this._name) {
|
|
205
164
|
start = this._name + ' ';
|
|
206
165
|
}
|
|
207
|
-
|
|
208
166
|
log.info(start + 'Session ended in ' + duration + ' ms');
|
|
209
167
|
}
|
|
210
168
|
}
|
|
211
|
-
|
|
212
169
|
async dispose(status = null) {
|
|
213
170
|
if (this._debugger) {
|
|
214
171
|
await this._debugger.close();
|
|
215
172
|
}
|
|
216
|
-
|
|
217
173
|
if (this._isInitialized && this._childProc) {
|
|
218
174
|
this._isInitialized = false;
|
|
219
175
|
await this.invoke('dispose', status);
|
|
220
|
-
|
|
221
176
|
this._send({
|
|
222
177
|
type: 'exit',
|
|
223
178
|
status: status
|
|
224
179
|
});
|
|
225
|
-
|
|
226
180
|
this.kill();
|
|
227
181
|
} else if (this._childProc) {
|
|
228
182
|
this._isInitialized = false;
|
|
229
|
-
|
|
230
183
|
this._send({
|
|
231
184
|
type: 'exit',
|
|
232
185
|
status: status
|
|
233
186
|
});
|
|
234
|
-
|
|
235
187
|
this.kill();
|
|
236
188
|
}
|
|
237
189
|
}
|
|
238
|
-
|
|
239
190
|
get debugger() {
|
|
240
191
|
return this._debugger;
|
|
241
192
|
}
|
|
242
|
-
|
|
243
193
|
get isRunning() {
|
|
244
194
|
return this._isRunning;
|
|
245
195
|
}
|
|
246
|
-
|
|
247
196
|
get isInitialized() {
|
|
248
197
|
return this._isInitialized;
|
|
249
198
|
}
|
|
250
|
-
|
|
251
199
|
async run(runOpts) {
|
|
252
200
|
return await this.invoke('run', runOpts);
|
|
253
201
|
}
|
|
254
|
-
|
|
255
202
|
subscribe(eventName, handler) {
|
|
256
203
|
if (!this._eventHandlers[eventName] && typeof handler === 'function') {
|
|
257
204
|
this._eventHandlers[eventName] = handler;
|
|
258
|
-
|
|
259
205
|
this._send({
|
|
260
206
|
type: 'subscribe',
|
|
261
207
|
event: eventName
|
|
262
208
|
});
|
|
263
209
|
}
|
|
264
210
|
}
|
|
265
|
-
|
|
266
211
|
async invoke(method) {
|
|
267
212
|
let args = Array.prototype.slice.call(arguments);
|
|
268
|
-
|
|
269
213
|
if (args.length > 0) {
|
|
270
214
|
args.shift();
|
|
271
215
|
}
|
|
272
|
-
|
|
273
216
|
if (this._childProc) {
|
|
274
217
|
const callId = _util.default.generateUniqueId();
|
|
275
|
-
|
|
276
218
|
this._send({
|
|
277
219
|
type: 'invoke',
|
|
278
220
|
method: method,
|
|
279
221
|
callId: callId,
|
|
280
222
|
args: args
|
|
281
223
|
});
|
|
282
|
-
|
|
283
224
|
this._calls[callId] = (0, _when.defer)();
|
|
284
225
|
return this._calls[callId].promise;
|
|
285
226
|
}
|
|
286
227
|
}
|
|
287
|
-
|
|
288
228
|
async invokeTestHook(hookName, hookArgs) {
|
|
289
229
|
const callId = _util.default.generateUniqueId();
|
|
290
|
-
|
|
291
230
|
this._send({
|
|
292
231
|
type: 'invoke:hook',
|
|
293
232
|
method: hookName,
|
|
294
233
|
callId: callId,
|
|
295
234
|
args: hookArgs
|
|
296
235
|
});
|
|
297
|
-
|
|
298
236
|
this._calls[callId] = (0, _when.defer)();
|
|
299
237
|
return this._calls[callId].promise;
|
|
300
238
|
}
|
|
301
|
-
|
|
302
239
|
_send(message) {
|
|
303
240
|
if (!this._childProc) {
|
|
304
241
|
return false;
|
|
305
242
|
}
|
|
306
|
-
|
|
307
243
|
this._childProc.send(message);
|
|
308
|
-
|
|
309
244
|
return true;
|
|
310
245
|
}
|
|
311
|
-
|
|
312
246
|
_reset() {
|
|
313
247
|
this._childProc = null;
|
|
314
248
|
this._debugger = null;
|
|
@@ -320,43 +254,31 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
320
254
|
this._whenModulesDisposed = null;
|
|
321
255
|
this._isInitialized = false;
|
|
322
256
|
}
|
|
323
|
-
|
|
324
257
|
_hookChildProcEvents() {
|
|
325
258
|
if (!this._childProc) {
|
|
326
259
|
return;
|
|
327
260
|
}
|
|
328
|
-
|
|
329
261
|
this._childProc.on('message', this._handleChildMessage.bind(this));
|
|
330
|
-
|
|
331
262
|
this._childProc.on('error', this._handleChildError.bind(this));
|
|
332
|
-
|
|
333
263
|
this._childProc.on('exit', this._handleChildExit.bind(this));
|
|
334
|
-
|
|
335
264
|
this._childProc.on('disconnect', this._handleChildDisconnect.bind(this));
|
|
336
|
-
|
|
337
265
|
this._childProc.on('uncaughtException', this._handleChildUncaughtException.bind(this));
|
|
338
|
-
|
|
339
266
|
this._childProc.on('SIGINT', this._handleChildSigInt.bind(this));
|
|
340
267
|
}
|
|
341
|
-
|
|
342
268
|
_handleChildMessage(msg) {
|
|
343
269
|
if (msg.event) {
|
|
344
270
|
switch (msg.event) {
|
|
345
271
|
case 'invoke:result':
|
|
346
272
|
if (msg.callId && Object.prototype.hasOwnProperty.call(this._calls, msg.callId)) {
|
|
347
273
|
const promise = this._calls[msg.callId];
|
|
348
|
-
|
|
349
274
|
if (msg.error) {
|
|
350
275
|
promise.reject(msg.error);
|
|
351
276
|
} else {
|
|
352
277
|
promise.resolve(msg.retval);
|
|
353
278
|
}
|
|
354
|
-
|
|
355
279
|
delete this._calls[msg.callId];
|
|
356
280
|
}
|
|
357
|
-
|
|
358
281
|
break;
|
|
359
|
-
|
|
360
282
|
case 'reporter':
|
|
361
283
|
if (msg.method) {
|
|
362
284
|
this.emit('reporter', {
|
|
@@ -365,21 +287,16 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
365
287
|
args: msg.args
|
|
366
288
|
});
|
|
367
289
|
}
|
|
368
|
-
|
|
369
290
|
break;
|
|
370
|
-
|
|
371
291
|
case 'event':
|
|
372
292
|
this._handleWorkerEvent(msg.name, msg.args);
|
|
373
|
-
|
|
374
293
|
break;
|
|
375
294
|
}
|
|
376
295
|
}
|
|
377
|
-
|
|
378
296
|
this.emit('message', Object.assign(msg, {
|
|
379
297
|
pid: this._pid
|
|
380
298
|
}));
|
|
381
299
|
}
|
|
382
|
-
|
|
383
300
|
async _handleWorkerEvent(name, args) {
|
|
384
301
|
if (name && this._eventHandlers && this._eventHandlers[name]) {
|
|
385
302
|
try {
|
|
@@ -389,7 +306,6 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
389
306
|
}
|
|
390
307
|
}
|
|
391
308
|
}
|
|
392
|
-
|
|
393
309
|
_handleChildError(error) {
|
|
394
310
|
log.debug(`Worker ${this._pid} thrown an error: ${error}.`);
|
|
395
311
|
this.emit('error', Object.assign({
|
|
@@ -398,28 +314,21 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
398
314
|
pid: this._pid
|
|
399
315
|
}));
|
|
400
316
|
}
|
|
401
|
-
|
|
402
317
|
_handleChildExit(exitCode, signal) {
|
|
403
318
|
log.debug(`Worker ${this._pid} finished with exit code ${exitCode} and signal ${signal}.`);
|
|
404
|
-
|
|
405
319
|
this._reset();
|
|
406
|
-
|
|
407
320
|
this.emit('exit', {
|
|
408
321
|
pid: this._pid,
|
|
409
322
|
exitCode,
|
|
410
323
|
signal
|
|
411
324
|
});
|
|
412
325
|
}
|
|
413
|
-
|
|
414
326
|
_handleChildDisconnect() {
|
|
415
327
|
log.debug(`Worker ${this._pid} disconnected.`);
|
|
416
328
|
}
|
|
417
|
-
|
|
418
329
|
_handleChildUncaughtException(error) {
|
|
419
330
|
log.debug(`Worker ${this._pid} thrown an uncaught error: ${error}.`);
|
|
420
|
-
|
|
421
331
|
this._reset();
|
|
422
|
-
|
|
423
332
|
this.emit('error', Object.assign({
|
|
424
333
|
error: error
|
|
425
334
|
}, {
|
|
@@ -430,50 +339,39 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
430
339
|
exitCode: 1
|
|
431
340
|
});
|
|
432
341
|
}
|
|
433
|
-
|
|
434
342
|
_handleChildSigInt() {
|
|
435
343
|
log.debug(`Worker ${this._pid} received SIGINT signal.`);
|
|
436
344
|
}
|
|
437
|
-
|
|
438
345
|
async _initializeDebugger() {
|
|
439
346
|
this._debugger = new _debugger.default(this._pid);
|
|
440
347
|
let whenDebuggerReady = (0, _when.defer)();
|
|
441
|
-
|
|
442
348
|
const _this = this;
|
|
443
|
-
|
|
444
349
|
this._debugger.on('ready', function (err) {
|
|
445
350
|
if (_this._debugger && _this._debugger.continue) {
|
|
446
351
|
_this._debugger.continue();
|
|
447
352
|
}
|
|
448
|
-
|
|
449
353
|
whenDebuggerReady.resolve();
|
|
450
354
|
});
|
|
451
|
-
|
|
452
355
|
this._debugger.on('error', function (err) {
|
|
453
356
|
log.error('Debugger error :', err);
|
|
454
357
|
this.emit('debugger:error', Object.assign(err, {
|
|
455
358
|
pid: this._pid
|
|
456
359
|
}));
|
|
457
|
-
|
|
458
360
|
if (!whenDebuggerReady.isResolved) {
|
|
459
361
|
whenDebuggerReady.reject(err.message);
|
|
460
362
|
}
|
|
461
363
|
});
|
|
462
|
-
|
|
463
364
|
this._debugger.on('break', function (breakpointData) {
|
|
464
365
|
this.emit('debugger:break', breakpointData);
|
|
465
366
|
});
|
|
466
|
-
|
|
467
367
|
this._debugger.on('breakError', async function (breakError) {
|
|
468
368
|
if (breakError && breakError.message) {
|
|
469
369
|
if (_this._breakpointErrors.includes(breakError.message)) {} else {
|
|
470
370
|
_this._breakpointErrors.push(breakError.message);
|
|
471
|
-
|
|
472
371
|
this.emit('debugger:breakError', breakError);
|
|
473
372
|
}
|
|
474
373
|
}
|
|
475
374
|
});
|
|
476
|
-
|
|
477
375
|
try {
|
|
478
376
|
log.info(`Connecting to debugger on port ${this._debugPort}...`);
|
|
479
377
|
await this._debugger.connect(this._debugPort, '127.0.0.1');
|
|
@@ -482,11 +380,8 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
482
380
|
const message = 'Cannot connect to the debugger: ' + e.message;
|
|
483
381
|
whenDebuggerReady.reject(message);
|
|
484
382
|
}
|
|
485
|
-
|
|
486
383
|
return whenDebuggerReady.promise;
|
|
487
384
|
}
|
|
488
|
-
|
|
489
385
|
}
|
|
490
|
-
|
|
491
386
|
exports.default = WorkerProcess;
|
|
492
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5uZXJzL1dvcmtlclByb2Nlc3MuanMiXSwibmFtZXMiOlsibG9nIiwic25vb3plIiwibXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJXb3JrZXJQcm9jZXNzIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJwaWQiLCJ3b3JrZXJQYXRoIiwiZGVidWdNb2RlIiwiZGVidWdQb3J0IiwibmFtZSIsIm5wbUdSb290RXhlY3V0aW9uIiwiX25hbWUiLCJfaXNSdW5uaW5nIiwiX2lzSW5pdGlhbGl6ZWQiLCJfc3RvcHBlZEJ5VXNlciIsIl9waWQiLCJfY2hpbGRQcm9jIiwiX2RlYnVnTW9kZSIsIl9kZWJ1Z1BvcnQiLCJfZGVidWdnZXIiLCJfd29ya2VyUGF0aCIsIl9ucG1HUm9vdEV4ZWN1dGlvbiIsIl9icmVha3BvaW50RXJyb3JzIiwiX2NhbGxzIiwiX2V2ZW50SGFuZGxlcnMiLCJzdGFydCIsImVudiIsIk9iamVjdCIsImFzc2lnbiIsInByb2Nlc3MiLCJPWF9XT1JLRVIiLCJERUJVRyIsImlzTmFOIiwiTk9fVVBEQVRFX05PVElGSUVSIiwiaW5mbyIsImZvcmtPcHRzIiwiY3dkIiwiZXhlY0FyZ3YiLCJkZXRhY2hlZCIsInB1c2giLCJnbG9iYWxOcG1Nb2R1bGVzUGF0aCIsInBsYXRmb3JtIiwicmVqZWN0IiwiZXJyIiwic3Rkb3V0IiwiY29uc29sZSIsInRvU3RyaW5nIiwidHJpbSIsImUiLCJleGVjUmVzdWx0IiwiTk9ERV9QQVRIIiwiX2hvb2tDaGlsZFByb2NFdmVudHMiLCJzdGFydERlYnVnZ2VyIiwiX2luaXRpYWxpemVEZWJ1Z2dlciIsInN0b3BEZWJ1Z2dlciIsImNsb3NlIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RvcCIsInN0YXR1cyIsIl9wYXVzZWQiLCJkaXNhYmxlIiwicmVzdW1lVGVybWluYXRlIiwiaW52b2tlIiwiX3NlbmQiLCJ0eXBlIiwia2lsbCIsIl9yZXNldCIsImluaXRPeHlnZW4iLCJyaWQiLCJvcHRpb25zIiwiY2FwcyIsImJlZm9yZVRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsImFmdGVyVGltZSIsImR1cmF0aW9uIiwic3RhcnRTZXNzaW9uIiwiZW5kU2Vzc2lvbiIsImRpc3Bvc2VNb2R1bGVzIiwiZGlzcG9zZSIsImRlYnVnZ2VyIiwiaXNSdW5uaW5nIiwiaXNJbml0aWFsaXplZCIsInJ1biIsInJ1bk9wdHMiLCJzdWJzY3JpYmUiLCJldmVudE5hbWUiLCJoYW5kbGVyIiwiZXZlbnQiLCJtZXRob2QiLCJhcmdzIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJzbGljZSIsImNhbGwiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzaGlmdCIsImNhbGxJZCIsIm94dXRpbCIsImdlbmVyYXRlVW5pcXVlSWQiLCJwcm9taXNlIiwiaW52b2tlVGVzdEhvb2siLCJob29rTmFtZSIsImhvb2tBcmdzIiwibWVzc2FnZSIsInNlbmQiLCJfd2hlbk94eWdlbkRpc3Bvc2VkIiwiX3doZW5PeHlnZW5Jbml0aWFsaXplZCIsIl93aGVuTW9kdWxlc0Rpc3Bvc2VkIiwib24iLCJfaGFuZGxlQ2hpbGRNZXNzYWdlIiwiYmluZCIsIl9oYW5kbGVDaGlsZEVycm9yIiwiX2hhbmRsZUNoaWxkRXhpdCIsIl9oYW5kbGVDaGlsZERpc2Nvbm5lY3QiLCJfaGFuZGxlQ2hpbGRVbmNhdWdodEV4Y2VwdGlvbiIsIl9oYW5kbGVDaGlsZFNpZ0ludCIsIm1zZyIsImhhc093blByb3BlcnR5IiwiZXJyb3IiLCJyZXR2YWwiLCJlbWl0IiwiX2hhbmRsZVdvcmtlckV2ZW50IiwiYXBwbHkiLCJ1bmRlZmluZWQiLCJkZWJ1ZyIsImV4aXRDb2RlIiwic2lnbmFsIiwiRGVidWdnZXIiLCJ3aGVuRGVidWdnZXJSZWFkeSIsIl90aGlzIiwiY29udGludWUiLCJpc1Jlc29sdmVkIiwiYnJlYWtwb2ludERhdGEiLCJicmVha0Vycm9yIiwiaW5jbHVkZXMiLCJjb25uZWN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7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QUt0RixTQUFMLENBQWUyRixFQUFmLENBQWtCLE9BQWxCLEVBQTJCLFVBQVN3QixjQUFULEVBQXlCO0FBQ2hELFdBQUtaLElBQUwsQ0FBVSxnQkFBVixFQUE0QlksY0FBNUI7QUFDSCxLQUZEOztBQUdBLFNBQUtuSCxTQUFMLENBQWUyRixFQUFmLENBQWtCLFlBQWxCLEVBQWdDLGdCQUFleUIsVUFBZixFQUEyQjtBQUV2RCxVQUFJQSxVQUFVLElBQUlBLFVBQVUsQ0FBQzlCLE9BQTdCLEVBQXNDO0FBQ2xDLFlBQUkwQixLQUFLLENBQUM3RyxpQkFBTixDQUF3QmtILFFBQXhCLENBQWlDRCxVQUFVLENBQUM5QixPQUE1QyxDQUFKLEVBQTBELENBRXpELENBRkQsTUFFTztBQUNIMEIsVUFBQUEsS0FBSyxDQUFDN0csaUJBQU4sQ0FBd0JpQixJQUF4QixDQUE2QmdHLFVBQVUsQ0FBQzlCLE9BQXhDOztBQUNBLGVBQUtpQixJQUFMLENBQVUscUJBQVYsRUFBaUNhLFVBQWpDO0FBQ0g7QUFDSjtBQUNKLEtBVkQ7O0FBWUEsUUFBSTtBQUNBM0ksTUFBQUEsR0FBRyxDQUFDc0MsSUFBSixDQUFVLGtDQUFpQyxLQUFLaEIsVUFBVyxLQUEzRDtBQUNBLFlBQU0sS0FBS0MsU0FBTCxDQUFlc0gsT0FBZixDQUF1QixLQUFLdkgsVUFBNUIsRUFBd0MsV0FBeEMsQ0FBTjtBQUNILEtBSEQsQ0FHRSxPQUFPOEIsQ0FBUCxFQUFVO0FBQ1JwRCxNQUFBQSxHQUFHLENBQUM0SCxLQUFKLENBQVUsa0NBQVYsRUFBOEN4RSxDQUE5QztBQUNBLFlBQU15RCxPQUFPLEdBQUcscUNBQXFDekQsQ0FBQyxDQUFDeUQsT0FBdkQ7QUFDQXlCLE1BQUFBLGlCQUFpQixDQUFDeEYsTUFBbEIsQ0FBeUIrRCxPQUF6QjtBQUNIOztBQUVELFdBQU95QixpQkFBaUIsQ0FBQzdCLE9BQXpCO0FBQ0g7O0FBcFptRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcmssIGV4ZWNTeW5jLCBleGVjIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCB7IGRlZmVyIH0gZnJvbSAnd2hlbic7XHJcblxyXG4vLyBzZXR1cCBsb2dnZXJcclxuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9saWIvbG9nZ2VyJztcclxuY29uc3QgbG9nID0gbG9nZ2VyKCdXb3JrZXJQcm9jZXNzJyk7XHJcblxyXG5pbXBvcnQgRGVidWdnZXIgZnJvbSAnLi4vbGliL2RlYnVnZ2VyJztcclxuaW1wb3J0IG94dXRpbCBmcm9tICcuLi9saWIvdXRpbCc7XHJcblxyXG4vLyBzbm9vemUgZnVuY3Rpb24gLSBhc3luYyB3cmFwcGVyIGFyb3VuZCBzZXRUaW1lb3V0IGZ1bmN0aW9uXHJcbmNvbnN0IHNub296ZSA9IG1zID0+IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG5cclxuLyoqXHJcbiAqIFdvcmtlclByb2Nlc3MgcmVzcG9uc2libGUgZm9yIHNwYXduaW5nIGEgd29ya2VyIHByb2Nlc3MgdGhlIHRlc3QgaW5zdGFuY2UuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXb3JrZXJQcm9jZXNzIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKHBpZCwgd29ya2VyUGF0aCwgZGVidWdNb2RlLCBkZWJ1Z1BvcnQsIG5hbWUgPSBudWxsLCBucG1HUm9vdEV4ZWN1dGlvbiA9IHRydWUpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX25hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9zdG9wcGVkQnlVc2VyID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9waWQgPSBwaWQ7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z01vZGUgPSBkZWJ1Z01vZGU7XHJcbiAgICAgICAgdGhpcy5fZGVidWdQb3J0ID0gZGVidWdQb3J0O1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLl93b3JrZXJQYXRoID0gd29ya2VyUGF0aDtcclxuICAgICAgICB0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbiA9IG5wbUdSb290RXhlY3V0aW9uO1xyXG4gICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMgPSBbXTtcclxuICAgICAgICAvLyBob2xkIHRoZSByZW1vdGUgaW52b2NhdGlvbiBwcm9taXNlXHJcbiAgICAgICAgdGhpcy5fY2FsbHMgPSB7fTtcclxuICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzID0ge307XHJcbiAgICB9XHJcbiAgICBhc3luYyBzdGFydCgpIHtcclxuICAgICAgICBjb25zdCBlbnYgPSBPYmplY3QuYXNzaWduKHByb2Nlc3MuZW52LCB7XHJcbiAgICAgICAgICAgIE9YX1dPUktFUjogdHJ1ZSxcclxuICAgICAgICAgICAgREVCVUc6ICFpc05hTih0aGlzLl9kZWJ1Z1BvcnQpLFxyXG4gICAgICAgICAgICBOT19VUERBVEVfTk9USUZJRVI6IHRydWVcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbG9nLmluZm8oYFN0YXJ0aW5nIHdvcmtlciBwcm9jZXNzICR7dGhpcy5fcGlkfS5gKTtcclxuICAgICAgICBsZXQgZm9ya09wdHMgPSB7XHJcbiAgICAgICAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcclxuICAgICAgICAgICAgZW52LFxyXG4gICAgICAgICAgICBleGVjQXJndjogW10sXHJcbiAgICAgICAgICAgIGRldGFjaGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgLy9zaWxlbnQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdQb3J0KSB7XHJcbiAgICAgICAgICAgIC8vIGFkZCAtLWluc3BlY3QtYnJrIGFyZ3VtZW50IGlmIGRlYnVnIHBvcnQgaXMgc3BlY2lmaWVkXHJcbiAgICAgICAgICAgIGZvcmtPcHRzLmV4ZWNBcmd2ID0gT2JqZWN0LmFzc2lnbihmb3JrT3B0cy5leGVjQXJndiwgWyctLWluc3BlY3QtYnJrPScgKyB0aGlzLl9kZWJ1Z1BvcnRdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHByaW50IG1vcmUgaW5mb3JtYXRpb24gZm9yIG5vZGVqcyBlcnJvcnNcclxuICAgICAgICBmb3JrT3B0cy5leGVjQXJndi5wdXNoKCctLXRyYWNlLXdhcm5pbmdzJyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGdsb2JhbE5wbU1vZHVsZXNQYXRoO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMoJ25wbSByb290IC1nJywge2N3ZDogcHJvY2Vzcy5jd2QoKX0sIGZ1bmN0aW9uIChlcnIsIHN0ZG91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGFyd2luIG5wbSByb290IGVycm9yOicsIGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZG91dCAmJiBzdGRvdXQudG9TdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbE5wbU1vZHVsZXNQYXRoID0gc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGVjUmVzdWx0ID0gZXhlY1N5bmMoJ25wbSByb290IC1nJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjUmVzdWx0ICYmIGV4ZWNSZXN1bHQudG9TdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsTnBtTW9kdWxlc1BhdGggPSBleGVjUmVzdWx0LnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsTnBtTW9kdWxlc1BhdGggJiZcclxuICAgICAgICAgICAgICAgICAgICBmb3JrT3B0cyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGZvcmtPcHRzLmVudlxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ya09wdHMuZW52Lk5PREVfUEFUSCA9IGdsb2JhbE5wbU1vZHVsZXNQYXRoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbnBtIHJvb3QgZXJyb3I6JywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGZvcmsgd29ya2VyXHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jID0gZm9yayh0aGlzLl93b3JrZXJQYXRoLCBmb3JrT3B0cyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hvb2tDaGlsZFByb2NFdmVudHMoKTtcclxuICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gZGVidWcgbW9kZSwgaW5pdGlhbGl6ZSBkZWJ1Z2dlciBhbmQgb25seSB0aGVuIHN0YXJ0IG1vZHVsZXMgJ2luaXQnXHJcblxyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkUHJvYztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdGFydERlYnVnZ2VyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5faW5pdGlhbGl6ZURlYnVnZ2VyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHN0b3BEZWJ1Z2dlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdnZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVidWdnZXIuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fZGVidWdnZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnZ2VyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3RvcChzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQgJiYgdGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWJ1Z2dlciAmJiB0aGlzLl9kZWJ1Z2dlci5fcGF1c2VkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoJ0NBTkNFTEVEJyA9PT0gc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVidWdnZXIuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWJ1Z2dlci5yZXN1bWVUZXJtaW5hdGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmludm9rZSgnZGlzcG9zZScsIHN0YXR1cyk7XHJcbiAgICAgICAgICAgIGF3YWl0IHNub296ZSgxMDApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHNub296ZSgxMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fZGVidWdnZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVidWdnZXIuY2xvc2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NlbmQoe1xyXG4gICAgICAgICAgICB0eXBlOiAnZXhpdCcsXHJcbiAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMua2lsbCgpO1xyXG4gICAgICAgIHRoaXMuX3Jlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAga2lsbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkUHJvYy5raWxsKCdTSUdJTlQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdE94eWdlbihyaWQsIG9wdGlvbnMsIGNhcHMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgYmVmb3JlVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmludm9rZSgnaW5pdCcsIHJpZCwgb3B0aW9ucywgY2Fwcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhZnRlclRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSBhZnRlclRpbWUgLSBiZWZvcmVUaW1lO1xyXG4gICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gJyc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydCA9IHRoaXMuX25hbWUgKyAnICc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9nLmluZm8oc3RhcnQgKyAnV29ya2VyIGluaXRpYWxpemVkIGluICcgKyBkdXJhdGlvbiArICcgbXMnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3RhcnRTZXNzaW9uKCkge1xyXG4gICAgICAgIGxldCBzdGFydCA9ICcnO1xyXG4gICAgICAgIGlmICh0aGlzLl9uYW1lKSB7XHJcbiAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5fbmFtZSArICcgJztcclxuICAgICAgICB9XHJcbiAgICAgICAgbG9nLmluZm8oc3RhcnQgKyAnU2Vzc2lvbiBzdGFydGVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZW5kU2Vzc2lvbihzdGF0dXMgPSBudWxsLCBkaXNwb3NlTW9kdWxlcyA9IHRydWUpIHtcclxuICAgICAgICBpZiAodGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZVRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2VuZFNlc3Npb24nLCBzdGF0dXMsIGRpc3Bvc2VNb2R1bGVzKTtcclxuICAgICAgICAgICAgY29uc3QgYWZ0ZXJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gYWZ0ZXJUaW1lIC0gYmVmb3JlVGltZTtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gJyc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydCA9IHRoaXMuX25hbWUgKyAnICc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9nLmluZm8oc3RhcnQgKyAnU2Vzc2lvbiBlbmRlZCBpbiAnICsgZHVyYXRpb24gKyAnIG1zJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z2dlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWJ1Z2dlci5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXplZCAmJiB0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2Rpc3Bvc2UnLCBzdGF0dXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZW5kKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdleGl0JyxcclxuICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5raWxsKCk7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnZXhpdCcsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMua2lsbCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGVidWdnZXIgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWJ1Z2dlcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNSdW5uaW5nICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNSdW5uaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc0luaXRpYWxpemVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0luaXRpYWxpemVkO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJ1bihydW5PcHRzKSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW52b2tlKCdydW4nLCBydW5PcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdWJzY3JpYmUoZXZlbnROYW1lLCBoYW5kbGVyKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9ldmVudEhhbmRsZXJzW2V2ZW50TmFtZV0gJiYgdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyc1tldmVudE5hbWVdID0gaGFuZGxlcjtcclxuICAgICAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3Vic2NyaWJlJyxcclxuICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudE5hbWUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbnZva2UobWV0aG9kKSB7XHJcbiAgICAgICAgbGV0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xyXG4gICAgICAgIC8vIGlnbm9yZSBmaXJzdCBhcmd1bWVudCAtIGUuZy4gbWV0aG9kXHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBhcmdzLnNoaWZ0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbElkID0gb3h1dGlsLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnaW52b2tlJyxcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgY2FsbElkOiBjYWxsSWQsXHJcbiAgICAgICAgICAgICAgICBhcmdzOiBhcmdzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl9jYWxsc1tjYWxsSWRdID0gZGVmZXIoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxzW2NhbGxJZF0ucHJvbWlzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW52b2tlVGVzdEhvb2soaG9va05hbWUsIGhvb2tBcmdzKSB7XHJcbiAgICAgICAgY29uc3QgY2FsbElkID0gb3h1dGlsLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICB0aGlzLl9zZW5kKHtcclxuICAgICAgICAgICAgdHlwZTogJ2ludm9rZTpob29rJyxcclxuICAgICAgICAgICAgbWV0aG9kOiBob29rTmFtZSxcclxuICAgICAgICAgICAgY2FsbElkOiBjYWxsSWQsXHJcbiAgICAgICAgICAgIGFyZ3M6IGhvb2tBcmdzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fY2FsbHNbY2FsbElkXSA9IGRlZmVyKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxzW2NhbGxJZF0ucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBfc2VuZChtZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Muc2VuZChtZXNzYWdlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBfcmVzZXQoKSB7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z2dlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z1BvcnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3doZW5PeHlnZW5EaXNwb3NlZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fd2hlbk94eWdlbkluaXRpYWxpemVkID0gbnVsbDtcclxuICAgICAgICB0aGlzLl93aGVuTW9kdWxlc0Rpc3Bvc2VkID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX2hvb2tDaGlsZFByb2NFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ21lc3NhZ2UnLCB0aGlzLl9oYW5kbGVDaGlsZE1lc3NhZ2UuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdlcnJvcicsIHRoaXMuX2hhbmRsZUNoaWxkRXJyb3IuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdleGl0JywgdGhpcy5faGFuZGxlQ2hpbGRFeGl0LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYy5vbignZGlzY29ubmVjdCcsIHRoaXMuX2hhbmRsZUNoaWxkRGlzY29ubmVjdC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgdGhpcy5faGFuZGxlQ2hpbGRVbmNhdWdodEV4Y2VwdGlvbi5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ1NJR0lOVCcsIHRoaXMuX2hhbmRsZUNoaWxkU2lnSW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZE1lc3NhZ2UobXNnKSB7XHJcbiAgICAgICAgaWYgKG1zZy5ldmVudCkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG1zZy5ldmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnaW52b2tlOnJlc3VsdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5jYWxsSWQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX2NhbGxzLCBtc2cuY2FsbElkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5fY2FsbHNbbXNnLmNhbGxJZF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UucmVqZWN0KG1zZy5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLnJlc29sdmUobXNnLnJldHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NhbGxzW21zZy5jYWxsSWRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3JlcG9ydGVyJzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAobXNnLm1ldGhvZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlcG9ydGVyJywgeyBwaWQ6IHRoaXMuX3BpZCwgbWV0aG9kOiBtc2cubWV0aG9kLCBhcmdzOiBtc2cuYXJncyB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdldmVudCc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlV29ya2VyRXZlbnQobXNnLm5hbWUsIG1zZy5hcmdzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBPYmplY3QuYXNzaWduKG1zZywgeyBwaWQ6IHRoaXMuX3BpZCB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2hhbmRsZVdvcmtlckV2ZW50KG5hbWUsIGFyZ3MpIHtcclxuICAgICAgICBpZiAobmFtZSAmJiB0aGlzLl9ldmVudEhhbmRsZXJzICYmIHRoaXMuX2V2ZW50SGFuZGxlcnNbbmFtZV0pIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V2ZW50SGFuZGxlcnNbbmFtZV0uYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB0aHJvd24gYnkgd29ya2VyIGV2ZW50IGhhbmRsZXIgXCIke25hbWV9OicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZEVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZXIgJHt0aGlzLl9waWR9IHRocm93biBhbiBlcnJvcjogJHtlcnJvcn0uYCk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIE9iamVjdC5hc3NpZ24oeyBlcnJvciA6IGVycm9yIH0sIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZEV4aXQoZXhpdENvZGUsIHNpZ25hbCkge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSBmaW5pc2hlZCB3aXRoIGV4aXQgY29kZSAke2V4aXRDb2RlfSBhbmQgc2lnbmFsICR7c2lnbmFsfS5gKTtcclxuICAgICAgICB0aGlzLl9yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZXhpdCcsIHsgcGlkOiB0aGlzLl9waWQsIGV4aXRDb2RlLCBzaWduYWwgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUNoaWxkRGlzY29ubmVjdCgpIHtcclxuICAgICAgICBsb2cuZGVidWcoYFdvcmtlciAke3RoaXMuX3BpZH0gZGlzY29ubmVjdGVkLmApO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZFVuY2F1Z2h0RXhjZXB0aW9uKGVycm9yKSB7XHJcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZXIgJHt0aGlzLl9waWR9IHRocm93biBhbiB1bmNhdWdodCBlcnJvcjogJHtlcnJvcn0uYCk7XHJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgT2JqZWN0LmFzc2lnbih7IGVycm9yIDogZXJyb3IgfSwgeyBwaWQ6IHRoaXMuX3BpZCB9KSk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdleGl0JywgeyBwaWQ6IHRoaXMuX3BpZCwgZXhpdENvZGU6IDEgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUNoaWxkU2lnSW50KCkge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSByZWNlaXZlZCBTSUdJTlQgc2lnbmFsLmApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9pbml0aWFsaXplRGVidWdnZXIoKSB7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIgPSBuZXcgRGVidWdnZXIodGhpcy5fcGlkKTtcclxuICAgICAgICBsZXQgd2hlbkRlYnVnZ2VyUmVhZHkgPSBkZWZlcigpO1xyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgICAgICAvLyBoYW5kbGUgZGVidWdnZXIgZXZlbnRzXHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIub24oJ3JlYWR5JywgZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgIC8vIHJlc3VtZSB0aGUgZmlyc3QgYnJlYWtwb2ludCB3aGljaCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGJ5IHRoZSBkZWJ1Z2dlclxyXG4gICAgICAgICAgICBpZiAoX3RoaXMuX2RlYnVnZ2VyICYmIF90aGlzLl9kZWJ1Z2dlci5jb250aW51ZSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX2RlYnVnZ2VyLmNvbnRpbnVlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgd2hlbkRlYnVnZ2VyUmVhZHkucmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikge1xyXG5cclxuICAgICAgICAgICAgbG9nLmVycm9yKCdEZWJ1Z2dlciBlcnJvciA6JywgZXJyKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVidWdnZXI6ZXJyb3InLCBPYmplY3QuYXNzaWduKGVyciwgeyBwaWQ6IHRoaXMuX3BpZCB9KSk7XHJcbiAgICAgICAgICAgIC8vIHJlamVjdCB0aGUgcHJvbWlzZSBvbmx5IGlmIHdlIGdvdCBhbiBlcnJvciByaWdodCBhZnRlciBfZGVidWdnZXIuY29ubmVjdCgpIGNhbGwgYmVsb3cgLSB3ZSBuZWVkIHRoaXMgdG8gaW5kaWNhdGUgZGVidWdnZXIgaW5pdGlhbGl6YXRpb24gZXJyb3JcclxuICAgICAgICAgICAgaWYgKCF3aGVuRGVidWdnZXJSZWFkeS5pc1Jlc29sdmVkKSB7XHJcbiAgICAgICAgICAgICAgICB3aGVuRGVidWdnZXJSZWFkeS5yZWplY3QoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIub24oJ2JyZWFrJywgZnVuY3Rpb24oYnJlYWtwb2ludERhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdkZWJ1Z2dlcjpicmVhaycsIGJyZWFrcG9pbnREYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9kZWJ1Z2dlci5vbignYnJlYWtFcnJvcicsIGFzeW5jIGZ1bmN0aW9uKGJyZWFrRXJyb3IpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChicmVha0Vycm9yICYmIGJyZWFrRXJyb3IubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLl9icmVha3BvaW50RXJyb3JzLmluY2x1ZGVzKGJyZWFrRXJyb3IubWVzc2FnZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2JyZWFrcG9pbnRFcnJvcnMucHVzaChicmVha0Vycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVidWdnZXI6YnJlYWtFcnJvcicsIGJyZWFrRXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxvZy5pbmZvKGBDb25uZWN0aW5nIHRvIGRlYnVnZ2VyIG9uIHBvcnQgJHt0aGlzLl9kZWJ1Z1BvcnR9Li4uYCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmNvbm5lY3QodGhpcy5fZGVidWdQb3J0LCAnMTI3LjAuMC4xJyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ0Nhbm5vdCBjb25uZWN0IHRvIHRoZSBkZWJ1Z2dlcjogJywgZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnQ2Fubm90IGNvbm5lY3QgdG8gdGhlIGRlYnVnZ2VyOiAnICsgZS5tZXNzYWdlO1xyXG4gICAgICAgICAgICB3aGVuRGVidWdnZXJSZWFkeS5yZWplY3QobWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gd2hlbkRlYnVnZ2VyUmVhZHkucHJvbWlzZTtcclxuICAgIH1cclxufSJdfQ==
|
|
387
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2hpbGRfcHJvY2VzcyIsInJlcXVpcmUiLCJfZXZlbnRzIiwiX3doZW4iLCJfbG9nZ2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9kZWJ1Z2dlciIsIl91dGlsIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwibG9nIiwibG9nZ2VyIiwic25vb3plIiwibXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJXb3JrZXJQcm9jZXNzIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJwaWQiLCJ3b3JrZXJQYXRoIiwiZGVidWdNb2RlIiwiZGVidWdQb3J0IiwibmFtZSIsIm5wbUdSb290RXhlY3V0aW9uIiwiX25hbWUiLCJfaXNSdW5uaW5nIiwiX2lzSW5pdGlhbGl6ZWQiLCJfc3RvcHBlZEJ5VXNlciIsIl9waWQiLCJfY2hpbGRQcm9jIiwiX2RlYnVnTW9kZSIsIl9kZWJ1Z1BvcnQiLCJfd29ya2VyUGF0aCIsIl9ucG1HUm9vdEV4ZWN1dGlvbiIsIl9icmVha3BvaW50RXJyb3JzIiwiX2NhbGxzIiwiX2V2ZW50SGFuZGxlcnMiLCJzdGFydCIsImVudiIsIk9iamVjdCIsImFzc2lnbiIsInByb2Nlc3MiLCJPWF9XT1JLRVIiLCJERUJVRyIsImlzTmFOIiwiTk9fVVBEQVRFX05PVElGSUVSIiwiaW5mbyIsImZvcmtPcHRzIiwiY3dkIiwiZXhlY0FyZ3YiLCJkZXRhY2hlZCIsInB1c2giLCJnbG9iYWxOcG1Nb2R1bGVzUGF0aCIsInBsYXRmb3JtIiwicmVqZWN0IiwiZXhlYyIsImVyciIsInN0ZG91dCIsImNvbnNvbGUiLCJ0b1N0cmluZyIsInRyaW0iLCJleGVjUmVzdWx0IiwiZXhlY1N5bmMiLCJOT0RFX1BBVEgiLCJmb3JrIiwiX2hvb2tDaGlsZFByb2NFdmVudHMiLCJzdGFydERlYnVnZ2VyIiwiX2luaXRpYWxpemVEZWJ1Z2dlciIsInN0b3BEZWJ1Z2dlciIsImNsb3NlIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RvcCIsInN0YXR1cyIsIl9wYXVzZWQiLCJkaXNhYmxlIiwicmVzdW1lVGVybWluYXRlIiwiaW52b2tlIiwiX3NlbmQiLCJ0eXBlIiwia2lsbCIsIl9yZXNldCIsImluaXRPeHlnZW4iLCJyaWQiLCJvcHRpb25zIiwiY2FwcyIsImJlZm9yZVRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsImFmdGVyVGltZSIsImR1cmF0aW9uIiwic3RhcnRTZXNzaW9uIiwiZW5kU2Vzc2lvbiIsImRpc3Bvc2VNb2R1bGVzIiwiZGlzcG9zZSIsImRlYnVnZ2VyIiwiaXNSdW5uaW5nIiwiaXNJbml0aWFsaXplZCIsInJ1biIsInJ1bk9wdHMiLCJzdWJzY3JpYmUiLCJldmVudE5hbWUiLCJoYW5kbGVyIiwiZXZlbnQiLCJtZXRob2QiLCJhcmdzIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJzbGljZSIsImNhbGwiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzaGlmdCIsImNhbGxJZCIsIm94dXRpbCIsImdlbmVyYXRlVW5pcXVlSWQiLCJkZWZlciIsInByb21pc2UiLCJpbnZva2VUZXN0SG9vayIsImhvb2tOYW1lIiwiaG9va0FyZ3MiLCJtZXNzYWdlIiwic2VuZCIsIl93aGVuT3h5Z2VuRGlzcG9zZWQiLCJfd2hlbk94eWdlbkluaXRpYWxpemVkIiwiX3doZW5Nb2R1bGVzRGlzcG9zZWQiLCJvbiIsIl9oYW5kbGVDaGlsZE1lc3NhZ2UiLCJiaW5kIiwiX2hhbmRsZUNoaWxkRXJyb3IiLCJfaGFuZGxlQ2hpbGRFeGl0IiwiX2hhbmRsZUNoaWxkRGlzY29ubmVjdCIsIl9oYW5kbGVDaGlsZFVuY2F1Z2h0RXhjZXB0aW9uIiwiX2hhbmRsZUNoaWxkU2lnSW50IiwibXNnIiwiaGFzT3duUHJvcGVydHkiLCJlcnJvciIsInJldHZhbCIsImVtaXQiLCJfaGFuZGxlV29ya2VyRXZlbnQiLCJhcHBseSIsInVuZGVmaW5lZCIsImRlYnVnIiwiZXhpdENvZGUiLCJzaWduYWwiLCJEZWJ1Z2dlciIsIndoZW5EZWJ1Z2dlclJlYWR5IiwiX3RoaXMiLCJjb250aW51ZSIsImlzUmVzb2x2ZWQiLCJicmVha3BvaW50RGF0YSIsImJyZWFrRXJyb3IiLCJpbmNsdWRlcyIsImNvbm5lY3QiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bm5lcnMvV29ya2VyUHJvY2Vzcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JrLCBleGVjU3luYywgZXhlYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5cclxuLy8gc2V0dXAgbG9nZ2VyXHJcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vbGliL2xvZ2dlcic7XHJcbmNvbnN0IGxvZyA9IGxvZ2dlcignV29ya2VyUHJvY2VzcycpO1xyXG5cclxuaW1wb3J0IERlYnVnZ2VyIGZyb20gJy4uL2xpYi9kZWJ1Z2dlcic7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5cclxuLy8gc25vb3plIGZ1bmN0aW9uIC0gYXN5bmMgd3JhcHBlciBhcm91bmQgc2V0VGltZW91dCBmdW5jdGlvblxyXG5jb25zdCBzbm9vemUgPSBtcyA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxuXHJcbi8qKlxyXG4gKiBXb3JrZXJQcm9jZXNzIHJlc3BvbnNpYmxlIGZvciBzcGF3bmluZyBhIHdvcmtlciBwcm9jZXNzIHRoZSB0ZXN0IGluc3RhbmNlLlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV29ya2VyUHJvY2VzcyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihwaWQsIHdvcmtlclBhdGgsIGRlYnVnTW9kZSwgZGVidWdQb3J0LCBuYW1lID0gbnVsbCwgbnBtR1Jvb3RFeGVjdXRpb24gPSB0cnVlKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc3RvcHBlZEJ5VXNlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fcGlkID0gcGlkO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gZGVidWdNb2RlO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnUG9ydCA9IGRlYnVnUG9ydDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z2dlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyUGF0aCA9IHdvcmtlclBhdGg7XHJcbiAgICAgICAgdGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24gPSBucG1HUm9vdEV4ZWN1dGlvbjtcclxuICAgICAgICB0aGlzLl9icmVha3BvaW50RXJyb3JzID0gW107XHJcbiAgICAgICAgLy8gaG9sZCB0aGUgcmVtb3RlIGludm9jYXRpb24gcHJvbWlzZVxyXG4gICAgICAgIHRoaXMuX2NhbGxzID0ge307XHJcbiAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVycyA9IHt9O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgc3RhcnQoKSB7XHJcbiAgICAgICAgY29uc3QgZW52ID0gT2JqZWN0LmFzc2lnbihwcm9jZXNzLmVudiwge1xyXG4gICAgICAgICAgICBPWF9XT1JLRVI6IHRydWUsXHJcbiAgICAgICAgICAgIERFQlVHOiAhaXNOYU4odGhpcy5fZGVidWdQb3J0KSxcclxuICAgICAgICAgICAgTk9fVVBEQVRFX05PVElGSUVSOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxvZy5pbmZvKGBTdGFydGluZyB3b3JrZXIgcHJvY2VzcyAke3RoaXMuX3BpZH0uYCk7XHJcbiAgICAgICAgbGV0IGZvcmtPcHRzID0ge1xyXG4gICAgICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXHJcbiAgICAgICAgICAgIGVudixcclxuICAgICAgICAgICAgZXhlY0FyZ3Y6IFtdLFxyXG4gICAgICAgICAgICBkZXRhY2hlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIC8vc2lsZW50OiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnUG9ydCkge1xyXG4gICAgICAgICAgICAvLyBhZGQgLS1pbnNwZWN0LWJyayBhcmd1bWVudCBpZiBkZWJ1ZyBwb3J0IGlzIHNwZWNpZmllZFxyXG4gICAgICAgICAgICBmb3JrT3B0cy5leGVjQXJndiA9IE9iamVjdC5hc3NpZ24oZm9ya09wdHMuZXhlY0FyZ3YsIFsnLS1pbnNwZWN0LWJyaz0nICsgdGhpcy5fZGVidWdQb3J0XSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwcmludCBtb3JlIGluZm9ybWF0aW9uIGZvciBub2RlanMgZXJyb3JzXHJcbiAgICAgICAgZm9ya09wdHMuZXhlY0FyZ3YucHVzaCgnLS10cmFjZS13YXJuaW5ncycpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGxldCBnbG9iYWxOcG1Nb2R1bGVzUGF0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjKCducG0gcm9vdCAtZycsIHtjd2Q6IHByb2Nlc3MuY3dkKCl9LCBmdW5jdGlvbiAoZXJyLCBzdGRvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RhcndpbiBucG0gcm9vdCBlcnJvcjonLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGRvdXQgJiYgc3Rkb3V0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxOcG1Nb2R1bGVzUGF0aCA9IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY1Jlc3VsdCA9IGV4ZWNTeW5jKCducG0gcm9vdCAtZycpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY1Jlc3VsdCAmJiBleGVjUmVzdWx0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbE5wbU1vZHVsZXNQYXRoID0gZXhlY1Jlc3VsdC50b1N0cmluZygpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbE5wbU1vZHVsZXNQYXRoICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ya09wdHMgJiZcclxuICAgICAgICAgICAgICAgICAgICBmb3JrT3B0cy5lbnZcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcmtPcHRzLmVudi5OT0RFX1BBVEggPSBnbG9iYWxOcG1Nb2R1bGVzUGF0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ25wbSByb290IGVycm9yOicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBmb3JrIHdvcmtlclxyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYyA9IGZvcmsodGhpcy5fd29ya2VyUGF0aCwgZm9ya09wdHMpO1xyXG5cclxuICAgICAgICB0aGlzLl9ob29rQ2hpbGRQcm9jRXZlbnRzKCk7XHJcbiAgICAgICAgLy8gaWYgd2UgYXJlIGluIGRlYnVnIG1vZGUsIGluaXRpYWxpemUgZGVidWdnZXIgYW5kIG9ubHkgdGhlbiBzdGFydCBtb2R1bGVzICdpbml0J1xyXG5cclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jaGlsZFByb2M7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3RhcnREZWJ1Z2dlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdNb2RlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2luaXRpYWxpemVEZWJ1Z2dlcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdG9wRGVidWdnZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnZ2VyLnJlbW92ZUFsbExpc3RlbmVycygpO1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJ1Z2dlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHN0b3Aoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpemVkICYmIHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVidWdnZXIgJiYgdGhpcy5fZGVidWdnZXIuX3BhdXNlZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCdDQU5DRUxFRCcgPT09IHN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmRpc2FibGUoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVidWdnZXIucmVzdW1lVGVybWluYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2Rpc3Bvc2UnLCBzdGF0dXMpO1xyXG4gICAgICAgICAgICBhd2FpdCBzbm9vemUoMTAwKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICBhd2FpdCBzbm9vemUoMTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zZW5kKHtcclxuICAgICAgICAgICAgdHlwZTogJ2V4aXQnLFxyXG4gICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmtpbGwoKTtcclxuICAgICAgICB0aGlzLl9yZXNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGtpbGwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZFByb2Mua2lsbCgnU0lHSU5UJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXRPeHlnZW4ocmlkLCBvcHRpb25zLCBjYXBzKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZVRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2luaXQnLCByaWQsIG9wdGlvbnMsIGNhcHMpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYWZ0ZXJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gYWZ0ZXJUaW1lIC0gYmVmb3JlVGltZTtcclxuICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGxldCBzdGFydCA9ICcnO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQgPSB0aGlzLl9uYW1lICsgJyAnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxvZy5pbmZvKHN0YXJ0ICsgJ1dvcmtlciBpbml0aWFsaXplZCBpbiAnICsgZHVyYXRpb24gKyAnIG1zJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHN0YXJ0U2Vzc2lvbigpIHtcclxuICAgICAgICBsZXQgc3RhcnQgPSAnJztcclxuICAgICAgICBpZiAodGhpcy5fbmFtZSkge1xyXG4gICAgICAgICAgICBzdGFydCA9IHRoaXMuX25hbWUgKyAnICc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxvZy5pbmZvKHN0YXJ0ICsgJ1Nlc3Npb24gc3RhcnRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGVuZFNlc3Npb24oc3RhdHVzID0gbnVsbCwgZGlzcG9zZU1vZHVsZXMgPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICBjb25zdCBiZWZvcmVUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW52b2tlKCdlbmRTZXNzaW9uJywgc3RhdHVzLCBkaXNwb3NlTW9kdWxlcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGFmdGVyVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IGFmdGVyVGltZSAtIGJlZm9yZVRpbWU7XHJcbiAgICAgICAgICAgIGxldCBzdGFydCA9ICcnO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQgPSB0aGlzLl9uYW1lICsgJyAnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxvZy5pbmZvKHN0YXJ0ICsgJ1Nlc3Npb24gZW5kZWQgaW4gJyArIGR1cmF0aW9uICsgJyBtcycpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdnZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVidWdnZXIuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQgJiYgdGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW52b2tlKCdkaXNwb3NlJywgc3RhdHVzKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnZXhpdCcsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMua2lsbCgpO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbmQoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2V4aXQnLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmtpbGwoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRlYnVnZ2VyICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVidWdnZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzUnVubmluZyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzUnVubmluZztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNJbml0aWFsaXplZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNJbml0aWFsaXplZDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBydW4ocnVuT3B0cykge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmludm9rZSgncnVuJywgcnVuT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgc3Vic2NyaWJlKGV2ZW50TmFtZSwgaGFuZGxlcikge1xyXG4gICAgICAgIGlmICghdGhpcy5fZXZlbnRIYW5kbGVyc1tldmVudE5hbWVdICYmIHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnNbZXZlbnROYW1lXSA9IGhhbmRsZXI7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbmQoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3N1YnNjcmliZScsXHJcbiAgICAgICAgICAgICAgICBldmVudDogZXZlbnROYW1lLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW52b2tlKG1ldGhvZCkge1xyXG4gICAgICAgIGxldCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcclxuICAgICAgICAvLyBpZ25vcmUgZmlyc3QgYXJndW1lbnQgLSBlLmcuIG1ldGhvZFxyXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYXJncy5zaGlmdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbGxJZCA9IG94dXRpbC5nZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbmQoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ludm9rZScsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcclxuICAgICAgICAgICAgICAgIGNhbGxJZDogY2FsbElkLFxyXG4gICAgICAgICAgICAgICAgYXJnczogYXJnc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5fY2FsbHNbY2FsbElkXSA9IGRlZmVyKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxsc1tjYWxsSWRdLnByb21pc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGludm9rZVRlc3RIb29rKGhvb2tOYW1lLCBob29rQXJncykge1xyXG4gICAgICAgIGNvbnN0IGNhbGxJZCA9IG94dXRpbC5nZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdpbnZva2U6aG9vaycsXHJcbiAgICAgICAgICAgIG1ldGhvZDogaG9va05hbWUsXHJcbiAgICAgICAgICAgIGNhbGxJZDogY2FsbElkLFxyXG4gICAgICAgICAgICBhcmdzOiBob29rQXJnc1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2NhbGxzW2NhbGxJZF0gPSBkZWZlcigpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsc1tjYWxsSWRdLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX3NlbmQobWVzc2FnZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLnNlbmQobWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgX3Jlc2V0KCkge1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnTW9kZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdQb3J0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl93aGVuT3h5Z2VuRGlzcG9zZWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3doZW5PeHlnZW5Jbml0aWFsaXplZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fd2hlbk1vZHVsZXNEaXNwb3NlZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIF9ob29rQ2hpbGRQcm9jRXZlbnRzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdtZXNzYWdlJywgdGhpcy5faGFuZGxlQ2hpbGRNZXNzYWdlLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYy5vbignZXJyb3InLCB0aGlzLl9oYW5kbGVDaGlsZEVycm9yLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYy5vbignZXhpdCcsIHRoaXMuX2hhbmRsZUNoaWxkRXhpdC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ2Rpc2Nvbm5lY3QnLCB0aGlzLl9oYW5kbGVDaGlsZERpc2Nvbm5lY3QuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIHRoaXMuX2hhbmRsZUNoaWxkVW5jYXVnaHRFeGNlcHRpb24uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdTSUdJTlQnLCB0aGlzLl9oYW5kbGVDaGlsZFNpZ0ludC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRNZXNzYWdlKG1zZykge1xyXG4gICAgICAgIGlmIChtc2cuZXZlbnQpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChtc2cuZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2ludm9rZTpyZXN1bHQnOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtc2cuY2FsbElkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9jYWxscywgbXNnLmNhbGxJZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuX2NhbGxzW21zZy5jYWxsSWRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLnJlamVjdChtc2cuZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKG1zZy5yZXR2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsc1ttc2cuY2FsbElkXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdyZXBvcnRlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5tZXRob2QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZXBvcnRlcicsIHsgcGlkOiB0aGlzLl9waWQsIG1ldGhvZDogbXNnLm1ldGhvZCwgYXJnczogbXNnLmFyZ3MgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnZXZlbnQnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZVdvcmtlckV2ZW50KG1zZy5uYW1lLCBtc2cuYXJncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lbWl0KCdtZXNzYWdlJywgT2JqZWN0LmFzc2lnbihtc2csIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9oYW5kbGVXb3JrZXJFdmVudChuYW1lLCBhcmdzKSB7XHJcbiAgICAgICAgaWYgKG5hbWUgJiYgdGhpcy5fZXZlbnRIYW5kbGVycyAmJiB0aGlzLl9ldmVudEhhbmRsZXJzW25hbWVdKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ldmVudEhhbmRsZXJzW25hbWVdLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGxvZy5lcnJvcignRXJyb3IgdGhyb3duIGJ5IHdvcmtlciBldmVudCBoYW5kbGVyIFwiJHtuYW1lfTonLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRFcnJvcihlcnJvcikge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSB0aHJvd24gYW4gZXJyb3I6ICR7ZXJyb3J9LmApO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBPYmplY3QuYXNzaWduKHsgZXJyb3IgOiBlcnJvciB9LCB7IHBpZDogdGhpcy5fcGlkIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRFeGl0KGV4aXRDb2RlLCBzaWduYWwpIHtcclxuICAgICAgICBsb2cuZGVidWcoYFdvcmtlciAke3RoaXMuX3BpZH0gZmluaXNoZWQgd2l0aCBleGl0IGNvZGUgJHtleGl0Q29kZX0gYW5kIHNpZ25hbCAke3NpZ25hbH0uYCk7XHJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2V4aXQnLCB7IHBpZDogdGhpcy5fcGlkLCBleGl0Q29kZSwgc2lnbmFsIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZERpc2Nvbm5lY3QoKSB7XHJcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZXIgJHt0aGlzLl9waWR9IGRpc2Nvbm5lY3RlZC5gKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRVbmNhdWdodEV4Y2VwdGlvbihlcnJvcikge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSB0aHJvd24gYW4gdW5jYXVnaHQgZXJyb3I6ICR7ZXJyb3J9LmApO1xyXG4gICAgICAgIHRoaXMuX3Jlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIE9iamVjdC5hc3NpZ24oeyBlcnJvciA6IGVycm9yIH0sIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZXhpdCcsIHsgcGlkOiB0aGlzLl9waWQsIGV4aXRDb2RlOiAxIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZFNpZ0ludCgpIHtcclxuICAgICAgICBsb2cuZGVidWcoYFdvcmtlciAke3RoaXMuX3BpZH0gcmVjZWl2ZWQgU0lHSU5UIHNpZ25hbC5gKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaW5pdGlhbGl6ZURlYnVnZ2VyKCkge1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyID0gbmV3IERlYnVnZ2VyKHRoaXMuX3BpZCk7XHJcbiAgICAgICAgbGV0IHdoZW5EZWJ1Z2dlclJlYWR5ID0gZGVmZXIoKTtcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy8gaGFuZGxlIGRlYnVnZ2VyIGV2ZW50c1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyLm9uKCdyZWFkeScsIGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgICAvLyByZXN1bWUgdGhlIGZpcnN0IGJyZWFrcG9pbnQgd2hpY2ggaXMgYXV0b21hdGljYWxseSBhZGRlZCBieSB0aGUgZGVidWdnZXJcclxuICAgICAgICAgICAgaWYgKF90aGlzLl9kZWJ1Z2dlciAmJiBfdGhpcy5fZGVidWdnZXIuY29udGludWUpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9kZWJ1Z2dlci5jb250aW51ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdoZW5EZWJ1Z2dlclJlYWR5LnJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9kZWJ1Z2dlci5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcclxuXHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignRGVidWdnZXIgZXJyb3IgOicsIGVycik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RlYnVnZ2VyOmVycm9yJywgT2JqZWN0LmFzc2lnbihlcnIsIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgICAgICAgICAvLyByZWplY3QgdGhlIHByb21pc2Ugb25seSBpZiB3ZSBnb3QgYW4gZXJyb3IgcmlnaHQgYWZ0ZXIgX2RlYnVnZ2VyLmNvbm5lY3QoKSBjYWxsIGJlbG93IC0gd2UgbmVlZCB0aGlzIHRvIGluZGljYXRlIGRlYnVnZ2VyIGluaXRpYWxpemF0aW9uIGVycm9yXHJcbiAgICAgICAgICAgIGlmICghd2hlbkRlYnVnZ2VyUmVhZHkuaXNSZXNvbHZlZCkge1xyXG4gICAgICAgICAgICAgICAgd2hlbkRlYnVnZ2VyUmVhZHkucmVqZWN0KGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyLm9uKCdicmVhaycsIGZ1bmN0aW9uKGJyZWFrcG9pbnREYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVidWdnZXI6YnJlYWsnLCBicmVha3BvaW50RGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIub24oJ2JyZWFrRXJyb3InLCBhc3luYyBmdW5jdGlvbihicmVha0Vycm9yKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoYnJlYWtFcnJvciAmJiBicmVha0Vycm9yLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fYnJlYWtwb2ludEVycm9ycy5pbmNsdWRlcyhicmVha0Vycm9yLm1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9icmVha3BvaW50RXJyb3JzLnB1c2goYnJlYWtFcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2RlYnVnZ2VyOmJyZWFrRXJyb3InLCBicmVha0Vycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsb2cuaW5mbyhgQ29ubmVjdGluZyB0byBkZWJ1Z2dlciBvbiBwb3J0ICR7dGhpcy5fZGVidWdQb3J0fS4uLmApO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWJ1Z2dlci5jb25uZWN0KHRoaXMuX2RlYnVnUG9ydCwgJzEyNy4wLjAuMScpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdDYW5ub3QgY29ubmVjdCB0byB0aGUgZGVidWdnZXI6ICcsIGUpO1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0Nhbm5vdCBjb25uZWN0IHRvIHRoZSBkZWJ1Z2dlcjogJyArIGUubWVzc2FnZTtcclxuICAgICAgICAgICAgd2hlbkRlYnVnZ2VyUmVhZHkucmVqZWN0KG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHdoZW5EZWJ1Z2dlclJlYWR5LnByb21pc2U7XHJcbiAgICB9XHJcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxJQUFBQSxjQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFGLE9BQUE7QUFHQSxJ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
|