@sbb-esta/lyne-elements-dev 4.11.0-dev.1776752302 → 4.11.0-dev.1776867495

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 (130) hide show
  1. package/{block-link-common-DzGY49Xc.js → block-link-common-BwXob5QE.js} +1 -1
  2. package/core/styles/core.scss +37 -4
  3. package/core/styles/mixins/helpers.scss +3 -3
  4. package/core.css +70 -5
  5. package/custom-elements.json +1576 -1576
  6. package/development/{block-link-common-GckvjULA.js → block-link-common-Dh1NOKxB.js} +2 -2
  7. package/development/form-field/form-field/form-field.component.js +1 -1
  8. package/development/form-field/form-field.js +1 -1
  9. package/development/{form-field.component-D0NJclvI.js → form-field.component-CWVzymTX.js} +2 -2
  10. package/development/form-field.js +1 -1
  11. package/development/form-field.pure.js +1 -1
  12. package/development/link/common/block-link-common.js +1 -1
  13. package/development/link/common.js +1 -1
  14. package/development/link.js +1 -1
  15. package/development/link.pure.js +1 -1
  16. package/development/slider/slider.component.js +1 -1
  17. package/development/{slider.component-BjfLnUvP.js → slider.component-C3qZB6ar.js} +2 -2
  18. package/development/slider.js +1 -1
  19. package/development/slider.pure.js +1 -1
  20. package/development/step-label.component-DjA-3IGs.js +131 -0
  21. package/development/stepper/step-label/step-label.component.js +1 -1
  22. package/development/stepper/step-label.js +1 -1
  23. package/development/stepper.js +1 -1
  24. package/development/stepper.pure.js +1 -1
  25. package/development/teaser-hero/teaser-hero.component.js +1 -1
  26. package/development/{teaser-hero.component-DNlc8Tbl.js → teaser-hero.component-BIOpoGME.js} +2 -2
  27. package/development/teaser-hero.js +1 -1
  28. package/development/teaser-hero.pure.js +1 -1
  29. package/development/timetable-form/timetable-form/timetable-form.component.js +1 -1
  30. package/development/timetable-form/timetable-form-details/timetable-form-details.component.js +1 -1
  31. package/development/timetable-form/timetable-form-details.js +1 -1
  32. package/development/timetable-form/timetable-form-field/timetable-form-field.component.js +1 -1
  33. package/development/timetable-form/timetable-form-field.js +1 -1
  34. package/development/timetable-form/timetable-form.js +1 -1
  35. package/development/timetable-form-details.component-DJl5Qt9y.js +26 -0
  36. package/development/timetable-form-field.component-DQ_TzcF4.js +44 -0
  37. package/development/timetable-form.component-N8h4JBlH.js +27 -0
  38. package/development/timetable-form.js +3 -3
  39. package/development/timetable-form.pure.js +3 -3
  40. package/development/timetable-occupancy/timetable-occupancy.component.js +1 -1
  41. package/development/timetable-occupancy.component-dhpPJEaI.js +124 -0
  42. package/development/timetable-occupancy.js +1 -1
  43. package/development/timetable-occupancy.pure.js +1 -1
  44. package/development/toggle/toggle/toggle.component.d.ts.map +1 -1
  45. package/development/toggle/toggle/toggle.component.js +1 -1
  46. package/development/toggle/toggle-option/toggle-option.component.d.ts.map +1 -1
  47. package/development/toggle/toggle-option/toggle-option.component.js +1 -1
  48. package/development/toggle/toggle-option.js +1 -1
  49. package/development/toggle/toggle.js +1 -1
  50. package/development/toggle-check/toggle-check.component.js +1 -1
  51. package/development/toggle-check.component-_fDAuLob.js +159 -0
  52. package/development/toggle-check.js +1 -1
  53. package/development/toggle-check.pure.js +1 -1
  54. package/development/toggle-option.component-DTS3a603.js +167 -0
  55. package/development/toggle.component-CKug5pF7.js +249 -0
  56. package/development/toggle.js +2 -2
  57. package/development/toggle.pure.js +2 -2
  58. package/development/tooltip/tooltip.component.js +1 -1
  59. package/development/tooltip.component-epXOY5vO.js +378 -0
  60. package/development/tooltip.js +1 -1
  61. package/development/tooltip.pure.js +1 -1
  62. package/form-field/form-field/form-field.component.js +1 -1
  63. package/form-field/form-field.js +1 -1
  64. package/{form-field.component-Bqw-VgJF.js → form-field.component-Cc_siKrq.js} +1 -1
  65. package/form-field.js +1 -1
  66. package/form-field.pure.js +1 -1
  67. package/link/common/block-link-common.js +1 -1
  68. package/link/common.js +1 -1
  69. package/link.js +1 -1
  70. package/link.pure.js +1 -1
  71. package/off-brand-theme.css +70 -5
  72. package/package.json +2 -2
  73. package/safety-theme.css +70 -5
  74. package/slider/slider.component.js +1 -1
  75. package/{slider.component-CoqCppCq.js → slider.component-BlRVR6iU.js} +1 -1
  76. package/slider.js +1 -1
  77. package/slider.pure.js +1 -1
  78. package/standard-theme.css +70 -5
  79. package/{step-label.component-DnQBwnL8.js → step-label.component-dzcNc12A.js} +1 -1
  80. package/stepper/step-label/step-label.component.js +1 -1
  81. package/stepper/step-label.js +1 -1
  82. package/stepper.js +1 -1
  83. package/stepper.pure.js +1 -1
  84. package/teaser-hero/teaser-hero.component.js +1 -1
  85. package/{teaser-hero.component-CHy82SKQ.js → teaser-hero.component-D8yj-N5n.js} +1 -1
  86. package/teaser-hero.js +1 -1
  87. package/teaser-hero.pure.js +1 -1
  88. package/timetable-form/timetable-form/timetable-form.component.js +1 -1
  89. package/timetable-form/timetable-form-details/timetable-form-details.component.js +1 -1
  90. package/timetable-form/timetable-form-details.js +1 -1
  91. package/timetable-form/timetable-form-field/timetable-form-field.component.js +1 -1
  92. package/timetable-form/timetable-form-field.js +1 -1
  93. package/timetable-form/timetable-form.js +1 -1
  94. package/timetable-form-details.component-mWKaBW_9.js +16 -0
  95. package/timetable-form-field.component-Cv_lv8vf.js +32 -0
  96. package/{timetable-form.component-CU1FXAZH.js → timetable-form.component-YcvKAlfz.js} +1 -1
  97. package/timetable-form.js +3 -3
  98. package/timetable-form.pure.js +3 -3
  99. package/timetable-occupancy/timetable-occupancy.component.js +1 -1
  100. package/{timetable-occupancy.component-Db9SfiyD.js → timetable-occupancy.component-BDmxFVKK.js} +1 -1
  101. package/timetable-occupancy.js +1 -1
  102. package/timetable-occupancy.pure.js +1 -1
  103. package/toggle/toggle/toggle.component.js +1 -1
  104. package/toggle/toggle-option/toggle-option.component.js +1 -1
  105. package/toggle/toggle-option.js +1 -1
  106. package/toggle/toggle.js +1 -1
  107. package/toggle-check/toggle-check.component.js +1 -1
  108. package/toggle-check.component-DvoslSRr.js +119 -0
  109. package/toggle-check.js +1 -1
  110. package/toggle-check.pure.js +1 -1
  111. package/{toggle-option.component-Bw-GXUQK.js → toggle-option.component-pX3tNwjE.js} +5 -7
  112. package/{toggle.component-BPpsMMPG.js → toggle.component-Cwc-TJ-a.js} +6 -10
  113. package/toggle.js +2 -2
  114. package/toggle.pure.js +2 -2
  115. package/tooltip/tooltip.component.js +1 -1
  116. package/{tooltip.component-BY9mV5Sw.js → tooltip.component-B3XLLpLg.js} +1 -1
  117. package/tooltip.js +1 -1
  118. package/tooltip.pure.js +1 -1
  119. package/development/step-label.component-CJFPHIZa.js +0 -131
  120. package/development/timetable-form-details.component-C8awcdP5.js +0 -26
  121. package/development/timetable-form-field.component-BI24VjkC.js +0 -44
  122. package/development/timetable-form.component-CUG86CSN.js +0 -27
  123. package/development/timetable-occupancy.component-D_PXXvI9.js +0 -124
  124. package/development/toggle-check.component-BG4w_sE8.js +0 -159
  125. package/development/toggle-option.component-DRodFwFk.js +0 -169
  126. package/development/toggle.component-BFYLRN8o.js +0 -254
  127. package/development/tooltip.component-DzSd9VjW.js +0 -378
  128. package/timetable-form-details.component-CBZ7QSAx.js +0 -16
  129. package/timetable-form-field.component-BKxQQqt7.js +0 -32
  130. package/toggle-check.component-B6Ww5pLD.js +0 -119
@@ -1,254 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { html, isServer, unsafeCSS } from "lit";
3
- import { property } from "lit/decorators.js";
4
- import { SbbElement } from "./core/base-elements.js";
5
- import { forceType } from "./core/decorators.js";
6
- import { isLean } from "./core/dom.js";
7
- import { SbbDisabledMixin, SbbFormAssociatedMixin } from "./core/mixins.js";
8
- import { boxSizingStyles } from "./core/styles.js";
9
- import { interactivityChecker } from "./core/a11y.js";
10
- //#region src/elements/toggle/toggle/toggle.scss?inline
11
- var toggle_default = ":host {\n display: block;\n width: fit-content;\n border-radius: var(--sbb-toggle-border-radius);\n --sbb-toggle-width: fit-content;\n --sbb-toggle-min-width: calc(\n var(--sbb-toggle-padding-inline) * 4 + var(--sbb-size-icon-ui-small)\n );\n --sbb-toggle-selected-option-border-width: var(--sbb-border-width-1x);\n --sbb-toggle-selected-option-border-style: solid;\n --sbb-toggle-selected-option-border-color: var(--sbb-border-color-5);\n --sbb-toggle-selected-option-background-color: var(--sbb-background-color-1);\n --sbb-toggle-background-inset: 0.125rem;\n --sbb-toggle-padding-inline: var(--sbb-spacing-responsive-xs);\n --sbb-toggle-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n --sbb-toggle-height: var(--sbb-size-element-m);\n --sbb-toggle-border-radius: var(--sbb-border-radius-infinity);\n --sbb-toggle-grid-template-columns: auto auto;\n}\n@media (forced-colors: active) {\n :host {\n --sbb-toggle-selected-option-border-color: Highlight;\n --sbb-toggle-selected-option-border-width: var(--sbb-border-width-2x);\n }\n}\n\n:host([even]) {\n width: 100%;\n --sbb-toggle-width: 100%;\n --sbb-toggle-grid-template-columns: 50% 50%;\n}\n\n:host(:disabled) {\n --sbb-toggle-selected-option-border-color: var(--sbb-color-graphite);\n --sbb-toggle-selected-option-border-color: light-dark(\n var(--sbb-color-graphite),\n var(--sbb-color-smoke)\n );\n --sbb-toggle-selected-option-border-style: dashed;\n}\n@media (forced-colors: active) {\n :host(:disabled) {\n --sbb-toggle-selected-option-border-style: solid;\n --sbb-toggle-selected-option-border-color: GrayText;\n }\n}\n\n:host([size=s]) {\n --sbb-toggle-padding-inline: var(--sbb-spacing-responsive-xxxs);\n --sbb-toggle-height: var(--sbb-size-element-xxs);\n}\n\n:host(:is(:not(:is(:state(initialized),[state--initialized])), :is(:state(disable-animation-on-resizing),[state--disable-animation-on-resizing]))) {\n --sbb-disable-animation-duration: 0s;\n}\n\n.sbb-toggle {\n --sbb-text-font-size: var(--sbb-text-font-size-m);\n font-family: var(--sbb-typo-font-family);\n font-weight: normal;\n line-height: var(--sbb-typo-line-height-text);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n font-size: var(--sbb-text-font-size);\n display: grid;\n grid-template-columns: var(--sbb-toggle-grid-template-columns);\n grid-template-areas: \"start end\";\n align-items: center;\n min-width: var(--sbb-toggle-min-width);\n width: var(--sbb-toggle-width);\n height: var(--sbb-toggle-height);\n max-width: 100%;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n border-radius: var(--sbb-toggle-border-radius);\n}\n.sbb-toggle::before {\n content: \"\";\n display: block;\n grid-area: start/start/end/end;\n margin-inline: var(--sbb-toggle-option-left, 0) var(--sbb-toggle-option-right, 0);\n background-color: var(--sbb-toggle-selected-option-background-color);\n border-radius: var(--sbb-toggle-border-radius);\n max-width: 100%;\n height: 100%;\n border: var(--sbb-toggle-selected-option-border-width) var(--sbb-toggle-selected-option-border-style) var(--sbb-toggle-selected-option-border-color);\n transition-duration: var(--sbb-toggle-animation-duration);\n transition-timing-function: ease;\n transition-property: margin-inline-start, margin-inline-end;\n}\n.sbb-toggle::after {\n content: \"\";\n grid-area: start/start/end/end;\n order: -1;\n background: var(--sbb-background-color-4);\n margin-inline: var(--sbb-toggle-background-inset);\n height: calc(100% - 2 * var(--sbb-toggle-background-inset));\n border-radius: var(--sbb-toggle-border-radius);\n}\n@media (forced-colors: active) {\n .sbb-toggle::after {\n border: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n\n::slotted(sbb-toggle-option:first-of-type) {\n grid-area: start;\n}\n\n::slotted(sbb-toggle-option:last-of-type) {\n grid-area: end;\n}";
12
- //#endregion
13
- //#region src/elements/toggle/toggle/toggle.component.ts
14
- /**
15
- * It can be used as a container for two `sbb-toggle-option`, acting as a toggle button.
16
- *
17
- * @slot - Use the unnamed slot to add `<sbb-toggle-option>` elements to the toggle.
18
- * @overrideType value - (T = string) | null
19
- */
20
- var SbbToggleElement = (() => {
21
- let _classSuper = SbbDisabledMixin(SbbFormAssociatedMixin(SbbElement));
22
- let _instanceExtraInitializers = [];
23
- let _even_decorators;
24
- let _even_initializers = [];
25
- let _even_extraInitializers = [];
26
- let _size_decorators;
27
- let _size_initializers = [];
28
- let _size_extraInitializers = [];
29
- let _set_value_decorators;
30
- return class SbbToggleElement extends _classSuper {
31
- static {
32
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
33
- _even_decorators = [forceType(), property({
34
- reflect: true,
35
- type: Boolean
36
- })];
37
- _size_decorators = [property({ reflect: true })];
38
- _set_value_decorators = [property()];
39
- __esDecorate(this, null, _even_decorators, {
40
- kind: "accessor",
41
- name: "even",
42
- static: false,
43
- private: false,
44
- access: {
45
- has: (obj) => "even" in obj,
46
- get: (obj) => obj.even,
47
- set: (obj, value) => {
48
- obj.even = value;
49
- }
50
- },
51
- metadata: _metadata
52
- }, _even_initializers, _even_extraInitializers);
53
- __esDecorate(this, null, _size_decorators, {
54
- kind: "accessor",
55
- name: "size",
56
- static: false,
57
- private: false,
58
- access: {
59
- has: (obj) => "size" in obj,
60
- get: (obj) => obj.size,
61
- set: (obj, value) => {
62
- obj.size = value;
63
- }
64
- },
65
- metadata: _metadata
66
- }, _size_initializers, _size_extraInitializers);
67
- __esDecorate(this, null, _set_value_decorators, {
68
- kind: "setter",
69
- name: "value",
70
- static: false,
71
- private: false,
72
- access: {
73
- has: (obj) => "value" in obj,
74
- set: (obj, value) => {
75
- obj.value = value;
76
- }
77
- },
78
- metadata: _metadata
79
- }, null, _instanceExtraInitializers);
80
- if (_metadata) Object.defineProperty(this, Symbol.metadata, {
81
- enumerable: true,
82
- configurable: true,
83
- writable: true,
84
- value: _metadata
85
- });
86
- }
87
- static {
88
- this.elementName = "sbb-toggle";
89
- }
90
- static {
91
- this.role = "radiogroup";
92
- }
93
- static {
94
- this.styles = [boxSizingStyles, unsafeCSS(toggle_default)];
95
- }
96
- static {
97
- this.events = { change: "change" };
98
- }
99
- #even_accessor_storage;
100
- /**
101
- * If true, set the width of the component fixed; if false,
102
- * the width is dynamic based on the label of the sbb-toggle-option.
103
- */
104
- get even() {
105
- return this.#even_accessor_storage;
106
- }
107
- set even(value) {
108
- this.#even_accessor_storage = value;
109
- }
110
- #size_accessor_storage;
111
- /**
112
- * Size variant, either m or s.
113
- * @default 'm' / 's' (lean)
114
- */
115
- get size() {
116
- return this.#size_accessor_storage;
117
- }
118
- set size(value) {
119
- this.#size_accessor_storage = value;
120
- }
121
- /**
122
- * The value of the toggle. It needs to be mutable since it is updated whenever
123
- * a new option is selected (see the `onToggleOptionSelect()` method).
124
- */
125
- set value(value) {
126
- if (isServer || !this.hasUpdated) this._fallbackValue = value;
127
- else this._valueChanged(value);
128
- }
129
- get value() {
130
- return isServer ? this._fallbackValue ?? null : this.options.find((o) => o.checked)?.value ?? this.options[0]?.value ?? null;
131
- }
132
- /** The child instances of sbb-toggle-option as an array. */
133
- get options() {
134
- return Array.from(this.querySelectorAll?.("sbb-toggle-option") ?? []);
135
- }
136
- constructor() {
137
- super();
138
- this.#even_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _even_initializers, false));
139
- this.#size_accessor_storage = (__runInitializers(this, _even_extraInitializers), __runInitializers(this, _size_initializers, isLean() ? "s" : "m"));
140
- this._fallbackValue = (__runInitializers(this, _size_extraInitializers), null);
141
- this.addEventListener?.("input", () => this._handleInput(), { passive: true });
142
- this.addEventListener?.("keydown", (e) => this._handleKeyDown(e));
143
- }
144
- willUpdate(changedProperties) {
145
- super.willUpdate(changedProperties);
146
- if (changedProperties.has("disabled") || changedProperties.has("formDisabled")) this._updateDisabled();
147
- if (!this.hasUpdated) this._valueChanged(this._fallbackValue);
148
- }
149
- /**
150
- * Called whenever the value changes, both programmatically or by user interaction.
151
- * @internal
152
- */
153
- statusChanged() {
154
- this.updateFormValue();
155
- this.updatePillPosition();
156
- }
157
- /**
158
- * Reset to the init value if present. Select the first option, otherwise.
159
- * @internal
160
- */
161
- formResetCallback() {
162
- this.value = this.hasAttribute("value") ? this.getAttribute("value") : null;
163
- }
164
- /**
165
- * @internal
166
- */
167
- formStateRestoreCallback(state, _reason) {
168
- if (typeof state === "string" || state == null) this.value = state ?? null;
169
- else if (state instanceof FormData) this._readFormData(state).then((data) => {
170
- this.value = data;
171
- });
172
- }
173
- async _readFormData(formData) {
174
- const data = formData.get(this.name);
175
- return data instanceof Blob ? JSON.parse(await data.text()) : data;
176
- }
177
- /** @internal */
178
- updatePillPosition(resizing = false) {
179
- const options = this.options;
180
- const toggleElement = this.shadowRoot?.querySelector(".sbb-toggle");
181
- if (options.length < 2 || !toggleElement || options.every((o) => !o.checked) || options.every((o) => !o.clientWidth)) return;
182
- this.toggleState("disable-animation-on-resizing", resizing);
183
- const firstOption = options[0];
184
- const isFirstChecked = firstOption.checked;
185
- const pillLeft = isFirstChecked ? "0px" : `${firstOption.clientWidth}px`;
186
- const pillRight = isFirstChecked ? `${toggleElement.clientWidth - firstOption.clientWidth}px` : "0px";
187
- if (pillRight === "0px" && pillLeft === "0px") return;
188
- this.style?.setProperty("--sbb-toggle-option-left", pillLeft);
189
- this.style?.setProperty("--sbb-toggle-option-right", pillRight);
190
- this.offsetWidth;
191
- this.internals.states.add("initialized");
192
- }
193
- _updateToggle() {
194
- this._valueChanged(this.value);
195
- this._updateDisabled();
196
- }
197
- _valueChanged(value) {
198
- const options = this.options;
199
- const selectedOption = options.find((o) => value === o.value) ?? options.find((o) => o.checked) ?? options[0];
200
- if (!selectedOption) return;
201
- selectedOption.checked = true;
202
- this.statusChanged();
203
- }
204
- _updateDisabled() {
205
- for (const toggleOption of this.options) toggleOption.disabled = this.disabled || this.formDisabled;
206
- }
207
- /**
208
- * Called on user interaction (click or keyboard)
209
- */
210
- _handleInput() {
211
- this.statusChanged();
212
- /**
213
- * The change event is fired when the user modifies the element's value.
214
- * Unlike the input event, the change event is not necessarily fired
215
- * for each alteration to an element's value.
216
- */
217
- this.dispatchEvent(new Event("change", { bubbles: true }));
218
- }
219
- _handleKeyDown(evt) {
220
- if (!this.options.filter((t) => !t.disabled && interactivityChecker.isVisible(t)) || evt.target !== this && evt.target.parentElement !== this) return;
221
- const options = this.options;
222
- const isRtl = this.matches(":dir(rtl)");
223
- const currentIndex = options.findIndex((option) => option.checked) ?? options[0];
224
- const availableOptions = options.slice(currentIndex + 1).concat(options.slice(0, currentIndex)).filter((o) => !o.disabled && interactivityChecker.isVisible(o));
225
- if (!isRtl ? evt.key === " " || evt.key === "ArrowRight" : evt.key === "ArrowLeft") {
226
- this._selectAndFocusOption(availableOptions[0]);
227
- evt.preventDefault();
228
- } else if (isRtl ? evt.key === " " || evt.key === "ArrowRight" : evt.key === "ArrowLeft") {
229
- this._selectAndFocusOption(availableOptions.at(-1));
230
- evt.preventDefault();
231
- }
232
- }
233
- _selectAndFocusOption(option) {
234
- if (!option || option.disabled || option.checked) return;
235
- option.checked = true;
236
- option.focus();
237
- option.dispatchEvent(new InputEvent("input", {
238
- bubbles: true,
239
- composed: true
240
- }));
241
- }
242
- render() {
243
- return html`
244
- <div class="sbb-toggle">
245
- <slot @slotchange=${this._updateToggle}></slot>
246
- </div>
247
- `;
248
- }
249
- };
250
- })();
251
- //#endregion
252
- export { SbbToggleElement as t };
253
-
254
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9nZ2xlLmNvbXBvbmVudC1CRllMUk44by5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvdG9nZ2xlL3RvZ2dsZS90b2dnbGUuc2Nzcz9pbmxpbmUiLCIuLi8uLi8uLi9zcmMvZWxlbWVudHMvdG9nZ2xlL3RvZ2dsZS90b2dnbGUuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJy4uLy4uL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5cbjpob3N0IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiBmaXQtY29udGVudDtcblxuICAvLyBCb3JkZXItcmFkaXVzIGlzIHVzZWQgZm9yIHRoZSBmb2N1cyBvdXRsaW5lIHdoaWNoIGlzIHRvZ2dsZWQgaW4gY29yZS5zY3NzLlxuICBib3JkZXItcmFkaXVzOiB2YXIoLS1zYmItdG9nZ2xlLWJvcmRlci1yYWRpdXMpO1xuXG4gIC0tc2JiLXRvZ2dsZS13aWR0aDogZml0LWNvbnRlbnQ7XG4gIC0tc2JiLXRvZ2dsZS1taW4td2lkdGg6IGNhbGMoXG4gICAgdmFyKC0tc2JiLXRvZ2dsZS1wYWRkaW5nLWlubGluZSkgKiA0ICsgdmFyKC0tc2JiLXNpemUtaWNvbi11aS1zbWFsbClcbiAgKTtcbiAgLS1zYmItdG9nZ2xlLXNlbGVjdGVkLW9wdGlvbi1ib3JkZXItd2lkdGg6IHZhcigtLXNiYi1ib3JkZXItd2lkdGgtMXgpO1xuICAtLXNiYi10b2dnbGUtc2VsZWN0ZWQtb3B0aW9uLWJvcmRlci1zdHlsZTogc29saWQ7XG4gIC0tc2JiLXRvZ2dsZS1zZWxlY3RlZC1vcHRpb24tYm9yZGVyLWNvbG9yOiB2YXIoLS1zYmItYm9yZGVyLWNvbG9yLTUpO1xuICAtLXNiYi10b2dnbGUtc2VsZWN0ZWQtb3B0aW9uLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTEpO1xuICAtLXNiYi10b2dnbGUtYmFja2dyb3VuZC1pbnNldDogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDIpfTtcbiAgLS1zYmItdG9nZ2xlLXBhZGRpbmctaW5saW5lOiB2YXIoLS1zYmItc3BhY2luZy1yZXNwb25zaXZlLXhzKTtcbiAgLS1zYmItdG9nZ2xlLWFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKFxuICAgIC0tc2JiLWRpc2FibGUtYW5pbWF0aW9uLWR1cmF0aW9uLFxuICAgIHZhcigtLXNiYi1hbmltYXRpb24tZHVyYXRpb24tNngpXG4gICk7XG4gIC0tc2JiLXRvZ2dsZS1oZWlnaHQ6IHZhcigtLXNiYi1zaXplLWVsZW1lbnQtbSk7XG4gIC0tc2JiLXRvZ2dsZS1ib3JkZXItcmFkaXVzOiB2YXIoLS1zYmItYm9yZGVyLXJhZGl1cy1pbmZpbml0eSk7XG4gIC0tc2JiLXRvZ2dsZS1ncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gYXV0bztcblxuICBAaW5jbHVkZSBzYmIuaWYtZm9yY2VkLWNvbG9ycyB7XG4gICAgLS1zYmItdG9nZ2xlLXNlbGVjdGVkLW9wdGlvbi1ib3JkZXItY29sb3I6IEhpZ2hsaWdodDtcbiAgICAtLXNiYi10b2dnbGUtc2VsZWN0ZWQtb3B0aW9uLWJvcmRlci13aWR0aDogdmFyKC0tc2JiLWJvcmRlci13aWR0aC0yeCk7XG4gIH1cbn1cblxuOmhvc3QoW2V2ZW5dKSB7XG4gIHdpZHRoOiAxMDAlO1xuXG4gIC0tc2JiLXRvZ2dsZS13aWR0aDogMTAwJTtcbiAgLS1zYmItdG9nZ2xlLWdyaWQtdGVtcGxhdGUtY29sdW1uczogNTAlIDUwJTtcbn1cblxuOmhvc3QoOmRpc2FibGVkKSB7XG4gIC0tc2JiLXRvZ2dsZS1zZWxlY3RlZC1vcHRpb24tYm9yZGVyLWNvbG9yOiBsaWdodC1kYXJrKFxuICAgIHZhcigtLXNiYi1jb2xvci1ncmFwaGl0ZSksXG4gICAgdmFyKC0tc2JiLWNvbG9yLXNtb2tlKVxuICApO1xuICAtLXNiYi10b2dnbGUtc2VsZWN0ZWQtb3B0aW9uLWJvcmRlci1zdHlsZTogZGFzaGVkO1xuXG4gIEBpbmNsdWRlIHNiYi5pZi1mb3JjZWQtY29sb3JzIHtcbiAgICAtLXNiYi10b2dnbGUtc2VsZWN0ZWQtb3B0aW9uLWJvcmRlci1zdHlsZTogc29saWQ7XG4gICAgLS1zYmItdG9nZ2xlLXNlbGVjdGVkLW9wdGlvbi1ib3JkZXItY29sb3I6IEdyYXlUZXh0O1xuICB9XG59XG5cbjpob3N0KFtzaXplPSdzJ10pIHtcbiAgLS1zYmItdG9nZ2xlLXBhZGRpbmctaW5saW5lOiB2YXIoLS1zYmItc3BhY2luZy1yZXNwb25zaXZlLXh4eHMpO1xuICAtLXNiYi10b2dnbGUtaGVpZ2h0OiB2YXIoLS1zYmItc2l6ZS1lbGVtZW50LXh4cyk7XG59XG5cbjpob3N0KDppcyg6bm90KDpzdGF0ZShpbml0aWFsaXplZCkpLCA6c3RhdGUoZGlzYWJsZS1hbmltYXRpb24tb24tcmVzaXppbmcpKSkge1xuICBAaW5jbHVkZSBzYmIuZGlzYWJsZS1hbmltYXRpb247XG59XG5cbi5zYmItdG9nZ2xlIHtcbiAgQGluY2x1ZGUgc2JiLnRleHQtbS0tcmVndWxhcjtcblxuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLXNiYi10b2dnbGUtZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zKTtcbiAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogJ3N0YXJ0IGVuZCc7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIG1pbi13aWR0aDogdmFyKC0tc2JiLXRvZ2dsZS1taW4td2lkdGgpO1xuICB3aWR0aDogdmFyKC0tc2JiLXRvZ2dsZS13aWR0aCk7XG4gIGhlaWdodDogdmFyKC0tc2JiLXRvZ2dsZS1oZWlnaHQpO1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIHVzZXItc2VsZWN0OiBub25lO1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1zYmItdG9nZ2xlLWJvcmRlci1yYWRpdXMpO1xuXG4gIC8vIFdoaXRlIHBpbGwgb2Ygc2VsZWN0ZWQgdG9nZ2xlIG9wdGlvblxuICAmOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGdyaWQtYXJlYTogc3RhcnQgLyBzdGFydCAvIGVuZCAvIGVuZDtcbiAgICBtYXJnaW4taW5saW5lOiB2YXIoLS1zYmItdG9nZ2xlLW9wdGlvbi1sZWZ0LCAwKSB2YXIoLS1zYmItdG9nZ2xlLW9wdGlvbi1yaWdodCwgMCk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2JiLXRvZ2dsZS1zZWxlY3RlZC1vcHRpb24tYmFja2dyb3VuZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tc2JiLXRvZ2dsZS1ib3JkZXItcmFkaXVzKTtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJvcmRlcjogdmFyKC0tc2JiLXRvZ2dsZS1zZWxlY3RlZC1vcHRpb24tYm9yZGVyLXdpZHRoKVxuICAgICAgdmFyKC0tc2JiLXRvZ2dsZS1zZWxlY3RlZC1vcHRpb24tYm9yZGVyLXN0eWxlKSB2YXIoLS1zYmItdG9nZ2xlLXNlbGVjdGVkLW9wdGlvbi1ib3JkZXItY29sb3IpO1xuXG4gICAgdHJhbnNpdGlvbjoge1xuICAgICAgZHVyYXRpb246IHZhcigtLXNiYi10b2dnbGUtYW5pbWF0aW9uLWR1cmF0aW9uKTtcbiAgICAgIHRpbWluZy1mdW5jdGlvbjogZWFzZTtcbiAgICAgIHByb3BlcnR5OiBtYXJnaW4taW5saW5lLXN0YXJ0LCBtYXJnaW4taW5saW5lLWVuZDtcbiAgICB9XG4gIH1cblxuICAvLyBCYWNrZ3JvdW5kXG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBncmlkLWFyZWE6IHN0YXJ0IC8gc3RhcnQgLyBlbmQgLyBlbmQ7XG4gICAgb3JkZXI6IC0xO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTQpO1xuICAgIG1hcmdpbi1pbmxpbmU6IHZhcigtLXNiYi10b2dnbGUtYmFja2dyb3VuZC1pbnNldCk7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAyICogdmFyKC0tc2JiLXRvZ2dsZS1iYWNrZ3JvdW5kLWluc2V0KSk7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tc2JiLXRvZ2dsZS1ib3JkZXItcmFkaXVzKTtcblxuICAgIEBpbmNsdWRlIHNiYi5pZi1mb3JjZWQtY29sb3JzIHtcbiAgICAgIGJvcmRlcjogdmFyKC0tc2JiLWJvcmRlci13aWR0aC0xeCkgc29saWQgQ2FudmFzVGV4dDtcbiAgICB9XG4gIH1cbn1cblxuOjpzbG90dGVkKHNiYi10b2dnbGUtb3B0aW9uOmZpcnN0LW9mLXR5cGUpIHtcbiAgZ3JpZC1hcmVhOiBzdGFydDtcbn1cblxuOjpzbG90dGVkKHNiYi10b2dnbGUtb3B0aW9uOmxhc3Qtb2YtdHlwZSkge1xuICBncmlkLWFyZWE6IGVuZDtcbn1cbiIsImltcG9ydCB7XG4gIHR5cGUgQ1NTUmVzdWx0R3JvdXAsXG4gIGh0bWwsXG4gIGlzU2VydmVyLFxuICB0eXBlIFByb3BlcnR5VmFsdWVzLFxuICB0eXBlIFRlbXBsYXRlUmVzdWx0LFxuICB1bnNhZmVDU1MsXG59IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgaW50ZXJhY3Rpdml0eUNoZWNrZXIgfSBmcm9tICcuLi8uLi9jb3JlL2ExMXkudHMnO1xuaW1wb3J0IHsgU2JiRWxlbWVudCB9IGZyb20gJy4uLy4uL2NvcmUvYmFzZS1lbGVtZW50cy50cyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICcuLi8uLi9jb3JlL2RlY29yYXRvcnMudHMnO1xuaW1wb3J0IHsgaXNMZWFuIH0gZnJvbSAnLi4vLi4vY29yZS9kb20udHMnO1xuaW1wb3J0IHtcbiAgdHlwZSBGb3JtUmVzdG9yZVJlYXNvbixcbiAgdHlwZSBGb3JtUmVzdG9yZVN0YXRlLFxuICBTYmJEaXNhYmxlZE1peGluLFxuICBTYmJGb3JtQXNzb2NpYXRlZE1peGluLFxufSBmcm9tICcuLi8uLi9jb3JlL21peGlucy50cyc7XG5pbXBvcnQgeyBib3hTaXppbmdTdHlsZXMgfSBmcm9tICcuLi8uLi9jb3JlL3N0eWxlcy50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYlRvZ2dsZU9wdGlvbkVsZW1lbnQgfSBmcm9tICcuLi90b2dnbGUtb3B0aW9uL3RvZ2dsZS1vcHRpb24uY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vdG9nZ2xlLnNjc3M/aW5saW5lJztcblxuLyoqXG4gKiBJdCBjYW4gYmUgdXNlZCBhcyBhIGNvbnRhaW5lciBmb3IgdHdvIGBzYmItdG9nZ2xlLW9wdGlvbmAsIGFjdGluZyBhcyBhIHRvZ2dsZSBidXR0b24uXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBhZGQgYDxzYmItdG9nZ2xlLW9wdGlvbj5gIGVsZW1lbnRzIHRvIHRoZSB0b2dnbGUuXG4gKiBAb3ZlcnJpZGVUeXBlIHZhbHVlIC0gKFQgPSBzdHJpbmcpIHwgbnVsbFxuICovXG5leHBvcnQgY2xhc3MgU2JiVG9nZ2xlRWxlbWVudDxUID0gc3RyaW5nPiBleHRlbmRzIFNiYkRpc2FibGVkTWl4aW4oXG4gIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4oU2JiRWxlbWVudCksXG4pIHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBlbGVtZW50TmFtZTogc3RyaW5nID0gJ3NiYi10b2dnbGUnO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IHJvbGUgPSAncmFkaW9ncm91cCc7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFtib3hTaXppbmdTdHlsZXMsIHVuc2FmZUNTUyhzdHlsZSldO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGV2ZW50cyA9IHtcbiAgICBjaGFuZ2U6ICdjaGFuZ2UnLFxuICB9IGFzIGNvbnN0O1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBzZXQgdGhlIHdpZHRoIG9mIHRoZSBjb21wb25lbnQgZml4ZWQ7IGlmIGZhbHNlLFxuICAgKiB0aGUgd2lkdGggaXMgZHluYW1pYyBiYXNlZCBvbiB0aGUgbGFiZWwgb2YgdGhlIHNiYi10b2dnbGUtb3B0aW9uLlxuICAgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGV2ZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2l6ZSB2YXJpYW50LCBlaXRoZXIgbSBvciBzLlxuICAgKiBAZGVmYXVsdCAnbScgLyAncycgKGxlYW4pXG4gICAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlIH0pIHB1YmxpYyBhY2Nlc3NvciBzaXplOiAncycgfCAnbScgPSBpc0xlYW4oKSA/ICdzJyA6ICdtJztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSB0b2dnbGUuIEl0IG5lZWRzIHRvIGJlIG11dGFibGUgc2luY2UgaXQgaXMgdXBkYXRlZCB3aGVuZXZlclxuICAgKiBhIG5ldyBvcHRpb24gaXMgc2VsZWN0ZWQgKHNlZSB0aGUgYG9uVG9nZ2xlT3B0aW9uU2VsZWN0KClgIG1ldGhvZCkuXG4gICAqL1xuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBUIHwgbnVsbCkge1xuICAgIGlmIChpc1NlcnZlciB8fCAhdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICB0aGlzLl9mYWxsYmFja1ZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlQ2hhbmdlZCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogVCB8IG51bGwge1xuICAgIHJldHVybiBpc1NlcnZlclxuICAgICAgPyAodGhpcy5fZmFsbGJhY2tWYWx1ZSA/PyBudWxsKVxuICAgICAgOiAodGhpcy5vcHRpb25zLmZpbmQoKG8pID0+IG8uY2hlY2tlZCk/LnZhbHVlID8/IHRoaXMub3B0aW9uc1swXT8udmFsdWUgPz8gbnVsbCk7XG4gIH1cbiAgcHJpdmF0ZSBfZmFsbGJhY2tWYWx1ZTogVCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUaGUgY2hpbGQgaW5zdGFuY2VzIG9mIHNiYi10b2dnbGUtb3B0aW9uIGFzIGFuIGFycmF5LiAqL1xuICBwdWJsaWMgZ2V0IG9wdGlvbnMoKTogU2JiVG9nZ2xlT3B0aW9uRWxlbWVudDxUPltdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbD8uPFNiYlRvZ2dsZU9wdGlvbkVsZW1lbnQ8VD4+KCdzYmItdG9nZ2xlLW9wdGlvbicpID8/IFtdLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/LignaW5wdXQnLCAoKSA9PiB0aGlzLl9oYW5kbGVJbnB1dCgpLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2tleWRvd24nLCAoZSkgPT4gdGhpcy5faGFuZGxlS2V5RG93bihlKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdkaXNhYmxlZCcpIHx8IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnZm9ybURpc2FibGVkJykpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZURpc2FibGVkKCk7XG4gICAgfVxuXG4gICAgLy8gQmVmb3JlIHRoZSBmaXJzdCB1cGRhdGUsIGluaXQgd2l0aCB0aGUgZmFsbGJhY2sgdmFsdWUuXG4gICAgLy8gVGhlIHdpbGxVcGRhdGUgaG9vayBpcyBzYWZlciB0aGFuIHRoZSAndmFsdWUnIHNldHRlci5cbiAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5fdmFsdWVDaGFuZ2VkKHRoaXMuX2ZhbGxiYWNrVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlIHZhbHVlIGNoYW5nZXMsIGJvdGggcHJvZ3JhbW1hdGljYWxseSBvciBieSB1c2VyIGludGVyYWN0aW9uLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBzdGF0dXNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlRm9ybVZhbHVlKCk7XG4gICAgdGhpcy51cGRhdGVQaWxsUG9zaXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0byB0aGUgaW5pdCB2YWx1ZSBpZiBwcmVzZW50LiBTZWxlY3QgdGhlIGZpcnN0IG9wdGlvbiwgb3RoZXJ3aXNlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gKHRoaXMuaGFzQXR0cmlidXRlKCd2YWx1ZScpID8gdGhpcy5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykgOiBudWxsKSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGZvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjayhcbiAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgX3JlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24sXG4gICk6IHZvaWQge1xuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09ICdzdHJpbmcnIHx8IHN0YXRlID09IG51bGwpIHtcbiAgICAgIHRoaXMudmFsdWUgPSAoc3RhdGUgYXMgVCkgPz8gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHN0YXRlIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgIHRoaXMuX3JlYWRGb3JtRGF0YShzdGF0ZSkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICB0aGlzLnZhbHVlID0gZGF0YTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlYWRGb3JtRGF0YShmb3JtRGF0YTogRm9ybURhdGEpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBkYXRhID0gZm9ybURhdGEuZ2V0KHRoaXMubmFtZSk7XG4gICAgcmV0dXJuIGRhdGEgaW5zdGFuY2VvZiBCbG9iID8gSlNPTi5wYXJzZShhd2FpdCBkYXRhLnRleHQoKSkgOiAoZGF0YSBhcyBUKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIHVwZGF0ZVBpbGxQb3NpdGlvbihyZXNpemluZyA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB0b2dnbGVFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PignLnNiYi10b2dnbGUnKTtcblxuICAgIGlmIChcbiAgICAgIG9wdGlvbnMubGVuZ3RoIDwgMiB8fFxuICAgICAgIXRvZ2dsZUVsZW1lbnQgfHxcbiAgICAgIG9wdGlvbnMuZXZlcnkoKG8pID0+ICFvLmNoZWNrZWQpIHx8XG4gICAgICBvcHRpb25zLmV2ZXJ5KChvKSA9PiAhby5jbGllbnRXaWR0aClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnRvZ2dsZVN0YXRlKCdkaXNhYmxlLWFuaW1hdGlvbi1vbi1yZXNpemluZycsIHJlc2l6aW5nKTtcblxuICAgIGNvbnN0IGZpcnN0T3B0aW9uID0gb3B0aW9uc1swXTtcbiAgICBjb25zdCBpc0ZpcnN0Q2hlY2tlZCA9IGZpcnN0T3B0aW9uLmNoZWNrZWQ7XG4gICAgY29uc3QgcGlsbExlZnQgPSBpc0ZpcnN0Q2hlY2tlZCA/ICcwcHgnIDogYCR7Zmlyc3RPcHRpb24uY2xpZW50V2lkdGh9cHhgO1xuICAgIGNvbnN0IHBpbGxSaWdodCA9IGlzRmlyc3RDaGVja2VkXG4gICAgICA/IGAke3RvZ2dsZUVsZW1lbnQuY2xpZW50V2lkdGggLSBmaXJzdE9wdGlvbi5jbGllbnRXaWR0aH1weGBcbiAgICAgIDogJzBweCc7XG5cbiAgICBpZiAocGlsbFJpZ2h0ID09PSAnMHB4JyAmJiBwaWxsTGVmdCA9PT0gJzBweCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItdG9nZ2xlLW9wdGlvbi1sZWZ0JywgcGlsbExlZnQpO1xuICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi10b2dnbGUtb3B0aW9uLXJpZ2h0JywgcGlsbFJpZ2h0KTtcblxuICAgIC8vIFRyaWdnZXJzIGEgbGF5b3V0IHJlZmxvdyB3aGljaCBpcyBuZWVkZWQgdG8gYXZvaWQgYW5pbWF0aW9uIGdsaXRjaGVzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgdGhpcy5vZmZzZXRXaWR0aDtcblxuICAgIC8vIEluIG9yZGVyIHRvIGF2b2lkIGEgdHJhbnNpdGlvbiBnbGl0Y2gsIHdlIGhhdmUgdG8ga25vdyB3aGVuIHRoZSBmaXJzdCB2YWx1ZXMgd2VyZSBzZXQuXG4gICAgdGhpcy5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnaW5pdGlhbGl6ZWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLl92YWx1ZUNoYW5nZWQodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5fdXBkYXRlRGlzYWJsZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ZhbHVlQ2hhbmdlZCh2YWx1ZTogVCB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPVxuICAgICAgb3B0aW9ucy5maW5kKChvKSA9PiB2YWx1ZSA9PT0gby52YWx1ZSkgPz8gb3B0aW9ucy5maW5kKChvKSA9PiBvLmNoZWNrZWQpID8/IG9wdGlvbnNbMF07XG5cbiAgICBpZiAoIXNlbGVjdGVkT3B0aW9uKSB7XG4gICAgICBpZiAoaW1wb3J0Lm1ldGEuZW52LkRFViAmJiAhaXNTZXJ2ZXIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBzYmItdG9nZ2xlOiBObyBhdmFpbGFibGUgb3B0aW9ucyEgKCR7dGhpcy5pZCB8fCAnTm8gaWQnfSlgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2VsZWN0ZWRPcHRpb24uY2hlY2tlZCA9IHRydWU7XG4gICAgdGhpcy5zdGF0dXNDaGFuZ2VkKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVEaXNhYmxlZCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHRvZ2dsZU9wdGlvbiBvZiB0aGlzLm9wdGlvbnMpIHtcbiAgICAgIHRvZ2dsZU9wdGlvbi5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5mb3JtRGlzYWJsZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbiB1c2VyIGludGVyYWN0aW9uIChjbGljayBvciBrZXlib2FyZClcbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZUlucHV0KCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdHVzQ2hhbmdlZCgpO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGFuZ2UgZXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgdXNlciBtb2RpZmllcyB0aGUgZWxlbWVudCdzIHZhbHVlLlxuICAgICAqIFVubGlrZSB0aGUgaW5wdXQgZXZlbnQsIHRoZSBjaGFuZ2UgZXZlbnQgaXMgbm90IG5lY2Vzc2FyaWx5IGZpcmVkXG4gICAgICogZm9yIGVhY2ggYWx0ZXJhdGlvbiB0byBhbiBlbGVtZW50J3MgdmFsdWUuXG4gICAgICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUtleURvd24oZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZW5hYmxlZFRvZ2dsZU9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuZmlsdGVyKFxuICAgICAgKHQpID0+ICF0LmRpc2FibGVkICYmIGludGVyYWN0aXZpdHlDaGVja2VyLmlzVmlzaWJsZSh0KSxcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgIWVuYWJsZWRUb2dnbGVPcHRpb25zIHx8XG4gICAgICAvLyBkb24ndCB0cmFwIG5lc3RlZCBoYW5kbGluZ1xuICAgICAgKChldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSAhPT0gdGhpcyAmJiAoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCkucGFyZW50RWxlbWVudCAhPT0gdGhpcylcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IGlzUnRsID0gdGhpcy5tYXRjaGVzKCc6ZGlyKHJ0bCknKTtcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSBvcHRpb25zLmZpbmRJbmRleCgob3B0aW9uKSA9PiBvcHRpb24uY2hlY2tlZCkgPz8gb3B0aW9uc1swXTtcbiAgICBjb25zdCBhdmFpbGFibGVPcHRpb25zID0gb3B0aW9uc1xuICAgICAgLnNsaWNlKGN1cnJlbnRJbmRleCArIDEpXG4gICAgICAuY29uY2F0KG9wdGlvbnMuc2xpY2UoMCwgY3VycmVudEluZGV4KSlcbiAgICAgIC5maWx0ZXIoKG8pID0+ICFvLmRpc2FibGVkICYmIGludGVyYWN0aXZpdHlDaGVja2VyLmlzVmlzaWJsZShvKSk7XG4gICAgaWYgKCFpc1J0bCA/IGV2dC5rZXkgPT09ICcgJyB8fCBldnQua2V5ID09PSAnQXJyb3dSaWdodCcgOiBldnQua2V5ID09PSAnQXJyb3dMZWZ0Jykge1xuICAgICAgdGhpcy5fc2VsZWN0QW5kRm9jdXNPcHRpb24oYXZhaWxhYmxlT3B0aW9uc1swXSk7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9IGVsc2UgaWYgKGlzUnRsID8gZXZ0LmtleSA9PT0gJyAnIHx8IGV2dC5rZXkgPT09ICdBcnJvd1JpZ2h0JyA6IGV2dC5rZXkgPT09ICdBcnJvd0xlZnQnKSB7XG4gICAgICB0aGlzLl9zZWxlY3RBbmRGb2N1c09wdGlvbihhdmFpbGFibGVPcHRpb25zLmF0KC0xKSk7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RBbmRGb2N1c09wdGlvbihvcHRpb246IFNiYlRvZ2dsZU9wdGlvbkVsZW1lbnQ8VD4gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIW9wdGlvbiB8fCBvcHRpb24uZGlzYWJsZWQgfHwgb3B0aW9uLmNoZWNrZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb3B0aW9uLmNoZWNrZWQgPSB0cnVlO1xuICAgIG9wdGlvbi5mb2N1cygpO1xuICAgIG9wdGlvbi5kaXNwYXRjaEV2ZW50KG5ldyBJbnB1dEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXRvZ2dsZVwiPlxuICAgICAgICA8c2xvdCBAc2xvdGNoYW5nZT0ke3RoaXMuX3VwZGF0ZVRvZ2dsZX0+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXRvZ2dsZSc6IFNiYlRvZ2dsZUVsZW1lbnQ7XG4gIH1cbn1cbiJdLCJt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