oxygen-cli 1.25.0 → 1.26.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 +6 -0
- package/build/core/OxygenCore.js +266 -37
- package/build/core/OxygenEvents.js +11 -1
- package/build/core/OxygenModule.js +14 -1
- package/build/core/OxygenService.js +12 -1
- package/build/core/OxygenSubModule.js +10 -1
- package/build/core/WebDriverModule.js +30 -1
- package/build/core/utils.js +17 -1
- package/build/errors/HookError.js +7 -1
- package/build/errors/ModuleError.js +7 -1
- package/build/errors/ModuleUnavailableError.js +3 -1
- package/build/errors/OxygenError.js +33 -1
- package/build/errors/ScriptNotFound.js +7 -1
- package/build/errors/helper.js +77 -45
- package/build/index.js +18 -6
- package/build/lib/cli-util.js +90 -28
- package/build/lib/cli.js +23 -1
- package/build/lib/debugger.js +144 -1
- package/build/lib/img-merge.js +15 -1
- package/build/lib/launcher.js +28 -1
- package/build/lib/moduleRequire.js +4 -1
- package/build/lib/param-manager.js +28 -1
- package/build/lib/param-reader-csv.js +15 -1
- package/build/lib/param-reader-excel.js +14 -1
- package/build/lib/param-reader-json.js +10 -1
- package/build/lib/util.js +58 -3
- package/build/model/case-result.js +4 -2
- package/build/model/failure.js +2 -1
- package/build/model/status.js +2 -1
- package/build/model/step-result.js +2 -1
- package/build/model/suite-result.js +2 -1
- package/build/model/test-result.js +2 -1
- package/build/model/testcase.js +2 -1
- package/build/model/testsuite.js +2 -1
- package/build/ox_modules/index.js +33 -13
- package/build/ox_modules/module-assert.js +24 -8
- package/build/ox_modules/module-date.js +8 -3
- package/build/ox_modules/module-db.js +28 -7
- package/build/ox_modules/module-email.js +36 -10
- package/build/ox_modules/module-eyes.js +46 -5
- package/build/ox_modules/module-http.js +102 -41
- package/build/ox_modules/module-log.js +22 -5
- package/build/ox_modules/module-mailinator.js +32 -10
- package/build/ox_modules/module-mob/commands/alertAccept.js +2 -1
- package/build/ox_modules/module-mob/commands/alertDismiss.js +2 -1
- package/build/ox_modules/module-mob/commands/assertAlert.js +6 -1
- package/build/ox_modules/module-mob/commands/assertText.js +3 -1
- package/build/ox_modules/module-mob/commands/assertTitle.js +4 -1
- package/build/ox_modules/module-mob/commands/assertValue.js +15 -9
- package/build/ox_modules/module-mob/commands/back.js +2 -1
- package/build/ox_modules/module-mob/commands/clear.js +4 -1
- package/build/ox_modules/module-mob/commands/click.js +4 -3
- package/build/ox_modules/module-mob/commands/clickHidden.js +9 -3
- package/build/ox_modules/module-mob/commands/clickLong.js +2 -1
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +4 -1
- package/build/ox_modules/module-mob/commands/closeApp.js +2 -1
- package/build/ox_modules/module-mob/commands/debug.js +2 -2
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +2 -1
- package/build/ox_modules/module-mob/commands/enableNetwork.js +12 -4
- package/build/ox_modules/module-mob/commands/execute.js +2 -1
- package/build/ox_modules/module-mob/commands/findElement.js +3 -1
- package/build/ox_modules/module-mob/commands/findElements.js +4 -1
- package/build/ox_modules/module-mob/commands/getAlertText.js +2 -1
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +2 -1
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +10 -1
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +2 -1
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +2 -1
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +9 -1
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +2 -1
- package/build/ox_modules/module-mob/commands/getLocation.js +2 -1
- package/build/ox_modules/module-mob/commands/getSource.js +2 -1
- package/build/ox_modules/module-mob/commands/getText.js +4 -1
- package/build/ox_modules/module-mob/commands/getTitle.js +2 -1
- package/build/ox_modules/module-mob/commands/getUrl.js +2 -1
- package/build/ox_modules/module-mob/commands/getValue.js +9 -5
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +2 -1
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +2 -1
- package/build/ox_modules/module-mob/commands/index.js +94 -19
- package/build/ox_modules/module-mob/commands/installApp.js +2 -1
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +2 -1
- package/build/ox_modules/module-mob/commands/isCheckable.js +2 -1
- package/build/ox_modules/module-mob/commands/isChecked.js +2 -1
- package/build/ox_modules/module-mob/commands/isClickable.js +2 -1
- package/build/ox_modules/module-mob/commands/isExist.js +3 -1
- package/build/ox_modules/module-mob/commands/isSelected.js +2 -1
- package/build/ox_modules/module-mob/commands/isVisible.js +3 -1
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +2 -1
- package/build/ox_modules/module-mob/commands/launchApp.js +2 -1
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +2 -1
- package/build/ox_modules/module-mob/commands/open.js +3 -1
- package/build/ox_modules/module-mob/commands/pause.js +2 -1
- package/build/ox_modules/module-mob/commands/removeApp.js +2 -1
- package/build/ox_modules/module-mob/commands/resetApp.js +2 -1
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +6 -1
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +2 -1
- package/build/ox_modules/module-mob/commands/select.js +4 -1
- package/build/ox_modules/module-mob/commands/selectFrame.js +4 -1
- package/build/ox_modules/module-mob/commands/selectWindow.js +26 -5
- package/build/ox_modules/module-mob/commands/sendKeys.js +9 -6
- package/build/ox_modules/module-mob/commands/setContext.js +2 -1
- package/build/ox_modules/module-mob/commands/setNativeContext.js +2 -1
- package/build/ox_modules/module-mob/commands/setTimeout.js +2 -1
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +6 -3
- package/build/ox_modules/module-mob/commands/shake.js +2 -1
- package/build/ox_modules/module-mob/commands/smsClickLink.js +2 -1
- package/build/ox_modules/module-mob/commands/smsGetText.js +6 -3
- package/build/ox_modules/module-mob/commands/swipe.js +2 -1
- package/build/ox_modules/module-mob/commands/swipeElement.js +2 -1
- package/build/ox_modules/module-mob/commands/swipeScreen.js +2 -1
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +2 -1
- package/build/ox_modules/module-mob/commands/tap.js +2 -1
- package/build/ox_modules/module-mob/commands/type.js +7 -3
- package/build/ox_modules/module-mob/commands/unlockPattern.js +10 -9
- package/build/ox_modules/module-mob/commands/waitForExist.js +2 -1
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +3 -1
- package/build/ox_modules/module-mob/commands/waitForVisible.js +2 -1
- package/build/ox_modules/module-mob.js +139 -67
- package/build/ox_modules/module-pdf.js +62 -23
- package/build/ox_modules/module-proxy.js +68 -8
- package/build/ox_modules/module-serial.js +32 -7
- package/build/ox_modules/module-shell.js +27 -8
- package/build/ox_modules/module-soap.js +47 -14
- package/build/ox_modules/module-twilio.js +53 -10
- package/build/ox_modules/module-utils.js +51 -16
- package/build/ox_modules/module-web/commands/alertAccept.js +2 -1
- package/build/ox_modules/module-web/commands/alertDismiss.js +2 -1
- package/build/ox_modules/module-web/commands/assertAlert.js +6 -1
- package/build/ox_modules/module-web/commands/assertExist.js +2 -1
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +4 -1
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +3 -1
- package/build/ox_modules/module-web/commands/assertText.js +3 -1
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +6 -1
- package/build/ox_modules/module-web/commands/assertTextPresent.js +6 -1
- package/build/ox_modules/module-web/commands/assertTitle.js +3 -1
- package/build/ox_modules/module-web/commands/assertValue.js +3 -1
- package/build/ox_modules/module-web/commands/back.js +2 -1
- package/build/ox_modules/module-web/commands/clear.js +5 -1
- package/build/ox_modules/module-web/commands/click.js +13 -4
- package/build/ox_modules/module-web/commands/clickHidden.js +7 -2
- package/build/ox_modules/module-web/commands/closeWindow.js +2 -1
- package/build/ox_modules/module-web/commands/debug.js +2 -2
- package/build/ox_modules/module-web/commands/deleteCookies.js +2 -1
- package/build/ox_modules/module-web/commands/deselect.js +2 -1
- package/build/ox_modules/module-web/commands/doubleClick.js +9 -3
- package/build/ox_modules/module-web/commands/dragAndDrop.js +2 -1
- package/build/ox_modules/module-web/commands/execute.js +2 -1
- package/build/ox_modules/module-web/commands/fileBrowse.js +10 -4
- package/build/ox_modules/module-web/commands/findElement.js +3 -1
- package/build/ox_modules/module-web/commands/findElements.js +4 -1
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +2 -1
- package/build/ox_modules/module-web/commands/getAlertText.js +2 -1
- package/build/ox_modules/module-web/commands/getAttribute.js +4 -1
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +3 -1
- package/build/ox_modules/module-web/commands/getCookies.js +2 -1
- package/build/ox_modules/module-web/commands/getCssValue.js +4 -1
- package/build/ox_modules/module-web/commands/getElementCount.js +2 -1
- package/build/ox_modules/module-web/commands/getHTML.js +2 -1
- package/build/ox_modules/module-web/commands/getSource.js +2 -1
- package/build/ox_modules/module-web/commands/getText.js +4 -1
- package/build/ox_modules/module-web/commands/getTitle.js +2 -1
- package/build/ox_modules/module-web/commands/getUrl.js +2 -1
- package/build/ox_modules/module-web/commands/getValue.js +5 -1
- package/build/ox_modules/module-web/commands/getWindowHandles.js +2 -1
- package/build/ox_modules/module-web/commands/getWindowSize.js +2 -1
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +5 -1
- package/build/ox_modules/module-web/commands/index.js +100 -19
- package/build/ox_modules/module-web/commands/isAlertPresent.js +2 -1
- package/build/ox_modules/module-web/commands/isChecked.js +2 -1
- package/build/ox_modules/module-web/commands/isExist.js +3 -1
- package/build/ox_modules/module-web/commands/isInteractable.js +2 -1
- package/build/ox_modules/module-web/commands/isSelected.js +2 -1
- package/build/ox_modules/module-web/commands/isVisible.js +3 -1
- package/build/ox_modules/module-web/commands/makeVisible.js +10 -2
- package/build/ox_modules/module-web/commands/maximizeWindow.js +2 -1
- package/build/ox_modules/module-web/commands/minimizeWindow.js +2 -1
- package/build/ox_modules/module-web/commands/newWindow.js +2 -1
- package/build/ox_modules/module-web/commands/open.js +4 -1
- package/build/ox_modules/module-web/commands/pause.js +2 -1
- package/build/ox_modules/module-web/commands/point.js +2 -1
- package/build/ox_modules/module-web/commands/pointJS.js +8 -2
- package/build/ox_modules/module-web/commands/refresh.js +2 -1
- package/build/ox_modules/module-web/commands/rightClick.js +8 -3
- package/build/ox_modules/module-web/commands/rightClickActions.js +2 -1
- package/build/ox_modules/module-web/commands/scrollToElement.js +2 -1
- package/build/ox_modules/module-web/commands/select.js +5 -1
- package/build/ox_modules/module-web/commands/selectFrame.js +3 -1
- package/build/ox_modules/module-web/commands/selectWindow.js +26 -5
- package/build/ox_modules/module-web/commands/sendKeys.js +6 -3
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
- package/build/ox_modules/module-web/commands/setTimeout.js +2 -1
- package/build/ox_modules/module-web/commands/setWindowSize.js +2 -1
- package/build/ox_modules/module-web/commands/takeScreenshot.js +5 -3
- package/build/ox_modules/module-web/commands/type.js +5 -1
- package/build/ox_modules/module-web/commands/waitForAngular.js +11 -6
- package/build/ox_modules/module-web/commands/waitForExist.js +2 -1
- package/build/ox_modules/module-web/commands/waitForInteractable.js +2 -1
- package/build/ox_modules/module-web/commands/waitForNotExist.js +8 -1
- package/build/ox_modules/module-web/commands/waitForNotText.js +3 -1
- package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -1
- package/build/ox_modules/module-web/commands/waitForText.js +3 -1
- package/build/ox_modules/module-web/commands/waitForValue.js +3 -1
- package/build/ox_modules/module-web/commands/waitForVisible.js +2 -1
- package/build/ox_modules/module-web/commands/waitForWindow.js +21 -4
- package/build/ox_modules/module-web.js +179 -77
- package/build/ox_modules/module-win/commands/assertText.js +3 -1
- package/build/ox_modules/module-win/commands/assertTitle.js +4 -1
- package/build/ox_modules/module-win/commands/assertValue.js +15 -9
- package/build/ox_modules/module-win/commands/back.js +2 -1
- package/build/ox_modules/module-win/commands/clear.js +4 -1
- package/build/ox_modules/module-win/commands/click.js +2 -1
- package/build/ox_modules/module-win/commands/clickLong.js +2 -1
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +4 -1
- package/build/ox_modules/module-win/commands/findElement.js +3 -1
- package/build/ox_modules/module-win/commands/findElements.js +4 -1
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +2 -1
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +2 -1
- package/build/ox_modules/module-win/commands/getLocation.js +2 -1
- package/build/ox_modules/module-win/commands/getSource.js +2 -1
- package/build/ox_modules/module-win/commands/getText.js +4 -1
- package/build/ox_modules/module-win/commands/getValue.js +9 -5
- package/build/ox_modules/module-win/commands/getWindowHandles.js +2 -1
- package/build/ox_modules/module-win/commands/index.js +43 -5
- package/build/ox_modules/module-win/commands/isCheckable.js +2 -1
- package/build/ox_modules/module-win/commands/isChecked.js +2 -1
- package/build/ox_modules/module-win/commands/isClickable.js +2 -1
- package/build/ox_modules/module-win/commands/isExist.js +3 -1
- package/build/ox_modules/module-win/commands/isSelected.js +2 -1
- package/build/ox_modules/module-win/commands/isVisible.js +3 -1
- package/build/ox_modules/module-win/commands/open.js +2 -1
- package/build/ox_modules/module-win/commands/pause.js +2 -1
- package/build/ox_modules/module-win/commands/rightClick.js +2 -1
- package/build/ox_modules/module-win/commands/selectWindow.js +15 -1
- package/build/ox_modules/module-win/commands/sendKeys.js +4 -1
- package/build/ox_modules/module-win/commands/setTimeout.js +2 -1
- package/build/ox_modules/module-win/commands/takeScreenshot.js +2 -1
- package/build/ox_modules/module-win/commands/tap.js +2 -1
- package/build/ox_modules/module-win/commands/type.js +4 -1
- package/build/ox_modules/module-win/commands/waitForExist.js +2 -1
- package/build/ox_modules/module-win/commands/waitForInteractable.js +4 -1
- package/build/ox_modules/module-win/commands/waitForVisible.js +2 -1
- package/build/ox_modules/module-win.js +87 -48
- package/build/ox_modules/utils.js +76 -22
- package/build/ox_reporters/reporter-excel.js +58 -1
- package/build/ox_reporters/reporter-html.js +28 -1
- package/build/ox_reporters/reporter-json.js +14 -1
- package/build/ox_reporters/reporter-junit.js +24 -1
- package/build/ox_reporters/reporter-pdf.js +19 -1
- package/build/ox_reporters/reporter-xml.js +17 -1
- package/build/ox_services/service-devtools/submodule-network.js +91 -4
- package/build/ox_services/service-devtools.js +23 -1
- package/build/reporter/FileReporterBase.js +44 -5
- package/build/reporter/ReportAggregator.js +65 -1
- package/build/reporter/ReporterBase.js +6 -1
- package/build/runners/WorkerProcess.js +99 -1
- package/build/runners/cucumber/CucumberEventListener.js +29 -4
- package/build/runners/cucumber/CucumberReporter.js +56 -1
- package/build/runners/cucumber/CucumberWorker.js +66 -1
- package/build/runners/cucumber/index.js +30 -1
- package/build/runners/cucumber/worker.js +18 -1
- package/build/runners/index.js +6 -1
- package/build/runners/oxygen/OxygenWorker.js +60 -3
- package/build/runners/oxygen/index.js +178 -17
- package/build/runners/oxygen/worker.js +25 -2
- package/package.json +1 -1
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
require("source-map-support/register");
|
|
4
|
+
|
|
4
5
|
var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
|
|
6
|
+
|
|
5
7
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
8
|
+
|
|
6
9
|
/*
|
|
7
10
|
* Copyright (C) 2019-present CloudBeat Limited
|
|
8
11
|
*
|
|
@@ -16,10 +19,12 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
16
19
|
* @name pdf
|
|
17
20
|
* @description Provides generic methods for working with PDF files.
|
|
18
21
|
*/
|
|
19
|
-
|
|
20
22
|
const errHelper = require('../errors/helper');
|
|
23
|
+
|
|
21
24
|
const path = require('path');
|
|
25
|
+
|
|
22
26
|
var PDFParser = require('pdf2json/pdfparser');
|
|
27
|
+
|
|
23
28
|
function countRows(searchStr, rows, reverse) {
|
|
24
29
|
let result = 0;
|
|
25
30
|
var strRegex = new RegExp(searchStr, 'g');
|
|
@@ -29,13 +34,16 @@ function countRows(searchStr, rows, reverse) {
|
|
|
29
34
|
.some(y => {
|
|
30
35
|
var line = (rows[y] || []).join('').replace(/\s/g, '');
|
|
31
36
|
var count = (line.match(strRegex) || []).length;
|
|
37
|
+
|
|
32
38
|
if (count === 0 && reverseStrRegex) {
|
|
33
39
|
count = (line.match(reverseStrRegex) || []).length;
|
|
34
40
|
}
|
|
41
|
+
|
|
35
42
|
result += count;
|
|
36
43
|
});
|
|
37
44
|
return result;
|
|
38
45
|
}
|
|
46
|
+
|
|
39
47
|
function checkRows(searchStr, rows, reverse) {
|
|
40
48
|
let result = false;
|
|
41
49
|
Object.keys(rows) // => array of y-positions (type: float)
|
|
@@ -43,12 +51,14 @@ function checkRows(searchStr, rows, reverse) {
|
|
|
43
51
|
.some(y => {
|
|
44
52
|
var line = (rows[y] || []).join('').replace(/\s/g, '');
|
|
45
53
|
let inludes;
|
|
54
|
+
|
|
46
55
|
if (reverse) {
|
|
47
56
|
const reverseSearchStr = searchStr.split('').reverse().join('');
|
|
48
57
|
inludes = line.includes(searchStr) || line.includes(reverseSearchStr);
|
|
49
58
|
} else {
|
|
50
59
|
inludes = line.includes(searchStr);
|
|
51
60
|
}
|
|
61
|
+
|
|
52
62
|
if (inludes) {
|
|
53
63
|
result = true;
|
|
54
64
|
return true;
|
|
@@ -56,6 +66,7 @@ function checkRows(searchStr, rows, reverse) {
|
|
|
56
66
|
});
|
|
57
67
|
return result;
|
|
58
68
|
}
|
|
69
|
+
|
|
59
70
|
function assertion(pdfFilePath, text, pageNum = 0, reverse = false) {
|
|
60
71
|
let rows = {}; // indexed by y-position
|
|
61
72
|
|
|
@@ -68,26 +79,29 @@ function assertion(pdfFilePath, text, pageNum = 0, reverse = false) {
|
|
|
68
79
|
});
|
|
69
80
|
pdfParser.on('pdfParser_dataReady', function (pdfData) {
|
|
70
81
|
var totalPages = pdfData.formImage.Pages.length;
|
|
82
|
+
|
|
71
83
|
if (pageNum && totalPages < pageNum - 1) {
|
|
72
84
|
throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, `Invalid argument - 'pageNum' is ${pageNum}, but PDF contains only ${totalPages} pages`);
|
|
73
|
-
}
|
|
85
|
+
} // locate on a specific page
|
|
86
|
+
|
|
74
87
|
|
|
75
|
-
// locate on a specific page
|
|
76
88
|
if (pageNum) {
|
|
77
89
|
processText(rows, pdfData.formImage.Pages[pageNum - 1].Texts);
|
|
78
90
|
let isFound = checkRows(searchStr, rows, reverse);
|
|
79
91
|
resolve(!!isFound);
|
|
80
92
|
return;
|
|
81
|
-
}
|
|
93
|
+
} // locate on any page
|
|
94
|
+
|
|
82
95
|
|
|
83
|
-
// locate on any page
|
|
84
96
|
for (let p in pdfData.formImage.Pages) {
|
|
85
97
|
processText(rows, pdfData.formImage.Pages[p].Texts);
|
|
86
98
|
let isFound = checkRows(searchStr, rows, reverse);
|
|
99
|
+
|
|
87
100
|
if (isFound) {
|
|
88
101
|
resolve(true);
|
|
89
102
|
break;
|
|
90
103
|
}
|
|
104
|
+
|
|
91
105
|
rows = {}; // clear rows for next page
|
|
92
106
|
}
|
|
93
107
|
|
|
@@ -96,16 +110,19 @@ function assertion(pdfFilePath, text, pageNum = 0, reverse = false) {
|
|
|
96
110
|
pdfParser.loadPDF(pdfFilePath, 0);
|
|
97
111
|
});
|
|
98
112
|
}
|
|
113
|
+
|
|
99
114
|
function processText(rows, texts) {
|
|
100
115
|
for (var t in texts) {
|
|
101
116
|
var item = texts[t];
|
|
102
|
-
var text = decodeURIComponent(item.R[0].T);
|
|
103
|
-
|
|
117
|
+
var text = decodeURIComponent(item.R[0].T); // accumulate text items into rows object, per line
|
|
118
|
+
|
|
104
119
|
(rows[item.y] = rows[item.y] || []).push(text);
|
|
105
120
|
}
|
|
106
121
|
}
|
|
122
|
+
|
|
107
123
|
function count(pdfFilePath, text, pageNum = 0, reverse = false) {
|
|
108
124
|
let rows = {}; // indexed by y-position
|
|
125
|
+
|
|
109
126
|
let totalCount = 0;
|
|
110
127
|
return new Promise(function (resolve, reject) {
|
|
111
128
|
const searchStr = text.replace(/\s/g, '');
|
|
@@ -116,25 +133,28 @@ function count(pdfFilePath, text, pageNum = 0, reverse = false) {
|
|
|
116
133
|
});
|
|
117
134
|
pdfParser.on('pdfParser_dataReady', function (pdfData) {
|
|
118
135
|
let totalPages = pdfData.formImage.Pages.length;
|
|
136
|
+
|
|
119
137
|
if (pageNum && totalPages < pageNum - 1) {
|
|
120
138
|
throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, `Invalid argument - 'pageNum' is ${pageNum}, but PDF contains only ${totalPages} pages`);
|
|
121
|
-
}
|
|
139
|
+
} // count on a specific page
|
|
140
|
+
|
|
122
141
|
|
|
123
|
-
// count on a specific page
|
|
124
142
|
if (pageNum) {
|
|
125
143
|
processText(rows, pdfData.formImage.Pages[pageNum - 1].Texts);
|
|
126
144
|
let count = countRows(searchStr, rows, reverse);
|
|
127
145
|
resolve(count);
|
|
128
146
|
return;
|
|
129
|
-
}
|
|
147
|
+
} // count on all pages
|
|
148
|
+
|
|
130
149
|
|
|
131
|
-
// count on all pages
|
|
132
150
|
for (var p in pdfData.formImage.Pages) {
|
|
133
151
|
processText(rows, pdfData.formImage.Pages[p].Texts);
|
|
134
152
|
let count = countRows(searchStr, rows, reverse);
|
|
153
|
+
|
|
135
154
|
if (count > 0) {
|
|
136
155
|
totalCount += count;
|
|
137
156
|
}
|
|
157
|
+
|
|
138
158
|
rows = {}; // clear rows for next page
|
|
139
159
|
}
|
|
140
160
|
|
|
@@ -143,58 +163,63 @@ function count(pdfFilePath, text, pageNum = 0, reverse = false) {
|
|
|
143
163
|
pdfParser.loadPDF(pdfFilePath, 0);
|
|
144
164
|
});
|
|
145
165
|
}
|
|
166
|
+
|
|
146
167
|
function validateString(arg, name) {
|
|
147
|
-
if (arg && typeof arg === 'string' && arg.trim().length > 0) {
|
|
148
|
-
// text is correct
|
|
168
|
+
if (arg && typeof arg === 'string' && arg.trim().length > 0) {// text is correct
|
|
149
169
|
} else {
|
|
150
170
|
throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, "Invalid argument - '" + name + "' should be a non-empty string.");
|
|
151
171
|
}
|
|
152
172
|
}
|
|
173
|
+
|
|
153
174
|
function validatePageNum(arg, name) {
|
|
154
|
-
if (arg === null || arg && typeof arg === 'number' && arg > 0) {
|
|
155
|
-
// pageNum is correct
|
|
175
|
+
if (arg === null || arg && typeof arg === 'number' && arg > 0) {// pageNum is correct
|
|
156
176
|
} else {
|
|
157
177
|
throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, "Invalid argument - '" + name + "' should be a non-negative number.");
|
|
158
178
|
}
|
|
159
179
|
}
|
|
180
|
+
|
|
160
181
|
function validateMessage(arg, name) {
|
|
161
|
-
if (arg === null || arg && typeof arg === 'string' && arg.trim().length > 0) {
|
|
162
|
-
// pageNum is correct
|
|
182
|
+
if (arg === null || arg && typeof arg === 'string' && arg.trim().length > 0) {// pageNum is correct
|
|
163
183
|
} else {
|
|
164
184
|
throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, "Invalid argument - '" + name + "' should be a non-empty string.");
|
|
165
185
|
}
|
|
166
186
|
}
|
|
187
|
+
|
|
167
188
|
function validateReverse(arg, name) {
|
|
168
|
-
if (arg === null || typeof arg !== 'undefined' && typeof arg === 'boolean') {
|
|
169
|
-
// pageNum is correct
|
|
189
|
+
if (arg === null || typeof arg !== 'undefined' && typeof arg === 'boolean') {// pageNum is correct
|
|
170
190
|
} else {
|
|
171
191
|
throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, "Invalid argument - '" + name + "' should be a boolean");
|
|
172
192
|
}
|
|
173
193
|
}
|
|
194
|
+
|
|
174
195
|
function resolvePath(pdfFilePath, options) {
|
|
175
196
|
pdfFilePath = pdfFilePath.trim().split('').map((item, idx) => {
|
|
176
197
|
return ![8206, 8296].includes(pdfFilePath.charCodeAt(idx)) ? item : null;
|
|
177
198
|
}).join('');
|
|
199
|
+
|
|
178
200
|
if (pdfFilePath[0] === '~') {
|
|
179
201
|
// resolve path relative to home directory
|
|
180
202
|
return path.join(process.env.HOME, pdfFilePath.slice(1));
|
|
181
203
|
} else {
|
|
182
204
|
let cwd = process.cwd();
|
|
205
|
+
|
|
183
206
|
if (options && options.cwd) {
|
|
184
207
|
cwd = options.cwd;
|
|
185
208
|
}
|
|
209
|
+
|
|
186
210
|
if (options && options.rootPath) {
|
|
187
211
|
cwd = options.rootPath;
|
|
188
212
|
}
|
|
213
|
+
|
|
189
214
|
cwd = cwd.trim();
|
|
190
215
|
return path.resolve(cwd, pdfFilePath);
|
|
191
216
|
}
|
|
192
217
|
}
|
|
218
|
+
|
|
193
219
|
module.exports = function (options, context, rs, logger, modules, services) {
|
|
194
220
|
module.isInitialized = function () {
|
|
195
221
|
return true;
|
|
196
222
|
};
|
|
197
|
-
|
|
198
223
|
/**
|
|
199
224
|
* @summary Asserts that text is present in a PDF file
|
|
200
225
|
* @function assert
|
|
@@ -204,6 +229,8 @@ module.exports = function (options, context, rs, logger, modules, services) {
|
|
|
204
229
|
* @param {String=} message - Message to throw if assertion fails.
|
|
205
230
|
* @param {Boolean=} reverse - Check also reverse variant of string.
|
|
206
231
|
*/
|
|
232
|
+
|
|
233
|
+
|
|
207
234
|
module.assert = async function (pdfFilePath, text, pageNum = null, message = null, reverse = false) {
|
|
208
235
|
validateString(pdfFilePath, 'pdfFilePath');
|
|
209
236
|
validateString(text, 'text');
|
|
@@ -212,23 +239,26 @@ module.exports = function (options, context, rs, logger, modules, services) {
|
|
|
212
239
|
validateReverse(reverse, 'reverse');
|
|
213
240
|
pdfFilePath = resolvePath(pdfFilePath, options);
|
|
214
241
|
let error;
|
|
242
|
+
|
|
215
243
|
try {
|
|
216
244
|
const ret = await assertion(pdfFilePath, text, pageNum, reverse);
|
|
245
|
+
|
|
217
246
|
if (!ret) {
|
|
218
247
|
if (message) {
|
|
219
248
|
throw new _OxygenError.default(errHelper.errorCode.ASSERT_ERROR, message);
|
|
220
249
|
}
|
|
250
|
+
|
|
221
251
|
let msg = `"${text}" is not found in the PDF ${pageNum ? 'on page ' + pageNum : ''}`;
|
|
222
252
|
throw new _OxygenError.default(errHelper.errorCode.ASSERT_ERROR, msg);
|
|
223
253
|
}
|
|
224
254
|
} catch (e) {
|
|
225
255
|
error = new _OxygenError.default(errHelper.errorCode.ASSERT_ERROR, e.message);
|
|
226
256
|
}
|
|
257
|
+
|
|
227
258
|
if (error) {
|
|
228
259
|
throw error;
|
|
229
260
|
}
|
|
230
261
|
};
|
|
231
|
-
|
|
232
262
|
/**
|
|
233
263
|
* @summary Asserts that text is not present in a PDF file
|
|
234
264
|
* @function assertNot
|
|
@@ -238,6 +268,8 @@ module.exports = function (options, context, rs, logger, modules, services) {
|
|
|
238
268
|
* @param {String=} message - Message to throw if assertion fails.
|
|
239
269
|
* @param {Boolean=} reverse - Check also reverse variant of string.
|
|
240
270
|
*/
|
|
271
|
+
|
|
272
|
+
|
|
241
273
|
module.assertNot = async function (pdfFilePath, text, pageNum = null, message = null, reverse = false) {
|
|
242
274
|
validateString(pdfFilePath, 'pdfFilePath');
|
|
243
275
|
validateString(text, 'text');
|
|
@@ -246,23 +278,26 @@ module.exports = function (options, context, rs, logger, modules, services) {
|
|
|
246
278
|
validateReverse(reverse, 'reverse');
|
|
247
279
|
pdfFilePath = resolvePath(pdfFilePath, options);
|
|
248
280
|
let error;
|
|
281
|
+
|
|
249
282
|
try {
|
|
250
283
|
const ret = await assertion(pdfFilePath, text, pageNum, reverse);
|
|
284
|
+
|
|
251
285
|
if (ret) {
|
|
252
286
|
if (message) {
|
|
253
287
|
throw new _OxygenError.default(errHelper.errorCode.ASSERT_ERROR, message);
|
|
254
288
|
}
|
|
289
|
+
|
|
255
290
|
let msg = `"${text}" is found in the PDF ${pageNum ? 'on page ' + pageNum : ''}`;
|
|
256
291
|
throw new _OxygenError.default(errHelper.errorCode.ASSERT_ERROR, msg);
|
|
257
292
|
}
|
|
258
293
|
} catch (e) {
|
|
259
294
|
throw new _OxygenError.default(errHelper.errorCode.ASSERT_ERROR, e.message);
|
|
260
295
|
}
|
|
296
|
+
|
|
261
297
|
if (error) {
|
|
262
298
|
throw error;
|
|
263
299
|
}
|
|
264
300
|
};
|
|
265
|
-
|
|
266
301
|
/**
|
|
267
302
|
* @summary Count the number of times specified text is present in a PDF file.
|
|
268
303
|
* @function count
|
|
@@ -272,18 +307,22 @@ module.exports = function (options, context, rs, logger, modules, services) {
|
|
|
272
307
|
* @param {Boolean=} reverse - Check also reverse variant of string.
|
|
273
308
|
* @return {Number} Number of times the specified text was found.
|
|
274
309
|
*/
|
|
310
|
+
|
|
311
|
+
|
|
275
312
|
module.count = async function (pdfFilePath, text, pageNum = null, reverse = false) {
|
|
276
313
|
validateString(pdfFilePath, 'pdfFilePath');
|
|
277
314
|
validateString(text, 'text');
|
|
278
315
|
validatePageNum(pageNum, 'pageNum');
|
|
279
316
|
validateReverse(reverse, 'reverse');
|
|
280
317
|
pdfFilePath = resolvePath(pdfFilePath, options);
|
|
318
|
+
|
|
281
319
|
try {
|
|
282
320
|
return await count(pdfFilePath, text, pageNum, reverse);
|
|
283
321
|
} catch (e) {
|
|
284
322
|
throw new _OxygenError.default(errHelper.errorCode.PDF_ERROR, e.message || e);
|
|
285
323
|
}
|
|
286
324
|
};
|
|
325
|
+
|
|
287
326
|
return module;
|
|
288
327
|
};
|
|
289
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlcnJIZWxwZXIiLCJyZXF1aXJlIiwicGF0aCIsIlBERlBhcnNlciIsImNvdW50Um93cyIsInNlYXJjaFN0ciIsInJvd3MiLCJyZXZlcnNlIiwicmVzdWx0Iiwic3RyUmVnZXgiLCJSZWdFeHAiLCJyZXZlcnNlU3RyUmVnZXgiLCJzcGxpdCIsImpvaW4iLCJPYmplY3QiLCJrZXlzIiwic29ydCIsInkxIiwieTIiLCJwYXJzZUZsb2F0Iiwic29tZSIsInkiLCJsaW5lIiwicmVwbGFjZSIsImNvdW50IiwibWF0Y2giLCJsZW5ndGgiLCJjaGVja1Jvd3MiLCJpbmx1ZGVzIiwicmV2ZXJzZVNlYXJjaFN0ciIsImluY2x1ZGVzIiwiYXNzZXJ0aW9uIiwicGRmRmlsZVBhdGgiLCJ0ZXh0IiwicGFnZU51bSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicGRmUGFyc2VyIiwib24iLCJlcnIiLCJlcnJvck1lc3NhZ2UiLCJwYXJzZXJFcnJvciIsIk94RXJyb3IiLCJlcnJvckNvZGUiLCJBU1NFUlRfRVJST1IiLCJwZGZEYXRhIiwidG90YWxQYWdlcyIsImZvcm1JbWFnZSIsIlBhZ2VzIiwiU0NSSVBUX0VSUk9SIiwicHJvY2Vzc1RleHQiLCJUZXh0cyIsImlzRm91bmQiLCJwIiwibG9hZFBERiIsInRleHRzIiwidCIsIml0ZW0iLCJkZWNvZGVVUklDb21wb25lbnQiLCJSIiwiVCIsInB1c2giLCJ0b3RhbENvdW50IiwidmFsaWRhdGVTdHJpbmciLCJhcmciLCJuYW1lIiwidHJpbSIsInZhbGlkYXRlUGFnZU51bSIsInZhbGlkYXRlTWVzc2FnZSIsInZhbGlkYXRlUmV2ZXJzZSIsInJlc29sdmVQYXRoIiwib3B0aW9ucyIsIm1hcCIsImlkeCIsImNoYXJDb2RlQXQiLCJwcm9jZXNzIiwiZW52IiwiSE9NRSIsInNsaWNlIiwiY3dkIiwicm9vdFBhdGgiLCJtb2R1bGUiLCJleHBvcnRzIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwiaXNJbml0aWFsaXplZCIsImFzc2VydCIsIm1lc3NhZ2UiLCJlcnJvciIsInJldCIsIm1zZyIsImUiLCJhc3NlcnROb3QiLCJQREZfRVJST1IiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvb3hfbW9kdWxlcy9tb2R1bGUtcGRmLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lIHBkZlxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgZ2VuZXJpYyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggUERGIGZpbGVzLlxyXG4gKi9cclxuXHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmNvbnN0IGVyckhlbHBlciA9IHJlcXVpcmUoJy4uL2Vycm9ycy9oZWxwZXInKTtcclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcclxudmFyIFBERlBhcnNlciA9IHJlcXVpcmUoJ3BkZjJqc29uL3BkZnBhcnNlcicpO1xyXG5cclxuZnVuY3Rpb24gY291bnRSb3dzKHNlYXJjaFN0ciwgcm93cywgcmV2ZXJzZSkge1xyXG4gICAgbGV0IHJlc3VsdCA9IDA7XHJcbiAgICB2YXIgc3RyUmVnZXggPSBuZXcgUmVnRXhwKHNlYXJjaFN0ciwgJ2cnKTtcclxuICAgIHZhciByZXZlcnNlU3RyUmVnZXggPSByZXZlcnNlID8gbmV3IFJlZ0V4cChzZWFyY2hTdHIuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKSwgJ2cnKSA6IG51bGw7XHJcblxyXG4gICAgT2JqZWN0LmtleXMocm93cykgLy8gPT4gYXJyYXkgb2YgeS1wb3NpdGlvbnMgKHR5cGU6IGZsb2F0KVxyXG4gICAgICAgIC5zb3J0KCh5MSwgeTIpID0+IHBhcnNlRmxvYXQoeTEpIC0gcGFyc2VGbG9hdCh5MikpIC8vIHNvcnQgZmxvYXQgcG9zaXRpb25zXHJcbiAgICAgICAgLnNvbWUoeSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBsaW5lID0gKHJvd3NbeV0gfHwgW10pLmpvaW4oJycpLnJlcGxhY2UoL1xccy9nLCAnJyk7XHJcblxyXG4gICAgICAgICAgICB2YXIgY291bnQgPSAobGluZS5tYXRjaChzdHJSZWdleCkgfHwgW10pLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwICYmIHJldmVyc2VTdHJSZWdleCkge1xyXG4gICAgICAgICAgICAgICAgY291bnQgPSAobGluZS5tYXRjaChyZXZlcnNlU3RyUmVnZXgpIHx8IFtdKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzdWx0ICs9IGNvdW50O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrUm93cyhzZWFyY2hTdHIsIHJvd3MsIHJldmVyc2UpIHtcclxuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcclxuXHJcbiAgICBPYmplY3Qua2V5cyhyb3dzKSAvLyA9PiBhcnJheSBvZiB5LXBvc2l0aW9ucyAodHlwZTogZmxvYXQpXHJcbiAgICAgICAgLnNvcnQoKHkxLCB5MikgPT4gcGFyc2VGbG9hdCh5MSkgLSBwYXJzZUZsb2F0KHkyKSkgLy8gc29ydCBmbG9hdCBwb3NpdGlvbnNcclxuICAgICAgICAuc29tZSh5ID0+IHtcclxuXHJcbiAgICAgICAgICAgIHZhciBsaW5lID0gKHJvd3NbeV0gfHwgW10pLmpvaW4oJycpLnJlcGxhY2UoL1xccy9nLCAnJyk7XHJcblxyXG4gICAgICAgICAgICBsZXQgaW5sdWRlcztcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXZlcnNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXZlcnNlU2VhcmNoU3RyID0gc2VhcmNoU3RyLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyk7XHJcbiAgICAgICAgICAgICAgICBpbmx1ZGVzID0gbGluZS5pbmNsdWRlcyhzZWFyY2hTdHIpIHx8IGxpbmUuaW5jbHVkZXMocmV2ZXJzZVNlYXJjaFN0cik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpbmx1ZGVzID0gbGluZS5pbmNsdWRlcyhzZWFyY2hTdHIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5sdWRlcykge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gYXNzZXJ0aW9uKHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtID0gMCwgcmV2ZXJzZSA9IGZhbHNlKSB7XHJcbiAgICBsZXQgcm93cyA9IHt9OyAvLyBpbmRleGVkIGJ5IHktcG9zaXRpb25cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoU3RyID0gdGV4dC5yZXBsYWNlKC9cXHMvZywgJycpO1xyXG5cclxuICAgICAgICBsZXQgcGRmUGFyc2VyID0gbmV3IFBERlBhcnNlcigpO1xyXG4gICAgICAgIHBkZlBhcnNlci5vbigncGRmUGFyc2VyX2RhdGFFcnJvcicsIGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gZXJyLnBhcnNlckVycm9yID8gZXJyLnBhcnNlckVycm9yIDogJ0Vycm9yIHBhcnNpbmcgdGhlIFBERi4nO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcGRmUGFyc2VyLm9uKCdwZGZQYXJzZXJfZGF0YVJlYWR5JywgZnVuY3Rpb24gKHBkZkRhdGEpIHtcclxuICAgICAgICAgICAgdmFyIHRvdGFsUGFnZXMgPSBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGlmIChwYWdlTnVtICYmIHRvdGFsUGFnZXMgPCBwYWdlTnVtIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIGBJbnZhbGlkIGFyZ3VtZW50IC0gJ3BhZ2VOdW0nIGlzICR7cGFnZU51bX0sIGJ1dCBQREYgY29udGFpbnMgb25seSAke3RvdGFsUGFnZXN9IHBhZ2VzYCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGxvY2F0ZSBvbiBhIHNwZWNpZmljIHBhZ2VcclxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0pIHtcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NUZXh0KHJvd3MsIHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzW3BhZ2VOdW0tMV0uVGV4dHMpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGlzRm91bmQgPSBjaGVja1Jvd3Moc2VhcmNoU3RyLCByb3dzLCByZXZlcnNlKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoISFpc0ZvdW5kKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gbG9jYXRlIG9uIGFueSBwYWdlXHJcbiAgICAgICAgICAgIGZvciAobGV0IHAgaW4gcGRmRGF0YS5mb3JtSW1hZ2UuUGFnZXMpIHtcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NUZXh0KHJvd3MsIHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzW3BdLlRleHRzKTtcclxuICAgICAgICAgICAgICAgIGxldCBpc0ZvdW5kID0gY2hlY2tSb3dzKHNlYXJjaFN0ciwgcm93cywgcmV2ZXJzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNGb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByb3dzID0ge307IC8vIGNsZWFyIHJvd3MgZm9yIG5leHQgcGFnZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBwZGZQYXJzZXIubG9hZFBERihwZGZGaWxlUGF0aCwgMCk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc1RleHQocm93cywgdGV4dHMpIHtcclxuICAgIGZvciAodmFyIHQgaW4gdGV4dHMpIHtcclxuICAgICAgICB2YXIgaXRlbSA9IHRleHRzW3RdO1xyXG4gICAgICAgIHZhciB0ZXh0ID0gZGVjb2RlVVJJQ29tcG9uZW50KGl0ZW0uUlswXS5UKTtcclxuICAgICAgICAvLyBhY2N1bXVsYXRlIHRleHQgaXRlbXMgaW50byByb3dzIG9iamVjdCwgcGVyIGxpbmVcclxuICAgICAgICAocm93c1tpdGVtLnldID0gcm93c1tpdGVtLnldIHx8IFtdKS5wdXNoKHRleHQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjb3VudChwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IDAsIHJldmVyc2UgPSBmYWxzZSkge1xyXG4gICAgbGV0IHJvd3MgPSB7fTsgLy8gaW5kZXhlZCBieSB5LXBvc2l0aW9uXHJcbiAgICBsZXQgdG90YWxDb3VudCA9IDA7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGNvbnN0IHNlYXJjaFN0ciA9IHRleHQucmVwbGFjZSgvXFxzL2csICcnKTtcclxuXHJcbiAgICAgICAgbGV0IHBkZlBhcnNlciA9IG5ldyBQREZQYXJzZXIoKTtcclxuICAgICAgICBwZGZQYXJzZXIub24oJ3BkZlBhcnNlcl9kYXRhRXJyb3InLCBmdW5jdGlvbihlcnIpIHtcclxuICAgICAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGVyci5wYXJzZXJFcnJvciA/IGVyci5wYXJzZXJFcnJvciA6ICdFcnJvciBwYXJzaW5nIHRoZSBQREYuJztcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHBkZlBhcnNlci5vbigncGRmUGFyc2VyX2RhdGFSZWFkeScsIGZ1bmN0aW9uIChwZGZEYXRhKSB7XHJcbiAgICAgICAgICAgIGxldCB0b3RhbFBhZ2VzID0gcGRmRGF0YS5mb3JtSW1hZ2UuUGFnZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAocGFnZU51bSAmJiB0b3RhbFBhZ2VzIDwgcGFnZU51bSAtIDEpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBgSW52YWxpZCBhcmd1bWVudCAtICdwYWdlTnVtJyBpcyAke3BhZ2VOdW19LCBidXQgUERGIGNvbnRhaW5zIG9ubHkgJHt0b3RhbFBhZ2VzfSBwYWdlc2ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBjb3VudCBvbiBhIHNwZWNpZmljIHBhZ2VcclxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0pIHtcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NUZXh0KHJvd3MsIHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzW3BhZ2VOdW0tMV0uVGV4dHMpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gY291bnRSb3dzKHNlYXJjaFN0ciwgcm93cywgcmV2ZXJzZSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGNvdW50KTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY291bnQgb24gYWxsIHBhZ2VzXHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcGRmRGF0YS5mb3JtSW1hZ2UuUGFnZXMpIHtcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NUZXh0KHJvd3MsIHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzW3BdLlRleHRzKTtcclxuICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IGNvdW50Um93cyhzZWFyY2hTdHIsIHJvd3MsIHJldmVyc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsQ291bnQgKz0gY291bnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByb3dzID0ge307IC8vIGNsZWFyIHJvd3MgZm9yIG5leHQgcGFnZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXNvbHZlKHRvdGFsQ291bnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHBkZlBhcnNlci5sb2FkUERGKHBkZkZpbGVQYXRoLCAwKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiB2YWxpZGF0ZVN0cmluZyhhcmcsIG5hbWUpIHtcclxuICAgIGlmIChhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgJiYgYXJnLnRyaW0oKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgLy8gdGV4dCBpcyBjb3JyZWN0XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuXCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB2YWxpZGF0ZVBhZ2VOdW0oYXJnLCBuYW1lKSB7XHJcbiAgICBpZiAoYXJnID09PSBudWxsIHx8IChhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgJiYgYXJnID4gMCkpIHtcclxuICAgICAgICAvLyBwYWdlTnVtIGlzIGNvcnJlY3RcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci5cIik7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHZhbGlkYXRlTWVzc2FnZShhcmcsIG5hbWUpIHtcclxuICAgIGlmIChhcmcgPT09IG51bGwgfHwgKGFyZyAmJiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyAmJiBhcmcudHJpbSgpLmxlbmd0aCA+IDApKSB7XHJcbiAgICAgICAgLy8gcGFnZU51bSBpcyBjb3JyZWN0XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuXCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB2YWxpZGF0ZVJldmVyc2UoYXJnLCBuYW1lKSB7XHJcbiAgICBpZiAoYXJnID09PSBudWxsIHx8ICh0eXBlb2YgYXJnICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicpKSB7XHJcbiAgICAgICAgLy8gcGFnZU51bSBpcyBjb3JyZWN0XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIGJvb2xlYW5cIik7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc29sdmVQYXRoKHBkZkZpbGVQYXRoLCBvcHRpb25zKSB7XHJcblxyXG4gICAgcGRmRmlsZVBhdGggPSBwZGZGaWxlUGF0aC50cmltKCkuc3BsaXQoJycpLm1hcCgoaXRlbSwgaWR4KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICFbODIwNiwgODI5Nl0uaW5jbHVkZXMocGRmRmlsZVBhdGguY2hhckNvZGVBdChpZHgpKSA/IGl0ZW0gOiBudWxsO1xyXG4gICAgfSkuam9pbignJyk7XHJcblxyXG4gICAgaWYgKHBkZkZpbGVQYXRoWzBdID09PSAnficpIHtcclxuICAgICAgICAvLyByZXNvbHZlIHBhdGggcmVsYXRpdmUgdG8gaG9tZSBkaXJlY3RvcnlcclxuICAgICAgICByZXR1cm4gcGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUsIHBkZkZpbGVQYXRoLnNsaWNlKDEpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuY3dkKSB7XHJcbiAgICAgICAgICAgIGN3ZCA9IG9wdGlvbnMuY3dkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yb290UGF0aCkge1xyXG4gICAgICAgICAgICBjd2QgPSBvcHRpb25zLnJvb3RQYXRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY3dkID0gY3dkLnRyaW0oKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZShjd2QsIHBkZkZpbGVQYXRoKTtcclxuICAgIH1cclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcykge1xyXG5cclxuICAgIG1vZHVsZS5pc0luaXRpYWxpemVkID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0cyB0aGF0IHRleHQgaXMgcHJlc2VudCBpbiBhIFBERiBmaWxlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGRmRmlsZVBhdGggLSBSZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBQREYgZmlsZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IC0gVGV4dCB0byBhc3NlcnQuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHBhZ2VOdW0gLSBQYWdlIG51bWJlci5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gbWVzc2FnZSAtIE1lc3NhZ2UgdG8gdGhyb3cgaWYgYXNzZXJ0aW9uIGZhaWxzLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFuPX0gcmV2ZXJzZSAtIENoZWNrIGFsc28gcmV2ZXJzZSB2YXJpYW50IG9mIHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgbW9kdWxlLmFzc2VydCA9IGFzeW5jIGZ1bmN0aW9uKHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtID0gbnVsbCwgbWVzc2FnZSA9IG51bGwsIHJldmVyc2UgPSBmYWxzZSkge1xyXG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHBkZkZpbGVQYXRoLCAncGRmRmlsZVBhdGgnKTtcclxuICAgICAgICB2YWxpZGF0ZVN0cmluZyh0ZXh0LCAndGV4dCcpO1xyXG4gICAgICAgIHZhbGlkYXRlUGFnZU51bShwYWdlTnVtLCAncGFnZU51bScpO1xyXG4gICAgICAgIHZhbGlkYXRlTWVzc2FnZShtZXNzYWdlLCAnbWVzc2FnZScpO1xyXG4gICAgICAgIHZhbGlkYXRlUmV2ZXJzZShyZXZlcnNlLCAncmV2ZXJzZScpO1xyXG5cclxuICAgICAgICBwZGZGaWxlUGF0aCA9IHJlc29sdmVQYXRoKHBkZkZpbGVQYXRoLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgbGV0IGVycm9yO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IGFzc2VydGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSwgcmV2ZXJzZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXJldCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IGBcIiR7dGV4dH1cIiBpcyBub3QgZm91bmQgaW4gdGhlIFBERiAke3BhZ2VOdW0gPyAnb24gcGFnZSAnICsgcGFnZU51bSA6ICcnfWA7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgbXNnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGVycm9yID0gbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnRzIHRoYXQgdGV4dCBpcyBub3QgcHJlc2VudCBpbiBhIFBERiBmaWxlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0Tm90XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGRmRmlsZVBhdGggLSBSZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwZGYgZmlsZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IC0gVGV4dCB0byBhc3NlcnQuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHBhZ2VOdW0gLSBQYWdlIG51bWJlci5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gbWVzc2FnZSAtIE1lc3NhZ2UgdG8gdGhyb3cgaWYgYXNzZXJ0aW9uIGZhaWxzLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFuPX0gcmV2ZXJzZSAtIENoZWNrIGFsc28gcmV2ZXJzZSB2YXJpYW50IG9mIHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgbW9kdWxlLmFzc2VydE5vdCA9IGFzeW5jIGZ1bmN0aW9uKHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtID0gbnVsbCwgbWVzc2FnZSA9IG51bGwsIHJldmVyc2UgPSBmYWxzZSkge1xyXG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHBkZkZpbGVQYXRoLCAncGRmRmlsZVBhdGgnKTtcclxuICAgICAgICB2YWxpZGF0ZVN0cmluZyh0ZXh0LCAndGV4dCcpO1xyXG4gICAgICAgIHZhbGlkYXRlUGFnZU51bShwYWdlTnVtLCAncGFnZU51bScpO1xyXG4gICAgICAgIHZhbGlkYXRlTWVzc2FnZShtZXNzYWdlLCAnbWVzc2FnZScpO1xyXG4gICAgICAgIHZhbGlkYXRlUmV2ZXJzZShyZXZlcnNlLCAncmV2ZXJzZScpO1xyXG5cclxuICAgICAgICBwZGZGaWxlUGF0aCA9IHJlc29sdmVQYXRoKHBkZkZpbGVQYXRoLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgbGV0IGVycm9yO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IGFzc2VydGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSwgcmV2ZXJzZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmV0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgbXNnID0gYFwiJHt0ZXh0fVwiIGlzIGZvdW5kIGluIHRoZSBQREYgJHtwYWdlTnVtID8gJ29uIHBhZ2UgJyArIHBhZ2VOdW0gOiAnJ31gO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IENvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgc3BlY2lmaWVkIHRleHQgaXMgcHJlc2VudCBpbiBhIFBERiBmaWxlLlxyXG4gICAgICogQGZ1bmN0aW9uIGNvdW50XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGRmRmlsZVBhdGggLSBSZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwZGYgZmlsZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IC0gVGV4dCB0byBjb3VudC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gcGFnZU51bSAtIFBhZ2UgbnVtYmVyLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFuPX0gcmV2ZXJzZSAtIENoZWNrIGFsc28gcmV2ZXJzZSB2YXJpYW50IG9mIHN0cmluZy5cclxuICAgICAqIEByZXR1cm4ge051bWJlcn0gTnVtYmVyIG9mIHRpbWVzIHRoZSBzcGVjaWZpZWQgdGV4dCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5jb3VudCA9IGFzeW5jIGZ1bmN0aW9uKHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtID0gbnVsbCwgcmV2ZXJzZSA9IGZhbHNlKSB7XHJcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcocGRmRmlsZVBhdGgsICdwZGZGaWxlUGF0aCcpO1xyXG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHRleHQsICd0ZXh0Jyk7XHJcbiAgICAgICAgdmFsaWRhdGVQYWdlTnVtKHBhZ2VOdW0sICdwYWdlTnVtJyk7XHJcbiAgICAgICAgdmFsaWRhdGVSZXZlcnNlKHJldmVyc2UsICdyZXZlcnNlJyk7XHJcblxyXG4gICAgICAgIHBkZkZpbGVQYXRoID0gcmVzb2x2ZVBhdGgocGRmRmlsZVBhdGgsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgY291bnQocGRmRmlsZVBhdGgsIHRleHQsIHBhZ2VOdW0sIHJldmVyc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlBERl9FUlJPUiwgZS5tZXNzYWdlIHx8IGUpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4g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
|
|
328
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1wZGYuanMiXSwibmFtZXMiOlsiZXJySGVscGVyIiwicmVxdWlyZSIsInBhdGgiLCJQREZQYXJzZXIiLCJjb3VudFJvd3MiLCJzZWFyY2hTdHIiLCJyb3dzIiwicmV2ZXJzZSIsInJlc3VsdCIsInN0clJlZ2V4IiwiUmVnRXhwIiwicmV2ZXJzZVN0clJlZ2V4Iiwic3BsaXQiLCJqb2luIiwiT2JqZWN0Iiwia2V5cyIsInNvcnQiLCJ5MSIsInkyIiwicGFyc2VGbG9hdCIsInNvbWUiLCJ5IiwibGluZSIsInJlcGxhY2UiLCJjb3VudCIsIm1hdGNoIiwibGVuZ3RoIiwiY2hlY2tSb3dzIiwiaW5sdWRlcyIsInJldmVyc2VTZWFyY2hTdHIiLCJpbmNsdWRlcyIsImFzc2VydGlvbiIsInBkZkZpbGVQYXRoIiwidGV4dCIsInBhZ2VOdW0iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInBkZlBhcnNlciIsIm9uIiwiZXJyIiwiZXJyb3JNZXNzYWdlIiwicGFyc2VyRXJyb3IiLCJPeEVycm9yIiwiZXJyb3JDb2RlIiwiQVNTRVJUX0VSUk9SIiwicGRmRGF0YSIsInRvdGFsUGFnZXMiLCJmb3JtSW1hZ2UiLCJQYWdlcyIsIlNDUklQVF9FUlJPUiIsInByb2Nlc3NUZXh0IiwiVGV4dHMiLCJpc0ZvdW5kIiwicCIsImxvYWRQREYiLCJ0ZXh0cyIsInQiLCJpdGVtIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiUiIsIlQiLCJwdXNoIiwidG90YWxDb3VudCIsInZhbGlkYXRlU3RyaW5nIiwiYXJnIiwibmFtZSIsInRyaW0iLCJ2YWxpZGF0ZVBhZ2VOdW0iLCJ2YWxpZGF0ZU1lc3NhZ2UiLCJ2YWxpZGF0ZVJldmVyc2UiLCJyZXNvbHZlUGF0aCIsIm9wdGlvbnMiLCJtYXAiLCJpZHgiLCJjaGFyQ29kZUF0IiwicHJvY2VzcyIsImVudiIsIkhPTUUiLCJzbGljZSIsImN3ZCIsInJvb3RQYXRoIiwibW9kdWxlIiwiZXhwb3J0cyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsImlzSW5pdGlhbGl6ZWQiLCJhc3NlcnQiLCJtZXNzYWdlIiwiZXJyb3IiLCJyZXQiLCJtc2ciLCJlIiwiYXNzZXJ0Tm90IiwiUERGX0VSUk9SIl0sIm1hcHBpbmdzIjoiOzs7O0FBY0E7Ozs7QUFkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0EsTUFBTUEsU0FBUyxHQUFHQyxPQUFPLENBQUMsa0JBQUQsQ0FBekI7O0FBQ0EsTUFBTUMsSUFBSSxHQUFHRCxPQUFPLENBQUMsTUFBRCxDQUFwQjs7QUFDQSxJQUFJRSxTQUFTLEdBQUdGLE9BQU8sQ0FBQyxvQkFBRCxDQUF2Qjs7QUFFQSxTQUFTRyxTQUFULENBQW1CQyxTQUFuQixFQUE4QkMsSUFBOUIsRUFBb0NDLE9BQXBDLEVBQTZDO0FBQ3pDLE1BQUlDLE1BQU0sR0FBRyxDQUFiO0FBQ0EsTUFBSUMsUUFBUSxHQUFHLElBQUlDLE1BQUosQ0FBV0wsU0FBWCxFQUFzQixHQUF0QixDQUFmO0FBQ0EsTUFBSU0sZUFBZSxHQUFHSixPQUFPLEdBQUcsSUFBSUcsTUFBSixDQUFXTCxTQUFTLENBQUNPLEtBQVYsQ0FBZ0IsRUFBaEIsRUFBb0JMLE9BQXBCLEdBQThCTSxJQUE5QixDQUFtQyxFQUFuQyxDQUFYLEVBQW1ELEdBQW5ELENBQUgsR0FBNkQsSUFBMUY7QUFFQUMsRUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVlULElBQVosRUFBa0I7QUFBbEIsR0FDS1UsSUFETCxDQUNVLENBQUNDLEVBQUQsRUFBS0MsRUFBTCxLQUFZQyxVQUFVLENBQUNGLEVBQUQsQ0FBVixHQUFpQkUsVUFBVSxDQUFDRCxFQUFELENBRGpELEVBQ3VEO0FBRHZELEdBRUtFLElBRkwsQ0FFVUMsQ0FBQyxJQUFJO0FBQ1AsUUFBSUMsSUFBSSxHQUFHLENBQUNoQixJQUFJLENBQUNlLENBQUQsQ0FBSixJQUFXLEVBQVosRUFBZ0JS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QUEsTUFBTSxDQUFDMUQsS0FBUCxHQUFlLGdCQUFlUSxXQUFmLEVBQTRCQyxJQUE1QixFQUFrQ0MsT0FBTyxHQUFHLElBQTVDLEVBQWtEM0IsT0FBTyxHQUFHLEtBQTVELEVBQW1FO0FBQzlFeUQsSUFBQUEsY0FBYyxDQUFDaEMsV0FBRCxFQUFjLGFBQWQsQ0FBZDtBQUNBZ0MsSUFBQUEsY0FBYyxDQUFDL0IsSUFBRCxFQUFPLE1BQVAsQ0FBZDtBQUNBbUMsSUFBQUEsZUFBZSxDQUFDbEMsT0FBRCxFQUFVLFNBQVYsQ0FBZjtBQUNBb0MsSUFBQUEsZUFBZSxDQUFDL0QsT0FBRCxFQUFVLFNBQVYsQ0FBZjtBQUVBeUIsSUFBQUEsV0FBVyxHQUFHdUMsV0FBVyxDQUFDdkMsV0FBRCxFQUFjd0MsT0FBZCxDQUF6Qjs7QUFFQSxRQUFJO0FBQ0EsYUFBTyxNQUFNaEQsS0FBSyxDQUFDUSxXQUFELEVBQWNDLElBQWQsRUFBb0JDLE9BQXBCLEVBQTZCM0IsT0FBN0IsQ0FBbEI7QUFDSCxLQUZELENBR0EsT0FBT3dGLENBQVAsRUFBVTtBQUNOLFlBQU0sSUFBSXBELG9CQUFKLENBQVkzQyxTQUFTLENBQUM0QyxTQUFWLENBQW9CcUQsU0FBaEMsRUFBMkNGLENBQUMsQ0FBQ0osT0FBRixJQUFhSSxDQUF4RCxDQUFOO0FBQ0g7QUFDSixHQWREOztBQWdCQSxTQUFPYixNQUFQO0FBQ0gsQ0FqSEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZSBwZGZcclxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGdlbmVyaWMgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIFBERiBmaWxlcy5cclxuICovXHJcblxyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5jb25zdCBlcnJIZWxwZXIgPSByZXF1aXJlKCcuLi9lcnJvcnMvaGVscGVyJyk7XHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XHJcbnZhciBQREZQYXJzZXIgPSByZXF1aXJlKCdwZGYyanNvbi9wZGZwYXJzZXInKTtcclxuXHJcbmZ1bmN0aW9uIGNvdW50Um93cyhzZWFyY2hTdHIsIHJvd3MsIHJldmVyc2UpIHtcclxuICAgIGxldCByZXN1bHQgPSAwO1xyXG4gICAgdmFyIHN0clJlZ2V4ID0gbmV3IFJlZ0V4cChzZWFyY2hTdHIsICdnJyk7XHJcbiAgICB2YXIgcmV2ZXJzZVN0clJlZ2V4ID0gcmV2ZXJzZSA/IG5ldyBSZWdFeHAoc2VhcmNoU3RyLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyksICdnJykgOiBudWxsO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKHJvd3MpIC8vID0+IGFycmF5IG9mIHktcG9zaXRpb25zICh0eXBlOiBmbG9hdClcclxuICAgICAgICAuc29ydCgoeTEsIHkyKSA9PiBwYXJzZUZsb2F0KHkxKSAtIHBhcnNlRmxvYXQoeTIpKSAvLyBzb3J0IGZsb2F0IHBvc2l0aW9uc1xyXG4gICAgICAgIC5zb21lKHkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgbGluZSA9IChyb3dzW3ldIHx8IFtdKS5qb2luKCcnKS5yZXBsYWNlKC9cXHMvZywgJycpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGNvdW50ID0gKGxpbmUubWF0Y2goc3RyUmVnZXgpIHx8IFtdKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMCAmJiByZXZlcnNlU3RyUmVnZXgpIHtcclxuICAgICAgICAgICAgICAgIGNvdW50ID0gKGxpbmUubWF0Y2gocmV2ZXJzZVN0clJlZ2V4KSB8fCBbXSkubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSBjb3VudDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjaGVja1Jvd3Moc2VhcmNoU3RyLCByb3dzLCByZXZlcnNlKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcblxyXG4gICAgT2JqZWN0LmtleXMocm93cykgLy8gPT4gYXJyYXkgb2YgeS1wb3NpdGlvbnMgKHR5cGU6IGZsb2F0KVxyXG4gICAgICAgIC5zb3J0KCh5MSwgeTIpID0+IHBhcnNlRmxvYXQoeTEpIC0gcGFyc2VGbG9hdCh5MikpIC8vIHNvcnQgZmxvYXQgcG9zaXRpb25zXHJcbiAgICAgICAgLnNvbWUoeSA9PiB7XHJcblxyXG4gICAgICAgICAgICB2YXIgbGluZSA9IChyb3dzW3ldIHx8IFtdKS5qb2luKCcnKS5yZXBsYWNlKC9cXHMvZywgJycpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGlubHVkZXM7XHJcblxyXG4gICAgICAgICAgICBpZiAocmV2ZXJzZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZVNlYXJjaFN0ciA9IHNlYXJjaFN0ci5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO1xyXG4gICAgICAgICAgICAgICAgaW5sdWRlcyA9IGxpbmUuaW5jbHVkZXMoc2VhcmNoU3RyKSB8fCBsaW5lLmluY2x1ZGVzKHJldmVyc2VTZWFyY2hTdHIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaW5sdWRlcyA9IGxpbmUuaW5jbHVkZXMoc2VhcmNoU3RyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGlubHVkZXMpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFzc2VydGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IDAsIHJldmVyc2UgPSBmYWxzZSkge1xyXG4gICAgbGV0IHJvd3MgPSB7fTsgLy8gaW5kZXhlZCBieSB5LXBvc2l0aW9uXHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGNvbnN0IHNlYXJjaFN0ciA9IHRleHQucmVwbGFjZSgvXFxzL2csICcnKTtcclxuXHJcbiAgICAgICAgbGV0IHBkZlBhcnNlciA9IG5ldyBQREZQYXJzZXIoKTtcclxuICAgICAgICBwZGZQYXJzZXIub24oJ3BkZlBhcnNlcl9kYXRhRXJyb3InLCBmdW5jdGlvbihlcnIpIHtcclxuICAgICAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGVyci5wYXJzZXJFcnJvciA/IGVyci5wYXJzZXJFcnJvciA6ICdFcnJvciBwYXJzaW5nIHRoZSBQREYuJztcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHBkZlBhcnNlci5vbigncGRmUGFyc2VyX2RhdGFSZWFkeScsIGZ1bmN0aW9uIChwZGZEYXRhKSB7XHJcbiAgICAgICAgICAgIHZhciB0b3RhbFBhZ2VzID0gcGRmRGF0YS5mb3JtSW1hZ2UuUGFnZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAocGFnZU51bSAmJiB0b3RhbFBhZ2VzIDwgcGFnZU51bSAtIDEpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBgSW52YWxpZCBhcmd1bWVudCAtICdwYWdlTnVtJyBpcyAke3BhZ2VOdW19LCBidXQgUERGIGNvbnRhaW5zIG9ubHkgJHt0b3RhbFBhZ2VzfSBwYWdlc2ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBsb2NhdGUgb24gYSBzcGVjaWZpYyBwYWdlXHJcbiAgICAgICAgICAgIGlmIChwYWdlTnVtKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dChyb3dzLCBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlc1twYWdlTnVtLTFdLlRleHRzKTtcclxuICAgICAgICAgICAgICAgIGxldCBpc0ZvdW5kID0gY2hlY2tSb3dzKHNlYXJjaFN0ciwgcm93cywgcmV2ZXJzZSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCEhaXNGb3VuZCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGxvY2F0ZSBvbiBhbnkgcGFnZVxyXG4gICAgICAgICAgICBmb3IgKGxldCBwIGluIHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dChyb3dzLCBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlc1twXS5UZXh0cyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXNGb3VuZCA9IGNoZWNrUm93cyhzZWFyY2hTdHIsIHJvd3MsIHJldmVyc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzRm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcm93cyA9IHt9OyAvLyBjbGVhciByb3dzIGZvciBuZXh0IHBhZ2VcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcGRmUGFyc2VyLmxvYWRQREYocGRmRmlsZVBhdGgsIDApO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NUZXh0KHJvd3MsIHRleHRzKSB7XHJcbiAgICBmb3IgKHZhciB0IGluIHRleHRzKSB7XHJcbiAgICAgICAgdmFyIGl0ZW0gPSB0ZXh0c1t0XTtcclxuICAgICAgICB2YXIgdGV4dCA9IGRlY29kZVVSSUNvbXBvbmVudChpdGVtLlJbMF0uVCk7XHJcbiAgICAgICAgLy8gYWNjdW11bGF0ZSB0ZXh0IGl0ZW1zIGludG8gcm93cyBvYmplY3QsIHBlciBsaW5lXHJcbiAgICAgICAgKHJvd3NbaXRlbS55XSA9IHJvd3NbaXRlbS55XSB8fCBbXSkucHVzaCh0ZXh0KTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY291bnQocGRmRmlsZVBhdGgsIHRleHQsIHBhZ2VOdW0gPSAwLCByZXZlcnNlID0gZmFsc2UpIHtcclxuICAgIGxldCByb3dzID0ge307IC8vIGluZGV4ZWQgYnkgeS1wb3NpdGlvblxyXG4gICAgbGV0IHRvdGFsQ291bnQgPSAwO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBjb25zdCBzZWFyY2hTdHIgPSB0ZXh0LnJlcGxhY2UoL1xccy9nLCAnJyk7XHJcblxyXG4gICAgICAgIGxldCBwZGZQYXJzZXIgPSBuZXcgUERGUGFyc2VyKCk7XHJcbiAgICAgICAgcGRmUGFyc2VyLm9uKCdwZGZQYXJzZXJfZGF0YUVycm9yJywgZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBlcnIucGFyc2VyRXJyb3IgPyBlcnIucGFyc2VyRXJyb3IgOiAnRXJyb3IgcGFyc2luZyB0aGUgUERGLic7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwZGZQYXJzZXIub24oJ3BkZlBhcnNlcl9kYXRhUmVhZHknLCBmdW5jdGlvbiAocGRmRGF0YSkge1xyXG4gICAgICAgICAgICBsZXQgdG90YWxQYWdlcyA9IHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0gJiYgdG90YWxQYWdlcyA8IHBhZ2VOdW0gLSAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgYEludmFsaWQgYXJndW1lbnQgLSAncGFnZU51bScgaXMgJHtwYWdlTnVtfSwgYnV0IFBERiBjb250YWlucyBvbmx5ICR7dG90YWxQYWdlc30gcGFnZXNgKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY291bnQgb24gYSBzcGVjaWZpYyBwYWdlXHJcbiAgICAgICAgICAgIGlmIChwYWdlTnVtKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dChyb3dzLCBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlc1twYWdlTnVtLTFdLlRleHRzKTtcclxuICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IGNvdW50Um93cyhzZWFyY2hTdHIsIHJvd3MsIHJldmVyc2UpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShjb3VudCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNvdW50IG9uIGFsbCBwYWdlc1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dChyb3dzLCBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlc1twXS5UZXh0cyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgY291bnQgPSBjb3VudFJvd3Moc2VhcmNoU3RyLCByb3dzLCByZXZlcnNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbENvdW50ICs9IGNvdW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcm93cyA9IHt9OyAvLyBjbGVhciByb3dzIGZvciBuZXh0IHBhZ2VcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVzb2x2ZSh0b3RhbENvdW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBwZGZQYXJzZXIubG9hZFBERihwZGZGaWxlUGF0aCwgMCk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcoYXJnLCBuYW1lKSB7XHJcbiAgICBpZiAoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnICYmIGFyZy50cmltKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vIHRleHQgaXMgY29ycmVjdFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBub24tZW1wdHkgc3RyaW5nLlwiKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdmFsaWRhdGVQYWdlTnVtKGFyZywgbmFtZSkge1xyXG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCAoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdudW1iZXInICYmIGFyZyA+IDApKSB7XHJcbiAgICAgICAgLy8gcGFnZU51bSBpcyBjb3JyZWN0XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuXCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB2YWxpZGF0ZU1lc3NhZ2UoYXJnLCBuYW1lKSB7XHJcbiAgICBpZiAoYXJnID09PSBudWxsIHx8IChhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgJiYgYXJnLnRyaW0oKS5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgIC8vIHBhZ2VOdW0gaXMgY29ycmVjdFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBub24tZW1wdHkgc3RyaW5nLlwiKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdmFsaWRhdGVSZXZlcnNlKGFyZywgbmFtZSkge1xyXG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCAodHlwZW9mIGFyZyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nKSkge1xyXG4gICAgICAgIC8vIHBhZ2VOdW0gaXMgY29ycmVjdFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBib29sZWFuXCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXNvbHZlUGF0aChwZGZGaWxlUGF0aCwgb3B0aW9ucykge1xyXG5cclxuICAgIHBkZkZpbGVQYXRoID0gcGRmRmlsZVBhdGgudHJpbSgpLnNwbGl0KCcnKS5tYXAoKGl0ZW0sIGlkeCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAhWzgyMDYsIDgyOTZdLmluY2x1ZGVzKHBkZkZpbGVQYXRoLmNoYXJDb2RlQXQoaWR4KSkgPyBpdGVtIDogbnVsbDtcclxuICAgIH0pLmpvaW4oJycpO1xyXG5cclxuICAgIGlmIChwZGZGaWxlUGF0aFswXSA9PT0gJ34nKSB7XHJcbiAgICAgICAgLy8gcmVzb2x2ZSBwYXRoIHJlbGF0aXZlIHRvIGhvbWUgZGlyZWN0b3J5XHJcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbihwcm9jZXNzLmVudi5IT01FLCBwZGZGaWxlUGF0aC5zbGljZSgxKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmN3ZCkge1xyXG4gICAgICAgICAgICBjd2QgPSBvcHRpb25zLmN3ZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucm9vdFBhdGgpIHtcclxuICAgICAgICAgICAgY3dkID0gb3B0aW9ucy5yb290UGF0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN3ZCA9IGN3ZC50cmltKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUoY3dkLCBwZGZGaWxlUGF0aCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuXHJcbiAgICBtb2R1bGUuaXNJbml0aWFsaXplZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydHMgdGhhdCB0ZXh0IGlzIHByZXNlbnQgaW4gYSBQREYgZmlsZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBkZkZpbGVQYXRoIC0gUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgUERGIGZpbGUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIFRleHQgdG8gYXNzZXJ0LlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSBwYWdlTnVtIC0gUGFnZSBudW1iZXIuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IG1lc3NhZ2UgLSBNZXNzYWdlIHRvIHRocm93IGlmIGFzc2VydGlvbiBmYWlscy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHJldmVyc2UgLSBDaGVjayBhbHNvIHJldmVyc2UgdmFyaWFudCBvZiBzdHJpbmcuXHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5hc3NlcnQgPSBhc3luYyBmdW5jdGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IG51bGwsIG1lc3NhZ2UgPSBudWxsLCByZXZlcnNlID0gZmFsc2UpIHtcclxuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwZGZGaWxlUGF0aCwgJ3BkZkZpbGVQYXRoJyk7XHJcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcodGV4dCwgJ3RleHQnKTtcclxuICAgICAgICB2YWxpZGF0ZVBhZ2VOdW0ocGFnZU51bSwgJ3BhZ2VOdW0nKTtcclxuICAgICAgICB2YWxpZGF0ZU1lc3NhZ2UobWVzc2FnZSwgJ21lc3NhZ2UnKTtcclxuICAgICAgICB2YWxpZGF0ZVJldmVyc2UocmV2ZXJzZSwgJ3JldmVyc2UnKTtcclxuXHJcbiAgICAgICAgcGRmRmlsZVBhdGggPSByZXNvbHZlUGF0aChwZGZGaWxlUGF0aCwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGxldCBlcnJvcjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBhc3NlcnRpb24ocGRmRmlsZVBhdGgsIHRleHQsIHBhZ2VOdW0sIHJldmVyc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFyZXQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgXCIke3RleHR9XCIgaXMgbm90IGZvdW5kIGluIHRoZSBQREYgJHtwYWdlTnVtID8gJ29uIHBhZ2UgJyArIHBhZ2VOdW0gOiAnJ31gO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0cyB0aGF0IHRleHQgaXMgbm90IHByZXNlbnQgaW4gYSBQREYgZmlsZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydE5vdFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBkZkZpbGVQYXRoIC0gUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgcGRmIGZpbGUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIFRleHQgdG8gYXNzZXJ0LlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSBwYWdlTnVtIC0gUGFnZSBudW1iZXIuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IG1lc3NhZ2UgLSBNZXNzYWdlIHRvIHRocm93IGlmIGFzc2VydGlvbiBmYWlscy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHJldmVyc2UgLSBDaGVjayBhbHNvIHJldmVyc2UgdmFyaWFudCBvZiBzdHJpbmcuXHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5hc3NlcnROb3QgPSBhc3luYyBmdW5jdGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IG51bGwsIG1lc3NhZ2UgPSBudWxsLCByZXZlcnNlID0gZmFsc2UpIHtcclxuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwZGZGaWxlUGF0aCwgJ3BkZkZpbGVQYXRoJyk7XHJcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcodGV4dCwgJ3RleHQnKTtcclxuICAgICAgICB2YWxpZGF0ZVBhZ2VOdW0ocGFnZU51bSwgJ3BhZ2VOdW0nKTtcclxuICAgICAgICB2YWxpZGF0ZU1lc3NhZ2UobWVzc2FnZSwgJ21lc3NhZ2UnKTtcclxuICAgICAgICB2YWxpZGF0ZVJldmVyc2UocmV2ZXJzZSwgJ3JldmVyc2UnKTtcclxuXHJcbiAgICAgICAgcGRmRmlsZVBhdGggPSByZXNvbHZlUGF0aChwZGZGaWxlUGF0aCwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGxldCBlcnJvcjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBhc3NlcnRpb24ocGRmRmlsZVBhdGgsIHRleHQsIHBhZ2VOdW0sIHJldmVyc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJldCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IGBcIiR7dGV4dH1cIiBpcyBmb3VuZCBpbiB0aGUgUERGICR7cGFnZU51bSA/ICdvbiBwYWdlICcgKyBwYWdlTnVtIDogJyd9YDtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtc2cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHNwZWNpZmllZCB0ZXh0IGlzIHByZXNlbnQgaW4gYSBQREYgZmlsZS5cclxuICAgICAqIEBmdW5jdGlvbiBjb3VudFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBkZkZpbGVQYXRoIC0gUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgcGRmIGZpbGUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIFRleHQgdG8gY291bnQuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHBhZ2VOdW0gLSBQYWdlIG51bWJlci5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHJldmVyc2UgLSBDaGVjayBhbHNvIHJldmVyc2UgdmFyaWFudCBvZiBzdHJpbmcuXHJcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IE51bWJlciBvZiB0aW1lcyB0aGUgc3BlY2lmaWVkIHRleHQgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUuY291bnQgPSBhc3luYyBmdW5jdGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IG51bGwsIHJldmVyc2UgPSBmYWxzZSkge1xyXG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHBkZkZpbGVQYXRoLCAncGRmRmlsZVBhdGgnKTtcclxuICAgICAgICB2YWxpZGF0ZVN0cmluZyh0ZXh0LCAndGV4dCcpO1xyXG4gICAgICAgIHZhbGlkYXRlUGFnZU51bShwYWdlTnVtLCAncGFnZU51bScpO1xyXG4gICAgICAgIHZhbGlkYXRlUmV2ZXJzZShyZXZlcnNlLCAncmV2ZXJzZScpO1xyXG5cclxuICAgICAgICBwZGZGaWxlUGF0aCA9IHJlc29sdmVQYXRoKHBkZkZpbGVQYXRoLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNvdW50KHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtLCByZXZlcnNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5QREZfRVJST1IsIGUubWVzc2FnZSB8fCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBtb2R1bGU7XHJcbn07XHJcbiJdfQ==
|