haya-select 1.0.116 → 1.0.118

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
- /** @typedef {{systemTest: object, testId: string}} HayaSelectSystemTestHelperOptions */
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":"AAGA,wFAAwF;AAExF;;GAEG;AACH;IACE,yDAAyD;IACzD,qBADY,iCAAiC,EAqB5C;IARC,gBAA4B;IAC5B,eAAoB;IACpB,qBAA+C;IAC/C,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;gDA9La;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC"}
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,CAW5B;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;gDA9Qa;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 = `[data-testid='${testId}']`;
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']`;
@@ -83,14 +152,10 @@ export default class HayaSelectSystemTestHelper {
83
152
  async optionsContainerSelector() {
84
153
  if (this._optionsContainerSelector)
85
154
  return this._optionsContainerSelector;
86
- const rootElements = await this.findElements(this.rootSelector);
87
- const rootId = rootElements.length > 0 ? await rootElements[0].getAttribute("data-id") : null;
88
- let elements = rootElements;
89
- if (!rootId) {
90
- elements = await this.findElements(this.componentSelector);
91
- }
92
- 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='${id}']` : this.optionsContainerSelectorFallback;
155
+ const openedElements = await this.findElements(`${this.componentSelector}[data-opened='true']`);
156
+ const componentElements = openedElements.length > 0 ? openedElements : await this.findVisibleElements(this.componentSelector);
157
+ const id = componentElements.length > 0 ? await componentElements[0].getAttribute("data-id") : null;
158
+ this._optionsContainerSelector = id ? `[data-testid='haya-select/options-container'][data-id="${cssAttributeValue(id)}"]` : this.optionsContainerSelectorFallback;
94
159
  return this._optionsContainerSelector;
95
160
  }
96
161
  /** @returns {Promise<string[]>} */
@@ -114,7 +179,7 @@ export default class HayaSelectSystemTestHelper {
114
179
  if (typeof value != "undefined") {
115
180
  await waitFor({ timeout: 5000 }, async () => {
116
181
  const optionsContainerSelector = await this.optionsContainerSelector();
117
- const options = await this.findElements(`${optionsContainerSelector} [data-testid='haya-select/option'][data-value='${value}']`);
182
+ const options = await this.findElements(`${optionsContainerSelector} [data-testid='haya-select/option'][data-value="${cssAttributeValue(value)}"]`);
118
183
  const option = options[0];
119
184
  if (!option) {
120
185
  throw new Error(`No option for value: ${value}`);
@@ -152,4 +217,77 @@ export default class HayaSelectSystemTestHelper {
152
217
  throw new Error("Expected value, text, or index when selecting an option");
153
218
  }
154
219
  }
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zeXN0ZW0tdGVzdC1oZWxwZXJzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sT0FBTyxNQUFNLDRCQUE0QixDQUFBO0FBQ2hELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUVyQyx3RkFBd0Y7QUFFeEY7O0dBRUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qyx5REFBeUQ7SUFDekQsWUFBWSxPQUFPO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDckYsQ0FBQztRQUVELE1BQU0sRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsT0FBTyxDQUFBO1FBQ2pELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQy9GLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLGlCQUFpQixNQUFNLElBQUksQ0FBQTtRQUMvQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSw4QkFBOEIsQ0FBQTtRQUMzRSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxnREFBZ0QsQ0FBQTtRQUNwRyxJQUFJLENBQUMsdUJBQXVC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TSxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUM3QixNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7b0JBRWxELElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO3dCQUN4QixNQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTt3QkFDcEIsT0FBTTtvQkFDUixDQUFDO2dCQUNILENBQUM7Z0JBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUN2RCxDQUFDLENBQUMsQ0FBQTtZQUNGLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFBO0lBQzVFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB3YWl0Rm9yIGZyb20gXCJhd2FpdGVyeS9idWlsZC93YWl0LWZvci5qc1wiXG5pbXBvcnQge0J5fSBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyXCJcblxuLyoqIEB0eXBlZGVmIHt7c3lzdGVtVGVzdDogb2JqZWN0LCB0ZXN0SWQ6IHN0cmluZ319IEhheWFTZWxlY3RTeXN0ZW1UZXN0SGVscGVyT3B0aW9ucyAqL1xuXG4vKipcbiAqIFN5c3RlbSB0ZXN0IGhlbHBlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIYXlhU2VsZWN0IGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGF5YVNlbGVjdFN5c3RlbVRlc3RIZWxwZXIge1xuICAvKiogQHBhcmFtIHtIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlck9wdGlvbnN9IG9wdGlvbnMgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvcHRpb25zIGZvciBIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlciwgZ290OiAke29wdGlvbnN9YClcbiAgICB9XG5cbiAgICBjb25zdCB7c3lzdGVtVGVzdCwgdGVzdElkLCAuLi5yZXN0QXJnc30gPSBvcHRpb25zXG4gICAgY29uc3QgZXh0cmFLZXlzID0gT2JqZWN0LmtleXMocmVzdEFyZ3MpXG5cbiAgICBpZiAoZXh0cmFLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBvcHRpb25zIGZvciBIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlcjogJHtleHRyYUtleXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgdGhpcy5zeXN0ZW1UZXN0ID0gc3lzdGVtVGVzdFxuICAgIHRoaXMudGVzdElkID0gdGVzdElkXG4gICAgdGhpcy5yb290U2VsZWN0b3IgPSBgW2RhdGEtdGVzdGlkPScke3Rlc3RJZH0nXWBcbiAgICB0aGlzLmNvbXBvbmVudFNlbGVjdG9yID0gYCR7dGhpcy5yb290U2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3QnXWBcbiAgICB0aGlzLmNoZXZyb25Db250YWluZXJTZWxlY3RvciA9IGAke3RoaXMucm9vdFNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L2NoZXZyb24tY29udGFpbmVyJ11gXG4gICAgdGhpcy5zZWxlY3RDb250YWluZXJTZWxlY3RvciA9IGAke3RoaXMucm9vdFNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L3NlbGVjdC1jb250YWluZXInXWBcbiAgICB0aGlzLnNlYXJjaElucHV0U2VsZWN0b3IgPSBgJHt0aGlzLnJvb3RTZWxlY3Rvcn0gW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9zZWFyY2gtaW5wdXQnXWBcbiAgICB0aGlzLm9wdGlvbnNDb250YWluZXJTZWxlY3RvckZhbGxiYWNrID0gXCJbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L29wdGlvbnMtY29udGFpbmVyJ11cIlxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBvcGVuKCkge1xuICAgIGF3YWl0IHRoaXMuY2xpY2tTZWxlY3RDb250YWluZXIoKVxuICAgIHRoaXMuX29wdGlvbnNDb250YWluZXJTZWxlY3RvciA9IG51bGxcblxuICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IDUwMDB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvcGVuZWRFbGVtZW50cyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKGAke3RoaXMuY29tcG9uZW50U2VsZWN0b3J9W2RhdGEtb3BlbmVkPSd0cnVlJ11gKVxuXG4gICAgICBpZiAob3BlbmVkRWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgSGF5YVNlbGVjdCB0byBvcGVuOiAke3RoaXMudGVzdElkfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgYXdhaXQgdGhpcy5jbGlja1NlbGVjdENvbnRhaW5lcigpXG5cbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiA1MDAwfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgb3BlbmVkRWxlbWVudHMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHt0aGlzLmNvbXBvbmVudFNlbGVjdG9yfVtkYXRhLW9wZW5lZD0ndHJ1ZSddYClcblxuICAgICAgaWYgKG9wZW5lZEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBIYXlhU2VsZWN0IHRvIGNsb3NlOiAke3RoaXMudGVzdElkfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gKi9cbiAgYXN5bmMgaXNPcGVuKCkge1xuICAgIGNvbnN0IG9wZW5lZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7dGhpcy5jb21wb25lbnRTZWxlY3Rvcn1bZGF0YS1vcGVuZWQ9J3RydWUnXWApXG5cbiAgICBpZiAob3BlbmVkRWxlbWVudHMubGVuZ3RoID4gMCkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IHNlYXJjaElucHV0cyA9IGF3YWl0IHRoaXMuZmluZFZpc2libGVFbGVtZW50cyh0aGlzLnNlYXJjaElucHV0U2VsZWN0b3IpXG5cbiAgICByZXR1cm4gc2VhcmNoSW5wdXRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgY2xpY2tTZWxlY3RDb250YWluZXIoKSB7XG4gICAgY29uc3Qgc2VsZWN0Q29udGFpbmVyID0gYXdhaXQgdGhpcy5zeXN0ZW1UZXN0LmZpbmQodGhpcy5zZWxlY3RDb250YWluZXJTZWxlY3Rvciwge3RpbWVvdXQ6IDUwMDB9KVxuXG4gICAgYXdhaXQgc2VsZWN0Q29udGFpbmVyLmNsaWNrKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRFbGVtZW50cyhzZWxlY3Rvcikge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnN5c3RlbVRlc3QuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnRzKEJ5LmNzcyhzZWxlY3RvcikpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pj59XG4gICAqL1xuICBhc3luYyBmaW5kVmlzaWJsZUVsZW1lbnRzKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhzZWxlY3RvcilcbiAgICBjb25zdCB2aXNpYmxlRWxlbWVudHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICBpZiAoYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpKSB7XG4gICAgICAgIHZpc2libGVFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZpc2libGVFbGVtZW50c1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59ICovXG4gIGFzeW5jIG9wdGlvbnNDb250YWluZXJTZWxlY3RvcigpIHtcbiAgICBpZiAodGhpcy5fb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKSByZXR1cm4gdGhpcy5fb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yXG5cbiAgICBjb25zdCByb290RWxlbWVudHMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyh0aGlzLnJvb3RTZWxlY3RvcilcbiAgICBjb25zdCByb290SWQgPSByb290RWxlbWVudHMubGVuZ3RoID4gMCA/IGF3YWl0IHJvb3RFbGVtZW50c1swXS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpIDogbnVsbFxuICAgIGxldCBlbGVtZW50cyA9IHJvb3RFbGVtZW50c1xuXG4gICAgaWYgKCFyb290SWQpIHtcbiAgICAgIGVsZW1lbnRzID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHModGhpcy5jb21wb25lbnRTZWxlY3RvcilcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHJvb3RJZCB8fCAoZWxlbWVudHMubGVuZ3RoID4gMCA/IGF3YWl0IGVsZW1lbnRzWzBdLmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIikgOiBudWxsKVxuXG4gICAgdGhpcy5fb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gaWQgPyBgW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9vcHRpb25zLWNvbnRhaW5lciddW2RhdGEtaWQ9JyR7aWR9J11gIDogdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3JGYWxsYmFja1xuXG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnNDb250YWluZXJTZWxlY3RvclxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gKi9cbiAgYXN5bmMgb3B0aW9uVGV4dHMoKSB7XG4gICAgY29uc3Qgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gYXdhaXQgdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IoKVxuICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9uJ11gKVxuXG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKG9wdGlvbnMubWFwKGFzeW5jIChvcHRpb24pID0+IChhd2FpdCBvcHRpb24uZ2V0VGV4dCgpKS50cmltKCkpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7e2luZGV4PzogbnVtYmVyLCB0ZXh0Pzogc3RyaW5nLCB2YWx1ZT86IHN0cmluZ3xudW1iZXJ9fSBjcml0ZXJpYVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNlbGVjdE9wdGlvbih7aW5kZXgsIHRleHQsIHZhbHVlLCAuLi5yZXN0QXJnc30gPSB7fSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBjcml0ZXJpYSBmb3Igc2VsZWN0T3B0aW9uLCBnb3Q6IHVuZGVmaW5lZFwiKVxuICAgIH1cblxuICAgIGNvbnN0IGV4dHJhS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKGV4dHJhS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc2VsZWN0T3B0aW9uIGNyaXRlcmlhOiAke2V4dHJhS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IDUwMDB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNDb250YWluZXJTZWxlY3RvciA9IGF3YWl0IHRoaXMub3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKClcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKGAke29wdGlvbnNDb250YWluZXJTZWxlY3Rvcn0gW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9vcHRpb24nXVtkYXRhLXZhbHVlPScke3ZhbHVlfSddYClcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9uc1swXVxuXG4gICAgICAgIGlmICghb3B0aW9uKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBvcHRpb24gZm9yIHZhbHVlOiAke3ZhbHVlfWApXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBvcHRpb24uY2xpY2soKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5kZXggPT0gXCJudW1iZXJcIikge1xuICAgICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogNTAwMH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gYXdhaXQgdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IoKVxuICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7b3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L29wdGlvbiddYClcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9uc1tpbmRleF1cblxuICAgICAgICBpZiAoIW9wdGlvbikgdGhyb3cgbmV3IEVycm9yKGBObyBvcHRpb24gYXQgaW5kZXg6ICR7aW5kZXh9YClcblxuICAgICAgICBhd2FpdCBvcHRpb24uY2xpY2soKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0ZXh0KSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiA1MDAwfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBhd2FpdCB0aGlzLm9wdGlvbnNDb250YWluZXJTZWxlY3RvcigpXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9uJ11gKVxuXG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBvcHRpb25UZXh0ID0gKGF3YWl0IG9wdGlvbi5nZXRUZXh0KCkpLnRyaW0oKVxuXG4gICAgICAgICAgaWYgKG9wdGlvblRleHQgPT09IHRleHQpIHtcbiAgICAgICAgICAgIGF3YWl0IG9wdGlvbi5jbGljaygpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG9wdGlvbiBmb3VuZCB3aXRoIHRleHQ6ICR7dGV4dH1gKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIHZhbHVlLCB0ZXh0LCBvciBpbmRleCB3aGVuIHNlbGVjdGluZyBhbiBvcHRpb25cIilcbiAgfVxufVxuIl19
220
+ /**
221
+ * Clicks a visible HayaSelect option by backend value.
222
+ * @param {object} systemTest Browser session used by the running spec.
223
+ * @param {string | number} optionValue Backend value stored in `data-value`.
224
+ * @param {number} timeout Maximum wait in milliseconds.
225
+ * @param {string} [optionsContainerSelector] Options container selector to scope the lookup.
226
+ * @returns {Promise<void>} Completes after the matching visible option is clicked.
227
+ */
228
+ async function clickVisibleSelectOptionByValue(systemTest, optionValue, timeout, optionsContainerSelector = "") {
229
+ const selector = `${optionsContainerSelector ? `${optionsContainerSelector} ` : ""}[data-testid="haya-select/option"][data-value="${cssAttributeValue(optionValue)}"]`;
230
+ const element = await findVisibleElement(systemTest, selector, timeout);
231
+ await element.click();
232
+ }
233
+ /**
234
+ * Clicks a visible HayaSelect option by displayed text.
235
+ * @param {object} systemTest Browser session used by the running spec.
236
+ * @param {string} expectedText Visible fragment rendered by the option.
237
+ * @param {number} timeout Maximum wait in milliseconds.
238
+ * @param {string} [optionsContainerSelector] Options container selector to scope the lookup.
239
+ * @returns {Promise<void>} Completes after the matching visible option is clicked.
240
+ */
241
+ async function clickVisibleSelectOptionByText(systemTest, expectedText, timeout, optionsContainerSelector = "") {
242
+ const element = /** @type {WebElement} */ (await systemTest.getDriver().wait(async () => {
243
+ const selector = `${optionsContainerSelector ? `${optionsContainerSelector} ` : ""}[data-testid='haya-select/option']`;
244
+ const optionElements = await systemTest.getDriver().findElements(By.css(selector));
245
+ for (const optionElement of optionElements) {
246
+ if (!(await optionElement.isDisplayed())) {
247
+ continue;
248
+ }
249
+ const actualText = await optionElement.getText();
250
+ if (actualText.includes(expectedText)) {
251
+ return optionElement;
252
+ }
253
+ }
254
+ return false;
255
+ }, timeout, `Timed out waiting for visible select option text ${expectedText}`));
256
+ await element.click();
257
+ }
258
+ /**
259
+ * Finds a visible element by CSS selector.
260
+ * @param {object} systemTest Browser session used by the running spec.
261
+ * @param {string} selector CSS query that can match one or more nodes.
262
+ * @param {number} timeout Maximum wait in milliseconds.
263
+ * @returns {Promise<WebElement>} First displayed match.
264
+ */
265
+ async function findVisibleElement(systemTest, selector, timeout) {
266
+ const element = await systemTest.getDriver().wait(async () => {
267
+ const elements = await systemTest.getDriver().findElements(By.css(selector));
268
+ for (const element of elements) {
269
+ if (await element.isDisplayed()) {
270
+ return element;
271
+ }
272
+ }
273
+ return false;
274
+ }, timeout, `Timed out waiting for visible selector ${selector}`);
275
+ return /** @type {WebElement} */ (element);
276
+ }
277
+ /**
278
+ * Builds a data-testid CSS selector.
279
+ * @param {string} testId Raw value from the component's `testID` prop.
280
+ * @returns {string} Attribute selector for the value.
281
+ */
282
+ function testIdSelector(testId) {
283
+ return `[data-testid="${cssAttributeValue(testId)}"]`;
284
+ }
285
+ /**
286
+ * Escapes a value for use inside a double-quoted CSS attribute selector.
287
+ * @param {string | number} value Raw attribute value to interpolate.
288
+ * @returns {string} String safe for a double-quoted attribute selector.
289
+ */
290
+ function cssAttributeValue(value) {
291
+ return String(value).replaceAll("\\", "\\\\").replaceAll('"', '\\"');
292
+ }
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zeXN0ZW0tdGVzdC1oZWxwZXJzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sT0FBTyxNQUFNLDRCQUE0QixDQUFBO0FBQ2hELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUVyQyx3RkFBd0Y7QUFDeEYsaUtBQWlLO0FBQ2pLLHNHQUFzRztBQUN0RywwRUFBMEU7QUFDMUUsb0VBQW9FO0FBRXBFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQTtBQUU1Qjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEdBQUcsS0FBSyxFQUFFLE9BQU8sR0FBRyxlQUFlLEVBQUUsZUFBZSxHQUFHLElBQUksRUFBQztJQUN6SixNQUFNLE1BQU0sR0FBRyxJQUFJLDBCQUEwQixDQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7SUFDbkUsTUFBTSxhQUFhLEdBQUcsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxFQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUFBO0lBQ3ZHLE1BQU0sYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBRTNCLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUNqRSxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUFBO1FBQ25HLE1B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QyxJQUFJLENBQy9DLEtBQUssSUFBSSxFQUFFO1FBQ1QsTUFBTSxRQUFRLEdBQUcsTUFBTSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUU1RSxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQy9CLElBQUksTUFBTSxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxPQUFPLENBQUE7WUFDaEIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUMsRUFDRCxPQUFPLEVBQ1AsMENBQTBDLFFBQVEsRUFBRSxDQUNyRCxDQUFBO0lBRUQsT0FBTyx5QkFBeUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQzVDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBTTtJQUM1QixPQUFPLGlCQUFpQixpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFBO0FBQ3ZELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUFLO0lBQzlCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHdhaXRGb3IgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3dhaXQtZm9yLmpzXCJcbmltcG9ydCB7Qnl9IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXJcIlxuXG4vKiogQHR5cGVkZWYge3tzeXN0ZW1UZXN0OiBvYmplY3QsIHRlc3RJZDogc3RyaW5nfX0gSGF5YVNlbGVjdFN5c3RlbVRlc3RIZWxwZXJPcHRpb25zICovXG4vKiogQHR5cGVkZWYge3tvcHRpb25UZXh0Pzogc3RyaW5nLCBvcHRpb25WYWx1ZT86IHN0cmluZyB8IG51bWJlciwgc2VhcmNoPzogYm9vbGVhbiwgdGltZW91dD86IG51bWJlciwgdXNlQmFzZVNlbGVjdG9yPzogYm9vbGVhbn19IFBpY2tIYXlhU2VsZWN0T3B0aW9uT3B0aW9ucyAqL1xuLyoqIEB0eXBlZGVmIHt7b3B0aW9uVmFsdWU6IHN0cmluZyB8IG51bWJlciwgdGltZW91dD86IG51bWJlcn19IENsaWNrVmlzaWJsZUhheWFTZWxlY3RPcHRpb25PcHRpb25zICovXG4vKiogQHR5cGVkZWYge3t0aW1lb3V0PzogbnVtYmVyfX0gRXhwZWN0SGF5YVNlbGVjdEN1cnJlbnRPcHRpb25zT3B0aW9ucyAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gV2ViRWxlbWVudCAqL1xuXG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSA1MDAwXG5cbi8qKlxuICogU2VsZWN0cyBhbiBvcHRpb24gaW4gYSBIYXlhU2VsZWN0IGluc3RhbmNlLlxuICogQHBhcmFtIHtvYmplY3R9IHN5c3RlbVRlc3QgQnJvd3NlciBzZXNzaW9uIHVzZWQgYnkgdGhlIHJ1bm5pbmcgc3BlYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgV3JhcHBlciBgZGF0YS10ZXN0aWRgIGFyb3VuZCB0aGUgc2VsZWN0LlxuICogQHBhcmFtIHtQaWNrSGF5YVNlbGVjdE9wdGlvbk9wdGlvbnN9IG9wdGlvbnMgVGV4dC92YWx1ZSB0byBjaG9vc2UgYW5kIHdoZXRoZXIgdG8gdHlwZSBpbnRvIHRoZSBzZWFyY2ggZmllbGQgZmlyc3QuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQ29tcGxldGVzIGFmdGVyIHRoZSBtYXRjaGluZyB2aXNpYmxlIG9wdGlvbiBpcyBjbGlja2VkLlxuICogQHJlamVjdHMge0Vycm9yfSBXaGVuIG5laXRoZXIgdGV4dCBub3IgdmFsdWUgaXMgc3VwcGxpZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwaWNrSGF5YVNlbGVjdE9wdGlvbihzeXN0ZW1UZXN0LCB0ZXN0SWQsIHtvcHRpb25UZXh0LCBvcHRpb25WYWx1ZSwgc2VhcmNoID0gZmFsc2UsIHRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQsIHVzZUJhc2VTZWxlY3RvciA9IHRydWV9KSB7XG4gIGNvbnN0IGhlbHBlciA9IG5ldyBIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlcih7c3lzdGVtVGVzdCwgdGVzdElkfSlcbiAgY29uc3Qgc2VsZWN0RWxlbWVudCA9IGF3YWl0IHN5c3RlbVRlc3QuZmluZChoZWxwZXIuc2VsZWN0Q29udGFpbmVyU2VsZWN0b3IsIHt0aW1lb3V0LCB1c2VCYXNlU2VsZWN0b3J9KVxuICBhd2FpdCBzZWxlY3RFbGVtZW50LmNsaWNrKClcblxuICBpZiAoc2VhcmNoKSB7XG4gICAgaWYgKCFvcHRpb25UZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9wdGlvblRleHQgd2hlbiBzZWFyY2hpbmcgJHt0ZXN0SWR9YClcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hFbGVtZW50ID0gYXdhaXQgc3lzdGVtVGVzdC5maW5kKGhlbHBlci5zZWFyY2hJbnB1dFNlbGVjdG9yLCB7dGltZW91dCwgdXNlQmFzZVNlbGVjdG9yfSlcbiAgICBhd2FpdCBzZWFyY2hFbGVtZW50LnNlbmRLZXlzKG9wdGlvblRleHQpXG4gIH1cblxuICBjb25zdCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBhd2FpdCBoZWxwZXIub3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKClcblxuICBpZiAodHlwZW9mIG9wdGlvblZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgYXdhaXQgY2xpY2tWaXNpYmxlU2VsZWN0T3B0aW9uQnlWYWx1ZShzeXN0ZW1UZXN0LCBvcHRpb25WYWx1ZSwgdGltZW91dCwgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKG9wdGlvblRleHQpIHtcbiAgICBhd2FpdCBjbGlja1Zpc2libGVTZWxlY3RPcHRpb25CeVRleHQoc3lzdGVtVGVzdCwgb3B0aW9uVGV4dCwgdGltZW91dCwgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKVxuICAgIHJldHVyblxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvcHRpb25WYWx1ZSBvciBvcHRpb25UZXh0IGZvciAke3Rlc3RJZH1gKVxufVxuXG4vKipcbiAqIENsaWNrcyBhbiBvcHRpb24gaW4gYW4gYWxyZWFkeS1vcGVuIEhheWFTZWxlY3QgZHJvcGRvd24uXG4gKiBAcGFyYW0ge29iamVjdH0gc3lzdGVtVGVzdCBCcm93c2VyIHNlc3Npb24gdXNlZCBieSB0aGUgcnVubmluZyBzcGVjLlxuICogQHBhcmFtIHtDbGlja1Zpc2libGVIYXlhU2VsZWN0T3B0aW9uT3B0aW9uc30gb3B0aW9ucyBPcHRpb24gdmFsdWUgdG8gY2hvb3NlLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IENvbXBsZXRlcyBhZnRlciB0aGUgbWF0Y2hpbmcgdmlzaWJsZSBvcHRpb24gaXMgY2xpY2tlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsaWNrVmlzaWJsZUhheWFTZWxlY3RPcHRpb24oc3lzdGVtVGVzdCwge29wdGlvblZhbHVlLCB0aW1lb3V0ID0gREVGQVVMVF9USU1FT1VUfSkge1xuICBhd2FpdCBjbGlja1Zpc2libGVTZWxlY3RPcHRpb25CeVZhbHVlKHN5c3RlbVRlc3QsIG9wdGlvblZhbHVlLCB0aW1lb3V0KVxufVxuXG4vKipcbiAqIFdhaXRzIHVudGlsIGEgSGF5YVNlbGVjdCByZW5kZXJzIGV4YWN0bHkgdGhlIGV4cGVjdGVkIGN1cnJlbnQtb3B0aW9uIGxhYmVscy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBzeXN0ZW1UZXN0IEJyb3dzZXIgc2Vzc2lvbiB1c2VkIGJ5IHRoZSBydW5uaW5nIHNwZWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFdyYXBwZXIgYGRhdGEtdGVzdGlkYCBhcm91bmQgdGhlIHNlbGVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGV4cGVjdGVkVGV4dHMgQ3VycmVudCBvcHRpb24gdGV4dCBmcmFnbWVudHMgaW4gcmVuZGVyZWQgb3JkZXIuXG4gKiBAcGFyYW0ge0V4cGVjdEhheWFTZWxlY3RDdXJyZW50T3B0aW9uc09wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25hbCBTZWxlbml1bSB0aW1lb3V0IG92ZXJyaWRlLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IENvbXBsZXRlcyBhZnRlciB0aGUgY3VycmVudCBvcHRpb25zIG1hdGNoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwZWN0SGF5YVNlbGVjdEN1cnJlbnRPcHRpb25zKHN5c3RlbVRlc3QsIHRlc3RJZCwgZXhwZWN0ZWRUZXh0cywge3RpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVR9ID0ge30pIHtcbiAgY29uc3Qgc2VsZWN0b3IgPSBgJHt0ZXN0SWRTZWxlY3Rvcih0ZXN0SWQpfSBbZGF0YS10ZXN0aWQ9XCJoYXlhLXNlbGVjdC9jdXJyZW50LW9wdGlvblwiXWBcbiAgYXdhaXQgc3lzdGVtVGVzdC5nZXREcml2ZXIoKS53YWl0KFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgc3lzdGVtVGVzdC5nZXREcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKHNlbGVjdG9yKSlcbiAgICAgIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgICBjb25zdCB2aXNpYmxlVGV4dHMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgaWYgKGF3YWl0IGVsZW1lbnQuaXNEaXNwbGF5ZWQoKSkge1xuICAgICAgICAgIHZpc2libGVUZXh0cy5wdXNoKGF3YWl0IGVsZW1lbnQuZ2V0VGV4dCgpKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh2aXNpYmxlVGV4dHMubGVuZ3RoICE9PSBleHBlY3RlZFRleHRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4cGVjdGVkVGV4dHMuZXZlcnkoKGV4cGVjdGVkVGV4dCwgaW5kZXgpID0+IHZpc2libGVUZXh0c1tpbmRleF0/LmluY2x1ZGVzKGV4cGVjdGVkVGV4dCkpXG4gICAgfSxcbiAgICB0aW1lb3V0LFxuICAgIGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgJHt0ZXN0SWR9IGN1cnJlbnQgb3B0aW9uczogJHtleHBlY3RlZFRleHRzLmpvaW4oXCIsIFwiKX1gXG4gIClcbn1cblxuLyoqXG4gKiBTeXN0ZW0gdGVzdCBoZWxwZXIgZm9yIGludGVyYWN0aW5nIHdpdGggSGF5YVNlbGVjdCBpbnN0YW5jZXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhheWFTZWxlY3RTeXN0ZW1UZXN0SGVscGVyIHtcbiAgLyoqIEBwYXJhbSB7SGF5YVNlbGVjdFN5c3RlbVRlc3RIZWxwZXJPcHRpb25zfSBvcHRpb25zICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb3B0aW9ucyBmb3IgSGF5YVNlbGVjdFN5c3RlbVRlc3RIZWxwZXIsIGdvdDogJHtvcHRpb25zfWApXG4gICAgfVxuXG4gICAgY29uc3Qge3N5c3RlbVRlc3QsIHRlc3RJZCwgLi4ucmVzdEFyZ3N9ID0gb3B0aW9uc1xuICAgIGNvbnN0IGV4dHJhS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKGV4dHJhS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgb3B0aW9ucyBmb3IgSGF5YVNlbGVjdFN5c3RlbVRlc3RIZWxwZXI6ICR7ZXh0cmFLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIHRoaXMuc3lzdGVtVGVzdCA9IHN5c3RlbVRlc3RcbiAgICB0aGlzLnRlc3RJZCA9IHRlc3RJZFxuICAgIHRoaXMucm9vdFNlbGVjdG9yID0gdGVzdElkU2VsZWN0b3IodGVzdElkKVxuICAgIHRoaXMuY29tcG9uZW50U2VsZWN0b3IgPSBgJHt0aGlzLnJvb3RTZWxlY3Rvcn0gW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdCddYFxuICAgIHRoaXMuY2hldnJvbkNvbnRhaW5lclNlbGVjdG9yID0gYCR7dGhpcy5yb290U2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3QvY2hldnJvbi1jb250YWluZXInXWBcbiAgICB0aGlzLnNlbGVjdENvbnRhaW5lclNlbGVjdG9yID0gYCR7dGhpcy5yb290U2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvc2VsZWN0LWNvbnRhaW5lciddYFxuICAgIHRoaXMuc2VhcmNoSW5wdXRTZWxlY3RvciA9IGAke3RoaXMucm9vdFNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L3NlYXJjaC1pbnB1dCddYFxuICAgIHRoaXMub3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yRmFsbGJhY2sgPSBcIltkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9ucy1jb250YWluZXInXVwiXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIG9wZW4oKSB7XG4gICAgYXdhaXQgdGhpcy5jbGlja1NlbGVjdENvbnRhaW5lcigpXG4gICAgdGhpcy5fb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gbnVsbFxuXG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogNTAwMH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9wZW5lZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7dGhpcy5jb21wb25lbnRTZWxlY3Rvcn1bZGF0YS1vcGVuZWQ9J3RydWUnXWApXG5cbiAgICAgIGlmIChvcGVuZWRFbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBIYXlhU2VsZWN0IHRvIG9wZW46ICR7dGhpcy50ZXN0SWR9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBjbG9zZSgpIHtcbiAgICBhd2FpdCB0aGlzLmNsaWNrU2VsZWN0Q29udGFpbmVyKClcblxuICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IDUwMDB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvcGVuZWRFbGVtZW50cyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKGAke3RoaXMuY29tcG9uZW50U2VsZWN0b3J9W2RhdGEtb3BlbmVkPSd0cnVlJ11gKVxuXG4gICAgICBpZiAob3BlbmVkRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIEhheWFTZWxlY3QgdG8gY2xvc2U6ICR7dGhpcy50ZXN0SWR9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAqL1xuICBhc3luYyBpc09wZW4oKSB7XG4gICAgY29uc3Qgb3BlbmVkRWxlbWVudHMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHt0aGlzLmNvbXBvbmVudFNlbGVjdG9yfVtkYXRhLW9wZW5lZD0ndHJ1ZSddYClcblxuICAgIGlmIChvcGVuZWRFbGVtZW50cy5sZW5ndGggPiAwKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3Qgc2VhcmNoSW5wdXRzID0gYXdhaXQgdGhpcy5maW5kVmlzaWJsZUVsZW1lbnRzKHRoaXMuc2VhcmNoSW5wdXRTZWxlY3RvcilcblxuICAgIHJldHVybiBzZWFyY2hJbnB1dHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBjbGlja1NlbGVjdENvbnRhaW5lcigpIHtcbiAgICBjb25zdCBzZWxlY3RDb250YWluZXIgPSBhd2FpdCB0aGlzLnN5c3RlbVRlc3QuZmluZCh0aGlzLnNlbGVjdENvbnRhaW5lclNlbGVjdG9yLCB7dGltZW91dDogNTAwMH0pXG5cbiAgICBhd2FpdCBzZWxlY3RDb250YWluZXIuY2xpY2soKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD4+fVxuICAgKi9cbiAgYXN5bmMgZmluZEVsZW1lbnRzKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3lzdGVtVGVzdC5nZXREcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKHNlbGVjdG9yKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRWaXNpYmxlRWxlbWVudHMoc2VsZWN0b3IpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKHNlbGVjdG9yKVxuICAgIGNvbnN0IHZpc2libGVFbGVtZW50cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgIGlmIChhd2FpdCBlbGVtZW50LmlzRGlzcGxheWVkKCkpIHtcbiAgICAgICAgdmlzaWJsZUVsZW1lbnRzLnB1c2goZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmlzaWJsZUVsZW1lbnRzXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gKi9cbiAgYXN5bmMgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKCkge1xuICAgIGlmICh0aGlzLl9vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IpIHJldHVybiB0aGlzLl9vcHRpb25zQ29udGFpbmVyU2VsZWN0b3JcblxuICAgIGNvbnN0IG9wZW5lZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7dGhpcy5jb21wb25lbnRTZWxlY3Rvcn1bZGF0YS1vcGVuZWQ9J3RydWUnXWApXG4gICAgY29uc3QgY29tcG9uZW50RWxlbWVudHMgPSBvcGVuZWRFbGVtZW50cy5sZW5ndGggPiAwID8gb3BlbmVkRWxlbWVudHMgOiBhd2FpdCB0aGlzLmZpbmRWaXNpYmxlRWxlbWVudHModGhpcy5jb21wb25lbnRTZWxlY3RvcilcbiAgICBjb25zdCBpZCA9IGNvbXBvbmVudEVsZW1lbnRzLmxlbmd0aCA+IDAgPyBhd2FpdCBjb21wb25lbnRFbGVtZW50c1swXS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpIDogbnVsbFxuXG4gICAgdGhpcy5fb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gaWQgPyBgW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9vcHRpb25zLWNvbnRhaW5lciddW2RhdGEtaWQ9XCIke2Nzc0F0dHJpYnV0ZVZhbHVlKGlkKX1cIl1gIDogdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3JGYWxsYmFja1xuXG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnNDb250YWluZXJTZWxlY3RvclxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gKi9cbiAgYXN5bmMgb3B0aW9uVGV4dHMoKSB7XG4gICAgY29uc3Qgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gYXdhaXQgdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IoKVxuICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9uJ11gKVxuXG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKG9wdGlvbnMubWFwKGFzeW5jIChvcHRpb24pID0+IChhd2FpdCBvcHRpb24uZ2V0VGV4dCgpKS50cmltKCkpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7e2luZGV4PzogbnVtYmVyLCB0ZXh0Pzogc3RyaW5nLCB2YWx1ZT86IHN0cmluZ3xudW1iZXJ9fSBjcml0ZXJpYVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNlbGVjdE9wdGlvbih7aW5kZXgsIHRleHQsIHZhbHVlLCAuLi5yZXN0QXJnc30gPSB7fSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBjcml0ZXJpYSBmb3Igc2VsZWN0T3B0aW9uLCBnb3Q6IHVuZGVmaW5lZFwiKVxuICAgIH1cblxuICAgIGNvbnN0IGV4dHJhS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKGV4dHJhS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc2VsZWN0T3B0aW9uIGNyaXRlcmlhOiAke2V4dHJhS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IDUwMDB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNDb250YWluZXJTZWxlY3RvciA9IGF3YWl0IHRoaXMub3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKClcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKGAke29wdGlvbnNDb250YWluZXJTZWxlY3Rvcn0gW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9vcHRpb24nXVtkYXRhLXZhbHVlPVwiJHtjc3NBdHRyaWJ1dGVWYWx1ZSh2YWx1ZSl9XCJdYClcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9uc1swXVxuXG4gICAgICAgIGlmICghb3B0aW9uKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBvcHRpb24gZm9yIHZhbHVlOiAke3ZhbHVlfWApXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBvcHRpb24uY2xpY2soKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5kZXggPT0gXCJudW1iZXJcIikge1xuICAgICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogNTAwMH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gYXdhaXQgdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IoKVxuICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7b3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L29wdGlvbiddYClcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9uc1tpbmRleF1cblxuICAgICAgICBpZiAoIW9wdGlvbikgdGhyb3cgbmV3IEVycm9yKGBObyBvcHRpb24gYXQgaW5kZXg6ICR7aW5kZXh9YClcblxuICAgICAgICBhd2FpdCBvcHRpb24uY2xpY2soKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0ZXh0KSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiA1MDAwfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBhd2FpdCB0aGlzLm9wdGlvbnNDb250YWluZXJTZWxlY3RvcigpXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9uJ11gKVxuXG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBvcHRpb25UZXh0ID0gKGF3YWl0IG9wdGlvbi5nZXRUZXh0KCkpLnRyaW0oKVxuXG4gICAgICAgICAgaWYgKG9wdGlvblRleHQgPT09IHRleHQpIHtcbiAgICAgICAgICAgIGF3YWl0IG9wdGlvbi5jbGljaygpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG9wdGlvbiBmb3VuZCB3aXRoIHRleHQ6ICR7dGV4dH1gKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIHZhbHVlLCB0ZXh0LCBvciBpbmRleCB3aGVuIHNlbGVjdGluZyBhbiBvcHRpb25cIilcbiAgfVxufVxuXG4vKipcbiAqIENsaWNrcyBhIHZpc2libGUgSGF5YVNlbGVjdCBvcHRpb24gYnkgYmFja2VuZCB2YWx1ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBzeXN0ZW1UZXN0IEJyb3dzZXIgc2Vzc2lvbiB1c2VkIGJ5IHRoZSBydW5uaW5nIHNwZWMuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gb3B0aW9uVmFsdWUgQmFja2VuZCB2YWx1ZSBzdG9yZWQgaW4gYGRhdGEtdmFsdWVgLlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgTWF4aW11bSB3YWl0IGluIG1pbGxpc2Vjb25kcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yXSBPcHRpb25zIGNvbnRhaW5lciBzZWxlY3RvciB0byBzY29wZSB0aGUgbG9va3VwLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IENvbXBsZXRlcyBhZnRlciB0aGUgbWF0Y2hpbmcgdmlzaWJsZSBvcHRpb24gaXMgY2xpY2tlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2xpY2tWaXNpYmxlU2VsZWN0T3B0aW9uQnlWYWx1ZShzeXN0ZW1UZXN0LCBvcHRpb25WYWx1ZSwgdGltZW91dCwgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gXCJcIikge1xuICBjb25zdCBzZWxlY3RvciA9IGAke29wdGlvbnNDb250YWluZXJTZWxlY3RvciA/IGAke29wdGlvbnNDb250YWluZXJTZWxlY3Rvcn0gYCA6IFwiXCJ9W2RhdGEtdGVzdGlkPVwiaGF5YS1zZWxlY3Qvb3B0aW9uXCJdW2RhdGEtdmFsdWU9XCIke2Nzc0F0dHJpYnV0ZVZhbHVlKG9wdGlvblZhbHVlKX1cIl1gXG4gIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCBmaW5kVmlzaWJsZUVsZW1lbnQoc3lzdGVtVGVzdCwgc2VsZWN0b3IsIHRpbWVvdXQpXG4gIGF3YWl0IGVsZW1lbnQuY2xpY2soKVxufVxuXG4vKipcbiAqIENsaWNrcyBhIHZpc2libGUgSGF5YVNlbGVjdCBvcHRpb24gYnkgZGlzcGxheWVkIHRleHQuXG4gKiBAcGFyYW0ge29iamVjdH0gc3lzdGVtVGVzdCBCcm93c2VyIHNlc3Npb24gdXNlZCBieSB0aGUgcnVubmluZyBzcGVjLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBWaXNpYmxlIGZyYWdtZW50IHJlbmRlcmVkIGJ5IHRoZSBvcHRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBNYXhpbXVtIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3JdIE9wdGlvbnMgY29udGFpbmVyIHNlbGVjdG9yIHRvIHNjb3BlIHRoZSBsb29rdXAuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQ29tcGxldGVzIGFmdGVyIHRoZSBtYXRjaGluZyB2aXNpYmxlIG9wdGlvbiBpcyBjbGlja2VkLlxuICovXG5hc3luYyBmdW5jdGlvbiBjbGlja1Zpc2libGVTZWxlY3RPcHRpb25CeVRleHQoc3lzdGVtVGVzdCwgZXhwZWN0ZWRUZXh0LCB0aW1lb3V0LCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBcIlwiKSB7XG4gIGNvbnN0IGVsZW1lbnQgPSAvKiogQHR5cGUge1dlYkVsZW1lbnR9ICovIChcbiAgICBhd2FpdCBzeXN0ZW1UZXN0LmdldERyaXZlcigpLndhaXQoXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gYCR7b3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID8gYCR7b3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yfSBgIDogXCJcIn1bZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L29wdGlvbiddYFxuICAgICAgICBjb25zdCBvcHRpb25FbGVtZW50cyA9IGF3YWl0IHN5c3RlbVRlc3QuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnRzKEJ5LmNzcyhzZWxlY3RvcikpXG5cbiAgICAgICAgZm9yIChjb25zdCBvcHRpb25FbGVtZW50IG9mIG9wdGlvbkVsZW1lbnRzKSB7XG4gICAgICAgICAgaWYgKCEoYXdhaXQgb3B0aW9uRWxlbWVudC5pc0Rpc3BsYXllZCgpKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhY3R1YWxUZXh0ID0gYXdhaXQgb3B0aW9uRWxlbWVudC5nZXRUZXh0KClcbiAgICAgICAgICBpZiAoYWN0dWFsVGV4dC5pbmNsdWRlcyhleHBlY3RlZFRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uRWxlbWVudFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfSxcbiAgICAgIHRpbWVvdXQsXG4gICAgICBgVGltZWQgb3V0IHdhaXRpbmcgZm9yIHZpc2libGUgc2VsZWN0IG9wdGlvbiB0ZXh0ICR7ZXhwZWN0ZWRUZXh0fWBcbiAgICApXG4gIClcblxuICBhd2FpdCBlbGVtZW50LmNsaWNrKClcbn1cblxuLyoqXG4gKiBGaW5kcyBhIHZpc2libGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge29iamVjdH0gc3lzdGVtVGVzdCBCcm93c2VyIHNlc3Npb24gdXNlZCBieSB0aGUgcnVubmluZyBzcGVjLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIENTUyBxdWVyeSB0aGF0IGNhbiBtYXRjaCBvbmUgb3IgbW9yZSBub2Rlcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IE1heGltdW0gd2FpdCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxXZWJFbGVtZW50Pn0gRmlyc3QgZGlzcGxheWVkIG1hdGNoLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kVmlzaWJsZUVsZW1lbnQoc3lzdGVtVGVzdCwgc2VsZWN0b3IsIHRpbWVvdXQpIHtcbiAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHN5c3RlbVRlc3QuZ2V0RHJpdmVyKCkud2FpdChcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHN5c3RlbVRlc3QuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnRzKEJ5LmNzcyhzZWxlY3RvcikpXG5cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuICAgIHRpbWVvdXQsXG4gICAgYFRpbWVkIG91dCB3YWl0aW5nIGZvciB2aXNpYmxlIHNlbGVjdG9yICR7c2VsZWN0b3J9YFxuICApXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7V2ViRWxlbWVudH0gKi8gKGVsZW1lbnQpXG59XG5cbi8qKlxuICogQnVpbGRzIGEgZGF0YS10ZXN0aWQgQ1NTIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBSYXcgdmFsdWUgZnJvbSB0aGUgY29tcG9uZW50J3MgYHRlc3RJRGAgcHJvcC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEF0dHJpYnV0ZSBzZWxlY3RvciBmb3IgdGhlIHZhbHVlLlxuICovXG5mdW5jdGlvbiB0ZXN0SWRTZWxlY3Rvcih0ZXN0SWQpIHtcbiAgcmV0dXJuIGBbZGF0YS10ZXN0aWQ9XCIke2Nzc0F0dHJpYnV0ZVZhbHVlKHRlc3RJZCl9XCJdYFxufVxuXG4vKipcbiAqIEVzY2FwZXMgYSB2YWx1ZSBmb3IgdXNlIGluc2lkZSBhIGRvdWJsZS1xdW90ZWQgQ1NTIGF0dHJpYnV0ZSBzZWxlY3Rvci5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB2YWx1ZSBSYXcgYXR0cmlidXRlIHZhbHVlIHRvIGludGVycG9sYXRlLlxuICogQHJldHVybnMge3N0cmluZ30gU3RyaW5nIHNhZmUgZm9yIGEgZG91YmxlLXF1b3RlZCBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKi9cbmZ1bmN0aW9uIGNzc0F0dHJpYnV0ZVZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiXFxcXFxcXFxcIikucmVwbGFjZUFsbCgnXCInLCAnXFxcXFwiJylcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "haya-select",
3
- "version": "1.0.116",
3
+ "version": "1.0.118",
4
4
  "description": "Just another select component for React Native + Web.",
5
5
  "files": [
6
6
  "build/**"