oxygen-cli 1.40.2 → 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 +13 -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 +51 -82
- package/build/index.js +8 -22
- package/build/lib/cli-util.js +39 -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 +21 -34
- 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 +265 -0
- 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 +14 -120
- 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 +5 -1
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
* the Free Software Foundation, either version 3 of the License, or
|
|
7
7
|
* (at your option) any later version.
|
|
8
8
|
*/
|
|
9
|
+
|
|
9
10
|
'use strict';
|
|
11
|
+
|
|
10
12
|
/**
|
|
11
13
|
* @name mob
|
|
12
14
|
* @description Provides methods for mobile automation.
|
|
@@ -49,38 +51,22 @@
|
|
|
49
51
|
* * `PATTERN` - Verbatim matching.
|
|
50
52
|
*
|
|
51
53
|
*/
|
|
52
|
-
|
|
53
54
|
Object.defineProperty(exports, "__esModule", {
|
|
54
55
|
value: true
|
|
55
56
|
});
|
|
56
57
|
exports.default = void 0;
|
|
57
|
-
|
|
58
58
|
require("source-map-support/register");
|
|
59
|
-
|
|
60
59
|
var _url = _interopRequireDefault(require("url"));
|
|
61
|
-
|
|
62
60
|
var wdio = _interopRequireWildcard(require("webdriverio"));
|
|
63
|
-
|
|
64
61
|
var _WebDriverModule = _interopRequireDefault(require("../core/WebDriverModule"));
|
|
65
|
-
|
|
66
62
|
var _utils = _interopRequireDefault(require("./utils"));
|
|
67
|
-
|
|
68
63
|
var _helper = _interopRequireDefault(require("../errors/helper"));
|
|
69
|
-
|
|
70
64
|
var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
|
|
71
|
-
|
|
72
65
|
var _perfectoReporting = _interopRequireDefault(require("perfecto-reporting"));
|
|
73
|
-
|
|
74
66
|
var _request = _interopRequireDefault(require("request"));
|
|
75
|
-
|
|
76
67
|
var _imgMerge = _interopRequireDefault(require("../lib/img-merge"));
|
|
77
|
-
|
|
78
|
-
function
|
|
79
|
-
|
|
80
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
81
|
-
|
|
82
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
83
|
-
|
|
68
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
69
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
84
70
|
const MODULE_NAME = 'mob';
|
|
85
71
|
const DEFAULT_APPIUM_URL = 'http://localhost:4723/wd/hub';
|
|
86
72
|
const DEFAULT_BROWSER_NAME = 'default';
|
|
@@ -96,47 +82,41 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
96
82
|
this.networkRequests = null;
|
|
97
83
|
this.helpers = {};
|
|
98
84
|
this.appContext = 'NATIVE_APP';
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
85
|
+
this._loadHelperFunctions();
|
|
86
|
+
// support backward compatibility (some module commands might refer to this.OxError and this.errHelper)
|
|
103
87
|
this.OxError = _OxygenError.default;
|
|
104
|
-
this.errHelper = _helper.default;
|
|
105
|
-
|
|
88
|
+
this.errHelper = _helper.default;
|
|
89
|
+
// holds element operation timeout value
|
|
106
90
|
this.waitForTimeout = DEFAULT_WAIT_TIMEOUT;
|
|
107
91
|
}
|
|
108
|
-
|
|
109
92
|
get name() {
|
|
110
93
|
return MODULE_NAME;
|
|
111
94
|
}
|
|
95
|
+
|
|
112
96
|
/**
|
|
113
97
|
* @function getDriver
|
|
114
98
|
* @summary Returns the underlying WDIO driver.
|
|
115
99
|
* @return {Object} WDIO driver.
|
|
116
100
|
*/
|
|
117
|
-
|
|
118
|
-
|
|
119
101
|
getDriver() {
|
|
120
102
|
return super.getDriver();
|
|
121
103
|
}
|
|
104
|
+
|
|
122
105
|
/**
|
|
123
106
|
* @function getCapabilities
|
|
124
107
|
* @summary Returns currently defined capabilities.
|
|
125
108
|
* @return {Object} Current capabilities object.
|
|
126
109
|
*/
|
|
127
|
-
|
|
128
|
-
|
|
129
110
|
getCapabilities() {
|
|
130
111
|
return this.caps || super.getCapabilities();
|
|
131
112
|
}
|
|
113
|
+
|
|
132
114
|
/**
|
|
133
115
|
* @function init
|
|
134
116
|
* @summary Initializes a new Appium session.
|
|
135
117
|
* @param {String=} caps - Desired capabilities. If not specified capabilities will be taken from suite definition.
|
|
136
118
|
* @param {String=} appiumUrl - Remote Appium server URL (default: http://localhost:4723/wd/hub).
|
|
137
119
|
*/
|
|
138
|
-
|
|
139
|
-
|
|
140
120
|
async init(caps, appiumUrl) {
|
|
141
121
|
// if reopenSession is true - reinitilize the module
|
|
142
122
|
if (this.isInitialized) {
|
|
@@ -148,11 +128,10 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
148
128
|
} else {
|
|
149
129
|
this.logger.debug('mob.init was called for already initialized module. reopenSession is false so the call is ignored.');
|
|
150
130
|
}
|
|
151
|
-
|
|
152
131
|
return;
|
|
153
|
-
}
|
|
154
|
-
|
|
132
|
+
}
|
|
155
133
|
|
|
134
|
+
// FIXME: this should be refactored
|
|
156
135
|
if (this.ctx.caps && this.ctx.caps['perfectoMobile:options']) {
|
|
157
136
|
if (caps) {
|
|
158
137
|
delete caps.platformName;
|
|
@@ -161,7 +140,6 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
161
140
|
delete caps.browserName;
|
|
162
141
|
delete caps.automationName;
|
|
163
142
|
delete caps.udid;
|
|
164
|
-
|
|
165
143
|
if (caps.app) {
|
|
166
144
|
caps.enableAppiumBehavior = true;
|
|
167
145
|
} else {
|
|
@@ -173,60 +151,58 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
173
151
|
this.ctx.caps.enableAppiumBehavior = true;
|
|
174
152
|
}
|
|
175
153
|
}
|
|
176
|
-
|
|
177
154
|
if (!appiumUrl) {
|
|
178
155
|
appiumUrl = this.options.appiumUrl || DEFAULT_APPIUM_URL;
|
|
179
|
-
}
|
|
180
|
-
|
|
156
|
+
}
|
|
181
157
|
|
|
158
|
+
// merge capabilities from context and from init function argument, give preference to context-passed capabilities
|
|
182
159
|
this.caps = {};
|
|
183
|
-
|
|
184
160
|
if (this.ctx.caps) {
|
|
185
|
-
this.caps = {
|
|
161
|
+
this.caps = {
|
|
162
|
+
...this.ctx.caps
|
|
186
163
|
};
|
|
187
164
|
}
|
|
188
|
-
|
|
189
165
|
if (caps) {
|
|
190
|
-
this.caps = {
|
|
166
|
+
this.caps = {
|
|
167
|
+
...this.caps,
|
|
191
168
|
...caps
|
|
192
169
|
};
|
|
193
|
-
}
|
|
194
|
-
|
|
170
|
+
}
|
|
195
171
|
|
|
172
|
+
// make sure to clear the existing device logs, if collectDeviceLogs option is true (we want to include logs only relevant for this session)
|
|
196
173
|
if (this.options.collectDeviceLogs) {
|
|
197
174
|
this.caps['clearDeviceLogsOnStart'] = true;
|
|
198
|
-
}
|
|
199
|
-
|
|
175
|
+
}
|
|
200
176
|
|
|
177
|
+
// if both browserName and appPackage/app/bundleId were specified - assume we want to run the application and remove browserName
|
|
201
178
|
if (this.caps.browserName && (this.caps.appPackage || this.caps.app || this.caps.bundleId)) {
|
|
202
179
|
delete this.caps.browserName;
|
|
203
|
-
}
|
|
180
|
+
}
|
|
181
|
+
// if no appPackage/app/bundleId capability nor browserName are defined, assume we want to run the test against default browser
|
|
204
182
|
else if (!this.caps.browserName && !this.caps.appPackage && !this.caps.app && !this.caps.bundleId) {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
183
|
+
this.caps.browserName = DEFAULT_BROWSER_NAME;
|
|
184
|
+
}
|
|
185
|
+
// webdriver expects lower case names
|
|
209
186
|
if (this.caps.browserName && typeof this.caps.browserName === 'string') {
|
|
210
187
|
this.caps.browserName = this.caps.browserName.toLowerCase();
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
|
|
188
|
+
}
|
|
189
|
+
// adjust capabilities to enable collecting browser and performance stats in Chrome
|
|
214
190
|
if (this.options.recordHAR && this.caps.browserName === 'chrome') {
|
|
215
191
|
this.caps['goog:loggingPrefs'] = {
|
|
216
192
|
// for ChromeDriver >= 75
|
|
217
193
|
browser: 'ALL',
|
|
218
194
|
performance: 'ALL'
|
|
219
195
|
};
|
|
220
|
-
}
|
|
221
|
-
|
|
196
|
+
}
|
|
222
197
|
|
|
198
|
+
// populate WDIO options
|
|
223
199
|
const url = _url.default.parse(appiumUrl);
|
|
224
|
-
|
|
225
200
|
const protocol = url.protocol.replace(/:$/, '');
|
|
226
201
|
const host = url.hostname;
|
|
227
202
|
const port = parseInt(url.port || (protocol === 'https' ? 443 : 80));
|
|
228
|
-
const path = url.pathname;
|
|
203
|
+
const path = url.pathname;
|
|
229
204
|
|
|
205
|
+
// auth is needed mostly for cloud providers such as LambdaTest
|
|
230
206
|
if (url.auth) {
|
|
231
207
|
const auth = url.auth.split(':');
|
|
232
208
|
this.options.wdioOpts = {
|
|
@@ -234,8 +210,8 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
234
210
|
key: auth[1]
|
|
235
211
|
};
|
|
236
212
|
}
|
|
237
|
-
|
|
238
|
-
|
|
213
|
+
var wdioOpts = {
|
|
214
|
+
...(this.options.wdioOpts || {}),
|
|
239
215
|
protocol: protocol,
|
|
240
216
|
hostname: host,
|
|
241
217
|
port: port,
|
|
@@ -248,86 +224,20 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
248
224
|
connectionRetryTimeout: 310 * 1000,
|
|
249
225
|
connectionRetryCount: 1
|
|
250
226
|
};
|
|
251
|
-
|
|
252
227
|
let provider = _utils.default.determineProvider(wdioOpts);
|
|
228
|
+
const name = _utils.default.enrichProviderWdioOptions(provider, wdioOpts);
|
|
229
|
+
this.wdioOpts = wdioOpts;
|
|
253
230
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
if (provider === _utils.default.provider.PERFECTO) {
|
|
257
|
-
wdioOpts.capabilities.maxInstances = 1;
|
|
258
|
-
wdioOpts.path = '/nexperience/perfectomobile/wd/hub';
|
|
259
|
-
wdioOpts.port = 80;
|
|
260
|
-
wdioOpts.protocol = 'http';
|
|
261
|
-
wdioOpts.openDeviceTimeout = 15;
|
|
262
|
-
delete wdioOpts.capabilities.manufacturer;
|
|
263
|
-
delete wdioOpts.capabilities.model;
|
|
264
|
-
delete wdioOpts.capabilities.browserName;
|
|
265
|
-
delete wdioOpts.capabilities.host;
|
|
266
|
-
name = wdioOpts.capabilities['perfectoMobile:options']['name'];
|
|
267
|
-
delete wdioOpts.capabilities['perfectoMobile:options'];
|
|
268
|
-
} else if (provider === _utils.default.provider.BROWSERSTACK) {
|
|
269
|
-
const bsOptions = wdioOpts.capabilities['bstack:options'];
|
|
270
|
-
|
|
271
|
-
if (bsOptions) {
|
|
272
|
-
const deviceName = bsOptions.deviceName;
|
|
273
|
-
const osName = bsOptions.os;
|
|
274
|
-
|
|
275
|
-
if (deviceName) {
|
|
276
|
-
bsOptions.realMobile = true;
|
|
277
|
-
wdioOpts.capabilities['appium:deviceName'] = deviceName;
|
|
278
|
-
} // set automationName Appium capability
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
if (osName && osName.toLowerCase() === 'android') {
|
|
282
|
-
wdioOpts.capabilities.platformName = 'Android';
|
|
283
|
-
wdioOpts.capabilities['appium:automationName'] = 'UIAutomator2';
|
|
284
|
-
} else if (osName && osName.toLowerCase() === 'ios') {
|
|
285
|
-
wdioOpts.capabilities.platformName = 'iOS';
|
|
286
|
-
wdioOpts.capabilities['appium:automationName'] = 'XCUITest';
|
|
287
|
-
} // merge user-provided BS options into the final options object
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
for (const capName in wdioOpts.capabilities) {
|
|
291
|
-
if (capName.startsWith('bstack:')) {
|
|
292
|
-
const bsCapName = capName.substring('bstack:'.length);
|
|
293
|
-
|
|
294
|
-
if (bsCapName === 'options') {
|
|
295
|
-
continue;
|
|
296
|
-
} // for backward compatibility... needs to be removed eventually
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
if (bsCapName === 'recordVideo') {
|
|
300
|
-
bsOptions.video = wdioOpts.capabilities[capName];
|
|
301
|
-
delete wdioOpts.capabilities[capName];
|
|
302
|
-
continue;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
bsOptions[bsCapName] = wdioOpts.capabilities[capName];
|
|
306
|
-
delete wdioOpts.capabilities[capName];
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
if (wdioOpts.capabilities['bstack:options'] && wdioOpts.capabilities['bstack:options']['name']) {
|
|
313
|
-
name = wdioOpts.capabilities['bstack:options']['name'];
|
|
314
|
-
delete wdioOpts.capabilities['bstack:options'];
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
this.wdioOpts = wdioOpts; // init webdriver
|
|
318
|
-
|
|
231
|
+
// init webdriver
|
|
319
232
|
try {
|
|
320
233
|
this.driver = await wdio.remote(wdioOpts);
|
|
321
234
|
this.driver.provider = provider;
|
|
322
|
-
|
|
323
235
|
if (this.options.seleniumBrowserTimeout) {
|
|
324
236
|
this.driver.seleniumBrowserTimeout = this.options.seleniumBrowserTimeout;
|
|
325
237
|
}
|
|
326
|
-
|
|
327
238
|
if (this.options.seleniumTimeout) {
|
|
328
239
|
this.driver.seleniumTimeout = this.options.seleniumTimeout;
|
|
329
240
|
}
|
|
330
|
-
|
|
331
241
|
if (provider === _utils.default.provider.PERFECTO) {
|
|
332
242
|
const perfectoExecutionContext = await new _perfectoReporting.default.Perfecto.PerfectoExecutionContext({
|
|
333
243
|
webdriver: {
|
|
@@ -342,49 +252,43 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
342
252
|
} catch (e) {
|
|
343
253
|
throw _helper.default.getAppiumInitError(e);
|
|
344
254
|
}
|
|
255
|
+
this.appContext = await this.driver.getContext();
|
|
345
256
|
|
|
346
|
-
|
|
257
|
+
// if we are running on Android 7+ emulator, and thus/or using a WebView Browser Tester -
|
|
347
258
|
// perform an actual appContext switch to WEB
|
|
348
259
|
// so Appium will delegate commands to Chrome Driver instead of Appium Driver
|
|
349
|
-
|
|
350
260
|
if (this.caps.browserName === 'chromium-webview') {
|
|
351
261
|
await this.setWebViewContext();
|
|
352
262
|
}
|
|
353
|
-
|
|
354
|
-
|
|
263
|
+
if (provider === _utils.default.provider.BROWSERSTACK) {
|
|
264
|
+
// ignore
|
|
355
265
|
// fails on browserstack
|
|
356
266
|
} else {
|
|
357
267
|
await this.driver.setTimeout({
|
|
358
268
|
'implicit': this.waitForTimeout
|
|
359
269
|
});
|
|
360
270
|
}
|
|
361
|
-
|
|
362
271
|
await _utils.default.overwriteWdioCommands(this.driver);
|
|
363
272
|
super.init(this.driver);
|
|
364
273
|
}
|
|
274
|
+
|
|
365
275
|
/**
|
|
366
276
|
* @function dispose
|
|
367
277
|
* @summary Ends the current session.
|
|
368
278
|
* @param {String=} status - Test status, either `passed` or `failed`.
|
|
369
279
|
*/
|
|
370
|
-
|
|
371
|
-
|
|
372
280
|
async dispose(status) {
|
|
373
281
|
if (!status) {
|
|
374
282
|
status = 'passed';
|
|
375
|
-
|
|
376
283
|
if (this.rs.steps && Array.isArray(this.rs.steps) && this.rs.steps.length > 0) {
|
|
377
284
|
const failedFinded = this.rs.steps.find(item => item.status === 'failed');
|
|
378
|
-
|
|
379
285
|
if (failedFinded) {
|
|
380
286
|
status = 'failed';
|
|
381
287
|
}
|
|
382
288
|
}
|
|
383
289
|
}
|
|
384
|
-
|
|
385
290
|
if (this.driver && this.isInitialized) {
|
|
386
291
|
status = status.toUpperCase();
|
|
387
|
-
|
|
388
292
|
if (this.driver.provider === _utils.default.provider.PERFECTO) {
|
|
389
293
|
await this.reportingClient.testStop({
|
|
390
294
|
status: status === 'PASSED' ? _perfectoReporting.default.Constants.results.passed : _perfectoReporting.default.Constants.results.failed
|
|
@@ -393,10 +297,10 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
393
297
|
await this._setBrowserStackResultStatus(status);
|
|
394
298
|
await this.deleteSession();
|
|
395
299
|
}
|
|
396
|
-
|
|
397
300
|
try {
|
|
398
301
|
if (!['CANCELED', 'FAILED'].includes(status)) {
|
|
399
|
-
if (this.seleniumSessionTimeout) {
|
|
302
|
+
if (this.seleniumSessionTimeout) {
|
|
303
|
+
// ignore
|
|
400
304
|
// deleteSession will take 5 min to call
|
|
401
305
|
} else {
|
|
402
306
|
await this.driver.deleteSession();
|
|
@@ -405,7 +309,6 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
405
309
|
} catch (e) {
|
|
406
310
|
this.logger.warn('Error disposing driver: ' + e); // ignore any errors at disposal stage
|
|
407
311
|
}
|
|
408
|
-
|
|
409
312
|
this.driver = null;
|
|
410
313
|
this.lastNavigationStartTime = null;
|
|
411
314
|
super.dispose();
|
|
@@ -413,6 +316,7 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
413
316
|
return;
|
|
414
317
|
}
|
|
415
318
|
}
|
|
319
|
+
|
|
416
320
|
/**
|
|
417
321
|
* @summary Opens new transaction.
|
|
418
322
|
* @description The transaction will persist till a new one is opened. Transaction names must be unique.
|
|
@@ -420,35 +324,30 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
420
324
|
* @param {String} name - The transaction name.
|
|
421
325
|
* @for android, ios, hybrid, web
|
|
422
326
|
*/
|
|
423
|
-
|
|
424
|
-
|
|
425
327
|
transaction(name) {
|
|
426
328
|
if (!name) {
|
|
427
329
|
return;
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
name = name.toString(); // limit the name length (since we can't store values larger than 512B in the database)
|
|
330
|
+
}
|
|
331
|
+
// just in case user passed a complex object by mistake
|
|
332
|
+
name = name.toString();
|
|
432
333
|
|
|
334
|
+
// limit the name length (since we can't store values larger than 512B in the database)
|
|
433
335
|
name = name.slice(0, 512);
|
|
434
336
|
global._lastTransactionName = name;
|
|
435
337
|
}
|
|
338
|
+
|
|
436
339
|
/*
|
|
437
340
|
* Private
|
|
438
341
|
*/
|
|
439
342
|
|
|
440
|
-
|
|
441
343
|
_isAction(name) {
|
|
442
344
|
return ACTION_COMMANDS.includes(name);
|
|
443
345
|
}
|
|
444
|
-
|
|
445
346
|
_takeScreenshotSilent(name) {
|
|
446
347
|
if (!NO_SCREENSHOT_COMMANDS.includes(name)) {
|
|
447
348
|
let error;
|
|
448
|
-
|
|
449
349
|
try {
|
|
450
350
|
var _this$driver;
|
|
451
|
-
|
|
452
351
|
if ((_this$driver = this.driver) !== null && _this$driver !== void 0 && _this$driver.takeScreenshot) {
|
|
453
352
|
let retval;
|
|
454
353
|
this.driver.call(() => {
|
|
@@ -456,34 +355,25 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
456
355
|
const waitUntilRetVal = this.driver.waitUntil(async () => {
|
|
457
356
|
try {
|
|
458
357
|
let images = [];
|
|
459
|
-
|
|
460
358
|
const pushImageToImages = async (fetchTitle = true) => {
|
|
461
359
|
const image = await this.driver.takeScreenshot();
|
|
462
|
-
|
|
463
360
|
if (fetchTitle) {
|
|
464
361
|
const title = await this.driver.getTitle();
|
|
465
|
-
|
|
466
362
|
if (title) {
|
|
467
363
|
const textToImage = require('../lib/text-to-image');
|
|
468
|
-
|
|
469
364
|
let titleImage = await textToImage.generate(title);
|
|
470
|
-
|
|
471
365
|
if (titleImage && typeof titleImage === 'string') {
|
|
472
366
|
titleImage = titleImage.replace('data:image/png;base64,', '');
|
|
473
367
|
images.push(titleImage);
|
|
474
368
|
}
|
|
475
369
|
}
|
|
476
370
|
}
|
|
477
|
-
|
|
478
371
|
images.push(image);
|
|
479
372
|
};
|
|
480
|
-
|
|
481
373
|
const isWebViewContext = await this.isWebViewContext();
|
|
482
|
-
|
|
483
374
|
if (isWebViewContext) {
|
|
484
375
|
// collect all (screenshot and title) images
|
|
485
376
|
const handles = await this.driver.getWindowHandles();
|
|
486
|
-
|
|
487
377
|
if (handles && Array.isArray(handles) && handles.length > 0) {
|
|
488
378
|
for (const handle of handles) {
|
|
489
379
|
await this.driver.switchToWindow(handle);
|
|
@@ -492,17 +382,15 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
492
382
|
}
|
|
493
383
|
} else {
|
|
494
384
|
await pushImageToImages(false);
|
|
495
|
-
}
|
|
496
|
-
|
|
385
|
+
}
|
|
497
386
|
|
|
387
|
+
// merge all images into one
|
|
498
388
|
const mergedImage = await (0, _imgMerge.default)(images, {
|
|
499
389
|
direction: true
|
|
500
390
|
});
|
|
501
|
-
|
|
502
391
|
if (mergedImage && typeof mergedImage === 'string') {
|
|
503
392
|
retval = mergedImage.replace('data:image/jpeg;base64,', '');
|
|
504
393
|
}
|
|
505
|
-
|
|
506
394
|
return true;
|
|
507
395
|
} catch (e) {
|
|
508
396
|
error = e;
|
|
@@ -511,7 +399,6 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
511
399
|
}, {
|
|
512
400
|
timeout: 30 * 1000
|
|
513
401
|
});
|
|
514
|
-
|
|
515
402
|
if (waitUntilRetVal && waitUntilRetVal.then) {
|
|
516
403
|
waitUntilRetVal.then(() => {
|
|
517
404
|
resolve();
|
|
@@ -523,35 +410,32 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
523
410
|
}
|
|
524
411
|
});
|
|
525
412
|
});
|
|
526
|
-
|
|
527
413
|
if (error) {
|
|
528
414
|
this.logger.error('Cannot get screenshot', error);
|
|
529
415
|
}
|
|
530
|
-
|
|
531
416
|
return retval;
|
|
532
417
|
}
|
|
533
418
|
} catch (e) {
|
|
534
419
|
this.logger.error('Cannot get screenshot', e);
|
|
535
|
-
|
|
536
420
|
if (error) {
|
|
537
421
|
this.logger.error('Cannot get screenshot inner error', error);
|
|
538
|
-
}
|
|
539
|
-
|
|
422
|
+
}
|
|
423
|
+
// ignore
|
|
540
424
|
}
|
|
541
425
|
}
|
|
542
|
-
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// _getLogs(name) {
|
|
543
429
|
// if (!NO_LOGS_COMMANDS.includes(name)) {
|
|
544
430
|
// return this.getLogs();
|
|
545
431
|
// }
|
|
546
432
|
// }
|
|
547
433
|
|
|
548
|
-
|
|
549
434
|
_adjustAppiumLog(log, src) {
|
|
550
435
|
if (!log || typeof log !== 'object') {
|
|
551
436
|
return null;
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
|
|
437
|
+
}
|
|
438
|
+
// TODO: convert log.timestamp from the device time zone to the local one (so we can later correlate between steps and logs)
|
|
555
439
|
return {
|
|
556
440
|
time: log.timestamp,
|
|
557
441
|
msg: log.message,
|
|
@@ -559,30 +443,25 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
559
443
|
src: src
|
|
560
444
|
};
|
|
561
445
|
}
|
|
562
|
-
|
|
563
446
|
_iterationStart() {
|
|
564
447
|
// clear transaction name saved in previous iteration if any
|
|
565
448
|
global._lastTransactionName = null;
|
|
566
449
|
}
|
|
567
|
-
|
|
568
450
|
async _iterationEnd(error) {
|
|
569
451
|
if (error && error.type === _helper.default.errorCode.APPIUM_SESSION_TIMEOUT) {
|
|
570
452
|
this.seleniumSessionTimeout = true;
|
|
571
453
|
return;
|
|
572
454
|
} else {
|
|
573
455
|
this.seleniumSessionTimeout = false;
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
|
|
456
|
+
}
|
|
457
|
+
// ignore the rest if mob module is not initialized
|
|
577
458
|
if (!this.isInitialized) {
|
|
578
459
|
return;
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
|
|
460
|
+
}
|
|
461
|
+
// collect all the device logs for this session
|
|
582
462
|
if (this.options.collectDeviceLogs) {
|
|
583
463
|
try {
|
|
584
464
|
const logs = await this.getDeviceLogs();
|
|
585
|
-
|
|
586
465
|
if (logs && Array.isArray(logs)) {
|
|
587
466
|
for (let log of logs) {
|
|
588
467
|
this.rs.logs.push(this._adjustAppiumLog(log, 'device'));
|
|
@@ -592,13 +471,12 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
592
471
|
// ignore errors
|
|
593
472
|
this.logger.error('Cannot retrieve device logs.', e);
|
|
594
473
|
}
|
|
595
|
-
}
|
|
596
|
-
|
|
474
|
+
}
|
|
597
475
|
|
|
476
|
+
// collect all the browser logs for this session
|
|
598
477
|
if (this.options.collectBrowserLogs) {
|
|
599
478
|
try {
|
|
600
479
|
const logs = await this.getBrowserLogs();
|
|
601
|
-
|
|
602
480
|
if (logs && Array.isArray(logs)) {
|
|
603
481
|
for (let log of logs) {
|
|
604
482
|
this.rs.logs.push(this._adjustAppiumLog(log, 'browser'));
|
|
@@ -608,13 +486,12 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
608
486
|
// ignore errors
|
|
609
487
|
this.logger.error('Cannot retrieve browser logs.', e);
|
|
610
488
|
}
|
|
611
|
-
}
|
|
612
|
-
|
|
489
|
+
}
|
|
613
490
|
|
|
491
|
+
// collect all Appium logs for this session
|
|
614
492
|
if (this.options.collectAppiumLogs) {
|
|
615
493
|
try {
|
|
616
494
|
const logs = this.getAppiumLogs();
|
|
617
|
-
|
|
618
495
|
if (logs && Array.isArray(logs)) {
|
|
619
496
|
for (var logEntry of logs) {
|
|
620
497
|
this.rs.logs.push(this._adjustAppiumLog(logEntry, 'appium'));
|
|
@@ -625,58 +502,49 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
625
502
|
this.logger.error('Cannot retrieve Appium logs.', e);
|
|
626
503
|
}
|
|
627
504
|
}
|
|
628
|
-
|
|
629
505
|
if (this.driver.provider === _utils.default.provider.BROWSERSTACK) {
|
|
630
506
|
var resultUrl = await this._getBrowserStackResultUrl();
|
|
631
|
-
|
|
632
507
|
if (resultUrl) {
|
|
633
508
|
// FIXME: this should be written to context.resultData instead
|
|
634
509
|
this.rs.attributes['BrowserStackUrl'] = resultUrl;
|
|
635
510
|
}
|
|
636
511
|
}
|
|
637
512
|
}
|
|
638
|
-
|
|
639
513
|
_getWdioLocator(locator) {
|
|
640
514
|
if (!locator) {
|
|
641
515
|
throw new _OxygenError.default(_helper.default.errorCode.SCRIPT_ERROR, 'Invalid argument - locator not specified');
|
|
642
516
|
}
|
|
643
|
-
|
|
644
517
|
if (typeof locator !== 'string') {
|
|
645
518
|
return locator;
|
|
646
519
|
}
|
|
647
|
-
|
|
648
520
|
if (locator.indexOf('/') === 0) {
|
|
649
521
|
return locator; // leave xpath locator as is
|
|
650
522
|
}
|
|
651
|
-
|
|
652
523
|
const platform = this.caps && this.caps.platformName ? this.caps.platformName.toLowerCase() : null;
|
|
653
|
-
|
|
654
524
|
if (this.appContext === 'NATIVE_APP' && platform === 'android') {
|
|
655
525
|
if (locator.indexOf('id=') === 0) {
|
|
656
526
|
// prepend package name if it's not specified
|
|
657
527
|
// NOTE: getCurrentPackage() seems to crash possibly due to a wdio bug.
|
|
658
528
|
// so we get package name from caps instead.
|
|
659
529
|
locator = locator.substr('id='.length);
|
|
660
|
-
|
|
661
530
|
if (locator.indexOf(':id/') === -1) {
|
|
662
531
|
locator = this.caps.appPackage + ':id/' + locator;
|
|
663
532
|
}
|
|
664
|
-
|
|
665
533
|
return 'android=new UiSelector().resourceId("' + locator + '")';
|
|
666
|
-
} else if (locator.indexOf('class=') === 0) return 'android=new UiSelector().className("' + locator.substr('class='.length) + '")';else if (locator.indexOf('text=') === 0) return 'android=new UiSelector().text("' + locator.substr('text='.length) + '")';else if (locator.indexOf('text-contains=') === 0) return 'android=new UiSelector().textContains("' + locator.substr('text-contains='.length) + '")';else if (locator.indexOf('desc=') === 0) return 'android=new UiSelector().description("' + locator.substr('desc='.length) + '")';else if (locator.indexOf('desc-contains=') === 0) return 'android=new UiSelector().descriptionContains("' + locator.substr('desc-contains='.length) + '")';else if (locator.indexOf('scrollable') === 0) return 'android=new UiSelector().scrollable(true)';else if (locator.indexOf('~') === 0)
|
|
534
|
+
} else if (locator.indexOf('class=') === 0) return 'android=new UiSelector().className("' + locator.substr('class='.length) + '")';else if (locator.indexOf('text=') === 0) return 'android=new UiSelector().text("' + locator.substr('text='.length) + '")';else if (locator.indexOf('text-contains=') === 0) return 'android=new UiSelector().textContains("' + locator.substr('text-contains='.length) + '")';else if (locator.indexOf('desc=') === 0) return 'android=new UiSelector().description("' + locator.substr('desc='.length) + '")';else if (locator.indexOf('desc-contains=') === 0) return 'android=new UiSelector().descriptionContains("' + locator.substr('desc-contains='.length) + '")';else if (locator.indexOf('scrollable') === 0) return 'android=new UiSelector().scrollable(true)';else if (locator.indexOf('~') === 0)
|
|
535
|
+
// accessibility id
|
|
667
536
|
return locator;
|
|
668
537
|
} else if (this.appContext === 'NATIVE_APP' && platform === 'ios') {
|
|
669
|
-
if (locator.indexOf('~') === 0)
|
|
538
|
+
if (locator.indexOf('~') === 0)
|
|
539
|
+
// accessibility id
|
|
670
540
|
return locator;
|
|
671
541
|
} else if (this.appContext !== 'NATIVE_APP') {
|
|
672
542
|
// Hybrid or Web application
|
|
673
543
|
if (locator.indexOf('id=') === 0) return '#' + locator.substr('id='.length); // convert 'id=' to '#'
|
|
674
544
|
else if (locator.indexOf('name=') === 0) return '[name=' + locator.substr('name='.length) + ']';else if (locator.indexOf('link=') === 0) return '=' + locator.substr('link='.length);else if (locator.indexOf('link-contains=') === 0) return '*=' + locator.substr('link='.length);else if (locator.indexOf('css=') === 0) return locator.substr('css='.length); // in case of css, just remove css= prefix
|
|
675
545
|
}
|
|
676
|
-
|
|
677
546
|
return locator;
|
|
678
547
|
}
|
|
679
|
-
|
|
680
548
|
_loadHelperFunctions() {
|
|
681
549
|
this.helpers.getWdioLocator = this._getWdioLocator;
|
|
682
550
|
this.helpers.matchPattern = _utils.default.matchPattern;
|
|
@@ -697,7 +565,6 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
697
565
|
this.helpers.contextList = _utils.default.contextList;
|
|
698
566
|
this.helpers.getLogTypes = _utils.default.getLogTypes;
|
|
699
567
|
}
|
|
700
|
-
|
|
701
568
|
async deleteSession() {
|
|
702
569
|
try {
|
|
703
570
|
if (this.driver && this.driver.deleteSession) {
|
|
@@ -707,14 +574,12 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
707
574
|
this.logger.error('deleteSession error', e);
|
|
708
575
|
}
|
|
709
576
|
}
|
|
710
|
-
|
|
711
577
|
async _setBrowserStackResultStatus(status) {
|
|
712
578
|
return new Promise((resolve, reject) => {
|
|
713
579
|
// different APIs are used depending on test type.
|
|
714
580
|
// https://www.browserstack.com/docs/automate/api-reference/selenium/session#set-test-status
|
|
715
581
|
// https://www.browserstack.com/docs/app-automate/api-reference/appium/sessions#update-session-status
|
|
716
582
|
const bsApiUrl = this.wdioOpts.capabilities['appium:app'] ? `https://api-cloud.browserstack.com/app-automate/sessions/${this.driver.sessionId}.json` : `https://api.browserstack.com/automate/sessions/${this.driver.sessionId}.json`;
|
|
717
|
-
|
|
718
583
|
try {
|
|
719
584
|
// set test status
|
|
720
585
|
(0, _request.default)({
|
|
@@ -734,7 +599,6 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
734
599
|
if (err) {
|
|
735
600
|
this.logger.error('Error setting BrowserStack test result status: ' + err.toString());
|
|
736
601
|
}
|
|
737
|
-
|
|
738
602
|
resolve();
|
|
739
603
|
});
|
|
740
604
|
} catch (e) {
|
|
@@ -743,14 +607,12 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
743
607
|
}
|
|
744
608
|
});
|
|
745
609
|
}
|
|
746
|
-
|
|
747
610
|
async _getBrowserStackResultUrl() {
|
|
748
611
|
return new Promise((resolve, reject) => {
|
|
749
612
|
// different APIs are used depending on test type.
|
|
750
613
|
// https://www.browserstack.com/docs/automate/api-reference/selenium/session#set-test-status
|
|
751
614
|
// https://www.browserstack.com/docs/app-automate/api-reference/appium/sessions#update-session-status
|
|
752
615
|
const bsApiUrl = this.wdioOpts.capabilities['appium:app'] ? `https://api-cloud.browserstack.com/app-automate/sessions/${this.driver.sessionId}.json` : `https://api.browserstack.com/automate/sessions/${this.driver.sessionId}.json`;
|
|
753
|
-
|
|
754
616
|
try {
|
|
755
617
|
// retreive BS test result url
|
|
756
618
|
(0, _request.default)({
|
|
@@ -765,11 +627,9 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
765
627
|
}
|
|
766
628
|
}, (err, res, body) => {
|
|
767
629
|
var _body$automation_sess;
|
|
768
|
-
|
|
769
630
|
if (err) {
|
|
770
631
|
this.logger.error('Error getting BrowserStack test result url: ' + err.toString());
|
|
771
632
|
}
|
|
772
|
-
|
|
773
633
|
resolve(body === null || body === void 0 ? void 0 : (_body$automation_sess = body.automation_session) === null || _body$automation_sess === void 0 ? void 0 : _body$automation_sess.browser_url);
|
|
774
634
|
});
|
|
775
635
|
} catch (e) {
|
|
@@ -778,8 +638,6 @@ class MobileModule extends _WebDriverModule.default {
|
|
|
778
638
|
}
|
|
779
639
|
});
|
|
780
640
|
}
|
|
781
|
-
|
|
782
641
|
}
|
|
783
|
-
|
|
784
642
|
exports.default = MobileModule;
|
|
785
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1tb2IuanMiXSwibmFtZXMiOlsiTU9EVUxFX05BTUUiLCJERUZBVUxUX0FQUElVTV9VUkwiLCJERUZBVUxUX0JST1dTRVJfTkFNRSIsIk5PX1NDUkVFTlNIT1RfQ09NTUFORFMiLCJBQ1RJT05fQ09NTUFORFMiLCJERUZBVUxUX1dBSVRfVElNRU9VVCIsIk1vYmlsZU1vZHVsZSIsIldlYkRyaXZlck1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsInRyYW5zYWN0aW9ucyIsImxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lIiwibmV0d29ya1JlcXVlc3RzIiwiaGVscGVycyIsImFwcENvbnRleHQiLCJfbG9hZEhlbHBlckZ1bmN0aW9ucyIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJ3YWl0Rm9yVGltZW91dCIsIm5hbWUiLCJnZXREcml2ZXIiLCJnZXRDYXBhYmlsaXRpZXMiLCJjYXBzIiwiaW5pdCIsImFwcGl1bVVybCIsImlzSW5pdGlhbGl6ZWQiLCJyZW9wZW5TZXNzaW9uIiwiZGVidWciLCJkcml2ZXIiLCJyZWxvYWRTZXNzaW9uIiwiX2lzSW5pdGlhbGl6ZWQiLCJjdHgiLCJwbGF0Zm9ybU5hbWUiLCJwbGF0Zm9ybVZlcnNpb24iLCJkZXZpY2VOYW1lIiwiYnJvd3Nlck5hbWUiLCJhdXRvbWF0aW9uTmFtZSIsInVkaWQiLCJhcHAiLCJlbmFibGVBcHBpdW1CZWhhdmlvciIsInVzZUFwcGl1bUZvcldlYiIsImNvbGxlY3REZXZpY2VMb2dzIiwiYXBwUGFja2FnZSIsImJ1bmRsZUlkIiwidG9Mb3dlckNhc2UiLCJyZWNvcmRIQVIiLCJicm93c2VyIiwicGVyZm9ybWFuY2UiLCJ1cmwiLCJVUkwiLCJwYXJzZSIsInByb3RvY29sIiwicmVwbGFjZSIsImhvc3QiLCJob3N0bmFtZSIsInBvcnQiLCJwYXJzZUludCIsInBhdGgiLCJwYXRobmFtZSIsImF1dGgiLCJzcGxpdCIsIndkaW9PcHRzIiwidXNlciIsImtleSIsImNhcGFiaWxpdGllcyIsImxvZ0xldmVsIiwicnVubmVyIiwid2FpdGZvclRpbWVvdXQiLCJjb25uZWN0aW9uUmV0cnlUaW1lb3V0IiwiY29ubmVjdGlvblJldHJ5Q291bnQiLCJwcm92aWRlciIsIm1vZFV0aWxzIiwiZGV0ZXJtaW5lUHJvdmlkZXIiLCJQRVJGRUNUTyIsIm1heEluc3RhbmNlcyIsIm9wZW5EZXZpY2VUaW1lb3V0IiwibWFudWZhY3R1cmVyIiwibW9kZWwiLCJCUk9XU0VSU1RBQ0siLCJic09wdGlvbnMiLCJvc05hbWUiLCJvcyIsInJlYWxNb2JpbGUiLCJjYXBOYW1lIiwic3RhcnRzV2l0aCIsImJzQ2FwTmFtZSIsInN1YnN0cmluZyIsImxlbmd0aCIsInZpZGVvIiwid2RpbyIsInJlbW90ZSIsInNlbGVuaXVtQnJvd3NlclRpbWVvdXQiLCJzZWxlbml1bVRpbWVvdXQiLCJwZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQiLCJwZXJmZWN0b1JlcG9ydGluZyIsIlBlcmZlY3RvIiwiUGVyZmVjdG9FeGVjdXRpb25Db250ZXh0Iiwid2ViZHJpdmVyIiwiZXhlY3V0ZVNjcmlwdCIsImNvbW1hbmQiLCJwYXJhbXMiLCJleGVjdXRlIiwicmVwb3J0aW5nQ2xpZW50IiwiUGVyZmVjdG9SZXBvcnRpbmdDbGllbnQiLCJ0ZXN0U3RhcnQiLCJlIiwiZ2V0QXBwaXVtSW5pdEVycm9yIiwiZ2V0Q29udGV4dCIsInNldFdlYlZpZXdDb250ZXh0Iiwic2V0VGltZW91dCIsIm92ZXJ3cml0ZVdkaW9Db21tYW5kcyIsImRpc3Bvc2UiLCJzdGF0dXMiLCJzdGVwcyIsIkFycmF5IiwiaXNBcnJheSIsImZhaWxlZEZpbmRlZCIsImZpbmQiLCJpdGVtIiwidG9VcHBlckNhc2UiLCJ0ZXN0U3RvcCIsIkNvbnN0YW50cyIsInJlc3VsdHMiLCJwYXNzZWQiLCJmYWlsZWQiLCJfc2V0QnJvd3NlclN0YWNrUmVzdWx0U3RhdHVzIiwiZGVsZXRlU2Vzc2lvbiIsImluY2x1ZGVzIiwic2VsZW5pdW1TZXNzaW9uVGltZW91dCIsIndhcm4iLCJ0cmFuc2FjdGlvbiIsInRvU3RyaW5nIiwic2xpY2UiLCJnbG9iYWwiLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsIl9pc0FjdGlvbiIsIl90YWtlU2NyZWVuc2hvdFNpbGVudCIsImVycm9yIiwidGFrZVNjcmVlbnNob3QiLCJyZXR2YWwiLCJjYWxsIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ3YWl0VW50aWxSZXRWYWwiLCJ3YWl0VW50aWwiLCJpbWFnZXMiLCJwdXNoSW1hZ2VUb0ltYWdlcyIsImZldGNoVGl0bGUiLCJpbWFnZSIsInRpdGxlIiwiZ2V0VGl0bGUiLCJ0ZXh0VG9JbWFnZSIsInJlcXVpcmUiLCJ0aXRsZUltYWdlIiwiZ2VuZXJhdGUiLCJwdXNoIiwiaXNXZWJWaWV3Q29udGV4dCIsImhhbmRsZXMiLCJnZXRXaW5kb3dIYW5kbGVzIiwiaGFuZGxlIiwic3dpdGNoVG9XaW5kb3ciLCJtZXJnZWRJbWFnZSIsImRpcmVjdGlvbiIsInRpbWVvdXQiLCJ0aGVuIiwiY2F0Y2giLCJlcnIiLCJfYWRqdXN0QXBwaXVtTG9nIiwibG9nIiwic3JjIiwidGltZSIsInRpbWVzdGFtcCIsIm1zZyIsIm1lc3NhZ2UiLCJsZXZlbCIsIl9pdGVyYXRpb25TdGFydCIsIl9pdGVyYXRpb25FbmQiLCJ0eXBlIiwiZXJyb3JIZWxwZXIiLCJlcnJvckNvZGUiLCJBUFBJVU1fU0VTU0lPTl9USU1FT1VUIiwibG9ncyIsImdldERldmljZUxvZ3MiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJnZXRCcm93c2VyTG9ncyIsImNvbGxlY3RBcHBpdW1Mb2dzIiwiZ2V0QXBwaXVtTG9ncyIsImxvZ0VudHJ5IiwicmVzdWx0VXJsIiwiX2dldEJyb3dzZXJTdGFja1Jlc3VsdFVybCIsImF0dHJpYnV0ZXMiLCJfZ2V0V2Rpb0xvY2F0b3IiLCJsb2NhdG9yIiwiU0NSSVBUX0VSUk9SIiwiaW5kZXhPZiIsInBsYXRmb3JtIiwic3Vic3RyIiwiZ2V0V2Rpb0xvY2F0b3IiLCJtYXRjaFBhdHRlcm4iLCJnZXRFbGVtZW50IiwiZ2V0RWxlbWVudHMiLCJnZXRDaGlsZEVsZW1lbnQiLCJnZXRDaGlsZEVsZW1lbnRzIiwic2V0VGltZW91dEltcGxpY2l0IiwicmVzdG9yZVRpbWVvdXRJbXBsaWNpdCIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyIsImFzc2VydEFyZ3VtZW50TnVtYmVyIiwiYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSIsImFzc2VydEFyZ3VtZW50Qm9vbCIsImFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsIiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiYXNzZXJ0Q29udGV4dCIsImNvbnRleHRMaXN0IiwiZ2V0TG9nVHlwZXMiLCJic0FwaVVybCIsInNlc3Npb25JZCIsIm1ldGhvZCIsImpzb24iLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJib2R5IiwidXNlck5hbWUiLCJhY2Nlc3NLZXkiLCJyZXMiLCJhdXRvbWF0aW9uX3Nlc3Npb24iLCJicm93c2VyX3VybCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7QUFHQSxNQUFNQSxXQUFXLEdBQUcsS0FBcEI7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyw4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WWtJLEtBQVosQ0FBa0IsaURBQWlEOEIsR0FBRyxDQUFDcEMsUUFBSixFQUFuRTtBQUNIOztBQUVEVyxVQUFBQSxPQUFPLENBQUMrRSxJQUFELGFBQUNBLElBQUQsZ0RBQUNBLElBQUksQ0FBRUksa0JBQVAsMERBQUMsc0JBQTBCQyxXQUEzQixDQUFQO0FBQ0gsU0FoQkQ7QUFrQkgsT0FwQkQsQ0FvQkUsT0FBT3pILENBQVAsRUFBVTtBQUNSLGFBQUtsRyxNQUFMLENBQVlrSSxLQUFaLENBQWtCLGlEQUFpRGhDLENBQUMsQ0FBQzBCLFFBQUYsRUFBbkU7QUFDQVcsUUFBQUEsT0FBTztBQUNWO0FBQ0osS0FoQ00sQ0FBUDtBQWlDSDs7QUEzcUJxRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuJ3VzZSBzdHJpY3QnO1xyXG4vKipcclxuICogQG5hbWUgbW9iXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciBtb2JpbGUgYXV0b21hdGlvbi5cclxuICogQHNhbXBsZSAqKkxvY2F0b3JzOioqICBcclxuICogXHJcbiAqIE5hdGl2ZSBhcHBsaWNhdGlvbiBsb2NhdG9ycyBmb3IhW10oLi4vLi4vLmdpdGJvb2svYXNzZXRzL2FuZHJvaWQucG5nKSAgXHJcbiAqICogYC9YUEFUSGAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYW4gWFBhdGggMS4wIGV4cHJlc3Npb24uXHJcbiAqICogYH5BQ0NFU1NJQklMSVRZX0lEYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgQWNjZXNzaWJpbGl0eSBJZC5cclxuICogKiBgaWQ9SURgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBpZC5cclxuICogKiBgY2xhc3M9Q0xBU1NgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBjbGFzcy5cclxuICogKiBgdGV4dD1URVhUYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgdmlzaWJsZSB0ZXh0LlxyXG4gKiAqIGB0ZXh0LWNvbnRhaW5zPVRFWFRgIC0gTG9jYXRlcyBlbGVtZW50IHdob3NlIHZpc2libGUgdGV4dCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN0cmluZy5cclxuICogKiBgZGVzYz1ERVNDUklQVElPTmAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIGRlc2NyaXB0aW9uLlxyXG4gKiAqIGBkZXNjLWNvbnRhaW5zPURFU0NSSVBUSU9OYCAtIExvY2F0ZXMgZWxlbWVudCB3aG9zZSBkZXNjcmlwdGlvbiBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN0cmluZy5cclxuICogKiBgc2Nyb2xsYWJsZWAgLSBMb2NhdGVzIGVsZW1lbnRzIHRoYXQgYXJlIHNjcm9sbGFibGUuICBcclxuICogIFxyXG4gKiBOYXRpdmUgYXBwbGljYXRpb24gbG9jYXRvcnMgZm9yIVtdKC4uLy4uLy5naXRib29rL2Fzc2V0cy9hcHBsZS5wbmcpICBcclxuICogIFxyXG4gKiAqIGAvWFBBVEhgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGFuIFhQYXRoIDEuMCBleHByZXNzaW9uLlxyXG4gKiAqIGBpZD1JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIElELlxyXG4gKiAqIGB+QUNDRVNTSUJJTElUWV9JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIEFjY2Vzc2liaWxpdHkgSWQuICBcclxuICogKiBgLWlvcyBwcmVkaWNhdGUgc3RyaW5nOlBSRURJQ0FURV9TVFJJTkdgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGEgW3ByZWRpY2F0ZSBxdWVyeV0oaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rYXJjaGl2ZS9XZWJEcml2ZXJBZ2VudC93aWtpL1ByZWRpY2F0ZS1RdWVyaWVzLUNvbnN0cnVjdGlvbi1SdWxlcykuICBcclxuICogKiBgLWlvcyBjbGFzcyBjaGFpbjpDTEFTU19DSEFJTmAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYSBbY2xhc3MgY2hhaW4gZXhwcmVzc2lvbl0oaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rYXJjaGl2ZS9XZWJEcml2ZXJBZ2VudC93aWtpL0NsYXNzLUNoYWluLVF1ZXJpZXMtQ29uc3RydWN0aW9uLVJ1bGVzKS4gIFxyXG4gKiAgXHJcbiAqIEh5YnJpZCFbXSguLi8uLi8uZ2l0Ym9vay9hc3NldHMvaHlicmlkLnBuZykgIGFuZCBXZWIhW10oLi4vLi4vLmdpdGJvb2svYXNzZXRzL3dlYi5wbmcpICBhcHBsaWNhdGlvbiBsb2NhdG9ycyBmb3IhW10oLi4vLi4vLmdpdGJvb2svYXNzZXRzL2FuZHJvaWQucG5nKSAgIVtdKC4uLy4uLy5naXRib29rL2Fzc2V0cy9hcHBsZS5wbmcpICBcclxuICogIFxyXG4gKiAqIGAvWFBBVEhgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGFuIFhQYXRoIDEuMCBleHByZXNzaW9uLlxyXG4gKiAqIGBpZD1JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIGlkLlxyXG4gKiAqIGBuYW1lPU5BTUVgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBuYW1lIGF0dHJpYnV0ZS5cclxuICogKiBgdGFnPU5BTUVgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyB0YWcgbmFtZS5cclxuICogKiBgbGluaz1URVhUYCAtIExvY2F0ZXMgYW5jaG9yIGVsZW1lbnQgd2hvc2UgdGV4dCBtYXRjaGVzIHRoZSBnaXZlbiBzdHJpbmcuXHJcbiAqICogYGxpbmstY29udGFpbnM9VEVYVGAgLSBMb2NhdGVzIGFuY2hvciBlbGVtZW50IHdob3NlIHRleHQgY29udGFpbnMgdGhlIGdpdmVuIHN0cmluZy5cclxuICogKiBgY3NzPUNTU19TRUxFQ1RPUmAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYSBDU1Mgc2VsZWN0b3IuXHJcbiAqIFxyXG4gKiAqKlBhdHRlcm4gYXJndW1lbnRzOioqXHJcbiAqIFxyXG4gKiBDb21tYW5kcyB3aGljaCBleHBlY3QgYSBzdHJpbmcgbWF0Y2hpbmcgcGF0dGVybiBpbiB0aGVpciBhcmd1bWVudHMsIHN1cHBvcnQgZm9sbG93aW5nIHBhdHRlcm5zIHVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlOlxyXG4gKiBcclxuICogKiBgcmVnZXg6UEFUVEVSTmAgLSBNYXRjaCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb24uXHJcbiAqICogYFBBVFRFUk5gIC0gVmVyYmF0aW0gbWF0Y2hpbmcuXHJcbiAqIFxyXG4gKi9cclxuaW1wb3J0IFVSTCBmcm9tICd1cmwnO1xyXG5pbXBvcnQgKiBhcyB3ZGlvIGZyb20gJ3dlYmRyaXZlcmlvJztcclxuaW1wb3J0IFdlYkRyaXZlck1vZHVsZSBmcm9tICcuLi9jb3JlL1dlYkRyaXZlck1vZHVsZSc7XHJcbmltcG9ydCBtb2RVdGlscyBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuaW1wb3J0IHBlcmZlY3RvUmVwb3J0aW5nIGZyb20gJ3BlcmZlY3RvLXJlcG9ydGluZyc7XHJcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3JlcXVlc3QnO1xyXG5pbXBvcnQgbWVyZ2VJbWFnZXMgZnJvbSAnLi4vbGliL2ltZy1tZXJnZSc7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuXHJcbmNvbnN0IE1PRFVMRV9OQU1FID0gJ21vYic7XHJcbmNvbnN0IERFRkFVTFRfQVBQSVVNX1VSTCA9ICdodHRwOi8vbG9jYWxob3N0OjQ3MjMvd2QvaHViJztcclxuY29uc3QgREVGQVVMVF9CUk9XU0VSX05BTUUgPSAnZGVmYXVsdCc7XHJcbmNvbnN0IE5PX1NDUkVFTlNIT1RfQ09NTUFORFMgPSBbJ2luaXQnLCAnYXNzZXJ0QWxlcnQnXTtcclxuY29uc3QgQUNUSU9OX0NPTU1BTkRTID0gWydvcGVuJywndGFwJywnY2xpY2snLCdzd2lwZScsJ3N1Ym1pdCcsJ3NldFZhbHVlJ107XHJcbmNvbnN0IERFRkFVTFRfV0FJVF9USU1FT1VUID0gNjAgKiAxMDAwOyAgICAgICAgICAgIC8vIGRlZmF1bHQgNjBzIHdhaXQgdGltZW91dFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9iaWxlTW9kdWxlIGV4dGVuZHMgV2ViRHJpdmVyTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0ge307XHJcbiAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5uZXR3b3JrUmVxdWVzdHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaGVscGVycyA9IHt9O1xyXG4gICAgICAgIHRoaXMuYXBwQ29udGV4dCA9ICdOQVRJVkVfQVBQJztcclxuICAgICAgICB0aGlzLl9sb2FkSGVscGVyRnVuY3Rpb25zKCk7XHJcbiAgICAgICAgLy8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IChzb21lIG1vZHVsZSBjb21tYW5kcyBtaWdodCByZWZlciB0byB0aGlzLk94RXJyb3IgYW5kIHRoaXMuZXJySGVscGVyKVxyXG4gICAgICAgIHRoaXMuT3hFcnJvciA9IE94RXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJIZWxwZXIgPSBlcnJIZWxwZXI7XHJcbiAgICAgICAgLy8gaG9sZHMgZWxlbWVudCBvcGVyYXRpb24gdGltZW91dCB2YWx1ZVxyXG4gICAgICAgIHRoaXMud2FpdEZvclRpbWVvdXQgPSBERUZBVUxUX1dBSVRfVElNRU9VVDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gTU9EVUxFX05BTUU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0RHJpdmVyXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIFdESU8gZHJpdmVyLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBXRElPIGRyaXZlci5cclxuICAgICAqL1xyXG4gICAgZ2V0RHJpdmVyKCkge1xyXG4gICAgICAgIHJldHVybiBzdXBlci5nZXREcml2ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBnZXRDYXBhYmlsaXRpZXNcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgY3VycmVudGx5IGRlZmluZWQgY2FwYWJpbGl0aWVzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldENhcGFiaWxpdGllcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYXBzIHx8IHN1cGVyLmdldENhcGFiaWxpdGllcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGluaXRcclxuICAgICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IEFwcGl1bSBzZXNzaW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBjYXBzIC0gRGVzaXJlZCBjYXBhYmlsaXRpZXMuIElmIG5vdCBzcGVjaWZpZWQgY2FwYWJpbGl0aWVzIHdpbGwgYmUgdGFrZW4gZnJvbSBzdWl0ZSBkZWZpbml0aW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBhcHBpdW1VcmwgLSBSZW1vdGUgQXBwaXVtIHNlcnZlciBVUkwgKGRlZmF1bHQ6IGh0dHA6Ly9sb2NhbGhvc3Q6NDcyMy93ZC9odWIpLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0KGNhcHMsIGFwcGl1bVVybCkge1xyXG4gICAgICAgIC8vIGlmIHJlb3BlblNlc3Npb24gaXMgdHJ1ZSAtIHJlaW5pdGlsaXplIHRoZSBtb2R1bGVcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVvcGVuU2Vzc2lvbiAhPT0gZmFsc2UpIHsgLy8gdHJ1ZSBvciBmYWxzZSBpZiBleHBsaXNpdGx5IHNldC4gdHJ1ZSBvbiBudWxsIG9yIHVuZGVmaW5lZC5cclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdyZW9wZW5TZXNzaW9uIGlzIHRydWUgLSByZWxvYWRpbmcgdGhlIHNlc3Npb24uLi4nKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLnJlbG9hZFNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ21vYi5pbml0IHdhcyBjYWxsZWQgZm9yIGFscmVhZHkgaW5pdGlhbGl6ZWQgbW9kdWxlLiByZW9wZW5TZXNzaW9uIGlzIGZhbHNlIHNvIHRoZSBjYWxsIGlzIGlnbm9yZWQuJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGJlIHJlZmFjdG9yZWRcclxuICAgICAgICBpZiAodGhpcy5jdHguY2FwcyAmJiB0aGlzLmN0eC5jYXBzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgaWYgKGNhcHMpIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLnBsYXRmb3JtTmFtZTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLnBsYXRmb3JtVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLmRldmljZU5hbWU7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgY2Fwcy5icm93c2VyTmFtZTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLmF1dG9tYXRpb25OYW1lO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhcHMudWRpZDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY2Fwcy5hcHApIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXBzLmVuYWJsZUFwcGl1bUJlaGF2aW9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2Fwcy51c2VBcHBpdW1Gb3JXZWIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhcHMuZW5hYmxlQXBwaXVtQmVoYXZpb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHguY2Fwcy51c2VBcHBpdW1Gb3JXZWIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHguY2Fwcy5lbmFibGVBcHBpdW1CZWhhdmlvciA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghYXBwaXVtVXJsKSB7XHJcbiAgICAgICAgICAgIGFwcGl1bVVybCA9IHRoaXMub3B0aW9ucy5hcHBpdW1VcmwgfHwgREVGQVVMVF9BUFBJVU1fVVJMO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbWVyZ2UgY2FwYWJpbGl0aWVzIGZyb20gY29udGV4dCBhbmQgZnJvbSBpbml0IGZ1bmN0aW9uIGFyZ3VtZW50LCBnaXZlIHByZWZlcmVuY2UgdG8gY29udGV4dC1wYXNzZWQgY2FwYWJpbGl0aWVzXHJcbiAgICAgICAgdGhpcy5jYXBzID0ge307XHJcbiAgICAgICAgaWYgKHRoaXMuY3R4LmNhcHMpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzID0geyAuLi50aGlzLmN0eC5jYXBzIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjYXBzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FwcyA9IHsgLi4udGhpcy5jYXBzLCAuLi5jYXBzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBtYWtlIHN1cmUgdG8gY2xlYXIgdGhlIGV4aXN0aW5nIGRldmljZSBsb2dzLCBpZiBjb2xsZWN0RGV2aWNlTG9ncyBvcHRpb24gaXMgdHJ1ZSAod2Ugd2FudCB0byBpbmNsdWRlIGxvZ3Mgb25seSByZWxldmFudCBmb3IgdGhpcyBzZXNzaW9uKVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sbGVjdERldmljZUxvZ3MpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzWydjbGVhckRldmljZUxvZ3NPblN0YXJ0J10gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgYm90aCBicm93c2VyTmFtZSBhbmQgYXBwUGFja2FnZS9hcHAvYnVuZGxlSWQgd2VyZSBzcGVjaWZpZWQgLSBhc3N1bWUgd2Ugd2FudCB0byBydW4gdGhlIGFwcGxpY2F0aW9uIGFuZCByZW1vdmUgYnJvd3Nlck5hbWVcclxuICAgICAgICBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lICYmICh0aGlzLmNhcHMuYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwIHx8IHRoaXMuY2Fwcy5idW5kbGVJZCkpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2Fwcy5icm93c2VyTmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgbm8gYXBwUGFja2FnZS9hcHAvYnVuZGxlSWQgY2FwYWJpbGl0eSBub3IgYnJvd3Nlck5hbWUgYXJlIGRlZmluZWQsIGFzc3VtZSB3ZSB3YW50IHRvIHJ1biB0aGUgdGVzdCBhZ2FpbnN0IGRlZmF1bHQgYnJvd3NlclxyXG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmNhcHMuYnJvd3Nlck5hbWUgJiYgIXRoaXMuY2Fwcy5hcHBQYWNrYWdlICYmICF0aGlzLmNhcHMuYXBwICYmICF0aGlzLmNhcHMuYnVuZGxlSWQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gREVGQVVMVF9CUk9XU0VSX05BTUU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHdlYmRyaXZlciBleHBlY3RzIGxvd2VyIGNhc2UgbmFtZXNcclxuICAgICAgICBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lICYmIHR5cGVvZiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9IHRoaXMuY2Fwcy5icm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBhZGp1c3QgY2FwYWJpbGl0aWVzIHRvIGVuYWJsZSBjb2xsZWN0aW5nIGJyb3dzZXIgYW5kIHBlcmZvcm1hbmNlIHN0YXRzIGluIENocm9tZSBcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwc1snZ29vZzpsb2dnaW5nUHJlZnMnXSA9IHsgICAgIC8vIGZvciBDaHJvbWVEcml2ZXIgPj0gNzVcclxuICAgICAgICAgICAgICAgIGJyb3dzZXI6ICdBTEwnLFxyXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2U6ICdBTEwnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwb3B1bGF0ZSBXRElPIG9wdGlvbnNcclxuICAgICAgICBjb25zdCB1cmwgPSBVUkwucGFyc2UoYXBwaXVtVXJsKTtcclxuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHVybC5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKTtcclxuICAgICAgICBjb25zdCBob3N0ID0gdXJsLmhvc3RuYW1lO1xyXG4gICAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludCh1cmwucG9ydCB8fCAocHJvdG9jb2wgPT09ICdodHRwcycgPyA0NDMgOiA4MCkpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB1cmwucGF0aG5hbWU7XHJcblxyXG4gICAgICAgIC8vIGF1dGggaXMgbmVlZGVkIG1vc3RseSBmb3IgY2xvdWQgcHJvdmlkZXJzIHN1Y2ggYXMgTGFtYmRhVGVzdFxyXG4gICAgICAgIGlmICh1cmwuYXV0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBhdXRoID0gdXJsLmF1dGguc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLndkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAgICAgdXNlcjogYXV0aFswXSxcclxuICAgICAgICAgICAgICAgIGtleTogYXV0aFsxXVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHdkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMud2Rpb09wdHMgfHwge30sXHJcbiAgICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbCxcclxuICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3QsXHJcbiAgICAgICAgICAgIHBvcnQ6IHBvcnQsXHJcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXHJcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogdGhpcy5jYXBzLFxyXG4gICAgICAgICAgICBsb2dMZXZlbDogJ3NpbGVudCcsXHJcbiAgICAgICAgICAgIHJ1bm5lcjogJ3JlcGwnLFxyXG4gICAgICAgICAgICB3YWl0Zm9yVGltZW91dDogNTAwMCwgLy8gaW5jcmVhc2UgdGhlIGRlZmF1bHQgMzAwMFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiAzMTAqMTAwMCxcclxuICAgICAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IDFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgcHJvdmlkZXIgPSBtb2RVdGlscy5kZXRlcm1pbmVQcm92aWRlcih3ZGlvT3B0cyk7XHJcbiAgICAgICAgbGV0IG5hbWUgPSAnbmFtZSc7XHJcblxyXG4gICAgICAgIGlmIChwcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLm1heEluc3RhbmNlcyA9IDE7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnBhdGggPSAnL25leHBlcmllbmNlL3BlcmZlY3RvbW9iaWxlL3dkL2h1Yic7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnBvcnQgPSA4MDtcclxuICAgICAgICAgICAgd2Rpb09wdHMucHJvdG9jb2wgPSAnaHR0cCc7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLm9wZW5EZXZpY2VUaW1lb3V0ID0gMTU7XHJcblxyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLm1hbnVmYWN0dXJlcjtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5tb2RlbDtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZTtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5ob3N0O1xyXG5cclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2UgaWYgKHByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0spIHtcclxuICAgICAgICAgICAgY29uc3QgYnNPcHRpb25zID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddO1xyXG4gICAgICAgICAgICBpZiAoYnNPcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VOYW1lID0gYnNPcHRpb25zLmRldmljZU5hbWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvc05hbWUgPSBic09wdGlvbnMub3M7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRldmljZU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBic09wdGlvbnMucmVhbE1vYmlsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydhcHBpdW06ZGV2aWNlTmFtZSddID0gZGV2aWNlTmFtZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgYXV0b21hdGlvbk5hbWUgQXBwaXVtIGNhcGFiaWxpdHlcclxuICAgICAgICAgICAgICAgIGlmIChvc05hbWUgJiYgb3NOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdhbmRyb2lkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5wbGF0Zm9ybU5hbWUgPSAnQW5kcm9pZCc7XHJcbiAgICAgICAgICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydhcHBpdW06YXV0b21hdGlvbk5hbWUnXSA9ICdVSUF1dG9tYXRvcjInO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvc05hbWUgJiYgb3NOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpb3MnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZSA9ICdpT1MnO1xyXG4gICAgICAgICAgICAgICAgICAgIHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYXBwaXVtOmF1dG9tYXRpb25OYW1lJ10gPSAnWENVSVRlc3QnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIG1lcmdlIHVzZXItcHJvdmlkZWQgQlMgb3B0aW9ucyBpbnRvIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjYXBOYW1lIGluIHdkaW9PcHRzLmNhcGFiaWxpdGllcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXBOYW1lLnN0YXJ0c1dpdGgoJ2JzdGFjazonKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBic0NhcE5hbWUgPSBjYXBOYW1lLnN1YnN0cmluZygnYnN0YWNrOicubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChic0NhcE5hbWUgPT09ICdvcHRpb25zJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Li4uIG5lZWRzIHRvIGJlIHJlbW92ZWQgZXZlbnR1YWxseVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnNDYXBOYW1lID09PSAncmVjb3JkVmlkZW8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBic09wdGlvbnMudmlkZW8gPSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbY2FwTmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzW2NhcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJzT3B0aW9uc1tic0NhcE5hbWVdID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzW2NhcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzW2NhcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ11bJ25hbWUnXSkge1xyXG4gICAgICAgICAgICBuYW1lID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLndkaW9PcHRzID0gd2Rpb09wdHM7XHJcblxyXG4gICAgICAgIC8vIGluaXQgd2ViZHJpdmVyXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIgPSBhd2FpdCB3ZGlvLnJlbW90ZSh3ZGlvT3B0cyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRyaXZlci5wcm92aWRlciA9IHByb3ZpZGVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWxlbml1bUJyb3dzZXJUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5zZWxlbml1bUJyb3dzZXJUaW1lb3V0ID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZW5pdW1UaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5zZWxlbml1bVRpbWVvdXQgPSB0aGlzLm9wdGlvbnMuc2VsZW5pdW1UaW1lb3V0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQgPSBhd2FpdCBuZXcgcGVyZmVjdG9SZXBvcnRpbmcuUGVyZmVjdG8uUGVyZmVjdG9FeGVjdXRpb25Db250ZXh0KHtcclxuICAgICAgICAgICAgICAgICAgICB3ZWJkcml2ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVNjcmlwdDogYXN5bmMgKGNvbW1hbmQsIHBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZHJpdmVyLmV4ZWN1dGUoY29tbWFuZCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRpbmdDbGllbnQgPSBuZXcgcGVyZmVjdG9SZXBvcnRpbmcuUGVyZmVjdG8uUGVyZmVjdG9SZXBvcnRpbmdDbGllbnQocGVyZmVjdG9FeGVjdXRpb25Db250ZXh0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0aW5nQ2xpZW50LnRlc3RTdGFydChuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJySGVscGVyLmdldEFwcGl1bUluaXRFcnJvcihlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYXBwQ29udGV4dCA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldENvbnRleHQoKTtcclxuXHJcbiAgICAgICAgLy8gaWYgd2UgYXJlIHJ1bm5pbmcgb24gQW5kcm9pZCA3KyBlbXVsYXRvciwgYW5kIHRodXMvb3IgdXNpbmcgYSBXZWJWaWV3IEJyb3dzZXIgVGVzdGVyIC1cclxuICAgICAgICAvLyBwZXJmb3JtIGFuIGFjdHVhbCBhcHBDb250ZXh0IHN3aXRjaCB0byBXRUJcclxuICAgICAgICAvLyBzbyBBcHBpdW0gd2lsbCBkZWxlZ2F0ZSBjb21tYW5kcyB0byBDaHJvbWUgRHJpdmVyIGluc3RlYWQgb2YgQXBwaXVtIERyaXZlclxyXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICAnY2hyb21pdW0td2VidmlldycpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRXZWJWaWV3Q29udGV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0spIHtcclxuICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIC8vIGZhaWxzIG9uIGJyb3dzZXJzdGFja1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoeyAnaW1wbGljaXQnOiB0aGlzLndhaXRGb3JUaW1lb3V0IH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgbW9kVXRpbHMub3ZlcndyaXRlV2Rpb0NvbW1hbmRzKHRoaXMuZHJpdmVyKTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCh0aGlzLmRyaXZlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZGlzcG9zZVxyXG4gICAgICogQHN1bW1hcnkgRW5kcyB0aGUgY3VycmVudCBzZXNzaW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBzdGF0dXMgLSBUZXN0IHN0YXR1cywgZWl0aGVyIGBwYXNzZWRgIG9yIGBmYWlsZWRgLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cykge1xyXG4gICAgICAgIGlmICghc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHN0YXR1cyA9ICdwYXNzZWQnO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucnMuc3RlcHMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnJzLnN0ZXBzKSAmJiB0aGlzLnJzLnN0ZXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZhaWxlZEZpbmRlZCA9IHRoaXMucnMuc3RlcHMuZmluZCgoaXRlbSkgPT4gaXRlbS5zdGF0dXMgPT09ICdmYWlsZWQnKTtcclxuICAgICAgICAgICAgICAgIGlmIChmYWlsZWRGaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnZmFpbGVkJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyICYmIHRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICBzdGF0dXMgPSBzdGF0dXMudG9VcHBlckNhc2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0aW5nQ2xpZW50LnRlc3RTdG9wKHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZlY3RvUmVwb3J0aW5nLkNvbnN0YW50cy5yZXN1bHRzLnBhc3NlZCA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZmVjdG9SZXBvcnRpbmcuQ29uc3RhbnRzLnJlc3VsdHMuZmFpbGVkXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuQlJPV1NFUlNUQUNLKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXRCcm93c2VyU3RhY2tSZXN1bHRTdGF0dXMoc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFbJ0NBTkNFTEVEJywgJ0ZBSUxFRCddLmluY2x1ZGVzKHN0YXR1cykpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGVTZXNzaW9uIHdpbGwgdGFrZSA1IG1pbiB0byBjYWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybignRXJyb3IgZGlzcG9zaW5nIGRyaXZlcjogJyArIGUpOyAgICAvLyBpZ25vcmUgYW55IGVycm9ycyBhdCBkaXNwb3NhbCBzdGFnZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlIHVuaXF1ZS5cclxuICAgICAqIEBmdW5jdGlvbiB0cmFuc2FjdGlvblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBUaGUgdHJhbnNhY3Rpb24gbmFtZS5cclxuICAgICAqIEBmb3IgYW5kcm9pZCwgaW9zLCBoeWJyaWQsIHdlYlxyXG4gICAgICovXHJcbiAgICB0cmFuc2FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgaWYgKCFuYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8ganVzdCBpbiBjYXNlIHVzZXIgcGFzc2VkIGEgY29tcGxleCBvYmplY3QgYnkgbWlzdGFrZVxyXG4gICAgICAgIG5hbWUgPSBuYW1lLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgIC8vIGxpbWl0IHRoZSBuYW1lIGxlbmd0aCAoc2luY2Ugd2UgY2FuJ3Qgc3RvcmUgdmFsdWVzIGxhcmdlciB0aGFuIDUxMkIgaW4gdGhlIGRhdGFiYXNlKVxyXG4gICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIDUxMik7XHJcblxyXG4gICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIFByaXZhdGVcclxuICAgICAqL1xyXG5cclxuICAgIF9pc0FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIEFDVElPTl9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBfdGFrZVNjcmVlbnNob3RTaWxlbnQobmFtZSkge1xyXG4gICAgICAgIGlmICghTk9fU0NSRUVOU0hPVF9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3I7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcml2ZXI/LnRha2VTY3JlZW5zaG90KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldHZhbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYWxsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRVbnRpbFJldFZhbCA9IHRoaXMuZHJpdmVyLndhaXRVbnRpbChhc3luYygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1hZ2VzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdXNoSW1hZ2VUb0ltYWdlcyA9IGFzeW5jKGZldGNoVGl0bGUgPSB0cnVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuZHJpdmVyLnRha2VTY3JlZW5zaG90KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmV0Y2hUaXRsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0VGl0bGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFRvSW1hZ2UgPSByZXF1aXJlKCcuLi9saWIvdGV4dC10by1pbWFnZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGVJbWFnZSA9IGF3YWl0IHRleHRUb0ltYWdlLmdlbmVyYXRlKHRpdGxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlSW1hZ2UgJiYgdHlwZW9mIHRpdGxlSW1hZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUltYWdlID0gdGl0bGVJbWFnZS5yZXBsYWNlKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsJywgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2godGl0bGVJbWFnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goaW1hZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNXZWJWaWV3Q29udGV4dCA9IGF3YWl0IHRoaXMuaXNXZWJWaWV3Q29udGV4dCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNXZWJWaWV3Q29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgKHNjcmVlbnNob3QgYW5kIHRpdGxlKSBpbWFnZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXMgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRXaW5kb3dIYW5kbGVzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaGFuZGxlcykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlIG9mIGhhbmRsZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc3dpdGNoVG9XaW5kb3coaGFuZGxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHVzaEltYWdlVG9JbWFnZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwdXNoSW1hZ2VUb0ltYWdlcyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIGFsbCBpbWFnZXMgaW50byBvbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkSW1hZ2UgPSBhd2FpdCBtZXJnZUltYWdlcyhpbWFnZXMsIHsgZGlyZWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVyZ2VkSW1hZ2UgJiYgdHlwZW9mIG1lcmdlZEltYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gbWVyZ2VkSW1hZ2UucmVwbGFjZSgnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdGltZW91dDogMzAqMTAwMCB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdFVudGlsUmV0VmFsICYmIHdhaXRVbnRpbFJldFZhbC50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFVudGlsUmV0VmFsLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QnLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzY3JlZW5zaG90JywgZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzY3JlZW5zaG90IGlubmVyIGVycm9yJywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gX2dldExvZ3MobmFtZSkge1xyXG4gICAgLy8gICAgIGlmICghTk9fTE9HU19DT01NQU5EUy5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2dzKCk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIF9hZGp1c3RBcHBpdW1Mb2cobG9nLCBzcmMpIHtcclxuICAgICAgICBpZiAoIWxvZyB8fCB0eXBlb2YgbG9nICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETzogY29udmVydCBsb2cudGltZXN0YW1wIGZyb20gdGhlIGRldmljZSB0aW1lIHpvbmUgdG8gdGhlIGxvY2FsIG9uZSAoc28gd2UgY2FuIGxhdGVyIGNvcnJlbGF0ZSBiZXR3ZWVuIHN0ZXBzIGFuZCBsb2dzKSAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdGltZTogbG9nLnRpbWVzdGFtcCxcclxuICAgICAgICAgICAgbXNnOiBsb2cubWVzc2FnZSxcclxuICAgICAgICAgICAgbGV2ZWw6IGxvZy5sZXZlbCxcclxuICAgICAgICAgICAgc3JjOiBzcmNcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIF9pdGVyYXRpb25TdGFydCgpIHtcclxuICAgICAgICAvLyBjbGVhciB0cmFuc2FjdGlvbiBuYW1lIHNhdmVkIGluIHByZXZpb3VzIGl0ZXJhdGlvbiBpZiBhbnlcclxuICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9pdGVyYXRpb25FbmQoZXJyb3IpIHtcclxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFQUElVTV9TRVNTSU9OX1RJTUVPVVQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZW5pdW1TZXNzaW9uVGltZW91dCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZ25vcmUgdGhlIHJlc3QgaWYgbW9iIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWRcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbGxlY3QgYWxsIHRoZSBkZXZpY2UgbG9ncyBmb3IgdGhpcyBzZXNzaW9uXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsZWN0RGV2aWNlTG9ncykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9ncyA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlTG9ncygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ3MgJiYgQXJyYXkuaXNBcnJheShsb2dzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGxvZyBvZiBsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnMubG9ncy5wdXNoKHRoaXMuX2FkanVzdEFwcGl1bUxvZyhsb2csICdkZXZpY2UnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IHJldHJpZXZlIGRldmljZSBsb2dzLicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjb2xsZWN0IGFsbCB0aGUgYnJvd3NlciBsb2dzIGZvciB0aGlzIHNlc3Npb25cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbGxlY3RCcm93c2VyTG9ncykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9ncyA9IGF3YWl0IHRoaXMuZ2V0QnJvd3NlckxvZ3MoKTtcclxuICAgICAgICAgICAgICAgIGlmIChsb2dzICYmIEFycmF5LmlzQXJyYXkobG9ncykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBsb2cgb2YgbG9ncykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJzLmxvZ3MucHVzaCh0aGlzLl9hZGp1c3RBcHBpdW1Mb2cobG9nLCAnYnJvd3NlcicpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgcmV0cmlldmUgYnJvd3NlciBsb2dzLicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjb2xsZWN0IGFsbCBBcHBpdW0gbG9ncyBmb3IgdGhpcyBzZXNzaW9uXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsZWN0QXBwaXVtTG9ncykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9ncyA9IHRoaXMuZ2V0QXBwaXVtTG9ncygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ3MgJiYgQXJyYXkuaXNBcnJheShsb2dzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGxvZ0VudHJ5IG9mIGxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ycy5sb2dzLnB1c2godGhpcy5fYWRqdXN0QXBwaXVtTG9nKGxvZ0VudHJ5LCAnYXBwaXVtJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBBcHBpdW0gbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0spIHtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdFVybCA9IGF3YWl0IHRoaXMuX2dldEJyb3dzZXJTdGFja1Jlc3VsdFVybCgpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0VXJsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBGSVhNRTogdGhpcyBzaG91bGQgYmUgd3JpdHRlbiB0byBjb250ZXh0LnJlc3VsdERhdGEgaW5zdGVhZFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ycy5hdHRyaWJ1dGVzWydCcm93c2VyU3RhY2tVcmwnXSA9IHJlc3VsdFVybDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfZ2V0V2Rpb0xvY2F0b3IobG9jYXRvcikge1xyXG4gICAgICAgIGlmICghbG9jYXRvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ0ludmFsaWQgYXJndW1lbnQgLSBsb2NhdG9yIG5vdCBzcGVjaWZpZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhdG9yICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxvY2F0b3IuaW5kZXhPZignLycpID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdG9yOyAvLyBsZWF2ZSB4cGF0aCBsb2NhdG9yIGFzIGlzXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtID0gdGhpcy5jYXBzICYmIHRoaXMuY2Fwcy5wbGF0Zm9ybU5hbWUgPyB0aGlzLmNhcHMucGxhdGZvcm1OYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hcHBDb250ZXh0ID09PSAnTkFUSVZFX0FQUCcgJiYgcGxhdGZvcm0gPT09ICdhbmRyb2lkJykge1xyXG4gICAgICAgICAgICBpZiAobG9jYXRvci5pbmRleE9mKCdpZD0nKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gcHJlcGVuZCBwYWNrYWdlIG5hbWUgaWYgaXQncyBub3Qgc3BlY2lmaWVkXHJcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBnZXRDdXJyZW50UGFja2FnZSgpIHNlZW1zIHRvIGNyYXNoIHBvc3NpYmx5IGR1ZSB0byBhIHdkaW8gYnVnLiBcclxuICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIHdlIGdldCBwYWNrYWdlIG5hbWUgZnJvbSBjYXBzIGluc3RlYWQuXHJcbiAgICAgICAgICAgICAgICBsb2NhdG9yID0gbG9jYXRvci5zdWJzdHIoJ2lkPScubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGlmIChsb2NhdG9yLmluZGV4T2YoJzppZC8nKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2NhdG9yID0gdGhpcy5jYXBzLmFwcFBhY2thZ2UgKyAnOmlkLycgKyBsb2NhdG9yO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkPW5ldyBVaVNlbGVjdG9yKCkucmVzb3VyY2VJZChcIicgKyBsb2NhdG9yICsgJ1wiKSc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdjbGFzcz0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnYW5kcm9pZD1uZXcgVWlTZWxlY3RvcigpLmNsYXNzTmFtZShcIicgKyBsb2NhdG9yLnN1YnN0cignY2xhc3M9Jy5sZW5ndGgpICsgJ1wiKSc7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZigndGV4dD0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnYW5kcm9pZD1uZXcgVWlTZWxlY3RvcigpLnRleHQoXCInICsgbG9jYXRvci5zdWJzdHIoJ3RleHQ9Jy5sZW5ndGgpICsgJ1wiKSc7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZigndGV4dC1jb250YWlucz0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnYW5kcm9pZD1uZXcgVWlTZWxlY3RvcigpLnRleHRDb250YWlucyhcIicgKyBsb2NhdG9yLnN1YnN0cigndGV4dC1jb250YWlucz0nLmxlbmd0aCkgKyAnXCIpJztcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdkZXNjPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkPW5ldyBVaVNlbGVjdG9yKCkuZGVzY3JpcHRpb24oXCInICsgbG9jYXRvci5zdWJzdHIoJ2Rlc2M9Jy5sZW5ndGgpICsgJ1wiKSc7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignZGVzYy1jb250YWlucz0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnYW5kcm9pZD1uZXcgVWlTZWxlY3RvcigpLmRlc2NyaXB0aW9uQ29udGFpbnMoXCInICsgbG9jYXRvci5zdWJzdHIoJ2Rlc2MtY29udGFpbnM9Jy5sZW5ndGgpICsgJ1wiKSc7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignc2Nyb2xsYWJsZScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkPW5ldyBVaVNlbGVjdG9yKCkuc2Nyb2xsYWJsZSh0cnVlKSc7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignficpID09PSAwKSAgICAvLyBhY2Nlc3NpYmlsaXR5IGlkXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRvcjtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXBwQ29udGV4dCA9PT0gJ05BVElWRV9BUFAnICYmIHBsYXRmb3JtID09PSAnaW9zJykge1xyXG4gICAgICAgICAgICBpZiAobG9jYXRvci5pbmRleE9mKCd+JykgPT09IDApIC8vIGFjY2Vzc2liaWxpdHkgaWRcclxuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdG9yO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hcHBDb250ZXh0ICE9PSAnTkFUSVZFX0FQUCcpIHsgICAgICAgICAgICAvLyBIeWJyaWQgb3IgV2ViIGFwcGxpY2F0aW9uXHJcbiAgICAgICAgICAgIGlmIChsb2NhdG9yLmluZGV4T2YoJ2lkPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcjJyArIGxvY2F0b3Iuc3Vic3RyKCdpZD0nLmxlbmd0aCk7ICAgICAgLy8gY29udmVydCAnaWQ9JyB0byAnIydcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCduYW1lPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdbbmFtZT0nICsgbG9jYXRvci5zdWJzdHIoJ25hbWU9Jy5sZW5ndGgpICsgJ10nO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2xpbms9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJz0nICsgbG9jYXRvci5zdWJzdHIoJ2xpbms9Jy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2xpbmstY29udGFpbnM9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJyo9JyArIGxvY2F0b3Iuc3Vic3RyKCdsaW5rPScubGVuZ3RoKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdjc3M9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRvci5zdWJzdHIoJ2Nzcz0nLmxlbmd0aCk7ICAgICAgICAgICAvLyBpbiBjYXNlIG9mIGNzcywganVzdCByZW1vdmUgY3NzPSBwcmVmaXhcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkSGVscGVyRnVuY3Rpb25zKCkge1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRXZGlvTG9jYXRvciA9IHRoaXMuX2dldFdkaW9Mb2NhdG9yO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5tYXRjaFBhdHRlcm4gPSBtb2RVdGlscy5tYXRjaFBhdHRlcm47XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldEVsZW1lbnQgPSBtb2RVdGlscy5nZXRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRFbGVtZW50cyA9IG1vZFV0aWxzLmdldEVsZW1lbnRzO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRDaGlsZEVsZW1lbnQgPSBtb2RVdGlscy5nZXRDaGlsZEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldENoaWxkRWxlbWVudHMgPSBtb2RVdGlscy5nZXRDaGlsZEVsZW1lbnRzO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5zZXRUaW1lb3V0SW1wbGljaXQgPSBtb2RVdGlscy5zZXRUaW1lb3V0SW1wbGljaXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQgPSBtb2RVdGlscy5yZXN0b3JlVGltZW91dEltcGxpY2l0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZztcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnROdW1iZXIgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE51bWJlcjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmU7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Qm9vbCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Qm9vbDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWwgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0ID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRDb250ZXh0ID0gbW9kVXRpbHMuYXNzZXJ0Q29udGV4dDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuY29udGV4dExpc3QgPSBtb2RVdGlscy5jb250ZXh0TGlzdDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0TG9nVHlwZXMgPSBtb2RVdGlscy5nZXRMb2dUeXBlcztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGVTZXNzaW9uKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlciAmJiB0aGlzLmRyaXZlci5kZWxldGVTZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdkZWxldGVTZXNzaW9uIGVycm9yJywgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zZXRCcm93c2VyU3RhY2tSZXN1bHRTdGF0dXMoc3RhdHVzKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgLy8gZGlmZmVyZW50IEFQSXMgYXJlIHVzZWQgZGVwZW5kaW5nIG9uIHRlc3QgdHlwZS5cclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cuYnJvd3NlcnN0YWNrLmNvbS9kb2NzL2F1dG9tYXRlL2FwaS1yZWZlcmVuY2Uvc2VsZW5pdW0vc2Vzc2lvbiNzZXQtdGVzdC1zdGF0dXNcclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cuYnJvd3NlcnN0YWNrLmNvbS9kb2NzL2FwcC1hdXRvbWF0ZS9hcGktcmVmZXJlbmNlL2FwcGl1bS9zZXNzaW9ucyN1cGRhdGUtc2Vzc2lvbi1zdGF0dXNcclxuICAgICAgICAgICAgY29uc3QgYnNBcGlVcmwgPSB0aGlzLndkaW9PcHRzLmNhcGFiaWxpdGllc1snYXBwaXVtOmFwcCddID9cclxuICAgICAgICAgICAgICBgaHR0cHM6Ly9hcGktY2xvdWQuYnJvd3NlcnN0YWNrLmNvbS9hcHAtYXV0b21hdGUvc2Vzc2lvbnMvJHt0aGlzLmRyaXZlci5zZXNzaW9uSWR9Lmpzb25gIDpcclxuICAgICAgICAgICAgICBgaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9hdXRvbWF0ZS9zZXNzaW9ucy8ke3RoaXMuZHJpdmVyLnNlc3Npb25JZH0uanNvbmA7XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0IHRlc3Qgc3RhdHVzXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICB1cmw6IGJzQXBpVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICAgICAgICAgICAgICAgICAganNvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgPT09ICdQQVNTRUQnID8gJ3Bhc3NlZCcgOiAnZmFpbGVkJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGgnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyJzogdGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ10udXNlck5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdwYXNzJzogdGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ10uYWNjZXNzS2V5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2VuZEltbWVkaWF0ZWx5JzogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCAoZXJyLCByZXMsIGJvZHkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBzZXR0aW5nIEJyb3dzZXJTdGFjayB0ZXN0IHJlc3VsdCBzdGF0dXM6ICcgKyBlcnIudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3Igc2V0dGluZyBCcm93c2VyU3RhY2sgdGVzdCByZXN1bHQgc3RhdHVzOiAnICsgZS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9nZXRCcm93c2VyU3RhY2tSZXN1bHRVcmwoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgLy8gZGlmZmVyZW50IEFQSXMgYXJlIHVzZWQgZGVwZW5kaW5nIG9uIHRlc3QgdHlwZS5cclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cuYnJvd3NlcnN0YWNrLmNvbS9kb2NzL2F1dG9tYXRlL2FwaS1yZWZlcmVuY2Uvc2VsZW5pdW0vc2Vzc2lvbiNzZXQtdGVzdC1zdGF0dXNcclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cuYnJvd3NlcnN0YWNrLmNvbS9kb2NzL2FwcC1hdXRvbWF0ZS9hcGktcmVmZXJlbmNlL2FwcGl1bS9zZXNzaW9ucyN1cGRhdGUtc2Vzc2lvbi1zdGF0dXNcclxuICAgICAgICAgICAgY29uc3QgYnNBcGlVcmwgPSB0aGlzLndkaW9PcHRzLmNhcGFiaWxpdGllc1snYXBwaXVtOmFwcCddID9cclxuICAgICAgICAgICAgICBgaHR0cHM6Ly9hcGktY2xvdWQuYnJvd3NlcnN0YWNrLmNvbS9hcHAtYXV0b21hdGUvc2Vzc2lvbnMvJHt0aGlzLmRyaXZlci5zZXNzaW9uSWR9Lmpzb25gIDpcclxuICAgICAgICAgICAgICBgaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9hdXRvbWF0ZS9zZXNzaW9ucy8ke3RoaXMuZHJpdmVyLnNlc3Npb25JZH0uanNvbmA7XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgLy8gcmV0cmVpdmUgQlMgdGVzdCByZXN1bHQgdXJsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICB1cmw6IGJzQXBpVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgICAgICAgICAgICAganNvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICdhdXRoJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAndXNlcic6IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddLnVzZXJOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFzcyc6IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddLmFjY2Vzc0tleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbmRJbW1lZGlhdGVseSc6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgKGVyciwgcmVzLCBib2R5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgZ2V0dGluZyBCcm93c2VyU3RhY2sgdGVzdCByZXN1bHQgdXJsOiAnICsgZXJyLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShib2R5Py5hdXRvbWF0aW9uX3Nlc3Npb24/LmJyb3dzZXJfdXJsKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGdldHRpbmcgQnJvd3NlclN0YWNrIHRlc3QgcmVzdWx0IHVybDogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
643
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImRlZmF1bHQiLCJyZXF1aXJlIiwiX3VybCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJ3ZGlvIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfV2ViRHJpdmVyTW9kdWxlIiwiX3V0aWxzIiwiX2hlbHBlciIsIl9PeHlnZW5FcnJvciIsIl9wZXJmZWN0b1JlcG9ydGluZyIsIl9yZXF1ZXN0IiwiX2ltZ01lcmdlIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiTU9EVUxFX05BTUUiLCJERUZBVUxUX0FQUElVTV9VUkwiLCJERUZBVUxUX0JST1dTRVJfTkFNRSIsIk5PX1NDUkVFTlNIT1RfQ09NTUFORFMiLCJBQ1RJT05fQ09NTUFORFMiLCJERUZBVUxUX1dBSVRfVElNRU9VVCIsIk1vYmlsZU1vZHVsZSIsIldlYkRyaXZlck1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsInRyYW5zYWN0aW9ucyIsImxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lIiwibmV0d29ya1JlcXVlc3RzIiwiaGVscGVycyIsImFwcENvbnRleHQiLCJfbG9hZEhlbHBlckZ1bmN0aW9ucyIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJ3YWl0Rm9yVGltZW91dCIsIm5hbWUiLCJnZXREcml2ZXIiLCJnZXRDYXBhYmlsaXRpZXMiLCJjYXBzIiwiaW5pdCIsImFwcGl1bVVybCIsImlzSW5pdGlhbGl6ZWQiLCJyZW9wZW5TZXNzaW9uIiwiZGVidWciLCJkcml2ZXIiLCJyZWxvYWRTZXNzaW9uIiwiX2lzSW5pdGlhbGl6ZWQiLCJjdHgiLCJwbGF0Zm9ybU5hbWUiLCJwbGF0Zm9ybVZlcnNpb24iLCJkZXZpY2VOYW1lIiwiYnJvd3Nlck5hbWUiLCJhdXRvbWF0aW9uTmFtZSIsInVkaWQiLCJhcHAiLCJlbmFibGVBcHBpdW1CZWhhdmlvciIsInVzZUFwcGl1bUZvcldlYiIsImNvbGxlY3REZXZpY2VMb2dzIiwiYXBwUGFja2FnZSIsImJ1bmRsZUlkIiwidG9Mb3dlckNhc2UiLCJyZWNvcmRIQVIiLCJicm93c2VyIiwicGVyZm9ybWFuY2UiLCJ1cmwiLCJVUkwiLCJwYXJzZSIsInByb3RvY29sIiwicmVwbGFjZSIsImhvc3QiLCJob3N0bmFtZSIsInBvcnQiLCJwYXJzZUludCIsInBhdGgiLCJwYXRobmFtZSIsImF1dGgiLCJzcGxpdCIsIndkaW9PcHRzIiwidXNlciIsImtleSIsImNhcGFiaWxpdGllcyIsImxvZ0xldmVsIiwicnVubmVyIiwid2FpdGZvclRpbWVvdXQiLCJjb25uZWN0aW9uUmV0cnlUaW1lb3V0IiwiY29ubmVjdGlvblJldHJ5Q291bnQiLCJwcm92aWRlciIsIm1vZFV0aWxzIiwiZGV0ZXJtaW5lUHJvdmlkZXIiLCJlbnJpY2hQcm92aWRlcldkaW9PcHRpb25zIiwicmVtb3RlIiwic2VsZW5pdW1Ccm93c2VyVGltZW91dCIsInNlbGVuaXVtVGltZW91dCIsIlBFUkZFQ1RPIiwicGVyZmVjdG9FeGVjdXRpb25Db250ZXh0IiwicGVyZmVjdG9SZXBvcnRpbmciLCJQZXJmZWN0byIsIlBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCIsIndlYmRyaXZlciIsImV4ZWN1dGVTY3JpcHQiLCJjb21tYW5kIiwicGFyYW1zIiwiZXhlY3V0ZSIsInJlcG9ydGluZ0NsaWVudCIsIlBlcmZlY3RvUmVwb3J0aW5nQ2xpZW50IiwidGVzdFN0YXJ0IiwiZ2V0QXBwaXVtSW5pdEVycm9yIiwiZ2V0Q29udGV4dCIsInNldFdlYlZpZXdDb250ZXh0IiwiQlJPV1NFUlNUQUNLIiwic2V0VGltZW91dCIsIm92ZXJ3cml0ZVdkaW9Db21tYW5kcyIsImRpc3Bvc2UiLCJzdGF0dXMiLCJzdGVwcyIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsImZhaWxlZEZpbmRlZCIsImZpbmQiLCJpdGVtIiwidG9VcHBlckNhc2UiLCJ0ZXN0U3RvcCIsIkNvbnN0YW50cyIsInJlc3VsdHMiLCJwYXNzZWQiLCJmYWlsZWQiLCJfc2V0QnJvd3NlclN0YWNrUmVzdWx0U3RhdHVzIiwiZGVsZXRlU2Vzc2lvbiIsImluY2x1ZGVzIiwic2VsZW5pdW1TZXNzaW9uVGltZW91dCIsIndhcm4iLCJ0cmFuc2FjdGlvbiIsInRvU3RyaW5nIiwic2xpY2UiLCJnbG9iYWwiLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsIl9pc0FjdGlvbiIsIl90YWtlU2NyZWVuc2hvdFNpbGVudCIsImVycm9yIiwiX3RoaXMkZHJpdmVyIiwidGFrZVNjcmVlbnNob3QiLCJyZXR2YWwiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIndhaXRVbnRpbFJldFZhbCIsIndhaXRVbnRpbCIsImltYWdlcyIsInB1c2hJbWFnZVRvSW1hZ2VzIiwiZmV0Y2hUaXRsZSIsImltYWdlIiwidGl0bGUiLCJnZXRUaXRsZSIsInRleHRUb0ltYWdlIiwidGl0bGVJbWFnZSIsImdlbmVyYXRlIiwicHVzaCIsImlzV2ViVmlld0NvbnRleHQiLCJoYW5kbGVzIiwiZ2V0V2luZG93SGFuZGxlcyIsImhhbmRsZSIsInN3aXRjaFRvV2luZG93IiwibWVyZ2VkSW1hZ2UiLCJtZXJnZUltYWdlcyIsImRpcmVjdGlvbiIsInRpbWVvdXQiLCJ0aGVuIiwiY2F0Y2giLCJlcnIiLCJfYWRqdXN0QXBwaXVtTG9nIiwibG9nIiwic3JjIiwidGltZSIsInRpbWVzdGFtcCIsIm1zZyIsIm1lc3NhZ2UiLCJsZXZlbCIsIl9pdGVyYXRpb25TdGFydCIsIl9pdGVyYXRpb25FbmQiLCJ0eXBlIiwiZXJyb3JIZWxwZXIiLCJlcnJvckNvZGUiLCJBUFBJVU1fU0VTU0lPTl9USU1FT1VUIiwibG9ncyIsImdldERldmljZUxvZ3MiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJnZXRCcm93c2VyTG9ncyIsImNvbGxlY3RBcHBpdW1Mb2dzIiwiZ2V0QXBwaXVtTG9ncyIsImxvZ0VudHJ5IiwicmVzdWx0VXJsIiwiX2dldEJyb3dzZXJTdGFja1Jlc3VsdFVybCIsImF0dHJpYnV0ZXMiLCJfZ2V0V2Rpb0xvY2F0b3IiLCJsb2NhdG9yIiwiU0NSSVBUX0VSUk9SIiwiaW5kZXhPZiIsInBsYXRmb3JtIiwic3Vic3RyIiwiZ2V0V2Rpb0xvY2F0b3IiLCJtYXRjaFBhdHRlcm4iLCJnZXRFbGVtZW50IiwiZ2V0RWxlbWVudHMiLCJnZXRDaGlsZEVsZW1lbnQiLCJnZXRDaGlsZEVsZW1lbnRzIiwic2V0VGltZW91dEltcGxpY2l0IiwicmVzdG9yZVRpbWVvdXRJbXBsaWNpdCIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyIsImFzc2VydEFyZ3VtZW50TnVtYmVyIiwiYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSIsImFzc2VydEFyZ3VtZW50Qm9vbCIsImFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsIiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiYXNzZXJ0Q29udGV4dCIsImNvbnRleHRMaXN0IiwiZ2V0TG9nVHlwZXMiLCJic0FwaVVybCIsInNlc3Npb25JZCIsInJlcXVlc3QiLCJtZXRob2QiLCJqc29uIiwicmVqZWN0VW5hdXRob3JpemVkIiwiYm9keSIsInVzZXJOYW1lIiwiYWNjZXNzS2V5IiwicmVzIiwiX2JvZHkkYXV0b21hdGlvbl9zZXNzIiwiYXV0b21hdGlvbl9zZXNzaW9uIiwiYnJvd3Nlcl91cmwiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvb3hfbW9kdWxlcy9tb2R1bGUtbW9iLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuJ3VzZSBzdHJpY3QnO1xyXG4vKipcclxuICogQG5hbWUgbW9iXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciBtb2JpbGUgYXV0b21hdGlvbi5cclxuICogQHNhbXBsZSAqKkxvY2F0b3JzOioqICBcclxuICogXHJcbiAqIE5hdGl2ZSBhcHBsaWNhdGlvbiBsb2NhdG9ycyBmb3IhW10oLi4vLi4vLmdpdGJvb2svYXNzZXRzL2FuZHJvaWQucG5nKSAgXHJcbiAqICogYC9YUEFUSGAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYW4gWFBhdGggMS4wIGV4cHJlc3Npb24uXHJcbiAqICogYH5BQ0NFU1NJQklMSVRZX0lEYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgQWNjZXNzaWJpbGl0eSBJZC5cclxuICogKiBgaWQ9SURgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBpZC5cclxuICogKiBgY2xhc3M9Q0xBU1NgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBjbGFzcy5cclxuICogKiBgdGV4dD1URVhUYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgdmlzaWJsZSB0ZXh0LlxyXG4gKiAqIGB0ZXh0LWNvbnRhaW5zPVRFWFRgIC0gTG9jYXRlcyBlbGVtZW50IHdob3NlIHZpc2libGUgdGV4dCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN0cmluZy5cclxuICogKiBgZGVzYz1ERVNDUklQVElPTmAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIGRlc2NyaXB0aW9uLlxyXG4gKiAqIGBkZXNjLWNvbnRhaW5zPURFU0NSSVBUSU9OYCAtIExvY2F0ZXMgZWxlbWVudCB3aG9zZSBkZXNjcmlwdGlvbiBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN0cmluZy5cclxuICogKiBgc2Nyb2xsYWJsZWAgLSBMb2NhdGVzIGVsZW1lbnRzIHRoYXQgYXJlIHNjcm9sbGFibGUuICBcclxuICogIFxyXG4gKiBOYXRpdmUgYXBwbGljYXRpb24gbG9jYXRvcnMgZm9yIVtdKC4uLy4uLy5naXRib29rL2Fzc2V0cy9hcHBsZS5wbmcpICBcclxuICogIFxyXG4gKiAqIGAvWFBBVEhgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGFuIFhQYXRoIDEuMCBleHByZXNzaW9uLlxyXG4gKiAqIGBpZD1JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIElELlxyXG4gKiAqIGB+QUNDRVNTSUJJTElUWV9JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIEFjY2Vzc2liaWxpdHkgSWQuICBcclxuICogKiBgLWlvcyBwcmVkaWNhdGUgc3RyaW5nOlBSRURJQ0FURV9TVFJJTkdgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGEgW3ByZWRpY2F0ZSBxdWVyeV0oaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rYXJjaGl2ZS9XZWJEcml2ZXJBZ2VudC93aWtpL1ByZWRpY2F0ZS1RdWVyaWVzLUNvbnN0cnVjdGlvbi1SdWxlcykuICBcclxuICogKiBgLWlvcyBjbGFzcyBjaGFpbjpDTEFTU19DSEFJTmAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYSBbY2xhc3MgY2hhaW4gZXhwcmVzc2lvbl0oaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rYXJjaGl2ZS9XZWJEcml2ZXJBZ2VudC93aWtpL0NsYXNzLUNoYWluLVF1ZXJpZXMtQ29uc3RydWN0aW9uLVJ1bGVzKS4gIFxyXG4gKiAgXHJcbiAqIEh5YnJpZCFbXSguLi8uLi8uZ2l0Ym9vay9hc3NldHMvaHlicmlkLnBuZykgIGFuZCBXZWIhW10oLi4vLi4vLmdpdGJvb2svYXNzZXRzL3dlYi5wbmcpICBhcHBsaWNhdGlvbiBsb2NhdG9ycyBmb3IhW10oLi4vLi4vLmdpdGJvb2svYXNzZXRzL2FuZHJvaWQucG5nKSAgIVtdKC4uLy4uLy5naXRib29rL2Fzc2V0cy9hcHBsZS5wbmcpICBcclxuICogIFxyXG4gKiAqIGAvWFBBVEhgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGFuIFhQYXRoIDEuMCBleHByZXNzaW9uLlxyXG4gKiAqIGBpZD1JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIGlkLlxyXG4gKiAqIGBuYW1lPU5BTUVgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBuYW1lIGF0dHJpYnV0ZS5cclxuICogKiBgdGFnPU5BTUVgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyB0YWcgbmFtZS5cclxuICogKiBgbGluaz1URVhUYCAtIExvY2F0ZXMgYW5jaG9yIGVsZW1lbnQgd2hvc2UgdGV4dCBtYXRjaGVzIHRoZSBnaXZlbiBzdHJpbmcuXHJcbiAqICogYGxpbmstY29udGFpbnM9VEVYVGAgLSBMb2NhdGVzIGFuY2hvciBlbGVtZW50IHdob3NlIHRleHQgY29udGFpbnMgdGhlIGdpdmVuIHN0cmluZy5cclxuICogKiBgY3NzPUNTU19TRUxFQ1RPUmAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYSBDU1Mgc2VsZWN0b3IuXHJcbiAqIFxyXG4gKiAqKlBhdHRlcm4gYXJndW1lbnRzOioqXHJcbiAqIFxyXG4gKiBDb21tYW5kcyB3aGljaCBleHBlY3QgYSBzdHJpbmcgbWF0Y2hpbmcgcGF0dGVybiBpbiB0aGVpciBhcmd1bWVudHMsIHN1cHBvcnQgZm9sbG93aW5nIHBhdHRlcm5zIHVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlOlxyXG4gKiBcclxuICogKiBgcmVnZXg6UEFUVEVSTmAgLSBNYXRjaCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb24uXHJcbiAqICogYFBBVFRFUk5gIC0gVmVyYmF0aW0gbWF0Y2hpbmcuXHJcbiAqIFxyXG4gKi9cclxuaW1wb3J0IFVSTCBmcm9tICd1cmwnO1xyXG5pbXBvcnQgKiBhcyB3ZGlvIGZyb20gJ3dlYmRyaXZlcmlvJztcclxuaW1wb3J0IFdlYkRyaXZlck1vZHVsZSBmcm9tICcuLi9jb3JlL1dlYkRyaXZlck1vZHVsZSc7XHJcbmltcG9ydCBtb2RVdGlscyBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuaW1wb3J0IHBlcmZlY3RvUmVwb3J0aW5nIGZyb20gJ3BlcmZlY3RvLXJlcG9ydGluZyc7XHJcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3JlcXVlc3QnO1xyXG5pbXBvcnQgbWVyZ2VJbWFnZXMgZnJvbSAnLi4vbGliL2ltZy1tZXJnZSc7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuXHJcbmNvbnN0IE1PRFVMRV9OQU1FID0gJ21vYic7XHJcbmNvbnN0IERFRkFVTFRfQVBQSVVNX1VSTCA9ICdodHRwOi8vbG9jYWxob3N0OjQ3MjMvd2QvaHViJztcclxuY29uc3QgREVGQVVMVF9CUk9XU0VSX05BTUUgPSAnZGVmYXVsdCc7XHJcbmNvbnN0IE5PX1NDUkVFTlNIT1RfQ09NTUFORFMgPSBbJ2luaXQnLCAnYXNzZXJ0QWxlcnQnXTtcclxuY29uc3QgQUNUSU9OX0NPTU1BTkRTID0gWydvcGVuJywndGFwJywnY2xpY2snLCdzd2lwZScsJ3N1Ym1pdCcsJ3NldFZhbHVlJ107XHJcbmNvbnN0IERFRkFVTFRfV0FJVF9USU1FT1VUID0gNjAgKiAxMDAwOyAgICAgICAgICAgIC8vIGRlZmF1bHQgNjBzIHdhaXQgdGltZW91dFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9iaWxlTW9kdWxlIGV4dGVuZHMgV2ViRHJpdmVyTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0ge307XHJcbiAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5uZXR3b3JrUmVxdWVzdHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaGVscGVycyA9IHt9O1xyXG4gICAgICAgIHRoaXMuYXBwQ29udGV4dCA9ICdOQVRJVkVfQVBQJztcclxuICAgICAgICB0aGlzLl9sb2FkSGVscGVyRnVuY3Rpb25zKCk7XHJcbiAgICAgICAgLy8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IChzb21lIG1vZHVsZSBjb21tYW5kcyBtaWdodCByZWZlciB0byB0aGlzLk94RXJyb3IgYW5kIHRoaXMuZXJySGVscGVyKVxyXG4gICAgICAgIHRoaXMuT3hFcnJvciA9IE94RXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJIZWxwZXIgPSBlcnJIZWxwZXI7XHJcbiAgICAgICAgLy8gaG9sZHMgZWxlbWVudCBvcGVyYXRpb24gdGltZW91dCB2YWx1ZVxyXG4gICAgICAgIHRoaXMud2FpdEZvclRpbWVvdXQgPSBERUZBVUxUX1dBSVRfVElNRU9VVDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gTU9EVUxFX05BTUU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0RHJpdmVyXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIFdESU8gZHJpdmVyLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBXRElPIGRyaXZlci5cclxuICAgICAqL1xyXG4gICAgZ2V0RHJpdmVyKCkge1xyXG4gICAgICAgIHJldHVybiBzdXBlci5nZXREcml2ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBnZXRDYXBhYmlsaXRpZXNcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgY3VycmVudGx5IGRlZmluZWQgY2FwYWJpbGl0aWVzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldENhcGFiaWxpdGllcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYXBzIHx8IHN1cGVyLmdldENhcGFiaWxpdGllcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGluaXRcclxuICAgICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IEFwcGl1bSBzZXNzaW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBjYXBzIC0gRGVzaXJlZCBjYXBhYmlsaXRpZXMuIElmIG5vdCBzcGVjaWZpZWQgY2FwYWJpbGl0aWVzIHdpbGwgYmUgdGFrZW4gZnJvbSBzdWl0ZSBkZWZpbml0aW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBhcHBpdW1VcmwgLSBSZW1vdGUgQXBwaXVtIHNlcnZlciBVUkwgKGRlZmF1bHQ6IGh0dHA6Ly9sb2NhbGhvc3Q6NDcyMy93ZC9odWIpLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0KGNhcHMsIGFwcGl1bVVybCkge1xyXG4gICAgICAgIC8vIGlmIHJlb3BlblNlc3Npb24gaXMgdHJ1ZSAtIHJlaW5pdGlsaXplIHRoZSBtb2R1bGVcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVvcGVuU2Vzc2lvbiAhPT0gZmFsc2UpIHsgLy8gdHJ1ZSBvciBmYWxzZSBpZiBleHBsaXNpdGx5IHNldC4gdHJ1ZSBvbiBudWxsIG9yIHVuZGVmaW5lZC5cclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdyZW9wZW5TZXNzaW9uIGlzIHRydWUgLSByZWxvYWRpbmcgdGhlIHNlc3Npb24uLi4nKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLnJlbG9hZFNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ21vYi5pbml0IHdhcyBjYWxsZWQgZm9yIGFscmVhZHkgaW5pdGlhbGl6ZWQgbW9kdWxlLiByZW9wZW5TZXNzaW9uIGlzIGZhbHNlIHNvIHRoZSBjYWxsIGlzIGlnbm9yZWQuJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGJlIHJlZmFjdG9yZWRcclxuICAgICAgICBpZiAodGhpcy5jdHguY2FwcyAmJiB0aGlzLmN0eC5jYXBzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgaWYgKGNhcHMpIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLnBsYXRmb3JtTmFtZTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLnBsYXRmb3JtVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLmRldmljZU5hbWU7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgY2Fwcy5icm93c2VyTmFtZTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLmF1dG9tYXRpb25OYW1lO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhcHMudWRpZDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY2Fwcy5hcHApIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXBzLmVuYWJsZUFwcGl1bUJlaGF2aW9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2Fwcy51c2VBcHBpdW1Gb3JXZWIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhcHMuZW5hYmxlQXBwaXVtQmVoYXZpb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHguY2Fwcy51c2VBcHBpdW1Gb3JXZWIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHguY2Fwcy5lbmFibGVBcHBpdW1CZWhhdmlvciA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghYXBwaXVtVXJsKSB7XHJcbiAgICAgICAgICAgIGFwcGl1bVVybCA9IHRoaXMub3B0aW9ucy5hcHBpdW1VcmwgfHwgREVGQVVMVF9BUFBJVU1fVVJMO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbWVyZ2UgY2FwYWJpbGl0aWVzIGZyb20gY29udGV4dCBhbmQgZnJvbSBpbml0IGZ1bmN0aW9uIGFyZ3VtZW50LCBnaXZlIHByZWZlcmVuY2UgdG8gY29udGV4dC1wYXNzZWQgY2FwYWJpbGl0aWVzXHJcbiAgICAgICAgdGhpcy5jYXBzID0ge307XHJcbiAgICAgICAgaWYgKHRoaXMuY3R4LmNhcHMpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzID0geyAuLi50aGlzLmN0eC5jYXBzIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjYXBzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FwcyA9IHsgLi4udGhpcy5jYXBzLCAuLi5jYXBzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBtYWtlIHN1cmUgdG8gY2xlYXIgdGhlIGV4aXN0aW5nIGRldmljZSBsb2dzLCBpZiBjb2xsZWN0RGV2aWNlTG9ncyBvcHRpb24gaXMgdHJ1ZSAod2Ugd2FudCB0byBpbmNsdWRlIGxvZ3Mgb25seSByZWxldmFudCBmb3IgdGhpcyBzZXNzaW9uKVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sbGVjdERldmljZUxvZ3MpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzWydjbGVhckRldmljZUxvZ3NPblN0YXJ0J10gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgYm90aCBicm93c2VyTmFtZSBhbmQgYXBwUGFja2FnZS9hcHAvYnVuZGxlSWQgd2VyZSBzcGVjaWZpZWQgLSBhc3N1bWUgd2Ugd2FudCB0byBydW4gdGhlIGFwcGxpY2F0aW9uIGFuZCByZW1vdmUgYnJvd3Nlck5hbWVcclxuICAgICAgICBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lICYmICh0aGlzLmNhcHMuYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwIHx8IHRoaXMuY2Fwcy5idW5kbGVJZCkpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2Fwcy5icm93c2VyTmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgbm8gYXBwUGFja2FnZS9hcHAvYnVuZGxlSWQgY2FwYWJpbGl0eSBub3IgYnJvd3Nlck5hbWUgYXJlIGRlZmluZWQsIGFzc3VtZSB3ZSB3YW50IHRvIHJ1biB0aGUgdGVzdCBhZ2FpbnN0IGRlZmF1bHQgYnJvd3NlclxyXG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmNhcHMuYnJvd3Nlck5hbWUgJiYgIXRoaXMuY2Fwcy5hcHBQYWNrYWdlICYmICF0aGlzLmNhcHMuYXBwICYmICF0aGlzLmNhcHMuYnVuZGxlSWQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gREVGQVVMVF9CUk9XU0VSX05BTUU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHdlYmRyaXZlciBleHBlY3RzIGxvd2VyIGNhc2UgbmFtZXNcclxuICAgICAgICBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lICYmIHR5cGVvZiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9IHRoaXMuY2Fwcy5icm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBhZGp1c3QgY2FwYWJpbGl0aWVzIHRvIGVuYWJsZSBjb2xsZWN0aW5nIGJyb3dzZXIgYW5kIHBlcmZvcm1hbmNlIHN0YXRzIGluIENocm9tZSBcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwc1snZ29vZzpsb2dnaW5nUHJlZnMnXSA9IHsgICAgIC8vIGZvciBDaHJvbWVEcml2ZXIgPj0gNzVcclxuICAgICAgICAgICAgICAgIGJyb3dzZXI6ICdBTEwnLFxyXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2U6ICdBTEwnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwb3B1bGF0ZSBXRElPIG9wdGlvbnNcclxuICAgICAgICBjb25zdCB1cmwgPSBVUkwucGFyc2UoYXBwaXVtVXJsKTtcclxuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHVybC5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKTtcclxuICAgICAgICBjb25zdCBob3N0ID0gdXJsLmhvc3RuYW1lO1xyXG4gICAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludCh1cmwucG9ydCB8fCAocHJvdG9jb2wgPT09ICdodHRwcycgPyA0NDMgOiA4MCkpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB1cmwucGF0aG5hbWU7XHJcblxyXG4gICAgICAgIC8vIGF1dGggaXMgbmVlZGVkIG1vc3RseSBmb3IgY2xvdWQgcHJvdmlkZXJzIHN1Y2ggYXMgTGFtYmRhVGVzdFxyXG4gICAgICAgIGlmICh1cmwuYXV0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBhdXRoID0gdXJsLmF1dGguc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLndkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAgICAgdXNlcjogYXV0aFswXSxcclxuICAgICAgICAgICAgICAgIGtleTogYXV0aFsxXVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHdkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMud2Rpb09wdHMgfHwge30sXHJcbiAgICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbCxcclxuICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3QsXHJcbiAgICAgICAgICAgIHBvcnQ6IHBvcnQsXHJcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXHJcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogdGhpcy5jYXBzLFxyXG4gICAgICAgICAgICBsb2dMZXZlbDogJ3NpbGVudCcsXHJcbiAgICAgICAgICAgIHJ1bm5lcjogJ3JlcGwnLFxyXG4gICAgICAgICAgICB3YWl0Zm9yVGltZW91dDogNTAwMCwgLy8gaW5jcmVhc2UgdGhlIGRlZmF1bHQgMzAwMFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiAzMTAqMTAwMCxcclxuICAgICAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IDFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgcHJvdmlkZXIgPSBtb2RVdGlscy5kZXRlcm1pbmVQcm92aWRlcih3ZGlvT3B0cyk7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IG1vZFV0aWxzLmVucmljaFByb3ZpZGVyV2Rpb09wdGlvbnMocHJvdmlkZXIsIHdkaW9PcHRzKTtcclxuXHJcbiAgICAgICAgdGhpcy53ZGlvT3B0cyA9IHdkaW9PcHRzO1xyXG5cclxuICAgICAgICAvLyBpbml0IHdlYmRyaXZlclxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyID0gYXdhaXQgd2Rpby5yZW1vdGUod2Rpb09wdHMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIucHJvdmlkZXIgPSBwcm92aWRlcjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZW5pdW1Ccm93c2VyVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuc2VsZW5pdW1Ccm93c2VyVGltZW91dCA9IHRoaXMub3B0aW9ucy5zZWxlbml1bUJyb3dzZXJUaW1lb3V0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVuaXVtVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuc2VsZW5pdW1UaW1lb3V0ID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtVGltZW91dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5QRVJGRUNUTykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGVyZmVjdG9FeGVjdXRpb25Db250ZXh0ID0gYXdhaXQgbmV3IHBlcmZlY3RvUmVwb3J0aW5nLlBlcmZlY3RvLlBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCh7XHJcbiAgICAgICAgICAgICAgICAgICAgd2ViZHJpdmVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTY3JpcHQ6IGFzeW5jIChjb21tYW5kLCBwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRyaXZlci5leGVjdXRlKGNvbW1hbmQsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0aW5nQ2xpZW50ID0gbmV3IHBlcmZlY3RvUmVwb3J0aW5nLlBlcmZlY3RvLlBlcmZlY3RvUmVwb3J0aW5nQ2xpZW50KHBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlcG9ydGluZ0NsaWVudC50ZXN0U3RhcnQobmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGVyckhlbHBlci5nZXRBcHBpdW1Jbml0RXJyb3IoZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFwcENvbnRleHQgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRDb250ZXh0KCk7XHJcblxyXG4gICAgICAgIC8vIGlmIHdlIGFyZSBydW5uaW5nIG9uIEFuZHJvaWQgNysgZW11bGF0b3IsIGFuZCB0aHVzL29yIHVzaW5nIGEgV2ViVmlldyBCcm93c2VyIFRlc3RlciAtXHJcbiAgICAgICAgLy8gcGVyZm9ybSBhbiBhY3R1YWwgYXBwQ29udGV4dCBzd2l0Y2ggdG8gV0VCXHJcbiAgICAgICAgLy8gc28gQXBwaXVtIHdpbGwgZGVsZWdhdGUgY29tbWFuZHMgdG8gQ2hyb21lIERyaXZlciBpbnN0ZWFkIG9mIEFwcGl1bSBEcml2ZXJcclxuICAgICAgICBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lID09PSAgJ2Nocm9taXVtLXdlYnZpZXcnKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0V2ViVmlld0NvbnRleHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuQlJPV1NFUlNUQUNLKSB7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAvLyBmYWlscyBvbiBicm93c2Vyc3RhY2tcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KHsgJ2ltcGxpY2l0JzogdGhpcy53YWl0Rm9yVGltZW91dCB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IG1vZFV0aWxzLm92ZXJ3cml0ZVdkaW9Db21tYW5kcyh0aGlzLmRyaXZlcik7XHJcblxyXG4gICAgICAgIHN1cGVyLmluaXQodGhpcy5kcml2ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGRpc3Bvc2VcclxuICAgICAqIEBzdW1tYXJ5IEVuZHMgdGhlIGN1cnJlbnQgc2Vzc2lvbi5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gc3RhdHVzIC0gVGVzdCBzdGF0dXMsIGVpdGhlciBgcGFzc2VkYCBvciBgZmFpbGVkYC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZGlzcG9zZShzdGF0dXMpIHtcclxuICAgICAgICBpZiAoIXN0YXR1cykge1xyXG4gICAgICAgICAgICBzdGF0dXMgPSAncGFzc2VkJztcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJzLnN0ZXBzICYmIEFycmF5LmlzQXJyYXkodGhpcy5ycy5zdGVwcykgJiYgdGhpcy5ycy5zdGVwcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmYWlsZWRGaW5kZWQgPSB0aGlzLnJzLnN0ZXBzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uc3RhdHVzID09PSAnZmFpbGVkJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmFpbGVkRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ2ZhaWxlZCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRyaXZlciAmJiB0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgc3RhdHVzID0gc3RhdHVzLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlcG9ydGluZ0NsaWVudC50ZXN0U3RvcCh7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgPT09ICdQQVNTRUQnID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZWN0b1JlcG9ydGluZy5Db25zdGFudHMucmVzdWx0cy5wYXNzZWQgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZlY3RvUmVwb3J0aW5nLkNvbnN0YW50cy5yZXN1bHRzLmZhaWxlZFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLkJST1dTRVJTVEFDSykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2V0QnJvd3NlclN0YWNrUmVzdWx0U3RhdHVzKHN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmICghWydDQU5DRUxFRCcsICdGQUlMRUQnXS5pbmNsdWRlcyhzdGF0dXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZW5pdW1TZXNzaW9uVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlU2Vzc2lvbiB3aWxsIHRha2UgNSBtaW4gdG8gY2FsbFxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0Vycm9yIGRpc3Bvc2luZyBkcml2ZXI6ICcgKyBlKTsgICAgLy8gaWdub3JlIGFueSBlcnJvcnMgYXQgZGlzcG9zYWwgc3RhZ2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmRyaXZlciA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgPSBudWxsO1xyXG4gICAgICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IE9wZW5zIG5ldyB0cmFuc2FjdGlvbi5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBUaGUgdHJhbnNhY3Rpb24gd2lsbCBwZXJzaXN0IHRpbGwgYSBuZXcgb25lIGlzIG9wZW5lZC4gVHJhbnNhY3Rpb24gbmFtZXMgbXVzdCBiZSB1bmlxdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gdHJhbnNhY3Rpb25cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIHRyYW5zYWN0aW9uIG5hbWUuXHJcbiAgICAgKiBAZm9yIGFuZHJvaWQsIGlvcywgaHlicmlkLCB3ZWJcclxuICAgICAqL1xyXG4gICAgdHJhbnNhY3Rpb24obmFtZSkge1xyXG4gICAgICAgIGlmICghbmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGp1c3QgaW4gY2FzZSB1c2VyIHBhc3NlZCBhIGNvbXBsZXggb2JqZWN0IGJ5IG1pc3Rha2VcclxuICAgICAgICBuYW1lID0gbmFtZS50b1N0cmluZygpO1xyXG5cclxuICAgICAgICAvLyBsaW1pdCB0aGUgbmFtZSBsZW5ndGggKHNpbmNlIHdlIGNhbid0IHN0b3JlIHZhbHVlcyBsYXJnZXIgdGhhbiA1MTJCIGluIHRoZSBkYXRhYmFzZSlcclxuICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCA1MTIpO1xyXG5cclxuICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgKiBQcml2YXRlXHJcbiAgICAgKi9cclxuXHJcbiAgICBfaXNBY3Rpb24obmFtZSkge1xyXG4gICAgICAgIHJldHVybiBBQ1RJT05fQ09NTUFORFMuaW5jbHVkZXMobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3Rha2VTY3JlZW5zaG90U2lsZW50KG5hbWUpIHtcclxuICAgICAgICBpZiAoIU5PX1NDUkVFTlNIT1RfQ09NTUFORFMuaW5jbHVkZXMobmFtZSkpIHtcclxuICAgICAgICAgICAgbGV0IGVycm9yO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyPy50YWtlU2NyZWVuc2hvdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXR2YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FsbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0VW50aWxSZXRWYWwgPSB0aGlzLmRyaXZlci53YWl0VW50aWwoYXN5bmMoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltYWdlcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHVzaEltYWdlVG9JbWFnZXMgPSBhc3luYyhmZXRjaFRpdGxlID0gdHJ1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCB0aGlzLmRyaXZlci50YWtlU2NyZWVuc2hvdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZldGNoVGl0bGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldFRpdGxlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRUb0ltYWdlID0gcmVxdWlyZSgnLi4vbGliL3RleHQtdG8taW1hZ2UnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlSW1hZ2UgPSBhd2FpdCB0ZXh0VG9JbWFnZS5nZW5lcmF0ZSh0aXRsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aXRsZUltYWdlICYmIHR5cGVvZiB0aXRsZUltYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVJbWFnZSA9IHRpdGxlSW1hZ2UucmVwbGFjZSgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcsICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKHRpdGxlSW1hZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKGltYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzV2ViVmlld0NvbnRleHQgPSBhd2FpdCB0aGlzLmlzV2ViVmlld0NvbnRleHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzV2ViVmlld0NvbnRleHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgYWxsIChzY3JlZW5zaG90IGFuZCB0aXRsZSkgaW1hZ2VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVzID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0V2luZG93SGFuZGxlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGhhbmRsZXMpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZSBvZiBoYW5kbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnN3aXRjaFRvV2luZG93KGhhbmRsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHB1c2hJbWFnZVRvSW1hZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHVzaEltYWdlVG9JbWFnZXMoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhbGwgaW1hZ2VzIGludG8gb25lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZEltYWdlID0gYXdhaXQgbWVyZ2VJbWFnZXMoaW1hZ2VzLCB7IGRpcmVjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lcmdlZEltYWdlICYmIHR5cGVvZiBtZXJnZWRJbWFnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IG1lcmdlZEltYWdlLnJlcGxhY2UoJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJywgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHRpbWVvdXQ6IDMwKjEwMDAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhaXRVbnRpbFJldFZhbCAmJiB3YWl0VW50aWxSZXRWYWwudGhlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRVbnRpbFJldFZhbC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzY3JlZW5zaG90JywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc2NyZWVuc2hvdCcsIGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc2NyZWVuc2hvdCBpbm5lciBlcnJvcicsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIF9nZXRMb2dzKG5hbWUpIHtcclxuICAgIC8vICAgICBpZiAoIU5PX0xPR1NfQ09NTUFORFMuaW5jbHVkZXMobmFtZSkpIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9ncygpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBfYWRqdXN0QXBwaXVtTG9nKGxvZywgc3JjKSB7XHJcbiAgICAgICAgaWYgKCFsb2cgfHwgdHlwZW9mIGxvZyAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRPRE86IGNvbnZlcnQgbG9nLnRpbWVzdGFtcCBmcm9tIHRoZSBkZXZpY2UgdGltZSB6b25lIHRvIHRoZSBsb2NhbCBvbmUgKHNvIHdlIGNhbiBsYXRlciBjb3JyZWxhdGUgYmV0d2VlbiBzdGVwcyBhbmQgbG9ncykgICAgICAgIFxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRpbWU6IGxvZy50aW1lc3RhbXAsXHJcbiAgICAgICAgICAgIG1zZzogbG9nLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgIGxldmVsOiBsb2cubGV2ZWwsXHJcbiAgICAgICAgICAgIHNyYzogc3JjXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBfaXRlcmF0aW9uU3RhcnQoKSB7XHJcbiAgICAgICAgLy8gY2xlYXIgdHJhbnNhY3Rpb24gbmFtZSBzYXZlZCBpbiBwcmV2aW91cyBpdGVyYXRpb24gaWYgYW55XHJcbiAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaXRlcmF0aW9uRW5kKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnR5cGUgPT09IGVycm9ySGVscGVyLmVycm9yQ29kZS5BUFBJVU1fU0VTU0lPTl9USU1FT1VUKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZW5pdW1TZXNzaW9uVGltZW91dCA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVuaXVtU2Vzc2lvblRpbWVvdXQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWdub3JlIHRoZSByZXN0IGlmIG1vYiBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb2xsZWN0IGFsbCB0aGUgZGV2aWNlIGxvZ3MgZm9yIHRoaXMgc2Vzc2lvblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sbGVjdERldmljZUxvZ3MpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCB0aGlzLmdldERldmljZUxvZ3MoKTtcclxuICAgICAgICAgICAgICAgIGlmIChsb2dzICYmIEFycmF5LmlzQXJyYXkobG9ncykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBsb2cgb2YgbG9ncykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJzLmxvZ3MucHVzaCh0aGlzLl9hZGp1c3RBcHBpdW1Mb2cobG9nLCAnZGV2aWNlJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBkZXZpY2UgbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY29sbGVjdCBhbGwgdGhlIGJyb3dzZXIgbG9ncyBmb3IgdGhpcyBzZXNzaW9uXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsZWN0QnJvd3NlckxvZ3MpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCB0aGlzLmdldEJyb3dzZXJMb2dzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobG9ncyAmJiBBcnJheS5pc0FycmF5KGxvZ3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbG9nIG9mIGxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ycy5sb2dzLnB1c2godGhpcy5fYWRqdXN0QXBwaXVtTG9nKGxvZywgJ2Jyb3dzZXInKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IHJldHJpZXZlIGJyb3dzZXIgbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY29sbGVjdCBhbGwgQXBwaXVtIGxvZ3MgZm9yIHRoaXMgc2Vzc2lvblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sbGVjdEFwcGl1bUxvZ3MpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3MgPSB0aGlzLmdldEFwcGl1bUxvZ3MoKTtcclxuICAgICAgICAgICAgICAgIGlmIChsb2dzICYmIEFycmF5LmlzQXJyYXkobG9ncykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsb2dFbnRyeSBvZiBsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnMubG9ncy5wdXNoKHRoaXMuX2FkanVzdEFwcGl1bUxvZyhsb2dFbnRyeSwgJ2FwcGl1bScpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgcmV0cmlldmUgQXBwaXVtIGxvZ3MuJywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuQlJPV1NFUlNUQUNLKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHRVcmwgPSBhd2FpdCB0aGlzLl9nZXRCcm93c2VyU3RhY2tSZXN1bHRVcmwoKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdFVybCkge1xyXG4gICAgICAgICAgICAgICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gY29udGV4dC5yZXN1bHREYXRhIGluc3RlYWRcclxuICAgICAgICAgICAgICAgIHRoaXMucnMuYXR0cmlidXRlc1snQnJvd3NlclN0YWNrVXJsJ10gPSByZXN1bHRVcmw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2dldFdkaW9Mb2NhdG9yKGxvY2F0b3IpIHtcclxuICAgICAgICBpZiAoIWxvY2F0b3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsICdJbnZhbGlkIGFyZ3VtZW50IC0gbG9jYXRvciBub3Qgc3BlY2lmaWVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgbG9jYXRvciAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsb2NhdG9yLmluZGV4T2YoJy8nKSA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvcjsgLy8gbGVhdmUgeHBhdGggbG9jYXRvciBhcyBpc1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwbGF0Zm9ybSA9IHRoaXMuY2FwcyAmJiB0aGlzLmNhcHMucGxhdGZvcm1OYW1lID8gdGhpcy5jYXBzLnBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXBwQ29udGV4dCA9PT0gJ05BVElWRV9BUFAnICYmIHBsYXRmb3JtID09PSAnYW5kcm9pZCcpIHtcclxuICAgICAgICAgICAgaWYgKGxvY2F0b3IuaW5kZXhPZignaWQ9JykgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIHByZXBlbmQgcGFja2FnZSBuYW1lIGlmIGl0J3Mgbm90IHNwZWNpZmllZFxyXG4gICAgICAgICAgICAgICAgLy8gTk9URTogZ2V0Q3VycmVudFBhY2thZ2UoKSBzZWVtcyB0byBjcmFzaCBwb3NzaWJseSBkdWUgdG8gYSB3ZGlvIGJ1Zy4gXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICBzbyB3ZSBnZXQgcGFja2FnZSBuYW1lIGZyb20gY2FwcyBpbnN0ZWFkLlxyXG4gICAgICAgICAgICAgICAgbG9jYXRvciA9IGxvY2F0b3Iuc3Vic3RyKCdpZD0nLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobG9jYXRvci5pbmRleE9mKCc6aWQvJykgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRvciA9IHRoaXMuY2Fwcy5hcHBQYWNrYWdlICsgJzppZC8nICsgbG9jYXRvcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiAnYW5kcm9pZD1uZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWQoXCInICsgbG9jYXRvciArICdcIiknO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignY2xhc3M9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FuZHJvaWQ9bmV3IFVpU2VsZWN0b3IoKS5jbGFzc05hbWUoXCInICsgbG9jYXRvci5zdWJzdHIoJ2NsYXNzPScubGVuZ3RoKSArICdcIiknO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ3RleHQ9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FuZHJvaWQ9bmV3IFVpU2VsZWN0b3IoKS50ZXh0KFwiJyArIGxvY2F0b3Iuc3Vic3RyKCd0ZXh0PScubGVuZ3RoKSArICdcIiknO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ3RleHQtY29udGFpbnM9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FuZHJvaWQ9bmV3IFVpU2VsZWN0b3IoKS50ZXh0Q29udGFpbnMoXCInICsgbG9jYXRvci5zdWJzdHIoJ3RleHQtY29udGFpbnM9Jy5sZW5ndGgpICsgJ1wiKSc7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignZGVzYz0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnYW5kcm9pZD1uZXcgVWlTZWxlY3RvcigpLmRlc2NyaXB0aW9uKFwiJyArIGxvY2F0b3Iuc3Vic3RyKCdkZXNjPScubGVuZ3RoKSArICdcIiknO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2Rlc2MtY29udGFpbnM9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FuZHJvaWQ9bmV3IFVpU2VsZWN0b3IoKS5kZXNjcmlwdGlvbkNvbnRhaW5zKFwiJyArIGxvY2F0b3Iuc3Vic3RyKCdkZXNjLWNvbnRhaW5zPScubGVuZ3RoKSArICdcIiknO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ3Njcm9sbGFibGUnKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnYW5kcm9pZD1uZXcgVWlTZWxlY3RvcigpLnNjcm9sbGFibGUodHJ1ZSknO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ34nKSA9PT0gMCkgICAgLy8gYWNjZXNzaWJpbGl0eSBpZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3I7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFwcENvbnRleHQgPT09ICdOQVRJVkVfQVBQJyAmJiBwbGF0Zm9ybSA9PT0gJ2lvcycpIHtcclxuICAgICAgICAgICAgaWYgKGxvY2F0b3IuaW5kZXhPZignficpID09PSAwKSAvLyBhY2Nlc3NpYmlsaXR5IGlkXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRvcjtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXBwQ29udGV4dCAhPT0gJ05BVElWRV9BUFAnKSB7ICAgICAgICAgICAgLy8gSHlicmlkIG9yIFdlYiBhcHBsaWNhdGlvblxyXG4gICAgICAgICAgICBpZiAobG9jYXRvci5pbmRleE9mKCdpZD0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnIycgKyBsb2NhdG9yLnN1YnN0cignaWQ9Jy5sZW5ndGgpOyAgICAgIC8vIGNvbnZlcnQgJ2lkPScgdG8gJyMnXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignbmFtZT0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnW25hbWU9JyArIGxvY2F0b3Iuc3Vic3RyKCduYW1lPScubGVuZ3RoKSArICddJztcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdsaW5rPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICc9JyArIGxvY2F0b3Iuc3Vic3RyKCdsaW5rPScubGVuZ3RoKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdsaW5rLWNvbnRhaW5zPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcqPScgKyBsb2NhdG9yLnN1YnN0cignbGluaz0nLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignY3NzPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3Iuc3Vic3RyKCdjc3M9Jy5sZW5ndGgpOyAgICAgICAgICAgLy8gaW4gY2FzZSBvZiBjc3MsIGp1c3QgcmVtb3ZlIGNzcz0gcHJlZml4XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbG9jYXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZEhlbHBlckZ1bmN0aW9ucygpIHtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0V2Rpb0xvY2F0b3IgPSB0aGlzLl9nZXRXZGlvTG9jYXRvcjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMubWF0Y2hQYXR0ZXJuID0gbW9kVXRpbHMubWF0Y2hQYXR0ZXJuO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRFbGVtZW50ID0gbW9kVXRpbHMuZ2V0RWxlbWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0RWxlbWVudHMgPSBtb2RVdGlscy5nZXRFbGVtZW50cztcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0Q2hpbGRFbGVtZW50ID0gbW9kVXRpbHMuZ2V0Q2hpbGRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRDaGlsZEVsZW1lbnRzID0gbW9kVXRpbHMuZ2V0Q2hpbGRFbGVtZW50cztcclxuICAgICAgICB0aGlzLmhlbHBlcnMuc2V0VGltZW91dEltcGxpY2l0ID0gbW9kVXRpbHMuc2V0VGltZW91dEltcGxpY2l0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5yZXN0b3JlVGltZW91dEltcGxpY2l0ID0gbW9kVXRpbHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmc7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50TnVtYmVyID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXI7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2wgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudEJvb2w7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWw7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50VGltZW91dDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0Q29udGV4dCA9IG1vZFV0aWxzLmFzc2VydENvbnRleHQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmNvbnRleHRMaXN0ID0gbW9kVXRpbHMuY29udGV4dExpc3Q7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldExvZ1R5cGVzID0gbW9kVXRpbHMuZ2V0TG9nVHlwZXM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGVsZXRlU2Vzc2lvbigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIgJiYgdGhpcy5kcml2ZXIuZGVsZXRlU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZGVsZXRlU2Vzc2lvbiBlcnJvcicsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfc2V0QnJvd3NlclN0YWNrUmVzdWx0U3RhdHVzKHN0YXR1cykge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGRpZmZlcmVudCBBUElzIGFyZSB1c2VkIGRlcGVuZGluZyBvbiB0ZXN0IHR5cGUuXHJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LmJyb3dzZXJzdGFjay5jb20vZG9jcy9hdXRvbWF0ZS9hcGktcmVmZXJlbmNlL3NlbGVuaXVtL3Nlc3Npb24jc2V0LXRlc3Qtc3RhdHVzXHJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LmJyb3dzZXJzdGFjay5jb20vZG9jcy9hcHAtYXV0b21hdGUvYXBpLXJlZmVyZW5jZS9hcHBpdW0vc2Vzc2lvbnMjdXBkYXRlLXNlc3Npb24tc3RhdHVzXHJcbiAgICAgICAgICAgIGNvbnN0IGJzQXBpVXJsID0gdGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2FwcGl1bTphcHAnXSA/XHJcbiAgICAgICAgICAgICAgYGh0dHBzOi8vYXBpLWNsb3VkLmJyb3dzZXJzdGFjay5jb20vYXBwLWF1dG9tYXRlL3Nlc3Npb25zLyR7dGhpcy5kcml2ZXIuc2Vzc2lvbklkfS5qc29uYCA6XHJcbiAgICAgICAgICAgICAgYGh0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20vYXV0b21hdGUvc2Vzc2lvbnMvJHt0aGlzLmRyaXZlci5zZXNzaW9uSWR9Lmpzb25gO1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8vIHNldCB0ZXN0IHN0YXR1c1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBic0FwaVVybCxcclxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgICAgICAgICAgICAgIGpzb246IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzID09PSAnUEFTU0VEJyA/ICdwYXNzZWQnIDogJ2ZhaWxlZCdcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICdhdXRoJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAndXNlcic6IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddLnVzZXJOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFzcyc6IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddLmFjY2Vzc0tleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbmRJbW1lZGlhdGVseSc6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgKGVyciwgcmVzLCBib2R5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3Igc2V0dGluZyBCcm93c2VyU3RhY2sgdGVzdCByZXN1bHQgc3RhdHVzOiAnICsgZXJyLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIHNldHRpbmcgQnJvd3NlclN0YWNrIHRlc3QgcmVzdWx0IHN0YXR1czogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfZ2V0QnJvd3NlclN0YWNrUmVzdWx0VXJsKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGRpZmZlcmVudCBBUElzIGFyZSB1c2VkIGRlcGVuZGluZyBvbiB0ZXN0IHR5cGUuXHJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LmJyb3dzZXJzdGFjay5jb20vZG9jcy9hdXRvbWF0ZS9hcGktcmVmZXJlbmNlL3NlbGVuaXVtL3Nlc3Npb24jc2V0LXRlc3Qtc3RhdHVzXHJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LmJyb3dzZXJzdGFjay5jb20vZG9jcy9hcHAtYXV0b21hdGUvYXBpLXJlZmVyZW5jZS9hcHBpdW0vc2Vzc2lvbnMjdXBkYXRlLXNlc3Npb24tc3RhdHVzXHJcbiAgICAgICAgICAgIGNvbnN0IGJzQXBpVXJsID0gdGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2FwcGl1bTphcHAnXSA/XHJcbiAgICAgICAgICAgICAgYGh0dHBzOi8vYXBpLWNsb3VkLmJyb3dzZXJzdGFjay5jb20vYXBwLWF1dG9tYXRlL3Nlc3Npb25zLyR7dGhpcy5kcml2ZXIuc2Vzc2lvbklkfS5qc29uYCA6XHJcbiAgICAgICAgICAgICAgYGh0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20vYXV0b21hdGUvc2Vzc2lvbnMvJHt0aGlzLmRyaXZlci5zZXNzaW9uSWR9Lmpzb25gO1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8vIHJldHJlaXZlIEJTIHRlc3QgcmVzdWx0IHVybFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBic0FwaVVybCxcclxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICAgICAgICAgIGpzb246IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAnYXV0aCc6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXInOiB0aGlzLndkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXS51c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3MnOiB0aGlzLndkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXS5hY2Nlc3NLZXksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdzZW5kSW1tZWRpYXRlbHknOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIChlcnIsIHJlcywgYm9keSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGdldHRpbmcgQnJvd3NlclN0YWNrIHRlc3QgcmVzdWx0IHVybDogJyArIGVyci50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYm9keT8uYXV0b21hdGlvbl9zZXNzaW9uPy5icm93c2VyX3VybCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBnZXR0aW5nIEJyb3dzZXJTdGFjayB0ZXN0IHJlc3VsdCB1cmw6ICcgKyBlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVk7O0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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
|