@sbb-esta/lyne-elements-dev 5.0.0-next.1-dev.1777534945 → 5.0.0-next.1-dev.1777543026
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/autocomplete/autocomplete-base-element.js +1 -1
- package/autocomplete/autocomplete.component.js +1 -1
- package/{autocomplete-base-element-CSCv_WVh.js → autocomplete-base-element-BiLyvcN-.js} +1 -1
- package/autocomplete.js +1 -1
- package/autocomplete.pure.js +1 -1
- package/core/styles/mixins/scrollbar.scss +0 -6
- package/core/styles/scrollbar.scss +19 -24
- package/core/styles/styles.js +2 -2
- package/core.css +0 -37
- package/core.js +2 -2
- package/custom-elements.json +66 -16
- package/development/autocomplete/autocomplete-base-element.js +1 -1
- package/development/autocomplete/autocomplete.component.js +1 -1
- package/development/{autocomplete-base-element-Bwkns3IL.js → autocomplete-base-element-BxBpn8_e.js} +2 -2
- package/development/autocomplete.js +1 -1
- package/development/autocomplete.pure.js +1 -1
- package/development/core/styles/styles.d.ts +1 -0
- package/development/core/styles/styles.d.ts.map +1 -1
- package/development/core/styles/styles.js +2 -2
- package/development/core.js +2 -2
- package/development/dialog/dialog-content/dialog-content.component.d.ts +1 -0
- package/development/dialog/dialog-content/dialog-content.component.d.ts.map +1 -1
- package/development/dialog/dialog-content/dialog-content.component.js +1 -1
- package/development/{dialog-content.component-B7Grxjk6.js → dialog-content.component-Bzt-PL6f.js} +10 -3
- package/development/dialog.js +1 -1
- package/development/dialog.pure.js +1 -1
- package/development/file-selector/common/file-selector-common.d.ts +1 -2
- package/development/file-selector/common/file-selector-common.d.ts.map +1 -1
- package/development/file-selector/common/file-selector-common.js +2 -2
- package/development/file-selector/file-selector/file-selector.component.d.ts +1 -2
- package/development/file-selector/file-selector/file-selector.component.d.ts.map +1 -1
- package/development/file-selector/file-selector/file-selector.component.js +3 -6
- package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.d.ts.map +1 -1
- package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.js +1 -1
- package/development/file-selector-common-BH_iIjcB.js +417 -0
- package/development/{file-selector-dropzone.component-DRUUWI1A.js → file-selector-dropzone.component-ZCanLwF-.js} +4 -8
- package/development/file-selector.js +3 -3
- package/development/file-selector.pure.js +3 -3
- package/development/map-container/map-container.component.d.ts.map +1 -1
- package/development/map-container/map-container.component.js +1 -1
- package/development/map-container.component-DoFCVBoh.js +180 -0
- package/development/map-container.js +1 -1
- package/development/map-container.pure.js +1 -1
- package/development/menu/menu/menu.component.d.ts.map +1 -1
- package/development/menu/menu/menu.component.js +1 -1
- package/development/menu.component-CDBUaD8s.js +369 -0
- package/development/menu.js +1 -1
- package/development/menu.pure.js +1 -1
- package/development/navigation/navigation/navigation.component.d.ts.map +1 -1
- package/development/navigation/navigation/navigation.component.js +1 -1
- package/development/navigation/navigation-section/navigation-section.component.d.ts.map +1 -1
- package/development/navigation/navigation-section/navigation-section.component.js +1 -1
- package/development/navigation-section.component-D3_XVwyt.js +350 -0
- package/development/navigation.component-Cco4llBt.js +319 -0
- package/development/navigation.js +2 -2
- package/development/navigation.pure.js +2 -2
- package/development/overlay/overlay.component.d.ts.map +1 -1
- package/development/overlay/overlay.component.js +1 -1
- package/development/overlay.component-DBzb0PdD.js +206 -0
- package/development/overlay.js +1 -1
- package/development/overlay.pure.js +1 -1
- package/development/popover/popover.component.d.ts +1 -0
- package/development/popover/popover.component.d.ts.map +1 -1
- package/development/popover/popover.component.js +1 -1
- package/development/popover.component-Dj0INQsI.js +564 -0
- package/development/popover.js +1 -1
- package/development/popover.pure.js +1 -1
- package/development/select/select.component.js +1 -1
- package/development/{select.component-C1Xfvvii.js → select.component-D_9pjl7T.js} +2 -2
- package/development/select.js +1 -1
- package/development/select.pure.js +1 -1
- package/development/sidebar/sidebar/sidebar.component.d.ts.map +1 -1
- package/development/sidebar/sidebar/sidebar.component.js +1 -1
- package/development/sidebar.component-CYLbI1Vp.js +356 -0
- package/development/sidebar.js +1 -1
- package/development/sidebar.pure.js +1 -1
- package/development/styles-B_IWjHc5.js +22 -0
- package/development/table/table-wrapper/table-wrapper.component.js +1 -1
- package/development/table-wrapper.component-D8IFPow6.js +119 -0
- package/development/table.js +1 -1
- package/development/table.pure.js +1 -1
- package/dialog/dialog-content/dialog-content.component.js +1 -1
- package/{dialog-content.component-are-UBx3.js → dialog-content.component-iRLHPKPb.js} +7 -2
- package/dialog.js +1 -1
- package/dialog.pure.js +1 -1
- package/file-selector/common/file-selector-common.js +2 -2
- package/file-selector/file-selector/file-selector.component.js +10 -13
- package/file-selector/file-selector-dropzone/file-selector-dropzone.component.js +1 -1
- package/{file-selector-common-jpJmVqAw.js → file-selector-common-PcqPdsnN.js} +44 -38
- package/{file-selector-dropzone.component-DDRTu6p2.js → file-selector-dropzone.component-2XUfh1NC.js} +20 -24
- package/file-selector.js +5 -5
- package/file-selector.pure.js +4 -4
- package/map-container/map-container.component.js +1 -1
- package/{map-container.component-Btnl3n9d.js → map-container.component-5I5DW5dJ.js} +23 -16
- package/map-container.js +1 -1
- package/map-container.pure.js +1 -1
- package/menu/menu/menu.component.js +1 -1
- package/{menu.component-CpNMheMG.js → menu.component-Bd37u3Ps.js} +26 -22
- package/menu.js +1 -1
- package/menu.pure.js +1 -1
- package/navigation/navigation/navigation.component.js +1 -1
- package/navigation/navigation-section/navigation-section.component.js +1 -1
- package/{navigation-section.component-219JlVIe.js → navigation-section.component-B_0xi30L.js} +24 -20
- package/{navigation.component-gLrMCbh9.js → navigation.component-CmrLIeDB.js} +24 -20
- package/navigation.js +2 -2
- package/navigation.pure.js +2 -2
- package/off-brand-theme.css +33 -134
- package/overlay/overlay.component.js +1 -1
- package/overlay.component-D2jtCeeb.js +156 -0
- package/overlay.js +1 -1
- package/overlay.pure.js +1 -1
- package/package.json +2 -2
- package/popover/popover.component.js +1 -1
- package/{popover.component-DnY9obd7.js → popover.component-CiMeNnO-.js} +27 -24
- package/popover.js +1 -1
- package/popover.pure.js +1 -1
- package/safety-theme.css +33 -134
- package/scrollbar.css +33 -97
- package/select/select.component.js +1 -1
- package/{select.component-Bhvd_sUV.js → select.component-BXPU7X_X.js} +1 -1
- package/select.js +1 -1
- package/select.pure.js +1 -1
- package/sidebar/sidebar/sidebar.component.js +1 -1
- package/{sidebar.component-Dpf9jZ1P.js → sidebar.component-CeUPJaqy.js} +28 -21
- package/sidebar.js +1 -1
- package/sidebar.pure.js +1 -1
- package/standard-theme.css +33 -134
- package/styles-Cb4jdMeE.js +5 -0
- package/table/table-wrapper/table-wrapper.component.js +1 -1
- package/{table-wrapper.component-DGL8RaxF.js → table-wrapper.component-CZ90q3pY.js} +1 -1
- package/table.js +1 -1
- package/table.pure.js +1 -1
- package/development/file-selector-common-BwkZZzA0.js +0 -409
- package/development/map-container.component-BLF21LG7.js +0 -173
- package/development/menu.component-BpKGNICN.js +0 -365
- package/development/navigation-section.component-DumXFFfg.js +0 -346
- package/development/navigation.component-CpoBEP55.js +0 -315
- package/development/overlay.component-CC_quHYI.js +0 -206
- package/development/popover.component-DT-cfDqo.js +0 -561
- package/development/sidebar.component-DR2JGwnM.js +0 -349
- package/development/styles-6T7UvhxK.js +0 -18
- package/development/table-wrapper.component-CjMOENHV.js +0 -119
- package/overlay.component-B00EoAd5.js +0 -156
- package/styles-D5okOWF1.js +0 -5
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { __esDecorate, __runInitializers } from "tslib";
|
|
2
|
+
import { html, isServer, nothing, unsafeCSS } from "lit";
|
|
3
|
+
import { property } from "lit/decorators.js";
|
|
4
|
+
import { IS_FOCUSABLE_QUERY, SbbFocusTrapController, SbbLanguageController, SbbMediaMatcherController, SbbMediaQueryBreakpointSmallAndBelow, SbbOpenCloseBaseElement, SbbUpdateSchedulerMixin, boxSizingStyles, forceType, i18nGoBack, idReference, isZeroAnimationDuration, omitEmptyConverter, removeAriaOverlayTriggerProperties, sbbInputModalityDetector, scrollbarStyles, setAriaOverlayTriggerProperties, ɵstateController } from "./core.js";
|
|
5
|
+
import { SbbTransparentButtonElement } from "./button.pure.js";
|
|
6
|
+
//#region src/elements/navigation/navigation-section/navigation-section.scss?inline
|
|
7
|
+
var navigation_section_default = ":host {\n --sbb-navigation-section-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-3x)\n );\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-dark);\n display: var(--sbb-navigation-section-display, none);\n position: var(--sbb-navigation-section-position);\n grid-column: var(--sbb-navigation-section-column);\n inset-inline-start: 0;\n inset-block-start: 0;\n width: var(--sbb-navigation-section-width);\n height: var(--sbb-navigation-section-height);\n z-index: var(--sbb-navigation-z-index, var(--sbb-overlay-default-z-index));\n}\n@media (min-width: calc(64rem)) {\n :host {\n --sbb-navigation-section-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-4x)\n );\n --sbb-navigation-section-width: calc(\n 100% + var(--sbb-layout-base-offset-responsive) + var(--sbb-grid-base-gutter-responsive)\n );\n translate: calc(var(--sbb-grid-base-gutter-responsive) * -1) 0;\n }\n}\n\n:host(:is(:state(state-opened),[state--state-opened])) {\n --sbb-navigation-section-pointer-events: all;\n}\n\n:host(:is(:state(state-opening),[state--state-opening])) {\n --sbb-navigation-section-position: absolute;\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-closing),[state--state-closing]))) {\n --sbb-navigation-section-pointer-events: 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-navigation-section-display: block;\n}\n\n::slotted(*) {\n padding-inline-start: var(--sbb-navigation-section-content-padding-inline-start);\n}\n\n::slotted(:is(:state(sbb-button),[state--sbb-button])) {\n grid-column-start: 1;\n}\n\n.sbb-navigation-section__container {\n pointer-events: var(--sbb-navigation-section-pointer-events);\n height: var(--sbb-navigation-section-height);\n}\n\n.sbb-navigation-section {\n display: none;\n border: none;\n margin: 0;\n width: 100%;\n height: 100%;\n color: var(--sbb-navigation-color, var(--sbb-color-1-negative));\n background-color: transparent;\n padding: 0;\n overflow: hidden;\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-navigation-section {\n display: block;\n animation-name: open;\n animation-duration: var(--sbb-navigation-section-animation-duration);\n animation-timing-function: var(--sbb-navigation-section-animation-easing);\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-navigation-section {\n animation-name: close;\n}\n@media (forced-colors: active) {\n .sbb-navigation-section {\n outline: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n\n.sbb-navigation-section__wrapper {\n height: 100%;\n padding-block: var(--sbb-navigation-section-padding-block);\n outline: none;\n overflow-y: auto;\n}\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-closing),[state--state-closing]))) .sbb-navigation-section__wrapper {\n --sbb-scrollbar-color: transparent;\n scrollbar-color: transparent transparent;\n}\n\n.sbb-navigation-section__header {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--sbb-spacing-fixed-1x);\n margin-block-start: var(--sbb-spacing-responsive-xxl);\n padding-inline-start: var(--sbb-navigation-section-content-padding-inline-start);\n}\n@media (min-width: calc(64rem)) {\n .sbb-navigation-section__header {\n margin-block-start: 0;\n padding-inline-start: 0;\n }\n}\n@media (min-width: calc(90rem)) {\n .sbb-navigation-section__header {\n grid-column: 1/4;\n }\n}\n\n.sbb-navigation-section__back {\n position: absolute;\n translate: calc((100% + var(--sbb-spacing-fixed-1x)) * -1) 0;\n}\n@media (min-width: calc(64rem)) {\n .sbb-navigation-section__back {\n display: none;\n }\n}\n\n.sbb-navigation-section__title {\n font-weight: bold;\n font-size: var(--sbb-navigation-section-font-size);\n letter-spacing: var(--sbb-typo-letter-spacing-heading);\n line-height: var(--sbb-typo-line-height-heading);\n}\n\n.sbb-navigation-section__content {\n display: grid;\n grid-template-columns: 1fr;\n gap: var(--sbb-spacing-responsive-l) var(--sbb-grid-base-gutter-responsive);\n padding-inline: var(--sbb-navigation-section-padding-inline);\n}\n@media (min-width: calc(64rem)) {\n .sbb-navigation-section__content {\n opacity: 0;\n translate: 0 var(--sbb-spacing-fixed-3x);\n transition-duration: var(--sbb-navigation-section-animation-duration);\n transition-delay: var(--sbb-navigation-section-animation-duration);\n transition-timing-function: var(--sbb-navigation-section-animation-easing);\n transition-property: opacity, translate;\n }\n :host(:is(:state(state-opened),[state--state-opened])) .sbb-navigation-section__content {\n opacity: 1;\n translate: 0 0;\n }\n}\n@media (min-width: calc(90rem)) {\n .sbb-navigation-section__content {\n grid-template-columns: repeat(3, 1fr);\n }\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-navigation-section__content {\n transition-delay: 0s;\n}\n\n@keyframes open {\n from {\n translate: var(--sbb-navigation-section-translate) 0;\n }\n to {\n translate: 0 0;\n }\n}\n@keyframes close {\n from {\n translate: 0 0;\n }\n to {\n translate: var(--sbb-navigation-section-translate) 0;\n }\n}";
|
|
8
|
+
//#endregion
|
|
9
|
+
//#region src/elements/navigation/navigation-section/navigation-section.component.ts
|
|
10
|
+
/**
|
|
11
|
+
* It can be used as a container for `sbb-navigation-list` within a `sbb-navigation`.
|
|
12
|
+
*
|
|
13
|
+
* @slot - Use the unnamed slot to add content into the `sbb-navigation-section`.
|
|
14
|
+
*/
|
|
15
|
+
var SbbNavigationSectionElement = (() => {
|
|
16
|
+
let _classSuper = SbbUpdateSchedulerMixin(SbbOpenCloseBaseElement);
|
|
17
|
+
let _titleContent_decorators;
|
|
18
|
+
let _titleContent_initializers = [];
|
|
19
|
+
let _titleContent_extraInitializers = [];
|
|
20
|
+
let _trigger_decorators;
|
|
21
|
+
let _trigger_initializers = [];
|
|
22
|
+
let _trigger_extraInitializers = [];
|
|
23
|
+
let _accessibilityLabel_decorators;
|
|
24
|
+
let _accessibilityLabel_initializers = [];
|
|
25
|
+
let _accessibilityLabel_extraInitializers = [];
|
|
26
|
+
let _accessibilityBackLabel_decorators;
|
|
27
|
+
let _accessibilityBackLabel_initializers = [];
|
|
28
|
+
let _accessibilityBackLabel_extraInitializers = [];
|
|
29
|
+
return class SbbNavigationSectionElement extends _classSuper {
|
|
30
|
+
static {
|
|
31
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
32
|
+
_titleContent_decorators = [forceType(), property({
|
|
33
|
+
attribute: "title-content",
|
|
34
|
+
reflect: true,
|
|
35
|
+
converter: omitEmptyConverter
|
|
36
|
+
})];
|
|
37
|
+
_trigger_decorators = [idReference(), property()];
|
|
38
|
+
_accessibilityLabel_decorators = [forceType(), property({ attribute: "accessibility-label" })];
|
|
39
|
+
_accessibilityBackLabel_decorators = [forceType(), property({ attribute: "accessibility-back-label" })];
|
|
40
|
+
__esDecorate(this, null, _titleContent_decorators, {
|
|
41
|
+
kind: "accessor",
|
|
42
|
+
name: "titleContent",
|
|
43
|
+
static: false,
|
|
44
|
+
private: false,
|
|
45
|
+
access: {
|
|
46
|
+
has: (obj) => "titleContent" in obj,
|
|
47
|
+
get: (obj) => obj.titleContent,
|
|
48
|
+
set: (obj, value) => {
|
|
49
|
+
obj.titleContent = value;
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
metadata: _metadata
|
|
53
|
+
}, _titleContent_initializers, _titleContent_extraInitializers);
|
|
54
|
+
__esDecorate(this, null, _trigger_decorators, {
|
|
55
|
+
kind: "accessor",
|
|
56
|
+
name: "trigger",
|
|
57
|
+
static: false,
|
|
58
|
+
private: false,
|
|
59
|
+
access: {
|
|
60
|
+
has: (obj) => "trigger" in obj,
|
|
61
|
+
get: (obj) => obj.trigger,
|
|
62
|
+
set: (obj, value) => {
|
|
63
|
+
obj.trigger = value;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
metadata: _metadata
|
|
67
|
+
}, _trigger_initializers, _trigger_extraInitializers);
|
|
68
|
+
__esDecorate(this, null, _accessibilityLabel_decorators, {
|
|
69
|
+
kind: "accessor",
|
|
70
|
+
name: "accessibilityLabel",
|
|
71
|
+
static: false,
|
|
72
|
+
private: false,
|
|
73
|
+
access: {
|
|
74
|
+
has: (obj) => "accessibilityLabel" in obj,
|
|
75
|
+
get: (obj) => obj.accessibilityLabel,
|
|
76
|
+
set: (obj, value) => {
|
|
77
|
+
obj.accessibilityLabel = value;
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
metadata: _metadata
|
|
81
|
+
}, _accessibilityLabel_initializers, _accessibilityLabel_extraInitializers);
|
|
82
|
+
__esDecorate(this, null, _accessibilityBackLabel_decorators, {
|
|
83
|
+
kind: "accessor",
|
|
84
|
+
name: "accessibilityBackLabel",
|
|
85
|
+
static: false,
|
|
86
|
+
private: false,
|
|
87
|
+
access: {
|
|
88
|
+
has: (obj) => "accessibilityBackLabel" in obj,
|
|
89
|
+
get: (obj) => obj.accessibilityBackLabel,
|
|
90
|
+
set: (obj, value) => {
|
|
91
|
+
obj.accessibilityBackLabel = value;
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
metadata: _metadata
|
|
95
|
+
}, _accessibilityBackLabel_initializers, _accessibilityBackLabel_extraInitializers);
|
|
96
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, {
|
|
97
|
+
enumerable: true,
|
|
98
|
+
configurable: true,
|
|
99
|
+
writable: true,
|
|
100
|
+
value: _metadata
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
static {
|
|
104
|
+
this.elementName = "sbb-navigation-section";
|
|
105
|
+
}
|
|
106
|
+
static {
|
|
107
|
+
this.elementDependencies = [SbbTransparentButtonElement];
|
|
108
|
+
}
|
|
109
|
+
static {
|
|
110
|
+
this.styles = [
|
|
111
|
+
boxSizingStyles,
|
|
112
|
+
scrollbarStyles,
|
|
113
|
+
unsafeCSS(navigation_section_default)
|
|
114
|
+
];
|
|
115
|
+
}
|
|
116
|
+
#titleContent_accessor_storage;
|
|
117
|
+
/**
|
|
118
|
+
* The label to be shown before the action list.
|
|
119
|
+
*/
|
|
120
|
+
get titleContent() {
|
|
121
|
+
return this.#titleContent_accessor_storage;
|
|
122
|
+
}
|
|
123
|
+
set titleContent(value) {
|
|
124
|
+
this.#titleContent_accessor_storage = value;
|
|
125
|
+
}
|
|
126
|
+
#trigger_accessor_storage;
|
|
127
|
+
/**
|
|
128
|
+
* The element that will trigger the navigation section.
|
|
129
|
+
*
|
|
130
|
+
* For attribute usage, provide an id reference.
|
|
131
|
+
*/
|
|
132
|
+
get trigger() {
|
|
133
|
+
return this.#trigger_accessor_storage;
|
|
134
|
+
}
|
|
135
|
+
set trigger(value) {
|
|
136
|
+
this.#trigger_accessor_storage = value;
|
|
137
|
+
}
|
|
138
|
+
#accessibilityLabel_accessor_storage;
|
|
139
|
+
/**
|
|
140
|
+
* This will be forwarded as aria-label to the nav element and is read as a title of the navigation-section.
|
|
141
|
+
*/
|
|
142
|
+
get accessibilityLabel() {
|
|
143
|
+
return this.#accessibilityLabel_accessor_storage;
|
|
144
|
+
}
|
|
145
|
+
set accessibilityLabel(value) {
|
|
146
|
+
this.#accessibilityLabel_accessor_storage = value;
|
|
147
|
+
}
|
|
148
|
+
#accessibilityBackLabel_accessor_storage;
|
|
149
|
+
/**
|
|
150
|
+
* This will be forwarded as aria-label to the back button element.
|
|
151
|
+
*/
|
|
152
|
+
get accessibilityBackLabel() {
|
|
153
|
+
return this.#accessibilityBackLabel_accessor_storage;
|
|
154
|
+
}
|
|
155
|
+
set accessibilityBackLabel(value) {
|
|
156
|
+
this.#accessibilityBackLabel_accessor_storage = value;
|
|
157
|
+
}
|
|
158
|
+
/** The state of the component. */
|
|
159
|
+
set state(state) {
|
|
160
|
+
super.state = state;
|
|
161
|
+
this.internals.ariaHidden = this.state !== "opened" ? "true" : null;
|
|
162
|
+
}
|
|
163
|
+
get state() {
|
|
164
|
+
return super.state;
|
|
165
|
+
}
|
|
166
|
+
constructor() {
|
|
167
|
+
super();
|
|
168
|
+
this.#titleContent_accessor_storage = __runInitializers(this, _titleContent_initializers, "");
|
|
169
|
+
this.#trigger_accessor_storage = (__runInitializers(this, _titleContent_extraInitializers), __runInitializers(this, _trigger_initializers, null));
|
|
170
|
+
this.#accessibilityLabel_accessor_storage = (__runInitializers(this, _trigger_extraInitializers), __runInitializers(this, _accessibilityLabel_initializers, ""));
|
|
171
|
+
this.#accessibilityBackLabel_accessor_storage = (__runInitializers(this, _accessibilityLabel_extraInitializers), __runInitializers(this, _accessibilityBackLabel_initializers, ""));
|
|
172
|
+
this._firstLevelNavigation = (__runInitializers(this, _accessibilityBackLabel_extraInitializers), null);
|
|
173
|
+
this._triggerElement = null;
|
|
174
|
+
this._language = new SbbLanguageController(this);
|
|
175
|
+
this._focusTrapController = new SbbFocusTrapController(this);
|
|
176
|
+
this._lastKeydownEvent = null;
|
|
177
|
+
this._mediaMatcherController = new SbbMediaMatcherController(this, { [SbbMediaQueryBreakpointSmallAndBelow]: (matches) => {
|
|
178
|
+
if (this.state !== "closed") this._setNavigationInert(matches);
|
|
179
|
+
} });
|
|
180
|
+
this._handleNavigationSectionClose = (event) => {
|
|
181
|
+
if (event.composedPath().filter((el) => el instanceof HTMLElement).some((el) => this._isCloseElement(el))) this.close();
|
|
182
|
+
};
|
|
183
|
+
this.addEventListener?.("keydown", (e) => {
|
|
184
|
+
this._lastKeydownEvent = e;
|
|
185
|
+
});
|
|
186
|
+
this.addEventListener?.("focusout", (e) => {
|
|
187
|
+
if (e.relatedTarget instanceof HTMLElement && !this.contains(e.relatedTarget) && sbbInputModalityDetector.mostRecentModality === "keyboard" && this._lastKeydownEvent?.key === "Tab" && this._triggerElement) {
|
|
188
|
+
const navigationElement = this.closest("sbb-navigation");
|
|
189
|
+
const focusableElements = Array.from(navigationElement?.querySelectorAll(IS_FOCUSABLE_QUERY) ?? []).filter((e) => !this.contains(e));
|
|
190
|
+
if (this._lastKeydownEvent.shiftKey || !focusableElements.length) this._triggerElement?.focus();
|
|
191
|
+
else (focusableElements[focusableElements.indexOf(this._triggerElement) + 1] ?? navigationElement.closeButton)?.focus();
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Opens the navigation section on trigger click.
|
|
197
|
+
*/
|
|
198
|
+
open() {
|
|
199
|
+
if (this.state !== "closed" || !this.hasUpdated || !this.dispatchBeforeOpenEvent()) return;
|
|
200
|
+
if (this._isNavigationButton(this._triggerElement)) this._triggerElement?.marker?.select(this._triggerElement);
|
|
201
|
+
this._closePreviousNavigationSection();
|
|
202
|
+
this.state = "opening";
|
|
203
|
+
/** @internal */
|
|
204
|
+
this.dispatchEvent(new Event("ɵnavigationsectionopening"));
|
|
205
|
+
this.startUpdate();
|
|
206
|
+
this.inert = true;
|
|
207
|
+
if (this._triggerElement) this._triggerElement.ariaExpanded = "true";
|
|
208
|
+
if (this._isZeroAnimationDuration()) this._handleOpening();
|
|
209
|
+
}
|
|
210
|
+
_isZeroAnimationDuration() {
|
|
211
|
+
return isZeroAnimationDuration(this, "--sbb-navigation-section-animation-duration");
|
|
212
|
+
}
|
|
213
|
+
_handleOpening() {
|
|
214
|
+
this.state = "opened";
|
|
215
|
+
this.inert = false;
|
|
216
|
+
this._attachWindowEvents();
|
|
217
|
+
this._setNavigationInert();
|
|
218
|
+
this._focusTrapController.focusInitialElement();
|
|
219
|
+
this._checkActiveAction();
|
|
220
|
+
this.completeUpdate();
|
|
221
|
+
this.dispatchOpenEvent();
|
|
222
|
+
}
|
|
223
|
+
_handleClosing() {
|
|
224
|
+
this.state = "closed";
|
|
225
|
+
this.shadowRoot?.querySelector(".sbb-navigation-section__container")?.scrollTo(0, 0);
|
|
226
|
+
this._windowEventsController?.abort();
|
|
227
|
+
this._resetLists();
|
|
228
|
+
this._setNavigationInert();
|
|
229
|
+
if (this._isBelowLarge() && this._triggerElement) this._triggerElement.focus();
|
|
230
|
+
this.completeUpdate();
|
|
231
|
+
this.dispatchCloseEvent();
|
|
232
|
+
}
|
|
233
|
+
_closePreviousNavigationSection() {
|
|
234
|
+
this._firstLevelNavigation?.activeNavigationSection?.close();
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Closes the navigation section.
|
|
238
|
+
*/
|
|
239
|
+
close() {
|
|
240
|
+
if (this.state !== "opened" || !this.dispatchBeforeCloseEvent()) return;
|
|
241
|
+
/** @internal */
|
|
242
|
+
this.dispatchEvent(new Event("ɵnavigationsectionclosing"));
|
|
243
|
+
this.state = "closing";
|
|
244
|
+
this.startUpdate();
|
|
245
|
+
this.inert = true;
|
|
246
|
+
if (this._triggerElement) this._triggerElement.ariaExpanded = "false";
|
|
247
|
+
if (this._isZeroAnimationDuration()) this._handleClosing();
|
|
248
|
+
}
|
|
249
|
+
_configureTrigger() {
|
|
250
|
+
if (this.trigger === this._triggerElement) return;
|
|
251
|
+
this._triggerAbortController?.abort();
|
|
252
|
+
removeAriaOverlayTriggerProperties(this._triggerElement);
|
|
253
|
+
this._triggerElement = this.trigger;
|
|
254
|
+
if (!this._triggerElement) return;
|
|
255
|
+
setAriaOverlayTriggerProperties(this, this._triggerElement, "menu", this.state);
|
|
256
|
+
this._triggerAbortController = new AbortController();
|
|
257
|
+
if (this._isNavigationButton(this._triggerElement)) this._triggerElement.connectedSection = this;
|
|
258
|
+
this._triggerElement.addEventListener("click", () => this.open(), { signal: this._triggerAbortController.signal });
|
|
259
|
+
this._firstLevelNavigation = this._triggerElement?.closest?.("sbb-navigation");
|
|
260
|
+
}
|
|
261
|
+
_isNavigationButton(trigger) {
|
|
262
|
+
return trigger?.localName === "sbb-navigation-button";
|
|
263
|
+
}
|
|
264
|
+
_setNavigationInert(isBelowLarge = this._isBelowLarge()) {
|
|
265
|
+
const navigationContent = this._firstLevelNavigation?.navigationContent;
|
|
266
|
+
if (navigationContent) navigationContent.inert = isBelowLarge && this.state !== "closed";
|
|
267
|
+
}
|
|
268
|
+
_onAnimationEnd(event) {
|
|
269
|
+
if (event.animationName === "open" && this.state === "opening") this._handleOpening();
|
|
270
|
+
else if (event.animationName === "close" && this.state === "closing") this._handleClosing();
|
|
271
|
+
}
|
|
272
|
+
_resetLists() {
|
|
273
|
+
Array.from(this.querySelectorAll(":is(:state(section-action),[state--section-action]):is(:state(action-active),[state--action-active])") ?? []).forEach((action) => ɵstateController(action).delete("action-active"));
|
|
274
|
+
}
|
|
275
|
+
_attachWindowEvents() {
|
|
276
|
+
this._windowEventsController = new AbortController();
|
|
277
|
+
window.addEventListener("keydown", (event) => this._onKeydownEvent(event), { signal: this._windowEventsController.signal });
|
|
278
|
+
window.addEventListener("click", this._handleNavigationSectionClose, { signal: this._windowEventsController.signal });
|
|
279
|
+
}
|
|
280
|
+
_isCloseElement(element) {
|
|
281
|
+
return element.nodeName === "A" || !element.hasAttribute("disabled") && (element.hasAttribute("sbb-navigation-close") || element.hasAttribute("sbb-navigation-section-close"));
|
|
282
|
+
}
|
|
283
|
+
_isBelowLarge() {
|
|
284
|
+
return this._mediaMatcherController.matches(SbbMediaQueryBreakpointSmallAndBelow) ?? false;
|
|
285
|
+
}
|
|
286
|
+
_onKeydownEvent(event) {
|
|
287
|
+
if (this.state === "opened" && event.key === "Escape") this.close();
|
|
288
|
+
}
|
|
289
|
+
_checkActiveAction() {
|
|
290
|
+
ɵstateController(this.querySelector(":is(sbb-navigation-button, sbb-navigation-link).sbb-active"))?.toggle("action-active", true);
|
|
291
|
+
}
|
|
292
|
+
connectedCallback() {
|
|
293
|
+
super.connectedCallback();
|
|
294
|
+
this.slot ||= "navigation-section";
|
|
295
|
+
if (this.hasUpdated) this._configureTrigger();
|
|
296
|
+
}
|
|
297
|
+
disconnectedCallback() {
|
|
298
|
+
super.disconnectedCallback();
|
|
299
|
+
this._triggerElement = null;
|
|
300
|
+
this._triggerAbortController?.abort();
|
|
301
|
+
this._windowEventsController?.abort();
|
|
302
|
+
}
|
|
303
|
+
requestUpdate(name, oldValue, options) {
|
|
304
|
+
super.requestUpdate(name, oldValue, options);
|
|
305
|
+
if (!isServer && (!name || name === "trigger") && this.hasUpdated) this._configureTrigger();
|
|
306
|
+
}
|
|
307
|
+
firstUpdated(changedProperties) {
|
|
308
|
+
super.firstUpdated(changedProperties);
|
|
309
|
+
this._configureTrigger();
|
|
310
|
+
}
|
|
311
|
+
render() {
|
|
312
|
+
return html`
|
|
313
|
+
<div class="sbb-navigation-section__container">
|
|
314
|
+
<nav
|
|
315
|
+
@animationend=${this._onAnimationEnd}
|
|
316
|
+
class="sbb-navigation-section"
|
|
317
|
+
aria-labelledby=${!this.accessibilityLabel ? "title" : nothing}
|
|
318
|
+
aria-label=${this.accessibilityLabel ? this.accessibilityLabel : nothing}
|
|
319
|
+
>
|
|
320
|
+
<div class="sbb-navigation-section__wrapper sbb-scrollbar-negative">
|
|
321
|
+
<div class="sbb-navigation-section__content">
|
|
322
|
+
<div class="sbb-navigation-section__header">
|
|
323
|
+
<!-- Back button -->
|
|
324
|
+
<sbb-transparent-button
|
|
325
|
+
id="sbb-navigation-section-back-button"
|
|
326
|
+
class="sbb-navigation-section__back"
|
|
327
|
+
aria-label=${this.accessibilityBackLabel || i18nGoBack[this._language.current]}
|
|
328
|
+
negative
|
|
329
|
+
size="m"
|
|
330
|
+
icon-name="chevron-small-left-small"
|
|
331
|
+
sbb-navigation-section-close
|
|
332
|
+
></sbb-transparent-button>
|
|
333
|
+
|
|
334
|
+
<span class="sbb-navigation-section__title" id="title">
|
|
335
|
+
<slot name="title">${this.titleContent}</slot>
|
|
336
|
+
</span>
|
|
337
|
+
</div>
|
|
338
|
+
<slot></slot>
|
|
339
|
+
</div>
|
|
340
|
+
</div>
|
|
341
|
+
</nav>
|
|
342
|
+
</div>
|
|
343
|
+
`;
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
})();
|
|
347
|
+
//#endregion
|
|
348
|
+
export { SbbNavigationSectionElement as t };
|
|
349
|
+
|
|
350
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi1zZWN0aW9uLmNvbXBvbmVudC1EM19YVnd5dC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLXNlY3Rpb24vbmF2aWdhdGlvbi1zZWN0aW9uLnNjc3M/aW5saW5lIiwiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL25hdmlnYXRpb24vbmF2aWdhdGlvbi1zZWN0aW9uL25hdmlnYXRpb24tc2VjdGlvbi5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnLi4vLi4vY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICAtLXNiYi1uYXZpZ2F0aW9uLXNlY3Rpb24tYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoXG4gICAgLS1zYmItZGlzYWJsZS1hbmltYXRpb24tZHVyYXRpb24sXG4gICAgdmFyKC0tc2JiLWFuaW1hdGlvbi1kdXJhdGlvbi0zeClcbiAgKTtcbiAgLS1zYmItZm9jdXMtb3V0bGluZS1jb2xvcjogdmFyKC0tc2JiLWZvY3VzLW91dGxpbmUtY29sb3ItZGFyayk7XG5cbiAgLy8gV2UgaGF2ZSB0byBwbGFjZSB0aGUgc3R5bGVzIG9uIHRoZSBob3N0IGFzIGl0IGhhcyB0byBiZSBhbGlnbmVkIG9uIHRoZSBncmlkIG9mIHRoZSBuYXZpZ2F0aW9uXG4gIGRpc3BsYXk6IHZhcigtLXNiYi1uYXZpZ2F0aW9uLXNlY3Rpb24tZGlzcGxheSwgbm9uZSk7XG4gIHBvc2l0aW9uOiB2YXIoLS1zYmItbmF2aWdhdGlvbi1zZWN0aW9uLXBvc2l0aW9uKTtcbiAgZ3JpZC1jb2x1bW46IHZhcigtLXNiYi1uYXZpZ2F0aW9uLXNlY3Rpb24tY29sdW1uKTtcbiAgaW5zZXQtaW5saW5lLXN0YXJ0OiAwO1xuICBpbnNldC1ibG9jay1zdGFydDogMDtcbiAgd2lkdGg6IHZhcigtLXNiYi1uYXZpZ2F0aW9uLXNlY3Rpb24td2lkdGgpO1xuICBoZWlnaHQ6IHZhcigtLXNiYi1uYXZpZ2F0aW9uLXNlY3Rpb24taGVpZ2h0KTtcbiAgei1pbmRleDogdmFyKC0tc2JiLW5hdmlnYXRpb24tei1pbmRleCwgdmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KSk7XG5cbiAgQGluY2x1ZGUgc2JiLm1xKCRmcm9tOiBsYXJnZSkge1xuICAgIC0tc2JiLW5hdmlnYXRpb24tc2VjdGlvbi1hbmltYXRpb24tZHVyYXRpb246IHZhcihcbiAgICAgIC0tc2JiLWRpc2FibGUtYW5pbWF0aW9uLWR1cmF0aW9uLFxuICAgICAgdmFyKC0tc2JiLWFuaW1hdGlvbi1kdXJhdGlvbi00eClcbiAgICApO1xuICAgIC0tc2JiLW5hdmlnYXRpb24tc2VjdGlvbi13aWR0aDogY2FsYyhcbiAgICAgIDEwMCUgKyB2YXIoLS1zYmItbGF5b3V0LWJhc2Utb2Zmc2V0LXJlc3BvbnNpdmUpICsgdmFyKC0tc2JiLWdyaWQtYmFzZS1ndXR0ZXItcmVzcG9uc2l2ZSlcbiAgICApO1xuXG4gICAgdHJhbnNsYXRlOiBjYWxjKHZhcigtLXNiYi1ncmlkLWJhc2UtZ3V0dGVyLXJlc3BvbnNpdmUpICogLTEpIDA7XG4gIH1cbn1cblxuOmhvc3QoOnN0YXRlKHN0YXRlLW9wZW5lZCkpIHtcbiAgLS1zYmItbmF2aWdhdGlvbi1zZWN0aW9uLXBvaW50ZXItZXZlbnRzOiBhbGw7XG59XG5cbjpob3N0KDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSkge1xuICAtLXNiYi1uYXZpZ2F0aW9uLXNlY3Rpb24tcG9zaXRpb246IGFic29sdXRlO1xufVxuXG46aG9zdCg6aXMoOnN0YXRlKHN0YXRlLW9wZW5pbmcpLCA6c3RhdGUoc3RhdGUtY2xvc2luZykpKSB7XG4gIC0tc2JiLW5hdmlnYXRpb24tc2VjdGlvbi1wb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuOmhvc3QoOmlzKDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSwgOnN0YXRlKHN0YXRlLW9wZW5lZCksIDpzdGF0ZShzdGF0ZS1jbG9zaW5nKSkpIHtcbiAgLS1zYmItbmF2aWdhdGlvbi1zZWN0aW9uLWRpc3BsYXk6IGJsb2NrO1xufVxuXG46OnNsb3R0ZWQoKikge1xuICBwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0tc2JiLW5hdmlnYXRpb24tc2VjdGlvbi1jb250ZW50LXBhZGRpbmctaW5saW5lLXN0YXJ0KTtcbn1cblxuLy8gQWx3YXlzIHBsYWNlIHRoZSBzYmItYnV0dG9uIG9uIGEgbmV3IHJvd1xuOjpzbG90dGVkKDpzdGF0ZShzYmItYnV0dG9uKSkge1xuICBncmlkLWNvbHVtbi1zdGFydDogMTtcbn1cblxuLnNiYi1uYXZpZ2F0aW9uLXNlY3Rpb25fX2NvbnRhaW5lciB7XG4gIHBvaW50ZXItZXZlbnRzOiB2YXIoLS1zYmItbmF2aWdhdGlvbi1zZWN0aW9uLXBvaW50ZXItZXZlbnRzKTtcbiAgaGVpZ2h0OiB2YXIoLS1zYmItbmF2aWdhdGlvbi1zZWN0aW9uLWhlaWdodCk7XG59XG5cbi5zYmItbmF2aWdhdGlvbi1zZWN0aW9uIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgYm9yZGVyOiBub25lO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGNvbG9yOiB2YXIoLS1zYmItbmF2aWdhdGlvbi1jb2xvciwgdmFyKC0tc2JiLWNvbG9yLTEtbmVnYXRpdmUpKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIHBhZGRpbmc6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG5cbiAgOmhvc3QoOmlzKDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSwgOnN0YXRlKHN0YXRlLW9wZW5lZCksIDpzdGF0ZShzdGF0ZS1jbG9zaW5nKSkpICYge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuXG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICBuYW1lOiBvcGVuO1xuICAgICAgZHVyYXRpb246IHZhcigtLXNiYi1uYXZpZ2F0aW9uLXNlY3Rpb24tYW5pbWF0aW9uLWR1cmF0aW9uKTtcbiAgICAgIHRpbWluZy1mdW5jdGlvbjogdmFyKC0tc2JiLW5hdmlnYXRpb24tc2VjdGlvbi1hbmltYXRpb24tZWFzaW5nKTtcbiAgICB9XG4gIH1cblxuICA6aG9zdCg6c3RhdGUoc3RhdGUtY2xvc2luZykpICYge1xuICAgIGFuaW1hdGlvbi1uYW1lOiBjbG9zZTtcbiAgfVxuXG4gIEBpbmNsdWRlIHNiYi5pZi1mb3JjZWQtY29sb3JzIHtcbiAgICBvdXRsaW5lOiB2YXIoLS1zYmItYm9yZGVyLXdpZHRoLTF4KSBzb2xpZCBDYW52YXNUZXh0O1xuICB9XG59XG5cbi5zYmItbmF2aWdhdGlvbi1zZWN0aW9uX193cmFwcGVyIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwYWRkaW5nLWJsb2NrOiB2YXIoLS1zYmItbmF2aWdhdGlvbi1zZWN0aW9uLXBhZGRpbmctYmxvY2spO1xuICBvdXRsaW5lOiBub25lO1xuICBvdmVyZmxvdy15OiBhdXRvO1xuXG4gIDpob3N0KDppcyg6c3RhdGUoc3RhdGUtb3BlbmluZyksIDpzdGF0ZShzdGF0ZS1jbG9zaW5nKSkpICYge1xuICAgIC0tc2JiLXNjcm9sbGJhci1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cbiAgICBzY3JvbGxiYXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICB9XG59XG5cbi5zYmItbmF2aWdhdGlvbi1zZWN0aW9uX19oZWFkZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMXgpO1xuICBtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLXNiYi1zcGFjaW5nLXJlc3BvbnNpdmUteHhsKTtcbiAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IHZhcigtLXNiYi1uYXZpZ2F0aW9uLXNlY3Rpb24tY29udGVudC1wYWRkaW5nLWlubGluZS1zdGFydCk7XG5cbiAgQGluY2x1ZGUgc2JiLm1xKCRmcm9tOiBsYXJnZSkge1xuICAgIG1hcmdpbi1ibG9jay1zdGFydDogMDtcbiAgICBwYWRkaW5nLWlubGluZS1zdGFydDogMDtcbiAgfVxuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogdWx0cmEpIHtcbiAgICBncmlkLWNvbHVtbjogMSAvIDQ7XG4gIH1cbn1cblxuLnNiYi1uYXZpZ2F0aW9uLXNlY3Rpb25fX2JhY2sge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRyYW5zbGF0ZTogY2FsYygoMTAwJSArIHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTF4KSkgKiAtMSkgMDtcblxuICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG4uc2JiLW5hdmlnYXRpb24tc2VjdGlvbl9fdGl0bGUge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgZm9udC1zaXplOiB2YXIoLS1zYmItbmF2aWdhdGlvbi1zZWN0aW9uLWZvbnQtc2l6ZSk7XG4gIGxldHRlci1zcGFjaW5nOiB2YXIoLS1zYmItdHlwby1sZXR0ZXItc3BhY2luZy1oZWFkaW5nKTtcbiAgbGluZS1oZWlnaHQ6IHZhcigtLXNiYi10eXBvLWxpbmUtaGVpZ2h0LWhlYWRpbmcpO1xufVxuXG4uc2JiLW5hdmlnYXRpb24tc2VjdGlvbl9fY29udGVudCB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xuICBnYXA6IHZhcigtLXNiYi1zcGFjaW5nLXJlc3BvbnNpdmUtbCkgdmFyKC0tc2JiLWdyaWQtYmFzZS1ndXR0ZXItcmVzcG9uc2l2ZSk7XG4gIHBhZGRpbmctaW5saW5lOiB2YXIoLS1zYmItbmF2aWdhdGlvbi1zZWN0aW9uLXBhZGRpbmctaW5saW5lKTtcblxuICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2xhdGU6IDAgdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtM3gpO1xuICAgIHRyYW5zaXRpb246IHtcbiAgICAgIGR1cmF0aW9uOiB2YXIoLS1zYmItbmF2aWdhdGlvbi1zZWN0aW9uLWFuaW1hdGlvbi1kdXJhdGlvbik7XG4gICAgICBkZWxheTogdmFyKC0tc2JiLW5hdmlnYXRpb24tc2VjdGlvbi1hbmltYXRpb24tZHVyYXRpb24pO1xuICAgICAgdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1zYmItbmF2aWdhdGlvbi1zZWN0aW9uLWFuaW1hdGlvbi1lYXNpbmcpO1xuICAgICAgcHJvcGVydHk6IG9wYWNpdHksIHRyYW5zbGF0ZTtcbiAgICB9XG5cbiAgICA6aG9zdCg6c3RhdGUoc3RhdGUtb3BlbmVkKSkgJiB7XG4gICAgICBvcGFjaXR5OiAxO1xuICAgICAgdHJhbnNsYXRlOiAwIDA7XG4gICAgfVxuICB9XG5cbiAgQGluY2x1ZGUgc2JiLm1xKCRmcm9tOiB1bHRyYSkge1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIDFmcik7XG4gIH1cblxuICA6aG9zdCg6c3RhdGUoc3RhdGUtY2xvc2luZykpICYge1xuICAgIHRyYW5zaXRpb24tZGVsYXk6IDBzO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgb3BlbiB7XG4gIGZyb20ge1xuICAgIHRyYW5zbGF0ZTogdmFyKC0tc2JiLW5hdmlnYXRpb24tc2VjdGlvbi10cmFuc2xhdGUpIDA7XG4gIH1cblxuICB0byB7XG4gICAgdHJhbnNsYXRlOiAwIDA7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBjbG9zZSB7XG4gIGZyb20ge1xuICAgIHRyYW5zbGF0ZTogMCAwO1xuICB9XG5cbiAgdG8ge1xuICAgIHRyYW5zbGF0ZTogdmFyKC0tc2JiLW5hdmlnYXRpb24tc2VjdGlvbi10cmFuc2xhdGUpIDA7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIHR5cGUgQ1NTUmVzdWx0R3JvdXAsXG4gIGh0bWwsXG4gIGlzU2VydmVyLFxuICBub3RoaW5nLFxuICB0eXBlIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIHR5cGUgUHJvcGVydHlWYWx1ZXMsXG4gIHR5cGUgVGVtcGxhdGVSZXN1bHQsXG4gIHVuc2FmZUNTUyxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBTYmJUcmFuc3BhcmVudEJ1dHRvbkVsZW1lbnQgfSBmcm9tICcuLi8uLi9idXR0b24ucHVyZS50cyc7XG5pbXBvcnQge1xuICBib3hTaXppbmdTdHlsZXMsXG4gIGZvcmNlVHlwZSxcbiAgaTE4bkdvQmFjayxcbiAgaWRSZWZlcmVuY2UsXG4gIElTX0ZPQ1VTQUJMRV9RVUVSWSxcbiAgaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24sXG4gIG9taXRFbXB0eUNvbnZlcnRlcixcbiAgcmVtb3ZlQXJpYU92ZXJsYXlUcmlnZ2VyUHJvcGVydGllcyxcbiAgdHlwZSBTYmJFbGVtZW50VHlwZSxcbiAgU2JiRm9jdXNUcmFwQ29udHJvbGxlcixcbiAgc2JiSW5wdXRNb2RhbGl0eURldGVjdG9yLFxuICBTYmJMYW5ndWFnZUNvbnRyb2xsZXIsXG4gIFNiYk1lZGlhTWF0Y2hlckNvbnRyb2xsZXIsXG4gIFNiYk1lZGlhUXVlcnlCcmVha3BvaW50U21hbGxBbmRCZWxvdyxcbiAgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQsXG4gIHR5cGUgU2JiT3BlbmVkQ2xvc2VkU3RhdGUsXG4gIFNiYlVwZGF0ZVNjaGVkdWxlck1peGluLFxuICBzY3JvbGxiYXJTdHlsZXMsXG4gIHNldEFyaWFPdmVybGF5VHJpZ2dlclByb3BlcnRpZXMsXG4gIMm1c3RhdGVDb250cm9sbGVyLFxufSBmcm9tICcuLi8uLi9jb3JlLnRzJztcbmltcG9ydCB0eXBlIHsgU2JiTmF2aWdhdGlvbkVsZW1lbnQgfSBmcm9tICcuLi9uYXZpZ2F0aW9uL25hdmlnYXRpb24uY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgU2JiTmF2aWdhdGlvbkJ1dHRvbkVsZW1lbnQgfSBmcm9tICcuLi9uYXZpZ2F0aW9uLWJ1dHRvbi9uYXZpZ2F0aW9uLWJ1dHRvbi5jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBTYmJOYXZpZ2F0aW9uTGlua0VsZW1lbnQgfSBmcm9tICcuLi9uYXZpZ2F0aW9uLWxpbmsvbmF2aWdhdGlvbi1saW5rLmNvbXBvbmVudC50cyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL25hdmlnYXRpb24tc2VjdGlvbi5zY3NzP2lubGluZSc7XG5cbi8qKlxuICogSXQgY2FuIGJlIHVzZWQgYXMgYSBjb250YWluZXIgZm9yIGBzYmItbmF2aWdhdGlvbi1saXN0YCB3aXRoaW4gYSBgc2JiLW5hdmlnYXRpb25gLlxuICpcbiAqIEBzbG90IC0gVXNlIHRoZSB1bm5hbWVkIHNsb3QgdG8gYWRkIGNvbnRlbnQgaW50byB0aGUgYHNiYi1uYXZpZ2F0aW9uLXNlY3Rpb25gLlxuICovXG5leHBvcnQgY2xhc3MgU2JiTmF2aWdhdGlvblNlY3Rpb25FbGVtZW50IGV4dGVuZHMgU2JiVXBkYXRlU2NoZWR1bGVyTWl4aW4oU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQpIHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBlbGVtZW50TmFtZTogc3RyaW5nID0gJ3NiYi1uYXZpZ2F0aW9uLXNlY3Rpb24nO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGVsZW1lbnREZXBlbmRlbmNpZXM6IFNiYkVsZW1lbnRUeXBlW10gPSBbU2JiVHJhbnNwYXJlbnRCdXR0b25FbGVtZW50XTtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW1xuICAgIGJveFNpemluZ1N0eWxlcyxcbiAgICBzY3JvbGxiYXJTdHlsZXMsXG4gICAgdW5zYWZlQ1NTKHN0eWxlKSxcbiAgXTtcblxuICAvKipcbiAgICogVGhlIGxhYmVsIHRvIGJlIHNob3duIGJlZm9yZSB0aGUgYWN0aW9uIGxpc3QuXG4gICAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAndGl0bGUtY29udGVudCcsIHJlZmxlY3Q6IHRydWUsIGNvbnZlcnRlcjogb21pdEVtcHR5Q29udmVydGVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciB0aXRsZUNvbnRlbnQ6IHN0cmluZyA9ICcnO1xuXG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgbmF2aWdhdGlvbiBzZWN0aW9uLlxuICAgKlxuICAgKiBGb3IgYXR0cmlidXRlIHVzYWdlLCBwcm92aWRlIGFuIGlkIHJlZmVyZW5jZS5cbiAgICovXG4gIEBpZFJlZmVyZW5jZSgpXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBhY2Nlc3NvciB0cmlnZ2VyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgYmUgZm9yd2FyZGVkIGFzIGFyaWEtbGFiZWwgdG8gdGhlIG5hdiBlbGVtZW50IGFuZCBpcyByZWFkIGFzIGEgdGl0bGUgb2YgdGhlIG5hdmlnYXRpb24tc2VjdGlvbi5cbiAgICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdhY2Nlc3NpYmlsaXR5LWxhYmVsJyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYWNjZXNzaWJpbGl0eUxhYmVsOiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogVGhpcyB3aWxsIGJlIGZvcndhcmRlZCBhcyBhcmlhLWxhYmVsIHRvIHRoZSBiYWNrIGJ1dHRvbiBlbGVtZW50LlxuICAgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FjY2Vzc2liaWxpdHktYmFjay1sYWJlbCcgfSlcbiAgcHVibGljIGFjY2Vzc29yIGFjY2Vzc2liaWxpdHlCYWNrTGFiZWw6IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBUaGUgc3RhdGUgb2YgdGhlIGNvbXBvbmVudC4gKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNldCBzdGF0ZShzdGF0ZTogU2JiT3BlbmVkQ2xvc2VkU3RhdGUpIHtcbiAgICBzdXBlci5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFIaWRkZW4gPSB0aGlzLnN0YXRlICE9PSAnb3BlbmVkJyA/ICd0cnVlJyA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldCBzdGF0ZSgpOiBTYmJPcGVuZWRDbG9zZWRTdGF0ZSB7XG4gICAgcmV0dXJuIHN1cGVyLnN0YXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyc3RMZXZlbE5hdmlnYXRpb24/OiBTYmJOYXZpZ2F0aW9uRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF90cmlnZ2VyRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfdHJpZ2dlckFib3J0Q29udHJvbGxlciE6IEFib3J0Q29udHJvbGxlcjtcbiAgcHJpdmF0ZSBfd2luZG93RXZlbnRzQ29udHJvbGxlciE6IEFib3J0Q29udHJvbGxlcjtcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9mb2N1c1RyYXBDb250cm9sbGVyID0gbmV3IFNiYkZvY3VzVHJhcENvbnRyb2xsZXIodGhpcyk7XG4gIHByaXZhdGUgX2xhc3RLZXlkb3duRXZlbnQ6IEtleWJvYXJkRXZlbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbWVkaWFNYXRjaGVyQ29udHJvbGxlciA9IG5ldyBTYmJNZWRpYU1hdGNoZXJDb250cm9sbGVyKHRoaXMsIHtcbiAgICBbU2JiTWVkaWFRdWVyeUJyZWFrcG9pbnRTbWFsbEFuZEJlbG93XTogKG1hdGNoZXMpID0+IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlICE9PSAnY2xvc2VkJykge1xuICAgICAgICB0aGlzLl9zZXROYXZpZ2F0aW9uSW5lcnQobWF0Y2hlcyk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/Ligna2V5ZG93bicsIChlKSA9PiB7XG4gICAgICB0aGlzLl9sYXN0S2V5ZG93bkV2ZW50ID0gZTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdmb2N1c291dCcsIChlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGUucmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmXG4gICAgICAgICF0aGlzLmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCkgJiZcbiAgICAgICAgc2JiSW5wdXRNb2RhbGl0eURldGVjdG9yLm1vc3RSZWNlbnRNb2RhbGl0eSA9PT0gJ2tleWJvYXJkJyAmJlxuICAgICAgICB0aGlzLl9sYXN0S2V5ZG93bkV2ZW50Py5rZXkgPT09ICdUYWInICYmXG4gICAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50XG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbkVsZW1lbnQgPSB0aGlzLmNsb3Nlc3Q8U2JiTmF2aWdhdGlvbkVsZW1lbnQ+KCdzYmItbmF2aWdhdGlvbicpO1xuICAgICAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgbmF2aWdhdGlvbkVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KElTX0ZPQ1VTQUJMRV9RVUVSWSkgPz8gW10sXG4gICAgICAgICkuZmlsdGVyKChlKSA9PiAhdGhpcy5jb250YWlucyhlKSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2xhc3RLZXlkb3duRXZlbnQuc2hpZnRLZXkgfHwgIWZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50Py5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJJbmRleCA9IGZvY3VzYWJsZUVsZW1lbnRzLmluZGV4T2YodGhpcy5fdHJpZ2dlckVsZW1lbnQpO1xuICAgICAgICAgIChmb2N1c2FibGVFbGVtZW50c1t0cmlnZ2VySW5kZXggKyAxXSA/PyBuYXZpZ2F0aW9uRWxlbWVudCEuY2xvc2VCdXR0b24pPy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIG5hdmlnYXRpb24gc2VjdGlvbiBvbiB0cmlnZ2VyIGNsaWNrLlxuICAgKi9cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09ICdjbG9zZWQnIHx8ICF0aGlzLmhhc1VwZGF0ZWQgfHwgIXRoaXMuZGlzcGF0Y2hCZWZvcmVPcGVuRXZlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc05hdmlnYXRpb25CdXR0b24odGhpcy5fdHJpZ2dlckVsZW1lbnQpKSB7XG4gICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudD8ubWFya2VyPy5zZWxlY3QodGhpcy5fdHJpZ2dlckVsZW1lbnQpO1xuICAgIH1cblxuICAgIHRoaXMuX2Nsb3NlUHJldmlvdXNOYXZpZ2F0aW9uU2VjdGlvbigpO1xuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmluZyc7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ8m1bmF2aWdhdGlvbnNlY3Rpb25vcGVuaW5nJykpO1xuICAgIHRoaXMuc3RhcnRVcGRhdGUoKTtcbiAgICB0aGlzLmluZXJ0ID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fdHJpZ2dlckVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LmFyaWFFeHBhbmRlZCA9ICd0cnVlJztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGlzIHplcm8sIHRoZSBhbmltYXRpb25lbmQgZXZlbnQgaXMgbm90IGFsd2F5cyBmaXJlZCByZWxpYWJseS5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgb3BlbmVkYCBzdGF0ZS5cbiAgICBpZiAodGhpcy5faXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKSkge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1plcm9BbmltYXRpb25EdXJhdGlvbih0aGlzLCAnLS1zYmItbmF2aWdhdGlvbi1zZWN0aW9uLWFuaW1hdGlvbi1kdXJhdGlvbicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlT3BlbmluZygpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ29wZW5lZCc7XG4gICAgdGhpcy5pbmVydCA9IGZhbHNlO1xuICAgIHRoaXMuX2F0dGFjaFdpbmRvd0V2ZW50cygpO1xuICAgIHRoaXMuX3NldE5hdmlnYXRpb25JbmVydCgpO1xuICAgIHRoaXMuX2ZvY3VzVHJhcENvbnRyb2xsZXIuZm9jdXNJbml0aWFsRWxlbWVudCgpO1xuICAgIHRoaXMuX2NoZWNrQWN0aXZlQWN0aW9uKCk7XG4gICAgdGhpcy5jb21wbGV0ZVVwZGF0ZSgpO1xuICAgIHRoaXMuZGlzcGF0Y2hPcGVuRXZlbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUNsb3NpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcignLnNiYi1uYXZpZ2F0aW9uLXNlY3Rpb25fX2NvbnRhaW5lcicpPy5zY3JvbGxUbygwLCAwKTtcbiAgICB0aGlzLl93aW5kb3dFdmVudHNDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHRoaXMuX3Jlc2V0TGlzdHMoKTtcbiAgICB0aGlzLl9zZXROYXZpZ2F0aW9uSW5lcnQoKTtcbiAgICBpZiAodGhpcy5faXNCZWxvd0xhcmdlKCkgJiYgdGhpcy5fdHJpZ2dlckVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICAgIHRoaXMuY29tcGxldGVVcGRhdGUoKTtcbiAgICB0aGlzLmRpc3BhdGNoQ2xvc2VFdmVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xvc2VQcmV2aW91c05hdmlnYXRpb25TZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcnN0TGV2ZWxOYXZpZ2F0aW9uPy5hY3RpdmVOYXZpZ2F0aW9uU2VjdGlvbj8uY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG5hdmlnYXRpb24gc2VjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29wZW5lZCcgfHwgIXRoaXMuZGlzcGF0Y2hCZWZvcmVDbG9zZUV2ZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnybVuYXZpZ2F0aW9uc2VjdGlvbmNsb3NpbmcnKSk7XG4gICAgdGhpcy5zdGF0ZSA9ICdjbG9zaW5nJztcbiAgICB0aGlzLnN0YXJ0VXBkYXRlKCk7XG4gICAgdGhpcy5pbmVydCA9IHRydWU7XG4gICAgaWYgKHRoaXMuX3RyaWdnZXJFbGVtZW50KSB7XG4gICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5hcmlhRXhwYW5kZWQgPSAnZmFsc2UnO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaXMgemVybywgdGhlIGFuaW1hdGlvbmVuZCBldmVudCBpcyBub3QgYWx3YXlzIGZpcmVkIHJlbGlhYmx5LlxuICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBkaXJlY3RseSBzZXQgdGhlIGBjbG9zZWRgIHN0YXRlLlxuICAgIGlmICh0aGlzLl9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDbG9zaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHRyaWdnZXIgaXMgdmFsaWQgYW5kIGF0dGFjaCBjbGljayBldmVudCBsaXN0ZW5lcnMuXG4gIHByaXZhdGUgX2NvbmZpZ3VyZVRyaWdnZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gdGhpcy5fdHJpZ2dlckVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl90cmlnZ2VyQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHJlbW92ZUFyaWFPdmVybGF5VHJpZ2dlclByb3BlcnRpZXModGhpcy5fdHJpZ2dlckVsZW1lbnQpO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50ID0gdGhpcy50cmlnZ2VyO1xuXG4gICAgaWYgKCF0aGlzLl90cmlnZ2VyRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldEFyaWFPdmVybGF5VHJpZ2dlclByb3BlcnRpZXModGhpcywgdGhpcy5fdHJpZ2dlckVsZW1lbnQsICdtZW51JywgdGhpcy5zdGF0ZSk7XG4gICAgdGhpcy5fdHJpZ2dlckFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBpZiAodGhpcy5faXNOYXZpZ2F0aW9uQnV0dG9uKHRoaXMuX3RyaWdnZXJFbGVtZW50KSkge1xuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuY29ubmVjdGVkU2VjdGlvbiA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5vcGVuKCksIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fdHJpZ2dlckFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgdGhpcy5fZmlyc3RMZXZlbE5hdmlnYXRpb24gPSB0aGlzLl90cmlnZ2VyRWxlbWVudD8uY2xvc2VzdD8uKCdzYmItbmF2aWdhdGlvbicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNOYXZpZ2F0aW9uQnV0dG9uKHRyaWdnZXI6IEhUTUxFbGVtZW50IHwgbnVsbCk6IHRyaWdnZXIgaXMgU2JiTmF2aWdhdGlvbkJ1dHRvbkVsZW1lbnQge1xuICAgIHJldHVybiB0cmlnZ2VyPy5sb2NhbE5hbWUgPT09ICdzYmItbmF2aWdhdGlvbi1idXR0b24nO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0TmF2aWdhdGlvbkluZXJ0KGlzQmVsb3dMYXJnZTogYm9vbGVhbiA9IHRoaXMuX2lzQmVsb3dMYXJnZSgpKTogdm9pZCB7XG4gICAgY29uc3QgbmF2aWdhdGlvbkNvbnRlbnQgPSB0aGlzLl9maXJzdExldmVsTmF2aWdhdGlvbj8ubmF2aWdhdGlvbkNvbnRlbnQ7XG4gICAgaWYgKG5hdmlnYXRpb25Db250ZW50KSB7XG4gICAgICBuYXZpZ2F0aW9uQ29udGVudC5pbmVydCA9IGlzQmVsb3dMYXJnZSAmJiB0aGlzLnN0YXRlICE9PSAnY2xvc2VkJztcbiAgICB9XG4gIH1cblxuICAvLyBJbiByYXJlIGNhc2VzIGl0IGNhbiBiZSB0aGF0IHRoZSBhbmltYXRpb25FbmQgZXZlbnQgaXMgdHJpZ2dlcmVkIHR3aWNlLlxuICAvLyBUbyBhdm9pZCBlbnRlcmluZyBhIGNvcnJ1cHQgc3RhdGUsIGV4aXQgd2hlbiBzdGF0ZSBpcyBub3QgZXhwZWN0ZWQuXG4gIHByaXZhdGUgX29uQW5pbWF0aW9uRW5kKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnb3BlbicgJiYgdGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnKSB7XG4gICAgICB0aGlzLl9oYW5kbGVPcGVuaW5nKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnY2xvc2UnICYmIHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJykge1xuICAgICAgdGhpcy5faGFuZGxlQ2xvc2luZygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2V0TGlzdHMoKTogdm9pZCB7XG4gICAgQXJyYXkuZnJvbShcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbDxTYmJOYXZpZ2F0aW9uQnV0dG9uRWxlbWVudCB8IFNiYk5hdmlnYXRpb25MaW5rRWxlbWVudD4oXG4gICAgICAgICc6c3RhdGUoc2VjdGlvbi1hY3Rpb24pOnN0YXRlKGFjdGlvbi1hY3RpdmUpJyxcbiAgICAgICkgPz8gW10sXG4gICAgKS5mb3JFYWNoKChhY3Rpb24pID0+IMm1c3RhdGVDb250cm9sbGVyKGFjdGlvbikuZGVsZXRlKCdhY3Rpb24tYWN0aXZlJykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXR0YWNoV2luZG93RXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuX3dpbmRvd0V2ZW50c0NvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMuX29uS2V5ZG93bkV2ZW50KGV2ZW50KSwge1xuICAgICAgc2lnbmFsOiB0aGlzLl93aW5kb3dFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcblxuICAgIC8vIENsb3NlIG5hdmlnYXRpb24gc2VjdGlvbiBvbiBhY3Rpb24gY2xpY2sgb3Igc2JiLW5hdmlnYXRpb24tc2VjdGlvbi1jbG9zZSBjbGlja1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2hhbmRsZU5hdmlnYXRpb25TZWN0aW9uQ2xvc2UsIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fd2luZG93RXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgY2xpY2sgd2FzIHRyaWdnZXJlZCBvbiBhbiBlbGVtZW50IHRoYXQgc2hvdWxkIGNsb3NlIHRoZSBzZWN0aW9uLlxuICBwcml2YXRlIF9oYW5kbGVOYXZpZ2F0aW9uU2VjdGlvbkNsb3NlID0gKGV2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmIChcbiAgICAgIGV2ZW50XG4gICAgICAgIC5jb21wb3NlZFBhdGgoKVxuICAgICAgICAuZmlsdGVyKChlbCkgPT4gZWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudClcbiAgICAgICAgLnNvbWUoKGVsKSA9PiB0aGlzLl9pc0Nsb3NlRWxlbWVudChlbCkpXG4gICAgKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgX2lzQ2xvc2VFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVsZW1lbnQubm9kZU5hbWUgPT09ICdBJyB8fFxuICAgICAgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSAmJlxuICAgICAgICAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3NiYi1uYXZpZ2F0aW9uLWNsb3NlJykgfHxcbiAgICAgICAgICBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnc2JiLW5hdmlnYXRpb24tc2VjdGlvbi1jbG9zZScpKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNCZWxvd0xhcmdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYU1hdGNoZXJDb250cm9sbGVyLm1hdGNoZXMoU2JiTWVkaWFRdWVyeUJyZWFrcG9pbnRTbWFsbEFuZEJlbG93KSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8vIENsb3NlcyB0aGUgbmF2aWdhdGlvbiBvbiBcIkVzY1wiIGtleSBwcmVzc2VkLlxuICBwcml2YXRlIF9vbktleWRvd25FdmVudChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSAnb3BlbmVkJyAmJiBldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tBY3RpdmVBY3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMucXVlcnlTZWxlY3RvcjxTYmJOYXZpZ2F0aW9uQnV0dG9uRWxlbWVudCB8IFNiYk5hdmlnYXRpb25MaW5rRWxlbWVudD4oXG4gICAgICAnOmlzKHNiYi1uYXZpZ2F0aW9uLWJ1dHRvbiwgc2JiLW5hdmlnYXRpb24tbGluaykuc2JiLWFjdGl2ZScsXG4gICAgKTtcbiAgICDJtXN0YXRlQ29udHJvbGxlcihlbGVtZW50KT8udG9nZ2xlKCdhY3Rpb24tYWN0aXZlJywgdHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNsb3QgfHw9ICduYXZpZ2F0aW9uLXNlY3Rpb24nO1xuICAgIGlmICh0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX2NvbmZpZ3VyZVRyaWdnZXIoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5fdHJpZ2dlckFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB0aGlzLl93aW5kb3dFdmVudHNDb250cm9sbGVyPy5hYm9ydCgpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHJlcXVlc3RVcGRhdGUoXG4gICAgbmFtZT86IFByb3BlcnR5S2V5LFxuICAgIG9sZFZhbHVlPzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgKTogdm9pZCB7XG4gICAgc3VwZXIucmVxdWVzdFVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAoIWlzU2VydmVyICYmICghbmFtZSB8fCBuYW1lID09PSAndHJpZ2dlcicpICYmIHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5fY29uZmlndXJlVHJpZ2dlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB0aGlzLl9jb25maWd1cmVUcmlnZ2VyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItbmF2aWdhdGlvbi1zZWN0aW9uX19jb250YWluZXJcIj5cbiAgICAgICAgPG5hdlxuICAgICAgICAgIEBhbmltYXRpb25lbmQ9JHt0aGlzLl9vbkFuaW1hdGlvbkVuZH1cbiAgICAgICAgICBjbGFzcz1cInNiYi1uYXZpZ2F0aW9uLXNlY3Rpb25cIlxuICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT0keyF0aGlzLmFjY2Vzc2liaWxpdHlMYWJlbCA/ICd0aXRsZScgOiBub3RoaW5nfVxuICAgICAgICAgIGFyaWEtbGFiZWw9JHt0aGlzLmFjY2Vzc2liaWxpdHlMYWJlbCA/IHRoaXMuYWNjZXNzaWJpbGl0eUxhYmVsIDogbm90aGluZ31cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItbmF2aWdhdGlvbi1zZWN0aW9uX193cmFwcGVyIHNiYi1zY3JvbGxiYXItbmVnYXRpdmVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItbmF2aWdhdGlvbi1zZWN0aW9uX19jb250ZW50XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItbmF2aWdhdGlvbi1zZWN0aW9uX19oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8IS0tIEJhY2sgYnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgIDxzYmItdHJhbnNwYXJlbnQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBpZD1cInNiYi1uYXZpZ2F0aW9uLXNlY3Rpb24tYmFjay1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzYmItbmF2aWdhdGlvbi1zZWN0aW9uX19iYWNrXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9JHt0aGlzLmFjY2Vzc2liaWxpdHlCYWNrTGFiZWwgfHwgaTE4bkdvQmFja1t0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX1cbiAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlXG4gICAgICAgICAgICAgICAgICBzaXplPVwibVwiXG4gICAgICAgICAgICAgICAgICBpY29uLW5hbWU9XCJjaGV2cm9uLXNtYWxsLWxlZnQtc21hbGxcIlxuICAgICAgICAgICAgICAgICAgc2JiLW5hdmlnYXRpb24tc2VjdGlvbi1jbG9zZVxuICAgICAgICAgICAgICAgID48L3NiYi10cmFuc3BhcmVudC1idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1uYXZpZ2F0aW9uLXNlY3Rpb25fX3RpdGxlXCIgaWQ9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cInRpdGxlXCI+JHt0aGlzLnRpdGxlQ29udGVudH08L3Nsb3Q+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmF2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLW5hdmlnYXRpb24tc2VjdGlvbic6IFNiYk5hdmlnYXRpb25TZWN0aW9uRWxlbWVudDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztJQzhDYSxxQ0FBMkI7bUJBQVMsd0JBQXdC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
|