@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,374 @@
|
|
|
1
|
+
// framework/angular/web-search/web-search.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/web-search/WebSearch.tsx.
|
|
4
|
+
// The agent's web searches as a trail: each query and what came back, each page
|
|
5
|
+
// read, skimmed or skipped and why, a summary once done, and an answer whose
|
|
6
|
+
// citations light their pages. Inputs mirror the React props; the open-state
|
|
7
|
+
// callback becomes an @Output() EventEmitter.
|
|
8
|
+
import { Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core';
|
|
9
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
const STATUS = {
|
|
12
|
+
reading: ['Reading', ''],
|
|
13
|
+
read: ['Read', ''],
|
|
14
|
+
skimmed: ['Skimmed', ''],
|
|
15
|
+
paywall: ['Skipped: paywall', 'vo-warn'],
|
|
16
|
+
blocked: ['Skipped: blocked', 'vo-warn'],
|
|
17
|
+
timeout: ['Skipped: timeout', 'vo-warn'],
|
|
18
|
+
};
|
|
19
|
+
/** The agent's web searches as a trail, with an answer whose citations light their pages. */
|
|
20
|
+
export class WebSearchComponent {
|
|
21
|
+
constructor() {
|
|
22
|
+
this.queries = [];
|
|
23
|
+
/** True once searching and reading are over: the trail folds to its summary. */
|
|
24
|
+
this.done = false;
|
|
25
|
+
/** Without the panel, for a chat stream. */
|
|
26
|
+
this.bare = true;
|
|
27
|
+
this.openChange = new EventEmitter();
|
|
28
|
+
this.STATUS = STATUS;
|
|
29
|
+
this.hot = null;
|
|
30
|
+
this.said = '';
|
|
31
|
+
this.controlled = false;
|
|
32
|
+
this.inner = true;
|
|
33
|
+
this.qOpen = {};
|
|
34
|
+
this.lastSaid = '';
|
|
35
|
+
}
|
|
36
|
+
/** Whether the trail is open. Left out, it folds once done turns true. */
|
|
37
|
+
set open(value) {
|
|
38
|
+
this.controlled = value !== undefined;
|
|
39
|
+
if (value !== undefined)
|
|
40
|
+
this.inner = value;
|
|
41
|
+
}
|
|
42
|
+
get isOpen() {
|
|
43
|
+
return this.inner;
|
|
44
|
+
}
|
|
45
|
+
get flatPages() {
|
|
46
|
+
return this.queries.flatMap((q) => (q.pages ?? []).map((p) => ({ ...p, q: q.key })));
|
|
47
|
+
}
|
|
48
|
+
get sites() {
|
|
49
|
+
return [...new Set(this.flatPages.map((p) => p.domain))];
|
|
50
|
+
}
|
|
51
|
+
get marks() {
|
|
52
|
+
return this.sites.slice(0, 4);
|
|
53
|
+
}
|
|
54
|
+
get line() {
|
|
55
|
+
const read = this.flatPages.filter((p) => p.status === 'read' || p.status === 'skimmed').length;
|
|
56
|
+
if (this.done)
|
|
57
|
+
return `${this.queries.length} searches, ${read} pages read`;
|
|
58
|
+
const current = this.queries.find((q) => q.status === 'searching');
|
|
59
|
+
if (current)
|
|
60
|
+
return `Searching for “${current.query}”`;
|
|
61
|
+
const reading = this.flatPages.filter((p) => p.status === 'reading').length;
|
|
62
|
+
if (reading)
|
|
63
|
+
return `Reading ${reading} pages`;
|
|
64
|
+
return 'Searching the web';
|
|
65
|
+
}
|
|
66
|
+
get hotPage() {
|
|
67
|
+
return this.hot != null ? this.flatPages.find((p) => p.cite === this.hot) : undefined;
|
|
68
|
+
}
|
|
69
|
+
get answerParts() {
|
|
70
|
+
if (!this.answer)
|
|
71
|
+
return [];
|
|
72
|
+
return this.answer.split(/(\[\d+\])/).map((part) => {
|
|
73
|
+
const m = part.match(/^\[(\d+)\]$/);
|
|
74
|
+
return m ? { cite: +m[1] } : { text: part };
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
hasPages(q) {
|
|
78
|
+
return !!q.pages?.length;
|
|
79
|
+
}
|
|
80
|
+
isQOpen(q) {
|
|
81
|
+
if (!this.hasPages(q))
|
|
82
|
+
return false;
|
|
83
|
+
const auto = q.pages?.some((p) => p.status === 'reading') ?? false;
|
|
84
|
+
return this.qOpen[q.key] ?? auto;
|
|
85
|
+
}
|
|
86
|
+
isSkip(p) {
|
|
87
|
+
return p.status !== 'read' && p.status !== 'skimmed' && p.status !== 'reading';
|
|
88
|
+
}
|
|
89
|
+
qLabel(q) {
|
|
90
|
+
if (q.status !== 'done')
|
|
91
|
+
return null;
|
|
92
|
+
const res = q.results ? `${q.results} results` : 'no results';
|
|
93
|
+
return `${q.query}: ${res}${q.time ? ', ' + q.time : ''}`;
|
|
94
|
+
}
|
|
95
|
+
pageLabel(p) {
|
|
96
|
+
return `${p.title}, ${p.domain}${p.date ? ', ' + p.date : ''}: ${STATUS[p.status][0]}`;
|
|
97
|
+
}
|
|
98
|
+
citeLabel(n) {
|
|
99
|
+
if (n === undefined)
|
|
100
|
+
return '';
|
|
101
|
+
const p = this.flatPages.find((x) => x.cite === n);
|
|
102
|
+
return p ? `Source ${n}: ${p.title}, ${p.domain}` : `Source ${n}`;
|
|
103
|
+
}
|
|
104
|
+
toggle() {
|
|
105
|
+
this.setOpen(!this.inner);
|
|
106
|
+
}
|
|
107
|
+
toggleQ(q) {
|
|
108
|
+
if (!this.hasPages(q))
|
|
109
|
+
return;
|
|
110
|
+
this.qOpen = { ...this.qOpen, [q.key]: !this.isQOpen(q) };
|
|
111
|
+
}
|
|
112
|
+
setOpen(o) {
|
|
113
|
+
if (!this.controlled)
|
|
114
|
+
this.inner = o;
|
|
115
|
+
this.openChange.emit(o);
|
|
116
|
+
}
|
|
117
|
+
ngOnChanges(changes) {
|
|
118
|
+
if (changes['done'] && this.done && !this.controlled) {
|
|
119
|
+
this.inner = false;
|
|
120
|
+
}
|
|
121
|
+
// only changes of phase are announced
|
|
122
|
+
const current = this.queries.find((q) => q.status === 'searching');
|
|
123
|
+
const next = this.done ? `Done: ${this.line}` : current ? `Searching for ${current.query}` : '';
|
|
124
|
+
if (next && next !== this.lastSaid) {
|
|
125
|
+
this.lastSaid = next;
|
|
126
|
+
this.said = next;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WebSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
130
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: WebSearchComponent, isStandalone: true, selector: "vo-web-search", inputs: { queries: "queries", done: "done", answer: "answer", open: "open", bare: "bare" }, outputs: { openChange: "openChange" }, usesOnChanges: true, ngImport: i0, template: `
|
|
131
|
+
<div
|
|
132
|
+
data-vo=""
|
|
133
|
+
class="vo-wsx"
|
|
134
|
+
[class.vo-panel]="!bare"
|
|
135
|
+
[style.paddingInline]="bare ? '0' : null"
|
|
136
|
+
>
|
|
137
|
+
<button type="button" class="vo-wsx-h" [attr.aria-expanded]="isOpen" (click)="toggle()">
|
|
138
|
+
<span class="vo-wsx-ic">
|
|
139
|
+
@if (done) {
|
|
140
|
+
<vo-icon name="globe" size="xs"></vo-icon>
|
|
141
|
+
} @else {
|
|
142
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
143
|
+
}
|
|
144
|
+
</span>
|
|
145
|
+
<span class="vo-wsx-st vo-sw" [class.vo-shim]="!done">{{ line }}</span>
|
|
146
|
+
<span class="vo-wsx-marks" aria-hidden="true">
|
|
147
|
+
@for (s of marks; track s) {
|
|
148
|
+
<span [class.vo-hl]="hotPage?.domain === s">{{ s[0].toUpperCase() }}</span>
|
|
149
|
+
}
|
|
150
|
+
@if (sites.length > 4) {
|
|
151
|
+
<span class="vo-n">+{{ sites.length - 4 }}</span>
|
|
152
|
+
}
|
|
153
|
+
</span>
|
|
154
|
+
<vo-icon name="chev-d" size="xs"></vo-icon>
|
|
155
|
+
</button>
|
|
156
|
+
|
|
157
|
+
<div class="vo-fold vo-wsx-fold" [class.vo-shut]="!isOpen" [attr.inert]="isOpen ? null : ''">
|
|
158
|
+
<div>
|
|
159
|
+
<div class="vo-wsx-list">
|
|
160
|
+
@for (q of queries; track q.key) {
|
|
161
|
+
<div
|
|
162
|
+
class="vo-wsx-q vo-enter"
|
|
163
|
+
[class.vo-hl]="hotPage && hotPage.q === q.key && !isQOpen(q)"
|
|
164
|
+
>
|
|
165
|
+
<button
|
|
166
|
+
type="button"
|
|
167
|
+
class="vo-wsx-qh"
|
|
168
|
+
[class.vo-empty]="!hasPages(q)"
|
|
169
|
+
[attr.aria-expanded]="isQOpen(q)"
|
|
170
|
+
[attr.aria-label]="qLabel(q)"
|
|
171
|
+
(click)="toggleQ(q)"
|
|
172
|
+
>
|
|
173
|
+
<vo-icon name="search" size="xs"></vo-icon>
|
|
174
|
+
<span class="vo-t" [class.vo-shim]="q.status === 'searching'">{{ q.query }}</span>
|
|
175
|
+
<span class="vo-n" [class.vo-none]="q.status === 'done' && !q.results">{{
|
|
176
|
+
q.status === 'searching' ? 'Searching' : q.results ? q.results + ' results' : 'No results'
|
|
177
|
+
}}</span>
|
|
178
|
+
<span class="vo-tm vo-num">{{ q.status === 'done' ? q.time : '' }}</span>
|
|
179
|
+
<vo-icon name="chev-r" size="xs"></vo-icon>
|
|
180
|
+
</button>
|
|
181
|
+
@if (q.rewritten) {
|
|
182
|
+
<span class="vo-wsx-rw">
|
|
183
|
+
<vo-icon name="refresh" size="xs"></vo-icon>Asked again in other words
|
|
184
|
+
</span>
|
|
185
|
+
}
|
|
186
|
+
@if (hasPages(q)) {
|
|
187
|
+
<div class="vo-fold" [class.vo-shut]="!isQOpen(q)" [attr.inert]="isQOpen(q) ? null : ''">
|
|
188
|
+
<div>
|
|
189
|
+
<ul class="vo-wsx-rs">
|
|
190
|
+
@for (p of q.pages; track p.title) {
|
|
191
|
+
<li
|
|
192
|
+
tabindex="0"
|
|
193
|
+
class="vo-wsx-r vo-enter"
|
|
194
|
+
[class.vo-skip]="isSkip(p)"
|
|
195
|
+
[class.vo-hl]="hotPage && hotPage.q === q.key && hotPage.title === p.title"
|
|
196
|
+
[attr.aria-label]="pageLabel(p)"
|
|
197
|
+
>
|
|
198
|
+
<span class="vo-wsx-fav" aria-hidden="true">{{ p.domain[0].toUpperCase() }}</span>
|
|
199
|
+
<span class="vo-tx">
|
|
200
|
+
<span class="vo-t">{{ p.title }}</span>
|
|
201
|
+
<span class="vo-d">{{ p.domain }}{{ p.date ? ' · ' + p.date : '' }}</span>
|
|
202
|
+
</span>
|
|
203
|
+
<span class="vo-tag" [class]="STATUS[p.status][1]">
|
|
204
|
+
@if (p.status === 'reading') {
|
|
205
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
206
|
+
}
|
|
207
|
+
{{ STATUS[p.status][0] }}
|
|
208
|
+
</span>
|
|
209
|
+
</li>
|
|
210
|
+
}
|
|
211
|
+
</ul>
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
}
|
|
215
|
+
</div>
|
|
216
|
+
}
|
|
217
|
+
</div>
|
|
218
|
+
</div>
|
|
219
|
+
</div>
|
|
220
|
+
|
|
221
|
+
@if (answer) {
|
|
222
|
+
<div class="vo-wsx-ans">
|
|
223
|
+
@for (part of answerParts; track $index) {
|
|
224
|
+
@if (part.cite !== undefined) {
|
|
225
|
+
<button
|
|
226
|
+
type="button"
|
|
227
|
+
class="vo-wsx-cite"
|
|
228
|
+
[class.vo-on]="hot === part.cite"
|
|
229
|
+
[attr.aria-label]="citeLabel(part.cite)"
|
|
230
|
+
(pointerenter)="hot = part.cite ?? null"
|
|
231
|
+
(pointerleave)="hot = null"
|
|
232
|
+
(focus)="hot = part.cite ?? null"
|
|
233
|
+
(blur)="hot = null"
|
|
234
|
+
>{{ part.cite }}</button>
|
|
235
|
+
} @else {
|
|
236
|
+
<span>{{ part.text }}</span>
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
</div>
|
|
240
|
+
}
|
|
241
|
+
<p class="vo-wsx-sr" role="status">{{ said }}</p>
|
|
242
|
+
</div>
|
|
243
|
+
`, isInline: true, styles: [".vo-wsx{padding:6px;display:flex;flex-direction:column;font-size:13px}.vo-wsx-h{display:flex;align-items:center;gap:10px;width:100%;padding:var(--vo-s-2) 10px;border-radius:var(--vo-r-in);text-align:left;font-size:13.5px;transition:background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-wsx-h:hover{background:var(--vo-row)}}.vo-wsx-ic{width:16px;height:16px;flex:none;display:grid;place-items:center;color:var(--vo-fg2)}.vo-wsx-ic .vo-spin{width:11px;height:11px}.vo-wsx-st{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-wsx-h>.vo-i{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-wsx-h[aria-expanded=false]>.vo-i{transform:rotate(-90deg)}.vo-wsx-marks{display:flex;align-items:center}.vo-wsx-marks span{width:20px;height:20px;border-radius:50%;display:grid;place-items:center;margin-left:-5px;background:var(--vo-chip);color:var(--vo-fg2);font-size:10.5px;font-weight:500;box-shadow:0 0 0 2px var(--vo-surface);transition:background .2s,color .2s}.vo-wsx-marks span.vo-n{background:var(--vo-surface);color:var(--vo-muted);box-shadow:0 0 0 2px var(--vo-surface),inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:10px}.vo-wsx-marks span.vo-hl{background:var(--vo-fg2);color:var(--vo-surface)}.vo-wsx-list{display:flex;flex-direction:column;gap:2px;padding:2px 0 var(--vo-s-1)}.vo-wsx-q{display:flex;flex-direction:column}.vo-wsx-qh{display:grid;grid-template-columns:16px minmax(0,1fr) auto auto 12px;align-items:center;column-gap:var(--vo-s-2);width:100%;padding:6px 10px;border-radius:calc(10px * var(--vo-rk));text-align:left;transition:background var(--vo-t-fast)}.vo-wsx-q.vo-hl>.vo-wsx-qh{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-wsx-qh:hover{background:var(--vo-row)}}.vo-wsx-qh>.vo-i:first-child{color:var(--vo-muted)}.vo-wsx-qh .vo-t{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--vo-fg)}.vo-wsx-qh .vo-n,.vo-wsx-qh .vo-tm{font-size:12px;color:var(--vo-muted);white-space:nowrap}.vo-wsx-qh .vo-n.vo-none{color:var(--vo-warn)}.vo-wsx-qh>.vo-i:last-child{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-wsx-qh[aria-expanded=true]>.vo-i:last-child{transform:rotate(90deg)}.vo-wsx-qh[aria-expanded=false].vo-empty>.vo-i:last-child{visibility:hidden}.vo-wsx-rw{display:flex;align-items:center;gap:6px;padding:0 10px 2px 34px;font-size:12px;color:var(--vo-muted)}.vo-wsx-rs{list-style:none;margin:0;padding:2px 0 var(--vo-s-1) 26px;display:flex;flex-direction:column;gap:2px}.vo-wsx-r{display:grid;grid-template-columns:20px minmax(0,1fr) auto;column-gap:var(--vo-s-2);align-items:center;padding:5px var(--vo-s-2);border-radius:calc(9px * var(--vo-rk));transition:background var(--vo-t-fast);cursor:default}.vo-wsx-r.vo-hl{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-wsx-r:hover{background:var(--vo-row)}}.vo-wsx-r:focus-visible{outline-offset:-2px}.vo-wsx-fav{width:20px;height:20px;border-radius:calc(6px * var(--vo-rk));display:grid;place-items:center;background:var(--vo-chip);color:var(--vo-fg2);font-size:10.5px;font-weight:500}.vo-wsx-r .vo-tx{display:flex;flex-direction:column;min-width:0;line-height:1.35}.vo-wsx-r .vo-t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:12.5px;color:var(--vo-fg)}.vo-wsx-r .vo-d{font-size:11.5px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-wsx-r.vo-skip .vo-t{color:var(--vo-muted)}.vo-wsx-r .vo-tag .vo-spin{width:9px;height:9px}.vo-wsx-ans{padding:var(--vo-s-2) 10px 6px;font-size:13.5px;line-height:1.6;color:var(--vo-fg)}.vo-wsx-ans:empty{display:none}.vo-wsx-cite{display:inline-grid;place-items:center;min-width:18px;height:17px;padding:0 4px;margin:0 1px;border-radius:calc(5px * var(--vo-rk));background:var(--vo-chip);color:var(--vo-fg2);font-size:11px;font-weight:500;vertical-align:1px;transition:background var(--vo-t-fast),color var(--vo-t-fast)}.vo-wsx-cite.vo-on{background:var(--vo-fg2);color:var(--vo-surface)}@media (hover:hover) and (pointer:fine){.vo-wsx-cite:hover{background:var(--vo-fg2);color:var(--vo-surface)}}.vo-wsx-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.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-shim{background:linear-gradient(90deg,var(--vo-fg) 0%,var(--vo-fg) 38%,var(--vo-faint) 50%,var(--vo-fg) 62%,var(--vo-fg) 100%);background-size:260% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 2.2s linear infinite}@keyframes vo-shim{0%{background-position:100% 0}to{background-position:-160% 0}}.vo-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}.vo-sw{display:inline-block;transition:opacity .2s var(--vo-ease),filter .2s var(--vo-ease),transform .25s var(--vo-ease)}.vo-sw.vo-out{opacity:0;filter:blur(3px);transform:translateY(3px)}.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)}@media (prefers-reduced-motion:reduce){.vo-shim{color:var(--vo-fg);background:none}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
244
|
+
}
|
|
245
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WebSearchComponent, decorators: [{
|
|
246
|
+
type: Component,
|
|
247
|
+
args: [{ selector: 'vo-web-search', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
|
|
248
|
+
<div
|
|
249
|
+
data-vo=""
|
|
250
|
+
class="vo-wsx"
|
|
251
|
+
[class.vo-panel]="!bare"
|
|
252
|
+
[style.paddingInline]="bare ? '0' : null"
|
|
253
|
+
>
|
|
254
|
+
<button type="button" class="vo-wsx-h" [attr.aria-expanded]="isOpen" (click)="toggle()">
|
|
255
|
+
<span class="vo-wsx-ic">
|
|
256
|
+
@if (done) {
|
|
257
|
+
<vo-icon name="globe" size="xs"></vo-icon>
|
|
258
|
+
} @else {
|
|
259
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
260
|
+
}
|
|
261
|
+
</span>
|
|
262
|
+
<span class="vo-wsx-st vo-sw" [class.vo-shim]="!done">{{ line }}</span>
|
|
263
|
+
<span class="vo-wsx-marks" aria-hidden="true">
|
|
264
|
+
@for (s of marks; track s) {
|
|
265
|
+
<span [class.vo-hl]="hotPage?.domain === s">{{ s[0].toUpperCase() }}</span>
|
|
266
|
+
}
|
|
267
|
+
@if (sites.length > 4) {
|
|
268
|
+
<span class="vo-n">+{{ sites.length - 4 }}</span>
|
|
269
|
+
}
|
|
270
|
+
</span>
|
|
271
|
+
<vo-icon name="chev-d" size="xs"></vo-icon>
|
|
272
|
+
</button>
|
|
273
|
+
|
|
274
|
+
<div class="vo-fold vo-wsx-fold" [class.vo-shut]="!isOpen" [attr.inert]="isOpen ? null : ''">
|
|
275
|
+
<div>
|
|
276
|
+
<div class="vo-wsx-list">
|
|
277
|
+
@for (q of queries; track q.key) {
|
|
278
|
+
<div
|
|
279
|
+
class="vo-wsx-q vo-enter"
|
|
280
|
+
[class.vo-hl]="hotPage && hotPage.q === q.key && !isQOpen(q)"
|
|
281
|
+
>
|
|
282
|
+
<button
|
|
283
|
+
type="button"
|
|
284
|
+
class="vo-wsx-qh"
|
|
285
|
+
[class.vo-empty]="!hasPages(q)"
|
|
286
|
+
[attr.aria-expanded]="isQOpen(q)"
|
|
287
|
+
[attr.aria-label]="qLabel(q)"
|
|
288
|
+
(click)="toggleQ(q)"
|
|
289
|
+
>
|
|
290
|
+
<vo-icon name="search" size="xs"></vo-icon>
|
|
291
|
+
<span class="vo-t" [class.vo-shim]="q.status === 'searching'">{{ q.query }}</span>
|
|
292
|
+
<span class="vo-n" [class.vo-none]="q.status === 'done' && !q.results">{{
|
|
293
|
+
q.status === 'searching' ? 'Searching' : q.results ? q.results + ' results' : 'No results'
|
|
294
|
+
}}</span>
|
|
295
|
+
<span class="vo-tm vo-num">{{ q.status === 'done' ? q.time : '' }}</span>
|
|
296
|
+
<vo-icon name="chev-r" size="xs"></vo-icon>
|
|
297
|
+
</button>
|
|
298
|
+
@if (q.rewritten) {
|
|
299
|
+
<span class="vo-wsx-rw">
|
|
300
|
+
<vo-icon name="refresh" size="xs"></vo-icon>Asked again in other words
|
|
301
|
+
</span>
|
|
302
|
+
}
|
|
303
|
+
@if (hasPages(q)) {
|
|
304
|
+
<div class="vo-fold" [class.vo-shut]="!isQOpen(q)" [attr.inert]="isQOpen(q) ? null : ''">
|
|
305
|
+
<div>
|
|
306
|
+
<ul class="vo-wsx-rs">
|
|
307
|
+
@for (p of q.pages; track p.title) {
|
|
308
|
+
<li
|
|
309
|
+
tabindex="0"
|
|
310
|
+
class="vo-wsx-r vo-enter"
|
|
311
|
+
[class.vo-skip]="isSkip(p)"
|
|
312
|
+
[class.vo-hl]="hotPage && hotPage.q === q.key && hotPage.title === p.title"
|
|
313
|
+
[attr.aria-label]="pageLabel(p)"
|
|
314
|
+
>
|
|
315
|
+
<span class="vo-wsx-fav" aria-hidden="true">{{ p.domain[0].toUpperCase() }}</span>
|
|
316
|
+
<span class="vo-tx">
|
|
317
|
+
<span class="vo-t">{{ p.title }}</span>
|
|
318
|
+
<span class="vo-d">{{ p.domain }}{{ p.date ? ' · ' + p.date : '' }}</span>
|
|
319
|
+
</span>
|
|
320
|
+
<span class="vo-tag" [class]="STATUS[p.status][1]">
|
|
321
|
+
@if (p.status === 'reading') {
|
|
322
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
323
|
+
}
|
|
324
|
+
{{ STATUS[p.status][0] }}
|
|
325
|
+
</span>
|
|
326
|
+
</li>
|
|
327
|
+
}
|
|
328
|
+
</ul>
|
|
329
|
+
</div>
|
|
330
|
+
</div>
|
|
331
|
+
}
|
|
332
|
+
</div>
|
|
333
|
+
}
|
|
334
|
+
</div>
|
|
335
|
+
</div>
|
|
336
|
+
</div>
|
|
337
|
+
|
|
338
|
+
@if (answer) {
|
|
339
|
+
<div class="vo-wsx-ans">
|
|
340
|
+
@for (part of answerParts; track $index) {
|
|
341
|
+
@if (part.cite !== undefined) {
|
|
342
|
+
<button
|
|
343
|
+
type="button"
|
|
344
|
+
class="vo-wsx-cite"
|
|
345
|
+
[class.vo-on]="hot === part.cite"
|
|
346
|
+
[attr.aria-label]="citeLabel(part.cite)"
|
|
347
|
+
(pointerenter)="hot = part.cite ?? null"
|
|
348
|
+
(pointerleave)="hot = null"
|
|
349
|
+
(focus)="hot = part.cite ?? null"
|
|
350
|
+
(blur)="hot = null"
|
|
351
|
+
>{{ part.cite }}</button>
|
|
352
|
+
} @else {
|
|
353
|
+
<span>{{ part.text }}</span>
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
</div>
|
|
357
|
+
}
|
|
358
|
+
<p class="vo-wsx-sr" role="status">{{ said }}</p>
|
|
359
|
+
</div>
|
|
360
|
+
`, styles: [".vo-wsx{padding:6px;display:flex;flex-direction:column;font-size:13px}.vo-wsx-h{display:flex;align-items:center;gap:10px;width:100%;padding:var(--vo-s-2) 10px;border-radius:var(--vo-r-in);text-align:left;font-size:13.5px;transition:background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-wsx-h:hover{background:var(--vo-row)}}.vo-wsx-ic{width:16px;height:16px;flex:none;display:grid;place-items:center;color:var(--vo-fg2)}.vo-wsx-ic .vo-spin{width:11px;height:11px}.vo-wsx-st{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-wsx-h>.vo-i{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-wsx-h[aria-expanded=false]>.vo-i{transform:rotate(-90deg)}.vo-wsx-marks{display:flex;align-items:center}.vo-wsx-marks span{width:20px;height:20px;border-radius:50%;display:grid;place-items:center;margin-left:-5px;background:var(--vo-chip);color:var(--vo-fg2);font-size:10.5px;font-weight:500;box-shadow:0 0 0 2px var(--vo-surface);transition:background .2s,color .2s}.vo-wsx-marks span.vo-n{background:var(--vo-surface);color:var(--vo-muted);box-shadow:0 0 0 2px var(--vo-surface),inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:10px}.vo-wsx-marks span.vo-hl{background:var(--vo-fg2);color:var(--vo-surface)}.vo-wsx-list{display:flex;flex-direction:column;gap:2px;padding:2px 0 var(--vo-s-1)}.vo-wsx-q{display:flex;flex-direction:column}.vo-wsx-qh{display:grid;grid-template-columns:16px minmax(0,1fr) auto auto 12px;align-items:center;column-gap:var(--vo-s-2);width:100%;padding:6px 10px;border-radius:calc(10px * var(--vo-rk));text-align:left;transition:background var(--vo-t-fast)}.vo-wsx-q.vo-hl>.vo-wsx-qh{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-wsx-qh:hover{background:var(--vo-row)}}.vo-wsx-qh>.vo-i:first-child{color:var(--vo-muted)}.vo-wsx-qh .vo-t{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--vo-fg)}.vo-wsx-qh .vo-n,.vo-wsx-qh .vo-tm{font-size:12px;color:var(--vo-muted);white-space:nowrap}.vo-wsx-qh .vo-n.vo-none{color:var(--vo-warn)}.vo-wsx-qh>.vo-i:last-child{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-wsx-qh[aria-expanded=true]>.vo-i:last-child{transform:rotate(90deg)}.vo-wsx-qh[aria-expanded=false].vo-empty>.vo-i:last-child{visibility:hidden}.vo-wsx-rw{display:flex;align-items:center;gap:6px;padding:0 10px 2px 34px;font-size:12px;color:var(--vo-muted)}.vo-wsx-rs{list-style:none;margin:0;padding:2px 0 var(--vo-s-1) 26px;display:flex;flex-direction:column;gap:2px}.vo-wsx-r{display:grid;grid-template-columns:20px minmax(0,1fr) auto;column-gap:var(--vo-s-2);align-items:center;padding:5px var(--vo-s-2);border-radius:calc(9px * var(--vo-rk));transition:background var(--vo-t-fast);cursor:default}.vo-wsx-r.vo-hl{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-wsx-r:hover{background:var(--vo-row)}}.vo-wsx-r:focus-visible{outline-offset:-2px}.vo-wsx-fav{width:20px;height:20px;border-radius:calc(6px * var(--vo-rk));display:grid;place-items:center;background:var(--vo-chip);color:var(--vo-fg2);font-size:10.5px;font-weight:500}.vo-wsx-r .vo-tx{display:flex;flex-direction:column;min-width:0;line-height:1.35}.vo-wsx-r .vo-t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:12.5px;color:var(--vo-fg)}.vo-wsx-r .vo-d{font-size:11.5px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-wsx-r.vo-skip .vo-t{color:var(--vo-muted)}.vo-wsx-r .vo-tag .vo-spin{width:9px;height:9px}.vo-wsx-ans{padding:var(--vo-s-2) 10px 6px;font-size:13.5px;line-height:1.6;color:var(--vo-fg)}.vo-wsx-ans:empty{display:none}.vo-wsx-cite{display:inline-grid;place-items:center;min-width:18px;height:17px;padding:0 4px;margin:0 1px;border-radius:calc(5px * var(--vo-rk));background:var(--vo-chip);color:var(--vo-fg2);font-size:11px;font-weight:500;vertical-align:1px;transition:background var(--vo-t-fast),color var(--vo-t-fast)}.vo-wsx-cite.vo-on{background:var(--vo-fg2);color:var(--vo-surface)}@media (hover:hover) and (pointer:fine){.vo-wsx-cite:hover{background:var(--vo-fg2);color:var(--vo-surface)}}.vo-wsx-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.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-shim{background:linear-gradient(90deg,var(--vo-fg) 0%,var(--vo-fg) 38%,var(--vo-faint) 50%,var(--vo-fg) 62%,var(--vo-fg) 100%);background-size:260% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 2.2s linear infinite}@keyframes vo-shim{0%{background-position:100% 0}to{background-position:-160% 0}}.vo-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}.vo-sw{display:inline-block;transition:opacity .2s var(--vo-ease),filter .2s var(--vo-ease),transform .25s var(--vo-ease)}.vo-sw.vo-out{opacity:0;filter:blur(3px);transform:translateY(3px)}.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)}@media (prefers-reduced-motion:reduce){.vo-shim{color:var(--vo-fg);background:none}}\n"] }]
|
|
361
|
+
}], propDecorators: { queries: [{
|
|
362
|
+
type: Input
|
|
363
|
+
}], done: [{
|
|
364
|
+
type: Input
|
|
365
|
+
}], answer: [{
|
|
366
|
+
type: Input
|
|
367
|
+
}], open: [{
|
|
368
|
+
type: Input
|
|
369
|
+
}], bare: [{
|
|
370
|
+
type: Input
|
|
371
|
+
}], openChange: [{
|
|
372
|
+
type: Output
|
|
373
|
+
}] } });
|
|
374
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLXNlYXJjaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi93ZWItc2VhcmNoL3dlYi1zZWFyY2guY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsbUVBQW1FO0FBQ25FLGdGQUFnRjtBQUNoRiw2RUFBNkU7QUFDN0UsNkVBQTZFO0FBQzdFLDhDQUE4QztBQUU5QyxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBOEJ6RCxNQUFNLE1BQU0sR0FBZ0Q7SUFDMUQsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztJQUN4QixJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO0lBQ2xCLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7SUFDeEIsT0FBTyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDO0lBQ3hDLE9BQU8sRUFBRSxDQUFDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQztJQUN4QyxPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLENBQUM7Q0FDekMsQ0FBQztBQWFGLDZGQUE2RjtBQTBIN0YsTUFBTSxPQUFPLGtCQUFrQjtJQXpIL0I7UUEwSFcsWUFBTyxHQUFlLEVBQUUsQ0FBQztRQUNsQyxnRkFBZ0Y7UUFDdkUsU0FBSSxHQUFHLEtBQUssQ0FBQztRQVF0Qiw0Q0FBNEM7UUFDbkMsU0FBSSxHQUFHLElBQUksQ0FBQztRQUVYLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRTFDLFdBQU0sR0FBRyxNQUFNLENBQUM7UUFFekIsUUFBRyxHQUFrQixJQUFJLENBQUM7UUFDMUIsU0FBSSxHQUFHLEVBQUUs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Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUhULDRyTEFsSFMsZUFBZTs7NEZBcUhkLGtCQUFrQjtrQkF6SDlCLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksaUJBQ0QsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLGVBQWUsQ0FBQyxZQUNoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpSFQ7OEJBSVEsT0FBTztzQkFBZixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRU8sSUFBSTtzQkFBaEIsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIGZyYW1ld29yay9hbmd1bGFyL3dlYi1zZWFyY2gvd2ViLXNlYXJjaC5jb21wb25lbnQudHNcbi8vXG4vLyBOYXRpdmUgQW5ndWxhciBwb3J0IG9mIGZyYW1ld29yay9yZWFjdC93ZWItc2VhcmNoL1dlYlNlYXJjaC50c3guXG4vLyBUaGUgYWdlbnQncyB3ZWIgc2VhcmNoZXMgYXMgYSB0cmFpbDogZWFjaCBxdWVyeSBhbmQgd2hhdCBjYW1lIGJhY2ssIGVhY2ggcGFnZVxuLy8gcmVhZCwgc2tpbW1lZCBvciBza2lwcGVkIGFuZCB3aHksIGEgc3VtbWFyeSBvbmNlIGRvbmUsIGFuZCBhbiBhbnN3ZXIgd2hvc2Vcbi8vIGNpdGF0aW9ucyBsaWdodCB0aGVpciBwYWdlcy4gSW5wdXRzIG1pcnJvciB0aGUgUmVhY3QgcHJvcHM7IHRoZSBvcGVuLXN0YXRlXG4vLyBjYWxsYmFjayBiZWNvbWVzIGFuIEBPdXRwdXQoKSBFdmVudEVtaXR0ZXIuXG5cbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZvSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2NvcmUvaWNvbi5jb21wb25lbnQnO1xuXG4vKiogT25lIHBhZ2UgdGhlIGFnZW50IG9wZW5lZCBmb3IgYSBxdWVyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViUGFnZSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKiBMaWtlIFwic3RyaXBlLmNvbVwiLiAqL1xuICBkb21haW46IHN0cmluZztcbiAgLyoqIExpa2UgXCJPY3QgMjAyNlwiLiAqL1xuICBkYXRlPzogc3RyaW5nO1xuICAvKiogcmVhZGluZyB3aGlsZSB0aGUgYWdlbnQgb3BlbnMgaXQ7IHRoZSBza2lwcGVkIG9uZXMgc2F5IHdoeS4gKi9cbiAgc3RhdHVzOiAncmVhZGluZycgfCAncmVhZCcgfCAnc2tpbW1lZCcgfCAncGF5d2FsbCcgfCAnYmxvY2tlZCcgfCAndGltZW91dCc7XG4gIC8qKiBUaGUgbnVtYmVyIHRoZSBhbnN3ZXIgY2l0ZXMgaXQgYnksIGFzIFsxXS4gKi9cbiAgY2l0ZT86IG51bWJlcjtcbn1cblxuLyoqIE9uZSBzZWFyY2ggdGhlIGFnZW50IG1hZGUuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlF1ZXJ5IHtcbiAga2V5OiBzdHJpbmc7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIC8qKiBzZWFyY2hpbmcgc2hpbW1lcnM7IGRvbmUgc2hvd3MgdGhlIGNvdW50IGFuZCB0aGUgdGltZS4gKi9cbiAgc3RhdHVzOiAnc2VhcmNoaW5nJyB8ICdkb25lJztcbiAgLyoqIEhvdyBtYW55IHJlc3VsdHMgY2FtZSBiYWNrOyAwIHNheXMgTm8gcmVzdWx0cy4gKi9cbiAgcmVzdWx0cz86IG51bWJlcjtcbiAgLyoqIExpa2UgXCIwLjlzXCIuICovXG4gIHRpbWU/OiBzdHJpbmc7XG4gIC8qKiBUaGlzIHF1ZXJ5IGFza3MgdGhlIG9uZSBiZWZvcmUgaXQgYWdhaW4gaW4gb3RoZXIgd29yZHMuICovXG4gIHJld3JpdHRlbj86IGJvb2xlYW47XG4gIHBhZ2VzPzogV2ViUGFnZVtdO1xufVxuXG5jb25zdCBTVEFUVVM6IFJlY29yZDxXZWJQYWdlWydzdGF0dXMnXSwgW3N0cmluZywgc3RyaW5nXT4gPSB7XG4gIHJlYWRpbmc6IFsnUmVhZGluZycsICcnXSxcbiAgcmVhZDogWydSZWFkJywgJyddLFxuICBza2ltbWVkOiBbJ1NraW1tZWQnLCAnJ10sXG4gIHBheXdhbGw6IFsnU2tpcHBlZDogcGF5d2FsbCcsICd2by13YXJuJ10sXG4gIGJsb2NrZWQ6IFsnU2tpcHBlZDogYmxvY2tlZCcsICd2by13YXJuJ10sXG4gIHRpbWVvdXQ6IFsnU2tpcHBlZDogdGltZW91dCcsICd2by13YXJuJ10sXG59O1xuXG4vKiogT25lIGZsYXR0ZW5lZCBwYWdlIHdpdGggaXRzIHF1ZXJ5IGtleSwgZm9yIGNpdGF0aW9ucyBhbmQgbWFya3MuICovXG5pbnRlcmZhY2UgRmxhdFBhZ2UgZXh0ZW5kcyBXZWJQYWdlIHtcbiAgcTogc3RyaW5nO1xufVxuXG4vKiogT25lIHBpZWNlIG9mIHRoZSBhbnN3ZXI6IHBsYWluIHRleHQgb3IgYSBjaXRhdGlvbiBidXR0b24uICovXG5pbnRlcmZhY2UgQW5zd2VyUGFydCB7XG4gIHRleHQ/OiBzdHJpbmc7XG4gIGNpdGU/OiBudW1iZXI7XG59XG5cbi8qKiBUaGUgYWdlbnQncyB3ZWIgc2VhcmNoZXMgYXMgYSB0cmFpbCwgd2l0aCBhbiBhbnN3ZXIgd2hvc2UgY2l0YXRpb25zIGxpZ2h0IHRoZWlyIHBhZ2VzLiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndm8td2ViLXNlYXJjaCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtWb0ljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdm89XCJcIlxuICAgICAgY2xhc3M9XCJ2by13c3hcIlxuICAgICAgW2NsYXNzLnZvLXBhbmVsXT1cIiFiYXJlXCJcbiAgICAgIFtzdHlsZS5wYWRkaW5nSW5saW5lXT1cImJhcmUgPyAnMCcgOiBudWxsXCJcbiAgICA+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXdzeC1oXCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIiAoY2xpY2spPVwidG9nZ2xlKClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by13c3gtaWNcIj5cbiAgICAgICAgICBAaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIDx2by1pY29uIG5hbWU9XCJnbG9iZVwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3BpblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by13c3gtc3Qgdm8tc3dcIiBbY2xhc3Mudm8tc2hpbV09XCIhZG9uZVwiPnt7IGxpbmUgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidm8td3N4LW1hcmtzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgQGZvciAocyBvZiBtYXJrczsgdHJhY2sgcykge1xuICAgICAgICAgICAgPHNwYW4gW2NsYXNzLnZvLWhsXT1cImhvdFBhZ2U/LmRvbWFpbiA9PT0gc1wiPnt7IHNbMF0udG9VcHBlckNhc2UoKSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChzaXRlcy5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW5cIj4re3sgc2l0ZXMubGVuZ3RoIC0gNCB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHZvLWljb24gbmFtZT1cImNoZXYtZFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidm8tZm9sZCB2by13c3gtZm9sZFwiIFtjbGFzcy52by1zaHV0XT1cIiFpc09wZW5cIiBbYXR0ci5pbmVydF09XCJpc09wZW4gPyBudWxsIDogJydcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8td3N4LWxpc3RcIj5cbiAgICAgICAgICAgIEBmb3IgKHEgb2YgcXVlcmllczsgdHJhY2sgcS5rZXkpIHtcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidm8td3N4LXEgdm8tZW50ZXJcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy52by1obF09XCJob3RQYWdlICYmIGhvdFBhZ2UucSA9PT0gcS5rZXkgJiYgIWlzUU9wZW4ocSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInZvLXdzeC1xaFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mudm8tZW1wdHldPVwiIWhhc1BhZ2VzKHEpXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNRT3BlbihxKVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInFMYWJlbChxKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUShxKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHZvLWljb24gbmFtZT1cInNlYXJjaFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdFwiIFtjbGFzcy52by1zaGltXT1cInEuc3RhdHVzID09PSAnc2VhcmNoaW5nJ1wiPnt7IHEucXVlcnkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW5cIiBbY2xhc3Mudm8tbm9uZV09XCJxLnN0YXR1cyA9PT0gJ2RvbmUnICYmICFxLnJlc3VsdHNcIj57e1xuICAgICAgICAgICAgICAgICAgICBxLnN0YXR1cyA9PT0gJ3NlYXJjaGluZycgPyAnU2VhcmNoaW5nJyA6IHEucmVzdWx0cyA/IHEucmVzdWx0cyArICcgcmVzdWx0cycgOiAnTm8gcmVzdWx0cydcbiAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10bSB2by1udW1cIj57eyBxLnN0YXR1cyA9PT0gJ2RvbmUnID8gcS50aW1lIDogJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiY2hldi1yXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIEBpZiAocS5yZXdyaXR0ZW4pIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8td3N4LXJ3XCI+XG4gICAgICAgICAgICAgICAgICAgIDx2by1pY29uIG5hbWU9XCJyZWZyZXNoXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPkFza2VkIGFnYWluIGluIG90aGVyIHdvcmRzXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoaGFzUGFnZXMocSkpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1mb2xkXCIgW2NsYXNzLnZvLXNodXRdPVwiIWlzUU9wZW4ocSlcIiBbYXR0ci5pbmVydF09XCJpc1FPcGVuKHEpID8gbnVsbCA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwidm8td3N4LXJzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChwIG9mIHEucGFnZXM7IHRyYWNrIHAudGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZvLXdzeC1yIHZvLWVudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudm8tc2tpcF09XCJpc1NraXAocClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy52by1obF09XCJob3RQYWdlICYmIGhvdFBhZ2UucSA9PT0gcS5rZXkgJiYgaG90UGFnZS50aXRsZSA9PT0gcC50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJwYWdlTGFiZWwocClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by13c3gtZmF2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3sgcC5kb21haW5bMF0udG9VcHBlckNhc2UoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXR4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRcIj57eyBwLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1kXCI+e3sgcC5kb21haW4gfX17eyBwLmRhdGUgPyAnIMK3ICcgKyBwLmRhdGUgOiAnJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10YWdcIiBbY2xhc3NdPVwiU1RBVFVTW3Auc3RhdHVzXVsxXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChwLnN0YXR1cyA9PT0gJ3JlYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3BpblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IFNUQVRVU1twLnN0YXR1c11bMF0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKGFuc3dlcikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidm8td3N4LWFuc1wiPlxuICAgICAgICAgIEBmb3IgKHBhcnQgb2YgYW5zd2VyUGFydHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgQGlmIChwYXJ0LmNpdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ2by13c3gtY2l0ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnZvLW9uXT1cImhvdCA9PT0gcGFydC5jaXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNpdGVMYWJlbChwYXJ0LmNpdGUpXCJcbiAgICAgICAgICAgICAgICAocG9pbnRlcmVudGVyKT1cImhvdCA9IHBhcnQuY2l0ZSA/PyBudWxsXCJcbiAgICAgICAgICAgICAgICAocG9pbnRlcmxlYXZlKT1cImhvdCA9IG51bGxcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJob3QgPSBwYXJ0LmNpdGUgPz8gbnVsbFwiXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwiaG90ID0gbnVsbFwiXG4gICAgICAgICAgICAgID57eyBwYXJ0LmNpdGUgfX08L2J1dHRvbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8c3Bhbj57eyBwYXJ0LnRleHQgfX08L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxwIGNsYXNzPVwidm8td3N4LXNyXCIgcm9sZT1cInN0YXR1c1wiPnt7IHNhaWQgfX08L3A+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsOiAnLi93ZWItc2VhcmNoLmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFdlYlNlYXJjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHF1ZXJpZXM6IFdlYlF1ZXJ5W10gPSBbXTtcbiAgLyoqIFRydWUgb25jZSBzZWFyY2hpbmcgYW5kIHJlYWRpbmcgYXJlIG92ZXI6IHRoZSB0cmFpbCBmb2xkcyB0byBpdHMgc3VtbWFyeS4gKi9cbiAgQElucHV0KCkgZG9uZSA9IGZhbHNlO1xuICAvKiogVGhlIGFuc3dlciwgd2l0aCBzb3VyY2VzIGNpdGVkIGFzIFsxXSwgWzJdLiBFYWNoIG51bWJlciBwb2ludHMgYXQgdGhlIHBhZ2Ugd2l0aCB0aGF0IGNpdGUuICovXG4gIEBJbnB1dCgpIGFuc3dlcj86IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgdGhlIHRyYWlsIGlzIG9wZW4uIExlZnQgb3V0LCBpdCBmb2xkcyBvbmNlIGRvbmUgdHVybnMgdHJ1ZS4gKi9cbiAgQElucHV0KCkgc2V0IG9wZW4odmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmNvbnRyb2xsZWQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB0aGlzLmlubmVyID0gdmFsdWU7XG4gIH1cbiAgLyoqIFdpdGhvdXQgdGhlIHBhbmVsLCBmb3IgYSBjaGF0IHN0cmVhbS4gKi9cbiAgQElucHV0KCkgYmFyZSA9IHRydWU7XG5cbiAgQE91dHB1dCgpIG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgcmVhZG9ubHkgU1RBVFVTID0gU1RBVFVTO1xuXG4gIGhvdDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHNhaWQgPSAnJztcblxuICBwcml2YXRlIGNvbnRyb2xsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbm5lciA9IHRydWU7XG4gIHByaXZhdGUgcU9wZW46IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gIHByaXZhdGUgbGFzdFNhaWQgPSAnJztcblxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlubmVyO1xuICB9XG5cbiAgZ2V0IGZsYXRQYWdlcygpOiBGbGF0UGFnZVtdIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyaWVzLmZsYXRNYXAoKHEpID0+IChxLnBhZ2VzID8/IFtdKS5tYXAoKHApID0+ICh7IC4uLnAsIHE6IHEua2V5IH0pKSk7XG4gIH1cblxuICBnZXQgc2l0ZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4ubmV3IFNldCh0aGlzLmZsYXRQYWdlcy5tYXAoKHApID0+IHAuZG9tYWluKSldO1xuICB9XG5cbiAgZ2V0IG1hcmtzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5zaXRlcy5zbGljZSgwLCA0KTtcbiAgfVxuXG4gIGdldCBsaW5lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVhZCA9IHRoaXMuZmxhdFBhZ2VzLmZpbHRlcigocCkgPT4gcC5zdGF0dXMgPT09ICdyZWFkJyB8fCBwLnN0YXR1cyA9PT0gJ3NraW1tZWQnKS5sZW5ndGg7XG4gICAgaWYgKHRoaXMuZG9uZSkgcmV0dXJuIGAke3RoaXMucXVlcmllcy5sZW5ndGh9IHNlYXJjaGVzLCAke3JlYWR9IHBhZ2VzIHJlYWRgO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnF1ZXJpZXMuZmluZCgocSkgPT4gcS5zdGF0dXMgPT09ICdzZWFyY2hpbmcnKTtcbiAgICBpZiAoY3VycmVudCkgcmV0dXJuIGBTZWFyY2hpbmcgZm9yIOKAnCR7Y3VycmVudC5xdWVyeX3igJ1gO1xuICAgIGNvbnN0IHJlYWRpbmcgPSB0aGlzLmZsYXRQYWdlcy5maWx0ZXIoKHApID0+IHAuc3RhdHVzID09PSAncmVhZGluZycpLmxlbmd0aDtcbiAgICBpZiAocmVhZGluZykgcmV0dXJuIGBSZWFkaW5nICR7cmVhZGluZ30gcGFnZXNgO1xuICAgIHJldHVybiAnU2VhcmNoaW5nIHRoZSB3ZWInO1xuICB9XG5cbiAgZ2V0IGhvdFBhZ2UoKTogRmxhdFBhZ2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmhvdCAhPSBudWxsID8gdGhpcy5mbGF0UGFnZXMuZmluZCgocCkgPT4gcC5jaXRlID09PSB0aGlzLmhvdCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgYW5zd2VyUGFydHMoKTogQW5zd2VyUGFydFtdIHtcbiAgICBpZiAoIXRoaXMuYW5zd2VyKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuYW5zd2VyLnNwbGl0KC8oXFxbXFxkK1xcXSkvKS5tYXAoKHBhcnQpID0+IHtcbiAgICAgIGNvbnN0IG0gPSBwYXJ0Lm1hdGNoKC9eXFxbKFxcZCspXFxdJC8pO1xuICAgICAgcmV0dXJuIG0gPyB7IGNpdGU6ICttWzFdIH0gOiB7IHRleHQ6IHBhcnQgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGhhc1BhZ2VzKHE6IFdlYlF1ZXJ5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhcS5wYWdlcz8ubGVuZ3RoO1xuICB9XG5cbiAgaXNRT3BlbihxOiBXZWJRdWVyeSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5oYXNQYWdlcyhxKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGF1dG8gPSBxLnBhZ2VzPy5zb21lKChwKSA9PiBwLnN0YXR1cyA9PT0gJ3JlYWRpbmcnKSA/PyBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5xT3BlbltxLmtleV0gPz8gYXV0bztcbiAgfVxuXG4gIGlzU2tpcChwOiBXZWJQYWdlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHAuc3RhdHVzICE9PSAncmVhZCcgJiYgcC5zdGF0dXMgIT09ICdza2ltbWVkJyAmJiBwLnN0YXR1cyAhPT0gJ3JlYWRpbmcnO1xuICB9XG5cbiAgcUxhYmVsKHE6IFdlYlF1ZXJ5KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHEuc3RhdHVzICE9PSAnZG9uZScpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJlcyA9IHEucmVzdWx0cyA/IGAke3EucmVzdWx0c30gcmVzdWx0c2AgOiAnbm8gcmVzdWx0cyc7XG4gICAgcmV0dXJuIGAke3EucXVlcnl9OiAke3Jlc30ke3EudGltZSA/ICcsICcgKyBxLnRpbWUgOiAnJ31gO1xuICB9XG5cbiAgcGFnZUxhYmVsKHA6IFdlYlBhZ2UpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwLnRpdGxlfSwgJHtwLmRvbWFpbn0ke3AuZGF0ZSA/ICcsICcgKyBwLmRhdGUgOiAnJ306ICR7U1RBVFVTW3Auc3RhdHVzXVswXX1gO1xuICB9XG5cbiAgY2l0ZUxhYmVsKG46IG51bWJlciB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKG4gPT09IHVuZGVmaW5lZCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHAgPSB0aGlzLmZsYXRQYWdlcy5maW5kKCh4KSA9PiB4LmNpdGUgPT09IG4pO1xuICAgIHJldHVybiBwID8gYFNvdXJjZSAke259OiAke3AudGl0bGV9LCAke3AuZG9tYWlufWAgOiBgU291cmNlICR7bn1gO1xuICB9XG5cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0T3BlbighdGhpcy5pbm5lcik7XG4gIH1cblxuICB0b2dnbGVRKHE6IFdlYlF1ZXJ5KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc1BhZ2VzKHEpKSByZXR1cm47XG4gICAgdGhpcy5xT3BlbiA9IHsgLi4udGhpcy5xT3BlbiwgW3Eua2V5XTogIXRoaXMuaXNRT3BlbihxKSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRPcGVuKG86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlZCkgdGhpcy5pbm5lciA9IG87XG4gICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQobyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RvbmUnXSAmJiB0aGlzLmRvbmUgJiYgIXRoaXMuY29udHJvbGxlZCkge1xuICAgICAgdGhpcy5pbm5lciA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBvbmx5IGNoYW5nZXMgb2YgcGhhc2UgYXJlIGFubm91bmNlZFxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnF1ZXJpZXMuZmluZCgocSkgPT4gcS5zdGF0dXMgPT09ICdzZWFyY2hpbmcnKTtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5kb25lID8gYERvbmU6ICR7dGhpcy5saW5lfWAgOiBjdXJyZW50ID8gYFNlYXJjaGluZyBmb3IgJHtjdXJyZW50LnF1ZXJ5fWAgOiAnJztcbiAgICBpZiAobmV4dCAmJiBuZXh0ICE9PSB0aGlzLmxhc3RTYWlkKSB7XG4gICAgICB0aGlzLmxhc3RTYWlkID0gbmV4dDtcbiAgICAgIHRoaXMuc2FpZCA9IG5leHQ7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { EventEmitter, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export type EvalStatus = 'queued' | 'running' | 'pass' | 'fail';
|
|
4
|
+
export type EvalFilter = 'all' | 'fail';
|
|
5
|
+
/** A fix button under a failed case's details, like "Use $24 and rerun". */
|
|
6
|
+
export interface EvalFix {
|
|
7
|
+
label: string;
|
|
8
|
+
onClick: () => void;
|
|
9
|
+
}
|
|
10
|
+
/** One eval case: what it checks, how it did, and (for a failure) the details. */
|
|
11
|
+
export interface EvalCase {
|
|
12
|
+
id: string;
|
|
13
|
+
/** What it checks, like "Prices match the billing table". */
|
|
14
|
+
name: string;
|
|
15
|
+
status: EvalStatus;
|
|
16
|
+
/** How long it took, like "0.9s", shown once it has a result. */
|
|
17
|
+
time?: string;
|
|
18
|
+
/** For a failed case: what should have come back. */
|
|
19
|
+
expected?: string;
|
|
20
|
+
/** For a failed case: what came back instead. */
|
|
21
|
+
got?: string;
|
|
22
|
+
/** For a failed case: where the expected answer comes from. */
|
|
23
|
+
source?: string;
|
|
24
|
+
/** For a failed case: a white button under its details, like "Use $24 and rerun". */
|
|
25
|
+
fix?: EvalFix;
|
|
26
|
+
}
|
|
27
|
+
/** An eval suite's latest run: a bar per case, a pass count, and the cases. */
|
|
28
|
+
export declare class EvalResultsComponent implements OnChanges, OnDestroy {
|
|
29
|
+
/** Like "Pricing copy evals". */
|
|
30
|
+
title: string;
|
|
31
|
+
/** The line under the title, like "Copy agent · 8 cases · run 2h ago". */
|
|
32
|
+
subtitle?: string;
|
|
33
|
+
cases: EvalCase[];
|
|
34
|
+
/** Whether the whole suite is running: the button spins and the count reads "Running 3 of 8". */
|
|
35
|
+
running: boolean;
|
|
36
|
+
/** Defaults to "Run evals". */
|
|
37
|
+
runLabel: string;
|
|
38
|
+
/** How many passed the run before. Once the run settles, a tag compares with it. */
|
|
39
|
+
previousPassed?: number;
|
|
40
|
+
/** Which cases show: all of them, or only the failed ones. */
|
|
41
|
+
filter?: EvalFilter;
|
|
42
|
+
defaultFilter: EvalFilter;
|
|
43
|
+
/** Ids of the failed cases that are open. Leave it out to let each one open itself. */
|
|
44
|
+
open?: string[];
|
|
45
|
+
defaultOpen: string[];
|
|
46
|
+
/** Emitted by the run button. */
|
|
47
|
+
run: EventEmitter<void>;
|
|
48
|
+
filterChange: EventEmitter<EvalFilter>;
|
|
49
|
+
openChange: EventEmitter<string[]>;
|
|
50
|
+
private readonly motion;
|
|
51
|
+
show: EvalFilter;
|
|
52
|
+
opened: string[];
|
|
53
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
54
|
+
get failed(): number;
|
|
55
|
+
private get passed();
|
|
56
|
+
private get settled();
|
|
57
|
+
get count(): string;
|
|
58
|
+
get belowPrevious(): boolean;
|
|
59
|
+
get delta(): string;
|
|
60
|
+
seg(status: EvalStatus): string;
|
|
61
|
+
isOpen(k: EvalCase): boolean;
|
|
62
|
+
pick(v: EvalFilter): void;
|
|
63
|
+
toggle(k: EvalCase): void;
|
|
64
|
+
ngOnDestroy(): void;
|
|
65
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EvalResultsComponent, never>;
|
|
66
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<EvalResultsComponent, "vo-eval-results", never, { "title": { "alias": "title"; "required": false; }; "subtitle": { "alias": "subtitle"; "required": false; }; "cases": { "alias": "cases"; "required": false; }; "running": { "alias": "running"; "required": false; }; "runLabel": { "alias": "runLabel"; "required": false; }; "previousPassed": { "alias": "previousPassed"; "required": false; }; "filter": { "alias": "filter"; "required": false; }; "defaultFilter": { "alias": "defaultFilter"; "required": false; }; "open": { "alias": "open"; "required": false; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; }; }, { "run": "run"; "filterChange": "filterChange"; "openChange": "openChange"; }, never, never, true, never>;
|
|
67
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { EventEmitter, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/** Whether the answer was rated good or bad. */
|
|
4
|
+
export type FeedbackRating = 'up' | 'down' | null;
|
|
5
|
+
/** What was picked and written when the sheet is sent. */
|
|
6
|
+
export interface Feedback {
|
|
7
|
+
reasons: string[];
|
|
8
|
+
comment: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class FeedbackSheetComponent implements OnChanges, OnDestroy {
|
|
11
|
+
/** The answer being rated, shown above the thumbs. */
|
|
12
|
+
message?: string;
|
|
13
|
+
/** Whether the answer was rated good or bad. Leave it out to let the thumbs set it. */
|
|
14
|
+
rating?: FeedbackRating;
|
|
15
|
+
defaultRating: FeedbackRating;
|
|
16
|
+
/** Whether the reasons sheet is open. Leave it out and thumbs down opens it. */
|
|
17
|
+
open?: boolean;
|
|
18
|
+
defaultOpen: boolean;
|
|
19
|
+
/** The reasons picked. Leave it out to let the chips keep it. */
|
|
20
|
+
selected?: string[];
|
|
21
|
+
defaultSelected: string[];
|
|
22
|
+
/** What is written in the box. Leave it out to let the box keep it. */
|
|
23
|
+
comment: string;
|
|
24
|
+
defaultComment: string;
|
|
25
|
+
/** Shows the spinner on Send, for a scripted demo. */
|
|
26
|
+
sending: boolean;
|
|
27
|
+
/** The heading of the sheet that opens on thumbs down. */
|
|
28
|
+
question: string;
|
|
29
|
+
/** Quick reasons to pick from. */
|
|
30
|
+
reasons: string[];
|
|
31
|
+
placeholder: string;
|
|
32
|
+
/** A quiet note beside the buttons, like who sees the feedback. */
|
|
33
|
+
note: string;
|
|
34
|
+
/** What was sent, which shows the thank-you line. Leave it out and Send sets it. */
|
|
35
|
+
sent: Feedback | null;
|
|
36
|
+
/** Sits flat under a message in a chat thread (the default). Set false to give it a card of its own. */
|
|
37
|
+
bare: boolean;
|
|
38
|
+
ratingChange: EventEmitter<FeedbackRating>;
|
|
39
|
+
openChange: EventEmitter<boolean>;
|
|
40
|
+
selectedChange: EventEmitter<string[]>;
|
|
41
|
+
commentChange: EventEmitter<string>;
|
|
42
|
+
sentChange: EventEmitter<Feedback | null>;
|
|
43
|
+
/** Called with what the person picked and wrote when Send is pressed. */
|
|
44
|
+
submit: EventEmitter<Feedback>;
|
|
45
|
+
private boxRef?;
|
|
46
|
+
private readonly motion;
|
|
47
|
+
rate: FeedbackRating;
|
|
48
|
+
isOpen: boolean;
|
|
49
|
+
picked: string[];
|
|
50
|
+
stShown: string;
|
|
51
|
+
stOut: boolean;
|
|
52
|
+
private rateSet;
|
|
53
|
+
private openSet;
|
|
54
|
+
private selSet;
|
|
55
|
+
private busy;
|
|
56
|
+
private timers;
|
|
57
|
+
get thanksLine(): string;
|
|
58
|
+
private get status();
|
|
59
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
60
|
+
private later;
|
|
61
|
+
/** Crossfade the status line to the next text. */
|
|
62
|
+
private swap;
|
|
63
|
+
private setRate;
|
|
64
|
+
private setOpen;
|
|
65
|
+
up(): void;
|
|
66
|
+
down(focus: boolean): void;
|
|
67
|
+
toggle(reason: string): void;
|
|
68
|
+
onComment(value: string): void;
|
|
69
|
+
cancel(): void;
|
|
70
|
+
send(): void;
|
|
71
|
+
ngOnDestroy(): void;
|
|
72
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FeedbackSheetComponent, never>;
|
|
73
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FeedbackSheetComponent, "vo-feedback-sheet", never, { "message": { "alias": "message"; "required": false; }; "rating": { "alias": "rating"; "required": false; }; "defaultRating": { "alias": "defaultRating"; "required": false; }; "open": { "alias": "open"; "required": false; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "defaultSelected": { "alias": "defaultSelected"; "required": false; }; "comment": { "alias": "comment"; "required": false; }; "defaultComment": { "alias": "defaultComment"; "required": false; }; "sending": { "alias": "sending"; "required": false; }; "question": { "alias": "question"; "required": false; }; "reasons": { "alias": "reasons"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "note": { "alias": "note"; "required": false; }; "sent": { "alias": "sent"; "required": false; }; "bare": { "alias": "bare"; "required": false; }; }, { "ratingChange": "ratingChange"; "openChange": "openChange"; "selectedChange": "selectedChange"; "commentChange": "commentChange"; "sentChange": "sentChange"; "submit": "submit"; }, never, never, true, never>;
|
|
74
|
+
}
|