@tolle_/tolle-ui 18.2.28 → 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 +63 -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 +16457 -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 +27 -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 +8497 -1553
- package/registry/llms-full.txt +2679 -318
- package/registry/llms.txt +43 -4
- package/registry/manifest.json +9093 -1739
- 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,380 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Injectable, Input, Output, inject } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { BehaviorSubject, Subscription } from 'rxjs';
|
|
4
|
+
import { skip } from 'rxjs/operators';
|
|
5
|
+
import { cva } from 'class-variance-authority';
|
|
6
|
+
import { cn } from './utils/cn';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/common";
|
|
9
|
+
const chainOfThoughtVariants = cva('w-full text-sm', {
|
|
10
|
+
variants: {
|
|
11
|
+
size: {
|
|
12
|
+
sm: 'text-xs',
|
|
13
|
+
default: 'text-sm',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
defaultVariants: { size: 'default' },
|
|
17
|
+
});
|
|
18
|
+
const chainOfThoughtStepVariants = cva(
|
|
19
|
+
// The rail is hidden on the final step so the line stops at the last marker
|
|
20
|
+
// instead of trailing off the bottom of the list.
|
|
21
|
+
'relative flex gap-3 pb-4 last:pb-0 [&:last-child_.tolle-cot-rail]:hidden', {
|
|
22
|
+
variants: {
|
|
23
|
+
status: {
|
|
24
|
+
pending: 'text-muted-foreground',
|
|
25
|
+
active: 'text-foreground',
|
|
26
|
+
complete: 'text-muted-foreground',
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
defaultVariants: { status: 'complete' },
|
|
30
|
+
});
|
|
31
|
+
const chainOfThoughtMarkerVariants = cva('relative z-[1] flex h-6 w-6 shrink-0 items-center justify-center rounded-full border text-[11px]', {
|
|
32
|
+
variants: {
|
|
33
|
+
status: {
|
|
34
|
+
pending: 'border-border bg-background text-muted-foreground',
|
|
35
|
+
active: 'border-info bg-info/10 text-info',
|
|
36
|
+
complete: 'border-success/50 bg-success/10 text-success',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
defaultVariants: { status: 'complete' },
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* Coordinates a `tolle-chain-of-thought` and its header/content children.
|
|
43
|
+
*
|
|
44
|
+
* The children are `OnPush` and receive none of this state as inputs, so it
|
|
45
|
+
* travels as observables and each subscriber calls `markForCheck()`.
|
|
46
|
+
*/
|
|
47
|
+
export class ChainOfThoughtService {
|
|
48
|
+
openSource = new BehaviorSubject(false);
|
|
49
|
+
/** Emits whether the reasoning trace is expanded. */
|
|
50
|
+
open$ = this.openSource.asObservable();
|
|
51
|
+
get open() {
|
|
52
|
+
return this.openSource.value;
|
|
53
|
+
}
|
|
54
|
+
setOpen(open) {
|
|
55
|
+
if (this.openSource.value !== open)
|
|
56
|
+
this.openSource.next(open);
|
|
57
|
+
}
|
|
58
|
+
toggle() {
|
|
59
|
+
this.openSource.next(!this.openSource.value);
|
|
60
|
+
}
|
|
61
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
62
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtService });
|
|
63
|
+
}
|
|
64
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtService, decorators: [{
|
|
65
|
+
type: Injectable
|
|
66
|
+
}] });
|
|
67
|
+
/**
|
|
68
|
+
* A collapsible reasoning trace — the numbered steps an agent worked through
|
|
69
|
+
* before answering, connected by a vertical rail.
|
|
70
|
+
*
|
|
71
|
+
* ```html
|
|
72
|
+
* <tolle-chain-of-thought [open]="true">
|
|
73
|
+
* <tolle-chain-of-thought-header label="Thought for 4s"></tolle-chain-of-thought-header>
|
|
74
|
+
* <tolle-chain-of-thought-content>
|
|
75
|
+
* <tolle-chain-of-thought-step label="Searched the docs" status="complete" icon="ri-search-line">
|
|
76
|
+
* <tolle-chain-of-thought-search-results>
|
|
77
|
+
* <tolle-chain-of-thought-search-result>tailwind.config</tolle-chain-of-thought-search-result>
|
|
78
|
+
* </tolle-chain-of-thought-search-results>
|
|
79
|
+
* </tolle-chain-of-thought-step>
|
|
80
|
+
* </tolle-chain-of-thought-content>
|
|
81
|
+
* </tolle-chain-of-thought>
|
|
82
|
+
* ```
|
|
83
|
+
* @new
|
|
84
|
+
*/
|
|
85
|
+
export class ChainOfThoughtComponent {
|
|
86
|
+
cdr = inject(ChangeDetectorRef);
|
|
87
|
+
/** Whether the reasoning steps are expanded. @default false */
|
|
88
|
+
open = false;
|
|
89
|
+
/** Text scale of the whole trace. @default 'default' */
|
|
90
|
+
size = 'default';
|
|
91
|
+
/** Extra Tailwind classes merged onto the trace via `cn()` (last-wins). */
|
|
92
|
+
class = '';
|
|
93
|
+
/** Emitted with the new expanded state whenever the trace opens or closes. */
|
|
94
|
+
openChange = new EventEmitter();
|
|
95
|
+
service = inject(ChainOfThoughtService);
|
|
96
|
+
sub = new Subscription();
|
|
97
|
+
ngOnInit() {
|
|
98
|
+
this.service.setOpen(this.open);
|
|
99
|
+
// skip(1) drops the replayed initial value so no `openChange` fires on init.
|
|
100
|
+
this.sub.add(this.service.open$.pipe(skip(1)).subscribe((open) => this.openChange.emit(open)));
|
|
101
|
+
}
|
|
102
|
+
ngOnChanges() {
|
|
103
|
+
this.service.setOpen(this.open);
|
|
104
|
+
// A bound `class` input is written through Angular's styling path,
|
|
105
|
+
// which does not mark an OnPush view dirty on its own.
|
|
106
|
+
this.cdr.markForCheck();
|
|
107
|
+
}
|
|
108
|
+
ngOnDestroy() {
|
|
109
|
+
this.sub.unsubscribe();
|
|
110
|
+
}
|
|
111
|
+
get computedClass() {
|
|
112
|
+
return cn(chainOfThoughtVariants({ size: this.size }), this.class);
|
|
113
|
+
}
|
|
114
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
115
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChainOfThoughtComponent, isStandalone: true, selector: "tolle-chain-of-thought", inputs: { open: "open", size: "size", class: "class" }, outputs: { openChange: "openChange" }, providers: [ChainOfThoughtService], usesOnChanges: true, ngImport: i0, template: `<div [class]="computedClass"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
116
|
+
}
|
|
117
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtComponent, decorators: [{
|
|
118
|
+
type: Component,
|
|
119
|
+
args: [{ selector: 'tolle-chain-of-thought', standalone: true, imports: [CommonModule], providers: [ChainOfThoughtService], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="computedClass"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
|
|
120
|
+
}], propDecorators: { open: [{
|
|
121
|
+
type: Input
|
|
122
|
+
}], size: [{
|
|
123
|
+
type: Input
|
|
124
|
+
}], class: [{
|
|
125
|
+
type: Input
|
|
126
|
+
}], openChange: [{
|
|
127
|
+
type: Output
|
|
128
|
+
}] } });
|
|
129
|
+
/** Clickable header that expands and collapses the reasoning steps. */
|
|
130
|
+
export class ChainOfThoughtHeaderComponent {
|
|
131
|
+
/**
|
|
132
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
133
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
134
|
+
* rendering the class it was born with.
|
|
135
|
+
*/
|
|
136
|
+
ngOnChanges() {
|
|
137
|
+
this.cdr.markForCheck();
|
|
138
|
+
}
|
|
139
|
+
/** Text shown in the header. @default 'Chain of Thought' */
|
|
140
|
+
label = 'Chain of Thought';
|
|
141
|
+
/** Extra Tailwind classes merged onto the header via `cn()` (last-wins). */
|
|
142
|
+
class = '';
|
|
143
|
+
service = inject(ChainOfThoughtService);
|
|
144
|
+
cdr = inject(ChangeDetectorRef);
|
|
145
|
+
sub = new Subscription();
|
|
146
|
+
isOpen = false;
|
|
147
|
+
ngOnInit() {
|
|
148
|
+
this.sub.add(this.service.open$.subscribe((open) => {
|
|
149
|
+
this.isOpen = open;
|
|
150
|
+
this.cdr.markForCheck();
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
ngOnDestroy() {
|
|
154
|
+
this.sub.unsubscribe();
|
|
155
|
+
}
|
|
156
|
+
get computedClass() {
|
|
157
|
+
return cn('flex w-full items-center gap-2 rounded-md py-1 text-sm font-medium text-muted-foreground outline-none transition-colors', 'hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring', this.class);
|
|
158
|
+
}
|
|
159
|
+
toggle() {
|
|
160
|
+
this.service.toggle();
|
|
161
|
+
}
|
|
162
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
163
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChainOfThoughtHeaderComponent, isStandalone: true, selector: "tolle-chain-of-thought-header", inputs: { label: "label", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
164
|
+
<button
|
|
165
|
+
type="button"
|
|
166
|
+
[attr.aria-expanded]="isOpen"
|
|
167
|
+
[attr.data-state]="isOpen ? 'open' : 'closed'"
|
|
168
|
+
[class]="computedClass"
|
|
169
|
+
(click)="toggle()"
|
|
170
|
+
>
|
|
171
|
+
<i class="ri-brain-line shrink-0 text-muted-foreground" aria-hidden="true"></i>
|
|
172
|
+
<span class="truncate">{{ label }}</span>
|
|
173
|
+
<ng-content></ng-content>
|
|
174
|
+
<i
|
|
175
|
+
[class]="isOpen ? 'ri-arrow-down-s-line shrink-0' : 'ri-arrow-right-s-line shrink-0'"
|
|
176
|
+
aria-hidden="true"
|
|
177
|
+
></i>
|
|
178
|
+
</button>
|
|
179
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
180
|
+
}
|
|
181
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtHeaderComponent, decorators: [{
|
|
182
|
+
type: Component,
|
|
183
|
+
args: [{ selector: 'tolle-chain-of-thought-header', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
184
|
+
<button
|
|
185
|
+
type="button"
|
|
186
|
+
[attr.aria-expanded]="isOpen"
|
|
187
|
+
[attr.data-state]="isOpen ? 'open' : 'closed'"
|
|
188
|
+
[class]="computedClass"
|
|
189
|
+
(click)="toggle()"
|
|
190
|
+
>
|
|
191
|
+
<i class="ri-brain-line shrink-0 text-muted-foreground" aria-hidden="true"></i>
|
|
192
|
+
<span class="truncate">{{ label }}</span>
|
|
193
|
+
<ng-content></ng-content>
|
|
194
|
+
<i
|
|
195
|
+
[class]="isOpen ? 'ri-arrow-down-s-line shrink-0' : 'ri-arrow-right-s-line shrink-0'"
|
|
196
|
+
aria-hidden="true"
|
|
197
|
+
></i>
|
|
198
|
+
</button>
|
|
199
|
+
`, styles: [":host{display:block}\n"] }]
|
|
200
|
+
}], propDecorators: { label: [{
|
|
201
|
+
type: Input
|
|
202
|
+
}], class: [{
|
|
203
|
+
type: Input
|
|
204
|
+
}] } });
|
|
205
|
+
/** Holds the steps; rendered only while the trace is expanded. */
|
|
206
|
+
export class ChainOfThoughtContentComponent {
|
|
207
|
+
/**
|
|
208
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
209
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
210
|
+
* rendering the class it was born with.
|
|
211
|
+
*/
|
|
212
|
+
ngOnChanges() {
|
|
213
|
+
this.cdr.markForCheck();
|
|
214
|
+
}
|
|
215
|
+
/** Extra Tailwind classes merged onto the content via `cn()` (last-wins). */
|
|
216
|
+
class = '';
|
|
217
|
+
service = inject(ChainOfThoughtService);
|
|
218
|
+
cdr = inject(ChangeDetectorRef);
|
|
219
|
+
sub = new Subscription();
|
|
220
|
+
isOpen = false;
|
|
221
|
+
ngOnInit() {
|
|
222
|
+
this.sub.add(this.service.open$.subscribe((open) => {
|
|
223
|
+
this.isOpen = open;
|
|
224
|
+
this.cdr.markForCheck();
|
|
225
|
+
}));
|
|
226
|
+
}
|
|
227
|
+
ngOnDestroy() {
|
|
228
|
+
this.sub.unsubscribe();
|
|
229
|
+
}
|
|
230
|
+
get computedClass() {
|
|
231
|
+
return cn('mt-2 flex flex-col', this.class);
|
|
232
|
+
}
|
|
233
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
234
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChainOfThoughtContentComponent, isStandalone: true, selector: "tolle-chain-of-thought-content", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
235
|
+
<div *ngIf="isOpen" data-state="open" [class]="computedClass">
|
|
236
|
+
<ng-content></ng-content>
|
|
237
|
+
</div>
|
|
238
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
239
|
+
}
|
|
240
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtContentComponent, decorators: [{
|
|
241
|
+
type: Component,
|
|
242
|
+
args: [{ selector: 'tolle-chain-of-thought-content', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
243
|
+
<div *ngIf="isOpen" data-state="open" [class]="computedClass">
|
|
244
|
+
<ng-content></ng-content>
|
|
245
|
+
</div>
|
|
246
|
+
`, styles: [":host{display:block}\n"] }]
|
|
247
|
+
}], propDecorators: { class: [{
|
|
248
|
+
type: Input
|
|
249
|
+
}] } });
|
|
250
|
+
/** One reasoning step: a marker on the rail, a label, and any projected detail. */
|
|
251
|
+
export class ChainOfThoughtStepComponent {
|
|
252
|
+
cdr = inject(ChangeDetectorRef);
|
|
253
|
+
/**
|
|
254
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
255
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
256
|
+
* rendering the class it was born with.
|
|
257
|
+
*/
|
|
258
|
+
ngOnChanges() {
|
|
259
|
+
this.cdr.markForCheck();
|
|
260
|
+
}
|
|
261
|
+
/** Text describing what happened in this step. @default '' */
|
|
262
|
+
label = '';
|
|
263
|
+
/** Progress of this step; drives the marker colour. @default 'complete' */
|
|
264
|
+
status = 'complete';
|
|
265
|
+
/** Remixicon class shown inside the step marker. @default 'ri-checkbox-blank-circle-fill' */
|
|
266
|
+
icon = 'ri-checkbox-blank-circle-fill';
|
|
267
|
+
/** Extra Tailwind classes merged onto the step via `cn()` (last-wins). */
|
|
268
|
+
class = '';
|
|
269
|
+
get computedClass() {
|
|
270
|
+
return cn(chainOfThoughtStepVariants({ status: this.status }), this.class);
|
|
271
|
+
}
|
|
272
|
+
get markerClass() {
|
|
273
|
+
return cn(chainOfThoughtMarkerVariants({ status: this.status }));
|
|
274
|
+
}
|
|
275
|
+
get labelClass() {
|
|
276
|
+
return cn('truncate text-sm', this.status === 'active' ? 'font-medium text-foreground' : 'text-muted-foreground');
|
|
277
|
+
}
|
|
278
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtStepComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
279
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChainOfThoughtStepComponent, isStandalone: true, selector: "tolle-chain-of-thought-step", inputs: { label: "label", status: "status", icon: "icon", class: "class" }, host: { properties: { "class": "computedClass", "attr.data-status": "status" } }, usesOnChanges: true, ngImport: i0, template: `
|
|
280
|
+
<span class="tolle-cot-rail absolute bottom-0 left-3 top-6 w-px -translate-x-1/2 bg-border" aria-hidden="true"></span>
|
|
281
|
+
<span [class]="markerClass">
|
|
282
|
+
<i [class]="icon" aria-hidden="true"></i>
|
|
283
|
+
</span>
|
|
284
|
+
<div class="min-w-0 flex-1 pt-0.5">
|
|
285
|
+
<p [class]="labelClass">{{ label }}</p>
|
|
286
|
+
<ng-content></ng-content>
|
|
287
|
+
</div>
|
|
288
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
289
|
+
}
|
|
290
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtStepComponent, decorators: [{
|
|
291
|
+
type: Component,
|
|
292
|
+
args: [{
|
|
293
|
+
selector: 'tolle-chain-of-thought-step',
|
|
294
|
+
standalone: true,
|
|
295
|
+
imports: [CommonModule],
|
|
296
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
297
|
+
host: { '[class]': 'computedClass', '[attr.data-status]': 'status' },
|
|
298
|
+
template: `
|
|
299
|
+
<span class="tolle-cot-rail absolute bottom-0 left-3 top-6 w-px -translate-x-1/2 bg-border" aria-hidden="true"></span>
|
|
300
|
+
<span [class]="markerClass">
|
|
301
|
+
<i [class]="icon" aria-hidden="true"></i>
|
|
302
|
+
</span>
|
|
303
|
+
<div class="min-w-0 flex-1 pt-0.5">
|
|
304
|
+
<p [class]="labelClass">{{ label }}</p>
|
|
305
|
+
<ng-content></ng-content>
|
|
306
|
+
</div>
|
|
307
|
+
`,
|
|
308
|
+
}]
|
|
309
|
+
}], propDecorators: { label: [{
|
|
310
|
+
type: Input
|
|
311
|
+
}], status: [{
|
|
312
|
+
type: Input
|
|
313
|
+
}], icon: [{
|
|
314
|
+
type: Input
|
|
315
|
+
}], class: [{
|
|
316
|
+
type: Input
|
|
317
|
+
}] } });
|
|
318
|
+
/** Wraps the result chips produced by a search step. */
|
|
319
|
+
export class ChainOfThoughtSearchResultsComponent {
|
|
320
|
+
cdr = inject(ChangeDetectorRef);
|
|
321
|
+
/**
|
|
322
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
323
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
324
|
+
* rendering the class it was born with.
|
|
325
|
+
*/
|
|
326
|
+
ngOnChanges() {
|
|
327
|
+
this.cdr.markForCheck();
|
|
328
|
+
}
|
|
329
|
+
/** Extra Tailwind classes merged onto the results row via `cn()` (last-wins). */
|
|
330
|
+
class = '';
|
|
331
|
+
cn = cn;
|
|
332
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtSearchResultsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
333
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChainOfThoughtSearchResultsComponent, isStandalone: true, selector: "tolle-chain-of-thought-search-results", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="cn('mt-1.5 flex flex-wrap items-center gap-1', class)"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
334
|
+
}
|
|
335
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtSearchResultsComponent, decorators: [{
|
|
336
|
+
type: Component,
|
|
337
|
+
args: [{ selector: 'tolle-chain-of-thought-search-results', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="cn('mt-1.5 flex flex-wrap items-center gap-1', class)"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
|
|
338
|
+
}], propDecorators: { class: [{
|
|
339
|
+
type: Input
|
|
340
|
+
}] } });
|
|
341
|
+
/** A single search result rendered as a small chip. */
|
|
342
|
+
export class ChainOfThoughtSearchResultComponent {
|
|
343
|
+
cdr = inject(ChangeDetectorRef);
|
|
344
|
+
/**
|
|
345
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
346
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
347
|
+
* rendering the class it was born with.
|
|
348
|
+
*/
|
|
349
|
+
ngOnChanges() {
|
|
350
|
+
this.cdr.markForCheck();
|
|
351
|
+
}
|
|
352
|
+
/** Optional remixicon class shown before the label. @default '' */
|
|
353
|
+
icon = '';
|
|
354
|
+
/** Extra Tailwind classes merged onto the chip via `cn()` (last-wins). */
|
|
355
|
+
class = '';
|
|
356
|
+
get computedClass() {
|
|
357
|
+
return cn('inline-flex max-w-full items-center gap-1 truncate rounded-full border border-border bg-muted px-2 py-0.5 text-xs text-muted-foreground', this.class);
|
|
358
|
+
}
|
|
359
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtSearchResultComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
360
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChainOfThoughtSearchResultComponent, isStandalone: true, selector: "tolle-chain-of-thought-search-result", inputs: { icon: "icon", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
361
|
+
<span [class]="computedClass">
|
|
362
|
+
<i *ngIf="icon" [class]="icon + ' shrink-0'" aria-hidden="true"></i>
|
|
363
|
+
<ng-content></ng-content>
|
|
364
|
+
</span>
|
|
365
|
+
`, isInline: true, styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
366
|
+
}
|
|
367
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChainOfThoughtSearchResultComponent, decorators: [{
|
|
368
|
+
type: Component,
|
|
369
|
+
args: [{ selector: 'tolle-chain-of-thought-search-result', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
370
|
+
<span [class]="computedClass">
|
|
371
|
+
<i *ngIf="icon" [class]="icon + ' shrink-0'" aria-hidden="true"></i>
|
|
372
|
+
<ng-content></ng-content>
|
|
373
|
+
</span>
|
|
374
|
+
`, styles: [":host{display:inline-flex}\n"] }]
|
|
375
|
+
}], propDecorators: { icon: [{
|
|
376
|
+
type: Input
|
|
377
|
+
}], class: [{
|
|
378
|
+
type: Input
|
|
379
|
+
}] } });
|
|
380
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW4tb2YtdGhvdWdodC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL2NoYWluLW9mLXRob3VnaHQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckssT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFxQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7OztBQUtoQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRTtJQUNuRCxRQUFRLEVBQUU7UUFDUixJQUFJLEVBQUU7WUFDSixFQUFFLEVBQUUsU0FBUztZQUNiLE9BQU8sRUFBRSxTQUFTO1NBQ25CO0tBQ0Y7SUFDRCxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO0NBQ3JDLENBQUMsQ0FBQztBQUlILE1BQU0sMEJBQTBCLEdBQUcsR0FBRztBQUNwQyw0RUFBNEU7QUFDNUUsa0RBQWtEO0FBQ2xELDBFQUEwRSxFQUMxRTtJQUNFLFFBQVEsRUFBRTtRQUNSLE1BQU0sRUFBRTtZQUNOLE9BQU8sRUFBRSx1QkFBdUI7WUFDaEMsTUFBTSxFQUFFLGlCQUFpQjtZQUN6QixRQUFRLEVBQUUsdUJBQXVCO1NBQ2xDO0tBQ0Y7SUFDRCxlQUFlLEVBQUUsRUFBRSxNQUFNLEVB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QUM7SUFFakQ7Ozs7T0FJRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxtRUFBbUU7SUFDMUQsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNuQiwwRUFBMEU7SUFDakUsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUVwQixJQUFJLGFBQWE7UUFDZixPQUFPLEVBQUUsQ0FDUCx5SUFBeUksRUFDekksSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUFDO0lBQ0osQ0FBQzt3R0F0QlUsbUNBQW1DOzRGQUFuQyxtQ0FBbUMsK0pBUHBDOzs7OztHQUtULHFHQVBTLFlBQVk7OzRGQVNYLG1DQUFtQztrQkFiL0MsU0FBUzsrQkFDRSxzQ0FBc0MsY0FFcEMsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUNOLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7O0dBS1Q7OEJBZVEsSUFBSTtzQkFBWixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBza2lwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgY3ZhLCB0eXBlIFZhcmlhbnRQcm9wcyB9IGZyb20gJ2NsYXNzLXZhcmlhbmNlLWF1dGhvcml0eSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuXG4vKiogUHJvZ3Jlc3Mgb2YgYSBzaW5nbGUgcmVhc29uaW5nIHN0ZXAuICovXG5leHBvcnQgdHlwZSBDaGFpbk9mVGhvdWdodFN0ZXBTdGF0dXMgPSAncGVuZGluZycgfCAnYWN0aXZlJyB8ICdjb21wbGV0ZSc7XG5cbmNvbnN0IGNoYWluT2ZUaG91Z2h0VmFyaWFudHMgPSBjdmEoJ3ctZnVsbCB0ZXh0LXNtJywge1xuICB2YXJpYW50czoge1xuICAgIHNpemU6IHtcbiAgICAgIHNtOiAndGV4dC14cycsXG4gICAgICBkZWZhdWx0OiAndGV4dC1zbScsXG4gICAgfSxcbiAgfSxcbiAgZGVmYXVsdFZhcmlhbnRzOiB7IHNpemU6ICdkZWZhdWx0JyB9LFxufSk7XG5cbmV4cG9ydCB0eXBlIENoYWluT2ZUaG91Z2h0UHJvcHMgPSBWYXJpYW50UHJvcHM8dHlwZW9mIGNoYWluT2ZUaG91Z2h0VmFyaWFudHM+O1xuXG5jb25zdCBjaGFpbk9mVGhvdWdodFN0ZXBWYXJpYW50cyA9IGN2YShcbiAgLy8gVGhlIHJhaWwgaXMgaGlkZGVuIG9uIHRoZSBmaW5hbCBzdGVwIHNvIHRoZSBsaW5lIHN0b3BzIGF0IHRoZSBsYXN0IG1hcmtlclxuICAvLyBpbnN0ZWFkIG9mIHRyYWlsaW5nIG9mZiB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LlxuICAncmVsYXRpdmUgZmxleCBnYXAtMyBwYi00IGxhc3Q6cGItMCBbJjpsYXN0LWNoaWxkXy50b2xsZS1jb3QtcmFpbF06aGlkZGVuJyxcbiAge1xuICAgIHZhcmlhbnRzOiB7XG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgcGVuZGluZzogJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCcsXG4gICAgICAgIGFjdGl2ZTogJ3RleHQtZm9yZWdyb3VuZCcsXG4gICAgICAgIGNvbXBsZXRlOiAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZhdWx0VmFyaWFudHM6IHsgc3RhdHVzOiAnY29tcGxldGUnIH0sXG4gIH1cbik7XG5cbmNvbnN0IGNoYWluT2ZUaG91Z2h0TWFya2VyVmFyaWFudHMgPSBjdmEoXG4gICdyZWxhdGl2ZSB6LVsxXSBmbGV4IGgtNiB3LTYgc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtZnVsbCBib3JkZXIgdGV4dC1bMTFweF0nLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBwZW5kaW5nOiAnYm9yZGVyLWJvcmRlciBiZy1iYWNrZ3JvdW5kIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCcsXG4gICAgICAgIGFjdGl2ZTogJ2JvcmRlci1pbmZvIGJnLWluZm8vMTAgdGV4dC1pbmZvJyxcbiAgICAgICAgY29tcGxldGU6ICdib3JkZXItc3VjY2Vzcy81MCBiZy1zdWNjZXNzLzEwIHRleHQtc3VjY2VzcycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGVmYXVsdFZhcmlhbnRzOiB7IHN0YXR1czogJ2NvbXBsZXRlJyB9LFxuICB9XG4pO1xuXG5leHBvcnQgdHlwZSBDaGFpbk9mVGhvdWdodFN0ZXBQcm9wcyA9IFZhcmlhbnRQcm9wczx0eXBlb2YgY2hhaW5PZlRob3VnaHRTdGVwVmFyaWFudHM+O1xuXG4vKipcbiAqIENvb3JkaW5hdGVzIGEgYHRvbGxlLWNoYWluLW9mLXRob3VnaHRgIGFuZCBpdHMgaGVhZGVyL2NvbnRlbnQgY2hpbGRyZW4uXG4gKlxuICogVGhlIGNoaWxkcmVuIGFyZSBgT25QdXNoYCBhbmQgcmVjZWl2ZSBub25lIG9mIHRoaXMgc3RhdGUgYXMgaW5wdXRzLCBzbyBpdFxuICogdHJhdmVscyBhcyBvYnNlcnZhYmxlcyBhbmQgZWFjaCBzdWJzY3JpYmVyIGNhbGxzIGBtYXJrRm9yQ2hlY2soKWAuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDaGFpbk9mVGhvdWdodFNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wZW5Tb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIEVtaXRzIHdoZXRoZXIgdGhlIHJlYXNvbmluZyB0cmFjZSBpcyBleHBhbmRlZC4gKi9cbiAgcmVhZG9ubHkgb3BlbiQgPSB0aGlzLm9wZW5Tb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgZ2V0IG9wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3BlblNvdXJjZS52YWx1ZTtcbiAgfVxuXG4gIHNldE9wZW4ob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZW5Tb3VyY2UudmFsdWUgIT09IG9wZW4pIHRoaXMub3BlblNvdXJjZS5uZXh0KG9wZW4pO1xuICB9XG5cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMub3BlblNvdXJjZS5uZXh0KCF0aGlzLm9wZW5Tb3VyY2UudmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogQSBjb2xsYXBzaWJsZSByZWFzb25pbmcgdHJhY2Ug4oCUIHRoZSBudW1iZXJlZCBzdGVwcyBhbiBhZ2VudCB3b3JrZWQgdGhyb3VnaFxuICogYmVmb3JlIGFuc3dlcmluZywgY29ubmVjdGVkIGJ5IGEgdmVydGljYWwgcmFpbC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8dG9sbGUtY2hhaW4tb2YtdGhvdWdodCBbb3Blbl09XCJ0cnVlXCI+XG4gKiAgIDx0b2xsZS1jaGFpbi1vZi10aG91Z2h0LWhlYWRlciBsYWJlbD1cIlRob3VnaHQgZm9yIDRzXCI+PC90b2xsZS1jaGFpbi1vZi10aG91Z2h0LWhlYWRlcj5cbiAqICAgPHRvbGxlLWNoYWluLW9mLXRob3VnaHQtY29udGVudD5cbiAqICAgICA8dG9sbGUtY2hhaW4tb2YtdGhvdWdodC1zdGVwIGxhYmVsPVwiU2VhcmNoZWQgdGhlIGRvY3NcIiBzdGF0dXM9XCJjb21wbGV0ZVwiIGljb249XCJyaS1zZWFyY2gtbGluZVwiPlxuICogICAgICAgPHRvbGxlLWNoYWluLW9mLXRob3VnaHQtc2VhcmNoLXJlc3VsdHM+XG4gKiAgICAgICAgIDx0b2xsZS1jaGFpbi1vZi10aG91Z2h0LXNlYXJjaC1yZXN1bHQ+dGFpbHdpbmQuY29uZmlnPC90b2xsZS1jaGFpbi1vZi10aG91Z2h0LXNlYXJjaC1yZXN1bHQ+XG4gKiAgICAgICA8L3RvbGxlLWNoYWluLW9mLXRob3VnaHQtc2VhcmNoLXJlc3VsdHM+XG4gKiAgICAgPC90b2xsZS1jaGFpbi1vZi10aG91Z2h0LXN0ZXA+XG4gKiAgIDwvdG9sbGUtY2hhaW4tb2YtdGhvdWdodC1jb250ZW50PlxuICogPC90b2xsZS1jaGFpbi1vZi10aG91Z2h0PlxuICogYGBgXG4gKiBAbmV3XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWNoYWluLW9mLXRob3VnaHQnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgcHJvdmlkZXJzOiBbQ2hhaW5PZlRob3VnaHRTZXJ2aWNlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2Rpdj5gLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFpbk9mVGhvdWdodENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHJlYXNvbmluZyBzdGVwcyBhcmUgZXhwYW5kZWQuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIG9wZW4gPSBmYWxzZTtcbiAgLyoqIFRleHQgc2NhbGUgb2YgdGhlIHdob2xlIHRyYWNlLiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgc2l6ZTogQ2hhaW5PZlRob3VnaHRQcm9wc1snc2l6ZSddID0gJ2RlZmF1bHQnO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgdHJhY2UgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICAvKiogRW1pdHRlZCB3aXRoIHRoZSBuZXcgZXhwYW5kZWQgc3RhdGUgd2hlbmV2ZXIgdGhlIHRyYWNlIG9wZW5zIG9yIGNsb3Nlcy4gKi9cbiAgQE91dHB1dCgpIG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlID0gaW5qZWN0KENoYWluT2ZUaG91Z2h0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VydmljZS5zZXRPcGVuKHRoaXMub3Blbik7XG4gICAgLy8gc2tpcCgxKSBkcm9wcyB0aGUgcmVwbGF5ZWQgaW5pdGlhbCB2YWx1ZSBzbyBubyBgb3BlbkNoYW5nZWAgZmlyZXMgb24gaW5pdC5cbiAgICB0aGlzLnN1Yi5hZGQodGhpcy5zZXJ2aWNlLm9wZW4kLnBpcGUoc2tpcCgxKSkuc3Vic2NyaWJlKChvcGVuKSA9PiB0aGlzLm9wZW5DaGFuZ2UuZW1pdChvcGVuKSkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2aWNlLnNldE9wZW4odGhpcy5vcGVuKTtcbiAgXG4gICAgLy8gQSBib3VuZCBgY2xhc3NgIGlucHV0IGlzIHdyaXR0ZW4gdGhyb3VnaCBBbmd1bGFyJ3Mgc3R5bGluZyBwYXRoLFxuICAgIC8vIHdoaWNoIGRvZXMgbm90IG1hcmsgYW4gT25QdXNoIHZpZXcgZGlydHkgb24gaXRzIG93bi5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oY2hhaW5PZlRob3VnaHRWYXJpYW50cyh7IHNpemU6IHRoaXMuc2l6ZSB9KSwgdGhpcy5jbGFzcyk7XG4gIH1cbn1cblxuLyoqIENsaWNrYWJsZSBoZWFkZXIgdGhhdCBleHBhbmRzIGFuZCBjb2xsYXBzZXMgdGhlIHJlYXNvbmluZyBzdGVwcy4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWNoYWluLW9mLXRob3VnaHQtaGVhZGVyJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgW2F0dHIuZGF0YS1zdGF0ZV09XCJpc09wZW4gPyAnb3BlbicgOiAnY2xvc2VkJ1wiXG4gICAgICBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgID5cbiAgICAgIDxpIGNsYXNzPVwicmktYnJhaW4tbGluZSBzaHJpbmstMCB0ZXh0LW11dGVkLWZvcmVncm91bmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICA8c3BhbiBjbGFzcz1cInRydW5jYXRlXCI+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8aVxuICAgICAgICBbY2xhc3NdPVwiaXNPcGVuID8gJ3JpLWFycm93LWRvd24tcy1saW5lIHNocmluay0wJyA6ICdyaS1hcnJvdy1yaWdodC1zLWxpbmUgc2hyaW5rLTAnXCJcbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgID48L2k+XG4gICAgPC9idXR0b24+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIENoYWluT2ZUaG91Z2h0SGVhZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBUZXh0IHNob3duIGluIHRoZSBoZWFkZXIuIEBkZWZhdWx0ICdDaGFpbiBvZiBUaG91Z2h0JyAqL1xuICBASW5wdXQoKSBsYWJlbCA9ICdDaGFpbiBvZiBUaG91Z2h0JztcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIGhlYWRlciB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZSA9IGluamVjdChDaGFpbk9mVGhvdWdodFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGlzT3BlbiA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3ViLmFkZChcbiAgICAgIHRoaXMuc2VydmljZS5vcGVuJC5zdWJzY3JpYmUoKG9wZW4pID0+IHtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBvcGVuO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oXG4gICAgICAnZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbWQgcHktMSB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBvdXRsaW5lLW5vbmUgdHJhbnNpdGlvbi1jb2xvcnMnLFxuICAgICAgJ2hvdmVyOnRleHQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZycsXG4gICAgICB0aGlzLmNsYXNzXG4gICAgKTtcbiAgfVxuXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2UudG9nZ2xlKCk7XG4gIH1cbn1cblxuLyoqIEhvbGRzIHRoZSBzdGVwczsgcmVuZGVyZWQgb25seSB3aGlsZSB0aGUgdHJhY2UgaXMgZXhwYW5kZWQuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1jaGFpbi1vZi10aG91Z2h0LWNvbnRlbnQnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAqbmdJZj1cImlzT3BlblwiIGRhdGEtc3RhdGU9XCJvcGVuXCIgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhaW5PZlRob3VnaHRDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBjb250ZW50IHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlID0gaW5qZWN0KENoYWluT2ZUaG91Z2h0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgaXNPcGVuID0gZmFsc2U7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWIuYWRkKFxuICAgICAgdGhpcy5zZXJ2aWNlLm9wZW4kLnN1YnNjcmliZSgob3BlbikgPT4ge1xuICAgICAgICB0aGlzLmlzT3BlbiA9IG9wZW47XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWIudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGdldCBjb21wdXRlZENsYXNzKCkge1xuICAgIHJldHVybiBjbignbXQtMiBmbGV4IGZsZXgtY29sJywgdGhpcy5jbGFzcyk7XG4gIH1cbn1cblxuLyoqIE9uZSByZWFzb25pbmcgc3RlcDogYSBtYXJrZXIgb24gdGhlIHJhaWwsIGEgbGFiZWwsIGFuZCBhbnkgcHJvamVjdGVkIGRldGFpbC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWNoYWluLW9mLXRob3VnaHQtc3RlcCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDogeyAnW2NsYXNzXSc6ICdjb21wdXRlZENsYXNzJywgJ1thdHRyLmRhdGEtc3RhdHVzXSc6ICdzdGF0dXMnIH0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPHNwYW4gY2xhc3M9XCJ0b2xsZS1jb3QtcmFpbCBhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTMgdG9wLTYgdy1weCAtdHJhbnNsYXRlLXgtMS8yIGJnLWJvcmRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICA8c3BhbiBbY2xhc3NdPVwibWFya2VyQ2xhc3NcIj5cbiAgICAgIDxpIFtjbGFzc109XCJpY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIDwvc3Bhbj5cbiAgICA8ZGl2IGNsYXNzPVwibWluLXctMCBmbGV4LTEgcHQtMC41XCI+XG4gICAgICA8cCBbY2xhc3NdPVwibGFiZWxDbGFzc1wiPnt7IGxhYmVsIH19PC9wPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFpbk9mVGhvdWdodFN0ZXBDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBUZXh0IGRlc2NyaWJpbmcgd2hhdCBoYXBwZW5lZCBpbiB0aGlzIHN0ZXAuIEBkZWZhdWx0ICcnICovXG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG4gIC8qKiBQcm9ncmVzcyBvZiB0aGlzIHN0ZXA7IGRyaXZlcyB0aGUgbWFya2VyIGNvbG91ci4gQGRlZmF1bHQgJ2NvbXBsZXRlJyAqL1xuICBASW5wdXQoKSBzdGF0dXM6IENoYWluT2ZUaG91Z2h0U3RlcFN0YXR1cyA9ICdjb21wbGV0ZSc7XG4gIC8qKiBSZW1peGljb24gY2xhc3Mgc2hvd24gaW5zaWRlIHRoZSBzdGVwIG1hcmtlci4gQGRlZmF1bHQgJ3JpLWNoZWNrYm94LWJsYW5rLWNpcmNsZS1maWxsJyAqL1xuICBASW5wdXQoKSBpY29uID0gJ3JpLWNoZWNrYm94LWJsYW5rLWNpcmNsZS1maWxsJztcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHN0ZXAgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oY2hhaW5PZlRob3VnaHRTdGVwVmFyaWFudHMoeyBzdGF0dXM6IHRoaXMuc3RhdHVzIH0pLCB0aGlzLmNsYXNzKTtcbiAgfVxuXG4gIGdldCBtYXJrZXJDbGFzcygpIHtcbiAgICByZXR1cm4gY24oY2hhaW5PZlRob3VnaHRNYXJrZXJWYXJpYW50cyh7IHN0YXR1czogdGhpcy5zdGF0dXMgfSkpO1xuICB9XG5cbiAgZ2V0IGxhYmVsQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKCd0cnVuY2F0ZSB0ZXh0LXNtJywgdGhpcy5zdGF0dXMgPT09ICdhY3RpdmUnID8gJ2ZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZCcgOiAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kJyk7XG4gIH1cbn1cblxuLyoqIFdyYXBzIHRoZSByZXN1bHQgY2hpcHMgcHJvZHVjZWQgYnkgYSBzZWFyY2ggc3RlcC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWNoYWluLW9mLXRob3VnaHQtc2VhcmNoLXJlc3VsdHMnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgPGRpdiBbY2xhc3NdPVwiY24oJ210LTEuNSBmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTEnLCBjbGFzcylcIj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9kaXY+YCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhaW5PZlRob3VnaHRTZWFyY2hSZXN1bHRzQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgcmVzdWx0cyByb3cgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgcHJvdGVjdGVkIGNuID0gY247XG59XG5cbi8qKiBBIHNpbmdsZSBzZWFyY2ggcmVzdWx0IHJlbmRlcmVkIGFzIGEgc21hbGwgY2hpcC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWNoYWluLW9mLXRob3VnaHQtc2VhcmNoLXJlc3VsdCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGlubGluZS1mbGV4OyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3BhbiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiPlxuICAgICAgPGkgKm5nSWY9XCJpY29uXCIgW2NsYXNzXT1cImljb24gKyAnIHNocmluay0wJ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L3NwYW4+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIENoYWluT2ZUaG91Z2h0U2VhcmNoUmVzdWx0Q29tcG9uZW50ICBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogT3B0aW9uYWwgcmVtaXhpY29uIGNsYXNzIHNob3duIGJlZm9yZSB0aGUgbGFiZWwuIEBkZWZhdWx0ICcnICovXG4gIEBJbnB1dCgpIGljb24gPSAnJztcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIGNoaXAgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oXG4gICAgICAnaW5saW5lLWZsZXggbWF4LXctZnVsbCBpdGVtcy1jZW50ZXIgZ2FwLTEgdHJ1bmNhdGUgcm91bmRlZC1mdWxsIGJvcmRlciBib3JkZXItYm9yZGVyIGJnLW11dGVkIHB4LTIgcHktMC41IHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kJyxcbiAgICAgIHRoaXMuY2xhc3NcbiAgICApO1xuICB9XG59XG4iXX0=
|