haya-select 1.0.116 → 1.0.117
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/README.md
CHANGED
|
@@ -76,6 +76,20 @@ The callback receives the current `searchValue`, `page`, and optional `values` w
|
|
|
76
76
|
|
|
77
77
|
If `totalCount` and `page` are provided, the options list shows pagination controls with previous/next buttons, a page range around the current page, and a "Page X of Y" label that can be clicked to enter a page number manually.
|
|
78
78
|
|
|
79
|
+
## System test helpers
|
|
80
|
+
|
|
81
|
+
Browser system-test suites can import helpers from the dedicated test-helper entrypoint:
|
|
82
|
+
|
|
83
|
+
```js
|
|
84
|
+
import {pickHayaSelectOption} from "haya-select/build/system-test-helpers.js"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
The helper entrypoint exports:
|
|
88
|
+
|
|
89
|
+
- `pickHayaSelectOption(systemTest, testID, {optionText, optionValue, search})`
|
|
90
|
+
- `clickVisibleHayaSelectOption(systemTest, {optionValue})`
|
|
91
|
+
- `expectHayaSelectCurrentOptions(systemTest, testID, expectedTexts)`
|
|
92
|
+
|
|
79
93
|
## Mobile options sheet
|
|
80
94
|
|
|
81
95
|
HayaSelect opens options in a bottom sheet on mobile-sized screens by default. The sheet is used when the window width is 768px or less on web, iOS, and Android. It keeps the options list scrollable inside the sheet and places the search input at the bottom. When pagination is enabled, the pagination controls stay fixed above the search input instead of scrolling with the options.
|
|
@@ -1,4 +1,28 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Selects an option in a HayaSelect instance.
|
|
3
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
4
|
+
* @param {string} testId Wrapper `data-testid` around the select.
|
|
5
|
+
* @param {PickHayaSelectOptionOptions} options Text/value to choose and whether to type into the search field first.
|
|
6
|
+
* @returns {Promise<void>} Completes after the matching visible option is clicked.
|
|
7
|
+
* @rejects {Error} When neither text nor value is supplied.
|
|
8
|
+
*/
|
|
9
|
+
export function pickHayaSelectOption(systemTest: object, testId: string, { optionText, optionValue, search, timeout, useBaseSelector }: PickHayaSelectOptionOptions): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Clicks an option in an already-open HayaSelect dropdown.
|
|
12
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
13
|
+
* @param {ClickVisibleHayaSelectOptionOptions} options Option value to choose.
|
|
14
|
+
* @returns {Promise<void>} Completes after the matching visible option is clicked.
|
|
15
|
+
*/
|
|
16
|
+
export function clickVisibleHayaSelectOption(systemTest: object, { optionValue, timeout }: ClickVisibleHayaSelectOptionOptions): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Waits until a HayaSelect renders exactly the expected current-option labels.
|
|
19
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
20
|
+
* @param {string} testId Wrapper `data-testid` around the select.
|
|
21
|
+
* @param {string[]} expectedTexts Current option text fragments in rendered order.
|
|
22
|
+
* @param {ExpectHayaSelectCurrentOptionsOptions} [options] Optional Selenium timeout override.
|
|
23
|
+
* @returns {Promise<void>} Completes after the current options match.
|
|
24
|
+
*/
|
|
25
|
+
export function expectHayaSelectCurrentOptions(systemTest: object, testId: string, expectedTexts: string[], { timeout }?: ExpectHayaSelectCurrentOptionsOptions): Promise<void>;
|
|
2
26
|
/**
|
|
3
27
|
* System test helper for interacting with HayaSelect instances.
|
|
4
28
|
*/
|
|
@@ -50,4 +74,19 @@ export type HayaSelectSystemTestHelperOptions = {
|
|
|
50
74
|
systemTest: object;
|
|
51
75
|
testId: string;
|
|
52
76
|
};
|
|
77
|
+
export type PickHayaSelectOptionOptions = {
|
|
78
|
+
optionText?: string;
|
|
79
|
+
optionValue?: string | number;
|
|
80
|
+
search?: boolean;
|
|
81
|
+
timeout?: number;
|
|
82
|
+
useBaseSelector?: boolean;
|
|
83
|
+
};
|
|
84
|
+
export type ClickVisibleHayaSelectOptionOptions = {
|
|
85
|
+
optionValue: string | number;
|
|
86
|
+
timeout?: number;
|
|
87
|
+
};
|
|
88
|
+
export type ExpectHayaSelectCurrentOptionsOptions = {
|
|
89
|
+
timeout?: number;
|
|
90
|
+
};
|
|
91
|
+
export type WebElement = any;
|
|
53
92
|
//# sourceMappingURL=system-test-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-test-helpers.d.ts","sourceRoot":"","sources":["../src/system-test-helpers.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"system-test-helpers.d.ts","sourceRoot":"","sources":["../src/system-test-helpers.js"],"names":[],"mappings":"AAWA;;;;;;;GAOG;AACH,iDANW,MAAM,UACN,MAAM,iEACN,2BAA2B,GACzB,OAAO,CAAC,IAAI,CAAC,CA8BzB;AAED;;;;;GAKG;AACH,yDAJW,MAAM,4BACN,mCAAmC,GACjC,OAAO,CAAC,IAAI,CAAC,CAIzB;AAED;;;;;;;GAOG;AACH,2DANW,MAAM,UACN,MAAM,iBACN,MAAM,EAAE,gBACR,qCAAqC,GACnC,OAAO,CAAC,IAAI,CAAC,CAyBzB;AAED;;GAEG;AACH;IACE,yDAAyD;IACzD,qBADY,iCAAiC,EAqB5C;IARC,gBAA4B;IAC5B,eAAoB;IACpB,qBAA0C;IAC1C,0BAA2E;IAC3E,iCAAoG;IACpG,gCAAkG;IAClG,4BAA0F;IAC1F,yCAAuF;IAGzF,+BAA+B;IAC/B,QADc,OAAO,CAAC,IAAI,CAAC,CAY1B;IATC,qDAAqC;IAWvC,+BAA+B;IAC/B,SADc,OAAO,CAAC,IAAI,CAAC,CAW1B;IAED,kCAAkC;IAClC,UADc,OAAO,CAAC,OAAO,CAAC,CAS7B;IAED,+BAA+B;IAC/B,wBADc,OAAO,CAAC,IAAI,CAAC,CAK1B;IAED;;;OAGG;IACH,uBAHW,MAAM,GACJ,OAAO,CAAC,KAAK,CAAC,GAAuC,CAAC,CAAC,CAInE;IAED;;;OAGG;IACH,8BAHW,MAAM,GACJ,OAAO,CAAC,KAAK,CAAC,GAAuC,CAAC,CAAC,CAanE;IAED,iCAAiC;IACjC,4BADc,OAAO,CAAC,MAAM,CAAC,CAiB5B;IAED,mCAAmC;IACnC,eADc,OAAO,CAAC,MAAM,EAAE,CAAC,CAM9B;IAED;;;OAGG;IACH,mDAHW;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAC,MAAM,CAAA;KAAC,mBACpD,OAAO,CAAC,IAAI,CAAC,CA6DzB;CACF;gDApRa;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC;0CACpC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAC;kDACnH;IAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAC;oDAChD;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAC"}
|
|
@@ -1,6 +1,75 @@
|
|
|
1
1
|
import waitFor from "awaitery/build/wait-for.js";
|
|
2
2
|
import { By } from "selenium-webdriver";
|
|
3
3
|
/** @typedef {{systemTest: object, testId: string}} HayaSelectSystemTestHelperOptions */
|
|
4
|
+
/** @typedef {{optionText?: string, optionValue?: string | number, search?: boolean, timeout?: number, useBaseSelector?: boolean}} PickHayaSelectOptionOptions */
|
|
5
|
+
/** @typedef {{optionValue: string | number, timeout?: number}} ClickVisibleHayaSelectOptionOptions */
|
|
6
|
+
/** @typedef {{timeout?: number}} ExpectHayaSelectCurrentOptionsOptions */
|
|
7
|
+
/** @typedef {import("selenium-webdriver").WebElement} WebElement */
|
|
8
|
+
const DEFAULT_TIMEOUT = 5000;
|
|
9
|
+
/**
|
|
10
|
+
* Selects an option in a HayaSelect instance.
|
|
11
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
12
|
+
* @param {string} testId Wrapper `data-testid` around the select.
|
|
13
|
+
* @param {PickHayaSelectOptionOptions} options Text/value to choose and whether to type into the search field first.
|
|
14
|
+
* @returns {Promise<void>} Completes after the matching visible option is clicked.
|
|
15
|
+
* @rejects {Error} When neither text nor value is supplied.
|
|
16
|
+
*/
|
|
17
|
+
export async function pickHayaSelectOption(systemTest, testId, { optionText, optionValue, search = false, timeout = DEFAULT_TIMEOUT, useBaseSelector = true }) {
|
|
18
|
+
const helper = new HayaSelectSystemTestHelper({ systemTest, testId });
|
|
19
|
+
const selectElement = await systemTest.find(helper.selectContainerSelector, { timeout, useBaseSelector });
|
|
20
|
+
await selectElement.click();
|
|
21
|
+
if (search) {
|
|
22
|
+
if (!optionText) {
|
|
23
|
+
throw new Error(`Expected optionText when searching ${testId}`);
|
|
24
|
+
}
|
|
25
|
+
const searchElement = await systemTest.find(helper.searchInputSelector, { timeout, useBaseSelector });
|
|
26
|
+
await searchElement.sendKeys(optionText);
|
|
27
|
+
}
|
|
28
|
+
const optionsContainerSelector = await helper.optionsContainerSelector();
|
|
29
|
+
if (typeof optionValue !== "undefined") {
|
|
30
|
+
await clickVisibleSelectOptionByValue(systemTest, optionValue, timeout, optionsContainerSelector);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (optionText) {
|
|
34
|
+
await clickVisibleSelectOptionByText(systemTest, optionText, timeout, optionsContainerSelector);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
throw new Error(`Expected optionValue or optionText for ${testId}`);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Clicks an option in an already-open HayaSelect dropdown.
|
|
41
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
42
|
+
* @param {ClickVisibleHayaSelectOptionOptions} options Option value to choose.
|
|
43
|
+
* @returns {Promise<void>} Completes after the matching visible option is clicked.
|
|
44
|
+
*/
|
|
45
|
+
export async function clickVisibleHayaSelectOption(systemTest, { optionValue, timeout = DEFAULT_TIMEOUT }) {
|
|
46
|
+
await clickVisibleSelectOptionByValue(systemTest, optionValue, timeout);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Waits until a HayaSelect renders exactly the expected current-option labels.
|
|
50
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
51
|
+
* @param {string} testId Wrapper `data-testid` around the select.
|
|
52
|
+
* @param {string[]} expectedTexts Current option text fragments in rendered order.
|
|
53
|
+
* @param {ExpectHayaSelectCurrentOptionsOptions} [options] Optional Selenium timeout override.
|
|
54
|
+
* @returns {Promise<void>} Completes after the current options match.
|
|
55
|
+
*/
|
|
56
|
+
export async function expectHayaSelectCurrentOptions(systemTest, testId, expectedTexts, { timeout = DEFAULT_TIMEOUT } = {}) {
|
|
57
|
+
const selector = `${testIdSelector(testId)} [data-testid="haya-select/current-option"]`;
|
|
58
|
+
await systemTest.getDriver().wait(async () => {
|
|
59
|
+
const elements = await systemTest.getDriver().findElements(By.css(selector));
|
|
60
|
+
/** @type {string[]} */
|
|
61
|
+
const visibleTexts = [];
|
|
62
|
+
for (const element of elements) {
|
|
63
|
+
if (await element.isDisplayed()) {
|
|
64
|
+
visibleTexts.push(await element.getText());
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (visibleTexts.length !== expectedTexts.length) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return expectedTexts.every((expectedText, index) => visibleTexts[index]?.includes(expectedText));
|
|
71
|
+
}, timeout, `Timed out waiting for ${testId} current options: ${expectedTexts.join(", ")}`);
|
|
72
|
+
}
|
|
4
73
|
/**
|
|
5
74
|
* System test helper for interacting with HayaSelect instances.
|
|
6
75
|
*/
|
|
@@ -17,7 +86,7 @@ export default class HayaSelectSystemTestHelper {
|
|
|
17
86
|
}
|
|
18
87
|
this.systemTest = systemTest;
|
|
19
88
|
this.testId = testId;
|
|
20
|
-
this.rootSelector =
|
|
89
|
+
this.rootSelector = testIdSelector(testId);
|
|
21
90
|
this.componentSelector = `${this.rootSelector} [data-testid='haya-select']`;
|
|
22
91
|
this.chevronContainerSelector = `${this.rootSelector} [data-testid='haya-select/chevron-container']`;
|
|
23
92
|
this.selectContainerSelector = `${this.rootSelector} [data-testid='haya-select/select-container']`;
|
|
@@ -90,7 +159,7 @@ export default class HayaSelectSystemTestHelper {
|
|
|
90
159
|
elements = await this.findElements(this.componentSelector);
|
|
91
160
|
}
|
|
92
161
|
const id = rootId || (elements.length > 0 ? await elements[0].getAttribute("data-id") : null);
|
|
93
|
-
this._optionsContainerSelector = id ? `[data-testid='haya-select/options-container'][data-id=
|
|
162
|
+
this._optionsContainerSelector = id ? `[data-testid='haya-select/options-container'][data-id="${cssAttributeValue(id)}"]` : this.optionsContainerSelectorFallback;
|
|
94
163
|
return this._optionsContainerSelector;
|
|
95
164
|
}
|
|
96
165
|
/** @returns {Promise<string[]>} */
|
|
@@ -114,7 +183,7 @@ export default class HayaSelectSystemTestHelper {
|
|
|
114
183
|
if (typeof value != "undefined") {
|
|
115
184
|
await waitFor({ timeout: 5000 }, async () => {
|
|
116
185
|
const optionsContainerSelector = await this.optionsContainerSelector();
|
|
117
|
-
const options = await this.findElements(`${optionsContainerSelector} [data-testid='haya-select/option'][data-value=
|
|
186
|
+
const options = await this.findElements(`${optionsContainerSelector} [data-testid='haya-select/option'][data-value="${cssAttributeValue(value)}"]`);
|
|
118
187
|
const option = options[0];
|
|
119
188
|
if (!option) {
|
|
120
189
|
throw new Error(`No option for value: ${value}`);
|
|
@@ -152,4 +221,77 @@ export default class HayaSelectSystemTestHelper {
|
|
|
152
221
|
throw new Error("Expected value, text, or index when selecting an option");
|
|
153
222
|
}
|
|
154
223
|
}
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zeXN0ZW0tdGVzdC1oZWxwZXJzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sT0FBTyxNQUFNLDRCQUE0QixDQUFBO0FBQ2hELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUVyQyx3RkFBd0Y7QUFFeEY7O0dBRUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qyx5REFBeUQ7SUFDekQsWUFBWSxPQUFPO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDckYsQ0FBQztRQUVELE1BQU0sRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsT0FBTyxDQUFBO1FBQ2pELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQy9GLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLGlCQUFpQixNQUFNLElBQUksQ0FBQTtRQUMvQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSw4QkFBOEIsQ0FBQTtRQUMzRSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxnREFBZ0QsQ0FBQTtRQUNwRyxJQUFJLENBQUMsdUJBQXVC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TSxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUM3QixNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7b0JBRWxELElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO3dCQUN4QixNQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTt3QkFDcEIsT0FBTTtvQkFDUixDQUFDO2dCQUNILENBQUM7Z0JBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUN2RCxDQUFDLENBQUMsQ0FBQTtZQUNGLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFBO0lBQzVFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB3YWl0Rm9yIGZyb20gXCJhd2FpdGVyeS9idWlsZC93YWl0LWZvci5qc1wiXG5pbXBvcnQge0J5fSBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyXCJcblxuLyoqIEB0eXBlZGVmIHt7c3lzdGVtVGVzdDogb2JqZWN0LCB0ZXN0SWQ6IHN0cmluZ319IEhheWFTZWxlY3RTeXN0ZW1UZXN0SGVscGVyT3B0aW9ucyAqL1xuXG4vKipcbiAqIFN5c3RlbSB0ZXN0IGhlbHBlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIYXlhU2VsZWN0IGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGF5YVNlbGVjdFN5c3RlbVRlc3RIZWxwZXIge1xuICAvKiogQHBhcmFtIHtIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlck9wdGlvbnN9IG9wdGlvbnMgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvcHRpb25zIGZvciBIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlciwgZ290OiAke29wdGlvbnN9YClcbiAgICB9XG5cbiAgICBjb25zdCB7c3lzdGVtVGVzdCwgdGVzdElkLCAuLi5yZXN0QXJnc30gPSBvcHRpb25zXG4gICAgY29uc3QgZXh0cmFLZXlzID0gT2JqZWN0LmtleXMocmVzdEFyZ3MpXG5cbiAgICBpZiAoZXh0cmFLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBvcHRpb25zIGZvciBIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlcjogJHtleHRyYUtleXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgdGhpcy5zeXN0ZW1UZXN0ID0gc3lzdGVtVGVzdFxuICAgIHRoaXMudGVzdElkID0gdGVzdElkXG4gICAgdGhpcy5yb290U2VsZWN0b3IgPSBgW2RhdGEtdGVzdGlkPScke3Rlc3RJZH0nXWBcbiAgICB0aGlzLmNvbXBvbmVudFNlbGVjdG9yID0gYCR7dGhpcy5yb290U2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3QnXWBcbiAgICB0aGlzLmNoZXZyb25Db250YWluZXJTZWxlY3RvciA9IGAke3RoaXMucm9vdFNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L2NoZXZyb24tY29udGFpbmVyJ11gXG4gICAgdGhpcy5zZWxlY3RDb250YWluZXJTZWxlY3RvciA9IGAke3RoaXMucm9vdFNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L3NlbGVjdC1jb250YWluZXInXWBcbiAgICB0aGlzLnNlYXJjaElucHV0U2VsZWN0b3IgPSBgJHt0aGlzLnJvb3RTZWxlY3Rvcn0gW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9zZWFyY2gtaW5wdXQnXWBcbiAgICB0aGlzLm9wdGlvbnNDb250YWluZXJTZWxlY3RvckZhbGxiYWNrID0gXCJbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L29wdGlvbnMtY29udGFpbmVyJ11cIlxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBvcGVuKCkge1xuICAgIGF3YWl0IHRoaXMuY2xpY2tTZWxlY3RDb250YWluZXIoKVxuICAgIHRoaXMuX29wdGlvbnNDb250YWluZXJTZWxlY3RvciA9IG51bGxcblxuICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IDUwMDB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvcGVuZWRFbGVtZW50cyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKGAke3RoaXMuY29tcG9uZW50U2VsZWN0b3J9W2RhdGEtb3BlbmVkPSd0cnVlJ11gKVxuXG4gICAgICBpZiAob3BlbmVkRWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgSGF5YVNlbGVjdCB0byBvcGVuOiAke3RoaXMudGVzdElkfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgYXdhaXQgdGhpcy5jbGlja1NlbGVjdENvbnRhaW5lcigpXG5cbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiA1MDAwfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgb3BlbmVkRWxlbWVudHMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHt0aGlzLmNvbXBvbmVudFNlbGVjdG9yfVtkYXRhLW9wZW5lZD0ndHJ1ZSddYClcblxuICAgICAgaWYgKG9wZW5lZEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBIYXlhU2VsZWN0IHRvIGNsb3NlOiAke3RoaXMudGVzdElkfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gKi9cbiAgYXN5bmMgaXNPcGVuKCkge1xuICAgIGNvbnN0IG9wZW5lZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7dGhpcy5jb21wb25lbnRTZWxlY3Rvcn1bZGF0YS1vcGVuZWQ9J3RydWUnXWApXG5cbiAgICBpZiAob3BlbmVkRWxlbWVudHMubGVuZ3RoID4gMCkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IHNlYXJjaElucHV0cyA9IGF3YWl0IHRoaXMuZmluZFZpc2libGVFbGVtZW50cyh0aGlzLnNlYXJjaElucHV0U2VsZWN0b3IpXG5cbiAgICByZXR1cm4gc2VhcmNoSW5wdXRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgY2xpY2tTZWxlY3RDb250YWluZXIoKSB7XG4gICAgY29uc3Qgc2VsZWN0Q29udGFpbmVyID0gYXdhaXQgdGhpcy5zeXN0ZW1UZXN0LmZpbmQodGhpcy5zZWxlY3RDb250YWluZXJTZWxlY3Rvciwge3RpbWVvdXQ6IDUwMDB9KVxuXG4gICAgYXdhaXQgc2VsZWN0Q29udGFpbmVyLmNsaWNrKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRFbGVtZW50cyhzZWxlY3Rvcikge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnN5c3RlbVRlc3QuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnRzKEJ5LmNzcyhzZWxlY3RvcikpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pj59XG4gICAqL1xuICBhc3luYyBmaW5kVmlzaWJsZUVsZW1lbnRzKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhzZWxlY3RvcilcbiAgICBjb25zdCB2aXNpYmxlRWxlbWVudHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICBpZiAoYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpKSB7XG4gICAgICAgIHZpc2libGVFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZpc2libGVFbGVtZW50c1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59ICovXG4gIGFzeW5jIG9wdGlvbnNDb250YWluZXJTZWxlY3RvcigpIHtcbiAgICBpZiAodGhpcy5fb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKSByZXR1cm4gdGhpcy5fb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yXG5cbiAgICBjb25zdCByb290RWxlbWVudHMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyh0aGlzLnJvb3RTZWxlY3RvcilcbiAgICBjb25zdCByb290SWQgPSByb290RWxlbWVudHMubGVuZ3RoID4gMCA/IGF3YWl0IHJvb3RFbGVtZW50c1swXS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpIDogbnVsbFxuICAgIGxldCBlbGVtZW50cyA9IHJvb3RFbGVtZW50c1xuXG4gICAgaWYgKCFyb290SWQpIHtcbiAgICAgIGVsZW1lbnRzID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHModGhpcy5jb21wb25lbnRTZWxlY3RvcilcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHJvb3RJZCB8fCAoZWxlbWVudHMubGVuZ3RoID4gMCA/IGF3YWl0IGVsZW1lbnRzWzBdLmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIikgOiBudWxsKVxuXG4gICAgdGhpcy5fb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gaWQgPyBgW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9vcHRpb25zLWNvbnRhaW5lciddW2RhdGEtaWQ9JyR7aWR9J11gIDogdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3JGYWxsYmFja1xuXG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnNDb250YWluZXJTZWxlY3RvclxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gKi9cbiAgYXN5bmMgb3B0aW9uVGV4dHMoKSB7XG4gICAgY29uc3Qgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gYXdhaXQgdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IoKVxuICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9uJ11gKVxuXG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKG9wdGlvbnMubWFwKGFzeW5jIChvcHRpb24pID0+IChhd2FpdCBvcHRpb24uZ2V0VGV4dCgpKS50cmltKCkpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7e2luZGV4PzogbnVtYmVyLCB0ZXh0Pzogc3RyaW5nLCB2YWx1ZT86IHN0cmluZ3xudW1iZXJ9fSBjcml0ZXJpYVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNlbGVjdE9wdGlvbih7aW5kZXgsIHRleHQsIHZhbHVlLCAuLi5yZXN0QXJnc30gPSB7fSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBjcml0ZXJpYSBmb3Igc2VsZWN0T3B0aW9uLCBnb3Q6IHVuZGVmaW5lZFwiKVxuICAgIH1cblxuICAgIGNvbnN0IGV4dHJhS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKGV4dHJhS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc2VsZWN0T3B0aW9uIGNyaXRlcmlhOiAke2V4dHJhS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IDUwMDB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNDb250YWluZXJTZWxlY3RvciA9IGF3YWl0IHRoaXMub3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKClcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKGAke29wdGlvbnNDb250YWluZXJTZWxlY3Rvcn0gW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9vcHRpb24nXVtkYXRhLXZhbHVlPScke3ZhbHVlfSddYClcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9uc1swXVxuXG4gICAgICAgIGlmICghb3B0aW9uKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBvcHRpb24gZm9yIHZhbHVlOiAke3ZhbHVlfWApXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBvcHRpb24uY2xpY2soKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5kZXggPT0gXCJudW1iZXJcIikge1xuICAgICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogNTAwMH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gYXdhaXQgdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IoKVxuICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7b3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L29wdGlvbiddYClcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9uc1tpbmRleF1cblxuICAgICAgICBpZiAoIW9wdGlvbikgdGhyb3cgbmV3IEVycm9yKGBObyBvcHRpb24gYXQgaW5kZXg6ICR7aW5kZXh9YClcblxuICAgICAgICBhd2FpdCBvcHRpb24uY2xpY2soKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0ZXh0KSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiA1MDAwfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBhd2FpdCB0aGlzLm9wdGlvbnNDb250YWluZXJTZWxlY3RvcigpXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9uJ11gKVxuXG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBvcHRpb25UZXh0ID0gKGF3YWl0IG9wdGlvbi5nZXRUZXh0KCkpLnRyaW0oKVxuXG4gICAgICAgICAgaWYgKG9wdGlvblRleHQgPT09IHRleHQpIHtcbiAgICAgICAgICAgIGF3YWl0IG9wdGlvbi5jbGljaygpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG9wdGlvbiBmb3VuZCB3aXRoIHRleHQ6ICR7dGV4dH1gKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIHZhbHVlLCB0ZXh0LCBvciBpbmRleCB3aGVuIHNlbGVjdGluZyBhbiBvcHRpb25cIilcbiAgfVxufVxuIl19
|
|
224
|
+
/**
|
|
225
|
+
* Clicks a visible HayaSelect option by backend value.
|
|
226
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
227
|
+
* @param {string | number} optionValue Backend value stored in `data-value`.
|
|
228
|
+
* @param {number} timeout Maximum wait in milliseconds.
|
|
229
|
+
* @param {string} [optionsContainerSelector] Options container selector to scope the lookup.
|
|
230
|
+
* @returns {Promise<void>} Completes after the matching visible option is clicked.
|
|
231
|
+
*/
|
|
232
|
+
async function clickVisibleSelectOptionByValue(systemTest, optionValue, timeout, optionsContainerSelector = "") {
|
|
233
|
+
const selector = `${optionsContainerSelector ? `${optionsContainerSelector} ` : ""}[data-testid="haya-select/option"][data-value="${cssAttributeValue(optionValue)}"]`;
|
|
234
|
+
const element = await findVisibleElement(systemTest, selector, timeout);
|
|
235
|
+
await element.click();
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Clicks a visible HayaSelect option by displayed text.
|
|
239
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
240
|
+
* @param {string} expectedText Visible fragment rendered by the option.
|
|
241
|
+
* @param {number} timeout Maximum wait in milliseconds.
|
|
242
|
+
* @param {string} [optionsContainerSelector] Options container selector to scope the lookup.
|
|
243
|
+
* @returns {Promise<void>} Completes after the matching visible option is clicked.
|
|
244
|
+
*/
|
|
245
|
+
async function clickVisibleSelectOptionByText(systemTest, expectedText, timeout, optionsContainerSelector = "") {
|
|
246
|
+
const element = /** @type {WebElement} */ (await systemTest.getDriver().wait(async () => {
|
|
247
|
+
const selector = `${optionsContainerSelector ? `${optionsContainerSelector} ` : ""}[data-testid='haya-select/option']`;
|
|
248
|
+
const optionElements = await systemTest.getDriver().findElements(By.css(selector));
|
|
249
|
+
for (const optionElement of optionElements) {
|
|
250
|
+
if (!(await optionElement.isDisplayed())) {
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
const actualText = await optionElement.getText();
|
|
254
|
+
if (actualText.includes(expectedText)) {
|
|
255
|
+
return optionElement;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return false;
|
|
259
|
+
}, timeout, `Timed out waiting for visible select option text ${expectedText}`));
|
|
260
|
+
await element.click();
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Finds a visible element by CSS selector.
|
|
264
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
265
|
+
* @param {string} selector CSS query that can match one or more nodes.
|
|
266
|
+
* @param {number} timeout Maximum wait in milliseconds.
|
|
267
|
+
* @returns {Promise<WebElement>} First displayed match.
|
|
268
|
+
*/
|
|
269
|
+
async function findVisibleElement(systemTest, selector, timeout) {
|
|
270
|
+
const element = await systemTest.getDriver().wait(async () => {
|
|
271
|
+
const elements = await systemTest.getDriver().findElements(By.css(selector));
|
|
272
|
+
for (const element of elements) {
|
|
273
|
+
if (await element.isDisplayed()) {
|
|
274
|
+
return element;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return false;
|
|
278
|
+
}, timeout, `Timed out waiting for visible selector ${selector}`);
|
|
279
|
+
return /** @type {WebElement} */ (element);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Builds a data-testid CSS selector.
|
|
283
|
+
* @param {string} testId Raw value from the component's `testID` prop.
|
|
284
|
+
* @returns {string} Attribute selector for the value.
|
|
285
|
+
*/
|
|
286
|
+
function testIdSelector(testId) {
|
|
287
|
+
return `[data-testid="${cssAttributeValue(testId)}"]`;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Escapes a value for use inside a double-quoted CSS attribute selector.
|
|
291
|
+
* @param {string | number} value Raw attribute value to interpolate.
|
|
292
|
+
* @returns {string} String safe for a double-quoted attribute selector.
|
|
293
|
+
*/
|
|
294
|
+
function cssAttributeValue(value) {
|
|
295
|
+
return String(value).replaceAll("\\", "\\\\").replaceAll('"', '\\"');
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zeXN0ZW0tdGVzdC1oZWxwZXJzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sT0FBTyxNQUFNLDRCQUE0QixDQUFBO0FBQ2hELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUVyQyx3RkFBd0Y7QUFDeEYsaUtBQWlLO0FBQ2pLLHNHQUFzRztBQUN0RywwRUFBMEU7QUFDMUUsb0VBQW9FO0FBRXBFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQTtBQUU1Qjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEdBQUcsS0FBSyxFQUFFLE9BQU8sR0FBRyxlQUFlLEVBQUUsZUFBZSxHQUFHLElBQUksRUFBQztJQUN6SixNQUFNLE1BQU0sR0FBRyxJQUFJLDBCQUEwQixDQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7SUFDbkUsTUFBTSxhQUFhLEdBQUcsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxFQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUFBO0lBQ3ZHLE1BQU0sYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBRTNCLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUNqRSxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUFBO1FBQ25HLE1B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QUssRUFBRSxDQUFBO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPO0lBQzdELE1BQU0sT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FDL0MsS0FBSyxJQUFJLEVBQUU7UUFDVCxNQUFNLFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBRTVFLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7WUFDL0IsSUFBSSxNQUFNLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLE9BQU8sQ0FBQTtZQUNoQixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQyxFQUNELE9BQU8sRUFDUCwwQ0FBMEMsUUFBUSxFQUFFLENBQ3JELENBQUE7SUFFRCxPQUFPLHlCQUF5QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDNUMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxNQUFNO0lBQzVCLE9BQU8saUJBQWlCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUE7QUFDdkQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQUs7SUFDOUIsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO0FBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgd2FpdEZvciBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvd2FpdC1mb3IuanNcIlxuaW1wb3J0IHtCeX0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5cbi8qKiBAdHlwZWRlZiB7e3N5c3RlbVRlc3Q6IG9iamVjdCwgdGVzdElkOiBzdHJpbmd9fSBIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlck9wdGlvbnMgKi9cbi8qKiBAdHlwZWRlZiB7e29wdGlvblRleHQ/OiBzdHJpbmcsIG9wdGlvblZhbHVlPzogc3RyaW5nIHwgbnVtYmVyLCBzZWFyY2g/OiBib29sZWFuLCB0aW1lb3V0PzogbnVtYmVyLCB1c2VCYXNlU2VsZWN0b3I/OiBib29sZWFufX0gUGlja0hheWFTZWxlY3RPcHRpb25PcHRpb25zICovXG4vKiogQHR5cGVkZWYge3tvcHRpb25WYWx1ZTogc3RyaW5nIHwgbnVtYmVyLCB0aW1lb3V0PzogbnVtYmVyfX0gQ2xpY2tWaXNpYmxlSGF5YVNlbGVjdE9wdGlvbk9wdGlvbnMgKi9cbi8qKiBAdHlwZWRlZiB7e3RpbWVvdXQ/OiBudW1iZXJ9fSBFeHBlY3RIYXlhU2VsZWN0Q3VycmVudE9wdGlvbnNPcHRpb25zICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBXZWJFbGVtZW50ICovXG5cbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IDUwMDBcblxuLyoqXG4gKiBTZWxlY3RzIGFuIG9wdGlvbiBpbiBhIEhheWFTZWxlY3QgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gc3lzdGVtVGVzdCBCcm93c2VyIHNlc3Npb24gdXNlZCBieSB0aGUgcnVubmluZyBzcGVjLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBXcmFwcGVyIGBkYXRhLXRlc3RpZGAgYXJvdW5kIHRoZSBzZWxlY3QuXG4gKiBAcGFyYW0ge1BpY2tIYXlhU2VsZWN0T3B0aW9uT3B0aW9uc30gb3B0aW9ucyBUZXh0L3ZhbHVlIHRvIGNob29zZSBhbmQgd2hldGhlciB0byB0eXBlIGludG8gdGhlIHNlYXJjaCBmaWVsZCBmaXJzdC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBDb21wbGV0ZXMgYWZ0ZXIgdGhlIG1hdGNoaW5nIHZpc2libGUgb3B0aW9uIGlzIGNsaWNrZWQuXG4gKiBAcmVqZWN0cyB7RXJyb3J9IFdoZW4gbmVpdGhlciB0ZXh0IG5vciB2YWx1ZSBpcyBzdXBwbGllZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBpY2tIYXlhU2VsZWN0T3B0aW9uKHN5c3RlbVRlc3QsIHRlc3RJZCwge29wdGlvblRleHQsIG9wdGlvblZhbHVlLCBzZWFyY2ggPSBmYWxzZSwgdGltZW91dCA9IERFRkFVTFRfVElNRU9VVCwgdXNlQmFzZVNlbGVjdG9yID0gdHJ1ZX0pIHtcbiAgY29uc3QgaGVscGVyID0gbmV3IEhheWFTZWxlY3RTeXN0ZW1UZXN0SGVscGVyKHtzeXN0ZW1UZXN0LCB0ZXN0SWR9KVxuICBjb25zdCBzZWxlY3RFbGVtZW50ID0gYXdhaXQgc3lzdGVtVGVzdC5maW5kKGhlbHBlci5zZWxlY3RDb250YWluZXJTZWxlY3Rvciwge3RpbWVvdXQsIHVzZUJhc2VTZWxlY3Rvcn0pXG4gIGF3YWl0IHNlbGVjdEVsZW1lbnQuY2xpY2soKVxuXG4gIGlmIChzZWFyY2gpIHtcbiAgICBpZiAoIW9wdGlvblRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb3B0aW9uVGV4dCB3aGVuIHNlYXJjaGluZyAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaEVsZW1lbnQgPSBhd2FpdCBzeXN0ZW1UZXN0LmZpbmQoaGVscGVyLnNlYXJjaElucHV0U2VsZWN0b3IsIHt0aW1lb3V0LCB1c2VCYXNlU2VsZWN0b3J9KVxuICAgIGF3YWl0IHNlYXJjaEVsZW1lbnQuc2VuZEtleXMob3B0aW9uVGV4dClcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnNDb250YWluZXJTZWxlY3RvciA9IGF3YWl0IGhlbHBlci5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IoKVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9uVmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBhd2FpdCBjbGlja1Zpc2libGVTZWxlY3RPcHRpb25CeVZhbHVlKHN5c3RlbVRlc3QsIG9wdGlvblZhbHVlLCB0aW1lb3V0LCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAob3B0aW9uVGV4dCkge1xuICAgIGF3YWl0IGNsaWNrVmlzaWJsZVNlbGVjdE9wdGlvbkJ5VGV4dChzeXN0ZW1UZXN0LCBvcHRpb25UZXh0LCB0aW1lb3V0LCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9wdGlvblZhbHVlIG9yIG9wdGlvblRleHQgZm9yICR7dGVzdElkfWApXG59XG5cbi8qKlxuICogQ2xpY2tzIGFuIG9wdGlvbiBpbiBhbiBhbHJlYWR5LW9wZW4gSGF5YVNlbGVjdCBkcm9wZG93bi5cbiAqIEBwYXJhbSB7b2JqZWN0fSBzeXN0ZW1UZXN0IEJyb3dzZXIgc2Vzc2lvbiB1c2VkIGJ5IHRoZSBydW5uaW5nIHNwZWMuXG4gKiBAcGFyYW0ge0NsaWNrVmlzaWJsZUhheWFTZWxlY3RPcHRpb25PcHRpb25zfSBvcHRpb25zIE9wdGlvbiB2YWx1ZSB0byBjaG9vc2UuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQ29tcGxldGVzIGFmdGVyIHRoZSBtYXRjaGluZyB2aXNpYmxlIG9wdGlvbiBpcyBjbGlja2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xpY2tWaXNpYmxlSGF5YVNlbGVjdE9wdGlvbihzeXN0ZW1UZXN0LCB7b3B0aW9uVmFsdWUsIHRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVR9KSB7XG4gIGF3YWl0IGNsaWNrVmlzaWJsZVNlbGVjdE9wdGlvbkJ5VmFsdWUoc3lzdGVtVGVzdCwgb3B0aW9uVmFsdWUsIHRpbWVvdXQpXG59XG5cbi8qKlxuICogV2FpdHMgdW50aWwgYSBIYXlhU2VsZWN0IHJlbmRlcnMgZXhhY3RseSB0aGUgZXhwZWN0ZWQgY3VycmVudC1vcHRpb24gbGFiZWxzLlxuICogQHBhcmFtIHtvYmplY3R9IHN5c3RlbVRlc3QgQnJvd3NlciBzZXNzaW9uIHVzZWQgYnkgdGhlIHJ1bm5pbmcgc3BlYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgV3JhcHBlciBgZGF0YS10ZXN0aWRgIGFyb3VuZCB0aGUgc2VsZWN0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gZXhwZWN0ZWRUZXh0cyBDdXJyZW50IG9wdGlvbiB0ZXh0IGZyYWdtZW50cyBpbiByZW5kZXJlZCBvcmRlci5cbiAqIEBwYXJhbSB7RXhwZWN0SGF5YVNlbGVjdEN1cnJlbnRPcHRpb25zT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbmFsIFNlbGVuaXVtIHRpbWVvdXQgb3ZlcnJpZGUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQ29tcGxldGVzIGFmdGVyIHRoZSBjdXJyZW50IG9wdGlvbnMgbWF0Y2guXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBlY3RIYXlhU2VsZWN0Q3VycmVudE9wdGlvbnMoc3lzdGVtVGVzdCwgdGVzdElkLCBleHBlY3RlZFRleHRzLCB7dGltZW91dCA9IERFRkFVTFRfVElNRU9VVH0gPSB7fSkge1xuICBjb25zdCBzZWxlY3RvciA9IGAke3Rlc3RJZFNlbGVjdG9yKHRlc3RJZCl9IFtkYXRhLXRlc3RpZD1cImhheWEtc2VsZWN0L2N1cnJlbnQtb3B0aW9uXCJdYFxuICBhd2FpdCBzeXN0ZW1UZXN0LmdldERyaXZlcigpLndhaXQoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCBzeXN0ZW1UZXN0LmdldERyaXZlcigpLmZpbmRFbGVtZW50cyhCeS5jc3Moc2VsZWN0b3IpKVxuICAgICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICAgIGNvbnN0IHZpc2libGVUZXh0cyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpKSB7XG4gICAgICAgICAgdmlzaWJsZVRleHRzLnB1c2goYXdhaXQgZWxlbWVudC5nZXRUZXh0KCkpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHZpc2libGVUZXh0cy5sZW5ndGggIT09IGV4cGVjdGVkVGV4dHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhwZWN0ZWRUZXh0cy5ldmVyeSgoZXhwZWN0ZWRUZXh0LCBpbmRleCkgPT4gdmlzaWJsZVRleHRzW2luZGV4XT8uaW5jbHVkZXMoZXhwZWN0ZWRUZXh0KSlcbiAgICB9LFxuICAgIHRpbWVvdXQsXG4gICAgYFRpbWVkIG91dCB3YWl0aW5nIGZvciAke3Rlc3RJZH0gY3VycmVudCBvcHRpb25zOiAke2V4cGVjdGVkVGV4dHMuam9pbihcIiwgXCIpfWBcbiAgKVxufVxuXG4vKipcbiAqIFN5c3RlbSB0ZXN0IGhlbHBlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIYXlhU2VsZWN0IGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGF5YVNlbGVjdFN5c3RlbVRlc3RIZWxwZXIge1xuICAvKiogQHBhcmFtIHtIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlck9wdGlvbnN9IG9wdGlvbnMgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvcHRpb25zIGZvciBIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlciwgZ290OiAke29wdGlvbnN9YClcbiAgICB9XG5cbiAgICBjb25zdCB7c3lzdGVtVGVzdCwgdGVzdElkLCAuLi5yZXN0QXJnc30gPSBvcHRpb25zXG4gICAgY29uc3QgZXh0cmFLZXlzID0gT2JqZWN0LmtleXMocmVzdEFyZ3MpXG5cbiAgICBpZiAoZXh0cmFLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBvcHRpb25zIGZvciBIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlcjogJHtleHRyYUtleXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgdGhpcy5zeXN0ZW1UZXN0ID0gc3lzdGVtVGVzdFxuICAgIHRoaXMudGVzdElkID0gdGVzdElkXG4gICAgdGhpcy5yb290U2VsZWN0b3IgPSB0ZXN0SWRTZWxlY3Rvcih0ZXN0SWQpXG4gICAgdGhpcy5jb21wb25lbnRTZWxlY3RvciA9IGAke3RoaXMucm9vdFNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0J11gXG4gICAgdGhpcy5jaGV2cm9uQ29udGFpbmVyU2VsZWN0b3IgPSBgJHt0aGlzLnJvb3RTZWxlY3Rvcn0gW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9jaGV2cm9uLWNvbnRhaW5lciddYFxuICAgIHRoaXMuc2VsZWN0Q29udGFpbmVyU2VsZWN0b3IgPSBgJHt0aGlzLnJvb3RTZWxlY3Rvcn0gW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9zZWxlY3QtY29udGFpbmVyJ11gXG4gICAgdGhpcy5zZWFyY2hJbnB1dFNlbGVjdG9yID0gYCR7dGhpcy5yb290U2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvc2VhcmNoLWlucHV0J11gXG4gICAgdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3JGYWxsYmFjayA9IFwiW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9vcHRpb25zLWNvbnRhaW5lciddXCJcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgb3BlbigpIHtcbiAgICBhd2FpdCB0aGlzLmNsaWNrU2VsZWN0Q29udGFpbmVyKClcbiAgICB0aGlzLl9vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBudWxsXG5cbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiA1MDAwfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgb3BlbmVkRWxlbWVudHMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHt0aGlzLmNvbXBvbmVudFNlbGVjdG9yfVtkYXRhLW9wZW5lZD0ndHJ1ZSddYClcblxuICAgICAgaWYgKG9wZW5lZEVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIEhheWFTZWxlY3QgdG8gb3BlbjogJHt0aGlzLnRlc3RJZH1gKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIGF3YWl0IHRoaXMuY2xpY2tTZWxlY3RDb250YWluZXIoKVxuXG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogNTAwMH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9wZW5lZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7dGhpcy5jb21wb25lbnRTZWxlY3Rvcn1bZGF0YS1vcGVuZWQ9J3RydWUnXWApXG5cbiAgICAgIGlmIChvcGVuZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgSGF5YVNlbGVjdCB0byBjbG9zZTogJHt0aGlzLnRlc3RJZH1gKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59ICovXG4gIGFzeW5jIGlzT3BlbigpIHtcbiAgICBjb25zdCBvcGVuZWRFbGVtZW50cyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKGAke3RoaXMuY29tcG9uZW50U2VsZWN0b3J9W2RhdGEtb3BlbmVkPSd0cnVlJ11gKVxuXG4gICAgaWYgKG9wZW5lZEVsZW1lbnRzLmxlbmd0aCA+IDApIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBzZWFyY2hJbnB1dHMgPSBhd2FpdCB0aGlzLmZpbmRWaXNpYmxlRWxlbWVudHModGhpcy5zZWFyY2hJbnB1dFNlbGVjdG9yKVxuXG4gICAgcmV0dXJuIHNlYXJjaElucHV0cy5sZW5ndGggPiAwXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGNsaWNrU2VsZWN0Q29udGFpbmVyKCkge1xuICAgIGNvbnN0IHNlbGVjdENvbnRhaW5lciA9IGF3YWl0IHRoaXMuc3lzdGVtVGVzdC5maW5kKHRoaXMuc2VsZWN0Q29udGFpbmVyU2VsZWN0b3IsIHt0aW1lb3V0OiA1MDAwfSlcblxuICAgIGF3YWl0IHNlbGVjdENvbnRhaW5lci5jbGljaygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pj59XG4gICAqL1xuICBhc3luYyBmaW5kRWxlbWVudHMoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zeXN0ZW1UZXN0LmdldERyaXZlcigpLmZpbmRFbGVtZW50cyhCeS5jc3Moc2VsZWN0b3IpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD4+fVxuICAgKi9cbiAgYXN5bmMgZmluZFZpc2libGVFbGVtZW50cyhzZWxlY3Rvcikge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoc2VsZWN0b3IpXG4gICAgY29uc3QgdmlzaWJsZUVsZW1lbnRzID0gW11cblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgaWYgKGF3YWl0IGVsZW1lbnQuaXNEaXNwbGF5ZWQoKSkge1xuICAgICAgICB2aXNpYmxlRWxlbWVudHMucHVzaChlbGVtZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2aXNpYmxlRWxlbWVudHNcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IoKSB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnNDb250YWluZXJTZWxlY3RvcikgcmV0dXJuIHRoaXMuX29wdGlvbnNDb250YWluZXJTZWxlY3RvclxuXG4gICAgY29uc3Qgcm9vdEVsZW1lbnRzID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHModGhpcy5yb290U2VsZWN0b3IpXG4gICAgY29uc3Qgcm9vdElkID0gcm9vdEVsZW1lbnRzLmxlbmd0aCA+IDAgPyBhd2FpdCByb290RWxlbWVudHNbMF0uZ2V0QXR0cmlidXRlKFwiZGF0YS1pZFwiKSA6IG51bGxcbiAgICBsZXQgZWxlbWVudHMgPSByb290RWxlbWVudHNcblxuICAgIGlmICghcm9vdElkKSB7XG4gICAgICBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKHRoaXMuY29tcG9uZW50U2VsZWN0b3IpXG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSByb290SWQgfHwgKGVsZW1lbnRzLmxlbmd0aCA+IDAgPyBhd2FpdCBlbGVtZW50c1swXS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpIDogbnVsbClcblxuICAgIHRoaXMuX29wdGlvbnNDb250YWluZXJTZWxlY3RvciA9IGlkID8gYFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9ucy1jb250YWluZXInXVtkYXRhLWlkPVwiJHtjc3NBdHRyaWJ1dGVWYWx1ZShpZCl9XCJdYCA6IHRoaXMub3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yRmFsbGJhY2tcblxuICAgIHJldHVybiB0aGlzLl9vcHRpb25zQ29udGFpbmVyU2VsZWN0b3JcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59ICovXG4gIGFzeW5jIG9wdGlvblRleHRzKCkge1xuICAgIGNvbnN0IG9wdGlvbnNDb250YWluZXJTZWxlY3RvciA9IGF3YWl0IHRoaXMub3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKClcbiAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7b3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L29wdGlvbiddYClcblxuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChvcHRpb25zLm1hcChhc3luYyAob3B0aW9uKSA9PiAoYXdhaXQgb3B0aW9uLmdldFRleHQoKSkudHJpbSgpKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3tpbmRleD86IG51bWJlciwgdGV4dD86IHN0cmluZywgdmFsdWU/OiBzdHJpbmd8bnVtYmVyfX0gY3JpdGVyaWFcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzZWxlY3RPcHRpb24oe2luZGV4LCB0ZXh0LCB2YWx1ZSwgLi4ucmVzdEFyZ3N9ID0ge30pIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgY3JpdGVyaWEgZm9yIHNlbGVjdE9wdGlvbiwgZ290OiB1bmRlZmluZWRcIilcbiAgICB9XG5cbiAgICBjb25zdCBleHRyYUtleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChleHRyYUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHNlbGVjdE9wdGlvbiBjcml0ZXJpYTogJHtleHRyYUtleXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiA1MDAwfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBhd2FpdCB0aGlzLm9wdGlvbnNDb250YWluZXJTZWxlY3RvcigpXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9uJ11bZGF0YS12YWx1ZT1cIiR7Y3NzQXR0cmlidXRlVmFsdWUodmFsdWUpfVwiXWApXG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IG9wdGlvbnNbMF1cblxuICAgICAgICBpZiAoIW9wdGlvbikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gb3B0aW9uIGZvciB2YWx1ZTogJHt2YWx1ZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgb3B0aW9uLmNsaWNrKClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluZGV4ID09IFwibnVtYmVyXCIpIHtcbiAgICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IDUwMDB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNDb250YWluZXJTZWxlY3RvciA9IGF3YWl0IHRoaXMub3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKClcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKGAke29wdGlvbnNDb250YWluZXJTZWxlY3Rvcn0gW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9vcHRpb24nXWApXG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IG9wdGlvbnNbaW5kZXhdXG5cbiAgICAgICAgaWYgKCFvcHRpb24pIHRocm93IG5ldyBFcnJvcihgTm8gb3B0aW9uIGF0IGluZGV4OiAke2luZGV4fWApXG5cbiAgICAgICAgYXdhaXQgb3B0aW9uLmNsaWNrKClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGV4dCkge1xuICAgICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogNTAwMH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gYXdhaXQgdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IoKVxuICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7b3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L29wdGlvbiddYClcblxuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgY29uc3Qgb3B0aW9uVGV4dCA9IChhd2FpdCBvcHRpb24uZ2V0VGV4dCgpKS50cmltKClcblxuICAgICAgICAgIGlmIChvcHRpb25UZXh0ID09PSB0ZXh0KSB7XG4gICAgICAgICAgICBhd2FpdCBvcHRpb24uY2xpY2soKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBvcHRpb24gZm91bmQgd2l0aCB0ZXh0OiAke3RleHR9YClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCB2YWx1ZSwgdGV4dCwgb3IgaW5kZXggd2hlbiBzZWxlY3RpbmcgYW4gb3B0aW9uXCIpXG4gIH1cbn1cblxuLyoqXG4gKiBDbGlja3MgYSB2aXNpYmxlIEhheWFTZWxlY3Qgb3B0aW9uIGJ5IGJhY2tlbmQgdmFsdWUuXG4gKiBAcGFyYW0ge29iamVjdH0gc3lzdGVtVGVzdCBCcm93c2VyIHNlc3Npb24gdXNlZCBieSB0aGUgcnVubmluZyBzcGVjLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IG9wdGlvblZhbHVlIEJhY2tlbmQgdmFsdWUgc3RvcmVkIGluIGBkYXRhLXZhbHVlYC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IE1heGltdW0gd2FpdCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnNDb250YWluZXJTZWxlY3Rvcl0gT3B0aW9ucyBjb250YWluZXIgc2VsZWN0b3IgdG8gc2NvcGUgdGhlIGxvb2t1cC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBDb21wbGV0ZXMgYWZ0ZXIgdGhlIG1hdGNoaW5nIHZpc2libGUgb3B0aW9uIGlzIGNsaWNrZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNsaWNrVmlzaWJsZVNlbGVjdE9wdGlvbkJ5VmFsdWUoc3lzdGVtVGVzdCwgb3B0aW9uVmFsdWUsIHRpbWVvdXQsIG9wdGlvbnNDb250YWluZXJTZWxlY3RvciA9IFwiXCIpIHtcbiAgY29uc3Qgc2VsZWN0b3IgPSBgJHtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPyBgJHtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3J9IGAgOiBcIlwifVtkYXRhLXRlc3RpZD1cImhheWEtc2VsZWN0L29wdGlvblwiXVtkYXRhLXZhbHVlPVwiJHtjc3NBdHRyaWJ1dGVWYWx1ZShvcHRpb25WYWx1ZSl9XCJdYFxuICBjb25zdCBlbGVtZW50ID0gYXdhaXQgZmluZFZpc2libGVFbGVtZW50KHN5c3RlbVRlc3QsIHNlbGVjdG9yLCB0aW1lb3V0KVxuICBhd2FpdCBlbGVtZW50LmNsaWNrKClcbn1cblxuLyoqXG4gKiBDbGlja3MgYSB2aXNpYmxlIEhheWFTZWxlY3Qgb3B0aW9uIGJ5IGRpc3BsYXllZCB0ZXh0LlxuICogQHBhcmFtIHtvYmplY3R9IHN5c3RlbVRlc3QgQnJvd3NlciBzZXNzaW9uIHVzZWQgYnkgdGhlIHJ1bm5pbmcgc3BlYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVmlzaWJsZSBmcmFnbWVudCByZW5kZXJlZCBieSB0aGUgb3B0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgTWF4aW11bSB3YWl0IGluIG1pbGxpc2Vjb25kcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yXSBPcHRpb25zIGNvbnRhaW5lciBzZWxlY3RvciB0byBzY29wZSB0aGUgbG9va3VwLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IENvbXBsZXRlcyBhZnRlciB0aGUgbWF0Y2hpbmcgdmlzaWJsZSBvcHRpb24gaXMgY2xpY2tlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2xpY2tWaXNpYmxlU2VsZWN0T3B0aW9uQnlUZXh0KHN5c3RlbVRlc3QsIGV4cGVjdGVkVGV4dCwgdGltZW91dCwgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gXCJcIikge1xuICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtXZWJFbGVtZW50fSAqLyAoXG4gICAgYXdhaXQgc3lzdGVtVGVzdC5nZXREcml2ZXIoKS53YWl0KFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9IGAke29wdGlvbnNDb250YWluZXJTZWxlY3RvciA/IGAke29wdGlvbnNDb250YWluZXJTZWxlY3Rvcn0gYCA6IFwiXCJ9W2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9vcHRpb24nXWBcbiAgICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudHMgPSBhd2FpdCBzeXN0ZW1UZXN0LmdldERyaXZlcigpLmZpbmRFbGVtZW50cyhCeS5jc3Moc2VsZWN0b3IpKVxuXG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uRWxlbWVudCBvZiBvcHRpb25FbGVtZW50cykge1xuICAgICAgICAgIGlmICghKGF3YWl0IG9wdGlvbkVsZW1lbnQuaXNEaXNwbGF5ZWQoKSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYWN0dWFsVGV4dCA9IGF3YWl0IG9wdGlvbkVsZW1lbnQuZ2V0VGV4dCgpXG4gICAgICAgICAgaWYgKGFjdHVhbFRleHQuaW5jbHVkZXMoZXhwZWN0ZWRUZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbkVsZW1lbnRcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH0sXG4gICAgICB0aW1lb3V0LFxuICAgICAgYFRpbWVkIG91dCB3YWl0aW5nIGZvciB2aXNpYmxlIHNlbGVjdCBvcHRpb24gdGV4dCAke2V4cGVjdGVkVGV4dH1gXG4gICAgKVxuICApXG5cbiAgYXdhaXQgZWxlbWVudC5jbGljaygpXG59XG5cbi8qKlxuICogRmluZHMgYSB2aXNpYmxlIGVsZW1lbnQgYnkgQ1NTIHNlbGVjdG9yLlxuICogQHBhcmFtIHtvYmplY3R9IHN5c3RlbVRlc3QgQnJvd3NlciBzZXNzaW9uIHVzZWQgYnkgdGhlIHJ1bm5pbmcgc3BlYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBDU1MgcXVlcnkgdGhhdCBjYW4gbWF0Y2ggb25lIG9yIG1vcmUgbm9kZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBNYXhpbXVtIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMge1Byb21pc2U8V2ViRWxlbWVudD59IEZpcnN0IGRpc3BsYXllZCBtYXRjaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZFZpc2libGVFbGVtZW50KHN5c3RlbVRlc3QsIHNlbGVjdG9yLCB0aW1lb3V0KSB7XG4gIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCBzeXN0ZW1UZXN0LmdldERyaXZlcigpLndhaXQoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCBzeXN0ZW1UZXN0LmdldERyaXZlcigpLmZpbmRFbGVtZW50cyhCeS5jc3Moc2VsZWN0b3IpKVxuXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgaWYgKGF3YWl0IGVsZW1lbnQuaXNEaXNwbGF5ZWQoKSkge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcbiAgICB0aW1lb3V0LFxuICAgIGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgdmlzaWJsZSBzZWxlY3RvciAke3NlbGVjdG9yfWBcbiAgKVxuXG4gIHJldHVybiAvKiogQHR5cGUge1dlYkVsZW1lbnR9ICovIChlbGVtZW50KVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGRhdGEtdGVzdGlkIENTUyBzZWxlY3Rvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgUmF3IHZhbHVlIGZyb20gdGhlIGNvbXBvbmVudCdzIGB0ZXN0SURgIHByb3AuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBdHRyaWJ1dGUgc2VsZWN0b3IgZm9yIHRoZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gdGVzdElkU2VsZWN0b3IodGVzdElkKSB7XG4gIHJldHVybiBgW2RhdGEtdGVzdGlkPVwiJHtjc3NBdHRyaWJ1dGVWYWx1ZSh0ZXN0SWQpfVwiXWBcbn1cblxuLyoqXG4gKiBFc2NhcGVzIGEgdmFsdWUgZm9yIHVzZSBpbnNpZGUgYSBkb3VibGUtcXVvdGVkIENTUyBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdmFsdWUgUmF3IGF0dHJpYnV0ZSB2YWx1ZSB0byBpbnRlcnBvbGF0ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFN0cmluZyBzYWZlIGZvciBhIGRvdWJsZS1xdW90ZWQgYXR0cmlidXRlIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjc3NBdHRyaWJ1dGVWYWx1ZSh2YWx1ZSkge1xuICByZXR1cm4gU3RyaW5nKHZhbHVlKS5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2VBbGwoJ1wiJywgJ1xcXFxcIicpXG59XG4iXX0=
|