@tolle_/tolle-ui 18.2.29 → 18.2.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/accordion-item.component.mjs +5 -11
- package/esm2022/lib/accordion.component.mjs +4 -9
- package/esm2022/lib/alert-dialog-dynamic.component.mjs +5 -10
- package/esm2022/lib/alert-dialog.component.mjs +44 -59
- package/esm2022/lib/alert.component.mjs +5 -11
- package/esm2022/lib/aspect-ratio.component.mjs +119 -0
- package/esm2022/lib/attachment.component.mjs +334 -0
- package/esm2022/lib/avatar-fallback.component.mjs +3 -3
- package/esm2022/lib/avatar.component.mjs +4 -9
- package/esm2022/lib/badge.component.mjs +4 -9
- package/esm2022/lib/breadcrumb-item.component.mjs +3 -3
- package/esm2022/lib/breadcrumb-link.component.mjs +3 -3
- package/esm2022/lib/breadcrumb-separator.component.mjs +3 -3
- package/esm2022/lib/breadcrumb.component.mjs +3 -3
- package/esm2022/lib/bubble.component.mjs +301 -0
- package/esm2022/lib/button.component.mjs +5 -11
- package/esm2022/lib/calendar.component.mjs +5 -11
- package/esm2022/lib/card.component.mjs +14 -43
- package/esm2022/lib/carousel/carousel.component.mjs +5 -12
- package/esm2022/lib/chain-of-thought.component.mjs +380 -0
- package/esm2022/lib/chart-pie.component.mjs +386 -0
- package/esm2022/lib/chart.component.mjs +1146 -0
- package/esm2022/lib/chart.service.mjs +555 -0
- package/esm2022/lib/checkbox.component.mjs +5 -11
- package/esm2022/lib/checkpoint.component.mjs +134 -0
- package/esm2022/lib/collapsible.component.mjs +4 -11
- package/esm2022/lib/combobox.component.mjs +372 -0
- package/esm2022/lib/command-dialog.component.mjs +164 -0
- package/esm2022/lib/command.component.mjs +514 -0
- package/esm2022/lib/command.service.mjs +130 -0
- package/esm2022/lib/confirmation.component.mjs +219 -0
- package/esm2022/lib/context-menu-trigger.directive.mjs +36 -0
- package/esm2022/lib/context-menu.component.mjs +460 -0
- package/esm2022/lib/context-menu.service.mjs +121 -0
- package/esm2022/lib/context.component.mjs +377 -0
- package/esm2022/lib/conversation.component.mjs +442 -0
- package/esm2022/lib/country-selector.component.mjs +5 -11
- package/esm2022/lib/data-table.component.mjs +59 -12
- package/esm2022/lib/date-picker.component.mjs +251 -198
- package/esm2022/lib/date-range-picker.component.mjs +224 -116
- package/esm2022/lib/date-time-picker.component.mjs +506 -0
- package/esm2022/lib/direction.component.mjs +79 -0
- package/esm2022/lib/dropdown-item.component.mjs +3 -3
- package/esm2022/lib/dropdown-label.component.mjs +3 -3
- package/esm2022/lib/dropdown-menu.component.mjs +3 -3
- package/esm2022/lib/dropdown-separator.component.mjs +3 -3
- package/esm2022/lib/dropdown-trigger.directive.mjs +6 -4
- package/esm2022/lib/empty-state.component.mjs +4 -9
- package/esm2022/lib/field.component.mjs +394 -0
- package/esm2022/lib/hover-card.component.mjs +6 -16
- package/esm2022/lib/inline-citation.component.mjs +263 -0
- package/esm2022/lib/input-group.component.mjs +418 -0
- package/esm2022/lib/input.component.mjs +5 -11
- package/esm2022/lib/item.component.mjs +243 -0
- package/esm2022/lib/kbd.component.mjs +82 -0
- package/esm2022/lib/label.component.mjs +4 -9
- package/esm2022/lib/marker.component.mjs +135 -0
- package/esm2022/lib/masked-input.component.mjs +5 -11
- package/esm2022/lib/menubar.component.mjs +683 -0
- package/esm2022/lib/message-scroller.component.mjs +353 -0
- package/esm2022/lib/message-scroller.service.mjs +157 -0
- package/esm2022/lib/message.component.mjs +228 -0
- package/esm2022/lib/model-selector.component.mjs +310 -0
- package/esm2022/lib/multi-select.component.mjs +155 -72
- package/esm2022/lib/native-select.component.mjs +201 -0
- package/esm2022/lib/navigation-menu.component.mjs +642 -0
- package/esm2022/lib/otp-group.component.mjs +3 -3
- package/esm2022/lib/otp-slot.component.mjs +4 -9
- package/esm2022/lib/otp.component.mjs +5 -11
- package/esm2022/lib/pagination.component.mjs +7 -10
- package/esm2022/lib/plan.component.mjs +335 -0
- package/esm2022/lib/popover-content.component.mjs +4 -9
- package/esm2022/lib/popover.component.mjs +15 -13
- package/esm2022/lib/progress.component.mjs +4 -9
- package/esm2022/lib/prompt-input.component.mjs +526 -0
- package/esm2022/lib/queue.component.mjs +280 -0
- package/esm2022/lib/radio-group.component.mjs +6 -13
- package/esm2022/lib/radio-item.component.mjs +4 -9
- package/esm2022/lib/range-calendar.component.mjs +5 -11
- package/esm2022/lib/reasoning.component.mjs +335 -0
- package/esm2022/lib/resizable.component.mjs +219 -0
- package/esm2022/lib/segment.component.mjs +17 -7
- package/esm2022/lib/select-group.component.mjs +4 -8
- package/esm2022/lib/select-item.component.mjs +4 -9
- package/esm2022/lib/select-separator.component.mjs +4 -8
- package/esm2022/lib/select.component.mjs +133 -49
- package/esm2022/lib/separator.component.mjs +4 -9
- package/esm2022/lib/sheet.component.mjs +38 -56
- package/esm2022/lib/shimmer.component.mjs +84 -0
- package/esm2022/lib/sidebar.component.mjs +11 -1
- package/esm2022/lib/skeleton.component.mjs +4 -9
- package/esm2022/lib/sources.component.mjs +452 -0
- package/esm2022/lib/spinner.component.mjs +68 -0
- package/esm2022/lib/suggestion.component.mjs +207 -0
- package/esm2022/lib/switch.component.mjs +5 -11
- package/esm2022/lib/table.component.mjs +213 -0
- package/esm2022/lib/tabs.component.mjs +4 -11
- package/esm2022/lib/tag-input.component.mjs +5 -11
- package/esm2022/lib/task.component.mjs +359 -0
- package/esm2022/lib/textarea.component.mjs +5 -11
- package/esm2022/lib/theme.service.mjs +17 -6
- package/esm2022/lib/time-picker.component.mjs +923 -0
- package/esm2022/lib/toast.service.mjs +3 -2
- package/esm2022/lib/toaster.component.mjs +76 -39
- package/esm2022/lib/toggle-group.component.mjs +4 -9
- package/esm2022/lib/toggle.component.mjs +5 -11
- package/esm2022/lib/tool.component.mjs +462 -0
- package/esm2022/lib/typography.component.mjs +83 -0
- package/esm2022/lib/utils/color.mjs +140 -19
- package/esm2022/public-api.mjs +61 -1
- package/fesm2022/tolle-ui.mjs +16453 -1024
- package/fesm2022/tolle-ui.mjs.map +1 -1
- package/lib/alert-dialog.component.d.ts +10 -2
- package/lib/aspect-ratio.component.d.ts +20 -0
- package/lib/attachment.component.d.ts +101 -0
- package/lib/bubble.component.d.ts +112 -0
- package/lib/chain-of-thought.component.d.ts +166 -0
- package/lib/chart-pie.component.d.ts +108 -0
- package/lib/chart.component.d.ts +369 -0
- package/lib/chart.service.d.ts +222 -0
- package/lib/checkpoint.component.d.ts +51 -0
- package/lib/combobox.component.d.ts +90 -0
- package/lib/command-dialog.component.d.ts +53 -0
- package/lib/command.component.d.ts +189 -0
- package/lib/command.service.d.ts +67 -0
- package/lib/confirmation.component.d.ts +70 -0
- package/lib/context-menu-trigger.directive.d.ts +12 -0
- package/lib/context-menu.component.d.ts +41 -0
- package/lib/context-menu.service.d.ts +38 -0
- package/lib/context.component.d.ts +134 -0
- package/lib/conversation.component.d.ts +165 -0
- package/lib/data-table.component.d.ts +26 -1
- package/lib/date-picker.component.d.ts +72 -11
- package/lib/date-range-picker.component.d.ts +63 -6
- package/lib/date-time-picker.component.d.ts +119 -0
- package/lib/direction.component.d.ts +45 -0
- package/lib/field.component.d.ts +201 -0
- package/lib/inline-citation.component.d.ts +103 -0
- package/lib/input-group.component.d.ts +150 -0
- package/lib/item.component.d.ts +154 -0
- package/lib/kbd.component.d.ts +50 -0
- package/lib/marker.component.d.ts +58 -0
- package/lib/menubar.component.d.ts +247 -0
- package/lib/message-scroller.component.d.ts +159 -0
- package/lib/message-scroller.service.d.ts +73 -0
- package/lib/message.component.d.ts +128 -0
- package/lib/model-selector.component.d.ts +103 -0
- package/lib/multi-select.component.d.ts +66 -14
- package/lib/native-select.component.d.ts +57 -0
- package/lib/navigation-menu.component.d.ts +230 -0
- package/lib/plan.component.d.ts +120 -0
- package/lib/popover.component.d.ts +1 -0
- package/lib/prompt-input.component.d.ts +194 -0
- package/lib/queue.component.d.ts +106 -0
- package/lib/reasoning.component.d.ts +127 -0
- package/lib/resizable.component.d.ts +43 -0
- package/lib/segment.component.d.ts +13 -3
- package/lib/select.component.d.ts +37 -5
- package/lib/sheet.component.d.ts +3 -0
- package/lib/shimmer.component.d.ts +38 -0
- package/lib/sidebar.component.d.ts +2 -0
- package/lib/sources.component.d.ts +156 -0
- package/lib/spinner.component.d.ts +29 -0
- package/lib/suggestion.component.d.ts +96 -0
- package/lib/table.component.d.ts +106 -0
- package/lib/task.component.d.ts +151 -0
- package/lib/theme.service.d.ts +9 -0
- package/lib/time-picker.component.d.ts +243 -0
- package/lib/toast.service.d.ts +3 -1
- package/lib/toaster.component.d.ts +26 -9
- package/lib/tool.component.d.ts +158 -0
- package/lib/typography.component.d.ts +32 -0
- package/lib/utils/color.d.ts +19 -5
- package/package.json +1 -1
- package/public-api.d.ts +50 -0
- package/registry/docs-content.json +8480 -1542
- package/registry/llms-full.txt +2679 -319
- package/registry/llms.txt +43 -4
- package/registry/manifest.json +9090 -1742
- package/registry/r/accordion-item.json +1 -1
- package/registry/r/accordion.json +1 -1
- package/registry/r/alert-dialog-dynamic.json +1 -1
- package/registry/r/alert-dialog.json +1 -1
- package/registry/r/alert.json +1 -1
- package/registry/r/attachment.json +23 -0
- package/registry/r/avatar-fallback.json +1 -1
- package/registry/r/avatar.json +1 -1
- package/registry/r/badge.json +1 -1
- package/registry/r/breadcrumb-item.json +1 -1
- package/registry/r/breadcrumb-link.json +1 -1
- package/registry/r/breadcrumb-separator.json +1 -1
- package/registry/r/breadcrumb.json +1 -1
- package/registry/r/bubble.json +23 -0
- package/registry/r/button.json +1 -1
- package/registry/r/calendar.json +1 -1
- package/registry/r/card.json +1 -1
- package/registry/r/carousel.json +1 -1
- package/registry/r/chain-of-thought.json +23 -0
- package/registry/r/chart-pie.json +30 -0
- package/registry/r/chart.json +28 -0
- package/registry/r/checkbox.json +1 -1
- package/registry/r/checkpoint.json +23 -0
- package/registry/r/collapsible.json +1 -1
- package/registry/r/combobox.json +31 -0
- package/registry/r/command-dialog.json +21 -0
- package/registry/r/command.json +26 -0
- package/registry/r/confirmation.json +23 -0
- package/registry/r/context.json +26 -0
- package/registry/r/conversation.json +23 -0
- package/registry/r/country-selector.json +1 -1
- package/registry/r/data-table.json +1 -1
- package/registry/r/date-picker.json +4 -4
- package/registry/r/date-range-picker.json +3 -3
- package/registry/r/date-time-picker.json +28 -0
- package/registry/r/direction.json +16 -0
- package/registry/r/dropdown-item.json +1 -1
- package/registry/r/dropdown-label.json +1 -1
- package/registry/r/dropdown-menu.json +1 -1
- package/registry/r/dropdown-separator.json +1 -1
- package/registry/r/dropdown-trigger.json +1 -1
- package/registry/r/empty-state.json +1 -1
- package/registry/r/field.json +23 -0
- package/registry/r/hover-card.json +1 -1
- package/registry/r/inline-citation.json +26 -0
- package/registry/r/input-group.json +23 -0
- package/registry/r/input.json +1 -1
- package/registry/r/item.json +23 -0
- package/registry/r/kbd.json +23 -0
- package/registry/r/label.json +1 -1
- package/registry/r/marker.json +23 -0
- package/registry/r/masked-input.json +1 -1
- package/registry/r/menubar.json +24 -0
- package/registry/r/message-scroller.json +26 -0
- package/registry/r/message.json +23 -0
- package/registry/r/model-selector.json +32 -0
- package/registry/r/multi-select.json +2 -2
- package/registry/r/native-select.json +23 -0
- package/registry/r/navigation-menu.json +24 -0
- package/registry/r/otp-group.json +1 -1
- package/registry/r/otp-slot.json +1 -1
- package/registry/r/otp.json +1 -1
- package/registry/r/pagination.json +3 -2
- package/registry/r/plan.json +23 -0
- package/registry/r/popover-content.json +1 -1
- package/registry/r/popover.json +1 -1
- package/registry/r/progress.json +1 -1
- package/registry/r/prompt-input.json +23 -0
- package/registry/r/queue.json +23 -0
- package/registry/r/radio-group.json +1 -1
- package/registry/r/radio-item.json +1 -1
- package/registry/r/range-calendar.json +1 -1
- package/registry/r/reasoning.json +23 -0
- package/registry/r/segment.json +1 -1
- package/registry/r/select-group.json +1 -1
- package/registry/r/select-item.json +1 -1
- package/registry/r/select-separator.json +1 -1
- package/registry/r/select.json +4 -3
- package/registry/r/separator.json +1 -1
- package/registry/r/sheet.json +1 -1
- package/registry/r/shimmer.json +23 -0
- package/registry/r/sidebar.json +1 -1
- package/registry/r/skeleton.json +1 -1
- package/registry/r/sources.json +23 -0
- package/registry/r/spinner.json +23 -0
- package/registry/r/suggestion.json +23 -0
- package/registry/r/switch.json +1 -1
- package/registry/r/table.json +21 -0
- package/registry/r/tabs.json +1 -1
- package/registry/r/tag-input.json +1 -1
- package/registry/r/task.json +23 -0
- package/registry/r/textarea.json +1 -1
- package/registry/r/time-picker.json +24 -0
- package/registry/r/toaster.json +2 -2
- package/registry/r/toggle-group.json +1 -1
- package/registry/r/toggle.json +1 -1
- package/registry/r/tool.json +23 -0
- package/registry/r/typography.json +23 -0
- package/registry/registry.json +915 -22
- package/theme.css +109 -8
|
@@ -0,0 +1,683 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Injectable, Input, Output, ViewChild, inject } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, Subscription } from 'rxjs';
|
|
3
|
+
import { computePosition, flip, shift, offset, autoUpdate } from '@floating-ui/dom';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
import { cn } from './utils/cn';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
let menubarMenuCounter = 0;
|
|
8
|
+
/**
|
|
9
|
+
* Coordinates the menus of a single `tolle-menubar`. Provided by
|
|
10
|
+
* `MenubarComponent`, injected by every descendant menu/trigger/content.
|
|
11
|
+
*
|
|
12
|
+
* The defining behaviour of a menu bar lives here: once *any* menu is open,
|
|
13
|
+
* hovering a different trigger switches to it immediately (`hoverEnter`), while
|
|
14
|
+
* hovering with everything closed does nothing.
|
|
15
|
+
*/
|
|
16
|
+
export class MenubarService {
|
|
17
|
+
openIdSource = new BehaviorSubject(null);
|
|
18
|
+
/** Emits the id of the currently open menu, or `null` when all are closed. */
|
|
19
|
+
openId$ = this.openIdSource.asObservable();
|
|
20
|
+
sizeSource = new BehaviorSubject('default');
|
|
21
|
+
/**
|
|
22
|
+
* Emits the bar's size so OnPush triggers re-render when it changes. Reading
|
|
23
|
+
* the parent component's property directly would not mark them dirty.
|
|
24
|
+
*/
|
|
25
|
+
size$ = this.sizeSource.asObservable();
|
|
26
|
+
/** The bar's current size scale. */
|
|
27
|
+
get size() {
|
|
28
|
+
return this.sizeSource.value;
|
|
29
|
+
}
|
|
30
|
+
setSize(size) {
|
|
31
|
+
if (this.sizeSource.value !== size)
|
|
32
|
+
this.sizeSource.next(size);
|
|
33
|
+
}
|
|
34
|
+
/** Registered menus in DOM (registration) order. */
|
|
35
|
+
menus = [];
|
|
36
|
+
/** Id of the open menu, or `null`. */
|
|
37
|
+
get openId() {
|
|
38
|
+
return this.openIdSource.value;
|
|
39
|
+
}
|
|
40
|
+
/** True while one of the bar's menus is open. */
|
|
41
|
+
get isAnyOpen() {
|
|
42
|
+
return this.openIdSource.value !== null;
|
|
43
|
+
}
|
|
44
|
+
register(menu) {
|
|
45
|
+
if (this.menus.indexOf(menu) === -1)
|
|
46
|
+
this.menus.push(menu);
|
|
47
|
+
}
|
|
48
|
+
unregister(menu) {
|
|
49
|
+
const i = this.menus.indexOf(menu);
|
|
50
|
+
if (i > -1)
|
|
51
|
+
this.menus.splice(i, 1);
|
|
52
|
+
if (this.openId === menu.id)
|
|
53
|
+
this.close();
|
|
54
|
+
}
|
|
55
|
+
isOpen(id) {
|
|
56
|
+
return this.openId === id;
|
|
57
|
+
}
|
|
58
|
+
open(id) {
|
|
59
|
+
if (this.openId !== id)
|
|
60
|
+
this.openIdSource.next(id);
|
|
61
|
+
}
|
|
62
|
+
close() {
|
|
63
|
+
if (this.openId !== null)
|
|
64
|
+
this.openIdSource.next(null);
|
|
65
|
+
}
|
|
66
|
+
toggle(id) {
|
|
67
|
+
if (this.openId === id)
|
|
68
|
+
this.close();
|
|
69
|
+
else
|
|
70
|
+
this.open(id);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Pointer entered a trigger. Only switches menus when the bar is already
|
|
74
|
+
* "active" (something open) — this is what makes a menu bar feel native.
|
|
75
|
+
*/
|
|
76
|
+
hoverEnter(id) {
|
|
77
|
+
if (this.isAnyOpen)
|
|
78
|
+
this.open(id);
|
|
79
|
+
}
|
|
80
|
+
/** Moves focus to the previous/next menu, keeping the open state. */
|
|
81
|
+
moveMenu(delta) {
|
|
82
|
+
if (!this.menus.length)
|
|
83
|
+
return;
|
|
84
|
+
const current = this.menus.findIndex(m => m.id === this.openId);
|
|
85
|
+
const from = current > -1 ? current : this.indexOfFocusedTrigger();
|
|
86
|
+
const next = from < 0
|
|
87
|
+
? delta > 0
|
|
88
|
+
? 0
|
|
89
|
+
: this.menus.length - 1
|
|
90
|
+
: (from + delta + this.menus.length) % this.menus.length;
|
|
91
|
+
const target = this.menus[next];
|
|
92
|
+
if (this.isAnyOpen)
|
|
93
|
+
this.open(target.id);
|
|
94
|
+
target.triggerElement?.focus();
|
|
95
|
+
}
|
|
96
|
+
/** Moves focus between the enabled items of the currently open menu. */
|
|
97
|
+
moveItem(delta) {
|
|
98
|
+
const items = this.openItems();
|
|
99
|
+
if (!items.length)
|
|
100
|
+
return;
|
|
101
|
+
const current = items.indexOf(document.activeElement);
|
|
102
|
+
const next = current < 0
|
|
103
|
+
? delta > 0
|
|
104
|
+
? 0
|
|
105
|
+
: items.length - 1
|
|
106
|
+
: (current + delta + items.length) % items.length;
|
|
107
|
+
items[next].focus();
|
|
108
|
+
}
|
|
109
|
+
/** Focuses the trigger of the given menu (used when Escape closes a menu). */
|
|
110
|
+
focusTrigger(id) {
|
|
111
|
+
this.menus.find(m => m.id === id)?.triggerElement?.focus();
|
|
112
|
+
}
|
|
113
|
+
openItems() {
|
|
114
|
+
const content = this.menus.find(m => m.id === this.openId)?.contentElement;
|
|
115
|
+
if (!content)
|
|
116
|
+
return [];
|
|
117
|
+
return Array.from(content.querySelectorAll('[role="menuitem"]:not([data-disabled])'));
|
|
118
|
+
}
|
|
119
|
+
indexOfFocusedTrigger() {
|
|
120
|
+
const active = document.activeElement;
|
|
121
|
+
return this.menus.findIndex(m => !!m.triggerElement && m.triggerElement === active);
|
|
122
|
+
}
|
|
123
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
124
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarService });
|
|
125
|
+
}
|
|
126
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarService, decorators: [{
|
|
127
|
+
type: Injectable
|
|
128
|
+
}] });
|
|
129
|
+
const menubarVariants = cva('flex items-center gap-1 rounded-md border border-border bg-background shadow-sm', {
|
|
130
|
+
variants: {
|
|
131
|
+
size: {
|
|
132
|
+
sm: 'h-8 p-0.5',
|
|
133
|
+
default: 'h-10 p-1',
|
|
134
|
+
lg: 'h-12 p-1.5',
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
defaultVariants: {
|
|
138
|
+
size: 'default',
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
const menubarTriggerVariants = cva('flex select-none items-center rounded-sm font-medium outline-none transition-colors ' +
|
|
142
|
+
'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground ' +
|
|
143
|
+
'data-[state=open]:bg-accent data-[state=open]:text-accent-foreground ' +
|
|
144
|
+
'disabled:pointer-events-none disabled:opacity-50', {
|
|
145
|
+
variants: {
|
|
146
|
+
size: {
|
|
147
|
+
sm: 'h-7 px-2 text-xs',
|
|
148
|
+
default: 'h-8 px-3 text-sm',
|
|
149
|
+
lg: 'h-9 px-4 text-sm',
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
defaultVariants: {
|
|
153
|
+
size: 'default',
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
const menubarItemVariants = cva('relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors ' +
|
|
157
|
+
'focus:bg-accent focus:text-accent-foreground hover:bg-accent hover:text-accent-foreground ' +
|
|
158
|
+
'data-[disabled]:pointer-events-none data-[disabled]:opacity-50', {
|
|
159
|
+
variants: {
|
|
160
|
+
variant: {
|
|
161
|
+
default: 'text-popover-foreground',
|
|
162
|
+
destructive: 'text-destructive focus:bg-destructive/10 hover:bg-destructive/10',
|
|
163
|
+
},
|
|
164
|
+
inset: {
|
|
165
|
+
true: 'pl-8',
|
|
166
|
+
false: '',
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
defaultVariants: {
|
|
170
|
+
variant: 'default',
|
|
171
|
+
inset: false,
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
/**
|
|
175
|
+
* Desktop-application style menu bar.
|
|
176
|
+
*
|
|
177
|
+
* ```html
|
|
178
|
+
* <tolle-menubar>
|
|
179
|
+
* <tolle-menubar-menu>
|
|
180
|
+
* <tolle-menubar-trigger>File</tolle-menubar-trigger>
|
|
181
|
+
* <tolle-menubar-content>
|
|
182
|
+
* <tolle-menubar-label>Document</tolle-menubar-label>
|
|
183
|
+
* <tolle-menubar-item (select)="onNew()">New</tolle-menubar-item>
|
|
184
|
+
* <tolle-menubar-separator />
|
|
185
|
+
* <tolle-menubar-item variant="destructive">Delete</tolle-menubar-item>
|
|
186
|
+
* </tolle-menubar-content>
|
|
187
|
+
* </tolle-menubar-menu>
|
|
188
|
+
* </tolle-menubar>
|
|
189
|
+
* ```
|
|
190
|
+
* @new
|
|
191
|
+
*/
|
|
192
|
+
export class MenubarComponent {
|
|
193
|
+
/** Height/padding scale, inherited by every trigger in the bar. @default 'default' */
|
|
194
|
+
size = 'default';
|
|
195
|
+
/** Extra Tailwind classes merged onto the bar via `cn()` (last-wins). */
|
|
196
|
+
class = '';
|
|
197
|
+
/** Emitted with the id of the menu that opened, or `null` when the bar closes. */
|
|
198
|
+
openChange = new EventEmitter();
|
|
199
|
+
service = inject(MenubarService);
|
|
200
|
+
host = inject(ElementRef);
|
|
201
|
+
sub = new Subscription();
|
|
202
|
+
listening = false;
|
|
203
|
+
get computedClass() {
|
|
204
|
+
return cn(menubarVariants({ size: this.size }), this.class);
|
|
205
|
+
}
|
|
206
|
+
ngOnChanges() {
|
|
207
|
+
// Push size into the service so OnPush triggers get told about it.
|
|
208
|
+
this.service.setSize(this.size ?? 'default');
|
|
209
|
+
}
|
|
210
|
+
ngOnInit() {
|
|
211
|
+
this.service.setSize(this.size ?? 'default');
|
|
212
|
+
this.sub.add(this.service.openId$.subscribe(id => {
|
|
213
|
+
this.openChange.emit(id);
|
|
214
|
+
if (id !== null)
|
|
215
|
+
this.startListening();
|
|
216
|
+
else
|
|
217
|
+
this.stopListening();
|
|
218
|
+
}));
|
|
219
|
+
}
|
|
220
|
+
onKeydown(event) {
|
|
221
|
+
switch (event.key) {
|
|
222
|
+
case 'ArrowRight':
|
|
223
|
+
event.preventDefault();
|
|
224
|
+
this.service.moveMenu(1);
|
|
225
|
+
break;
|
|
226
|
+
case 'ArrowLeft':
|
|
227
|
+
event.preventDefault();
|
|
228
|
+
this.service.moveMenu(-1);
|
|
229
|
+
break;
|
|
230
|
+
case 'ArrowDown':
|
|
231
|
+
if (!this.service.isAnyOpen)
|
|
232
|
+
break;
|
|
233
|
+
event.preventDefault();
|
|
234
|
+
this.service.moveItem(1);
|
|
235
|
+
break;
|
|
236
|
+
case 'ArrowUp':
|
|
237
|
+
if (!this.service.isAnyOpen)
|
|
238
|
+
break;
|
|
239
|
+
event.preventDefault();
|
|
240
|
+
this.service.moveItem(-1);
|
|
241
|
+
break;
|
|
242
|
+
case 'Escape': {
|
|
243
|
+
const openId = this.service.openId;
|
|
244
|
+
if (openId === null)
|
|
245
|
+
break;
|
|
246
|
+
event.preventDefault();
|
|
247
|
+
this.service.close();
|
|
248
|
+
this.service.focusTrigger(openId);
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
default:
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Capture phase so nested containers that stopPropagation() on their root
|
|
256
|
+
// (modal, sheet) cannot prevent the outside click from reaching us.
|
|
257
|
+
outsideClick = (event) => {
|
|
258
|
+
if (!this.host.nativeElement.contains(event.target))
|
|
259
|
+
this.service.close();
|
|
260
|
+
};
|
|
261
|
+
startListening() {
|
|
262
|
+
if (this.listening)
|
|
263
|
+
return;
|
|
264
|
+
this.listening = true;
|
|
265
|
+
document.addEventListener('pointerdown', this.outsideClick, true);
|
|
266
|
+
}
|
|
267
|
+
stopListening() {
|
|
268
|
+
if (!this.listening)
|
|
269
|
+
return;
|
|
270
|
+
this.listening = false;
|
|
271
|
+
document.removeEventListener('pointerdown', this.outsideClick, true);
|
|
272
|
+
}
|
|
273
|
+
ngOnDestroy() {
|
|
274
|
+
this.sub.unsubscribe();
|
|
275
|
+
this.stopListening();
|
|
276
|
+
}
|
|
277
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
278
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenubarComponent, isStandalone: true, selector: "tolle-menubar", inputs: { size: "size", class: "class" }, outputs: { openChange: "openChange" }, host: { attributes: { "role": "menubar" }, listeners: { "keydown": "onKeydown($event)" }, properties: { "class": "computedClass" } }, providers: [MenubarService], usesOnChanges: true, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
279
|
+
}
|
|
280
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarComponent, decorators: [{
|
|
281
|
+
type: Component,
|
|
282
|
+
args: [{
|
|
283
|
+
selector: 'tolle-menubar',
|
|
284
|
+
standalone: true,
|
|
285
|
+
imports: [],
|
|
286
|
+
providers: [MenubarService],
|
|
287
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
288
|
+
host: {
|
|
289
|
+
role: 'menubar',
|
|
290
|
+
'[class]': 'computedClass',
|
|
291
|
+
'(keydown)': 'onKeydown($event)',
|
|
292
|
+
},
|
|
293
|
+
template: `<ng-content></ng-content>`,
|
|
294
|
+
}]
|
|
295
|
+
}], propDecorators: { size: [{
|
|
296
|
+
type: Input
|
|
297
|
+
}], class: [{
|
|
298
|
+
type: Input
|
|
299
|
+
}], openChange: [{
|
|
300
|
+
type: Output
|
|
301
|
+
}] } });
|
|
302
|
+
/** A single menu in the bar — wraps one trigger and its content panel. */
|
|
303
|
+
export class MenubarMenuComponent {
|
|
304
|
+
/** Explicit id for the menu; one is generated when omitted. */
|
|
305
|
+
id = `tolle-menubar-menu-${menubarMenuCounter++}`;
|
|
306
|
+
triggerElement = null;
|
|
307
|
+
contentElement = null;
|
|
308
|
+
service = inject(MenubarService);
|
|
309
|
+
get triggerId() {
|
|
310
|
+
return `${this.id}-trigger`;
|
|
311
|
+
}
|
|
312
|
+
get isOpen() {
|
|
313
|
+
return this.service.isOpen(this.id);
|
|
314
|
+
}
|
|
315
|
+
ngOnInit() {
|
|
316
|
+
this.service.register(this);
|
|
317
|
+
}
|
|
318
|
+
ngOnDestroy() {
|
|
319
|
+
this.service.unregister(this);
|
|
320
|
+
}
|
|
321
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
322
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenubarMenuComponent, isStandalone: true, selector: "tolle-menubar-menu", inputs: { id: "id" }, host: { attributes: { "role": "none" }, properties: { "class": "'relative inline-flex'" } }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
323
|
+
}
|
|
324
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarMenuComponent, decorators: [{
|
|
325
|
+
type: Component,
|
|
326
|
+
args: [{
|
|
327
|
+
selector: 'tolle-menubar-menu',
|
|
328
|
+
standalone: true,
|
|
329
|
+
imports: [],
|
|
330
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
331
|
+
// Presentational so the menubar "owns" the trigger's menuitem role directly
|
|
332
|
+
// even though this wrapper element sits in between.
|
|
333
|
+
host: { role: 'none', '[class]': "'relative inline-flex'" },
|
|
334
|
+
template: `<ng-content></ng-content>`,
|
|
335
|
+
}]
|
|
336
|
+
}], propDecorators: { id: [{
|
|
337
|
+
type: Input
|
|
338
|
+
}] } });
|
|
339
|
+
/** Button that opens its menu on click, and on hover once the bar is active. */
|
|
340
|
+
export class MenubarTriggerComponent {
|
|
341
|
+
/**
|
|
342
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
343
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
344
|
+
* rendering the class it was born with.
|
|
345
|
+
*/
|
|
346
|
+
ngOnChanges() {
|
|
347
|
+
this.cdr.markForCheck();
|
|
348
|
+
}
|
|
349
|
+
/** Prevents the menu from opening. @default false */
|
|
350
|
+
disabled = false;
|
|
351
|
+
/** Overrides the size inherited from `tolle-menubar`. */
|
|
352
|
+
size;
|
|
353
|
+
/** Extra Tailwind classes merged onto the trigger via `cn()` (last-wins). */
|
|
354
|
+
class = '';
|
|
355
|
+
menu = inject(MenubarMenuComponent);
|
|
356
|
+
service = inject(MenubarService);
|
|
357
|
+
cdr = inject(ChangeDetectorRef);
|
|
358
|
+
sub = new Subscription();
|
|
359
|
+
constructor() {
|
|
360
|
+
this.sub.add(this.service.openId$.subscribe(() => this.cdr.markForCheck()));
|
|
361
|
+
// The bar's size is not an input of this component, so nothing else would
|
|
362
|
+
// mark an OnPush trigger dirty when it changes.
|
|
363
|
+
this.sub.add(this.service.size$.subscribe(() => this.cdr.markForCheck()));
|
|
364
|
+
}
|
|
365
|
+
set triggerRef(ref) {
|
|
366
|
+
this.menu.triggerElement = ref?.nativeElement ?? null;
|
|
367
|
+
}
|
|
368
|
+
get isOpen() {
|
|
369
|
+
return this.menu.isOpen;
|
|
370
|
+
}
|
|
371
|
+
get computedClass() {
|
|
372
|
+
return cn(menubarTriggerVariants({ size: this.size ?? this.service.size }), this.class);
|
|
373
|
+
}
|
|
374
|
+
onClick() {
|
|
375
|
+
if (this.disabled)
|
|
376
|
+
return;
|
|
377
|
+
this.service.toggle(this.menu.id);
|
|
378
|
+
}
|
|
379
|
+
onMouseEnter() {
|
|
380
|
+
if (this.disabled)
|
|
381
|
+
return;
|
|
382
|
+
this.service.hoverEnter(this.menu.id);
|
|
383
|
+
}
|
|
384
|
+
ngOnDestroy() {
|
|
385
|
+
this.sub.unsubscribe();
|
|
386
|
+
}
|
|
387
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarTriggerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
388
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenubarTriggerComponent, isStandalone: true, selector: "tolle-menubar-trigger", inputs: { disabled: "disabled", size: "size", class: "class" }, host: { attributes: { "role": "none" } }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["trigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
389
|
+
<button
|
|
390
|
+
#trigger
|
|
391
|
+
type="button"
|
|
392
|
+
role="menuitem"
|
|
393
|
+
[id]="menu.triggerId"
|
|
394
|
+
[disabled]="disabled"
|
|
395
|
+
aria-haspopup="menu"
|
|
396
|
+
[attr.aria-expanded]="isOpen"
|
|
397
|
+
[attr.aria-controls]="isOpen ? menu.id + '-content' : null"
|
|
398
|
+
[attr.data-state]="isOpen ? 'open' : 'closed'"
|
|
399
|
+
[class]="computedClass"
|
|
400
|
+
(click)="onClick()"
|
|
401
|
+
(mouseenter)="onMouseEnter()"
|
|
402
|
+
>
|
|
403
|
+
<ng-content></ng-content>
|
|
404
|
+
</button>
|
|
405
|
+
`, isInline: true, styles: [":host{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
406
|
+
}
|
|
407
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarTriggerComponent, decorators: [{
|
|
408
|
+
type: Component,
|
|
409
|
+
args: [{ selector: 'tolle-menubar-trigger', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, host: { role: 'none' }, template: `
|
|
410
|
+
<button
|
|
411
|
+
#trigger
|
|
412
|
+
type="button"
|
|
413
|
+
role="menuitem"
|
|
414
|
+
[id]="menu.triggerId"
|
|
415
|
+
[disabled]="disabled"
|
|
416
|
+
aria-haspopup="menu"
|
|
417
|
+
[attr.aria-expanded]="isOpen"
|
|
418
|
+
[attr.aria-controls]="isOpen ? menu.id + '-content' : null"
|
|
419
|
+
[attr.data-state]="isOpen ? 'open' : 'closed'"
|
|
420
|
+
[class]="computedClass"
|
|
421
|
+
(click)="onClick()"
|
|
422
|
+
(mouseenter)="onMouseEnter()"
|
|
423
|
+
>
|
|
424
|
+
<ng-content></ng-content>
|
|
425
|
+
</button>
|
|
426
|
+
`, styles: [":host{display:block}\n"] }]
|
|
427
|
+
}], ctorParameters: () => [], propDecorators: { disabled: [{
|
|
428
|
+
type: Input
|
|
429
|
+
}], size: [{
|
|
430
|
+
type: Input
|
|
431
|
+
}], class: [{
|
|
432
|
+
type: Input
|
|
433
|
+
}], triggerRef: [{
|
|
434
|
+
type: ViewChild,
|
|
435
|
+
args: ['trigger']
|
|
436
|
+
}] } });
|
|
437
|
+
/** The dropdown panel of a menu. Rendered only while its menu is open. */
|
|
438
|
+
export class MenubarContentComponent {
|
|
439
|
+
/**
|
|
440
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
441
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
442
|
+
* rendering the class it was born with.
|
|
443
|
+
*/
|
|
444
|
+
ngOnChanges() {
|
|
445
|
+
this.cdr.markForCheck();
|
|
446
|
+
}
|
|
447
|
+
/** Preferred side of the trigger to render on; flips when space is tight. @default 'bottom-start' */
|
|
448
|
+
placement = 'bottom-start';
|
|
449
|
+
/** Gap in pixels between the trigger and the panel. @default 4 */
|
|
450
|
+
sideOffset = 4;
|
|
451
|
+
/** Extra Tailwind classes merged onto the panel via `cn()` (last-wins). */
|
|
452
|
+
class = '';
|
|
453
|
+
menu = inject(MenubarMenuComponent);
|
|
454
|
+
service = inject(MenubarService);
|
|
455
|
+
cdr = inject(ChangeDetectorRef);
|
|
456
|
+
sub;
|
|
457
|
+
cleanup;
|
|
458
|
+
constructor() {
|
|
459
|
+
this.sub = this.service.openId$.subscribe(() => this.cdr.markForCheck());
|
|
460
|
+
}
|
|
461
|
+
set panelRef(ref) {
|
|
462
|
+
const el = ref?.nativeElement ?? null;
|
|
463
|
+
this.menu.contentElement = el;
|
|
464
|
+
this.stopPositioning();
|
|
465
|
+
if (el)
|
|
466
|
+
this.startPositioning(el);
|
|
467
|
+
}
|
|
468
|
+
get isOpen() {
|
|
469
|
+
return this.menu.isOpen;
|
|
470
|
+
}
|
|
471
|
+
get computedClass() {
|
|
472
|
+
return cn('z-[1000] min-w-[12rem] overflow-hidden rounded-md border border-border bg-popover p-1', 'text-popover-foreground shadow-md animate-in fade-in zoom-in-95', this.class);
|
|
473
|
+
}
|
|
474
|
+
startPositioning(panel) {
|
|
475
|
+
const trigger = this.menu.triggerElement;
|
|
476
|
+
if (!trigger)
|
|
477
|
+
return;
|
|
478
|
+
this.cleanup = autoUpdate(trigger, panel, () => {
|
|
479
|
+
computePosition(trigger, panel, {
|
|
480
|
+
strategy: 'fixed',
|
|
481
|
+
placement: this.placement,
|
|
482
|
+
middleware: [offset(this.sideOffset), flip(), shift({ padding: 8 })],
|
|
483
|
+
}).then(({ x, y }) => {
|
|
484
|
+
Object.assign(panel.style, { left: `${x}px`, top: `${y}px` });
|
|
485
|
+
});
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
stopPositioning() {
|
|
489
|
+
this.cleanup?.();
|
|
490
|
+
this.cleanup = undefined;
|
|
491
|
+
}
|
|
492
|
+
ngOnDestroy() {
|
|
493
|
+
this.sub.unsubscribe();
|
|
494
|
+
this.stopPositioning();
|
|
495
|
+
}
|
|
496
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
497
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MenubarContentComponent, isStandalone: true, selector: "tolle-menubar-content", inputs: { placement: "placement", sideOffset: "sideOffset", class: "class" }, viewQueries: [{ propertyName: "panelRef", first: true, predicate: ["panel"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
498
|
+
@if (isOpen) {
|
|
499
|
+
<div
|
|
500
|
+
#panel
|
|
501
|
+
role="menu"
|
|
502
|
+
aria-orientation="vertical"
|
|
503
|
+
[id]="menu.id + '-content'"
|
|
504
|
+
[attr.aria-labelledby]="menu.triggerId"
|
|
505
|
+
data-state="open"
|
|
506
|
+
[class]="computedClass"
|
|
507
|
+
style="position: fixed; top: 0; left: 0;"
|
|
508
|
+
>
|
|
509
|
+
<ng-content></ng-content>
|
|
510
|
+
</div>
|
|
511
|
+
}
|
|
512
|
+
`, isInline: true, styles: [":host{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
513
|
+
}
|
|
514
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarContentComponent, decorators: [{
|
|
515
|
+
type: Component,
|
|
516
|
+
args: [{ selector: 'tolle-menubar-content', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
517
|
+
@if (isOpen) {
|
|
518
|
+
<div
|
|
519
|
+
#panel
|
|
520
|
+
role="menu"
|
|
521
|
+
aria-orientation="vertical"
|
|
522
|
+
[id]="menu.id + '-content'"
|
|
523
|
+
[attr.aria-labelledby]="menu.triggerId"
|
|
524
|
+
data-state="open"
|
|
525
|
+
[class]="computedClass"
|
|
526
|
+
style="position: fixed; top: 0; left: 0;"
|
|
527
|
+
>
|
|
528
|
+
<ng-content></ng-content>
|
|
529
|
+
</div>
|
|
530
|
+
}
|
|
531
|
+
`, styles: [":host{display:block}\n"] }]
|
|
532
|
+
}], ctorParameters: () => [], propDecorators: { placement: [{
|
|
533
|
+
type: Input
|
|
534
|
+
}], sideOffset: [{
|
|
535
|
+
type: Input
|
|
536
|
+
}], class: [{
|
|
537
|
+
type: Input
|
|
538
|
+
}], panelRef: [{
|
|
539
|
+
type: ViewChild,
|
|
540
|
+
args: ['panel']
|
|
541
|
+
}] } });
|
|
542
|
+
/** A selectable row inside a menu. Closes the bar when activated. */
|
|
543
|
+
export class MenubarItemComponent {
|
|
544
|
+
cdr = inject(ChangeDetectorRef);
|
|
545
|
+
/**
|
|
546
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
547
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
548
|
+
* rendering the class it was born with.
|
|
549
|
+
*/
|
|
550
|
+
ngOnChanges() {
|
|
551
|
+
this.cdr.markForCheck();
|
|
552
|
+
}
|
|
553
|
+
/** Visual style of the item. @default 'default' */
|
|
554
|
+
variant = 'default';
|
|
555
|
+
/** Adds left padding so the label lines up with items that have icons. @default false */
|
|
556
|
+
inset = false;
|
|
557
|
+
/** Blocks activation and dims the item. @default false */
|
|
558
|
+
disabled = false;
|
|
559
|
+
/** Extra Tailwind classes merged onto the item via `cn()` (last-wins). */
|
|
560
|
+
class = '';
|
|
561
|
+
/** Emitted when the item is clicked or activated with Enter/Space. */
|
|
562
|
+
select = new EventEmitter();
|
|
563
|
+
service = inject(MenubarService);
|
|
564
|
+
get computedClass() {
|
|
565
|
+
return cn(menubarItemVariants({ variant: this.variant, inset: this.inset }), this.class);
|
|
566
|
+
}
|
|
567
|
+
activate(event) {
|
|
568
|
+
if (this.disabled)
|
|
569
|
+
return;
|
|
570
|
+
event.preventDefault();
|
|
571
|
+
this.select.emit(event);
|
|
572
|
+
this.service.close();
|
|
573
|
+
}
|
|
574
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
575
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenubarItemComponent, isStandalone: true, selector: "tolle-menubar-item", inputs: { variant: "variant", inset: "inset", disabled: "disabled", class: "class" }, outputs: { select: "select" }, usesOnChanges: true, ngImport: i0, template: `
|
|
576
|
+
<div
|
|
577
|
+
role="menuitem"
|
|
578
|
+
[attr.tabindex]="disabled ? null : -1"
|
|
579
|
+
[attr.data-disabled]="disabled ? '' : null"
|
|
580
|
+
[attr.aria-disabled]="disabled || null"
|
|
581
|
+
[class]="computedClass"
|
|
582
|
+
(click)="activate($event)"
|
|
583
|
+
(keydown.enter)="activate($event)"
|
|
584
|
+
(keydown.space)="activate($event)"
|
|
585
|
+
>
|
|
586
|
+
<ng-content select="[prefix]"></ng-content>
|
|
587
|
+
<span class="flex-1 truncate"><ng-content></ng-content></span>
|
|
588
|
+
<ng-content select="[shortcut]"></ng-content>
|
|
589
|
+
</div>
|
|
590
|
+
`, isInline: true, styles: [":host{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
591
|
+
}
|
|
592
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarItemComponent, decorators: [{
|
|
593
|
+
type: Component,
|
|
594
|
+
args: [{ selector: 'tolle-menubar-item', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
595
|
+
<div
|
|
596
|
+
role="menuitem"
|
|
597
|
+
[attr.tabindex]="disabled ? null : -1"
|
|
598
|
+
[attr.data-disabled]="disabled ? '' : null"
|
|
599
|
+
[attr.aria-disabled]="disabled || null"
|
|
600
|
+
[class]="computedClass"
|
|
601
|
+
(click)="activate($event)"
|
|
602
|
+
(keydown.enter)="activate($event)"
|
|
603
|
+
(keydown.space)="activate($event)"
|
|
604
|
+
>
|
|
605
|
+
<ng-content select="[prefix]"></ng-content>
|
|
606
|
+
<span class="flex-1 truncate"><ng-content></ng-content></span>
|
|
607
|
+
<ng-content select="[shortcut]"></ng-content>
|
|
608
|
+
</div>
|
|
609
|
+
`, styles: [":host{display:block}\n"] }]
|
|
610
|
+
}], propDecorators: { variant: [{
|
|
611
|
+
type: Input
|
|
612
|
+
}], inset: [{
|
|
613
|
+
type: Input
|
|
614
|
+
}], disabled: [{
|
|
615
|
+
type: Input
|
|
616
|
+
}], class: [{
|
|
617
|
+
type: Input
|
|
618
|
+
}], select: [{
|
|
619
|
+
type: Output
|
|
620
|
+
}] } });
|
|
621
|
+
/** A non-interactive heading inside a menu. */
|
|
622
|
+
export class MenubarLabelComponent {
|
|
623
|
+
cdr = inject(ChangeDetectorRef);
|
|
624
|
+
/**
|
|
625
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
626
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
627
|
+
* rendering the class it was born with.
|
|
628
|
+
*/
|
|
629
|
+
ngOnChanges() {
|
|
630
|
+
this.cdr.markForCheck();
|
|
631
|
+
}
|
|
632
|
+
/** Adds left padding so the label lines up with items that have icons. @default false */
|
|
633
|
+
inset = false;
|
|
634
|
+
/** Extra Tailwind classes merged onto the label via `cn()` (last-wins). */
|
|
635
|
+
class = '';
|
|
636
|
+
cn = cn;
|
|
637
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarLabelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
638
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenubarLabelComponent, isStandalone: true, selector: "tolle-menubar-label", inputs: { inset: "inset", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
639
|
+
<div
|
|
640
|
+
[class]="cn('px-2 py-1.5 text-xs font-semibold text-muted-foreground', inset ? 'pl-8' : '', class)"
|
|
641
|
+
>
|
|
642
|
+
<ng-content></ng-content>
|
|
643
|
+
</div>
|
|
644
|
+
`, isInline: true, styles: [":host{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
645
|
+
}
|
|
646
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarLabelComponent, decorators: [{
|
|
647
|
+
type: Component,
|
|
648
|
+
args: [{ selector: 'tolle-menubar-label', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
649
|
+
<div
|
|
650
|
+
[class]="cn('px-2 py-1.5 text-xs font-semibold text-muted-foreground', inset ? 'pl-8' : '', class)"
|
|
651
|
+
>
|
|
652
|
+
<ng-content></ng-content>
|
|
653
|
+
</div>
|
|
654
|
+
`, styles: [":host{display:block}\n"] }]
|
|
655
|
+
}], propDecorators: { inset: [{
|
|
656
|
+
type: Input
|
|
657
|
+
}], class: [{
|
|
658
|
+
type: Input
|
|
659
|
+
}] } });
|
|
660
|
+
/** A horizontal rule between groups of menu items. */
|
|
661
|
+
export class MenubarSeparatorComponent {
|
|
662
|
+
cdr = inject(ChangeDetectorRef);
|
|
663
|
+
/**
|
|
664
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
665
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
666
|
+
* rendering the class it was born with.
|
|
667
|
+
*/
|
|
668
|
+
ngOnChanges() {
|
|
669
|
+
this.cdr.markForCheck();
|
|
670
|
+
}
|
|
671
|
+
/** Extra Tailwind classes merged onto the separator via `cn()` (last-wins). */
|
|
672
|
+
class = '';
|
|
673
|
+
cn = cn;
|
|
674
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarSeparatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
675
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenubarSeparatorComponent, isStandalone: true, selector: "tolle-menubar-separator", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div role="separator" aria-orientation="horizontal" [class]="cn('-mx-1 my-1 h-px bg-border', class)"></div>`, isInline: true, styles: [":host{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
676
|
+
}
|
|
677
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenubarSeparatorComponent, decorators: [{
|
|
678
|
+
type: Component,
|
|
679
|
+
args: [{ selector: 'tolle-menubar-separator', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div role="separator" aria-orientation="horizontal" [class]="cn('-mx-1 my-1 h-px bg-border', class)"></div>`, styles: [":host{display:block}\n"] }]
|
|
680
|
+
}], propDecorators: { class: [{
|
|
681
|
+
type: Input
|
|
682
|
+
}] } });
|
|
683
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL21lbnViYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1TCxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFlaEMsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFFM0I7Ozs7Ozs7R0FPRztBQUVILE1BQU0sT0FBTyxjQUFjO0lBQ2pCLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFDaEUsOEVBQThFO0lBQ3JFLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRTVDLFVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBMEIsU0FBUyxDQUFDLENBQUM7SUFDN0U7OztPQUdHO0lBQ00sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFaEQsb0NBQW9DO0lBQ3BDLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUE2QjtR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S0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7O0FBSVIsc0RBQXNEO0FBU3RELE1BQU0sT0FBTyx5QkFBeUI7SUFDbkIsR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRWpEOzs7O09BSUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsK0VBQStFO0lBQ3RFLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDRCxFQUFFLEdBQUcsRUFBRSxDQUFDO3dHQWRoQix5QkFBeUI7NEZBQXpCLHlCQUF5QixvSUFGMUIsNkdBQTZHOzs0RkFFNUcseUJBQXlCO2tCQVJyQyxTQUFTOytCQUNFLHlCQUF5QixjQUV2QixJQUFJLFdBQ1AsRUFBRSxtQkFDTSx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDLDZHQUE2Rzs4QkFlOUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjb21wdXRlUG9zaXRpb24sIGZsaXAsIHNoaWZ0LCBvZmZzZXQsIGF1dG9VcGRhdGUgfSBmcm9tICdAZmxvYXRpbmctdWkvZG9tJztcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuLyoqXG4gKiBDb250cmFjdCBhIGB0b2xsZS1tZW51YmFyLW1lbnVgIGZ1bGZpbHMgc28gYE1lbnViYXJTZXJ2aWNlYCBjYW4gZHJpdmUgZm9jdXMgYW5kXG4gKiBrZXlib2FyZCBuYXZpZ2F0aW9uIHdpdGhvdXQgaW1wb3J0aW5nIHRoZSBjb21wb25lbnQgKHdoaWNoIHdvdWxkIGJlIGNpcmN1bGFyKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZW51YmFyTWVudVJlZiB7XG4gIC8qKiBTdGFibGUgaWQsIHVuaXF1ZSBwZXIgbWVudSBpbnN0YW5jZS4gKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgLyoqIFRoZSBtZW51J3MgdHJpZ2dlciBidXR0b24sIG9uY2UgcmVuZGVyZWQuICovXG4gIHRyaWdnZXJFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIC8qKiBUaGUgbWVudSdzIG9wZW4gcGFuZWwsIG9yIGBudWxsYCB3aGlsZSBjbG9zZWQuICovXG4gIGNvbnRlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbmxldCBtZW51YmFyTWVudUNvdW50ZXIgPSAwO1xuXG4vKipcbiAqIENvb3JkaW5hdGVzIHRoZSBtZW51cyBvZiBhIHNpbmdsZSBgdG9sbGUtbWVudWJhcmAuIFByb3ZpZGVkIGJ5XG4gKiBgTWVudWJhckNvbXBvbmVudGAsIGluamVjdGVkIGJ5IGV2ZXJ5IGRlc2NlbmRhbnQgbWVudS90cmlnZ2VyL2NvbnRlbnQuXG4gKlxuICogVGhlIGRlZmluaW5nIGJlaGF2aW91ciBvZiBhIG1lbnUgYmFyIGxpdmVzIGhlcmU6IG9uY2UgKmFueSogbWVudSBpcyBvcGVuLFxuICogaG92ZXJpbmcgYSBkaWZmZXJlbnQgdHJpZ2dlciBzd2l0Y2hlcyB0byBpdCBpbW1lZGlhdGVseSAoYGhvdmVyRW50ZXJgKSwgd2hpbGVcbiAqIGhvdmVyaW5nIHdpdGggZXZlcnl0aGluZyBjbG9zZWQgZG9lcyBub3RoaW5nLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTWVudWJhclNlcnZpY2Uge1xuICBwcml2YXRlIG9wZW5JZFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBFbWl0cyB0aGUgaWQgb2YgdGhlIGN1cnJlbnRseSBvcGVuIG1lbnUsIG9yIGBudWxsYCB3aGVuIGFsbCBhcmUgY2xvc2VkLiAqL1xuICByZWFkb25seSBvcGVuSWQkID0gdGhpcy5vcGVuSWRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBzaXplU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDwnc20nIHwgJ2RlZmF1bHQnIHwgJ2xnJz4oJ2RlZmF1bHQnKTtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBiYXIncyBzaXplIHNvIE9uUHVzaCB0cmlnZ2VycyByZS1yZW5kZXIgd2hlbiBpdCBjaGFuZ2VzLiBSZWFkaW5nXG4gICAqIHRoZSBwYXJlbnQgY29tcG9uZW50J3MgcHJvcGVydHkgZGlyZWN0bHkgd291bGQgbm90IG1hcmsgdGhlbSBkaXJ0eS5cbiAgICovXG4gIHJlYWRvbmx5IHNpemUkID0gdGhpcy5zaXplU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKiBUaGUgYmFyJ3MgY3VycmVudCBzaXplIHNjYWxlLiAqL1xuICBnZXQgc2l6ZSgpOiAnc20nIHwgJ2RlZmF1bHQnIHwgJ2xnJyB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZVNvdXJjZS52YWx1ZTtcbiAgfVxuXG4gIHNldFNpemUoc2l6ZTogJ3NtJyB8ICdkZWZhdWx0JyB8ICdsZycpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaXplU291cmNlLnZhbHVlICE9PSBzaXplKSB0aGlzLnNpemVTb3VyY2UubmV4dChzaXplKTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlcmVkIG1lbnVzIGluIERPTSAocmVnaXN0cmF0aW9uKSBvcmRlci4gKi9cbiAgcHJpdmF0ZSBtZW51czogTWVudWJhck1lbnVSZWZbXSA9IFtdO1xuXG4gIC8qKiBJZCBvZiB0aGUgb3BlbiBtZW51LCBvciBgbnVsbGAuICovXG4gIGdldCBvcGVuSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub3BlbklkU291cmNlLnZhbHVlO1xuICB9XG5cbiAgLyoqIFRydWUgd2hpbGUgb25lIG9mIHRoZSBiYXIncyBtZW51cyBpcyBvcGVuLiAqL1xuICBnZXQgaXNBbnlPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9wZW5JZFNvdXJjZS52YWx1ZSAhPT0gbnVsbDtcbiAgfVxuXG4gIHJlZ2lzdGVyKG1lbnU6IE1lbnViYXJNZW51UmVmKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWVudXMuaW5kZXhPZihtZW51KSA9PT0gLTEpIHRoaXMubWVudXMucHVzaChtZW51KTtcbiAgfVxuXG4gIHVucmVnaXN0ZXIobWVudTogTWVudWJhck1lbnVSZWYpOiB2b2lkIHtcbiAgICBjb25zdCBpID0gdGhpcy5tZW51cy5pbmRleE9mKG1lbnUpO1xuICAgIGlmIChpID4gLTEpIHRoaXMubWVudXMuc3BsaWNlKGksIDEpO1xuICAgIGlmICh0aGlzLm9wZW5JZCA9PT0gbWVudS5pZCkgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgaXNPcGVuKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuSWQgPT09IGlkO1xuICB9XG5cbiAgb3BlbihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3BlbklkICE9PSBpZCkgdGhpcy5vcGVuSWRTb3VyY2UubmV4dChpZCk7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVuSWQgIT09IG51bGwpIHRoaXMub3BlbklkU291cmNlLm5leHQobnVsbCk7XG4gIH1cblxuICB0b2dnbGUoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZW5JZCA9PT0gaWQpIHRoaXMuY2xvc2UoKTtcbiAgICBlbHNlIHRoaXMub3BlbihpZCk7XG4gIH1cblxuICAvKipcbiAgICogUG9pbnRlciBlbnRlcmVkIGEgdHJpZ2dlci4gT25seSBzd2l0Y2hlcyBtZW51cyB3aGVuIHRoZSBiYXIgaXMgYWxyZWFkeVxuICAgKiBcImFjdGl2ZVwiIChzb21ldGhpbmcgb3Blbikg4oCUIHRoaXMgaXMgd2hhdCBtYWtlcyBhIG1lbnUgYmFyIGZlZWwgbmF0aXZlLlxuICAgKi9cbiAgaG92ZXJFbnRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNBbnlPcGVuKSB0aGlzLm9wZW4oaWQpO1xuICB9XG5cbiAgLyoqIE1vdmVzIGZvY3VzIHRvIHRoZSBwcmV2aW91cy9uZXh0IG1lbnUsIGtlZXBpbmcgdGhlIG9wZW4gc3RhdGUuICovXG4gIG1vdmVNZW51KGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWVudXMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMubWVudXMuZmluZEluZGV4KG0gPT4gbS5pZCA9PT0gdGhpcy5vcGVuSWQpO1xuICAgIGNvbnN0IGZyb20gPSBjdXJyZW50ID4gLTEgPyBjdXJyZW50IDogdGhpcy5pbmRleE9mRm9jdXNlZFRyaWdnZXIoKTtcbiAgICBjb25zdCBuZXh0ID1cbiAgICAgIGZyb20gPCAwXG4gICAgICAgID8gZGVsdGEgPiAwXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLm1lbnVzLmxlbmd0aCAtIDFcbiAgICAgICAgOiAoZnJvbSArIGRlbHRhICsgdGhpcy5tZW51cy5sZW5ndGgpICUgdGhpcy5tZW51cy5sZW5ndGg7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5tZW51c1tuZXh0XTtcbiAgICBpZiAodGhpcy5pc0FueU9wZW4pIHRoaXMub3Blbih0YXJnZXQuaWQpO1xuICAgIHRhcmdldC50cmlnZ2VyRWxlbWVudD8uZm9jdXMoKTtcbiAgfVxuXG4gIC8qKiBNb3ZlcyBmb2N1cyBiZXR3ZWVuIHRoZSBlbmFibGVkIGl0ZW1zIG9mIHRoZSBjdXJyZW50bHkgb3BlbiBtZW51LiAqL1xuICBtb3ZlSXRlbShkZWx0YTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLm9wZW5JdGVtcygpO1xuICAgIGlmICghaXRlbXMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudCA9IGl0ZW1zLmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgY29uc3QgbmV4dCA9XG4gICAgICBjdXJyZW50IDwgMFxuICAgICAgICA/IGRlbHRhID4gMFxuICAgICAgICAgID8gMFxuICAgICAgICAgIDogaXRlbXMubGVuZ3RoIC0gMVxuICAgICAgICA6IChjdXJyZW50ICsgZGVsdGEgKyBpdGVtcy5sZW5ndGgpICUgaXRlbXMubGVuZ3RoO1xuICAgIGl0ZW1zW25leHRdLmZvY3VzKCk7XG4gIH1cblxuICAvKiogRm9jdXNlcyB0aGUgdHJpZ2dlciBvZiB0aGUgZ2l2ZW4gbWVudSAodXNlZCB3aGVuIEVzY2FwZSBjbG9zZXMgYSBtZW51KS4gKi9cbiAgZm9jdXNUcmlnZ2VyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnVzLmZpbmQobSA9PiBtLmlkID09PSBpZCk/LnRyaWdnZXJFbGVtZW50Py5mb2N1cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuSXRlbXMoKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMubWVudXMuZmluZChtID0+IG0uaWQgPT09IHRoaXMub3BlbklkKT8uY29udGVudEVsZW1lbnQ7XG4gICAgaWYgKCFjb250ZW50KSByZXR1cm4gW107XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICBjb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdbcm9sZT1cIm1lbnVpdGVtXCJdOm5vdChbZGF0YS1kaXNhYmxlZF0pJylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmRleE9mRm9jdXNlZFRyaWdnZXIoKTogbnVtYmVyIHtcbiAgICBjb25zdCBhY3RpdmUgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIHJldHVybiB0aGlzLm1lbnVzLmZpbmRJbmRleChtID0+ICEhbS50cmlnZ2VyRWxlbWVudCAmJiBtLnRyaWdnZXJFbGVtZW50ID09PSBhY3RpdmUpO1xuICB9XG59XG5cbmNvbnN0IG1lbnViYXJWYXJpYW50cyA9IGN2YShcbiAgJ2ZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctYmFja2dyb3VuZCBzaGFkb3ctc20nLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHNpemU6IHtcbiAgICAgICAgc206ICdoLTggcC0wLjUnLFxuICAgICAgICBkZWZhdWx0OiAnaC0xMCBwLTEnLFxuICAgICAgICBsZzogJ2gtMTIgcC0xLjUnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgc2l6ZTogJ2RlZmF1bHQnLFxuICAgIH0sXG4gIH1cbik7XG5cbmV4cG9ydCB0eXBlIE1lbnViYXJQcm9wcyA9IFZhcmlhbnRQcm9wczx0eXBlb2YgbWVudWJhclZhcmlhbnRzPjtcblxuY29uc3QgbWVudWJhclRyaWdnZXJWYXJpYW50cyA9IGN2YShcbiAgJ2ZsZXggc2VsZWN0LW5vbmUgaXRlbXMtY2VudGVyIHJvdW5kZWQtc20gZm9udC1tZWRpdW0gb3V0bGluZS1ub25lIHRyYW5zaXRpb24tY29sb3JzICcgK1xuICAgICdob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOmJnLWFjY2VudCBmb2N1cy12aXNpYmxlOnRleHQtYWNjZW50LWZvcmVncm91bmQgJyArXG4gICAgJ2RhdGEtW3N0YXRlPW9wZW5dOmJnLWFjY2VudCBkYXRhLVtzdGF0ZT1vcGVuXTp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kICcgK1xuICAgICdkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAnLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHNpemU6IHtcbiAgICAgICAgc206ICdoLTcgcHgtMiB0ZXh0LXhzJyxcbiAgICAgICAgZGVmYXVsdDogJ2gtOCBweC0zIHRleHQtc20nLFxuICAgICAgICBsZzogJ2gtOSBweC00IHRleHQtc20nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgc2l6ZTogJ2RlZmF1bHQnLFxuICAgIH0sXG4gIH1cbik7XG5cbmV4cG9ydCB0eXBlIE1lbnViYXJUcmlnZ2VyUHJvcHMgPSBWYXJpYW50UHJvcHM8dHlwZW9mIG1lbnViYXJUcmlnZ2VyVmFyaWFudHM+O1xuXG5jb25zdCBtZW51YmFySXRlbVZhcmlhbnRzID0gY3ZhKFxuICAncmVsYXRpdmUgZmxleCB3LWZ1bGwgY3Vyc29yLWRlZmF1bHQgc2VsZWN0LW5vbmUgaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtc20gcHgtMiBweS0xLjUgdGV4dC1zbSBvdXRsaW5lLW5vbmUgdHJhbnNpdGlvbi1jb2xvcnMgJyArXG4gICAgJ2ZvY3VzOmJnLWFjY2VudCBmb2N1czp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kICcgK1xuICAgICdkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCcsXG4gIHtcbiAgICB2YXJpYW50czoge1xuICAgICAgdmFyaWFudDoge1xuICAgICAgICBkZWZhdWx0OiAndGV4dC1wb3BvdmVyLWZvcmVncm91bmQnLFxuICAgICAgICBkZXN0cnVjdGl2ZTogJ3RleHQtZGVzdHJ1Y3RpdmUgZm9jdXM6YmctZGVzdHJ1Y3RpdmUvMTAgaG92ZXI6YmctZGVzdHJ1Y3RpdmUvMTAnLFxuICAgICAgfSxcbiAgICAgIGluc2V0OiB7XG4gICAgICAgIHRydWU6ICdwbC04JyxcbiAgICAgICAgZmFsc2U6ICcnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgdmFyaWFudDogJ2RlZmF1bHQnLFxuICAgICAgaW5zZXQ6IGZhbHNlLFxuICAgIH0sXG4gIH1cbik7XG5cbmV4cG9ydCB0eXBlIE1lbnViYXJJdGVtUHJvcHMgPSBWYXJpYW50UHJvcHM8dHlwZW9mIG1lbnViYXJJdGVtVmFyaWFudHM+O1xuXG4vKipcbiAqIERlc2t0b3AtYXBwbGljYXRpb24gc3R5bGUgbWVudSBiYXIuXG4gKlxuICogYGBgaHRtbFxuICogPHRvbGxlLW1lbnViYXI+XG4gKiAgIDx0b2xsZS1tZW51YmFyLW1lbnU+XG4gKiAgICAgPHRvbGxlLW1lbnViYXItdHJpZ2dlcj5GaWxlPC90b2xsZS1tZW51YmFyLXRyaWdnZXI+XG4gKiAgICAgPHRvbGxlLW1lbnViYXItY29udGVudD5cbiAqICAgICAgIDx0b2xsZS1tZW51YmFyLWxhYmVsPkRvY3VtZW50PC90b2xsZS1tZW51YmFyLWxhYmVsPlxuICogICAgICAgPHRvbGxlLW1lbnViYXItaXRlbSAoc2VsZWN0KT1cIm9uTmV3KClcIj5OZXc8L3RvbGxlLW1lbnViYXItaXRlbT5cbiAqICAgICAgIDx0b2xsZS1tZW51YmFyLXNlcGFyYXRvciAvPlxuICogICAgICAgPHRvbGxlLW1lbnViYXItaXRlbSB2YXJpYW50PVwiZGVzdHJ1Y3RpdmVcIj5EZWxldGU8L3RvbGxlLW1lbnViYXItaXRlbT5cbiAqICAgICA8L3RvbGxlLW1lbnViYXItY29udGVudD5cbiAqICAgPC90b2xsZS1tZW51YmFyLW1lbnU+XG4gKiA8L3RvbGxlLW1lbnViYXI+XG4gKiBgYGBcbiAqIEBuZXdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtbWVudWJhcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICBwcm92aWRlcnM6IFtNZW51YmFyU2VydmljZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7XG4gICAgcm9sZTogJ21lbnViYXInLFxuICAgICdbY2xhc3NdJzogJ2NvbXB1dGVkQ2xhc3MnLFxuICAgICcoa2V5ZG93biknOiAnb25LZXlkb3duKCRldmVudCknLFxuICB9LFxuICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gLFxufSlcbmV4cG9ydCBjbGFzcyBNZW51YmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIC8qKiBIZWlnaHQvcGFkZGluZyBzY2FsZSwgaW5oZXJpdGVkIGJ5IGV2ZXJ5IHRyaWdnZXIgaW4gdGhlIGJhci4gQGRlZmF1bHQgJ2RlZmF1bHQnICovXG4gIEBJbnB1dCgpIHNpemU6IE1lbnViYXJQcm9wc1snc2l6ZSddID0gJ2RlZmF1bHQnO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgYmFyIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgLyoqIEVtaXR0ZWQgd2l0aCB0aGUgaWQgb2YgdGhlIG1lbnUgdGhhdCBvcGVuZWQsIG9yIGBudWxsYCB3aGVuIHRoZSBiYXIgY2xvc2VzLiAqL1xuICBAT3V0cHV0KCkgb3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVsbD4oKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VydmljZSA9IGluamVjdChNZW51YmFyU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdCA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIGxpc3RlbmluZyA9IGZhbHNlO1xuXG4gIGdldCBjb21wdXRlZENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNuKG1lbnViYXJWYXJpYW50cyh7IHNpemU6IHRoaXMuc2l6ZSB9KSwgdGhpcy5jbGFzcyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAvLyBQdXNoIHNpemUgaW50byB0aGUgc2VydmljZSBzbyBPblB1c2ggdHJpZ2dlcnMgZ2V0IHRvbGQgYWJvdXQgaXQuXG4gICAgdGhpcy5zZXJ2aWNlLnNldFNpemUodGhpcy5zaXplID8/ICdkZWZhdWx0Jyk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2Uuc2V0U2l6ZSh0aGlzLnNpemUgPz8gJ2RlZmF1bHQnKTtcbiAgICB0aGlzLnN1Yi5hZGQoXG4gICAgICB0aGlzLnNlcnZpY2Uub3BlbklkJC5zdWJzY3JpYmUoaWQgPT4ge1xuICAgICAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdChpZCk7XG4gICAgICAgIGlmIChpZCAhPT0gbnVsbCkgdGhpcy5zdGFydExpc3RlbmluZygpO1xuICAgICAgICBlbHNlIHRoaXMuc3RvcExpc3RlbmluZygpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLm1vdmVNZW51KDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc2VydmljZS5tb3ZlTWVudSgtMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgaWYgKCF0aGlzLnNlcnZpY2UuaXNBbnlPcGVuKSBicmVhaztcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLm1vdmVJdGVtKDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICBpZiAoIXRoaXMuc2VydmljZS5pc0FueU9wZW4pIGJyZWFrO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNlcnZpY2UubW92ZUl0ZW0oLTEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VzY2FwZSc6IHtcbiAgICAgICAgY29uc3Qgb3BlbklkID0gdGhpcy5zZXJ2aWNlLm9wZW5JZDtcbiAgICAgICAgaWYgKG9wZW5JZCA9PT0gbnVsbCkgYnJlYWs7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc2VydmljZS5jbG9zZSgpO1xuICAgICAgICB0aGlzLnNlcnZpY2UuZm9jdXNUcmlnZ2VyKG9wZW5JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FwdHVyZSBwaGFzZSBzbyBuZXN0ZWQgY29udGFpbmVycyB0aGF0IHN0b3BQcm9wYWdhdGlvbigpIG9uIHRoZWlyIHJvb3RcbiAgLy8gKG1vZGFsLCBzaGVldCkgY2Fubm90IHByZXZlbnQgdGhlIG91dHNpZGUgY2xpY2sgZnJvbSByZWFjaGluZyB1cy5cbiAgcHJpdmF0ZSBvdXRzaWRlQ2xpY2sgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgaWYgKCF0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHRoaXMuc2VydmljZS5jbG9zZSgpO1xuICB9O1xuXG4gIHByaXZhdGUgc3RhcnRMaXN0ZW5pbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGlzdGVuaW5nKSByZXR1cm47XG4gICAgdGhpcy5saXN0ZW5pbmcgPSB0cnVlO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vdXRzaWRlQ2xpY2ssIHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wTGlzdGVuaW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5saXN0ZW5pbmcpIHJldHVybjtcbiAgICB0aGlzLmxpc3RlbmluZyA9IGZhbHNlO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vdXRzaWRlQ2xpY2ssIHRydWUpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnN0b3BMaXN0ZW5pbmcoKTtcbiAgfVxufVxuXG4vKiogQSBzaW5nbGUgbWVudSBpbiB0aGUgYmFyIOKAlCB3cmFwcyBvbmUgdHJpZ2dlciBhbmQgaXRzIGNvbnRlbnQgcGFuZWwuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1tZW51YmFyLW1lbnUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIC8vIFByZXNlbnRhdGlvbmFsIHNvIHRoZSBtZW51YmFyIFwib3duc1wiIHRoZSB0cmlnZ2VyJ3MgbWVudWl0ZW0gcm9sZSBkaXJlY3RseVxuICAvLyBldmVuIHRob3VnaCB0aGlzIHdyYXBwZXIgZWxlbWVudCBzaXRzIGluIGJldHdlZW4uXG4gIGhvc3Q6IHsgcm9sZTogJ25vbmUnLCAnW2NsYXNzXSc6IFwiJ3JlbGF0aXZlIGlubGluZS1mbGV4J1wiIH0sXG4gIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmAsXG59KVxuZXhwb3J0IGNsYXNzIE1lbnViYXJNZW51Q29tcG9uZW50IGltcGxlbWVudHMgTWVudWJhck1lbnVSZWYsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIEV4cGxpY2l0IGlkIGZvciB0aGUgbWVudTsgb25lIGlzIGdlbmVyYXRlZCB3aGVuIG9taXR0ZWQuICovXG4gIEBJbnB1dCgpIGlkID0gYHRvbGxlLW1lbnViYXItbWVudS0ke21lbnViYXJNZW51Q291bnRlcisrfWA7XG5cbiAgdHJpZ2dlckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGNvbnRlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHJlYWRvbmx5IHNlcnZpY2UgPSBpbmplY3QoTWVudWJhclNlcnZpY2UpO1xuXG4gIGdldCB0cmlnZ2VySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5pZH0tdHJpZ2dlcmA7XG4gIH1cblxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuaXNPcGVuKHRoaXMuaWQpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2aWNlLnJlZ2lzdGVyKHRoaXMpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2aWNlLnVucmVnaXN0ZXIodGhpcyk7XG4gIH1cbn1cblxuLyoqIEJ1dHRvbiB0aGF0IG9wZW5zIGl0cyBtZW51IG9uIGNsaWNrLCBhbmQgb24gaG92ZXIgb25jZSB0aGUgYmFyIGlzIGFjdGl2ZS4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLW1lbnViYXItdHJpZ2dlcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDogeyByb2xlOiAnbm9uZScgfSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8YnV0dG9uXG4gICAgICAjdHJpZ2dlclxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgW2lkXT1cIm1lbnUudHJpZ2dlcklkXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBhcmlhLWhhc3BvcHVwPVwibWVudVwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlblwiXG4gICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImlzT3BlbiA/IG1lbnUuaWQgKyAnLWNvbnRlbnQnIDogbnVsbFwiXG4gICAgICBbYXR0ci5kYXRhLXN0YXRlXT1cImlzT3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnXCJcbiAgICAgIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCJcbiAgICAgIChjbGljayk9XCJvbkNsaWNrKClcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwib25Nb3VzZUVudGVyKClcIlxuICAgID5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2J1dHRvbj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgTWVudWJhclRyaWdnZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBQcmV2ZW50cyB0aGUgbWVudSBmcm9tIG9wZW5pbmcuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKiBPdmVycmlkZXMgdGhlIHNpemUgaW5oZXJpdGVkIGZyb20gYHRvbGxlLW1lbnViYXJgLiAqL1xuICBASW5wdXQoKSBzaXplPzogTWVudWJhclRyaWdnZXJQcm9wc1snc2l6ZSddO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgdHJpZ2dlciB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBtZW51ID0gaW5qZWN0KE1lbnViYXJNZW51Q29tcG9uZW50KTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlID0gaW5qZWN0KE1lbnViYXJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnN1Yi5hZGQodGhpcy5zZXJ2aWNlLm9wZW5JZCQuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKSk7XG4gICAgLy8gVGhlIGJhcidzIHNpemUgaXMgbm90IGFuIGlucHV0IG9mIHRoaXMgY29tcG9uZW50LCBzbyBub3RoaW5nIGVsc2Ugd291bGRcbiAgICAvLyBtYXJrIGFuIE9uUHVzaCB0cmlnZ2VyIGRpcnR5IHdoZW4gaXQgY2hhbmdlcy5cbiAgICB0aGlzLnN1Yi5hZGQodGhpcy5zZXJ2aWNlLnNpemUkLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKSkpO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgndHJpZ2dlcicpIHNldCB0cmlnZ2VyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLm1lbnUudHJpZ2dlckVsZW1lbnQgPSByZWY/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1lbnUuaXNPcGVuO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBjb21wdXRlZENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNuKG1lbnViYXJUcmlnZ2VyVmFyaWFudHMoeyBzaXplOiB0aGlzLnNpemUgPz8gdGhpcy5zZXJ2aWNlLnNpemUgfSksIHRoaXMuY2xhc3MpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLnNlcnZpY2UudG9nZ2xlKHRoaXMubWVudS5pZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Nb3VzZUVudGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgdGhpcy5zZXJ2aWNlLmhvdmVyRW50ZXIodGhpcy5tZW51LmlkKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cblxuLyoqIFRoZSBkcm9wZG93biBwYW5lbCBvZiBhIG1lbnUuIFJlbmRlcmVkIG9ubHkgd2hpbGUgaXRzIG1lbnUgaXMgb3Blbi4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLW1lbnViYXItY29udGVudCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKGlzT3Blbikge1xuICAgICAgPGRpdlxuICAgICAgICAjcGFuZWxcbiAgICAgICAgcm9sZT1cIm1lbnVcIlxuICAgICAgICBhcmlhLW9yaWVudGF0aW9uPVwidmVydGljYWxcIlxuICAgICAgICBbaWRdPVwibWVudS5pZCArICctY29udGVudCdcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwibWVudS50cmlnZ2VySWRcIlxuICAgICAgICBkYXRhLXN0YXRlPVwib3BlblwiXG4gICAgICAgIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCJcbiAgICAgICAgc3R5bGU9XCJwb3NpdGlvbjogZml4ZWQ7IHRvcDogMDsgbGVmdDogMDtcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIE1lbnViYXJDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogUHJlZmVycmVkIHNpZGUgb2YgdGhlIHRyaWdnZXIgdG8gcmVuZGVyIG9uOyBmbGlwcyB3aGVuIHNwYWNlIGlzIHRpZ2h0LiBAZGVmYXVsdCAnYm90dG9tLXN0YXJ0JyAqL1xuICBASW5wdXQoKSBwbGFjZW1lbnQ6ICdib3R0b20tc3RhcnQnIHwgJ2JvdHRvbS1lbmQnIHwgJ3RvcC1zdGFydCcgfCAndG9wLWVuZCcgPSAnYm90dG9tLXN0YXJ0JztcbiAgLyoqIEdhcCBpbiBwaXhlbHMgYmV0d2VlbiB0aGUgdHJpZ2dlciBhbmQgdGhlIHBhbmVsLiBAZGVmYXVsdCA0ICovXG4gIEBJbnB1dCgpIHNpZGVPZmZzZXQgPSA0O1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgcGFuZWwgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWVudSA9IGluamVjdChNZW51YmFyTWVudUNvbXBvbmVudCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZSA9IGluamVjdChNZW51YmFyU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWI6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBjbGVhbnVwPzogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnN1YiA9IHRoaXMuc2VydmljZS5vcGVuSWQkLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKSk7XG4gIH1cblxuICBAVmlld0NoaWxkKCdwYW5lbCcpIHNldCBwYW5lbFJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZWwgPSByZWY/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcbiAgICB0aGlzLm1lbnUuY29udGVudEVsZW1lbnQgPSBlbDtcbiAgICB0aGlzLnN0b3BQb3NpdGlvbmluZygpO1xuICAgIGlmIChlbCkgdGhpcy5zdGFydFBvc2l0aW9uaW5nKGVsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1lbnUuaXNPcGVuO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBjb21wdXRlZENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNuKFxuICAgICAgJ3otWzEwMDBdIG1pbi13LVsxMnJlbV0gb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctcG9wb3ZlciBwLTEnLFxuICAgICAgJ3RleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIHNoYWRvdy1tZCBhbmltYXRlLWluIGZhZGUtaW4gem9vbS1pbi05NScsXG4gICAgICB0aGlzLmNsYXNzXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRQb3NpdGlvbmluZyhwYW5lbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0cmlnZ2VyID0gdGhpcy5tZW51LnRyaWdnZXJFbGVtZW50O1xuICAgIGlmICghdHJpZ2dlcikgcmV0dXJuO1xuICAgIHRoaXMuY2xlYW51cCA9IGF1dG9VcGRhdGUodHJpZ2dlciwgcGFuZWwsICgpID0+IHtcbiAgICAgIGNvbXB1dGVQb3NpdGlvbih0cmlnZ2VyLCBwYW5lbCwge1xuICAgICAgICBzdHJhdGVneTogJ2ZpeGVkJyxcbiAgICAgICAgcGxhY2VtZW50OiB0aGlzLnBsYWNlbWVudCxcbiAgICAgICAgbWlkZGxld2FyZTogW29mZnNldCh0aGlzLnNpZGVPZmZzZXQpLCBmbGlwKCksIHNoaWZ0KHsgcGFkZGluZzogOCB9KV0sXG4gICAgICB9KS50aGVuKCh7IHgsIHkgfSkgPT4ge1xuICAgICAgICBPYmplY3QuYXNzaWduKHBhbmVsLnN0eWxlLCB7IGxlZnQ6IGAke3h9cHhgLCB0b3A6IGAke3l9cHhgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BQb3NpdGlvbmluZygpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXA/LigpO1xuICAgIHRoaXMuY2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdG9wUG9zaXRpb25pbmcoKTtcbiAgfVxufVxuXG4vKiogQSBzZWxlY3RhYmxlIHJvdyBpbnNpZGUgYSBtZW51LiBDbG9zZXMgdGhlIGJhciB3aGVuIGFjdGl2YXRlZC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLW1lbnViYXItaXRlbScsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZGlzYWJsZWQgPyBudWxsIDogLTFcIlxuICAgICAgW2F0dHIuZGF0YS1kaXNhYmxlZF09XCJkaXNhYmxlZCA/ICcnIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkIHx8IG51bGxcIlxuICAgICAgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIlxuICAgICAgKGNsaWNrKT1cImFjdGl2YXRlKCRldmVudClcIlxuICAgICAgKGtleWRvd24uZW50ZXIpPVwiYWN0aXZhdGUoJGV2ZW50KVwiXG4gICAgICAoa2V5ZG93bi5zcGFjZSk9XCJhY3RpdmF0ZSgkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcHJlZml4XVwiPjwvbmctY29udGVudD5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC0xIHRydW5jYXRlXCI+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50Pjwvc3Bhbj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltzaG9ydGN1dF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIE1lbnViYXJJdGVtQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogVmlzdWFsIHN0eWxlIG9mIHRoZSBpdGVtLiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgdmFyaWFudDogTWVudWJhckl0ZW1Qcm9wc1sndmFyaWFudCddID0gJ2RlZmF1bHQnO1xuICAvKiogQWRkcyBsZWZ0IHBhZGRpbmcgc28gdGhlIGxhYmVsIGxpbmVzIHVwIHdpdGggaXRlbXMgdGhhdCBoYXZlIGljb25zLiBAZGVmYXVsdCBmYWxzZSAqL1xuICBASW5wdXQoKSBpbnNldCA9IGZhbHNlO1xuICAvKiogQmxvY2tzIGFjdGl2YXRpb24gYW5kIGRpbXMgdGhlIGl0ZW0uIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBpdGVtIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgaXRlbSBpcyBjbGlja2VkIG9yIGFjdGl2YXRlZCB3aXRoIEVudGVyL1NwYWNlLiAqL1xuICBAT3V0cHV0KCkgc2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2UgPSBpbmplY3QoTWVudWJhclNlcnZpY2UpO1xuXG4gIHByb3RlY3RlZCBnZXQgY29tcHV0ZWRDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBjbihcbiAgICAgIG1lbnViYXJJdGVtVmFyaWFudHMoeyB2YXJpYW50OiB0aGlzLnZhcmlhbnQsIGluc2V0OiB0aGlzLmluc2V0IH0pLFxuICAgICAgdGhpcy5jbGFzc1xuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWN0aXZhdGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuc2VsZWN0LmVtaXQoZXZlbnQpO1xuICAgIHRoaXMuc2VydmljZS5jbG9zZSgpO1xuICB9XG59XG5cbi8qKiBBIG5vbi1pbnRlcmFjdGl2ZSBoZWFkaW5nIGluc2lkZSBhIG1lbnUuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1tZW51YmFyLWxhYmVsJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIFtjbGFzc109XCJjbigncHgtMiBweS0xLjUgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCcsIGluc2V0ID8gJ3BsLTgnIDogJycsIGNsYXNzKVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBNZW51YmFyTGFiZWxDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBBZGRzIGxlZnQgcGFkZGluZyBzbyB0aGUgbGFiZWwgbGluZXMgdXAgd2l0aCBpdGVtcyB0aGF0IGhhdmUgaWNvbnMuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGluc2V0ID0gZmFsc2U7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBsYWJlbCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY24gPSBjbjtcbn1cblxuLyoqIEEgaG9yaXpvbnRhbCBydWxlIGJldHdlZW4gZ3JvdXBzIG9mIG1lbnUgaXRlbXMuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1tZW51YmFyLXNlcGFyYXRvcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGA8ZGl2IHJvbGU9XCJzZXBhcmF0b3JcIiBhcmlhLW9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiIFtjbGFzc109XCJjbignLW14LTEgbXktMSBoLXB4IGJnLWJvcmRlcicsIGNsYXNzKVwiPjwvZGl2PmAsXG59KVxuZXhwb3J0IGNsYXNzIE1lbnViYXJTZXBhcmF0b3JDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBzZXBhcmF0b3IgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNuID0gY247XG59XG4iXX0=
|