@fundamental-ngx/btp 0.46.0-rc.100

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 (124) hide show
  1. package/README.md +7 -0
  2. package/esm2022/fundamental-ngx-btp.mjs +5 -0
  3. package/esm2022/index.mjs +3 -0
  4. package/esm2022/navigation/directives/navigation-home.directive.mjs +19 -0
  5. package/esm2022/navigation/directives/navigation-list-spacer.directive.mjs +24 -0
  6. package/esm2022/navigation/fundamental-ngx-btp-navigation.mjs +5 -0
  7. package/esm2022/navigation/index.mjs +11 -0
  8. package/esm2022/navigation/navigation-component.token.mjs +22 -0
  9. package/esm2022/navigation/navigation-content-end.component.mjs +62 -0
  10. package/esm2022/navigation/navigation-content-start.component.mjs +207 -0
  11. package/esm2022/navigation/navigation-content.token.mjs +3 -0
  12. package/esm2022/navigation/navigation-link.component.mjs +188 -0
  13. package/esm2022/navigation/navigation-list/navigation-list-item.component.mjs +423 -0
  14. package/esm2022/navigation/navigation-list/navigation-list-overflow-item.component.mjs +57 -0
  15. package/esm2022/navigation/navigation-list/navigation-list.component.mjs +125 -0
  16. package/esm2022/navigation/navigation-list-component.token.mjs +3 -0
  17. package/esm2022/navigation/navigation-list-item-component.token.mjs +90 -0
  18. package/esm2022/navigation/navigation.component.mjs +251 -0
  19. package/esm2022/navigation/navigation.service.mjs +14 -0
  20. package/esm2022/navigation/navigation.types.mjs +2 -0
  21. package/esm2022/navigation-menu/fundamental-ngx-btp-navigation-menu.mjs +5 -0
  22. package/esm2022/navigation-menu/index.mjs +6 -0
  23. package/esm2022/navigation-menu/lib/navigation-menu-item.component.mjs +48 -0
  24. package/esm2022/navigation-menu/lib/navigation-menu-popover-control.directive.mjs +19 -0
  25. package/esm2022/navigation-menu/lib/navigation-menu-popover.component.mjs +38 -0
  26. package/esm2022/navigation-menu/lib/navigation-menu.component.mjs +13 -0
  27. package/esm2022/navigation-menu/lib/navigation-menu.module.mjs +17 -0
  28. package/esm2022/search-field/fundamental-ngx-btp-search-field.mjs +5 -0
  29. package/esm2022/search-field/index.mjs +2 -0
  30. package/esm2022/search-field/search-field.component.mjs +62 -0
  31. package/esm2022/shared/fundamental-ngx-btp-shared.mjs +5 -0
  32. package/esm2022/shared/index.mjs +2 -0
  33. package/esm2022/tool-header/components/tool-header/tool-header.component.mjs +227 -0
  34. package/esm2022/tool-header/components/tool-header-product-switch.component.mjs +102 -0
  35. package/esm2022/tool-header/directives/tool-header-action.directive.mjs +43 -0
  36. package/esm2022/tool-header/directives/tool-header-actions.directive.mjs +63 -0
  37. package/esm2022/tool-header/directives/tool-header-auto-mode.directive.mjs +114 -0
  38. package/esm2022/tool-header/directives/tool-header-button.directive.mjs +51 -0
  39. package/esm2022/tool-header/directives/tool-header-element.directive.mjs +17 -0
  40. package/esm2022/tool-header/directives/tool-header-group.directive.mjs +26 -0
  41. package/esm2022/tool-header/directives/tool-header-logo.directive.mjs +19 -0
  42. package/esm2022/tool-header/directives/tool-header-user.directive.mjs +14 -0
  43. package/esm2022/tool-header/fundamental-ngx-btp-tool-header.mjs +5 -0
  44. package/esm2022/tool-header/index.mjs +10 -0
  45. package/esm2022/tool-header/tool-header-action-button.type.mjs +2 -0
  46. package/esm2022/tool-header/tool-header-component.class.mjs +74 -0
  47. package/esm2022/tool-header/tool-header-state.type.mjs +2 -0
  48. package/esm2022/tool-layout/directives/tool-layout-container.directive.mjs +17 -0
  49. package/esm2022/tool-layout/directives/tool-layout-content-container.directive.mjs +50 -0
  50. package/esm2022/tool-layout/directives/tool-layout-header-container.directive.mjs +17 -0
  51. package/esm2022/tool-layout/directives/tool-layout-navigation-container.directive.mjs +37 -0
  52. package/esm2022/tool-layout/fundamental-ngx-btp-tool-layout.mjs +5 -0
  53. package/esm2022/tool-layout/index.mjs +7 -0
  54. package/esm2022/tool-layout/tool-layout.component.mjs +43 -0
  55. package/esm2022/tool-layout/tool-layout.module.mjs +40 -0
  56. package/fesm2022/fundamental-ngx-btp-navigation-menu.mjs +130 -0
  57. package/fesm2022/fundamental-ngx-btp-navigation-menu.mjs.map +1 -0
  58. package/fesm2022/fundamental-ngx-btp-navigation.mjs +1409 -0
  59. package/fesm2022/fundamental-ngx-btp-navigation.mjs.map +1 -0
  60. package/fesm2022/fundamental-ngx-btp-search-field.mjs +69 -0
  61. package/fesm2022/fundamental-ngx-btp-search-field.mjs.map +1 -0
  62. package/fesm2022/fundamental-ngx-btp-shared.mjs +4 -0
  63. package/fesm2022/fundamental-ngx-btp-shared.mjs.map +1 -0
  64. package/fesm2022/fundamental-ngx-btp-tool-header.mjs +717 -0
  65. package/fesm2022/fundamental-ngx-btp-tool-header.mjs.map +1 -0
  66. package/fesm2022/fundamental-ngx-btp-tool-layout.mjs +194 -0
  67. package/fesm2022/fundamental-ngx-btp-tool-layout.mjs.map +1 -0
  68. package/fesm2022/fundamental-ngx-btp.mjs +7 -0
  69. package/fesm2022/fundamental-ngx-btp.mjs.map +1 -0
  70. package/fundamental-ngx-btp-v0.46.0-rc.100.tgz +0 -0
  71. package/index.d.ts +2 -0
  72. package/navigation/README.md +3 -0
  73. package/navigation/directives/navigation-home.directive.d.ts +10 -0
  74. package/navigation/directives/navigation-list-spacer.directive.d.ts +8 -0
  75. package/navigation/index.d.ts +10 -0
  76. package/navigation/navigation-component.token.d.ts +34 -0
  77. package/navigation/navigation-content-end.component.d.ts +23 -0
  78. package/navigation/navigation-content-start.component.d.ts +54 -0
  79. package/navigation/navigation-content.token.d.ts +11 -0
  80. package/navigation/navigation-link.component.d.ts +49 -0
  81. package/navigation/navigation-list/navigation-list-item.component.d.ts +142 -0
  82. package/navigation/navigation-list/navigation-list-overflow-item.component.d.ts +16 -0
  83. package/navigation/navigation-list/navigation-list.component.d.ts +60 -0
  84. package/navigation/navigation-list-component.token.d.ts +17 -0
  85. package/navigation/navigation-list-item-component.token.d.ts +68 -0
  86. package/navigation/navigation.component.d.ts +82 -0
  87. package/navigation/navigation.service.d.ts +8 -0
  88. package/navigation/navigation.types.d.ts +2 -0
  89. package/navigation-menu/README.md +3 -0
  90. package/navigation-menu/index.d.ts +5 -0
  91. package/navigation-menu/lib/navigation-menu-item.component.d.ts +13 -0
  92. package/navigation-menu/lib/navigation-menu-popover-control.directive.d.ts +10 -0
  93. package/navigation-menu/lib/navigation-menu-popover.component.d.ts +11 -0
  94. package/navigation-menu/lib/navigation-menu.component.d.ts +5 -0
  95. package/navigation-menu/lib/navigation-menu.module.d.ts +8 -0
  96. package/package.json +63 -0
  97. package/search-field/README.md +3 -0
  98. package/search-field/index.d.ts +1 -0
  99. package/search-field/search-field.component.d.ts +34 -0
  100. package/shared/README.md +3 -0
  101. package/shared/index.d.ts +1 -0
  102. package/tool-header/README.md +3 -0
  103. package/tool-header/components/tool-header/tool-header.component.d.ts +91 -0
  104. package/tool-header/components/tool-header-product-switch.component.d.ts +11 -0
  105. package/tool-header/directives/tool-header-action.directive.d.ts +35 -0
  106. package/tool-header/directives/tool-header-actions.directive.d.ts +27 -0
  107. package/tool-header/directives/tool-header-auto-mode.directive.d.ts +68 -0
  108. package/tool-header/directives/tool-header-button.directive.d.ts +22 -0
  109. package/tool-header/directives/tool-header-element.directive.d.ts +5 -0
  110. package/tool-header/directives/tool-header-group.directive.d.ts +12 -0
  111. package/tool-header/directives/tool-header-logo.directive.d.ts +5 -0
  112. package/tool-header/directives/tool-header-user.directive.d.ts +5 -0
  113. package/tool-header/index.d.ts +9 -0
  114. package/tool-header/tool-header-action-button.type.d.ts +10 -0
  115. package/tool-header/tool-header-component.class.d.ts +20 -0
  116. package/tool-header/tool-header-state.type.d.ts +14 -0
  117. package/tool-layout/README.md +3 -0
  118. package/tool-layout/directives/tool-layout-container.directive.d.ts +5 -0
  119. package/tool-layout/directives/tool-layout-content-container.directive.d.ts +29 -0
  120. package/tool-layout/directives/tool-layout-header-container.directive.d.ts +5 -0
  121. package/tool-layout/directives/tool-layout-navigation-container.directive.d.ts +13 -0
  122. package/tool-layout/index.d.ts +6 -0
  123. package/tool-layout/tool-layout.component.d.ts +27 -0
  124. package/tool-layout/tool-layout.module.d.ts +11 -0
@@ -0,0 +1,423 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { DOWN_ARROW, LEFT_ARROW, RIGHT_ARROW, UP_ARROW } from '@angular/cdk/keycodes';
3
+ import { DomPortal } from '@angular/cdk/portal';
4
+ import { AsyncPipe, NgIf, NgTemplateOutlet } from '@angular/common';
5
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, ElementRef, HostListener, Injector, Input, QueryList, TemplateRef, ViewChild, ViewEncapsulation, computed, effect, inject, signal } from '@angular/core';
6
+ import { toSignal } from '@angular/core/rxjs-interop';
7
+ import { RouterLink, RouterLinkActive } from '@angular/router';
8
+ import { KeyUtil, TabbableElementService, applyCssClass } from '@fundamental-ngx/cdk/utils';
9
+ import { ButtonComponent } from '@fundamental-ngx/core/button';
10
+ import { IconComponent } from '@fundamental-ngx/core/icon';
11
+ import { PopoverComponent, PopoverControlComponent, PopoverService } from '@fundamental-ngx/core/popover';
12
+ import { FdbNavigationComponent } from '../navigation-component.token';
13
+ import { NavigationLinkComponent } from '../navigation-link.component';
14
+ import { FdbNavigationListComponent } from '../navigation-list-component.token';
15
+ import { FdbNavigationListItemComponent } from '../navigation-list-item-component.token';
16
+ import * as i0 from "@angular/core";
17
+ export class NavigationListItemComponent extends FdbNavigationListItemComponent {
18
+ /** @hidden */
19
+ set group(group) {
20
+ this.isGroup.set(group);
21
+ }
22
+ /** @hidden */
23
+ set _expanded(expanded) {
24
+ this.expanded.set(expanded);
25
+ }
26
+ /** @hidden */
27
+ set _navigationListComponent(navigationListComponent) {
28
+ this.childNavigationListComponent.set(navigationListComponent);
29
+ }
30
+ /** @hidden */
31
+ set _routerLinkActive(routerLinkActive) {
32
+ this.routerLinkActive.set(routerLinkActive);
33
+ }
34
+ /** @hidden */
35
+ set _routerLink(routerLink) {
36
+ this.routerLink.set(routerLink);
37
+ }
38
+ /** @hidden */
39
+ set _childrenTemplate(templateRef) {
40
+ this.childrenTemplate.set(templateRef);
41
+ }
42
+ /**
43
+ * Used in attribute only. For actual calculation of level of nesting use `normalizedLevel`.
44
+ */
45
+ get level() {
46
+ return this.parentNavigationListComponent.level;
47
+ }
48
+ /** @hidden */
49
+ constructor() {
50
+ super();
51
+ /** @hidden */
52
+ this.alwaysFocusable = false;
53
+ /** @hidden */
54
+ this.injector = inject(Injector);
55
+ /** @hidden */
56
+ this.elementRef = inject(ElementRef);
57
+ /** @hidden */
58
+ this.parentListItemComponent = inject(FdbNavigationListItemComponent, { optional: true, skipSelf: true });
59
+ /** @hidden */
60
+ this.noArrow = false;
61
+ /** @hidden */
62
+ this.additionalBodyClass = 'fd-navigation__list-container';
63
+ /** @hidden */
64
+ this.routerLink = signal(null);
65
+ /** @hidden */
66
+ this.routerLinkActive = signal(null);
67
+ /** @hidden */
68
+ this.isRouterLinkActive = computed(() => {
69
+ const routerLinkActive = this.routerLinkActive();
70
+ if (routerLinkActive) {
71
+ return toSignal(routerLinkActive.isActiveChange, {
72
+ initialValue: routerLinkActive.isActive,
73
+ injector: this.injector
74
+ })();
75
+ }
76
+ return false;
77
+ });
78
+ /** @hidden */
79
+ this.childNavigationListComponent = signal(null);
80
+ /** @hidden */
81
+ this.expanded = signal(false);
82
+ /** @hidden */
83
+ this.fullPathExpanded = computed(() => (this.parentListItemComponent ? this.parentListItemComponent.expanded() : true) && this.expanded());
84
+ /** @hidden */
85
+ this.isGroup = signal(false);
86
+ /** @hidden */
87
+ this.childrenTemplate = signal(null);
88
+ /** @hidden */
89
+ this.childrenActive = signal(false);
90
+ /** @hidden */
91
+ this.inPortal = computed(() => this.parentInPortal() || this._selfInPortal());
92
+ /** @hidden */
93
+ this.parentInPortal = computed(() => this.parentListItemComponent?.inPortal() || false);
94
+ /**
95
+ * Used for calculation of the level of inclusion. Can be different than the actual level due to ability to mix grouped lists with ungrouped.
96
+ * For ungrouped lists will add +1 for the first list in the hierarchy to mimic group existence.
97
+ */
98
+ this.normalizedLevel = computed(() => {
99
+ if (this.parentNavigationListComponent.isInGroup() || this.isGroup()) {
100
+ return this.level();
101
+ }
102
+ return this.level() + 1;
103
+ });
104
+ /** @hidden */
105
+ this._isInPopover = computed(() => this.navigationComponent.isSnapped() && (this.normalizedLevel() > 2 || this._hidden()));
106
+ /** @hidden */
107
+ // eslint-disable-next-line max-len
108
+ this.expandedAttr = computed(() => (this.expanded() ||
109
+ (this.normalizedLevel() === 1 &&
110
+ !!this.childNavigationListComponent() &&
111
+ this.navigationComponent.isSnapped())) &&
112
+ !this._hidden());
113
+ /**
114
+ * Icon which should be used for the toggle button.
115
+ **/
116
+ this.toggleIcon = computed(() => {
117
+ if (this.expandedAttr()) {
118
+ return 'slim-arrow-down';
119
+ }
120
+ return this._isRtl() ? 'slim-arrow-left' : 'slim-arrow-right';
121
+ });
122
+ /** @hidden */
123
+ this._selfInPortal = signal(false);
124
+ /** @hidden */
125
+ this._cdr = inject(ChangeDetectorRef);
126
+ /** @hidden */
127
+ this._tabbableService = inject(TabbableElementService);
128
+ /** @hidden */
129
+ this._navigationComponent = inject(FdbNavigationComponent);
130
+ effect(() => {
131
+ this.additionalBodyComponentClasses = [
132
+ 'fd-navigation',
133
+ 'fd-navigation--snapped',
134
+ `fd-navigation--${this.navigationComponent.mode()}`
135
+ ]
136
+ .filter((klass) => !!klass)
137
+ .join(' ');
138
+ this._popoverService.updateContent(null, this.childrenTemplate());
139
+ });
140
+ }
141
+ /** @hidden */
142
+ buildComponentCssClass() {
143
+ return [this.class || '', 'fd-navigation__list-item'];
144
+ }
145
+ /** @hidden */
146
+ _keydownHandler(event) {
147
+ if (this._isInPopover() && KeyUtil.isKeyCode(event, [DOWN_ARROW, UP_ARROW])) {
148
+ event.stopImmediatePropagation();
149
+ if (this._hidden() || this.parentListItemComponent?._hidden()) {
150
+ const hiddenItems = this.navigationComponent.getMoreButton()?.hiddenItems() || [];
151
+ const firstLevelHiddenElementCondition = hiddenItems &&
152
+ ((KeyUtil.isKeyCode(event, UP_ARROW) &&
153
+ this.elementRef.nativeElement === hiddenItems[0]?.elementRef.nativeElement) ||
154
+ (KeyUtil.isKeyCode(event, DOWN_ARROW) &&
155
+ this.elementRef.nativeElement ===
156
+ hiddenItems[hiddenItems.length - 1]?.elementRef.nativeElement));
157
+ const secondLevelHiddenElementCondition = this.normalizedLevel() > 2 &&
158
+ ((KeyUtil.isKeyCode(event, UP_ARROW) &&
159
+ this.parentNavigationListComponent.listItems.first === this) ||
160
+ (KeyUtil.isKeyCode(event, DOWN_ARROW) &&
161
+ this.parentNavigationListComponent.listItems.last === this));
162
+ if (firstLevelHiddenElementCondition || secondLevelHiddenElementCondition) {
163
+ return;
164
+ }
165
+ this.navigationComponent.keyDownHandler(event);
166
+ return;
167
+ }
168
+ if (KeyUtil.isKeyCode(event, UP_ARROW) && this.parentNavigationListComponent.listItems.first === this) {
169
+ this.parentListItemComponent?.focusOnClonedLink();
170
+ }
171
+ if ((KeyUtil.isKeyCode(event, UP_ARROW) && this.parentNavigationListComponent.listItems.first === this) ||
172
+ (KeyUtil.isKeyCode(event, DOWN_ARROW) && this.parentNavigationListComponent.listItems.last === this)) {
173
+ return;
174
+ }
175
+ this.navigationComponent.keyDownHandler(event);
176
+ return;
177
+ }
178
+ if (!KeyUtil.isKeyCode(event, [LEFT_ARROW, RIGHT_ARROW])) {
179
+ return;
180
+ }
181
+ event.stopImmediatePropagation();
182
+ const shouldExpand = !this._isCollapseAction(event);
183
+ if (!this.navigationComponent.isSnapped()) {
184
+ this._expandedStateKeyboardHandler(shouldExpand);
185
+ }
186
+ else {
187
+ this._snappedStateKeyboardHandler(shouldExpand);
188
+ }
189
+ }
190
+ /** @hidden */
191
+ clonedMainLinkKeydown(event) {
192
+ if (this._isCollapseAction(event)) {
193
+ this._popoverService.close();
194
+ this.focus();
195
+ return;
196
+ }
197
+ if (KeyUtil.isKeyCode(event, DOWN_ARROW)) {
198
+ this._childNavigationListItems.first?.focus();
199
+ }
200
+ }
201
+ /** @hidden */
202
+ calculateExpanded() {
203
+ this._cdr.detectChanges();
204
+ }
205
+ /** @hidden */
206
+ focus() {
207
+ if (this.linkComponent) {
208
+ this.linkComponent.elementRef.nativeElement.focus();
209
+ }
210
+ else {
211
+ this._tabbableService.getTabbableElement(this.elementRef.nativeElement, false, true)?.focus();
212
+ }
213
+ }
214
+ /** @hidden */
215
+ ngAfterViewInit() {
216
+ this._popoverService.updateTriggerElement(this._navigationItem);
217
+ }
218
+ /** @hidden */
219
+ ngOnChanges() {
220
+ this.buildComponentCssClass();
221
+ this._popoverService.refreshConfiguration(this);
222
+ }
223
+ /** @hidden */
224
+ ngOnInit() {
225
+ this.buildComponentCssClass();
226
+ }
227
+ /** @hidden */
228
+ collapse() {
229
+ this.expanded.set(false);
230
+ this._popoverService.close();
231
+ }
232
+ /** @hidden */
233
+ expand() {
234
+ this.expanded.set(true);
235
+ }
236
+ /** @hidden */
237
+ toggle() {
238
+ if (this._hidden()) {
239
+ return;
240
+ }
241
+ this.expanded.set(!this.expanded());
242
+ }
243
+ /** @hidden */
244
+ setSnappedActiveState(isActive) {
245
+ this.childrenActive.set(isActive);
246
+ }
247
+ /** @hidden */
248
+ hide() {
249
+ this._hidden.set(true);
250
+ this.buildComponentCssClass();
251
+ }
252
+ /** @hidden */
253
+ show() {
254
+ this._hidden.set(false);
255
+ this.elementRef.nativeElement.style.display = 'flex';
256
+ this.buildComponentCssClass();
257
+ }
258
+ /** @hidden */
259
+ checkSelfHidden() {
260
+ const shouldHide = this._childNavigationListItems
261
+ ?.filter((item) => item.normalizedLevel() === this.normalizedLevel() + 1)
262
+ .every((item) => item._hidden());
263
+ this._hidden.set(shouldHide);
264
+ this.isOpen = shouldHide;
265
+ this.elementRef.nativeElement.style.display = shouldHide ? 'none' : 'flex';
266
+ this.buildComponentCssClass();
267
+ }
268
+ /** @hidden */
269
+ focusOnClonedLink() {
270
+ if (this._clonedMainLink) {
271
+ this._clonedMainLink.nativeElement.focus();
272
+ return;
273
+ }
274
+ const hiddenItems = this.hiddenItems();
275
+ if (hiddenItems.length > 0) {
276
+ this._tabbableService.getTabbableElement(hiddenItems[0]?.elementRef.nativeElement)?.focus();
277
+ }
278
+ }
279
+ /** @hidden */
280
+ createPortal() {
281
+ this.domPortal = this.domPortal || new DomPortal(this.elementRef.nativeElement);
282
+ this._selfInPortal.set(true);
283
+ return this.domPortal;
284
+ }
285
+ /** @hidden */
286
+ destroyPortal() {
287
+ if (this.domPortal?.isAttached) {
288
+ this.domPortal.detach();
289
+ this.domPortal = null;
290
+ }
291
+ this._selfInPortal.set(false);
292
+ }
293
+ /** @hidden */
294
+ _isCollapseAction(event) {
295
+ const expandKey = this._rtl?.rtl.value ? RIGHT_ARROW : LEFT_ARROW;
296
+ return KeyUtil.isKeyCode(event, expandKey);
297
+ }
298
+ /** @hidden */
299
+ _expandedStateKeyboardHandler(shouldExpand) {
300
+ if (shouldExpand && this.expanded()) {
301
+ this.navigationComponent.setNextItemActive();
302
+ return;
303
+ }
304
+ if (!shouldExpand && !this.expanded() && this.parentListItemComponent) {
305
+ this.navigationComponent.setActiveItem(this.parentListItemComponent);
306
+ return;
307
+ }
308
+ if (!shouldExpand && this.childNavigationListComponent()) {
309
+ if (!this.expanded()) {
310
+ this.navigationComponent.setPreviousItemActive();
311
+ }
312
+ else {
313
+ this.expanded.set(false);
314
+ }
315
+ }
316
+ this.expanded.set(shouldExpand);
317
+ }
318
+ /** @hidden */
319
+ _snappedStateKeyboardHandler(shouldExpand) {
320
+ if (shouldExpand && this._hidden()) {
321
+ this.expanded.set(shouldExpand);
322
+ this._childNavigationListItems.first?.focus();
323
+ this.childFocused.set(true);
324
+ return;
325
+ }
326
+ if (shouldExpand) {
327
+ if (this.expanded()) {
328
+ this._childNavigationListItems.first?.focus();
329
+ return;
330
+ }
331
+ this.expanded.set(shouldExpand);
332
+ this._popoverService.open();
333
+ setTimeout(() => {
334
+ this.focusOnClonedLink();
335
+ });
336
+ }
337
+ else {
338
+ this.expanded.set(shouldExpand);
339
+ this._popoverService.close();
340
+ if (!this.inPortal()) {
341
+ this.focus();
342
+ }
343
+ if (this.inPortal() && this.normalizedLevel() === 2) {
344
+ this._navigationComponent.focusMoreButton();
345
+ }
346
+ else {
347
+ this.parentListItemComponent?.focus();
348
+ }
349
+ }
350
+ }
351
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: NavigationListItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
352
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: NavigationListItemComponent, isStandalone: true, selector: "li[fdb-navigation-list-item]", inputs: { class: "class", group: "group", _expanded: ["expanded", "_expanded"], linkTemplate: "linkTemplate", alwaysFocusable: "alwaysFocusable" }, host: { listeners: { "keydown": "_keydownHandler($event)" } }, providers: [
353
+ PopoverService,
354
+ {
355
+ provide: FdbNavigationListItemComponent,
356
+ useExisting: NavigationListItemComponent
357
+ }
358
+ ], queries: [{ propertyName: "_navigationListComponent", first: true, predicate: FdbNavigationListComponent, descendants: true }, { propertyName: "_routerLinkActive", first: true, predicate: RouterLinkActive, descendants: true }, { propertyName: "_routerLink", first: true, predicate: RouterLink, descendants: true }, { propertyName: "linkComponent", first: true, predicate: NavigationLinkComponent, descendants: true }, { propertyName: "_childNavigationListItems", predicate: FdbNavigationListItemComponent, descendants: true }], viewQueries: [{ propertyName: "_childrenTemplate", first: true, predicate: ["childrenTemplate"], descendants: true, read: TemplateRef }, { propertyName: "_navigationItem", first: true, predicate: ["navigationItem"], descendants: true }, { propertyName: "_clonedMainLink", first: true, predicate: ["clonedMainLink"], descendants: true, read: ElementRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"fd-navigation__item\"\n [class.fd-navigation__item--group]=\"isGroup()\"\n [class.fd-navigation__item--overflow]=\"_hidden()\"\n [class.fd-navigation__item--child]=\"normalizedLevel() > 2\"\n [class.fd-navigation__item--with-expander]=\"\n childNavigationListComponent() && normalizedLevel() < 3 && linkComponent?._routerLink\n \"\n aria-current=\"page\"\n [attr.aria-selected]=\"isRouterLinkActive() || (childrenActive() && navigationComponent.isSnapped()) ? true : null\"\n [attr.aria-expanded]=\"expandedAttr()\"\n [attr.aria-level]=\"level()\"\n #navigationItem\n role=\"menuitem\"\n>\n <ng-container *ngIf=\"linkTemplate\">\n <ng-template [ngTemplateOutlet]=\"linkTemplate\" [ngTemplateOutletInjector]=\"injector\"></ng-template>\n </ng-container>\n <ng-content select=\"[fdb-navigation-link]\"></ng-content>\n <button\n (click)=\"toggle()\"\n *ngIf=\"childNavigationListComponent() && normalizedLevel() < 3 && linkComponent?._routerLink\"\n fd-button\n class=\"fd-button--nested fd-navigation__expander\"\n >\n <fd-icon [glyph]=\"toggleIcon()\"></fd-icon>\n </button>\n</div>\n<ng-container\n *ngIf=\"\n (childNavigationListComponent() && !navigationComponent.isSnapped()) ||\n (navigationComponent.isSnapped() && normalizedLevel() < 2) ||\n _hidden()\n \"\n>\n <ng-template [ngTemplateOutlet]=\"childrenTemplate\" [ngTemplateOutletInjector]=\"injector\"></ng-template>\n</ng-container>\n\n<ng-template #childrenTemplate>\n <ng-template #childNavigationLists>\n <ng-content select=\"ul[fdb-navigation-list]\"></ng-content>\n </ng-template>\n\n <ng-container *ngIf=\"isGroup(); else withWrapper\">\n <ng-template [ngTemplateOutlet]=\"childNavigationLists\" [ngTemplateOutletInjector]=\"injector\"></ng-template>\n </ng-container>\n <ng-template #withWrapper>\n <ng-template #popoverTemplate>\n <!-- fd-navigation__list-container -->\n <div\n *ngIf=\"childNavigationListComponent()\"\n [class.fd-navigation__list-container]=\"!navigationComponent.isSnapped()\"\n aria-hidden=\"true\"\n >\n <div class=\"fd-navigation__list-wrapper popover-wrapper\" aria-hidden=\"true\">\n <div\n *ngIf=\"linkComponent && navigationComponent.isSnapped()\"\n class=\"fd-navigation__item fd-navigation__item--title fd-navigation__item--child\"\n aria-level=\"1\"\n role=\"treeitem\"\n aria-expanded=\"true\"\n [attr.aria-selected]=\"isRouterLinkActive()\"\n >\n <a\n class=\"fd-navigation__link\"\n [routerLink]=\"$any(routerLink())?.commands\"\n role=\"button\"\n tabindex=\"0\"\n (keydown)=\"clonedMainLinkKeydown($event)\"\n #clonedMainLink\n >\n <span\n class=\"fd-navigation__icon sap-icon--basket\"\n role=\"presentation\"\n aria-hidden=\"true\"\n ></span>\n <ng-container *ngTemplateOutlet=\"linkComponent.textRenderer!\"></ng-container>\n <span class=\"fd-navigation__selection-indicator\"></span>\n </a>\n </div>\n <ng-template\n [ngTemplateOutlet]=\"childNavigationLists\"\n [ngTemplateOutletInjector]=\"injector\"\n ></ng-template>\n </div>\n </div>\n </ng-template>\n <ng-template [ngIf]=\"_hidden()\" [ngIfElse]=\"popoverTemplate\">\n <div\n *ngIf=\"childNavigationListComponent()\"\n class=\"fd-navigation__list-container fd-navigation__list-container--submenu fd-menu__sublist\"\n >\n <div class=\"fd-navigation__list-wrapper\">\n <ng-template\n [ngTemplateOutlet]=\"childNavigationLists\"\n [ngTemplateOutletInjector]=\"injector\"\n ></ng-template>\n </div>\n </div>\n </ng-template>\n </ng-template>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: IconComponent, selector: "fd-icon", inputs: ["glyph", "font", "class", "ariaLabel", "ariaHidden"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
359
+ }
360
+ __decorate([
361
+ applyCssClass,
362
+ __metadata("design:type", Function),
363
+ __metadata("design:paramtypes", []),
364
+ __metadata("design:returntype", Array)
365
+ ], NavigationListItemComponent.prototype, "buildComponentCssClass", null);
366
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: NavigationListItemComponent, decorators: [{
367
+ type: Component,
368
+ args: [{ selector: 'li[fdb-navigation-list-item]', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
369
+ PopoverService,
370
+ {
371
+ provide: FdbNavigationListItemComponent,
372
+ useExisting: NavigationListItemComponent
373
+ }
374
+ ], imports: [
375
+ AsyncPipe,
376
+ NgIf,
377
+ NgTemplateOutlet,
378
+ PopoverComponent,
379
+ PopoverControlComponent,
380
+ RouterLink,
381
+ ButtonComponent,
382
+ IconComponent
383
+ ], standalone: true, template: "<div\n class=\"fd-navigation__item\"\n [class.fd-navigation__item--group]=\"isGroup()\"\n [class.fd-navigation__item--overflow]=\"_hidden()\"\n [class.fd-navigation__item--child]=\"normalizedLevel() > 2\"\n [class.fd-navigation__item--with-expander]=\"\n childNavigationListComponent() && normalizedLevel() < 3 && linkComponent?._routerLink\n \"\n aria-current=\"page\"\n [attr.aria-selected]=\"isRouterLinkActive() || (childrenActive() && navigationComponent.isSnapped()) ? true : null\"\n [attr.aria-expanded]=\"expandedAttr()\"\n [attr.aria-level]=\"level()\"\n #navigationItem\n role=\"menuitem\"\n>\n <ng-container *ngIf=\"linkTemplate\">\n <ng-template [ngTemplateOutlet]=\"linkTemplate\" [ngTemplateOutletInjector]=\"injector\"></ng-template>\n </ng-container>\n <ng-content select=\"[fdb-navigation-link]\"></ng-content>\n <button\n (click)=\"toggle()\"\n *ngIf=\"childNavigationListComponent() && normalizedLevel() < 3 && linkComponent?._routerLink\"\n fd-button\n class=\"fd-button--nested fd-navigation__expander\"\n >\n <fd-icon [glyph]=\"toggleIcon()\"></fd-icon>\n </button>\n</div>\n<ng-container\n *ngIf=\"\n (childNavigationListComponent() && !navigationComponent.isSnapped()) ||\n (navigationComponent.isSnapped() && normalizedLevel() < 2) ||\n _hidden()\n \"\n>\n <ng-template [ngTemplateOutlet]=\"childrenTemplate\" [ngTemplateOutletInjector]=\"injector\"></ng-template>\n</ng-container>\n\n<ng-template #childrenTemplate>\n <ng-template #childNavigationLists>\n <ng-content select=\"ul[fdb-navigation-list]\"></ng-content>\n </ng-template>\n\n <ng-container *ngIf=\"isGroup(); else withWrapper\">\n <ng-template [ngTemplateOutlet]=\"childNavigationLists\" [ngTemplateOutletInjector]=\"injector\"></ng-template>\n </ng-container>\n <ng-template #withWrapper>\n <ng-template #popoverTemplate>\n <!-- fd-navigation__list-container -->\n <div\n *ngIf=\"childNavigationListComponent()\"\n [class.fd-navigation__list-container]=\"!navigationComponent.isSnapped()\"\n aria-hidden=\"true\"\n >\n <div class=\"fd-navigation__list-wrapper popover-wrapper\" aria-hidden=\"true\">\n <div\n *ngIf=\"linkComponent && navigationComponent.isSnapped()\"\n class=\"fd-navigation__item fd-navigation__item--title fd-navigation__item--child\"\n aria-level=\"1\"\n role=\"treeitem\"\n aria-expanded=\"true\"\n [attr.aria-selected]=\"isRouterLinkActive()\"\n >\n <a\n class=\"fd-navigation__link\"\n [routerLink]=\"$any(routerLink())?.commands\"\n role=\"button\"\n tabindex=\"0\"\n (keydown)=\"clonedMainLinkKeydown($event)\"\n #clonedMainLink\n >\n <span\n class=\"fd-navigation__icon sap-icon--basket\"\n role=\"presentation\"\n aria-hidden=\"true\"\n ></span>\n <ng-container *ngTemplateOutlet=\"linkComponent.textRenderer!\"></ng-container>\n <span class=\"fd-navigation__selection-indicator\"></span>\n </a>\n </div>\n <ng-template\n [ngTemplateOutlet]=\"childNavigationLists\"\n [ngTemplateOutletInjector]=\"injector\"\n ></ng-template>\n </div>\n </div>\n </ng-template>\n <ng-template [ngIf]=\"_hidden()\" [ngIfElse]=\"popoverTemplate\">\n <div\n *ngIf=\"childNavigationListComponent()\"\n class=\"fd-navigation__list-container fd-navigation__list-container--submenu fd-menu__sublist\"\n >\n <div class=\"fd-navigation__list-wrapper\">\n <ng-template\n [ngTemplateOutlet]=\"childNavigationLists\"\n [ngTemplateOutletInjector]=\"injector\"\n ></ng-template>\n </div>\n </div>\n </ng-template>\n </ng-template>\n</ng-template>\n" }]
384
+ }], ctorParameters: function () { return []; }, propDecorators: { class: [{
385
+ type: Input
386
+ }], group: [{
387
+ type: Input
388
+ }], _expanded: [{
389
+ type: Input,
390
+ args: ['expanded']
391
+ }], linkTemplate: [{
392
+ type: Input
393
+ }], alwaysFocusable: [{
394
+ type: Input
395
+ }], _navigationListComponent: [{
396
+ type: ContentChild,
397
+ args: [FdbNavigationListComponent]
398
+ }], _routerLinkActive: [{
399
+ type: ContentChild,
400
+ args: [RouterLinkActive]
401
+ }], _routerLink: [{
402
+ type: ContentChild,
403
+ args: [RouterLink]
404
+ }], _childrenTemplate: [{
405
+ type: ViewChild,
406
+ args: ['childrenTemplate', { read: TemplateRef }]
407
+ }], _navigationItem: [{
408
+ type: ViewChild,
409
+ args: ['navigationItem']
410
+ }], linkComponent: [{
411
+ type: ContentChild,
412
+ args: [NavigationLinkComponent]
413
+ }], _childNavigationListItems: [{
414
+ type: ContentChildren,
415
+ args: [FdbNavigationListItemComponent, { descendants: true }]
416
+ }], _clonedMainLink: [{
417
+ type: ViewChild,
418
+ args: ['clonedMainLink', { static: false, read: ElementRef }]
419
+ }], buildComponentCssClass: [], _keydownHandler: [{
420
+ type: HostListener,
421
+ args: ['keydown', ['$event']]
422
+ }] } });
423
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi1saXN0LWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9idHAvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLWxpc3QvbmF2aWdhdGlvbi1saXN0LWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9idHAvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLWxpc3QvbmF2aWdhdGlvbi1saXN0LWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRSxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBR0wsU0FBUyxFQUVULFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFHSCxPQUFPLEVBRVAsc0JBQXNCLEVBQ3RCLGFBQWEsRUFDaEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxF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QUFXLDZCQUE2Qjt5QkFDM0M7cUJBQ0osV0FDUTt3QkFDTCxTQUFTO3dCQUNULElBQUk7d0JBQ0osZ0JBQWdCO3dCQUNoQixnQkFBZ0I7d0JBQ2hCLHVCQUF1Qjt3QkFDdkIsVUFBVTt3QkFDVixlQUFlO3dCQUNmLGFBQWE7cUJBQ2hCLGNBQ1csSUFBSTswRUFRaEIsS0FBSztzQkFESixLQUFLO2dCQUtGLEtBQUs7c0JBRFIsS0FBSztnQkFPRixTQUFTO3NCQURaLEtBQUs7dUJBQUMsVUFBVTtnQkFPakIsWUFBWTtzQkFEWCxLQUFLO2dCQUtOLGVBQWU7c0JBRGQsS0FBSztnQkFLRix3QkFBd0I7c0JBRDNCLFlBQVk7dUJBQUMsMEJBQTBCO2dCQU9wQyxpQkFBaUI7c0JBRHBCLFlBQVk7dUJBQUMsZ0JBQWdCO2dCQU8xQixXQUFXO3NCQURkLFlBQVk7dUJBQUMsVUFBVTtnQkFPcEIsaUJBQWlCO3NCQURwQixTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFPcEQsZUFBZTtzQkFEZCxTQUFTO3VCQUFDLGdCQUFnQjtnQkFLM0IsYUFBYTtzQkFEWixZQUFZO3VCQUFDLHVCQUF1QjtnQkFLcEIseUJBQXlCO3NCQUR6QyxlQUFlO3VCQUFDLDhCQUE4QixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFLckQsZUFBZTtzQkFEL0IsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkF5SWhFLHNCQUFzQixNQU1kLGVBQWU7c0JBRHRCLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZSAqL1xuaW1wb3J0IHsgRm9jdXNhYmxlT3B0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgRE9XTl9BUlJPVywgTEVGVF9BUlJPVywgUklHSFRfQVJST1csIFVQX0FSUk9XIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IERvbVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTaWduYWwsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIGNvbXB1dGVkLFxuICAgIGVmZmVjdCxcbiAgICBpbmplY3QsXG4gICAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBSb3V0ZXJMaW5rLCBSb3V0ZXJMaW5rQWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gICAgQ3NzQ2xhc3NCdWlsZGVyLFxuICAgIEhhc0VsZW1lbnRSZWYsXG4gICAgS2V5VXRpbCxcbiAgICBOdWxsYWJsZSxcbiAgICBUYWJiYWJsZUVsZW1lbnRTZXJ2aWNlLFxuICAgIGFwcGx5Q3NzQ2xhc3Ncbn0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2J1dHRvbic7XG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2ljb24nO1xuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCwgUG9wb3ZlckNvbnRyb2xDb21wb25lbnQsIFBvcG92ZXJTZXJ2aWNlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3BvcG92ZXInO1xuaW1wb3J0IHsgRmRiTmF2aWdhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL25hdmlnYXRpb24tY29tcG9uZW50LnRva2VuJztcbmltcG9ydCB7IE5hdmlnYXRpb25MaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vbmF2aWdhdGlvbi1saW5rLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGZGJOYXZpZ2F0aW9uTGlzdENvbXBvbmVudCB9IGZyb20gJy4uL25hdmlnYXRpb24tbGlzdC1jb21wb25lbnQudG9rZW4nO1xuaW1wb3J0IHsgRmRiTmF2aWdhdGlvbkxpc3RJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbmF2aWdhdGlvbi1saXN0LWl0ZW0tY29tcG9uZW50LnRva2VuJztcblxuQENvbXBvbmVudCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ2xpW2ZkYi1uYXZpZ2F0aW9uLWxpc3QtaXRlbV0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9uYXZpZ2F0aW9uLWxpc3QtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgUG9wb3ZlclNlcnZpY2UsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEZkYk5hdmlnYXRpb25MaXN0SXRlbUNvbXBvbmVudCxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBOYXZpZ2F0aW9uTGlzdEl0ZW1Db21wb25lbnRcbiAgICAgICAgfVxuICAgIF0sXG4gICAgaW1wb3J0czogW1xuICAgICAgICBBc3luY1BpcGUsXG4gICAgICAgIE5nSWYsXG4gICAgICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgICAgIFBvcG92ZXJDb21wb25lbnQsXG4gICAgICAgIFBvcG92ZXJDb250cm9sQ29tcG9uZW50LFxuICAgICAgICBSb3V0ZXJMaW5rLFxuICAgICAgICBCdXR0b25Db21wb25lbnQsXG4gICAgICAgIEljb25Db21wb25lbnRcbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgTmF2aWdhdGlvbkxpc3RJdGVtQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBGZGJOYXZpZ2F0aW9uTGlzdEl0ZW1Db21wb25lbnRcbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDc3NDbGFzc0J1aWxkZXIsIEhhc0VsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIEZvY3VzYWJsZU9wdGlvblxue1xuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQElucHV0KClcbiAgICBjbGFzczogTnVsbGFibGU8c3RyaW5nPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQElucHV0KClcbiAgICBzZXQgZ3JvdXAoZ3JvdXA6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5pc0dyb3VwLnNldChncm91cCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASW5wdXQoJ2V4cGFuZGVkJylcbiAgICBzZXQgX2V4cGFuZGVkKGV4cGFuZGVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZXhwYW5kZWQuc2V0KGV4cGFuZGVkKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbGlua1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQElucHV0KClcbiAgICBhbHdheXNGb2N1c2FibGUgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQENvbnRlbnRDaGlsZChGZGJOYXZpZ2F0aW9uTGlzdENvbXBvbmVudClcbiAgICBzZXQgX25hdmlnYXRpb25MaXN0Q29tcG9uZW50KG5hdmlnYXRpb25MaXN0Q29tcG9uZW50OiBGZGJOYXZpZ2F0aW9uTGlzdENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLmNoaWxkTmF2aWdhdGlvbkxpc3RDb21wb25lbnQuc2V0KG5hdmlnYXRpb25MaXN0Q29tcG9uZW50KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBDb250ZW50Q2hpbGQoUm91dGVyTGlua0FjdGl2ZSlcbiAgICBzZXQgX3JvdXRlckxpbmtBY3RpdmUocm91dGVyTGlua0FjdGl2ZTogUm91dGVyTGlua0FjdGl2ZSkge1xuICAgICAgICB0aGlzLnJvdXRlckxpbmtBY3RpdmUuc2V0KHJvdXRlckxpbmtBY3RpdmUpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQENvbnRlbnRDaGlsZChSb3V0ZXJMaW5rKVxuICAgIHNldCBfcm91dGVyTGluayhyb3V0ZXJMaW5rOiBSb3V0ZXJMaW5rKSB7XG4gICAgICAgIHRoaXMucm91dGVyTGluay5zZXQocm91dGVyTGluayk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdjaGlsZHJlblRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHNldCBfY2hpbGRyZW5UZW1wbGF0ZSh0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8dm9pZD4pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlblRlbXBsYXRlLnNldCh0ZW1wbGF0ZVJlZik7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCduYXZpZ2F0aW9uSXRlbScpXG4gICAgX25hdmlnYXRpb25JdGVtOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAQ29udGVudENoaWxkKE5hdmlnYXRpb25MaW5rQ29tcG9uZW50KVxuICAgIGxpbmtDb21wb25lbnQ6IE51bGxhYmxlPE5hdmlnYXRpb25MaW5rQ29tcG9uZW50PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihGZGJOYXZpZ2F0aW9uTGlzdEl0ZW1Db21wb25lbnQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGlsZE5hdmlnYXRpb25MaXN0SXRlbXM6IFF1ZXJ5TGlzdDxGZGJOYXZpZ2F0aW9uTGlzdEl0ZW1Db21wb25lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdjbG9uZWRNYWluTGluaycsIHsgc3RhdGljOiBmYWxzZSwgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Nsb25lZE1haW5MaW5rOiBOdWxsYWJsZTxFbGVtZW50UmVmPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiA9IGluamVjdChFbGVtZW50UmVmKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcGFyZW50TGlzdEl0ZW1Db21wb25lbnQgPSBpbmplY3QoRmRiTmF2aWdhdGlvbkxpc3RJdGVtQ29tcG9uZW50LCB7IG9wdGlvbmFsOiB0cnVlLCBza2lwU2VsZjogdHJ1ZSB9KTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb3ZlcnJpZGUgbm9BcnJvdyA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvdmVycmlkZSBhZGRpdGlvbmFsQm9keUNsYXNzID0gJ2ZkLW5hdmlnYXRpb25fX2xpc3QtY29udGFpbmVyJztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcm91dGVyTGluayA9IHNpZ25hbDxSb3V0ZXJMaW5rIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJvdXRlckxpbmtBY3RpdmUgPSBzaWduYWw8Um91dGVyTGlua0FjdGl2ZSB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBpc1JvdXRlckxpbmtBY3RpdmUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvdXRlckxpbmtBY3RpdmUgPSB0aGlzLnJvdXRlckxpbmtBY3RpdmUoKTtcbiAgICAgICAgaWYgKHJvdXRlckxpbmtBY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0b1NpZ25hbChyb3V0ZXJMaW5rQWN0aXZlLmlzQWN0aXZlQ2hhbmdlLCB7XG4gICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlOiByb3V0ZXJMaW5rQWN0aXZlLmlzQWN0aXZlLFxuICAgICAgICAgICAgICAgIGluamVjdG9yOiB0aGlzLmluamVjdG9yXG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY2hpbGROYXZpZ2F0aW9uTGlzdENvbXBvbmVudCA9IHNpZ25hbDxGZGJOYXZpZ2F0aW9uTGlzdENvbXBvbmVudCB8IG51bGw+KG51bGwpO1xuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZXhwYW5kZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBmdWxsUGF0aEV4cGFuZGVkID0gY29tcHV0ZWQoXG4gICAgICAgICgpID0+ICh0aGlzLnBhcmVudExpc3RJdGVtQ29tcG9uZW50ID8gdGhpcy5wYXJlbnRMaXN0SXRlbUNvbXBvbmVudC5leHBhbmRlZCgpIDogdHJ1ZSkgJiYgdGhpcy5leHBhbmRlZCgpXG4gICAgKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgaXNHcm91cCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNoaWxkcmVuVGVtcGxhdGUgPSBzaWduYWw8VGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsPihudWxsKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY2hpbGRyZW5BY3RpdmUgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBpblBvcnRhbCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucGFyZW50SW5Qb3J0YWwoKSB8fCB0aGlzLl9zZWxmSW5Qb3J0YWwoKSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHBhcmVudEluUG9ydGFsID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wYXJlbnRMaXN0SXRlbUNvbXBvbmVudD8uaW5Qb3J0YWwoKSB8fCBmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGluIGF0dHJpYnV0ZSBvbmx5LiBGb3IgYWN0dWFsIGNhbGN1bGF0aW9uIG9mIGxldmVsIG9mIG5lc3RpbmcgdXNlIGBub3JtYWxpemVkTGV2ZWxgLlxuICAgICAqL1xuICAgIGdldCBsZXZlbCgpOiBTaWduYWw8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudE5hdmlnYXRpb25MaXN0Q29tcG9uZW50LmxldmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGNhbGN1bGF0aW9uIG9mIHRoZSBsZXZlbCBvZiBpbmNsdXNpb24uIENhbiBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgYWN0dWFsIGxldmVsIGR1ZSB0byBhYmlsaXR5IHRvIG1peCBncm91cGVkIGxpc3RzIHdpdGggdW5ncm91cGVkLlxuICAgICAqIEZvciB1bmdyb3VwZWQgbGlzdHMgd2lsbCBhZGQgKzEgZm9yIHRoZSBmaXJzdCBsaXN0IGluIHRoZSBoaWVyYXJjaHkgdG8gbWltaWMgZ3JvdXAgZXhpc3RlbmNlLlxuICAgICAqL1xuICAgIG5vcm1hbGl6ZWRMZXZlbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50TmF2aWdhdGlvbkxpc3RDb21wb25lbnQuaXNJbkdyb3VwKCkgfHwgdGhpcy5pc0dyb3VwKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxldmVsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubGV2ZWwoKSArIDE7XG4gICAgfSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9pc0luUG9wb3ZlciA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PiB0aGlzLm5hdmlnYXRpb25Db21wb25lbnQuaXNTbmFwcGVkKCkgJiYgKHRoaXMubm9ybWFsaXplZExldmVsKCkgPiAyIHx8IHRoaXMuX2hpZGRlbigpKVxuICAgICk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgZXhwYW5kZWRBdHRyID0gY29tcHV0ZWQoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgICAodGhpcy5leHBhbmRlZCgpIHx8XG4gICAgICAgICAgICAgICAgKHRoaXMubm9ybWFsaXplZExldmVsKCkgPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgISF0aGlzLmNoaWxkTmF2aWdhdGlvbkxpc3RDb21wb25lbnQoKSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25Db21wb25lbnQuaXNTbmFwcGVkKCkpKSAmJlxuICAgICAgICAgICAgIXRoaXMuX2hpZGRlbigpXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIEljb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSB0b2dnbGUgYnV0dG9uLlxuICAgICAqKi9cbiAgICB0b2dnbGVJY29uID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5leHBhbmRlZEF0dHIoKSkge1xuICAgICAgICAgICAgcmV0dXJuICdzbGltLWFycm93LWRvd24nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1J0bCgpID8gJ3NsaW0tYXJyb3ctbGVmdCcgOiAnc2xpbS1hcnJvdy1yaWdodCc7XG4gICAgfSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGRvbVBvcnRhbDogTnVsbGFibGU8RG9tUG9ydGFsPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc2VsZkluUG9ydGFsID0gc2lnbmFsKGZhbHNlKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiYmFibGVTZXJ2aWNlID0gaW5qZWN0KFRhYmJhYmxlRWxlbWVudFNlcnZpY2UpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9uYXZpZ2F0aW9uQ29tcG9uZW50ID0gaW5qZWN0KEZkYk5hdmlnYXRpb25Db21wb25lbnQpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkaXRpb25hbEJvZHlDb21wb25lbnRDbGFzc2VzID0gW1xuICAgICAgICAgICAgICAgICdmZC1uYXZpZ2F0aW9uJyxcbiAgICAgICAgICAgICAgICAnZmQtbmF2aWdhdGlvbi0tc25hcHBlZCcsXG4gICAgICAgICAgICAgICAgYGZkLW5hdmlnYXRpb24tLSR7dGhpcy5uYXZpZ2F0aW9uQ29tcG9uZW50Lm1vZGUoKX1gXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoa2xhc3MpID0+ICEha2xhc3MpXG4gICAgICAgICAgICAgICAgLmpvaW4oJyAnKTtcbiAgICAgICAgICAgIHRoaXMuX3BvcG92ZXJTZXJ2aWNlLnVwZGF0ZUNvbnRlbnQobnVsbCwgdGhpcy5jaGlsZHJlblRlbXBsYXRlKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBhcHBseUNzc0NsYXNzXG4gICAgYnVpbGRDb21wb25lbnRDc3NDbGFzcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5jbGFzcyB8fCAnJywgJ2ZkLW5hdmlnYXRpb25fX2xpc3QtaXRlbSddO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHJpdmF0ZSBfa2V5ZG93bkhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5Qb3BvdmVyKCkgJiYgS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIFtET1dOX0FSUk9XLCBVUF9BUlJPV10pKSB7XG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9oaWRkZW4oKSB8fCB0aGlzLnBhcmVudExpc3RJdGVtQ29tcG9uZW50Py5faGlkZGVuKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoaWRkZW5JdGVtcyA9IHRoaXMubmF2aWdhdGlvbkNvbXBvbmVudC5nZXRNb3JlQnV0dG9uKCk/LmhpZGRlbkl0ZW1zKCkgfHwgW107XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RMZXZlbEhpZGRlbkVsZW1lbnRDb25kaXRpb24gPVxuICAgICAgICAgICAgICAgICAgICBoaWRkZW5JdGVtcyAmJlxuICAgICAgICAgICAgICAgICAgICAoKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBVUF9BUlJPVykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50ID09PSBoaWRkZW5JdGVtc1swXT8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBET1dOX0FSUk9XKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50ID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5JdGVtc1toaWRkZW5JdGVtcy5sZW5ndGggLSAxXT8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzZWNvbmRMZXZlbEhpZGRlbkVsZW1lbnRDb25kaXRpb24gPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRMZXZlbCgpID4gMiAmJlxuICAgICAgICAgICAgICAgICAgICAoKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBVUF9BUlJPVykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TmF2aWdhdGlvbkxpc3RDb21wb25lbnQubGlzdEl0ZW1zLmZpcnN0ID09PSB0aGlzKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBET1dOX0FSUk9XKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TmF2aWdhdGlvbkxpc3RDb21wb25lbnQubGlzdEl0ZW1zLmxhc3QgPT09IHRoaXMpKTtcblxuICAgICAgICAgICAgICAgIGlmIChmaXJzdExldmVsSGlkZGVuRWxlbWVudENvbmRpdGlvbiB8fCBzZWNvbmRMZXZlbEhpZGRlbkVsZW1lbnRDb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25Db21wb25lbnQua2V5RG93bkhhbmRsZXIoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgVVBfQVJST1cpICYmIHRoaXMucGFyZW50TmF2aWdhdGlvbkxpc3RDb21wb25lbnQubGlzdEl0ZW1zLmZpcnN0ID09PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRMaXN0SXRlbUNvbXBvbmVudD8uZm9jdXNPbkNsb25lZExpbmsoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIFVQX0FSUk9XKSAmJiB0aGlzLnBhcmVudE5hdmlnYXRpb25MaXN0Q29tcG9uZW50Lmxpc3RJdGVtcy5maXJzdCA9PT0gdGhpcykgfHxcbiAgICAgICAgICAgICAgICAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIERPV05fQVJST1cpICYmIHRoaXMucGFyZW50TmF2aWdhdGlvbkxpc3RDb21wb25lbnQubGlzdEl0ZW1zLmxhc3QgPT09IHRoaXMpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25Db21wb25lbnQua2V5RG93bkhhbmRsZXIoZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIFtMRUZUX0FSUk9XLCBSSUdIVF9BUlJPV10pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnN0IHNob3VsZEV4cGFuZCA9ICF0aGlzLl9pc0NvbGxhcHNlQWN0aW9uKGV2ZW50KTtcblxuICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbkNvbXBvbmVudC5pc1NuYXBwZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fZXhwYW5kZWRTdGF0ZUtleWJvYXJkSGFuZGxlcihzaG91bGRFeHBhbmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc25hcHBlZFN0YXRlS2V5Ym9hcmRIYW5kbGVyKHNob3VsZEV4cGFuZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNsb25lZE1haW5MaW5rS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5faXNDb2xsYXBzZUFjdGlvbihldmVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3BvcG92ZXJTZXJ2aWNlLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIERPV05fQVJST1cpKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGlsZE5hdmlnYXRpb25MaXN0SXRlbXMuZmlyc3Q/LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNhbGN1bGF0ZUV4cGFuZGVkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmxpbmtDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHRoaXMubGlua0NvbXBvbmVudC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3RhYmJhYmxlU2VydmljZS5nZXRUYWJiYWJsZUVsZW1lbnQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGZhbHNlLCB0cnVlKT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9wb3BvdmVyU2VydmljZS51cGRhdGVUcmlnZ2VyRWxlbWVudCh0aGlzLl9uYXZpZ2F0aW9uSXRlbSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudENzc0NsYXNzKCk7XG4gICAgICAgIHRoaXMuX3BvcG92ZXJTZXJ2aWNlLnJlZnJlc2hDb25maWd1cmF0aW9uKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYnVpbGRDb21wb25lbnRDc3NDbGFzcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29sbGFwc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXhwYW5kZWQuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5fcG9wb3ZlclNlcnZpY2UuY2xvc2UoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGV4cGFuZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5leHBhbmRlZC5zZXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICB0b2dnbGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9oaWRkZW4oKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXhwYW5kZWQuc2V0KCF0aGlzLmV4cGFuZGVkKCkpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgc2V0U25hcHBlZEFjdGl2ZVN0YXRlKGlzQWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW5BY3RpdmUuc2V0KGlzQWN0aXZlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGhpZGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2hpZGRlbi5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuYnVpbGRDb21wb25lbnRDc3NDbGFzcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgc2hvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGlkZGVuLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgIHRoaXMuYnVpbGRDb21wb25lbnRDc3NDbGFzcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY2hlY2tTZWxmSGlkZGVuKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzaG91bGRIaWRlID0gdGhpcy5fY2hpbGROYXZpZ2F0aW9uTGlzdEl0ZW1zXG4gICAgICAgICAgICA/LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5ub3JtYWxpemVkTGV2ZWwoKSA9PT0gdGhpcy5ub3JtYWxpemVkTGV2ZWwoKSArIDEpXG4gICAgICAgICAgICAuZXZlcnkoKGl0ZW0pID0+IGl0ZW0uX2hpZGRlbigpKTtcbiAgICAgICAgdGhpcy5faGlkZGVuLnNldChzaG91bGRIaWRlKTtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBzaG91bGRIaWRlO1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gc2hvdWxkSGlkZSA/ICdub25lJyA6ICdmbGV4JztcbiAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudENzc0NsYXNzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBmb2N1c09uQ2xvbmVkTGluaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nsb25lZE1haW5MaW5rKSB7XG4gICAgICAgICAgICB0aGlzLl9jbG9uZWRNYWluTGluay5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoaWRkZW5JdGVtcyA9IHRoaXMuaGlkZGVuSXRlbXMoKTtcblxuICAgICAgICBpZiAoaGlkZGVuSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fdGFiYmFibGVTZXJ2aWNlLmdldFRhYmJhYmxlRWxlbWVudChoaWRkZW5JdGVtc1swXT8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY3JlYXRlUG9ydGFsKCk6IERvbVBvcnRhbCB7XG4gICAgICAgIHRoaXMuZG9tUG9ydGFsID0gdGhpcy5kb21Qb3J0YWwgfHwgbmV3IERvbVBvcnRhbCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuX3NlbGZJblBvcnRhbC5zZXQodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmRvbVBvcnRhbDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGRlc3Ryb3lQb3J0YWwoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRvbVBvcnRhbD8uaXNBdHRhY2hlZCkge1xuICAgICAgICAgICAgdGhpcy5kb21Qb3J0YWwuZGV0YWNoKCk7XG4gICAgICAgICAgICB0aGlzLmRvbVBvcnRhbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VsZkluUG9ydGFsLnNldChmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pc0NvbGxhcHNlQWN0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGV4cGFuZEtleSA9IHRoaXMuX3J0bD8ucnRsLnZhbHVlID8gUklHSFRfQVJST1cgOiBMRUZUX0FSUk9XO1xuICAgICAgICByZXR1cm4gS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIGV4cGFuZEtleSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9leHBhbmRlZFN0YXRlS2V5Ym9hcmRIYW5kbGVyKHNob3VsZEV4cGFuZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoc2hvdWxkRXhwYW5kICYmIHRoaXMuZXhwYW5kZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uQ29tcG9uZW50LnNldE5leHRJdGVtQWN0aXZlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNob3VsZEV4cGFuZCAmJiAhdGhpcy5leHBhbmRlZCgpICYmIHRoaXMucGFyZW50TGlzdEl0ZW1Db21wb25lbnQpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbkNvbXBvbmVudC5zZXRBY3RpdmVJdGVtKHRoaXMucGFyZW50TGlzdEl0ZW1Db21wb25lbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzaG91bGRFeHBhbmQgJiYgdGhpcy5jaGlsZE5hdmlnYXRpb25MaXN0Q29tcG9uZW50KCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5leHBhbmRlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uQ29tcG9uZW50LnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZGVkLnNldChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV4cGFuZGVkLnNldChzaG91bGRFeHBhbmQpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc25hcHBlZFN0YXRlS2V5Ym9hcmRIYW5kbGVyKHNob3VsZEV4cGFuZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoc2hvdWxkRXhwYW5kICYmIHRoaXMuX2hpZGRlbigpKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZGVkLnNldChzaG91bGRFeHBhbmQpO1xuICAgICAgICAgICAgdGhpcy5fY2hpbGROYXZpZ2F0aW9uTGlzdEl0ZW1zLmZpcnN0Py5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5jaGlsZEZvY3VzZWQuc2V0KHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRFeHBhbmQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4cGFuZGVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGlsZE5hdmlnYXRpb25MaXN0SXRlbXMuZmlyc3Q/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmV4cGFuZGVkLnNldChzaG91bGRFeHBhbmQpO1xuICAgICAgICAgICAgdGhpcy5fcG9wb3ZlclNlcnZpY2Uub3BlbigpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c09uQ2xvbmVkTGluaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZGVkLnNldChzaG91bGRFeHBhbmQpO1xuICAgICAgICAgICAgdGhpcy5fcG9wb3ZlclNlcnZpY2UuY2xvc2UoKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmluUG9ydGFsKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmluUG9ydGFsKCkgJiYgdGhpcy5ub3JtYWxpemVkTGV2ZWwoKSA9PT0gMikge1xuICAgICAgICAgICAgICAgIHRoaXMuX25hdmlnYXRpb25Db21wb25lbnQuZm9jdXNNb3JlQnV0dG9uKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TGlzdEl0ZW1Db21wb25lbnQ/LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgY2xhc3M9XCJmZC1uYXZpZ2F0aW9uX19pdGVtXCJcbiAgICBbY2xhc3MuZmQtbmF2aWdhdGlvbl9faXRlbS0tZ3JvdXBdPVwiaXNHcm91cCgpXCJcbiAgICBbY2xhc3MuZmQtbmF2aWdhdGlvbl9faXRlbS0tb3ZlcmZsb3ddPVwiX2hpZGRlbigpXCJcbiAgICBbY2xhc3MuZmQtbmF2aWdhdGlvbl9faXRlbS0tY2hpbGRdPVwibm9ybWFsaXplZExldmVsKCkgPiAyXCJcbiAgICBbY2xhc3MuZmQtbmF2aWdhdGlvbl9faXRlbS0td2l0aC1leHBhbmRlcl09XCJcbiAgICAgICAgY2hpbGROYXZpZ2F0aW9uTGlzdENvbXBvbmVudCgpICYmIG5vcm1hbGl6ZWRMZXZlbCgpIDwgMyAmJiBsaW5rQ29tcG9uZW50Py5fcm91dGVyTGlua1xuICAgIFwiXG4gICAgYXJpYS1jdXJyZW50PVwicGFnZVwiXG4gICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1JvdXRlckxpbmtBY3RpdmUoKSB8fCAoY2hpbGRyZW5BY3RpdmUoKSAmJiBuYXZpZ2F0aW9uQ29tcG9uZW50LmlzU25hcHBlZCgpKSA/IHRydWUgOiBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImV4cGFuZGVkQXR0cigpXCJcbiAgICBbYXR0ci5hcmlhLWxldmVsXT1cImxldmVsKClcIlxuICAgICNuYXZpZ2F0aW9uSXRlbVxuICAgIHJvbGU9XCJtZW51aXRlbVwiXG4+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxpbmtUZW1wbGF0ZVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGlua1RlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRJbmplY3Rvcl09XCJpbmplY3RvclwiPjwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2ZkYi1uYXZpZ2F0aW9uLWxpbmtdXCI+PC9uZy1jb250ZW50PlxuICAgIDxidXR0b25cbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZSgpXCJcbiAgICAgICAgKm5nSWY9XCJjaGlsZE5hdmlnYXRpb25MaXN0Q29tcG9uZW50KCkgJiYgbm9ybWFsaXplZExldmVsKCkgPCAzICYmIGxpbmtDb21wb25lbnQ/Ll9yb3V0ZXJMaW5rXCJcbiAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgIGNsYXNzPVwiZmQtYnV0dG9uLS1uZXN0ZWQgZmQtbmF2aWdhdGlvbl9fZXhwYW5kZXJcIlxuICAgID5cbiAgICAgICAgPGZkLWljb24gW2dseXBoXT1cInRvZ2dsZUljb24oKVwiPjwvZmQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbjwvZGl2PlxuPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiXG4gICAgICAgIChjaGlsZE5hdmlnYXRpb25MaXN0Q29tcG9uZW50KCkgJiYgIW5hdmlnYXRpb25Db21wb25lbnQuaXNTbmFwcGVkKCkpIHx8XG4gICAgICAgIChuYXZpZ2F0aW9uQ29tcG9uZW50LmlzU25hcHBlZCgpICYmIG5vcm1hbGl6ZWRMZXZlbCgpIDwgMikgfHxcbiAgICAgICAgX2hpZGRlbigpXG4gICAgXCJcbj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2hpbGRyZW5UZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3JdPVwiaW5qZWN0b3JcIj48L25nLXRlbXBsYXRlPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjY2hpbGRyZW5UZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2NoaWxkTmF2aWdhdGlvbkxpc3RzPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJ1bFtmZGItbmF2aWdhdGlvbi1saXN0XVwiPjwvbmctY29udGVudD5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzR3JvdXAoKTsgZWxzZSB3aXRoV3JhcHBlclwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2hpbGROYXZpZ2F0aW9uTGlzdHNcIiBbbmdUZW1wbGF0ZU91dGxldEluamVjdG9yXT1cImluamVjdG9yXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3dpdGhXcmFwcGVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3BvcG92ZXJUZW1wbGF0ZT5cbiAgICAgICAgICAgIDwhLS0gZmQtbmF2aWdhdGlvbl9fbGlzdC1jb250YWluZXIgLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjaGlsZE5hdmlnYXRpb25MaXN0Q29tcG9uZW50KClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1uYXZpZ2F0aW9uX19saXN0LWNvbnRhaW5lcl09XCIhbmF2aWdhdGlvbkNvbXBvbmVudC5pc1NuYXBwZWQoKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmQtbmF2aWdhdGlvbl9fbGlzdC13cmFwcGVyIHBvcG92ZXItd3JhcHBlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImxpbmtDb21wb25lbnQgJiYgbmF2aWdhdGlvbkNvbXBvbmVudC5pc1NuYXBwZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZkLW5hdmlnYXRpb25fX2l0ZW0gZmQtbmF2aWdhdGlvbl9faXRlbS0tdGl0bGUgZmQtbmF2aWdhdGlvbl9faXRlbS0tY2hpbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sZXZlbD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRyZWVpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNSb3V0ZXJMaW5rQWN0aXZlKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtbmF2aWdhdGlvbl9fbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiJGFueShyb3V0ZXJMaW5rKCkpPy5jb21tYW5kc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJjbG9uZWRNYWluTGlua0tleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Nsb25lZE1haW5MaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1uYXZpZ2F0aW9uX19pY29uIHNhcC1pY29uLS1iYXNrZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaW5rQ29tcG9uZW50LnRleHRSZW5kZXJlciFcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZkLW5hdmlnYXRpb25fX3NlbGVjdGlvbi1pbmRpY2F0b3JcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNoaWxkTmF2aWdhdGlvbkxpc3RzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3JdPVwiaW5qZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiX2hpZGRlbigpXCIgW25nSWZFbHNlXT1cInBvcG92ZXJUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY2hpbGROYXZpZ2F0aW9uTGlzdENvbXBvbmVudCgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLW5hdmlnYXRpb25fX2xpc3QtY29udGFpbmVyIGZkLW5hdmlnYXRpb25fX2xpc3QtY29udGFpbmVyLS1zdWJtZW51IGZkLW1lbnVfX3N1Ymxpc3RcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZC1uYXZpZ2F0aW9uX19saXN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGlsZE5hdmlnYXRpb25MaXN0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldEluamVjdG9yXT1cImluamVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -0,0 +1,57 @@
1
+ import { PortalModule } from '@angular/cdk/portal';
2
+ import { AsyncPipe, NgForOf } from '@angular/common';
3
+ import { ChangeDetectionStrategy, Component, Input, TemplateRef, ViewChild, ViewEncapsulation, effect } from '@angular/core';
4
+ import { PopoverService } from '@fundamental-ngx/core/popover';
5
+ import { FdbNavigationListItemComponent } from '../navigation-list-item-component.token';
6
+ import { NavigationListItemComponent } from './navigation-list-item.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/cdk/portal";
9
+ export class NavigationListOverflowItemComponent extends NavigationListItemComponent {
10
+ /** @hidden */
11
+ // eslint-disable-next-line @angular-eslint/no-input-rename
12
+ set _hiddenItems(items) {
13
+ this.hiddenItems().forEach((item) => item.destroyPortal());
14
+ items.forEach((item) => item.createPortal());
15
+ this.hiddenItems.set(items);
16
+ }
17
+ /** @hidden */
18
+ constructor() {
19
+ super();
20
+ /** @hidden */
21
+ this.additionalBodyClass = 'fd-navigation__list-container fd-navigation__list-container--menu';
22
+ effect(() => {
23
+ const items = this.hiddenItems();
24
+ this.hasPortalChildren.set(items.length > 0);
25
+ if (items.length === 0) {
26
+ return;
27
+ }
28
+ }, {
29
+ allowSignalWrites: true
30
+ });
31
+ }
32
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: NavigationListOverflowItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: NavigationListOverflowItemComponent, isStandalone: true, selector: "li[fdb-navigation-list-overflow-item]", inputs: { _hiddenItems: ["hiddenItems", "_hiddenItems"] }, providers: [
34
+ PopoverService,
35
+ {
36
+ provide: FdbNavigationListItemComponent,
37
+ useExisting: NavigationListOverflowItemComponent
38
+ }
39
+ ], viewQueries: [{ propertyName: "_portal", first: true, predicate: ["childrenTemplate"], descendants: true, read: TemplateRef }], usesInheritance: true, ngImport: i0, template: "<div\n class=\"fd-navigation__item\"\n [class.fd-navigation__item--group]=\"isGroup()\"\n [class.fd-navigation__item--child]=\"parentNavigationListComponent.parentListComponent?.isParentGroupChild()\"\n aria-current=\"page\"\n [attr.aria-selected]=\"childrenActive() && navigationComponent.isSnapped() ? true : null\"\n [attr.aria-expanded]=\"expandedAttr()\"\n [attr.aria-level]=\"1\"\n #navigationItem\n role=\"menuitem\"\n>\n <ng-content select=\"[fdb-navigation-link]\"></ng-content>\n</div>\n<!-- Detach elements from their hosts immediately to fix issue with flickering elements. -->\n<ul hidden>\n <ng-template *ngFor=\"let item of hiddenItems()\" [cdkPortalOutlet]=\"item.domPortal\"></ng-template>\n</ul>\n<ng-template #childrenTemplate>\n <div class=\"fd-navigation__list-container--menu\">\n <ul class=\"fd-navigation__list fd-navigation__list--parent-items fd-menu__list\">\n <ng-template *ngFor=\"let item of hiddenItems()\" [cdkPortalOutlet]=\"item.domPortal\"></ng-template>\n </ul>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i1.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
40
+ }
41
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: NavigationListOverflowItemComponent, decorators: [{
42
+ type: Component,
43
+ args: [{ selector: 'li[fdb-navigation-list-overflow-item]', standalone: true, imports: [PortalModule, AsyncPipe, NgForOf], providers: [
44
+ PopoverService,
45
+ {
46
+ provide: FdbNavigationListItemComponent,
47
+ useExisting: NavigationListOverflowItemComponent
48
+ }
49
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"fd-navigation__item\"\n [class.fd-navigation__item--group]=\"isGroup()\"\n [class.fd-navigation__item--child]=\"parentNavigationListComponent.parentListComponent?.isParentGroupChild()\"\n aria-current=\"page\"\n [attr.aria-selected]=\"childrenActive() && navigationComponent.isSnapped() ? true : null\"\n [attr.aria-expanded]=\"expandedAttr()\"\n [attr.aria-level]=\"1\"\n #navigationItem\n role=\"menuitem\"\n>\n <ng-content select=\"[fdb-navigation-link]\"></ng-content>\n</div>\n<!-- Detach elements from their hosts immediately to fix issue with flickering elements. -->\n<ul hidden>\n <ng-template *ngFor=\"let item of hiddenItems()\" [cdkPortalOutlet]=\"item.domPortal\"></ng-template>\n</ul>\n<ng-template #childrenTemplate>\n <div class=\"fd-navigation__list-container--menu\">\n <ul class=\"fd-navigation__list fd-navigation__list--parent-items fd-menu__list\">\n <ng-template *ngFor=\"let item of hiddenItems()\" [cdkPortalOutlet]=\"item.domPortal\"></ng-template>\n </ul>\n </div>\n</ng-template>\n" }]
50
+ }], ctorParameters: function () { return []; }, propDecorators: { _hiddenItems: [{
51
+ type: Input,
52
+ args: ['hiddenItems']
53
+ }], _portal: [{
54
+ type: ViewChild,
55
+ args: ['childrenTemplate', { read: TemplateRef }]
56
+ }] } });
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi1saXN0LW92ZXJmbG93LWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9idHAvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLWxpc3QvbmF2aWdhdGlvbi1saXN0LW92ZXJmbG93LWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9idHAvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLWxpc3QvbmF2aWdhdGlvbi1saXN0LW92ZXJmbG93LWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDekYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7OztBQWtCL0UsTUFBTSxPQUFPLG1DQUFvQyxTQUFRLDJCQUEyQjtJQUNoRixjQUFjO0lBQ2QsMkRBQTJEO0lBQzNELElBQ0ksWUFBWSxDQUFDLEtBQXVDO1FBQ3BELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQzNELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFTRCxjQUFjO0lBQ2Q7UUFDSSxLQUFLLEVBQUUsQ0FBQztRQUxaLGNBQWM7UUFDTCx3QkFBbUIsR0FBRyxtRUFBbUUsQ0FBQztRQUsvRixNQUFNLENBQ0YsR0FBRyxFQUFFO1lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNwQixPQUFPO2FBQ1Y7UUFDTCxDQUFDLEVBQ0Q7WUFDSSxpQkFBaUIsRUFBRSxJQUFJO1NBQzFCLENBQ0osQ0FBQztJQUNOLENBQUM7OEdBaENRLG1DQUFtQztrR0FBbkMsbUNBQW1DLCtJQVhqQztZQUNQLGNBQWM7WUFDZDtnQkFDSSxPQUFPLEVBQUUsOEJBQThCO2dCQUN2QyxXQUFXLEVBQUUsbUNBQW1DO2FBQ25EO1NBQ0osa0hBZ0JzQyxXQUFXLG9EQzFDdEQsa2tDQXdCQSwyQ0RMYyxZQUFZLGtNQUFhLE9BQU87OzJGQVlqQyxtQ0FBbUM7a0JBaEIvQyxTQUFTOytCQUVJLHVDQUF1QyxjQUNyQyxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxhQUNoQzt3QkFDUCxjQUFjO3dCQUNkOzRCQUNJLE9BQU8sRUFBRSw4QkFBOEI7NEJBQ3ZDLFdBQVcscUNBQXFDO3lCQUNuRDtxQkFDSixpQkFFYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNOzBFQU0zQyxZQUFZO3NCQURmLEtBQUs7dUJBQUMsYUFBYTtnQkFTcEIsT0FBTztzQkFETixTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvcnRhbE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0Zvck9mIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIElucHV0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBlZmZlY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQb3BvdmVyU2VydmljZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9wb3BvdmVyJztcbmltcG9ydCB7IEZkYk5hdmlnYXRpb25MaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL25hdmlnYXRpb24tbGlzdC1pdGVtLWNvbXBvbmVudC50b2tlbic7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uTGlzdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL25hdmlnYXRpb24tbGlzdC1pdGVtLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdsaVtmZGItbmF2aWdhdGlvbi1saXN0LW92ZXJmbG93LWl0ZW1dJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtQb3J0YWxNb2R1bGUsIEFzeW5jUGlwZSwgTmdGb3JPZl0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIFBvcG92ZXJTZXJ2aWNlLFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBGZGJOYXZpZ2F0aW9uTGlzdEl0ZW1Db21wb25lbnQsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogTmF2aWdhdGlvbkxpc3RPdmVyZmxvd0l0ZW1Db21wb25lbnRcbiAgICAgICAgfVxuICAgIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL25hdmlnYXRpb24tbGlzdC1vdmVyZmxvdy1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE5hdmlnYXRpb25MaXN0T3ZlcmZsb3dJdGVtQ29tcG9uZW50IGV4dGVuZHMgTmF2aWdhdGlvbkxpc3RJdGVtQ29tcG9uZW50IHtcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXQtcmVuYW1lXG4gICAgQElucHV0KCdoaWRkZW5JdGVtcycpXG4gICAgc2V0IF9oaWRkZW5JdGVtcyhpdGVtczogRmRiTmF2aWdhdGlvbkxpc3RJdGVtQ29tcG9uZW50W10pIHtcbiAgICAgICAgdGhpcy5oaWRkZW5JdGVtcygpLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0uZGVzdHJveVBvcnRhbCgpKTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4gaXRlbS5jcmVhdGVQb3J0YWwoKSk7XG4gICAgICAgIHRoaXMuaGlkZGVuSXRlbXMuc2V0KGl0ZW1zKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoJ2NoaWxkcmVuVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgX3BvcnRhbDogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb3ZlcnJpZGUgYWRkaXRpb25hbEJvZHlDbGFzcyA9ICdmZC1uYXZpZ2F0aW9uX19saXN0LWNvbnRhaW5lciBmZC1uYXZpZ2F0aW9uX19saXN0LWNvbnRhaW5lci0tbWVudSc7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmhpZGRlbkl0ZW1zKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNQb3J0YWxDaGlsZHJlbi5zZXQoaXRlbXMubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICBjbGFzcz1cImZkLW5hdmlnYXRpb25fX2l0ZW1cIlxuICAgIFtjbGFzcy5mZC1uYXZpZ2F0aW9uX19pdGVtLS1ncm91cF09XCJpc0dyb3VwKClcIlxuICAgIFtjbGFzcy5mZC1uYXZpZ2F0aW9uX19pdGVtLS1jaGlsZF09XCJwYXJlbnROYXZpZ2F0aW9uTGlzdENvbXBvbmVudC5wYXJlbnRMaXN0Q29tcG9uZW50Py5pc1BhcmVudEdyb3VwQ2hpbGQoKVwiXG4gICAgYXJpYS1jdXJyZW50PVwicGFnZVwiXG4gICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJjaGlsZHJlbkFjdGl2ZSgpICYmIG5hdmlnYXRpb25Db21wb25lbnQuaXNTbmFwcGVkKCkgPyB0cnVlIDogbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJleHBhbmRlZEF0dHIoKVwiXG4gICAgW2F0dHIuYXJpYS1sZXZlbF09XCIxXCJcbiAgICAjbmF2aWdhdGlvbkl0ZW1cbiAgICByb2xlPVwibWVudWl0ZW1cIlxuPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltmZGItbmF2aWdhdGlvbi1saW5rXVwiPjwvbmctY29udGVudD5cbjwvZGl2PlxuPCEtLSBEZXRhY2ggZWxlbWVudHMgZnJvbSB0aGVpciBob3N0cyBpbW1lZGlhdGVseSB0byBmaXggaXNzdWUgd2l0aCBmbGlja2VyaW5nIGVsZW1lbnRzLiAtLT5cbjx1bCBoaWRkZW4+XG4gICAgPG5nLXRlbXBsYXRlICpuZ0Zvcj1cImxldCBpdGVtIG9mIGhpZGRlbkl0ZW1zKClcIiBbY2RrUG9ydGFsT3V0bGV0XT1cIml0ZW0uZG9tUG9ydGFsXCI+PC9uZy10ZW1wbGF0ZT5cbjwvdWw+XG48bmctdGVtcGxhdGUgI2NoaWxkcmVuVGVtcGxhdGU+XG4gICAgPGRpdiBjbGFzcz1cImZkLW5hdmlnYXRpb25fX2xpc3QtY29udGFpbmVyLS1tZW51XCI+XG4gICAgICAgIDx1bCBjbGFzcz1cImZkLW5hdmlnYXRpb25fX2xpc3QgZmQtbmF2aWdhdGlvbl9fbGlzdC0tcGFyZW50LWl0ZW1zIGZkLW1lbnVfX2xpc3RcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBoaWRkZW5JdGVtcygpXCIgW2Nka1BvcnRhbE91dGxldF09XCJpdGVtLmRvbVBvcnRhbFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19