@sbb-esta/lyne-elements-dev 4.11.0-dev.1777273102 → 4.11.0-dev.1777277312

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.
Files changed (45) hide show
  1. package/autocomplete/autocomplete-base-element.js +1 -1
  2. package/autocomplete/autocomplete.component.js +1 -1
  3. package/{autocomplete-base-element-BQS5lHRU.js → autocomplete-base-element-De2O5Wx-.js} +1 -1
  4. package/autocomplete.js +1 -1
  5. package/autocomplete.pure.js +1 -1
  6. package/core/styles/mixins/overlay.scss +2 -2
  7. package/core.css +4 -3
  8. package/custom-elements.json +438 -438
  9. package/development/autocomplete/autocomplete-base-element.js +1 -1
  10. package/development/autocomplete/autocomplete.component.js +1 -1
  11. package/development/{autocomplete-base-element-BGAFOzNh.js → autocomplete-base-element-BpCpYcX9.js} +2 -2
  12. package/development/autocomplete.js +1 -1
  13. package/development/autocomplete.pure.js +1 -1
  14. package/development/option/option/option.component.js +1 -1
  15. package/development/option/option.js +1 -1
  16. package/development/option.component-CRVr0PfV.js +130 -0
  17. package/development/option.js +1 -1
  18. package/development/option.pure.js +1 -1
  19. package/development/popover/popover.component.js +1 -1
  20. package/development/popover.component-B3tm93Pe.js +537 -0
  21. package/development/popover.js +1 -1
  22. package/development/popover.pure.js +1 -1
  23. package/development/select/select.component.js +1 -1
  24. package/development/{select.component-6Dwk_s7d.js → select.component-D9SFG7Lk.js} +2 -2
  25. package/development/select.js +1 -1
  26. package/development/select.pure.js +1 -1
  27. package/off-brand-theme.css +4 -3
  28. package/option/option/option.component.js +1 -1
  29. package/option/option.js +1 -1
  30. package/{option.component-M-V_tdSC.js → option.component-2Xf1hz7y.js} +1 -1
  31. package/option.js +1 -1
  32. package/option.pure.js +1 -1
  33. package/package.json +2 -2
  34. package/popover/popover.component.js +1 -1
  35. package/{popover.component-DWNuW4wM.js → popover.component-Bv6-zVf4.js} +1 -1
  36. package/popover.js +1 -1
  37. package/popover.pure.js +1 -1
  38. package/safety-theme.css +4 -3
  39. package/select/select.component.js +1 -1
  40. package/{select.component-CkqpVDmc.js → select.component-BT6RbERH.js} +1 -1
  41. package/select.js +1 -1
  42. package/select.pure.js +1 -1
  43. package/standard-theme.css +4 -3
  44. package/development/option.component-CdL7fdzZ.js +0 -130
  45. package/development/popover.component-BCMdJBUR.js +0 -537
@@ -0,0 +1,537 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { html, isServer, nothing, unsafeCSS } from "lit";
3
+ import { property } from "lit/decorators.js";
4
+ import { SbbOpenCloseBaseElement } from "./core/base-elements.js";
5
+ import { forceType, idReference } from "./core/decorators.js";
6
+ import { isZeroAnimationDuration } from "./core/dom.js";
7
+ import { composedPathHasAttribute } from "./core/eventing.js";
8
+ import { ɵstateController } from "./core/mixins.js";
9
+ import { boxSizingStyles } from "./core/styles.js";
10
+ import { SbbSecondaryButtonElement } from "./button.pure.js";
11
+ import { SbbEscapableOverlayController, SbbLanguageController, SbbMediaQueryPointerCoarse } from "./core/controllers.js";
12
+ import { i18nClosePopover } from "./core/i18n.js";
13
+ import { ref } from "lit/directives/ref.js";
14
+ import { getElementPosition, isEventOnElement, removeAriaOverlayTriggerAttributes, setAriaOverlayTriggerAttributes } from "./core/overlay.js";
15
+ import { IS_FOCUSABLE_QUERY, SbbFocusTrapController, isFakeMousedownFromScreenReader, sbbInputModalityDetector } from "./core/a11y.js";
16
+ import { readConfig } from "./core/config.js";
17
+ //#region src/elements/popover/popover.scss?inline
18
+ var popover_default = ":host {\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-default);\n --sbb-focus-outline-color: light-dark(\n var(--sbb-focus-outline-color-default),\n var(--sbb-focus-outline-color-dark)\n );\n --sbb-popover-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-4x)\n );\n --_sbb-popover-inset: 0 auto auto 0;\n --_sbb-popover-transform: translateY(var(--sbb-spacing-fixed-2x));\n --_sbb-popover-box-shadow: var(--sbb-box-shadow-level-9-hard);\n outline: none !important;\n display: none;\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) {\n --_sbb-popover-inset: 0;\n display: block;\n}\n\n:host(:is(:state(position-above),[state--position-above])) {\n --_sbb-popover-transform: translateY(calc(var(--sbb-spacing-fixed-2x) * -1));\n}\n\n:host(:not([hide-close-button], :is(:state(hover-trigger),[state--hover-trigger]))) {\n --sbb-popover-min-height: calc(var(--sbb-size-element-xs) + 2 * var(--sbb-popover-padding));\n}\n\n.sbb-popover::after,\n.sbb-popover__content::before {\n content: \"\";\n position: absolute;\n display: block;\n width: var(--sbb-popover-arrow-size);\n height: var(--sbb-popover-arrow-size);\n left: var(--_sbb-popover-arrow-position-x, 0);\n bottom: calc(100% - var(--sbb-popover-arrow-size) / 2);\n background-color: var(--sbb-popover-background);\n border-radius: var(--sbb-border-radius-2x) 0;\n transform: rotate(45deg);\n}\n\n.sbb-popover__container {\n position: fixed;\n inset: var(--_sbb-popover-inset);\n pointer-events: none;\n z-index: var(--sbb-popover-z-index, var(--sbb-overlay-default-z-index));\n}\n\n.sbb-popover {\n display: none;\n position: var(--sbb-popover-position, absolute);\n top: var(--_sbb-popover-position-y, 0);\n bottom: unset;\n left: var(--_sbb-popover-position-x, 0);\n right: unset;\n background-color: var(--sbb-popover-background);\n max-width: var(--sbb-popover-max-width);\n width: max-content;\n padding: 0;\n box-shadow: var(--_sbb-popover-box-shadow);\n border: none;\n border-radius: var(--sbb-popover-border-radius);\n outline: none;\n pointer-events: all;\n}\n:host(:focus-visible) .sbb-popover {\n outline-offset: var(--sbb-focus-outline-offset);\n outline: var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);\n}\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) .sbb-popover {\n display: block;\n animation-name: open;\n animation-duration: var(--sbb-popover-animation-duration);\n animation-timing-function: var(--sbb-popover-animation-easing);\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-popover {\n pointer-events: none;\n animation-name: close;\n animation-duration: var(--sbb-popover-animation-duration);\n animation-timing-function: var(--sbb-popover-animation-easing);\n}\n.sbb-popover::after {\n z-index: -1;\n box-shadow: var(--_sbb-popover-box-shadow);\n}\n@media (forced-colors: active) {\n .sbb-popover::after {\n outline: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n:host(:is(:state(position-above),[state--position-above])) .sbb-popover::after {\n top: calc(100% - var(--sbb-popover-arrow-size) / 2);\n}\n@media (forced-colors: active) {\n .sbb-popover {\n outline: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n.sbb-popover::before {\n content: \"\";\n display: block;\n position: absolute;\n inset: 0;\n z-index: -1;\n background-color: transparent;\n}\n:host(:is(:state(position-below),[state--position-below])) .sbb-popover::before {\n inset-block-start: calc(-1 * var(--sbb-spacing-fixed-6x));\n}\n:host(:is(:state(position-above),[state--position-above])) .sbb-popover::before {\n inset-block-end: calc(-1 * var(--sbb-spacing-fixed-6x));\n}\n\n.sbb-popover__content {\n display: flex;\n gap: var(--sbb-spacing-fixed-4x);\n border-radius: var(--sbb-popover-border-radius);\n padding-block: var(--sbb-popover-padding) 0;\n padding-inline: var(--sbb-popover-padding);\n outline: none;\n background-color: var(--sbb-popover-background);\n flex-direction: row-reverse;\n min-height: var(--sbb-popover-min-height);\n}\n:host(:is(:state(position-above),[state--position-above])) .sbb-popover__content::before {\n top: calc(100% - var(--sbb-popover-arrow-size) / 2);\n}\n\n.sbb-popover__scrollable-content {\n --sbb-scrollbar-thumb-width: 0.125rem;\n --sbb-scrollbar-thumb-width-hover: 0.25rem;\n --sbb-scrollbar-width-firefox: thin;\n --sbb-scrollbar-color: color-mix(in srgb, var(--sbb-color-black) 30%, transparent);\n --sbb-scrollbar-color: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 30%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 30%, transparent)\n );\n --sbb-scrollbar-color-hover: color-mix(in srgb, var(--sbb-color-black) 60%, transparent);\n --sbb-scrollbar-color-hover: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 60%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 60%, transparent)\n );\n --sbb-scrollbar-track-color: transparent;\n --sbb-scrollbar-width: var(--sbb-spacing-fixed-3x);\n}\n.sbb-popover__scrollable-content::-webkit-scrollbar {\n width: var(--sbb-scrollbar-width);\n height: var(--sbb-scrollbar-width);\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-popover__scrollable-content::-webkit-scrollbar-corner {\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-popover__scrollable-content::-webkit-scrollbar-thumb {\n background-color: var(--sbb-scrollbar-color, currentcolor);\n border: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width))) solid transparent;\n border-radius: var(--sbb-border-radius-4x);\n background-clip: padding-box;\n}\n.sbb-popover__scrollable-content::-webkit-scrollbar-thumb:hover {\n background-color: var(--sbb-scrollbar-color-hover, currentcolor);\n border-width: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width-hover)));\n}\n.sbb-popover__scrollable-content::-webkit-scrollbar-button, .sbb-popover__scrollable-content::-webkit-scrollbar-corner {\n display: none;\n}\n@supports not selector(::-webkit-scrollbar) {\n .sbb-popover__scrollable-content {\n scrollbar-width: var(--sbb-scrollbar-width-firefox);\n scrollbar-color: var(--sbb-scrollbar-color, currentcolor) var(--sbb-scrollbar-track-color, transparent);\n }\n}\n.sbb-popover__scrollable-content {\n display: block;\n padding-block-end: var(--sbb-popover-padding);\n max-height: calc(var(--_sbb-popover-max-height));\n overflow: auto;\n}\n\n@keyframes open {\n from {\n opacity: 0;\n transform: var(--_sbb-popover-transform);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n@keyframes close {\n from {\n opacity: 1;\n transform: translateY(0);\n }\n to {\n opacity: 0;\n transform: var(--_sbb-popover-transform);\n }\n}";
19
+ //#endregion
20
+ //#region src/elements/popover/popover.component.ts
21
+ SbbSecondaryButtonElement.define();
22
+ var VERTICAL_OFFSET = 16;
23
+ var HORIZONTAL_OFFSET = 32;
24
+ var nextId = 0;
25
+ var popoversRef = /* @__PURE__ */ new Set();
26
+ var pointerCoarse = isServer ? false : matchMedia(SbbMediaQueryPointerCoarse).matches;
27
+ var SbbPopoverBaseElement = (() => {
28
+ let _classSuper = SbbOpenCloseBaseElement;
29
+ let _trigger_decorators;
30
+ let _trigger_initializers = [];
31
+ let _trigger_extraInitializers = [];
32
+ return class SbbPopoverBaseElement extends _classSuper {
33
+ constructor() {
34
+ super(...arguments);
35
+ this.#trigger_accessor_storage = __runInitializers(this, _trigger_initializers, null);
36
+ this._nextFocusedElement = __runInitializers(this, _trigger_extraInitializers);
37
+ this._skipCloseFocus = false;
38
+ this._escapableOverlayController = new SbbEscapableOverlayController(this);
39
+ this._focusTrapController = new SbbFocusTrapController(this);
40
+ this._blurTimeout = null;
41
+ this._pointerDownListener = (event) => {
42
+ this._isPointerDownEventOnPopover = isEventOnElement(this.overlay, event);
43
+ };
44
+ this._closeOnBackdropClick = (event) => {
45
+ const composedPath = event.composedPath();
46
+ if (!this._isPointerDownEventOnPopover && !isEventOnElement(this.overlay, event) && (!this.trigger || !composedPath.includes(this.trigger))) {
47
+ this._nextFocusedElement = composedPath.filter((el) => el instanceof window.HTMLElement).find((el) => el.matches(IS_FOCUSABLE_QUERY));
48
+ clearTimeout(this.closeTimeout);
49
+ this.close();
50
+ }
51
+ };
52
+ }
53
+ static {
54
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
55
+ _trigger_decorators = [idReference(), property()];
56
+ __esDecorate(this, null, _trigger_decorators, {
57
+ kind: "accessor",
58
+ name: "trigger",
59
+ static: false,
60
+ private: false,
61
+ access: {
62
+ has: (obj) => "trigger" in obj,
63
+ get: (obj) => obj.trigger,
64
+ set: (obj, value) => {
65
+ obj.trigger = value;
66
+ }
67
+ },
68
+ metadata: _metadata
69
+ }, _trigger_initializers, _trigger_extraInitializers);
70
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, {
71
+ enumerable: true,
72
+ configurable: true,
73
+ writable: true,
74
+ value: _metadata
75
+ });
76
+ }
77
+ static {
78
+ this.styles = [boxSizingStyles, unsafeCSS(popover_default)];
79
+ }
80
+ #trigger_accessor_storage;
81
+ /**
82
+ * The element that will trigger the popover overlay.
83
+ *
84
+ * For attribute usage, provide an id reference.
85
+ */
86
+ get trigger() {
87
+ return this.#trigger_accessor_storage;
88
+ }
89
+ set trigger(value) {
90
+ this.#trigger_accessor_storage = value;
91
+ }
92
+ /** Opens the popover on trigger click. */
93
+ open() {
94
+ if (this.state !== "closed" && this.state !== "closing" || !this.overlay || !this.dispatchBeforeOpenEvent()) return;
95
+ for (const popover of popoversRef) if (popover.state === "opened" || popover.state === "opening") popover.close();
96
+ this.showPopover?.();
97
+ this.state = "opening";
98
+ this.inert = true;
99
+ this._setPopoverPosition();
100
+ this._attachWindowEvents();
101
+ this._escapableOverlayController.connect();
102
+ this._triggerElement?.setAttribute("aria-expanded", "true");
103
+ this._nextFocusedElement = void 0;
104
+ this._skipCloseFocus = false;
105
+ if (this._isZeroAnimationDuration()) this._handleOpening();
106
+ }
107
+ /** Closes the popover. */
108
+ close(target) {
109
+ if (this.state !== "opened" && this.state !== "opening") return;
110
+ this._popoverCloseElement = target;
111
+ if (!this.dispatchBeforeCloseEvent({ closeTarget: target ?? null })) return;
112
+ this.state = "closing";
113
+ this.inert = true;
114
+ this._triggerElement?.setAttribute("aria-expanded", "false");
115
+ if (this._isZeroAnimationDuration()) this._handleClosing();
116
+ }
117
+ _isZeroAnimationDuration() {
118
+ return isZeroAnimationDuration(this, "--sbb-popover-animation-duration");
119
+ }
120
+ _handleClosing() {
121
+ this.state = "closed";
122
+ this.hidePopover?.();
123
+ this.overlay?.firstElementChild?.scrollTo(0, 0);
124
+ this.removeAttribute("tabindex");
125
+ if (!this._skipCloseFocus) (this._nextFocusedElement || this._triggerElement)?.focus();
126
+ this._escapableOverlayController.disconnect();
127
+ this._openStateController?.abort();
128
+ this._focusTrapController.enabled = false;
129
+ this.dispatchCloseEvent({ closeTarget: this._popoverCloseElement ?? null });
130
+ }
131
+ _handleOpening() {
132
+ this.state = "opened";
133
+ this.inert = false;
134
+ this._setPopoverFocus();
135
+ this._focusTrapController.enabled = true;
136
+ this.dispatchOpenEvent();
137
+ }
138
+ connectedCallback() {
139
+ this.popover = "manual";
140
+ super.connectedCallback();
141
+ this.id ||= `sbb-popover-${++nextId}`;
142
+ this.state = "closed";
143
+ popoversRef.add(this);
144
+ if (this.hasUpdated) this._configureTrigger();
145
+ }
146
+ requestUpdate(name, oldValue, options) {
147
+ super.requestUpdate(name, oldValue, options);
148
+ if (!isServer && (!name || name === "trigger" || name === "hoverTrigger") && this.hasUpdated) this._configureTrigger();
149
+ }
150
+ firstUpdated(changedProperties) {
151
+ super.firstUpdated(changedProperties);
152
+ this._configureTrigger();
153
+ }
154
+ disconnectedCallback() {
155
+ super.disconnectedCallback();
156
+ this._triggerElement = null;
157
+ this._triggerAbortController?.abort();
158
+ this._openStateController?.abort();
159
+ popoversRef.delete(this);
160
+ if (this._blurTimeout) clearTimeout(this._blurTimeout);
161
+ }
162
+ _configureTrigger() {
163
+ if (isServer) return;
164
+ else if (this.hydrationRequired) {
165
+ this.hydrationComplete.then(() => this._configureTrigger());
166
+ return;
167
+ }
168
+ this.configureTrigger(this._triggerElement ?? null);
169
+ }
170
+ configureTrigger(_oldTrigger) {
171
+ this._triggerAbortController?.abort();
172
+ removeAriaOverlayTriggerAttributes(this._triggerElement);
173
+ this._triggerElement = this.trigger;
174
+ if (!this._triggerElement) return;
175
+ setAriaOverlayTriggerAttributes(this._triggerElement, "dialog", this.id, this.state);
176
+ this._triggerAbortController = new AbortController();
177
+ this.registerTriggerListeners(this._triggerAbortController.signal);
178
+ }
179
+ registerTriggerListeners(signal) {
180
+ this._triggerElement.addEventListener("click", () => this.open(), { signal });
181
+ }
182
+ _attachWindowEvents() {
183
+ this._openStateController = new AbortController();
184
+ document.addEventListener("scroll", () => this._setPopoverPosition(), {
185
+ passive: true,
186
+ signal: this._openStateController.signal,
187
+ capture: true
188
+ });
189
+ window.addEventListener("resize", () => this._setPopoverPosition(), {
190
+ passive: true,
191
+ signal: this._openStateController.signal
192
+ });
193
+ window.addEventListener("pointerdown", this._pointerDownListener, { signal: this._openStateController.signal });
194
+ window.addEventListener("pointerup", this._closeOnBackdropClick, { signal: this._openStateController.signal });
195
+ }
196
+ _closeOnSbbPopoverCloseClick(event) {
197
+ const closeElement = composedPathHasAttribute(event, "sbb-popover-close", this);
198
+ if (closeElement && !closeElement.hasAttribute("disabled")) {
199
+ clearTimeout(this.closeTimeout);
200
+ this.close(closeElement);
201
+ }
202
+ }
203
+ _onPopoverAnimationEnd(event) {
204
+ if (event.animationName === "open" && this.state === "opening") this._handleOpening();
205
+ else if (event.animationName === "close" && this.state === "closing") this._handleClosing();
206
+ }
207
+ _setPopoverFocus() {
208
+ if (!this._focusTrapController.focusInitialElement() && this._openStateController) {
209
+ this.setAttribute("tabindex", "0");
210
+ this.focus();
211
+ this.addEventListener("blur", (e) => {
212
+ this._blurTimeout = setTimeout(() => {
213
+ if (document.visibilityState !== "hidden") {
214
+ this.removeAttribute("tabindex");
215
+ if (this.contains(e.relatedTarget) || e.relatedTarget === this.trigger) return;
216
+ if (this.state === "opened" || this.state === "opening") this._skipCloseFocus = true;
217
+ this.close();
218
+ }
219
+ });
220
+ }, { signal: this._openStateController.signal });
221
+ }
222
+ }
223
+ _setPopoverPosition() {
224
+ if (!this.overlay || !this._triggerElement) return;
225
+ const popoverPosition = getElementPosition(this.overlay, this._triggerElement, this.shadowRoot.querySelector(".sbb-popover__container"), {
226
+ verticalOffset: VERTICAL_OFFSET,
227
+ horizontalOffset: HORIZONTAL_OFFSET,
228
+ centered: true,
229
+ responsiveHeight: true
230
+ });
231
+ const verticalPosition = popoverPosition.alignment.vertical;
232
+ for (const position of ["above", "below"]) this.toggleState(`position-${position}`, position === verticalPosition);
233
+ const arrowXPosition = this._triggerElement.getBoundingClientRect().left - popoverPosition.left + this._triggerElement.clientWidth / 2 - 8;
234
+ this.style.setProperty("--_sbb-popover-position-x", `${popoverPosition.left}px`);
235
+ this.style.setProperty("--_sbb-popover-position-y", `${popoverPosition.top}px`);
236
+ this.style.setProperty("--_sbb-popover-arrow-position-x", `${arrowXPosition}px`);
237
+ this.style.setProperty("--_sbb-popover-max-height", popoverPosition.maxHeight);
238
+ }
239
+ dispatchBeforeCloseEvent(detail) {
240
+ /**
241
+ * @type {CustomEvent<{ closeTarget: HTMLElement | null }>}
242
+ * Emits whenever the component begins the closing transition. Can be canceled.
243
+ */
244
+ return this.dispatchEvent(new CustomEvent("beforeclose", {
245
+ detail,
246
+ cancelable: true
247
+ }));
248
+ }
249
+ dispatchCloseEvent(detail) {
250
+ /**
251
+ * @type {CustomEvent<{ closeTarget: HTMLElement | null }>}
252
+ * Emits whenever the component is closed.
253
+ */
254
+ return this.dispatchEvent(new CustomEvent("close", { detail }));
255
+ }
256
+ render() {
257
+ return html`
258
+ <div class="sbb-popover__container">
259
+ <div
260
+ @animationend=${this._onPopoverAnimationEnd}
261
+ class="sbb-popover"
262
+ role="tooltip"
263
+ ${ref((el) => this.overlay = el)}
264
+ >
265
+ <div
266
+ @click=${(event) => this._closeOnSbbPopoverCloseClick(event)}
267
+ class="sbb-popover__content"
268
+ >
269
+ ${this.renderContent()}
270
+ </div>
271
+ </div>
272
+ </div>
273
+ `;
274
+ }
275
+ };
276
+ })();
277
+ /**
278
+ * It displays contextual information within a popover.
279
+ *
280
+ * @slot - Use the unnamed slot to add content into the popover.
281
+ * @cssprop [--sbb-popover-z-index=var(--sbb-overlay-default-z-index)] - To specify a custom stack order,
282
+ * the `z-index` can be overridden by defining this CSS variable. The default `z-index` of the
283
+ * component is set to `var(--sbb-overlay-default-z-index)` with a value of `1000`.
284
+ */
285
+ var SbbPopoverElement = (() => {
286
+ let _classSuper = SbbPopoverBaseElement;
287
+ let _instanceExtraInitializers = [];
288
+ let _hideCloseButton_decorators;
289
+ let _hideCloseButton_initializers = [];
290
+ let _hideCloseButton_extraInitializers = [];
291
+ let _hoverTrigger_decorators;
292
+ let _hoverTrigger_initializers = [];
293
+ let _hoverTrigger_extraInitializers = [];
294
+ let _set_openDelay_decorators;
295
+ let _set_closeDelay_decorators;
296
+ let _accessibilityCloseLabel_decorators;
297
+ let _accessibilityCloseLabel_initializers = [];
298
+ let _accessibilityCloseLabel_extraInitializers = [];
299
+ return class SbbPopoverElement extends _classSuper {
300
+ constructor() {
301
+ super(...arguments);
302
+ this.#hideCloseButton_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _hideCloseButton_initializers, false));
303
+ this.#hoverTrigger_accessor_storage = (__runInitializers(this, _hideCloseButton_extraInitializers), __runInitializers(this, _hoverTrigger_initializers, false));
304
+ this._openDelay = __runInitializers(this, _hoverTrigger_extraInitializers);
305
+ this.#accessibilityCloseLabel_accessor_storage = __runInitializers(this, _accessibilityCloseLabel_initializers, "");
306
+ this._hoverTrigger = (__runInitializers(this, _accessibilityCloseLabel_extraInitializers), false);
307
+ this._language = new SbbLanguageController(this);
308
+ this._overlayAbortController = null;
309
+ this._onTriggerMouseEnter = () => {
310
+ if (this.state === "closed" || this.state === "closing") this._openTimeout = setTimeout(() => {
311
+ sbbInputModalityDetector.reset();
312
+ this.open();
313
+ }, this.openDelay);
314
+ else clearTimeout(this.closeTimeout);
315
+ };
316
+ this._onTriggerMouseLeave = () => {
317
+ if (this.state === "opened" || this.state === "opening") this.closeTimeout = setTimeout(() => this.close(), this.closeDelay);
318
+ else clearTimeout(this._openTimeout);
319
+ };
320
+ this._onOverlayMouseEnter = () => {
321
+ if (this.state !== "opening") clearTimeout(this.closeTimeout);
322
+ };
323
+ this._onOverlayMouseLeave = () => {
324
+ if (this.state !== "opening") this.closeTimeout = setTimeout(() => this.close(), this.closeDelay);
325
+ };
326
+ }
327
+ static {
328
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
329
+ _hideCloseButton_decorators = [forceType(), property({
330
+ attribute: "hide-close-button",
331
+ type: Boolean,
332
+ reflect: true
333
+ })];
334
+ _hoverTrigger_decorators = [forceType(), property({
335
+ attribute: "hover-trigger",
336
+ type: Boolean
337
+ })];
338
+ _set_openDelay_decorators = [property({
339
+ attribute: "open-delay",
340
+ type: Number
341
+ })];
342
+ _set_closeDelay_decorators = [property({
343
+ attribute: "close-delay",
344
+ type: Number
345
+ })];
346
+ _accessibilityCloseLabel_decorators = [forceType(), property({ attribute: "accessibility-close-label" })];
347
+ __esDecorate(this, null, _hideCloseButton_decorators, {
348
+ kind: "accessor",
349
+ name: "hideCloseButton",
350
+ static: false,
351
+ private: false,
352
+ access: {
353
+ has: (obj) => "hideCloseButton" in obj,
354
+ get: (obj) => obj.hideCloseButton,
355
+ set: (obj, value) => {
356
+ obj.hideCloseButton = value;
357
+ }
358
+ },
359
+ metadata: _metadata
360
+ }, _hideCloseButton_initializers, _hideCloseButton_extraInitializers);
361
+ __esDecorate(this, null, _hoverTrigger_decorators, {
362
+ kind: "accessor",
363
+ name: "hoverTrigger",
364
+ static: false,
365
+ private: false,
366
+ access: {
367
+ has: (obj) => "hoverTrigger" in obj,
368
+ get: (obj) => obj.hoverTrigger,
369
+ set: (obj, value) => {
370
+ obj.hoverTrigger = value;
371
+ }
372
+ },
373
+ metadata: _metadata
374
+ }, _hoverTrigger_initializers, _hoverTrigger_extraInitializers);
375
+ __esDecorate(this, null, _set_openDelay_decorators, {
376
+ kind: "setter",
377
+ name: "openDelay",
378
+ static: false,
379
+ private: false,
380
+ access: {
381
+ has: (obj) => "openDelay" in obj,
382
+ set: (obj, value) => {
383
+ obj.openDelay = value;
384
+ }
385
+ },
386
+ metadata: _metadata
387
+ }, null, _instanceExtraInitializers);
388
+ __esDecorate(this, null, _set_closeDelay_decorators, {
389
+ kind: "setter",
390
+ name: "closeDelay",
391
+ static: false,
392
+ private: false,
393
+ access: {
394
+ has: (obj) => "closeDelay" in obj,
395
+ set: (obj, value) => {
396
+ obj.closeDelay = value;
397
+ }
398
+ },
399
+ metadata: _metadata
400
+ }, null, _instanceExtraInitializers);
401
+ __esDecorate(this, null, _accessibilityCloseLabel_decorators, {
402
+ kind: "accessor",
403
+ name: "accessibilityCloseLabel",
404
+ static: false,
405
+ private: false,
406
+ access: {
407
+ has: (obj) => "accessibilityCloseLabel" in obj,
408
+ get: (obj) => obj.accessibilityCloseLabel,
409
+ set: (obj, value) => {
410
+ obj.accessibilityCloseLabel = value;
411
+ }
412
+ },
413
+ metadata: _metadata
414
+ }, _accessibilityCloseLabel_initializers, _accessibilityCloseLabel_extraInitializers);
415
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, {
416
+ enumerable: true,
417
+ configurable: true,
418
+ writable: true,
419
+ value: _metadata
420
+ });
421
+ }
422
+ static {
423
+ this.elementName = "sbb-popover";
424
+ }
425
+ #hideCloseButton_accessor_storage;
426
+ /** Whether the close button should be hidden. */
427
+ get hideCloseButton() {
428
+ return this.#hideCloseButton_accessor_storage;
429
+ }
430
+ set hideCloseButton(value) {
431
+ this.#hideCloseButton_accessor_storage = value;
432
+ }
433
+ #hoverTrigger_accessor_storage;
434
+ /** Whether the popover should be triggered on hover. */
435
+ get hoverTrigger() {
436
+ return this.#hoverTrigger_accessor_storage;
437
+ }
438
+ set hoverTrigger(value) {
439
+ this.#hoverTrigger_accessor_storage = value;
440
+ }
441
+ /**
442
+ * Open the popover after a given delay in milliseconds.
443
+ * Global configuration is used as default, if not set.
444
+ *
445
+ * @default 0
446
+ */
447
+ set openDelay(value) {
448
+ this._openDelay = +value;
449
+ }
450
+ get openDelay() {
451
+ return this._openDelay ?? readConfig().popover?.openDelay ?? 0;
452
+ }
453
+ /**
454
+ * Close the popover after a given delay in milliseconds.
455
+ * Global configuration is used as default, if not set.
456
+ *
457
+ * @default 0
458
+ */
459
+ set closeDelay(value) {
460
+ this._closeDelay = +value;
461
+ }
462
+ get closeDelay() {
463
+ return this._closeDelay ?? readConfig().popover?.closeDelay ?? 0;
464
+ }
465
+ #accessibilityCloseLabel_accessor_storage;
466
+ /** This will be forwarded as aria-label to the close button element. */
467
+ get accessibilityCloseLabel() {
468
+ return this.#accessibilityCloseLabel_accessor_storage;
469
+ }
470
+ set accessibilityCloseLabel(value) {
471
+ this.#accessibilityCloseLabel_accessor_storage = value;
472
+ }
473
+ configureTrigger(oldTrigger) {
474
+ const hoverTrigger = this.hoverTrigger && !pointerCoarse;
475
+ if (this.trigger === oldTrigger && hoverTrigger === this._hoverTrigger) return;
476
+ if (this._hoverTrigger !== hoverTrigger) {
477
+ this._hoverTrigger = hoverTrigger;
478
+ this.toggleState("hover-trigger", this._hoverTrigger);
479
+ this._registerOverlayListeners();
480
+ }
481
+ super.configureTrigger(oldTrigger);
482
+ }
483
+ _registerOverlayListeners() {
484
+ this._overlayAbortController?.abort();
485
+ if (this._hoverTrigger) {
486
+ this._overlayAbortController = new AbortController();
487
+ this.overlay?.addEventListener("mouseenter", () => this._onOverlayMouseEnter(), { signal: this._overlayAbortController.signal });
488
+ this.overlay?.addEventListener("mouseleave", () => this._onOverlayMouseLeave(), { signal: this._overlayAbortController.signal });
489
+ }
490
+ }
491
+ registerTriggerListeners(signal) {
492
+ if (this._hoverTrigger && this.trigger) {
493
+ this.trigger.addEventListener("mouseenter", this._onTriggerMouseEnter, { signal });
494
+ this.trigger.addEventListener("mouseleave", this._onTriggerMouseLeave, { signal });
495
+ this.trigger.addEventListener("keydown", (evt) => {
496
+ if (evt.code === "Space" || evt.code === "Enter") this.open();
497
+ }, { signal });
498
+ this.trigger.addEventListener("mousedown", (evt) => {
499
+ if (isFakeMousedownFromScreenReader(evt)) this.open();
500
+ }, { signal });
501
+ } else super.registerTriggerListeners(signal);
502
+ }
503
+ firstUpdated(changedProperties) {
504
+ super.firstUpdated(changedProperties);
505
+ this._registerOverlayListeners();
506
+ }
507
+ open() {
508
+ super.open();
509
+ if (this.hoverTrigger && this.trigger) ɵstateController(this.trigger).add("force-hover");
510
+ }
511
+ close() {
512
+ super.close();
513
+ ɵstateController(this.trigger)?.delete("force-hover");
514
+ }
515
+ renderContent() {
516
+ const closeButton = html`
517
+ <sbb-secondary-button
518
+ aria-label=${this.accessibilityCloseLabel || i18nClosePopover[this._language.current]}
519
+ size="s"
520
+ type="button"
521
+ icon-name="cross-small"
522
+ sbb-popover-close
523
+ ></sbb-secondary-button>
524
+ `;
525
+ return html`
526
+ ${!this.hideCloseButton && !this._hoverTrigger ? closeButton : nothing}
527
+ <span class="sbb-popover__scrollable-content">
528
+ <slot>No content</slot>
529
+ </span>
530
+ `;
531
+ }
532
+ };
533
+ })();
534
+ //#endregion
535
+ export { SbbPopoverElement as n, SbbPopoverBaseElement as t };
536
+
537
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQtQjN0bTkzUGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3BvcG92ZXIvcG9wb3Zlci5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJy4uL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5cbjpob3N0IHtcbiAgLy8gQXMgdGhlIHBvcG92ZXIgaGFzIGFsd2F5cyBhIHdoaXRlIGJhY2tncm91bmQsIHdlIGhhdmUgdG8gZml4IHRoZSBmb2N1cyBvdXRsaW5lIGNvbG9yXG4gIC8vIHRvIGRlZmF1bHQgY29sb3IgZm9yIGNhc2VzIHdoZXJlIHRoZSBwb3BvdmVyIGlzIHVzZWQgaW4gYSBuZWdhdGl2ZSBjb250ZXh0LlxuICAtLXNiYi1mb2N1cy1vdXRsaW5lLWNvbG9yOiBsaWdodC1kYXJrKFxuICAgIHZhcigtLXNiYi1mb2N1cy1vdXRsaW5lLWNvbG9yLWRlZmF1bHQpLFxuICAgIHZhcigtLXNiYi1mb2N1cy1vdXRsaW5lLWNvbG9yLWRhcmspXG4gICk7XG4gIC0tc2JiLXBvcG92ZXItYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoXG4gICAgLS1zYmItZGlzYWJsZS1hbmltYXRpb24tZHVyYXRpb24sXG4gICAgdmFyKC0tc2JiLWFuaW1hdGlvbi1kdXJhdGlvbi00eClcbiAgKTtcbiAgLS1fc2JiLXBvcG92ZXItaW5zZXQ6IDAgYXV0byBhdXRvIDA7XG4gIC0tX3NiYi1wb3BvdmVyLXRyYW5zZm9ybTogdHJhbnNsYXRlWSh2YXIoLS1zYmItc3BhY2luZy1maXhlZC0yeCkpO1xuICAtLV9zYmItcG9wb3Zlci1ib3gtc2hhZG93OiB2YXIoLS1zYmItYm94LXNoYWRvdy1sZXZlbC05LWhhcmQpO1xuXG4gIC8vIFVzZSAhaW1wb3J0YW50IGhlcmUgdG8gbm90IGludGVyZmVyZSB3aXRoIEZpcmVmb3ggZm9jdXMgcmluZyBkZWZpbml0aW9uXG4gIC8vIHdoaWNoIGFwcGVhcnMgaW4gbm9ybWFsaXplIENTUyBvZiBzZXZlcmFsIGZyYW1ld29ya3MuXG4gIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuOmhvc3QoOmlzKDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSwgOnN0YXRlKHN0YXRlLW9wZW5lZCksIDpzdGF0ZShzdGF0ZS1jbG9zaW5nKSkpIHtcbiAgLS1fc2JiLXBvcG92ZXItaW5zZXQ6IDA7XG5cbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbjpob3N0KDpzdGF0ZShwb3NpdGlvbi1hYm92ZSkpIHtcbiAgLS1fc2JiLXBvcG92ZXItdHJhbnNmb3JtOiB0cmFuc2xhdGVZKGNhbGModmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMngpICogLTEpKTtcbn1cblxuOmhvc3QoOm5vdChbaGlkZS1jbG9zZS1idXR0b25dLCA6c3RhdGUoaG92ZXItdHJpZ2dlcikpKSB7XG4gIC0tc2JiLXBvcG92ZXItbWluLWhlaWdodDogY2FsYyh2YXIoLS1zYmItc2l6ZS1lbGVtZW50LXhzKSArIDIgKiB2YXIoLS1zYmItcG9wb3Zlci1wYWRkaW5nKSk7XG59XG5cbi8vIFBvcG92ZXIgYXJyb3cgYW5kIGFycm93IHRvcCBjb3ZlclxuLnNiYi1wb3BvdmVyOjphZnRlcixcbi5zYmItcG9wb3Zlcl9fY29udGVudDo6YmVmb3JlIHtcbiAgY29udGVudDogJyc7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiB2YXIoLS1zYmItcG9wb3Zlci1hcnJvdy1zaXplKTtcbiAgaGVpZ2h0OiB2YXIoLS1zYmItcG9wb3Zlci1hcnJvdy1zaXplKTtcbiAgbGVmdDogdmFyKC0tX3NiYi1wb3BvdmVyLWFycm93LXBvc2l0aW9uLXgsIDApO1xuICBib3R0b206IGNhbGMoMTAwJSAtIGNhbGModmFyKC0tc2JiLXBvcG92ZXItYXJyb3ctc2l6ZSkgLyAyKSk7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNiYi1wb3BvdmVyLWJhY2tncm91bmQpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1zYmItYm9yZGVyLXJhZGl1cy0yeCkgMDtcbiAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xufVxuXG4uc2JiLXBvcG92ZXJfX2NvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgaW5zZXQ6IHZhcigtLV9zYmItcG9wb3Zlci1pbnNldCk7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB6LWluZGV4OiB2YXIoLS1zYmItcG9wb3Zlci16LWluZGV4LCB2YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpKTtcbn1cblxuLnNiYi1wb3BvdmVyIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgcG9zaXRpb246IHZhcigtLXNiYi1wb3BvdmVyLXBvc2l0aW9uLCBhYnNvbHV0ZSk7XG4gIHRvcDogdmFyKC0tX3NiYi1wb3BvdmVyLXBvc2l0aW9uLXksIDApO1xuICBib3R0b206IHVuc2V0O1xuICBsZWZ0OiB2YXIoLS1fc2JiLXBvcG92ZXItcG9zaXRpb24teCwgMCk7XG4gIHJpZ2h0OiB1bnNldDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2JiLXBvcG92ZXItYmFja2dyb3VuZCk7XG4gIG1heC13aWR0aDogdmFyKC0tc2JiLXBvcG92ZXItbWF4LXdpZHRoKTtcbiAgd2lkdGg6IG1heC1jb250ZW50O1xuICBwYWRkaW5nOiAwO1xuICBib3gtc2hhZG93OiB2YXIoLS1fc2JiLXBvcG92ZXItYm94LXNoYWRvdyk7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tc2JiLXBvcG92ZXItYm9yZGVyLXJhZGl1cyk7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHBvaW50ZXItZXZlbnRzOiBhbGw7XG5cbiAgOmhvc3QoOmZvY3VzLXZpc2libGUpICYge1xuICAgIEBpbmNsdWRlIHNiYi5mb2N1cy1vdXRsaW5lO1xuICB9XG5cbiAgOmhvc3QoOmlzKDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSwgOnN0YXRlKHN0YXRlLW9wZW5lZCksIDpzdGF0ZShzdGF0ZS1jbG9zaW5nKSkpICYge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuXG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICBuYW1lOiBvcGVuO1xuICAgICAgZHVyYXRpb246IHZhcigtLXNiYi1wb3BvdmVyLWFuaW1hdGlvbi1kdXJhdGlvbik7XG4gICAgICB0aW1pbmctZnVuY3Rpb246IHZhcigtLXNiYi1wb3BvdmVyLWFuaW1hdGlvbi1lYXNpbmcpO1xuICAgIH1cbiAgfVxuXG4gIDpob3N0KDpzdGF0ZShzdGF0ZS1jbG9zaW5nKSkgJiB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICBuYW1lOiBjbG9zZTtcbiAgICAgIGR1cmF0aW9uOiB2YXIoLS1zYmItcG9wb3Zlci1hbmltYXRpb24tZHVyYXRpb24pO1xuICAgICAgdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1zYmItcG9wb3Zlci1hbmltYXRpb24tZWFzaW5nKTtcbiAgICB9XG4gIH1cblxuICAvLyBQb3BvdmVyIGFycm93XG4gICY6OmFmdGVyIHtcbiAgICB6LWluZGV4OiAtMTtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1fc2JiLXBvcG92ZXItYm94LXNoYWRvdyk7XG5cbiAgICBAaW5jbHVkZSBzYmIuaWYtZm9yY2VkLWNvbG9ycyB7XG4gICAgICBvdXRsaW5lOiB2YXIoLS1zYmItYm9yZGVyLXdpZHRoLTF4KSBzb2xpZCBDYW52YXNUZXh0O1xuICAgIH1cblxuICAgIDpob3N0KDpzdGF0ZShwb3NpdGlvbi1hYm92ZSkpICYge1xuICAgICAgdG9wOiBjYWxjKDEwMCUgLSBjYWxjKHZhcigtLXNiYi1wb3BvdmVyLWFycm93LXNpemUpIC8gMikpO1xuICAgIH1cbiAgfVxuXG4gIEBpbmNsdWRlIHNiYi5pZi1mb3JjZWQtY29sb3JzIHtcbiAgICBvdXRsaW5lOiB2YXIoLS1zYmItYm9yZGVyLXdpZHRoLTF4KSBzb2xpZCBDYW52YXNUZXh0O1xuICB9XG5cbiAgLy8gVHJhbnNwYXJlbnQgYXJlYSB3aGljaCBpbmNyZWFzZXMgaG92ZXIgYXJlYSBpbiBvcmRlciB0byBub3QgdHJpZ2dlciBjbG9zaW5nIHRvbyBlYXJseS5cbiAgJjo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgaW5zZXQ6IDA7XG4gICAgei1pbmRleDogLTE7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cbiAgICA6aG9zdCg6c3RhdGUocG9zaXRpb24tYmVsb3cpKSAmIHtcbiAgICAgIGluc2V0LWJsb2NrLXN0YXJ0OiBjYWxjKC0xICogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtNngpKTtcbiAgICB9XG5cbiAgICA6aG9zdCg6c3RhdGUocG9zaXRpb24tYWJvdmUpKSAmIHtcbiAgICAgIGluc2V0LWJsb2NrLWVuZDogY2FsYygtMSAqIHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTZ4KSk7XG4gICAgfVxuICB9XG59XG5cbi5zYmItcG9wb3Zlcl9fY29udGVudCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtNHgpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1zYmItcG9wb3Zlci1ib3JkZXItcmFkaXVzKTtcbiAgcGFkZGluZy1ibG9jazogdmFyKC0tc2JiLXBvcG92ZXItcGFkZGluZykgMDtcbiAgcGFkZGluZy1pbmxpbmU6IHZhcigtLXNiYi1wb3BvdmVyLXBhZGRpbmcpO1xuICBvdXRsaW5lOiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zYmItcG9wb3Zlci1iYWNrZ3JvdW5kKTtcbiAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICBtaW4taGVpZ2h0OiB2YXIoLS1zYmItcG9wb3Zlci1taW4taGVpZ2h0KTtcblxuICA6aG9zdCg6c3RhdGUocG9zaXRpb24tYWJvdmUpKSAmIHtcbiAgICAmOjpiZWZvcmUge1xuICAgICAgdG9wOiBjYWxjKDEwMCUgLSBjYWxjKHZhcigtLXNiYi1wb3BvdmVyLWFycm93LXNpemUpIC8gMikpO1xuICAgIH1cbiAgfVxufVxuXG4uc2JiLXBvcG92ZXJfX3Njcm9sbGFibGUtY29udGVudCB7XG4gIEBpbmNsdWRlIHNiYi5zY3JvbGxiYXI7XG5cbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmctYmxvY2stZW5kOiB2YXIoLS1zYmItcG9wb3Zlci1wYWRkaW5nKTtcbiAgbWF4LWhlaWdodDogY2FsYyh2YXIoLS1fc2JiLXBvcG92ZXItbWF4LWhlaWdodCkpO1xuICBvdmVyZmxvdzogYXV0bztcbn1cblxuQGtleWZyYW1lcyBvcGVuIHtcbiAgZnJvbSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2Zvcm06IHZhcigtLV9zYmItcG9wb3Zlci10cmFuc2Zvcm0pO1xuICB9XG5cbiAgdG8ge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgY2xvc2Uge1xuICBmcm9tIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgfVxuXG4gIHRvIHtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHRyYW5zZm9ybTogdmFyKC0tX3NiYi1wb3BvdmVyLXRyYW5zZm9ybSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGh0bWwsXG4gIGlzU2VydmVyLFxuICBub3RoaW5nLFxuICB1bnNhZmVDU1MsXG4gIHR5cGUgQ1NTUmVzdWx0R3JvdXAsXG4gIHR5cGUgUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcblxuaW1wb3J0IHsgU2JiU2Vjb25kYXJ5QnV0dG9uRWxlbWVudCB9IGZyb20gJy4uL2J1dHRvbi5wdXJlLnRzJztcbmltcG9ydCB7XG4gIElTX0ZPQ1VTQUJMRV9RVUVSWSxcbiAgaXNGYWtlTW91c2Vkb3duRnJvbVNjcmVlblJlYWRlcixcbiAgU2JiRm9jdXNUcmFwQ29udHJvbGxlcixcbiAgc2JiSW5wdXRNb2RhbGl0eURldGVjdG9yLFxufSBmcm9tICcuLi9jb3JlL2ExMXkudHMnO1xuaW1wb3J0IHsgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQgfSBmcm9tICcuLi9jb3JlL2Jhc2UtZWxlbWVudHMudHMnO1xuaW1wb3J0IHsgcmVhZENvbmZpZyB9IGZyb20gJy4uL2NvcmUvY29uZmlnLnRzJztcbmltcG9ydCB7XG4gIFNiYkVzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLFxuICBTYmJMYW5ndWFnZUNvbnRyb2xsZXIsXG4gIFNiYk1lZGlhUXVlcnlQb2ludGVyQ29hcnNlLFxufSBmcm9tICcuLi9jb3JlL2NvbnRyb2xsZXJzLnRzJztcbmltcG9ydCB7IGZvcmNlVHlwZSwgaWRSZWZlcmVuY2UgfSBmcm9tICcuLi9jb3JlL2RlY29yYXRvcnMudHMnO1xuaW1wb3J0IHsgaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24gfSBmcm9tICcuLi9jb3JlL2RvbS50cyc7XG5pbXBvcnQgeyBjb21wb3NlZFBhdGhIYXNBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL2V2ZW50aW5nLnRzJztcbmltcG9ydCB7IGkxOG5DbG9zZVBvcG92ZXIgfSBmcm9tICcuLi9jb3JlL2kxOG4udHMnO1xuaW1wb3J0IHsgybVzdGF0ZUNvbnRyb2xsZXIgfSBmcm9tICcuLi9jb3JlL21peGlucy50cyc7XG5pbXBvcnQge1xuICBnZXRFbGVtZW50UG9zaXRpb24sXG4gIGlzRXZlbnRPbkVsZW1lbnQsXG4gIHJlbW92ZUFyaWFPdmVybGF5VHJpZ2dlckF0dHJpYnV0ZXMsXG4gIHNldEFyaWFPdmVybGF5VHJpZ2dlckF0dHJpYnV0ZXMsXG59IGZyb20gJy4uL2NvcmUvb3ZlcmxheS50cyc7XG5pbXBvcnQgeyBib3hTaXppbmdTdHlsZXMgfSBmcm9tICcuLi9jb3JlL3N0eWxlcy50cyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL3BvcG92ZXIuc2Nzcz9pbmxpbmUnO1xuXG4vLyBUT0RPKGJyZWFraW5nLWNoYW5nZSk6IFJlbW92ZSBjYWxsIHRvIGRlZmluZS5cblNiYlNlY29uZGFyeUJ1dHRvbkVsZW1lbnQuZGVmaW5lKCk7XG5cbmNvbnN0IFZFUlRJQ0FMX09GRlNFVCA9IDE2O1xuY29uc3QgSE9SSVpPTlRBTF9PRkZTRVQgPSAzMjtcblxubGV0IG5leHRJZCA9IDA7XG5cbmNvbnN0IHBvcG92ZXJzUmVmID0gbmV3IFNldDxTYmJQb3BvdmVyQmFzZUVsZW1lbnQ+KCk7XG5jb25zdCBwb2ludGVyQ29hcnNlID0gaXNTZXJ2ZXIgPyBmYWxzZSA6IG1hdGNoTWVkaWEoU2JiTWVkaWFRdWVyeVBvaW50ZXJDb2Fyc2UpLm1hdGNoZXM7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTYmJQb3BvdmVyQmFzZUVsZW1lbnQgZXh0ZW5kcyBTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFtib3hTaXppbmdTdHlsZXMsIHVuc2FmZUNTUyhzdHlsZSldO1xuXG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgcG9wb3ZlciBvdmVybGF5LlxuICAgKlxuICAgKiBGb3IgYXR0cmlidXRlIHVzYWdlLCBwcm92aWRlIGFuIGlkIHJlZmVyZW5jZS5cbiAgICovXG4gIEBpZFJlZmVyZW5jZSgpXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBhY2Nlc3NvciB0cmlnZ2VyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFRoZSBlbGVtZW50IHdoaWNoIHNob3VsZCByZWNlaXZlIGZvY3VzIGFmdGVyIGNsb3NpbmcgYmFzZWQgb24gd2hlcmUgaW4gdGhlIGJhY2tkcm9wIHRoZSB1c2VyIGNsaWNrcy5cbiAgcHJpdmF0ZSBfbmV4dEZvY3VzZWRFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3NraXBDbG9zZUZvY3VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3BvcG92ZXJDbG9zZUVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfaXNQb2ludGVyRG93bkV2ZW50T25Qb3BvdmVyPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfdHJpZ2dlckVsZW1lbnQ/OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIHByaXZhdGUgX3RyaWdnZXJBYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG4gIHByaXZhdGUgX29wZW5TdGF0ZUNvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG4gIHByaXZhdGUgX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyID0gbmV3IFNiYkVzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9mb2N1c1RyYXBDb250cm9sbGVyID0gbmV3IFNiYkZvY3VzVHJhcENvbnRyb2xsZXIodGhpcyk7XG4gIHByaXZhdGUgX2JsdXJUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgY2xvc2VUaW1lb3V0PzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByb3RlY3RlZCBvdmVybGF5PzogSFRNTERpdkVsZW1lbnQ7XG5cbiAgLyoqIE9wZW5zIHRoZSBwb3BvdmVyIG9uIHRyaWdnZXIgY2xpY2suICovXG4gIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICh0aGlzLnN0YXRlICE9PSAnY2xvc2VkJyAmJiB0aGlzLnN0YXRlICE9PSAnY2xvc2luZycpIHx8XG4gICAgICAhdGhpcy5vdmVybGF5IHx8XG4gICAgICAhdGhpcy5kaXNwYXRjaEJlZm9yZU9wZW5FdmVudCgpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgdGhlIG90aGVyIHBvcG92ZXJzXG4gICAgZm9yIChjb25zdCBwb3BvdmVyIG9mIHBvcG92ZXJzUmVmKSB7XG4gICAgICBpZiAocG9wb3Zlci5zdGF0ZSA9PT0gJ29wZW5lZCcgfHwgcG9wb3Zlci5zdGF0ZSA9PT0gJ29wZW5pbmcnKSB7XG4gICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNob3dQb3BvdmVyPy4oKTtcbiAgICB0aGlzLnN0YXRlID0gJ29wZW5pbmcnO1xuICAgIHRoaXMuaW5lcnQgPSB0cnVlO1xuICAgIHRoaXMuX3NldFBvcG92ZXJQb3NpdGlvbigpO1xuICAgIHRoaXMuX2F0dGFjaFdpbmRvd0V2ZW50cygpO1xuICAgIHRoaXMuX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLmNvbm5lY3QoKTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudD8uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICB0aGlzLl9uZXh0Rm9jdXNlZEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc2tpcENsb3NlRm9jdXMgPSBmYWxzZTtcblxuICAgIC8vIElmIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaXMgemVybywgdGhlIGFuaW1hdGlvbmVuZCBldmVudCBpcyBub3QgYWx3YXlzIGZpcmVkIHJlbGlhYmx5LlxuICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBkaXJlY3RseSBzZXQgdGhlIGBvcGVuZWRgIHN0YXRlLlxuICAgIGlmICh0aGlzLl9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpKSB7XG4gICAgICB0aGlzLl9oYW5kbGVPcGVuaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsb3NlcyB0aGUgcG9wb3Zlci4gKi9cbiAgcHVibGljIGNsb3NlKHRhcmdldD86IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09ICdvcGVuZWQnICYmIHRoaXMuc3RhdGUgIT09ICdvcGVuaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3BvcG92ZXJDbG9zZUVsZW1lbnQgPSB0YXJnZXQ7XG4gICAgaWYgKCF0aGlzLmRpc3BhdGNoQmVmb3JlQ2xvc2VFdmVudCh7IGNsb3NlVGFyZ2V0OiB0YXJnZXQgPz8gbnVsbCB9KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2luZyc7XG4gICAgdGhpcy5pbmVydCA9IHRydWU7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuXG4gICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpcyB6ZXJvLCB0aGUgYW5pbWF0aW9uZW5kIGV2ZW50IGlzIG5vdCBhbHdheXMgZmlyZWQgcmVsaWFibHkuXG4gICAgLy8gSW4gdGhpcyBjYXNlIHdlIGRpcmVjdGx5IHNldCB0aGUgYGNsb3NlZGAgc3RhdGUuXG4gICAgaWYgKHRoaXMuX2lzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNsb3NpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24odGhpcywgJy0tc2JiLXBvcG92ZXItYW5pbWF0aW9uLWR1cmF0aW9uJyk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVDbG9zaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICB0aGlzLmhpZGVQb3BvdmVyPy4oKTtcblxuICAgIHRoaXMub3ZlcmxheT8uZmlyc3RFbGVtZW50Q2hpbGQ/LnNjcm9sbFRvKDAsIDApO1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuXG4gICAgaWYgKCF0aGlzLl9za2lwQ2xvc2VGb2N1cykge1xuICAgICAgY29uc3QgZWxlbWVudFRvRm9jdXMgPSB0aGlzLl9uZXh0Rm9jdXNlZEVsZW1lbnQgfHwgdGhpcy5fdHJpZ2dlckVsZW1lbnQ7XG5cbiAgICAgIC8vIFRvIGVuYWJsZSBmb2N1c2luZyBvdGhlciBlbGVtZW50IHRoYW4gdGhlIHRyaWdnZXIsIHdlIG5lZWQgdG8gY2FsbCBmb2N1cygpIGEgc2Vjb25kIHRpbWUuXG4gICAgICBlbGVtZW50VG9Gb2N1cz8uZm9jdXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlci5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5fb3BlblN0YXRlQ29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB0aGlzLl9mb2N1c1RyYXBDb250cm9sbGVyLmVuYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRpc3BhdGNoQ2xvc2VFdmVudCh7IGNsb3NlVGFyZ2V0OiB0aGlzLl9wb3BvdmVyQ2xvc2VFbGVtZW50ID8/IG51bGwgfSk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVPcGVuaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmVkJztcbiAgICB0aGlzLmluZXJ0ID0gZmFsc2U7XG4gICAgdGhpcy5fc2V0UG9wb3ZlckZvY3VzKCk7XG4gICAgdGhpcy5fZm9jdXNUcmFwQ29udHJvbGxlci5lbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLmRpc3BhdGNoT3BlbkV2ZW50KCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5wb3BvdmVyID0gJ21hbnVhbCc7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmlkIHx8PSBgc2JiLXBvcG92ZXItJHsrK25leHRJZH1gO1xuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICBwb3BvdmVyc1JlZi5hZGQodGhpcyk7XG4gICAgaWYgKHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5fY29uZmlndXJlVHJpZ2dlcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSByZXF1ZXN0VXBkYXRlKFxuICAgIG5hbWU/OiBQcm9wZXJ0eUtleSxcbiAgICBvbGRWYWx1ZT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFByb3BlcnR5RGVjbGFyYXRpb24sXG4gICk6IHZvaWQge1xuICAgIHN1cGVyLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuXG4gICAgLy8gQ2hlY2tpbmcgZm9yIGhvdmVyVHJpZ2dlciBpcyBhIHNwZWNpYWwgY2FzZSwgYXMgb25seSB0aGUgU2JiUG9wb3ZlckVsZW1lbnRcbiAgICAvLyBzdWJjbGFzcyBoYXMgdGhpcyBwcm9wZXJ0eS5cbiAgICBpZiAoIWlzU2VydmVyICYmICghbmFtZSB8fCBuYW1lID09PSAndHJpZ2dlcicgfHwgbmFtZSA9PT0gJ2hvdmVyVHJpZ2dlcicpICYmIHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5fY29uZmlndXJlVHJpZ2dlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB0aGlzLl9jb25maWd1cmVUcmlnZ2VyKCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5fdHJpZ2dlckFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHBvcG92ZXJzUmVmLmRlbGV0ZSh0aGlzKTtcbiAgICBpZiAodGhpcy5fYmx1clRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ibHVyVGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHRyaWdnZXIgaXMgdmFsaWQgYW5kIGF0dGFjaCBjbGljayBldmVudCBsaXN0ZW5lcnMuXG4gIHByaXZhdGUgX2NvbmZpZ3VyZVRyaWdnZXIoKTogdm9pZCB7XG4gICAgaWYgKGlzU2VydmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmICh0aGlzLmh5ZHJhdGlvblJlcXVpcmVkKSB7XG4gICAgICB0aGlzLmh5ZHJhdGlvbkNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5fY29uZmlndXJlVHJpZ2dlcigpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZ3VyZVRyaWdnZXIodGhpcy5fdHJpZ2dlckVsZW1lbnQgPz8gbnVsbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlVHJpZ2dlcihfb2xkVHJpZ2dlcjogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fdHJpZ2dlckFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICByZW1vdmVBcmlhT3ZlcmxheVRyaWdnZXJBdHRyaWJ1dGVzKHRoaXMuX3RyaWdnZXJFbGVtZW50KTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudCA9IHRoaXMudHJpZ2dlcjtcblxuICAgIGlmICghdGhpcy5fdHJpZ2dlckVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRBcmlhT3ZlcmxheVRyaWdnZXJBdHRyaWJ1dGVzKHRoaXMuX3RyaWdnZXJFbGVtZW50LCAnZGlhbG9nJywgdGhpcy5pZCwgdGhpcy5zdGF0ZSk7XG5cbiAgICB0aGlzLl90cmlnZ2VyQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRoaXMucmVnaXN0ZXJUcmlnZ2VyTGlzdGVuZXJzKHRoaXMuX3RyaWdnZXJBYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlclRyaWdnZXJMaXN0ZW5lcnMoc2lnbmFsOiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50IS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMub3BlbigpLCB7IHNpZ25hbCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2F0dGFjaFdpbmRvd0V2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHRoaXMuX3NldFBvcG92ZXJQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIC8vIFdpdGhvdXQgY2FwdHVyZSwgb3RoZXIgc2Nyb2xsIGNvbnRleHRzIHdvdWxkIG5vdCBidWJibGUgdG8gdGhpcyBldmVudCBsaXN0ZW5lci5cbiAgICAgIC8vIENhcHR1cmUgYWxsb3dzIHVzIHRvIHJlYWN0IHRvIGFsbCBzY3JvbGwgY29udGV4dHMgaW4gdGhpcyBET00uXG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLl9zZXRQb3BvdmVyUG9zaXRpb24oKSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblN0YXRlQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgLy8gQ2xvc2UgcG9wb3ZlciBvbiBiYWNrZHJvcCBjbGlja1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMuX3BvaW50ZXJEb3duTGlzdGVuZXIsIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblN0YXRlQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMuX2Nsb3NlT25CYWNrZHJvcENsaWNrLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX29wZW5TdGF0ZUNvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ2xvc2UgdGhlIHBvcG92ZXIgb24gY2xpY2sgb2YgYW55IGVsZW1lbnQgdGhhdCBoYXMgdGhlICdzYmItcG9wb3Zlci1jbG9zZScgYXR0cmlidXRlLlxuICBwcml2YXRlIF9jbG9zZU9uU2JiUG9wb3ZlckNsb3NlQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2xvc2VFbGVtZW50ID0gY29tcG9zZWRQYXRoSGFzQXR0cmlidXRlKGV2ZW50LCAnc2JiLXBvcG92ZXItY2xvc2UnLCB0aGlzKTtcblxuICAgIGlmIChjbG9zZUVsZW1lbnQgJiYgIWNsb3NlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNsb3NlVGltZW91dCk7XG4gICAgICB0aGlzLmNsb3NlKGNsb3NlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHBvaW50ZXJkb3duIGV2ZW50IHRhcmdldCBpcyB0cmlnZ2VyZWQgb24gdGhlIHBvcG92ZXIuXG4gIHByaXZhdGUgX3BvaW50ZXJEb3duTGlzdGVuZXIgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2lzUG9pbnRlckRvd25FdmVudE9uUG9wb3ZlciA9IGlzRXZlbnRPbkVsZW1lbnQodGhpcy5vdmVybGF5ISwgZXZlbnQpO1xuICB9O1xuXG4gIC8vIENsb3NlIHBvcG92ZXIgb24gYmFja2Ryb3AgY2xpY2suXG4gIHByaXZhdGUgX2Nsb3NlT25CYWNrZHJvcENsaWNrID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBjb25zdCBjb21wb3NlZFBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5faXNQb2ludGVyRG93bkV2ZW50T25Qb3BvdmVyICYmXG4gICAgICAhaXNFdmVudE9uRWxlbWVudCh0aGlzLm92ZXJsYXkhLCBldmVudCkgJiZcbiAgICAgICghdGhpcy50cmlnZ2VyIHx8ICFjb21wb3NlZFBhdGguaW5jbHVkZXModGhpcy50cmlnZ2VyKSlcbiAgICApIHtcbiAgICAgIHRoaXMuX25leHRGb2N1c2VkRWxlbWVudCA9IGNvbXBvc2VkUGF0aFxuICAgICAgICAuZmlsdGVyKChlbCkgPT4gZWwgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEVsZW1lbnQpXG4gICAgICAgIC5maW5kKChlbCkgPT4gKGVsIGFzIEhUTUxFbGVtZW50KS5tYXRjaGVzKElTX0ZPQ1VTQUJMRV9RVUVSWSkpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VUaW1lb3V0KTtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gU2V0IHBvcG92ZXIgcG9zaXRpb24gKHgsIHkpIHRvICcwJyBvbmNlIHRoZSBwb3BvdmVyIGlzIGNsb3NlZCBhbmQgdGhlIHRyYW5zaXRpb24gZW5kZWQgdG8gcHJldmVudCB0aGVcbiAgLy8gdmlld3BvcnQgZnJvbSBvdmVyZmxvd2luZy4gQW5kIHNldCB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0IGZvY3VzYWJsZSBlbGVtZW50IG9uY2UgdGhlIHBvcG92ZXIgaXMgb3Blbi5cbiAgLy8gSW4gcmFyZSBjYXNlcyBpdCBjYW4gYmUgdGhhdCB0aGUgYW5pbWF0aW9uRW5kIGV2ZW50IGlzIHRyaWdnZXJlZCB0d2ljZS5cbiAgLy8gVG8gYXZvaWQgZW50ZXJpbmcgYSBjb3JydXB0IHN0YXRlLCBleGl0IHdoZW4gc3RhdGUgaXMgbm90IGV4cGVjdGVkLlxuICBwcml2YXRlIF9vblBvcG92ZXJBbmltYXRpb25FbmQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdvcGVuJyAmJiB0aGlzLnN0YXRlID09PSAnb3BlbmluZycpIHtcbiAgICAgIHRoaXMuX2hhbmRsZU9wZW5pbmcoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdjbG9zZScgJiYgdGhpcy5zdGF0ZSA9PT0gJ2Nsb3NpbmcnKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDbG9zaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IGZvY3VzIG9uIHRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudC5cbiAgcHJpdmF0ZSBfc2V0UG9wb3ZlckZvY3VzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvY3VzZWQgPSB0aGlzLl9mb2N1c1RyYXBDb250cm9sbGVyLmZvY3VzSW5pdGlhbEVsZW1lbnQoKTtcblxuICAgIGlmICghZm9jdXNlZCAmJiB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgdGhpcy5mb2N1cygpO1xuXG4gICAgICAvLyBXaGVuIGEgYmx1ciBvY2N1cnMsIHdlIGtub3cgdGhhdCB0aGUgcG9wb3ZlciBoYXMgdG8gYmUgY2xvc2VkLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW50ZXJhY3RpdmUgZWxlbWVudHMgaW5zaWRlIHRoZSBwb3BvdmVyLlxuICAgICAgLy8gV2hlbiBhIHdpbmRvdy90YWIgY2hhbmdlIG9jY3VycywgYSBibHVyIGV2ZW50IGlzIGFsc28gZmlyZWQuIEhvd2V2ZXIsIHdoZW4gdGhlIGN1cnJlbnQgd2luZG93L3RhYlxuICAgICAgLy8gYmVjb21lcyBhY3RpdmUgYWdhaW4sIGl0IGZvY3VzZXMgb25jZSBhZ2FpbiB0aGUgcG9wb3Zlci5cbiAgICAgIC8vIFRoZXJlZm9yZSwgd2UgY2Fubm90IGxpc3RlbiB0byB0aGUgYmx1ciBldmVudCBvbmx5IG9uY2UuXG4gICAgICAvLyBUbyBwcmV2ZW50IGFjY2lkZW50YWxseSBjbG9zaW5nIHRoZSBwb3BvdmVyLCB3ZSBuZWVkIHRvIGNoZWNrIGZvciB0aGUgd2luZG93L3RhYiBzdGF0ZS5cbiAgICAgIC8vIFdlIGNhbiBhY2hpZXZlIHRoaXMgYnkgdXNpbmcgdmlzaWJpbGl0eVN0YXRlLCB3aGljaCBvbmx5IHdvcmtzIHdpdGggc2V0VGltZW91dCgpLlxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAnYmx1cicsXG4gICAgICAgIChlOiBGb2N1c0V2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5fYmx1clRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuXG4gICAgICAgICAgICAgIC8vIEluIFNhZmFyaSBvbiBpT1MgaXQgY2FuIG9jY3VyLCB0aGF0IGEgYmx1ciBldmVudCB0cmlnZ2VycyBvbiB0aGUgcG9wb3ZlclxuICAgICAgICAgICAgICAvLyBhbHRob3VnaCB0aGUgZm9jdXMgcmVtYWlucyBpbnNpZGUgdGhlIHBvcG92ZXIuXG4gICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBzdG9wIHRoZSBjbG9zaW5nIGlmIHRoZSByZWxhdGVkVGFyZ2V0IGlzIGNvbnRhaW5lZCBpbiB0aGUgcG9wb3ZlciBvciBpdCBpcyB0aGUgdHJpZ2dlci5cbiAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0IGFzIE5vZGUpIHx8IGUucmVsYXRlZFRhcmdldCA9PT0gdGhpcy50cmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdvcGVuZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NraXBDbG9zZUZvY3VzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzaWduYWw6IHRoaXMuX29wZW5TdGF0ZUNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRQb3BvdmVyUG9zaXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm92ZXJsYXkgfHwgIXRoaXMuX3RyaWdnZXJFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9wb3ZlclBvc2l0aW9uID0gZ2V0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgdGhpcy5vdmVybGF5LFxuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQsXG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJy5zYmItcG9wb3Zlcl9fY29udGFpbmVyJykhLFxuICAgICAge1xuICAgICAgICB2ZXJ0aWNhbE9mZnNldDogVkVSVElDQUxfT0ZGU0VULFxuICAgICAgICBob3Jpem9udGFsT2Zmc2V0OiBIT1JJWk9OVEFMX09GRlNFVCxcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXG4gICAgICAgIHJlc3BvbnNpdmVIZWlnaHQ6IHRydWUsXG4gICAgICB9LFxuICAgICk7XG4gICAgY29uc3QgdmVydGljYWxQb3NpdGlvbiA9IHBvcG92ZXJQb3NpdGlvbi5hbGlnbm1lbnQudmVydGljYWw7XG4gICAgZm9yIChjb25zdCBwb3NpdGlvbiBvZiBbJ2Fib3ZlJywgJ2JlbG93J10pIHtcbiAgICAgIHRoaXMudG9nZ2xlU3RhdGUoYHBvc2l0aW9uLSR7cG9zaXRpb259YCwgcG9zaXRpb24gPT09IHZlcnRpY2FsUG9zaXRpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IGFycm93WFBvc2l0aW9uID1cbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuICAgICAgcG9wb3ZlclBvc2l0aW9uLmxlZnQgK1xuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuY2xpZW50V2lkdGggLyAyIC1cbiAgICAgIDg7IC8vIGhhbGYgdGhlIHNpemUgb2YgdGhlIHBvcG92ZXIgYXJyb3dcblxuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tX3NiYi1wb3BvdmVyLXBvc2l0aW9uLXgnLCBgJHtwb3BvdmVyUG9zaXRpb24ubGVmdH1weGApO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tX3NiYi1wb3BvdmVyLXBvc2l0aW9uLXknLCBgJHtwb3BvdmVyUG9zaXRpb24udG9wfXB4YCk7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1fc2JiLXBvcG92ZXItYXJyb3ctcG9zaXRpb24teCcsIGAke2Fycm93WFBvc2l0aW9ufXB4YCk7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1fc2JiLXBvcG92ZXItbWF4LWhlaWdodCcsIHBvcG92ZXJQb3NpdGlvbi5tYXhIZWlnaHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlbmRlckNvbnRlbnQoKTogVGVtcGxhdGVSZXN1bHQ7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGRpc3BhdGNoQmVmb3JlQ2xvc2VFdmVudChkZXRhaWw/OiB7XG4gICAgY2xvc2VUYXJnZXQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgfSk6IGJvb2xlYW4ge1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtDdXN0b21FdmVudDx7IGNsb3NlVGFyZ2V0OiBIVE1MRWxlbWVudCB8IG51bGwgfT59XG4gICAgICogRW1pdHMgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBiZWdpbnMgdGhlIGNsb3NpbmcgdHJhbnNpdGlvbi4gQ2FuIGJlIGNhbmNlbGVkLlxuICAgICAqL1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBjbG9zZVRhcmdldDogSFRNTEVsZW1lbnQgfCBudWxsIH0+KCdiZWZvcmVjbG9zZScsIHtcbiAgICAgICAgZGV0YWlsLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBkaXNwYXRjaENsb3NlRXZlbnQoZGV0YWlsPzogeyBjbG9zZVRhcmdldDogSFRNTEVsZW1lbnQgfCBudWxsIH0pOiBib29sZWFuIHtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8eyBjbG9zZVRhcmdldDogSFRNTEVsZW1lbnQgfCBudWxsIH0+fVxuICAgICAqIEVtaXRzIHdoZW5ldmVyIHRoZSBjb21wb25lbnQgaXMgY2xvc2VkLlxuICAgICAqL1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBjbG9zZVRhcmdldDogSFRNTEVsZW1lbnQgfCBudWxsIH0+KCdjbG9zZScsIHsgZGV0YWlsIH0pLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItcG9wb3Zlcl9fY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBAYW5pbWF0aW9uZW5kPSR7dGhpcy5fb25Qb3BvdmVyQW5pbWF0aW9uRW5kfVxuICAgICAgICAgIGNsYXNzPVwic2JiLXBvcG92ZXJcIlxuICAgICAgICAgIHJvbGU9XCJ0b29sdGlwXCJcbiAgICAgICAgICAke3JlZigoZWw/OiBFbGVtZW50KSA9PiAodGhpcy5vdmVybGF5ID0gZWwgYXMgSFRNTERpdkVsZW1lbnQpKX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIEBjbGljaz0keyhldmVudDogRXZlbnQpID0+IHRoaXMuX2Nsb3NlT25TYmJQb3BvdmVyQ2xvc2VDbGljayhldmVudCl9XG4gICAgICAgICAgICBjbGFzcz1cInNiYi1wb3BvdmVyX19jb250ZW50XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICAke3RoaXMucmVuZGVyQ29udGVudCgpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cbn1cblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBjb250ZXh0dWFsIGluZm9ybWF0aW9uIHdpdGhpbiBhIHBvcG92ZXIuXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBhZGQgY29udGVudCBpbnRvIHRoZSBwb3BvdmVyLlxuICogQGNzc3Byb3AgWy0tc2JiLXBvcG92ZXItei1pbmRleD12YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpXSAtIFRvIHNwZWNpZnkgYSBjdXN0b20gc3RhY2sgb3JkZXIsXG4gKiB0aGUgYHotaW5kZXhgIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nIHRoaXMgQ1NTIHZhcmlhYmxlLiBUaGUgZGVmYXVsdCBgei1pbmRleGAgb2YgdGhlXG4gKiBjb21wb25lbnQgaXMgc2V0IHRvIGB2YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpYCB3aXRoIGEgdmFsdWUgb2YgYDEwMDBgLlxuICovXG5leHBvcnQgY2xhc3MgU2JiUG9wb3ZlckVsZW1lbnQgZXh0ZW5kcyBTYmJQb3BvdmVyQmFzZUVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXBvcG92ZXInO1xuICAvKiogV2hldGhlciB0aGUgY2xvc2UgYnV0dG9uIHNob3VsZCBiZSBoaWRkZW4uICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoaWRlLWNsb3NlLWJ1dHRvbicsIHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSlcbiAgcHVibGljIGFjY2Vzc29yIGhpZGVDbG9zZUJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIHNob3VsZCBiZSB0cmlnZ2VyZWQgb24gaG92ZXIuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdob3Zlci10cmlnZ2VyJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaG92ZXJUcmlnZ2VyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIHBvcG92ZXIgYWZ0ZXIgYSBnaXZlbiBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gICAqIEdsb2JhbCBjb25maWd1cmF0aW9uIGlzIHVzZWQgYXMgZGVmYXVsdCwgaWYgbm90IHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnb3Blbi1kZWxheScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgc2V0IG9wZW5EZWxheSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fb3BlbkRlbGF5ID0gK3ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgb3BlbkRlbGF5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX29wZW5EZWxheSA/PyByZWFkQ29uZmlnKCkucG9wb3Zlcj8ub3BlbkRlbGF5ID8/IDA7XG4gIH1cbiAgcHJpdmF0ZSBfb3BlbkRlbGF5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgcG9wb3ZlciBhZnRlciBhIGdpdmVuIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAgICogR2xvYmFsIGNvbmZpZ3VyYXRpb24gaXMgdXNlZCBhcyBkZWZhdWx0LCBpZiBub3Qgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdjbG9zZS1kZWxheScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgc2V0IGNsb3NlRGVsYXkodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Nsb3NlRGVsYXkgPSArdmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBjbG9zZURlbGF5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2Nsb3NlRGVsYXkgPz8gcmVhZENvbmZpZygpLnBvcG92ZXI/LmNsb3NlRGVsYXkgPz8gMDtcbiAgfVxuICBwcml2YXRlIF9jbG9zZURlbGF5PzogbnVtYmVyO1xuXG4gIC8qKiBUaGlzIHdpbGwgYmUgZm9yd2FyZGVkIGFzIGFyaWEtbGFiZWwgdG8gdGhlIGNsb3NlIGJ1dHRvbiBlbGVtZW50LiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYWNjZXNzaWJpbGl0eS1jbG9zZS1sYWJlbCcgfSlcbiAgcHVibGljIGFjY2Vzc29yIGFjY2Vzc2liaWxpdHlDbG9zZUxhYmVsOiBzdHJpbmcgPSAnJztcblxuICBwcml2YXRlIF9ob3ZlclRyaWdnZXIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfb3BlblRpbWVvdXQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9vdmVybGF5QWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY29uZmlndXJlVHJpZ2dlcihvbGRUcmlnZ2VyOiBIVE1MRWxlbWVudCB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSB0cmlnZ2VyIGNhbiBiZSBob3ZlcmVkLiBTb21lIGRldmljZXMgbWlnaHQgaW50ZXJwcmV0IHRoZSBtZWRpYSBxdWVyeSAoaG92ZXI6IGhvdmVyKSBkaWZmZXJlbnRseSxcbiAgICAvLyBhbmQgbm90IHJlc3BlY3QgdGhlIGZhbGxiYWNrIG1lY2hhbmlzbSBvbiB0aGUgY2xpY2suIFRoZXJlZm9yZSwgdGhlIGZvbGxvd2luZyBpcyBwcmVmZXJyZWQgdG8gaWRlbnRpZnlcbiAgICAvLyBhbGwgbm9uLXRvdWNoc2NyZWVuIGRldmljZXMuXG4gICAgY29uc3QgaG92ZXJUcmlnZ2VyID0gdGhpcy5ob3ZlclRyaWdnZXIgJiYgIXBvaW50ZXJDb2Fyc2U7XG5cbiAgICBpZiAodGhpcy50cmlnZ2VyID09PSBvbGRUcmlnZ2VyICYmIGhvdmVyVHJpZ2dlciA9PT0gdGhpcy5faG92ZXJUcmlnZ2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2hvdmVyVHJpZ2dlciAhPT0gaG92ZXJUcmlnZ2VyKSB7XG4gICAgICB0aGlzLl9ob3ZlclRyaWdnZXIgPSBob3ZlclRyaWdnZXI7XG4gICAgICB0aGlzLnRvZ2dsZVN0YXRlKCdob3Zlci10cmlnZ2VyJywgdGhpcy5faG92ZXJUcmlnZ2VyKTtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyT3ZlcmxheUxpc3RlbmVycygpO1xuICAgIH1cblxuICAgIHN1cGVyLmNvbmZpZ3VyZVRyaWdnZXIob2xkVHJpZ2dlcik7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3Rlck92ZXJsYXlMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5fb3ZlcmxheUFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcblxuICAgIGlmICh0aGlzLl9ob3ZlclRyaWdnZXIpIHtcbiAgICAgIHRoaXMuX292ZXJsYXlBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICB0aGlzLm92ZXJsYXk/LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB0aGlzLl9vbk92ZXJsYXlNb3VzZUVudGVyKCksIHtcbiAgICAgICAgc2lnbmFsOiB0aGlzLl9vdmVybGF5QWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vdmVybGF5Py5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKCkgPT4gdGhpcy5fb25PdmVybGF5TW91c2VMZWF2ZSgpLCB7XG4gICAgICAgIHNpZ25hbDogdGhpcy5fb3ZlcmxheUFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVnaXN0ZXJUcmlnZ2VyTGlzdGVuZXJzKHNpZ25hbDogQWJvcnRTaWduYWwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faG92ZXJUcmlnZ2VyICYmIHRoaXMudHJpZ2dlcikge1xuICAgICAgdGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLl9vblRyaWdnZXJNb3VzZUVudGVyLCB7IHNpZ25hbCB9KTtcbiAgICAgIHRoaXMudHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5fb25UcmlnZ2VyTW91c2VMZWF2ZSwgeyBzaWduYWwgfSk7XG4gICAgICB0aGlzLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ2tleWRvd24nLFxuICAgICAgICAoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGV2dC5jb2RlID09PSAnU3BhY2UnIHx8IGV2dC5jb2RlID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHsgc2lnbmFsIH0sXG4gICAgICApO1xuICAgICAgdGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdtb3VzZWRvd24nLFxuICAgICAgICAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgLy8gV2l0aG91dCB0aGlzIGNoZWNrLCBOVkRBIGNhbid0IG9wZW4gdGhlIHBvcG92ZXIgb24ga2V5Ym9hcmQgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgaWYgKGlzRmFrZU1vdXNlZG93bkZyb21TY3JlZW5SZWFkZXIoZXZ0KSkge1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7IHNpZ25hbCB9LFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIucmVnaXN0ZXJUcmlnZ2VyTGlzdGVuZXJzKHNpZ25hbCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgdGhpcy5fcmVnaXN0ZXJPdmVybGF5TGlzdGVuZXJzKCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb3BlbigpOiB2b2lkIHtcbiAgICBzdXBlci5vcGVuKCk7XG5cbiAgICBpZiAodGhpcy5ob3ZlclRyaWdnZXIgJiYgdGhpcy50cmlnZ2VyKSB7XG4gICAgICDJtXN0YXRlQ29udHJvbGxlcih0aGlzLnRyaWdnZXIpLmFkZCgnZm9yY2UtaG92ZXInKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY2xvc2UoKTogdm9pZCB7XG4gICAgc3VwZXIuY2xvc2UoKTtcblxuICAgIMm1c3RhdGVDb250cm9sbGVyKHRoaXMudHJpZ2dlcik/LmRlbGV0ZSgnZm9yY2UtaG92ZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVHJpZ2dlck1vdXNlRW50ZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdjbG9zZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJykge1xuICAgICAgdGhpcy5fb3BlblRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gSWYgdGhlIHRyaWdnZXIgaXMgZm9jdXNlZCBieSBrZXlib2FyZCBhbmQgaG92ZXJlZCB3aXRoIHRoZSBtb3VzZSwgdGhlIG91dGxpbmUgd291bGQgYmUgdmlzaWJsZS5cbiAgICAgICAgLy8gU28gd2UgcmVzZXQgdGhlIGlucHV0IG1vZGFsaXR5IHRvIGhpZGUgdGhlIG91dGxpbmUuXG4gICAgICAgIHNiYklucHV0TW9kYWxpdHlEZXRlY3Rvci5yZXNldCgpO1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgIH0sIHRoaXMub3BlbkRlbGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VUaW1lb3V0KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBfb25UcmlnZ2VyTW91c2VMZWF2ZSA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW5lZCcgfHwgdGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnKSB7XG4gICAgICB0aGlzLmNsb3NlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jbG9zZSgpLCB0aGlzLmNsb3NlRGVsYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fb3BlblRpbWVvdXQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIF9vbk92ZXJsYXlNb3VzZUVudGVyID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnb3BlbmluZycpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNsb3NlVGltZW91dCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgX29uT3ZlcmxheU1vdXNlTGVhdmUgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09ICdvcGVuaW5nJykge1xuICAgICAgdGhpcy5jbG9zZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2xvc2UoKSwgdGhpcy5jbG9zZURlbGF5KTtcbiAgICB9XG4gIH07XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlckNvbnRlbnQoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gaHRtbGBcbiAgICAgIDxzYmItc2Vjb25kYXJ5LWJ1dHRvblxuICAgICAgICBhcmlhLWxhYmVsPSR7dGhpcy5hY2Nlc3NpYmlsaXR5Q2xvc2VMYWJlbCB8fCBpMThuQ2xvc2VQb3BvdmVyW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfVxuICAgICAgICBzaXplPVwic1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBpY29uLW5hbWU9XCJjcm9zcy1zbWFsbFwiXG4gICAgICAgIHNiYi1wb3BvdmVyLWNsb3NlXG4gICAgICA+PC9zYmItc2Vjb25kYXJ5LWJ1dHRvbj5cbiAgICBgO1xuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICAkeyF0aGlzLmhpZGVDbG9zZUJ1dHRvbiAmJiAhdGhpcy5faG92ZXJUcmlnZ2VyID8gY2xvc2VCdXR0b24gOiBub3RoaW5nfVxuICAgICAgPHNwYW4gY2xhc3M9XCJzYmItcG9wb3Zlcl9fc2Nyb2xsYWJsZS1jb250ZW50XCI+XG4gICAgICAgIDxzbG90Pk5vIGNvbnRlbnQ8L3Nsb3Q+XG4gICAgICA8L3NwYW4+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXBvcG92ZXInOiBTYmJQb3BvdmVyRWxlbWVudDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzJDQSwwQkFBMEIsUUFBUTtBQUVsQyxJQUFNLGtCQUFr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
@@ -1,4 +1,4 @@
1
- import { n as SbbPopoverElement, t as SbbPopoverBaseElement } from "./popover.component-BCMdJBUR.js";
1
+ import { n as SbbPopoverElement, t as SbbPopoverBaseElement } from "./popover.component-B3tm93Pe.js";
2
2
  import "./popover.pure.js";
3
3
  //#region src/elements/popover.ts
4
4
  /** @entrypoint */
@@ -1,2 +1,2 @@
1
- import { n as SbbPopoverElement, t as SbbPopoverBaseElement } from "./popover.component-BCMdJBUR.js";
1
+ import { n as SbbPopoverElement, t as SbbPopoverBaseElement } from "./popover.component-B3tm93Pe.js";
2
2
  export { SbbPopoverBaseElement, SbbPopoverElement };
@@ -1,2 +1,2 @@
1
- import { t as SbbSelectElement } from "../select.component-6Dwk_s7d.js";
1
+ import { t as SbbSelectElement } from "../select.component-D9SFG7Lk.js";
2
2
  export { SbbSelectElement };