@visuno/angular 0.0.0-stage → 0.1.0
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/LICENSE +24 -0
- package/README.md +56 -2
- package/account-table/account-table.component.d.ts +72 -0
- package/action-log/action-log.component.d.ts +41 -0
- package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
- package/agent-inbox/agent-inbox.component.d.ts +75 -0
- package/agent-lanes/agent-lanes.component.d.ts +152 -0
- package/agent-phases/agent-phases.component.d.ts +62 -0
- package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
- package/agent-tree/agent-tree.component.d.ts +80 -0
- package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
- package/artifact-card/artifact-card.component.d.ts +145 -0
- package/attachment-tray/attachment-tray.component.d.ts +84 -0
- package/badge/badge.component.d.ts +25 -0
- package/bar-chart/bar-chart.component.d.ts +87 -0
- package/browser-session/browser-session.component.d.ts +70 -0
- package/buttons/buttons.component.d.ts +63 -0
- package/card/card.component.d.ts +21 -0
- package/change-review/change-review.component.d.ts +97 -0
- package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
- package/code-viewer/code-viewer.component.d.ts +86 -0
- package/composer/composer.component.d.ts +114 -0
- package/context-meter/context-meter.component.d.ts +60 -0
- package/core/icon.component.d.ts +10 -0
- package/core/reduced-motion.service.d.ts +15 -0
- package/decision-prompt/decision-prompt.component.d.ts +56 -0
- package/design-review/design-review.component.d.ts +108 -0
- package/design-tuner/design-tuner.component.d.ts +75 -0
- package/details-panel/details-panel.component.d.ts +150 -0
- package/donut-chart/donut-chart.component.d.ts +63 -0
- package/draft-review/draft-review.component.d.ts +128 -0
- package/error-recovery/error-recovery.component.d.ts +59 -0
- package/esm2022/account-table/account-table.component.mjs +399 -0
- package/esm2022/action-log/action-log.component.mjs +177 -0
- package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
- package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
- package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
- package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
- package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
- package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
- package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
- package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
- package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
- package/esm2022/badge/badge.component.mjs +97 -0
- package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
- package/esm2022/browser-session/browser-session.component.mjs +352 -0
- package/esm2022/buttons/buttons.component.mjs +215 -0
- package/esm2022/card/card.component.mjs +107 -0
- package/esm2022/change-review/change-review.component.mjs +398 -0
- package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
- package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
- package/esm2022/composer/composer.component.mjs +743 -0
- package/esm2022/context-meter/context-meter.component.mjs +275 -0
- package/esm2022/core/icon.component.mjs +111 -0
- package/esm2022/core/reduced-motion.service.mjs +34 -0
- package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
- package/esm2022/design-review/design-review.component.mjs +428 -0
- package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
- package/esm2022/details-panel/details-panel.component.mjs +537 -0
- package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
- package/esm2022/draft-review/draft-review.component.mjs +549 -0
- package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
- package/esm2022/eval-results/eval-results.component.mjs +368 -0
- package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
- package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
- package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
- package/esm2022/grid/grid.component.mjs +66 -0
- package/esm2022/health-score/health-score.component.mjs +420 -0
- package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
- package/esm2022/image-generation/image-generation.component.mjs +1028 -0
- package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
- package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
- package/esm2022/line-chart/line-chart.component.mjs +417 -0
- package/esm2022/live-answer/live-answer.component.mjs +411 -0
- package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
- package/esm2022/modal/modal.component.mjs +202 -0
- package/esm2022/model-picker/model-picker.component.mjs +491 -0
- package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
- package/esm2022/plan-review/plan-review.component.mjs +432 -0
- package/esm2022/progress/progress.component.mjs +503 -0
- package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
- package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
- package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
- package/esm2022/public-api.mjs +88 -0
- package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
- package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
- package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
- package/esm2022/response-versions/response-versions.component.mjs +288 -0
- package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
- package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
- package/esm2022/run-cost/run-cost.component.mjs +215 -0
- package/esm2022/run-queue/run-queue.component.mjs +481 -0
- package/esm2022/run-summary/run-summary.component.mjs +331 -0
- package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
- package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
- package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
- package/esm2022/source-stack/source-stack.component.mjs +245 -0
- package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
- package/esm2022/status-pill/status-pill.component.mjs +305 -0
- package/esm2022/steering/steering.component.mjs +343 -0
- package/esm2022/step-loader/step-loader.component.mjs +209 -0
- package/esm2022/task-table/task-table.component.mjs +534 -0
- package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
- package/esm2022/thinking/thinking.component.mjs +276 -0
- package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
- package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
- package/esm2022/toast/toast.component.mjs +195 -0
- package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
- package/esm2022/tool-call/tool-call.component.mjs +273 -0
- package/esm2022/tooltip/tooltip.component.mjs +417 -0
- package/esm2022/top-pages/top-pages.component.mjs +240 -0
- package/esm2022/trace-view/trace-view.component.mjs +440 -0
- package/esm2022/visuno-angular.mjs +5 -0
- package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
- package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
- package/esm2022/web-search/web-search.component.mjs +374 -0
- package/eval-results/eval-results.component.d.ts +67 -0
- package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
- package/fesm2022/visuno-angular.mjs +31992 -0
- package/fesm2022/visuno-angular.mjs.map +1 -0
- package/field-extraction/field-extraction.component.d.ts +82 -0
- package/funnel-chart/funnel-chart.component.d.ts +70 -0
- package/grid/grid.component.d.ts +22 -0
- package/health-score/health-score.component.d.ts +87 -0
- package/human-handoff/human-handoff.component.d.ts +125 -0
- package/image-generation/image-generation.component.d.ts +253 -0
- package/index.d.ts +5 -0
- package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
- package/launch-checklist/launch-checklist.component.d.ts +46 -0
- package/line-chart/line-chart.component.d.ts +89 -0
- package/live-answer/live-answer.component.d.ts +110 -0
- package/metric-insight/metric-insight.component.d.ts +110 -0
- package/modal/modal.component.d.ts +37 -0
- package/model-picker/model-picker.component.d.ts +97 -0
- package/package.json +51 -4
- package/permission-gate/permission-gate.component.d.ts +100 -0
- package/plan-review/plan-review.component.d.ts +86 -0
- package/progress/progress.component.d.ts +91 -0
- package/prompt-library/prompt-library.component.d.ts +121 -0
- package/prompt-starters/prompt-starters.component.d.ts +65 -0
- package/proposal-card/proposal-card.component.d.ts +101 -0
- package/public-api.d.ts +82 -0
- package/radar-chart/radar-chart.component.d.ts +110 -0
- package/radial-goals/radial-goals.component.d.ts +90 -0
- package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
- package/response-versions/response-versions.component.d.ts +54 -0
- package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
- package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
- package/run-cost/run-cost.component.d.ts +43 -0
- package/run-queue/run-queue.component.d.ts +93 -0
- package/run-summary/run-summary.component.d.ts +81 -0
- package/scatter-chart/scatter-chart.component.d.ts +139 -0
- package/score-breakdown/score-breakdown.component.d.ts +107 -0
- package/segmented-control/segmented-control.component.d.ts +44 -0
- package/source-stack/source-stack.component.d.ts +60 -0
- package/stat-cards/stat-cards.component.d.ts +86 -0
- package/status-pill/status-pill.component.d.ts +64 -0
- package/steering/steering.component.d.ts +75 -0
- package/step-loader/step-loader.component.d.ts +40 -0
- package/styles.css +424 -0
- package/task-table/task-table.component.d.ts +114 -0
- package/terminal-stream/terminal-stream.component.d.ts +110 -0
- package/thinking/thinking.component.d.ts +63 -0
- package/thinking-states/thinking-states.component.d.ts +51 -0
- package/thread-panel/thread-panel.component.d.ts +75 -0
- package/toast/toast.component.d.ts +56 -0
- package/toast-stack/toast-stack.component.d.ts +72 -0
- package/tokens.css +424 -0
- package/tool-call/tool-call.component.d.ts +61 -0
- package/tooltip/tooltip.component.d.ts +89 -0
- package/top-pages/top-pages.component.d.ts +75 -0
- package/trace-view/trace-view.component.d.ts +95 -0
- package/voice-capture/voice-capture.component.d.ts +103 -0
- package/voice-orb/voice-orb.component.d.ts +78 -0
- package/web-search/web-search.component.d.ts +77 -0
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
// framework/angular/model-picker/model-picker.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/model-picker/ModelPicker.tsx.
|
|
4
|
+
// A trigger names the picked model and how hard it thinks; it opens the list of
|
|
5
|
+
// models, each with speed, quality and cost as five-step meters (the real numbers
|
|
6
|
+
// on hover), and the thinking effort under them as a small dropdown. A busy model
|
|
7
|
+
// can offer a way out — a short notice with its own buttons. Inputs mirror the
|
|
8
|
+
// React props; callbacks become @Output EventEmitters.
|
|
9
|
+
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, inject, } from '@angular/core';
|
|
10
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
11
|
+
import { ReducedMotionService } from '../core/reduced-motion.service';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
const EFFORTS = [
|
|
14
|
+
{ label: 'Off', detail: 'Answers straight away' },
|
|
15
|
+
{ label: 'Low', detail: 'Up to 2k thinking tokens' },
|
|
16
|
+
{ label: 'Medium', detail: 'Up to 8k thinking tokens' },
|
|
17
|
+
{ label: 'High', detail: 'Up to 24k thinking tokens' },
|
|
18
|
+
];
|
|
19
|
+
/** Choose the model for a chat by speed, quality and cost, and how hard it thinks. */
|
|
20
|
+
export class ModelPickerComponent {
|
|
21
|
+
constructor() {
|
|
22
|
+
/** The models to choose from. */
|
|
23
|
+
this.models = [];
|
|
24
|
+
/** The thinking efforts. Defaults to Off, Low, Medium and High. */
|
|
25
|
+
this.efforts = EFFORTS;
|
|
26
|
+
/** A way out when the picked model can't take the request. */
|
|
27
|
+
this.suggestion = null;
|
|
28
|
+
/** The confirmation under the picker, shown with a green check. */
|
|
29
|
+
this.note = '';
|
|
30
|
+
/** The label beside the trigger. Defaults to "Model for this chat". */
|
|
31
|
+
this.label = 'Model for this chat';
|
|
32
|
+
this.defaultOpen = true;
|
|
33
|
+
/** Emitted when a row is picked, busy or not, so you can check the model first. */
|
|
34
|
+
this.valueChange = new EventEmitter();
|
|
35
|
+
this.effortChange = new EventEmitter();
|
|
36
|
+
this.openChange = new EventEmitter();
|
|
37
|
+
this.motion = inject(ReducedMotionService);
|
|
38
|
+
/** The five meter steps. */
|
|
39
|
+
this.bars = [1, 2, 3, 4, 5];
|
|
40
|
+
// internal state holds its own when the matching input is left out (uncontrolled)
|
|
41
|
+
this.curId = '';
|
|
42
|
+
this.effLabel = '';
|
|
43
|
+
this.openState = true;
|
|
44
|
+
this.effOpen = false;
|
|
45
|
+
this.onOutside = (e) => {
|
|
46
|
+
if (!this.effOpen)
|
|
47
|
+
return;
|
|
48
|
+
const t = e.target;
|
|
49
|
+
if (this.pop?.nativeElement.contains(t) || this.effBtn?.nativeElement.contains(t))
|
|
50
|
+
return;
|
|
51
|
+
this.effOpen = false;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
ngOnChanges(changes) {
|
|
55
|
+
if (changes['value'] || changes['defaultValue'] || changes['models']) {
|
|
56
|
+
this.curId = this.value ?? this.defaultValue ?? this.models[0]?.id ?? this.curId ?? '';
|
|
57
|
+
}
|
|
58
|
+
if (changes['effort'] || changes['defaultEffort'] || changes['efforts']) {
|
|
59
|
+
this.effLabel =
|
|
60
|
+
this.effort ??
|
|
61
|
+
this.defaultEffort ??
|
|
62
|
+
this.efforts[Math.min(2, this.efforts.length - 1)]?.label ??
|
|
63
|
+
this.effLabel ??
|
|
64
|
+
'';
|
|
65
|
+
}
|
|
66
|
+
if (changes['open'] || changes['defaultOpen']) {
|
|
67
|
+
this.openState = this.open ?? this.defaultOpen;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
ngAfterViewInit() {
|
|
71
|
+
// close the effort menu on an outside click
|
|
72
|
+
document.addEventListener('pointerdown', this.onOutside, true);
|
|
73
|
+
}
|
|
74
|
+
ngOnDestroy() {
|
|
75
|
+
document.removeEventListener('pointerdown', this.onOutside, true);
|
|
76
|
+
if (this.closeTimer)
|
|
77
|
+
clearTimeout(this.closeTimer);
|
|
78
|
+
}
|
|
79
|
+
get picked() {
|
|
80
|
+
return this.models.find((m) => m.id === this.curId) ?? this.models[0];
|
|
81
|
+
}
|
|
82
|
+
get eff() {
|
|
83
|
+
return this.effLabel;
|
|
84
|
+
}
|
|
85
|
+
get isOpen() {
|
|
86
|
+
return this.open ?? this.openState;
|
|
87
|
+
}
|
|
88
|
+
get effortDetail() {
|
|
89
|
+
return this.efforts.find((e) => e.label === this.eff)?.detail ?? '';
|
|
90
|
+
}
|
|
91
|
+
rowNote(m) {
|
|
92
|
+
return (m.status && m.status !== 'ready' && m.statusText) || m.note || '';
|
|
93
|
+
}
|
|
94
|
+
pick(i) {
|
|
95
|
+
const id = this.models[i]?.id;
|
|
96
|
+
if (id === undefined)
|
|
97
|
+
return;
|
|
98
|
+
if (this.value === undefined)
|
|
99
|
+
this.curId = id;
|
|
100
|
+
this.valueChange.emit(id);
|
|
101
|
+
}
|
|
102
|
+
chooseEffort(label) {
|
|
103
|
+
if (this.effort === undefined)
|
|
104
|
+
this.effLabel = label;
|
|
105
|
+
this.effortChange.emit(label);
|
|
106
|
+
this.closeEffSoon();
|
|
107
|
+
}
|
|
108
|
+
toggleOpen() {
|
|
109
|
+
this.setOpen(!this.isOpen);
|
|
110
|
+
}
|
|
111
|
+
setOpen(v) {
|
|
112
|
+
if (this.open === undefined)
|
|
113
|
+
this.openState = v;
|
|
114
|
+
this.openChange.emit(v);
|
|
115
|
+
}
|
|
116
|
+
toggleEff() {
|
|
117
|
+
this.effOpen = !this.effOpen;
|
|
118
|
+
}
|
|
119
|
+
closeEffSoon() {
|
|
120
|
+
if (this.closeTimer)
|
|
121
|
+
clearTimeout(this.closeTimer);
|
|
122
|
+
this.closeTimer = setTimeout(() => (this.effOpen = false), this.motion.reduce() ? 0 : 120);
|
|
123
|
+
}
|
|
124
|
+
onKeydown(e) {
|
|
125
|
+
// Escape closes the open list and gives the trigger the focus back
|
|
126
|
+
if (e.key === 'Escape') {
|
|
127
|
+
if (this.effOpen) {
|
|
128
|
+
this.effOpen = false;
|
|
129
|
+
this.effBtn?.nativeElement.focus({ preventScroll: true });
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (this.isOpen) {
|
|
133
|
+
this.setOpen(false);
|
|
134
|
+
this.trigger?.nativeElement.focus({ preventScroll: true });
|
|
135
|
+
}
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
// arrow keys move through the models, as in any radio group
|
|
139
|
+
const target = e.target;
|
|
140
|
+
const row = target?.closest('.vo-mpk-o');
|
|
141
|
+
if (!row)
|
|
142
|
+
return;
|
|
143
|
+
const step = { ArrowDown: 1, ArrowRight: 1, ArrowUp: -1, ArrowLeft: -1 }[e.key];
|
|
144
|
+
if (!step)
|
|
145
|
+
return;
|
|
146
|
+
e.preventDefault();
|
|
147
|
+
const rows = Array.from(row.parentElement?.querySelectorAll('.vo-mpk-o') ?? []);
|
|
148
|
+
const from = rows.indexOf(row);
|
|
149
|
+
const i = (from + step + this.models.length) % this.models.length;
|
|
150
|
+
rows[i]?.focus({ preventScroll: true });
|
|
151
|
+
this.pick(i);
|
|
152
|
+
}
|
|
153
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModelPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
154
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ModelPickerComponent, isStandalone: true, selector: "vo-model-picker", inputs: { models: "models", value: "value", defaultValue: "defaultValue", efforts: "efforts", effort: "effort", defaultEffort: "defaultEffort", suggestion: "suggestion", note: "note", label: "label", open: "open", defaultOpen: "defaultOpen" }, outputs: { valueChange: "valueChange", effortChange: "effortChange", openChange: "openChange" }, viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "effBtn", first: true, predicate: ["effBtn"], descendants: true }, { propertyName: "pop", first: true, predicate: ["pop"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
155
|
+
<div
|
|
156
|
+
#root
|
|
157
|
+
data-vo=""
|
|
158
|
+
class="vo-mpk"
|
|
159
|
+
(keydown)="onKeydown($event)"
|
|
160
|
+
>
|
|
161
|
+
<div class="vo-mpk-top">
|
|
162
|
+
<span class="vo-muted vo-mpk-lb">{{ label }}</span>
|
|
163
|
+
<button
|
|
164
|
+
#trigger
|
|
165
|
+
type="button"
|
|
166
|
+
class="vo-mpk-tr"
|
|
167
|
+
aria-haspopup="true"
|
|
168
|
+
[attr.aria-expanded]="isOpen"
|
|
169
|
+
(click)="toggleOpen()"
|
|
170
|
+
>
|
|
171
|
+
<span class="vo-mpk-mk" [style.--vo-mc]="picked?.color" [style.--vo-mt]="picked?.markText">
|
|
172
|
+
{{ picked?.mark ?? picked?.name?.[0] }}
|
|
173
|
+
</span>
|
|
174
|
+
<span class="vo-mpk-nm">{{ picked?.name ?? '' }}</span>
|
|
175
|
+
<span class="vo-mpk-ef vo-muted">{{ eff }}</span>
|
|
176
|
+
<vo-icon name="chev-d" size="xs"></vo-icon>
|
|
177
|
+
</button>
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
<div class="vo-fold vo-mpk-fold" [class.vo-shut]="!isOpen" [attr.inert]="isOpen ? null : ''">
|
|
181
|
+
<div>
|
|
182
|
+
<div class="vo-mpk-p vo-panel">
|
|
183
|
+
<div class="vo-mpk-hd" aria-hidden="true">
|
|
184
|
+
<span></span><span></span><span>Speed</span><span>Quality</span><span>Cost</span>
|
|
185
|
+
</div>
|
|
186
|
+
|
|
187
|
+
<div class="vo-mpk-list" role="radiogroup" aria-label="Model">
|
|
188
|
+
@for (m of models; track m.id; let i = $index) {
|
|
189
|
+
<button
|
|
190
|
+
type="button"
|
|
191
|
+
role="radio"
|
|
192
|
+
[attr.aria-checked]="m.id === picked?.id"
|
|
193
|
+
[tabIndex]="m.id === picked?.id ? 0 : -1"
|
|
194
|
+
class="vo-mpk-o"
|
|
195
|
+
[class.vo-busy]="m.status === 'busy'"
|
|
196
|
+
(click)="pick(i)"
|
|
197
|
+
>
|
|
198
|
+
<span class="vo-mpk-mk" [style.--vo-mc]="m.color" [style.--vo-mt]="m.markText">
|
|
199
|
+
{{ m.mark ?? m.name[0] }}
|
|
200
|
+
</span>
|
|
201
|
+
<span class="vo-t">
|
|
202
|
+
<b
|
|
203
|
+
>{{ m.name
|
|
204
|
+
}}<span class="vo-ck">
|
|
205
|
+
@if (m.status === 'checking') {
|
|
206
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
207
|
+
} @else {
|
|
208
|
+
<vo-icon name="check" size="xs"></vo-icon>
|
|
209
|
+
}
|
|
210
|
+
</span></b
|
|
211
|
+
>
|
|
212
|
+
<span class="vo-d">{{ rowNote(m) }}</span>
|
|
213
|
+
</span>
|
|
214
|
+
<span class="vo-mpk-m" [attr.data-tip]="m.speedDetail" [attr.aria-hidden]="m.speedDetail ? null : true">
|
|
215
|
+
@for (k of bars; track k) {
|
|
216
|
+
<i [class.vo-on]="k <= m.speed"></i>
|
|
217
|
+
}
|
|
218
|
+
</span>
|
|
219
|
+
<span class="vo-mpk-m" [attr.data-tip]="m.qualityDetail" [attr.aria-hidden]="m.qualityDetail ? null : true">
|
|
220
|
+
@for (k of bars; track k) {
|
|
221
|
+
<i [class.vo-on]="k <= m.quality"></i>
|
|
222
|
+
}
|
|
223
|
+
</span>
|
|
224
|
+
<span class="vo-mpk-m" [attr.data-tip]="m.costDetail" [attr.aria-hidden]="m.costDetail ? null : true">
|
|
225
|
+
@for (k of bars; track k) {
|
|
226
|
+
<i [class.vo-on]="k <= m.cost"></i>
|
|
227
|
+
}
|
|
228
|
+
</span>
|
|
229
|
+
</button>
|
|
230
|
+
}
|
|
231
|
+
</div>
|
|
232
|
+
|
|
233
|
+
<div class="vo-fold" [class.vo-shut]="!suggestion" [attr.inert]="suggestion ? null : ''">
|
|
234
|
+
<div>
|
|
235
|
+
<div class="vo-mpk-sg" aria-live="polite">
|
|
236
|
+
<p class="vo-mpk-sgt">{{ suggestion?.text }}</p>
|
|
237
|
+
<div class="vo-mpk-sga">
|
|
238
|
+
@for (a of suggestion?.actions ?? []; track a.label; let last = $last) {
|
|
239
|
+
<button
|
|
240
|
+
type="button"
|
|
241
|
+
class="vo-pill vo-sm"
|
|
242
|
+
[class.vo-primary]="last"
|
|
243
|
+
[class.vo-ghost]="!last"
|
|
244
|
+
(click)="a.onClick()"
|
|
245
|
+
>
|
|
246
|
+
{{ a.label }}
|
|
247
|
+
</button>
|
|
248
|
+
}
|
|
249
|
+
</div>
|
|
250
|
+
</div>
|
|
251
|
+
</div>
|
|
252
|
+
</div>
|
|
253
|
+
|
|
254
|
+
<div class="vo-mpk-th">
|
|
255
|
+
<div class="vo-mpk-thh">
|
|
256
|
+
<b><vo-icon name="cpu" size="xs"></vo-icon>Thinking</b>
|
|
257
|
+
<span class="vo-muted vo-mpk-thd">{{ effortDetail }}</span>
|
|
258
|
+
</div>
|
|
259
|
+
<button
|
|
260
|
+
#effBtn
|
|
261
|
+
type="button"
|
|
262
|
+
class="vo-mpk-eb"
|
|
263
|
+
aria-haspopup="menu"
|
|
264
|
+
[attr.aria-expanded]="effOpen"
|
|
265
|
+
aria-label="Thinking effort"
|
|
266
|
+
(click)="toggleEff()"
|
|
267
|
+
>
|
|
268
|
+
<span class="vo-mpk-ev">{{ eff }}</span>
|
|
269
|
+
<vo-icon name="chev-d" size="xs"></vo-icon>
|
|
270
|
+
</button>
|
|
271
|
+
</div>
|
|
272
|
+
</div>
|
|
273
|
+
</div>
|
|
274
|
+
</div>
|
|
275
|
+
|
|
276
|
+
<div #pop class="vo-pop vo-mpk-pop" [class.vo-open]="effOpen" role="menu" aria-label="Thinking effort">
|
|
277
|
+
@for (e of efforts; track e.label) {
|
|
278
|
+
<button
|
|
279
|
+
type="button"
|
|
280
|
+
class="vo-mi"
|
|
281
|
+
role="menuitemradio"
|
|
282
|
+
[attr.aria-checked]="e.label === eff"
|
|
283
|
+
(click)="chooseEffort(e.label)"
|
|
284
|
+
>
|
|
285
|
+
<span
|
|
286
|
+
>{{ e.label }}@if (e.detail) {
|
|
287
|
+
<span class="vo-d">{{ e.detail }}</span>
|
|
288
|
+
}</span
|
|
289
|
+
>
|
|
290
|
+
<span class="vo-ck"><vo-icon name="check" size="xs"></vo-icon></span>
|
|
291
|
+
</button>
|
|
292
|
+
}
|
|
293
|
+
</div>
|
|
294
|
+
|
|
295
|
+
<p class="vo-mpk-note vo-muted" aria-live="polite">
|
|
296
|
+
@if (note) {
|
|
297
|
+
<vo-icon name="ok" size="xs"></vo-icon><span>{{ note }}</span>
|
|
298
|
+
}
|
|
299
|
+
</p>
|
|
300
|
+
</div>
|
|
301
|
+
`, isInline: true, styles: [".vo-mpk{position:relative;display:flex;flex-direction:column;gap:var(--vo-s-2);width:100%;max-width:420px;margin:0 auto}.vo-mpk-top{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:0 2px}.vo-mpk-lb{font-size:12.5px}.vo-mpk-tr{display:inline-flex;align-items:center;gap:7px;height:32px;padding:0 10px 0 6px;border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:var(--vo-shadow);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:box-shadow .16s}@media (hover:hover) and (pointer:fine){.vo-mpk-tr:hover{box-shadow:var(--vo-shadow-pop)}}.vo-mpk-tr>.vo-i{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-mpk-tr[aria-expanded=true]>.vo-i{transform:rotate(180deg)}.vo-mpk-tr:focus-visible{outline:2px solid var(--vo-focus);outline-offset:2px}.vo-mpk-ef{font-weight:400;font-size:12.5px}.vo-mpk-mk{width:20px;height:20px;border-radius:calc(6px * var(--vo-rk));display:grid;place-items:center;font-size:11px;font-weight:500;color:var(--vo-mt,var(--vo-on-ink));background:var(--vo-mc,var(--vo-fg2));flex:none;transition:background .32s}.vo-mpk-p{padding:6px;display:flex;flex-direction:column}.vo-mpk-hd,.vo-mpk-o{display:grid;grid-template-columns:20px minmax(0,1fr) repeat(3,34px);align-items:center;gap:10px}.vo-mpk-hd{padding:var(--vo-s-1) 10px 2px;font-size:11px;color:var(--vo-muted)}.vo-mpk-hd span{text-align:center}.vo-mpk-o{width:100%;padding:var(--vo-s-2) 10px;border-radius:var(--vo-r-in);text-align:left;font-size:13px;cursor:pointer;transition:background .16s}@media (hover:hover) and (pointer:fine){.vo-mpk-o:hover{background:var(--vo-row)}}.vo-mpk-o[aria-checked=true]{background:var(--vo-sel)}.vo-mpk-o[aria-checked=true] .vo-d{color:var(--vo-fg2)}.vo-mpk-o:focus-visible{outline:2px solid var(--vo-focus);outline-offset:-2px}.vo-mpk-o .vo-t{display:flex;flex-direction:column;min-width:0}.vo-mpk-o .vo-t b{font-weight:500;display:flex;align-items:center;gap:6px}.vo-mpk-o .vo-ck{display:grid;color:var(--vo-accent-fg,var(--vo-accent));opacity:0;transform:scale(.6);transition:opacity .16s,transform .32s var(--vo-ease)}.vo-mpk-o[aria-checked=true] .vo-ck,.vo-mpk-o .vo-ck:has(.vo-spin){opacity:1;transform:none}.vo-mpk-o .vo-ck .vo-spin{width:10px;height:10px;color:var(--vo-muted)}.vo-mpk-o .vo-d{font-size:12px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-mpk-o.vo-busy .vo-d{color:var(--vo-warn)}.vo-mpk-o.vo-busy .vo-mpk-mk{background:var(--vo-warn-mark);color:var(--vo-on-ink)}.vo-mpk-m{display:flex;gap:2px;height:8px}.vo-mpk-m i{flex:1;border-radius:2px;background:var(--vo-rail);transition:background .32s}.vo-mpk-m i.vo-on{background:var(--vo-fg2)}.vo-mpk-o[aria-checked=true]:not(.vo-busy) .vo-mpk-m i.vo-on{background:var(--vo-accent-mark,var(--vo-accent))}.vo-mpk-sg{margin:var(--vo-s-1) var(--vo-s-1) 2px;padding:10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-warn-bg);display:flex;flex-direction:column;gap:var(--vo-s-2)}.vo-mpk-sgt{margin:0;font-size:12.5px;line-height:1.45}.vo-mpk-sga{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:6px}.vo-mpk-sg .vo-pill.vo-ghost{background:var(--vo-surface);color:var(--vo-fg);box-shadow:var(--vo-shadow)}@media (hover:hover) and (pointer:fine){.vo-mpk-sg .vo-pill.vo-ghost:hover{box-shadow:var(--vo-shadow-pop)}}.vo-mpk-th{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--vo-s-2) var(--vo-s-3);padding:var(--vo-s-3) 10px 6px;margin:6px var(--vo-s-1) 0;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-mpk-thh{display:flex;flex-direction:column;min-width:0;font-size:13px}.vo-mpk-thh b{font-weight:500;display:flex;align-items:center;gap:6px}.vo-mpk-thh b .vo-i{color:var(--vo-muted)}.vo-mpk-thd{font-size:12px}.vo-mpk-eb{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 var(--vo-s-2) 0 10px;border-radius:var(--vo-r-pill);background:var(--vo-chip);font-size:13px;cursor:pointer;transition:background .16s}.vo-mpk-eb[aria-expanded=true]{background:var(--vo-hover)}@media (hover:hover) and (pointer:fine){.vo-mpk-eb:hover{background:var(--vo-hover)}}.vo-mpk-eb>.vo-i{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-mpk-eb[aria-expanded=true]>.vo-i{transform:rotate(180deg)}.vo-mpk-pop{min-width:220px}.vo-mpk-note{margin:0;padding:0 2px;font-size:12.5px;min-height:20px;display:flex;align-items:center;gap:6px}.vo-mpk-note .vo-i{color:var(--vo-ok);flex:none}@media (max-width:480px){.vo-mpk-hd,.vo-mpk-o{grid-template-columns:20px minmax(0,1fr) repeat(3,34px);gap:6px}.vo-mpk-hd{font-size:10.5px;padding-inline:6px}.vo-mpk-o{padding-inline:6px}.vo-mpk-o .vo-d{white-space:normal}}.vo-muted{color:var(--vo-muted)}.vo-fg2{color:var(--vo-fg2)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-primary{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-primary:hover{background:var(--vo-accent-2)}}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.vo-fold{display:grid;grid-template-rows:1fr;grid-template-columns:minmax(0,1fr);transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease)}.vo-fold>*{overflow:clip;overflow-clip-margin:12px;min-height:0;min-width:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0;visibility:hidden;transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease),visibility 0s var(--vo-t)}.vo-pop{position:absolute;right:0;z-index:50;min-width:200px;background:var(--vo-raised);border-radius:calc(14px * var(--vo-rk));box-shadow:var(--vo-shadow-pop);padding:6px;opacity:0;visibility:hidden;pointer-events:none;transform:translateY(6px) scale(.98);transform-origin:top right;filter:blur(3px);transition:opacity .2s var(--vo-ease),transform .35s var(--vo-ease),filter .2s var(--vo-ease),visibility 0s .2s}.vo-pop.vo-open{opacity:1;visibility:visible;pointer-events:auto;transform:none;filter:none;transition-property:opacity,transform,filter}.vo-mi{display:flex;align-items:center;gap:10px;width:100%;padding:7px var(--vo-s-2);border-radius:calc(9px * var(--vo-rk));font-size:13px;text-align:left;color:var(--vo-fg);cursor:pointer;transition:background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-mi:hover{background:var(--vo-row)}}.vo-mi+.vo-mi{margin-top:2px}.vo-mi .vo-i{color:var(--vo-fg2)}.vo-mi .vo-d{display:block;font-size:12px;color:var(--vo-muted)}@media (hover:hover) and (pointer:fine){.vo-mi:is(:hover,[aria-checked=true]) .vo-d{color:var(--vo-fg2)}}.vo-mi .vo-ck{margin-left:auto;color:var(--vo-accent-fg,var(--vo-accent));opacity:0;transition:opacity var(--vo-t-fast)}.vo-mi[aria-checked=true] .vo-ck{opacity:1}.vo-mi[aria-checked=true]{background:var(--vo-row);font-weight:500}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
302
|
+
}
|
|
303
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModelPickerComponent, decorators: [{
|
|
304
|
+
type: Component,
|
|
305
|
+
args: [{ selector: 'vo-model-picker', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
|
|
306
|
+
<div
|
|
307
|
+
#root
|
|
308
|
+
data-vo=""
|
|
309
|
+
class="vo-mpk"
|
|
310
|
+
(keydown)="onKeydown($event)"
|
|
311
|
+
>
|
|
312
|
+
<div class="vo-mpk-top">
|
|
313
|
+
<span class="vo-muted vo-mpk-lb">{{ label }}</span>
|
|
314
|
+
<button
|
|
315
|
+
#trigger
|
|
316
|
+
type="button"
|
|
317
|
+
class="vo-mpk-tr"
|
|
318
|
+
aria-haspopup="true"
|
|
319
|
+
[attr.aria-expanded]="isOpen"
|
|
320
|
+
(click)="toggleOpen()"
|
|
321
|
+
>
|
|
322
|
+
<span class="vo-mpk-mk" [style.--vo-mc]="picked?.color" [style.--vo-mt]="picked?.markText">
|
|
323
|
+
{{ picked?.mark ?? picked?.name?.[0] }}
|
|
324
|
+
</span>
|
|
325
|
+
<span class="vo-mpk-nm">{{ picked?.name ?? '' }}</span>
|
|
326
|
+
<span class="vo-mpk-ef vo-muted">{{ eff }}</span>
|
|
327
|
+
<vo-icon name="chev-d" size="xs"></vo-icon>
|
|
328
|
+
</button>
|
|
329
|
+
</div>
|
|
330
|
+
|
|
331
|
+
<div class="vo-fold vo-mpk-fold" [class.vo-shut]="!isOpen" [attr.inert]="isOpen ? null : ''">
|
|
332
|
+
<div>
|
|
333
|
+
<div class="vo-mpk-p vo-panel">
|
|
334
|
+
<div class="vo-mpk-hd" aria-hidden="true">
|
|
335
|
+
<span></span><span></span><span>Speed</span><span>Quality</span><span>Cost</span>
|
|
336
|
+
</div>
|
|
337
|
+
|
|
338
|
+
<div class="vo-mpk-list" role="radiogroup" aria-label="Model">
|
|
339
|
+
@for (m of models; track m.id; let i = $index) {
|
|
340
|
+
<button
|
|
341
|
+
type="button"
|
|
342
|
+
role="radio"
|
|
343
|
+
[attr.aria-checked]="m.id === picked?.id"
|
|
344
|
+
[tabIndex]="m.id === picked?.id ? 0 : -1"
|
|
345
|
+
class="vo-mpk-o"
|
|
346
|
+
[class.vo-busy]="m.status === 'busy'"
|
|
347
|
+
(click)="pick(i)"
|
|
348
|
+
>
|
|
349
|
+
<span class="vo-mpk-mk" [style.--vo-mc]="m.color" [style.--vo-mt]="m.markText">
|
|
350
|
+
{{ m.mark ?? m.name[0] }}
|
|
351
|
+
</span>
|
|
352
|
+
<span class="vo-t">
|
|
353
|
+
<b
|
|
354
|
+
>{{ m.name
|
|
355
|
+
}}<span class="vo-ck">
|
|
356
|
+
@if (m.status === 'checking') {
|
|
357
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
358
|
+
} @else {
|
|
359
|
+
<vo-icon name="check" size="xs"></vo-icon>
|
|
360
|
+
}
|
|
361
|
+
</span></b
|
|
362
|
+
>
|
|
363
|
+
<span class="vo-d">{{ rowNote(m) }}</span>
|
|
364
|
+
</span>
|
|
365
|
+
<span class="vo-mpk-m" [attr.data-tip]="m.speedDetail" [attr.aria-hidden]="m.speedDetail ? null : true">
|
|
366
|
+
@for (k of bars; track k) {
|
|
367
|
+
<i [class.vo-on]="k <= m.speed"></i>
|
|
368
|
+
}
|
|
369
|
+
</span>
|
|
370
|
+
<span class="vo-mpk-m" [attr.data-tip]="m.qualityDetail" [attr.aria-hidden]="m.qualityDetail ? null : true">
|
|
371
|
+
@for (k of bars; track k) {
|
|
372
|
+
<i [class.vo-on]="k <= m.quality"></i>
|
|
373
|
+
}
|
|
374
|
+
</span>
|
|
375
|
+
<span class="vo-mpk-m" [attr.data-tip]="m.costDetail" [attr.aria-hidden]="m.costDetail ? null : true">
|
|
376
|
+
@for (k of bars; track k) {
|
|
377
|
+
<i [class.vo-on]="k <= m.cost"></i>
|
|
378
|
+
}
|
|
379
|
+
</span>
|
|
380
|
+
</button>
|
|
381
|
+
}
|
|
382
|
+
</div>
|
|
383
|
+
|
|
384
|
+
<div class="vo-fold" [class.vo-shut]="!suggestion" [attr.inert]="suggestion ? null : ''">
|
|
385
|
+
<div>
|
|
386
|
+
<div class="vo-mpk-sg" aria-live="polite">
|
|
387
|
+
<p class="vo-mpk-sgt">{{ suggestion?.text }}</p>
|
|
388
|
+
<div class="vo-mpk-sga">
|
|
389
|
+
@for (a of suggestion?.actions ?? []; track a.label; let last = $last) {
|
|
390
|
+
<button
|
|
391
|
+
type="button"
|
|
392
|
+
class="vo-pill vo-sm"
|
|
393
|
+
[class.vo-primary]="last"
|
|
394
|
+
[class.vo-ghost]="!last"
|
|
395
|
+
(click)="a.onClick()"
|
|
396
|
+
>
|
|
397
|
+
{{ a.label }}
|
|
398
|
+
</button>
|
|
399
|
+
}
|
|
400
|
+
</div>
|
|
401
|
+
</div>
|
|
402
|
+
</div>
|
|
403
|
+
</div>
|
|
404
|
+
|
|
405
|
+
<div class="vo-mpk-th">
|
|
406
|
+
<div class="vo-mpk-thh">
|
|
407
|
+
<b><vo-icon name="cpu" size="xs"></vo-icon>Thinking</b>
|
|
408
|
+
<span class="vo-muted vo-mpk-thd">{{ effortDetail }}</span>
|
|
409
|
+
</div>
|
|
410
|
+
<button
|
|
411
|
+
#effBtn
|
|
412
|
+
type="button"
|
|
413
|
+
class="vo-mpk-eb"
|
|
414
|
+
aria-haspopup="menu"
|
|
415
|
+
[attr.aria-expanded]="effOpen"
|
|
416
|
+
aria-label="Thinking effort"
|
|
417
|
+
(click)="toggleEff()"
|
|
418
|
+
>
|
|
419
|
+
<span class="vo-mpk-ev">{{ eff }}</span>
|
|
420
|
+
<vo-icon name="chev-d" size="xs"></vo-icon>
|
|
421
|
+
</button>
|
|
422
|
+
</div>
|
|
423
|
+
</div>
|
|
424
|
+
</div>
|
|
425
|
+
</div>
|
|
426
|
+
|
|
427
|
+
<div #pop class="vo-pop vo-mpk-pop" [class.vo-open]="effOpen" role="menu" aria-label="Thinking effort">
|
|
428
|
+
@for (e of efforts; track e.label) {
|
|
429
|
+
<button
|
|
430
|
+
type="button"
|
|
431
|
+
class="vo-mi"
|
|
432
|
+
role="menuitemradio"
|
|
433
|
+
[attr.aria-checked]="e.label === eff"
|
|
434
|
+
(click)="chooseEffort(e.label)"
|
|
435
|
+
>
|
|
436
|
+
<span
|
|
437
|
+
>{{ e.label }}@if (e.detail) {
|
|
438
|
+
<span class="vo-d">{{ e.detail }}</span>
|
|
439
|
+
}</span
|
|
440
|
+
>
|
|
441
|
+
<span class="vo-ck"><vo-icon name="check" size="xs"></vo-icon></span>
|
|
442
|
+
</button>
|
|
443
|
+
}
|
|
444
|
+
</div>
|
|
445
|
+
|
|
446
|
+
<p class="vo-mpk-note vo-muted" aria-live="polite">
|
|
447
|
+
@if (note) {
|
|
448
|
+
<vo-icon name="ok" size="xs"></vo-icon><span>{{ note }}</span>
|
|
449
|
+
}
|
|
450
|
+
</p>
|
|
451
|
+
</div>
|
|
452
|
+
`, styles: [".vo-mpk{position:relative;display:flex;flex-direction:column;gap:var(--vo-s-2);width:100%;max-width:420px;margin:0 auto}.vo-mpk-top{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:0 2px}.vo-mpk-lb{font-size:12.5px}.vo-mpk-tr{display:inline-flex;align-items:center;gap:7px;height:32px;padding:0 10px 0 6px;border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:var(--vo-shadow);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:box-shadow .16s}@media (hover:hover) and (pointer:fine){.vo-mpk-tr:hover{box-shadow:var(--vo-shadow-pop)}}.vo-mpk-tr>.vo-i{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-mpk-tr[aria-expanded=true]>.vo-i{transform:rotate(180deg)}.vo-mpk-tr:focus-visible{outline:2px solid var(--vo-focus);outline-offset:2px}.vo-mpk-ef{font-weight:400;font-size:12.5px}.vo-mpk-mk{width:20px;height:20px;border-radius:calc(6px * var(--vo-rk));display:grid;place-items:center;font-size:11px;font-weight:500;color:var(--vo-mt,var(--vo-on-ink));background:var(--vo-mc,var(--vo-fg2));flex:none;transition:background .32s}.vo-mpk-p{padding:6px;display:flex;flex-direction:column}.vo-mpk-hd,.vo-mpk-o{display:grid;grid-template-columns:20px minmax(0,1fr) repeat(3,34px);align-items:center;gap:10px}.vo-mpk-hd{padding:var(--vo-s-1) 10px 2px;font-size:11px;color:var(--vo-muted)}.vo-mpk-hd span{text-align:center}.vo-mpk-o{width:100%;padding:var(--vo-s-2) 10px;border-radius:var(--vo-r-in);text-align:left;font-size:13px;cursor:pointer;transition:background .16s}@media (hover:hover) and (pointer:fine){.vo-mpk-o:hover{background:var(--vo-row)}}.vo-mpk-o[aria-checked=true]{background:var(--vo-sel)}.vo-mpk-o[aria-checked=true] .vo-d{color:var(--vo-fg2)}.vo-mpk-o:focus-visible{outline:2px solid var(--vo-focus);outline-offset:-2px}.vo-mpk-o .vo-t{display:flex;flex-direction:column;min-width:0}.vo-mpk-o .vo-t b{font-weight:500;display:flex;align-items:center;gap:6px}.vo-mpk-o .vo-ck{display:grid;color:var(--vo-accent-fg,var(--vo-accent));opacity:0;transform:scale(.6);transition:opacity .16s,transform .32s var(--vo-ease)}.vo-mpk-o[aria-checked=true] .vo-ck,.vo-mpk-o .vo-ck:has(.vo-spin){opacity:1;transform:none}.vo-mpk-o .vo-ck .vo-spin{width:10px;height:10px;color:var(--vo-muted)}.vo-mpk-o .vo-d{font-size:12px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-mpk-o.vo-busy .vo-d{color:var(--vo-warn)}.vo-mpk-o.vo-busy .vo-mpk-mk{background:var(--vo-warn-mark);color:var(--vo-on-ink)}.vo-mpk-m{display:flex;gap:2px;height:8px}.vo-mpk-m i{flex:1;border-radius:2px;background:var(--vo-rail);transition:background .32s}.vo-mpk-m i.vo-on{background:var(--vo-fg2)}.vo-mpk-o[aria-checked=true]:not(.vo-busy) .vo-mpk-m i.vo-on{background:var(--vo-accent-mark,var(--vo-accent))}.vo-mpk-sg{margin:var(--vo-s-1) var(--vo-s-1) 2px;padding:10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-warn-bg);display:flex;flex-direction:column;gap:var(--vo-s-2)}.vo-mpk-sgt{margin:0;font-size:12.5px;line-height:1.45}.vo-mpk-sga{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:6px}.vo-mpk-sg .vo-pill.vo-ghost{background:var(--vo-surface);color:var(--vo-fg);box-shadow:var(--vo-shadow)}@media (hover:hover) and (pointer:fine){.vo-mpk-sg .vo-pill.vo-ghost:hover{box-shadow:var(--vo-shadow-pop)}}.vo-mpk-th{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--vo-s-2) var(--vo-s-3);padding:var(--vo-s-3) 10px 6px;margin:6px var(--vo-s-1) 0;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-mpk-thh{display:flex;flex-direction:column;min-width:0;font-size:13px}.vo-mpk-thh b{font-weight:500;display:flex;align-items:center;gap:6px}.vo-mpk-thh b .vo-i{color:var(--vo-muted)}.vo-mpk-thd{font-size:12px}.vo-mpk-eb{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 var(--vo-s-2) 0 10px;border-radius:var(--vo-r-pill);background:var(--vo-chip);font-size:13px;cursor:pointer;transition:background .16s}.vo-mpk-eb[aria-expanded=true]{background:var(--vo-hover)}@media (hover:hover) and (pointer:fine){.vo-mpk-eb:hover{background:var(--vo-hover)}}.vo-mpk-eb>.vo-i{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-mpk-eb[aria-expanded=true]>.vo-i{transform:rotate(180deg)}.vo-mpk-pop{min-width:220px}.vo-mpk-note{margin:0;padding:0 2px;font-size:12.5px;min-height:20px;display:flex;align-items:center;gap:6px}.vo-mpk-note .vo-i{color:var(--vo-ok);flex:none}@media (max-width:480px){.vo-mpk-hd,.vo-mpk-o{grid-template-columns:20px minmax(0,1fr) repeat(3,34px);gap:6px}.vo-mpk-hd{font-size:10.5px;padding-inline:6px}.vo-mpk-o{padding-inline:6px}.vo-mpk-o .vo-d{white-space:normal}}.vo-muted{color:var(--vo-muted)}.vo-fg2{color:var(--vo-fg2)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-primary{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-primary:hover{background:var(--vo-accent-2)}}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.vo-fold{display:grid;grid-template-rows:1fr;grid-template-columns:minmax(0,1fr);transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease)}.vo-fold>*{overflow:clip;overflow-clip-margin:12px;min-height:0;min-width:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0;visibility:hidden;transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease),visibility 0s var(--vo-t)}.vo-pop{position:absolute;right:0;z-index:50;min-width:200px;background:var(--vo-raised);border-radius:calc(14px * var(--vo-rk));box-shadow:var(--vo-shadow-pop);padding:6px;opacity:0;visibility:hidden;pointer-events:none;transform:translateY(6px) scale(.98);transform-origin:top right;filter:blur(3px);transition:opacity .2s var(--vo-ease),transform .35s var(--vo-ease),filter .2s var(--vo-ease),visibility 0s .2s}.vo-pop.vo-open{opacity:1;visibility:visible;pointer-events:auto;transform:none;filter:none;transition-property:opacity,transform,filter}.vo-mi{display:flex;align-items:center;gap:10px;width:100%;padding:7px var(--vo-s-2);border-radius:calc(9px * var(--vo-rk));font-size:13px;text-align:left;color:var(--vo-fg);cursor:pointer;transition:background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-mi:hover{background:var(--vo-row)}}.vo-mi+.vo-mi{margin-top:2px}.vo-mi .vo-i{color:var(--vo-fg2)}.vo-mi .vo-d{display:block;font-size:12px;color:var(--vo-muted)}@media (hover:hover) and (pointer:fine){.vo-mi:is(:hover,[aria-checked=true]) .vo-d{color:var(--vo-fg2)}}.vo-mi .vo-ck{margin-left:auto;color:var(--vo-accent-fg,var(--vo-accent));opacity:0;transition:opacity var(--vo-t-fast)}.vo-mi[aria-checked=true] .vo-ck{opacity:1}.vo-mi[aria-checked=true]{background:var(--vo-row);font-weight:500}\n"] }]
|
|
453
|
+
}], propDecorators: { models: [{
|
|
454
|
+
type: Input
|
|
455
|
+
}], value: [{
|
|
456
|
+
type: Input
|
|
457
|
+
}], defaultValue: [{
|
|
458
|
+
type: Input
|
|
459
|
+
}], efforts: [{
|
|
460
|
+
type: Input
|
|
461
|
+
}], effort: [{
|
|
462
|
+
type: Input
|
|
463
|
+
}], defaultEffort: [{
|
|
464
|
+
type: Input
|
|
465
|
+
}], suggestion: [{
|
|
466
|
+
type: Input
|
|
467
|
+
}], note: [{
|
|
468
|
+
type: Input
|
|
469
|
+
}], label: [{
|
|
470
|
+
type: Input
|
|
471
|
+
}], open: [{
|
|
472
|
+
type: Input
|
|
473
|
+
}], defaultOpen: [{
|
|
474
|
+
type: Input
|
|
475
|
+
}], valueChange: [{
|
|
476
|
+
type: Output
|
|
477
|
+
}], effortChange: [{
|
|
478
|
+
type: Output
|
|
479
|
+
}], openChange: [{
|
|
480
|
+
type: Output
|
|
481
|
+
}], trigger: [{
|
|
482
|
+
type: ViewChild,
|
|
483
|
+
args: ['trigger']
|
|
484
|
+
}], effBtn: [{
|
|
485
|
+
type: ViewChild,
|
|
486
|
+
args: ['effBtn']
|
|
487
|
+
}], pop: [{
|
|
488
|
+
type: ViewChild,
|
|
489
|
+
args: ['pop']
|
|
490
|
+
}] } });
|
|
491
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL21vZGVsLXBpY2tlci9tb2RlbC1waWNrZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJEQUEyRDtBQUMzRCxFQUFFO0FBQ0YsdUVBQXVFO0FBQ3ZFLGdGQUFnRjtBQUNoRixrRkFBa0Y7QUFDbEYsa0ZBQWtGO0FBQ2xGLCtFQUErRTtBQUMvRSx1REFBdUQ7QUFFdkQsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7O0FBK0N0RSxNQUFNLE9BQU8sR0FBcUI7SUFDaEMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSx1QkFBdUIsRUFBRTtJQUNqRCxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLDBCQUEwQixFQUFFO0lBQ3BELEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsMEJBQTBCLEVBQUU7SUFDdkQsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSwyQkFBMkIsRUFBRTtDQUN2RCxDQUFDO0FBRUYsc0ZBQXNGO0FBNEp0RixNQUFNLE9BQU8sb0JBQW9CO0lBM0pqQztRQTRKRSxpQ0FBaUM7UUFDeEIsV0FBTSxHQUFrQixFQUFFLENBQUM7UUFJcEMsbUVBQW1FO1FBQzFELFlBQU8sR0FBcUIsT0FBTyxDQUFDO1FBRzdDLDhEQUE4RDtRQUNyRCxlQUFVLEdBQXNCLElBQUksQ0FBQztRQUM5QyxtRUFBbUU7UUFDMUQsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNuQix1RUFB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SyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGZyYW1ld29yay9hbmd1bGFyL21vZGVsLXBpY2tlci9tb2RlbC1waWNrZXIuY29tcG9uZW50LnRzXG4vL1xuLy8gTmF0aXZlIEFuZ3VsYXIgcG9ydCBvZiBmcmFtZXdvcmsvcmVhY3QvbW9kZWwtcGlja2VyL01vZGVsUGlja2VyLnRzeC5cbi8vIEEgdHJpZ2dlciBuYW1lcyB0aGUgcGlja2VkIG1vZGVsIGFuZCBob3cgaGFyZCBpdCB0aGlua3M7IGl0IG9wZW5zIHRoZSBsaXN0IG9mXG4vLyBtb2RlbHMsIGVhY2ggd2l0aCBzcGVlZCwgcXVhbGl0eSBhbmQgY29zdCBhcyBmaXZlLXN0ZXAgbWV0ZXJzICh0aGUgcmVhbCBudW1iZXJzXG4vLyBvbiBob3ZlciksIGFuZCB0aGUgdGhpbmtpbmcgZWZmb3J0IHVuZGVyIHRoZW0gYXMgYSBzbWFsbCBkcm9wZG93bi4gQSBidXN5IG1vZGVsXG4vLyBjYW4gb2ZmZXIgYSB3YXkgb3V0IOKAlCBhIHNob3J0IG5vdGljZSB3aXRoIGl0cyBvd24gYnV0dG9ucy4gSW5wdXRzIG1pcnJvciB0aGVcbi8vIFJlYWN0IHByb3BzOyBjYWxsYmFja3MgYmVjb21lIEBPdXRwdXQgRXZlbnRFbWl0dGVycy5cblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVm9JY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29yZS9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWR1Y2VkTW90aW9uU2VydmljZSB9IGZyb20gJy4uL2NvcmUvcmVkdWNlZC1tb3Rpb24uc2VydmljZSc7XG5cbi8qKiBPbmUgbW9kZWwgaW4gdGhlIGxpc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsT3B0aW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgLyoqIExpa2UgXCJTb25uZXQgNS41XCIuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFRoZSBsZXR0ZXIgaW4gaXRzIGNvbG91cmVkIHRpbGUuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIG5hbWUuICovXG4gIG1hcms/OiBzdHJpbmc7XG4gIC8qKiBUaGUgdGlsZSdzIGNvbG91ciwgbGlrZSBcInZhcigtLXZvLWMxKVwiLiAqL1xuICBjb2xvcj86IHN0cmluZztcbiAgLyoqIFRoZSBsZXR0ZXIgY29sb3VyIHRoYXQgcmVhZHMgb24gdGhlIHRpbGUsIGxpa2UgXCJ2YXIoLS12by1vbi1hY2NlbnQpXCIuICovXG4gIG1hcmtUZXh0Pzogc3RyaW5nO1xuICAvKiogVGhlIHF1aWV0IGxpbmUgdW5kZXIgdGhlIG5hbWUsIGxpa2UgXCJCYWxhbmNlZCwgdGhlIGRlZmF1bHQgZm9yIGRlc2lnbiB3b3JrXCIuICovXG4gIG5vdGU/OiBzdHJpbmc7XG4gIC8qKiBTcGVlZCwgcXVhbGl0eSBhbmQgY29zdCwgZWFjaCBmcm9tIDEgdG8gNS4gRm9yIGNvc3QsIDUgaXMgdGhlIG1vc3QgZXhwZW5zaXZlLiAqL1xuICBzcGVlZDogbnVtYmVyO1xuICBxdWFsaXR5OiBudW1iZXI7XG4gIGNvc3Q6IG51bWJlcjtcbiAgLyoqIFdoYXQgZWFjaCBtZXRlciBzaG93cyBvbiBob3ZlciwgbGlrZSBcIjc0IHRva2VucyBhIHNlY29uZFwiLiAqL1xuICBzcGVlZERldGFpbD86IHN0cmluZztcbiAgcXVhbGl0eURldGFpbD86IHN0cmluZztcbiAgY29zdERldGFpbD86IHN0cmluZztcbiAgLyoqIGNoZWNraW5nIHNwaW5zIGJlc2lkZSB0aGUgbmFtZTsgYnVzeSB0dXJucyB0aGUgcm93IGFtYmVyLiBCb3RoIHJlcGxhY2UgdGhlIG5vdGUgd2l0aCBzdGF0dXNUZXh0LiAqL1xuICBzdGF0dXM/OiAncmVhZHknIHwgJ2NoZWNraW5nJyB8ICdidXN5JztcbiAgLyoqIExpa2UgXCJBdCBjYXBhY2l0eSwgYWJvdXQgMjBzIHdhaXRcIi4gKi9cbiAgc3RhdHVzVGV4dD86IHN0cmluZztcbn1cblxuLyoqIEEgdGhpbmtpbmcgZWZmb3J0OiBpdHMgbGFiZWwsIGFuZCB0aGUgbGluZSBzaG93biB1bmRlciBcIlRoaW5raW5nXCIgd2hlbiBpdCBpcyBwaWNrZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFRoaW5raW5nRWZmb3J0IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgZGV0YWlsPzogc3RyaW5nO1xufVxuXG4vKiogT25lIGJ1dHRvbiBpbiB0aGUgc3VnZ2VzdGlvbiBub3RpY2UuIFRoZSBsYXN0IG9uZSBpcyBmaWxsZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1Z2dlc3Rpb25BY3Rpb24ge1xuICBsYWJlbDogc3RyaW5nO1xuICBvbkNsaWNrOiAoKSA9PiB2b2lkO1xufVxuXG4vKiogQSB3YXkgb3V0IHdoZW4gdGhlIHBpY2tlZCBtb2RlbCBjYW4ndCB0YWtlIHRoZSByZXF1ZXN0OiBhIHNob3J0IHRleHQgYW5kIGl0cyBidXR0b25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWdnZXN0aW9uIHtcbiAgdGV4dDogc3RyaW5nO1xuICBhY3Rpb25zOiBTdWdnZXN0aW9uQWN0aW9uW107XG59XG5cbmNvbnN0IEVGRk9SVFM6IFRoaW5raW5nRWZmb3J0W10gPSBbXG4gIHsgbGFiZWw6ICdPZmYnLCBkZXRhaWw6ICdBbnN3ZXJzIHN0cmFpZ2h0IGF3YXknIH0sXG4gIHsgbGFiZWw6ICdMb3cnLCBkZXRhaWw6ICdVcCB0byAyayB0aGlua2luZyB0b2tlbnMnIH0sXG4gIHsgbGFiZWw6ICdNZWRpdW0nLCBkZXRhaWw6ICdVcCB0byA4ayB0aGlua2luZyB0b2tlbnMnIH0sXG4gIHsgbGFiZWw6ICdIaWdoJywgZGV0YWlsOiAnVXAgdG8gMjRrIHRoaW5raW5nIHRva2VucycgfSxcbl07XG5cbi8qKiBDaG9vc2UgdGhlIG1vZGVsIGZvciBhIGNoYXQgYnkgc3BlZWQsIHF1YWxpdHkgYW5kIGNvc3QsIGFuZCBob3cgaGFyZCBpdCB0aGlua3MuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2by1tb2RlbC1waWNrZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbVm9JY29uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICAjcm9vdFxuICAgICAgZGF0YS12bz1cIlwiXG4gICAgICBjbGFzcz1cInZvLW1wa1wiXG4gICAgICAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInZvLW1way10b3BcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1tdXRlZCB2by1tcGstbGJcIj57eyBsYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICN0cmlnZ2VyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ2by1tcGstdHJcIlxuICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlblwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU9wZW4oKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW1way1ta1wiIFtzdHlsZS4tLXZvLW1jXT1cInBpY2tlZD8uY29sb3JcIiBbc3R5bGUuLS12by1tdF09XCJwaWNrZWQ/Lm1hcmtUZXh0XCI+XG4gICAgICAgICAgICB7eyBwaWNrZWQ/Lm1hcmsgPz8gcGlja2VkPy5uYW1lPy5bMF0gfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1tcGstbm1cIj57eyBwaWNrZWQ/Lm5hbWUgPz8gJycgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1tcGstZWYgdm8tbXV0ZWRcIj57eyBlZmYgfX08L3NwYW4+XG4gICAgICAgICAgPHZvLWljb24gbmFtZT1cImNoZXYtZFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInZvLWZvbGQgdm8tbXBrLWZvbGRcIiBbY2xhc3Mudm8tc2h1dF09XCIhaXNPcGVuXCIgW2F0dHIuaW5lcnRdPVwiaXNPcGVuID8gbnVsbCA6ICcnXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLW1way1wIHZvLXBhbmVsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tbXBrLWhkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PHNwYW4+U3BlZWQ8L3NwYW4+PHNwYW4+UXVhbGl0eTwvc3Bhbj48c3Bhbj5Db3N0PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1tcGstbGlzdFwiIHJvbGU9XCJyYWRpb2dyb3VwXCIgYXJpYS1sYWJlbD1cIk1vZGVsXCI+XG4gICAgICAgICAgICAgIEBmb3IgKG0gb2YgbW9kZWxzOyB0cmFjayBtLmlkOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgcm9sZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJtLmlkID09PSBwaWNrZWQ/LmlkXCJcbiAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJtLmlkID09PSBwaWNrZWQ/LmlkID8gMCA6IC0xXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidm8tbXBrLW9cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnZvLWJ1c3ldPVwibS5zdGF0dXMgPT09ICdidXN5J1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGljayhpKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1tcGstbWtcIiBbc3R5bGUuLS12by1tY109XCJtLmNvbG9yXCIgW3N0eWxlLi0tdm8tbXRdPVwibS5tYXJrVGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBtLm1hcmsgPz8gbS5uYW1lWzBdIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJcbiAgICAgICAgICAgICAgICAgICAgICA+e3sgbS5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgfX08c3BhbiBjbGFzcz1cInZvLWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG0uc3RhdHVzID09PSAnY2hlY2tpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3BpblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiY2hlY2tcIiBzaXplPVwieHNcIj48L3ZvLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPjwvYlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZFwiPnt7IHJvd05vdGUobSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW1way1tXCIgW2F0dHIuZGF0YS10aXBdPVwibS5zcGVlZERldGFpbFwiIFthdHRyLmFyaWEtaGlkZGVuXT1cIm0uc3BlZWREZXRhaWwgPyBudWxsIDogdHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChrIG9mIGJhcnM7IHRyYWNrIGspIHtcbiAgICAgICAgICAgICAgICAgICAgICA8aSBbY2xhc3Mudm8tb25dPVwiayA8PSBtLnNwZWVkXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW1way1tXCIgW2F0dHIuZGF0YS10aXBdPVwibS5xdWFsaXR5RGV0YWlsXCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwibS5xdWFsaXR5RGV0YWlsID8gbnVsbCA6IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoayBvZiBiYXJzOyB0cmFjayBrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzLnZvLW9uXT1cImsgPD0gbS5xdWFsaXR5XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW1way1tXCIgW2F0dHIuZGF0YS10aXBdPVwibS5jb3N0RGV0YWlsXCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwibS5jb3N0RGV0YWlsID8gbnVsbCA6IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoayBvZiBiYXJzOyB0cmFjayBrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzLnZvLW9uXT1cImsgPD0gbS5jb3N0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZm9sZFwiIFtjbGFzcy52by1zaHV0XT1cIiFzdWdnZXN0aW9uXCIgW2F0dHIuaW5lcnRdPVwic3VnZ2VzdGlvbiA/IG51bGwgOiAnJ1wiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1tcGstc2dcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidm8tbXBrLXNndFwiPnt7IHN1Z2dlc3Rpb24/LnRleHQgfX08L3A+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tbXBrLXNnYVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChhIG9mIHN1Z2dlc3Rpb24/LmFjdGlvbnMgPz8gW107IHRyYWNrIGEubGFiZWw7IGxldCBsYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidm8tcGlsbCB2by1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudm8tcHJpbWFyeV09XCJsYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy52by1naG9zdF09XCIhbGFzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYS5vbkNsaWNrKClcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGEubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1tcGstdGhcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLW1way10aGhcIj5cbiAgICAgICAgICAgICAgICA8Yj48dm8taWNvbiBuYW1lPVwiY3B1XCIgc2l6ZT1cInhzXCI+PC92by1pY29uPlRoaW5raW5nPC9iPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tbXV0ZWQgdm8tbXBrLXRoZFwiPnt7IGVmZm9ydERldGFpbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAjZWZmQnRuXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1tcGstZWJcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJtZW51XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImVmZk9wZW5cIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJUaGlua2luZyBlZmZvcnRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFZmYoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW1way1ldlwiPnt7IGVmZiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiY2hldi1kXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICNwb3AgY2xhc3M9XCJ2by1wb3Agdm8tbXBrLXBvcFwiIFtjbGFzcy52by1vcGVuXT1cImVmZk9wZW5cIiByb2xlPVwibWVudVwiIGFyaWEtbGFiZWw9XCJUaGlua2luZyBlZmZvcnRcIj5cbiAgICAgICAgQGZvciAoZSBvZiBlZmZvcnRzOyB0cmFjayBlLmxhYmVsKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInZvLW1pXCJcbiAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbXJhZGlvXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJlLmxhYmVsID09PSBlZmZcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNob29zZUVmZm9ydChlLmxhYmVsKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgPnt7IGUubGFiZWwgfX1AaWYgKGUuZGV0YWlsKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1kXCI+e3sgZS5kZXRhaWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIH08L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tY2tcIj48dm8taWNvbiBuYW1lPVwiY2hlY2tcIiBzaXplPVwieHNcIj48L3ZvLWljb24+PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHAgY2xhc3M9XCJ2by1tcGstbm90ZSB2by1tdXRlZFwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICBAaWYgKG5vdGUpIHtcbiAgICAgICAgICA8dm8taWNvbiBuYW1lPVwib2tcIiBzaXplPVwieHNcIj48L3ZvLWljb24+PHNwYW4+e3sgbm90ZSB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vbW9kZWwtcGlja2VyLmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIE1vZGVsUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiogVGhlIG1vZGVscyB0byBjaG9vc2UgZnJvbS4gKi9cbiAgQElucHV0KCkgbW9kZWxzOiBNb2RlbE9wdGlvbltdID0gW107XG4gIC8qKiBUaGUgcGlja2VkIG1vZGVsJ3MgaWQuIExlYXZlIGl0IG91dCB0byBsZXQgdGhlIGxpc3QgaG9sZCBpdHMgb3duLiAqL1xuICBASW5wdXQoKSB2YWx1ZT86IHN0cmluZztcbiAgQElucHV0KCkgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xuICAvKiogVGhlIHRoaW5raW5nIGVmZm9ydHMuIERlZmF1bHRzIHRvIE9mZiwgTG93LCBNZWRpdW0gYW5kIEhpZ2guICovXG4gIEBJbnB1dCgpIGVmZm9ydHM6IFRoaW5raW5nRWZmb3J0W10gPSBFRkZPUlRTO1xuICBASW5wdXQoKSBlZmZvcnQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlZmF1bHRFZmZvcnQ/OiBzdHJpbmc7XG4gIC8qKiBBIHdheSBvdXQgd2hlbiB0aGUgcGlja2VkIG1vZGVsIGNhbid0IHRha2UgdGhlIHJlcXVlc3QuICovXG4gIEBJbnB1dCgpIHN1Z2dlc3Rpb246IFN1Z2dlc3Rpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBjb25maXJtYXRpb24gdW5kZXIgdGhlIHBpY2tlciwgc2hvd24gd2l0aCBhIGdyZWVuIGNoZWNrLiAqL1xuICBASW5wdXQoKSBub3RlID0gJyc7XG4gIC8qKiBUaGUgbGFiZWwgYmVzaWRlIHRoZSB0cmlnZ2VyLiBEZWZhdWx0cyB0byBcIk1vZGVsIGZvciB0aGlzIGNoYXRcIi4gKi9cbiAgQElucHV0KCkgbGFiZWwgPSAnTW9kZWwgZm9yIHRoaXMgY2hhdCc7XG4gIC8qKiBXaGV0aGVyIHRoZSBsaXN0IGlzIG9wZW4uIExlYXZlIGl0IG91dCB0byBsZXQgdGhlIHRyaWdnZXIgYW5kIEVzY2FwZSBvcGVuIGFuZCBjbG9zZSBpdC4gKi9cbiAgQElucHV0KCkgb3Blbj86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGRlZmF1bHRPcGVuID0gdHJ1ZTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgcm93IGlzIHBpY2tlZCwgYnVzeSBvciBub3QsIHNvIHlvdSBjYW4gY2hlY2sgdGhlIG1vZGVsIGZpcnN0LiAqL1xuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGVmZm9ydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgb3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBAVmlld0NoaWxkKCd0cmlnZ2VyJykgcHJpdmF0ZSB0cmlnZ2VyITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2VmZkJ0bicpIHByaXZhdGUgZWZmQnRuITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BvcCcpIHByaXZhdGUgcG9wITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb3Rpb24gPSBpbmplY3QoUmVkdWNlZE1vdGlvblNlcnZpY2UpO1xuXG4gIC8qKiBUaGUgZml2ZSBtZXRlciBzdGVwcy4gKi9cbiAgcmVhZG9ubHkgYmFycyA9IFsxLCAyLCAzLCA0LCA1XTtcblxuICAvLyBpbnRlcm5hbCBzdGF0ZSBob2xkcyBpdHMgb3duIHdoZW4gdGhlIG1hdGNoaW5nIGlucHV0IGlzIGxlZnQgb3V0ICh1bmNvbnRyb2xsZWQpXG4gIHByaXZhdGUgY3VySWQgPSAnJztcbiAgcHJpdmF0ZSBlZmZMYWJlbCA9ICcnO1xuICBwcml2YXRlIG9wZW5TdGF0ZSA9IHRydWU7XG4gIGVmZk9wZW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbG9zZVRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd2YWx1ZSddIHx8IGNoYW5nZXNbJ2RlZmF1bHRWYWx1ZSddIHx8IGNoYW5nZXNbJ21vZGVscyddKSB7XG4gICAgICB0aGlzLmN1cklkID0gdGhpcy52YWx1ZSA/PyB0aGlzLmRlZmF1bHRWYWx1ZSA/PyB0aGlzLm1vZGVsc1swXT8uaWQgPz8gdGhpcy5jdXJJZCA/PyAnJztcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2VmZm9ydCddIHx8IGNoYW5nZXNbJ2RlZmF1bHRFZmZvcnQnXSB8fCBjaGFuZ2VzWydlZmZvcnRzJ10pIHtcbiAgICAgIHRoaXMuZWZmTGFiZWwgPVxuICAgICAgICB0aGlzLmVmZm9ydCA/P1xuICAgICAgICB0aGlzLmRlZmF1bHRFZmZvcnQgPz9cbiAgICAgICAgdGhpcy5lZmZvcnRzW01hdGgubWluKDIsIHRoaXMuZWZmb3J0cy5sZW5ndGggLSAxKV0/LmxhYmVsID8/XG4gICAgICAgIHRoaXMuZWZmTGFiZWwgPz9cbiAgICAgICAgJyc7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydvcGVuJ10gfHwgY2hhbmdlc1snZGVmYXVsdE9wZW4nXSkge1xuICAgICAgdGhpcy5vcGVuU3RhdGUgPSB0aGlzLm9wZW4gPz8gdGhpcy5kZWZhdWx0T3BlbjtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gY2xvc2UgdGhlIGVmZm9ydCBtZW51IG9uIGFuIG91dHNpZGUgY2xpY2tcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub25PdXRzaWRlLCB0cnVlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vbk91dHNpZGUsIHRydWUpO1xuICAgIGlmICh0aGlzLmNsb3NlVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmNsb3NlVGltZXIpO1xuICB9XG5cbiAgZ2V0IHBpY2tlZCgpOiBNb2RlbE9wdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzLmZpbmQoKG0pID0+IG0uaWQgPT09IHRoaXMuY3VySWQpID8/IHRoaXMubW9kZWxzWzBdO1xuICB9XG5cbiAgZ2V0IGVmZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVmZkxhYmVsO1xuICB9XG5cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuID8/IHRoaXMub3BlblN0YXRlO1xuICB9XG5cbiAgZ2V0IGVmZm9ydERldGFpbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVmZm9ydHMuZmluZCgoZSkgPT4gZS5sYWJlbCA9PT0gdGhpcy5lZmYpPy5kZXRhaWwgPz8gJyc7XG4gIH1cblxuICByb3dOb3RlKG06IE1vZGVsT3B0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKG0uc3RhdHVzICYmIG0uc3RhdHVzICE9PSAncmVhZHknICYmIG0uc3RhdHVzVGV4dCkgfHwgbS5ub3RlIHx8ICcnO1xuICB9XG5cbiAgcGljayhpOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IHRoaXMubW9kZWxzW2ldPy5pZDtcbiAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnZhbHVlID09PSB1bmRlZmluZWQpIHRoaXMuY3VySWQgPSBpZDtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoaWQpO1xuICB9XG5cbiAgY2hvb3NlRWZmb3J0KGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZmZvcnQgPT09IHVuZGVmaW5lZCkgdGhpcy5lZmZMYWJlbCA9IGxhYmVsO1xuICAgIHRoaXMuZWZmb3J0Q2hhbmdlLmVtaXQobGFiZWwpO1xuICAgIHRoaXMuY2xvc2VFZmZTb29uKCk7XG4gIH1cblxuICB0b2dnbGVPcGVuKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0T3BlbighdGhpcy5pc09wZW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRPcGVuKHY6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVuID09PSB1bmRlZmluZWQpIHRoaXMub3BlblN0YXRlID0gdjtcbiAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdCh2KTtcbiAgfVxuXG4gIHRvZ2dsZUVmZigpOiB2b2lkIHtcbiAgICB0aGlzLmVmZk9wZW4gPSAhdGhpcy5lZmZPcGVuO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZUVmZlNvb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xvc2VUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VUaW1lcik7XG4gICAgdGhpcy5jbG9zZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiAodGhpcy5lZmZPcGVuID0gZmFsc2UpLCB0aGlzLm1vdGlvbi5yZWR1Y2UoKSA/IDAgOiAxMjApO1xuICB9XG5cbiAgb25LZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBFc2NhcGUgY2xvc2VzIHRoZSBvcGVuIGxpc3QgYW5kIGdpdmVzIHRoZSB0cmlnZ2VyIHRoZSBmb2N1cyBiYWNrXG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgaWYgKHRoaXMuZWZmT3Blbikge1xuICAgICAgICB0aGlzLmVmZk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lZmZCdG4/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgdGhpcy5zZXRPcGVuKGZhbHNlKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyPy5uYXRpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYXJyb3cga2V5cyBtb3ZlIHRocm91Z2ggdGhlIG1vZGVscywgYXMgaW4gYW55IHJhZGlvIGdyb3VwXG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IHJvdyA9IHRhcmdldD8uY2xvc2VzdDxIVE1MQnV0dG9uRWxlbWVudD4oJy52by1tcGstbycpO1xuICAgIGlmICghcm93KSByZXR1cm47XG4gICAgY29uc3Qgc3RlcCA9ICh7IEFycm93RG93bjogMSwgQXJyb3dSaWdodDogMSwgQXJyb3dVcDogLTEsIEFycm93TGVmdDogLTEgfSBhcyBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KVtlLmtleV07XG4gICAgaWYgKCFzdGVwKSByZXR1cm47XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHJvd3MgPSBBcnJheS5mcm9tKHJvdy5wYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignLnZvLW1way1vJykgPz8gW10pO1xuICAgIGNvbnN0IGZyb20gPSByb3dzLmluZGV4T2Yocm93KTtcbiAgICBjb25zdCBpID0gKGZyb20gKyBzdGVwICsgdGhpcy5tb2RlbHMubGVuZ3RoKSAlIHRoaXMubW9kZWxzLmxlbmd0aDtcbiAgICByb3dzW2ldPy5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgdGhpcy5waWNrKGkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbk91dHNpZGUgPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKCF0aGlzLmVmZk9wZW4pIHJldHVybjtcbiAgICBjb25zdCB0ID0gZS50YXJnZXQgYXMgTm9kZTtcbiAgICBpZiAodGhpcy5wb3A/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModCkgfHwgdGhpcy5lZmZCdG4/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModCkpIHJldHVybjtcbiAgICB0aGlzLmVmZk9wZW4gPSBmYWxzZTtcbiAgfTtcbn1cbiJdfQ==
|