@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,600 @@
|
|
|
1
|
+
// framework/angular/agent-lanes/agent-lanes.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/agent-lanes/AgentLanes.tsx.
|
|
4
|
+
// Several agents working side by side, each in its own lane and hue, handing work
|
|
5
|
+
// to one another down a relay line. A working lane breathes, shimmers and fills
|
|
6
|
+
// its next step; a hand-off opens a line between two lanes and runs a light down
|
|
7
|
+
// the relay line from the sender's badge to the taker's, and the stretch it
|
|
8
|
+
// crossed stays lit. Inputs mirror the React props; callback props become
|
|
9
|
+
// @Output() EventEmitters.
|
|
10
|
+
//
|
|
11
|
+
// The relay-line strokes are positioned from badge to badge with a ResizeObserver
|
|
12
|
+
// (ported from the React useLayoutEffect / the vanilla place()). Reduced motion is
|
|
13
|
+
// respected via the shared ReducedMotionService.
|
|
14
|
+
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
15
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
import * as i1 from "../core/reduced-motion.service";
|
|
18
|
+
const TONE = {
|
|
19
|
+
blue: 'pb',
|
|
20
|
+
purple: 'pl',
|
|
21
|
+
green: 'pm',
|
|
22
|
+
orange: 'pp',
|
|
23
|
+
red: 'pr',
|
|
24
|
+
yellow: 'py',
|
|
25
|
+
pink: 'pk',
|
|
26
|
+
teal: 'pt',
|
|
27
|
+
};
|
|
28
|
+
const hueOf = (l) => TONE[l?.tone ?? 'blue'];
|
|
29
|
+
const clamp01 = (n) => Math.max(0, Math.min(1, n));
|
|
30
|
+
const clock = (s) => `${Math.floor(s / 60)}:${String(s % 60).padStart(2, '0')}`;
|
|
31
|
+
/** Several agents working in parallel, each in its own lane and hue, with hand-offs down a relay line. */
|
|
32
|
+
export class AgentLanesComponent {
|
|
33
|
+
/** Whether every agent is paused. Working lanes then show Paused and the clock stops. */
|
|
34
|
+
set paused(value) {
|
|
35
|
+
this.pausedControlled = value !== undefined;
|
|
36
|
+
if (value !== undefined)
|
|
37
|
+
this.innerPaused = value;
|
|
38
|
+
}
|
|
39
|
+
/** Keys of the lanes that are open. Leave it out to let each row toggle itself. */
|
|
40
|
+
set expanded(value) {
|
|
41
|
+
this.expandedControlled = value !== undefined;
|
|
42
|
+
if (value !== undefined)
|
|
43
|
+
this.innerExpanded = value;
|
|
44
|
+
}
|
|
45
|
+
constructor(reduced) {
|
|
46
|
+
this.reduced = reduced;
|
|
47
|
+
this.lanes = [];
|
|
48
|
+
this.defaultPaused = false;
|
|
49
|
+
/** Adds the Pause all / Resume button, until every lane is done (React: onPausedChange wired). */
|
|
50
|
+
this.pauseWired = false;
|
|
51
|
+
this.defaultExpanded = [];
|
|
52
|
+
/** Sits flat in a chat thread (the default). Set false to give it a card of its own. */
|
|
53
|
+
this.bare = true;
|
|
54
|
+
this.pausedChange = new EventEmitter();
|
|
55
|
+
this.expandedChange = new EventEmitter();
|
|
56
|
+
this.pausedControlled = false;
|
|
57
|
+
this.expandedControlled = false;
|
|
58
|
+
this.innerPaused = false;
|
|
59
|
+
this.innerExpanded = [];
|
|
60
|
+
this.counted = 0;
|
|
61
|
+
this.handOpen = false;
|
|
62
|
+
// the hand-offs whose light has arrived: their stretch of relay line stays lit
|
|
63
|
+
this.relayed = [];
|
|
64
|
+
this.lastHandKey = '';
|
|
65
|
+
}
|
|
66
|
+
// ----- controllable state -----
|
|
67
|
+
get isPaused() {
|
|
68
|
+
return this.innerPaused;
|
|
69
|
+
}
|
|
70
|
+
get expandedKeys() {
|
|
71
|
+
return this.innerExpanded;
|
|
72
|
+
}
|
|
73
|
+
togglePaused() {
|
|
74
|
+
const next = !this.isPaused;
|
|
75
|
+
if (!this.pausedControlled)
|
|
76
|
+
this.innerPaused = next;
|
|
77
|
+
this.pausedChange.emit(next);
|
|
78
|
+
}
|
|
79
|
+
toggleLane(key) {
|
|
80
|
+
const open = this.expandedKeys.includes(key);
|
|
81
|
+
const next = open ? this.expandedKeys.filter((k) => k !== key) : [...this.expandedKeys, key];
|
|
82
|
+
if (!this.expandedControlled)
|
|
83
|
+
this.innerExpanded = next;
|
|
84
|
+
this.expandedChange.emit(next);
|
|
85
|
+
}
|
|
86
|
+
// ----- derived view state -----
|
|
87
|
+
get finished() {
|
|
88
|
+
return this.lanes.length > 0 && this.lanes.every((l) => l.status === 'done');
|
|
89
|
+
}
|
|
90
|
+
get head() {
|
|
91
|
+
if (this.title !== undefined)
|
|
92
|
+
return this.title;
|
|
93
|
+
if (this.finished)
|
|
94
|
+
return `All ${this.lanes.length} agents finished`;
|
|
95
|
+
if (this.isPaused)
|
|
96
|
+
return 'All agents paused';
|
|
97
|
+
return `${this.lanes.length} agents working`;
|
|
98
|
+
}
|
|
99
|
+
get clockText() {
|
|
100
|
+
return clock(this.seconds ?? this.counted);
|
|
101
|
+
}
|
|
102
|
+
get total() {
|
|
103
|
+
return this.lanes.reduce((n, l) => n + (l.steps ?? 3), 0);
|
|
104
|
+
}
|
|
105
|
+
get stepsDone() {
|
|
106
|
+
return this.lanes.reduce((n, l) => n + Math.min(l.done ?? 0, l.steps ?? 3), 0);
|
|
107
|
+
}
|
|
108
|
+
get views() {
|
|
109
|
+
return this.lanes.map((lane) => {
|
|
110
|
+
const status = this.isPaused && lane.status === 'working' ? 'paused' : lane.status;
|
|
111
|
+
const steps = lane.steps ?? 3;
|
|
112
|
+
const done = lane.done ?? 0;
|
|
113
|
+
const live = status === 'working' || status === 'paused';
|
|
114
|
+
const bars = Array.from({ length: steps }, (_, i) => {
|
|
115
|
+
const run = i === done && live;
|
|
116
|
+
return {
|
|
117
|
+
on: i < done,
|
|
118
|
+
run,
|
|
119
|
+
ind: run && lane.progress === undefined,
|
|
120
|
+
progress: run && lane.progress !== undefined ? clamp01(lane.progress) : undefined,
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
lane,
|
|
125
|
+
status,
|
|
126
|
+
tone: hueOf(lane),
|
|
127
|
+
live,
|
|
128
|
+
sent: this.relayed.some((k) => k.startsWith(lane.key + '>')),
|
|
129
|
+
got: this.relayed.some((k) => k.endsWith('>' + lane.key)),
|
|
130
|
+
ping: this.pinged === lane.key,
|
|
131
|
+
open: this.expandedKeys.includes(lane.key),
|
|
132
|
+
bars,
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
nameOf(key) {
|
|
137
|
+
return this.lanes.find((l) => l.key === key)?.name ?? key;
|
|
138
|
+
}
|
|
139
|
+
toneOf(key) {
|
|
140
|
+
return hueOf(this.lanes.find((l) => l.key === key));
|
|
141
|
+
}
|
|
142
|
+
/** The hand-off line to render before the lane it is handed to, or undefined. */
|
|
143
|
+
handFor(laneKey) {
|
|
144
|
+
const h = this.kept;
|
|
145
|
+
if (!h || h.to !== laneKey)
|
|
146
|
+
return undefined;
|
|
147
|
+
const key = `${h.from}>${h.to}`;
|
|
148
|
+
return {
|
|
149
|
+
key,
|
|
150
|
+
from: h.from,
|
|
151
|
+
to: h.to,
|
|
152
|
+
what: h.what,
|
|
153
|
+
fromName: this.nameOf(h.from),
|
|
154
|
+
toName: this.nameOf(h.to),
|
|
155
|
+
fromTone: this.toneOf(h.from),
|
|
156
|
+
toTone: this.toneOf(h.to),
|
|
157
|
+
open: this.handOpen,
|
|
158
|
+
leaving: this.handoff === undefined,
|
|
159
|
+
lit: this.relayed.includes(key),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
get strokes() {
|
|
163
|
+
const keys = this.drawing && !this.relayed.includes(this.drawing)
|
|
164
|
+
? [...this.relayed, this.drawing]
|
|
165
|
+
: this.relayed;
|
|
166
|
+
return keys.map((key) => {
|
|
167
|
+
const [from, to] = key.split('>');
|
|
168
|
+
return { key, from, to, fromTone: this.toneOf(from), toTone: this.toneOf(to) };
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
// ----- lifecycle -----
|
|
172
|
+
ngAfterViewInit() {
|
|
173
|
+
if (!this.pausedControlled)
|
|
174
|
+
this.innerPaused = this.defaultPaused;
|
|
175
|
+
if (!this.expandedControlled && this.innerExpanded.length === 0) {
|
|
176
|
+
this.innerExpanded = [...this.defaultExpanded];
|
|
177
|
+
}
|
|
178
|
+
this.startCounter();
|
|
179
|
+
const box = this.rowsRef?.nativeElement;
|
|
180
|
+
if (box && typeof ResizeObserver === 'function') {
|
|
181
|
+
this.ro = new ResizeObserver(() => this.placeStrokes());
|
|
182
|
+
this.ro.observe(box);
|
|
183
|
+
}
|
|
184
|
+
this.placeStrokes();
|
|
185
|
+
}
|
|
186
|
+
ngOnChanges(changes) {
|
|
187
|
+
if (changes['seconds'] || changes['paused'] || changes['lanes'])
|
|
188
|
+
this.startCounter();
|
|
189
|
+
if (changes['handoff'])
|
|
190
|
+
this.onHandoffChange();
|
|
191
|
+
if (changes['lanes'])
|
|
192
|
+
queueMicrotask(() => this.placeStrokes());
|
|
193
|
+
}
|
|
194
|
+
onHandoffChange() {
|
|
195
|
+
const h = this.handoff;
|
|
196
|
+
if (h) {
|
|
197
|
+
// bring the line in: mount shut, then open on the next frame so the lanes below glide down
|
|
198
|
+
this.kept = h;
|
|
199
|
+
if (this.keptTimer) {
|
|
200
|
+
clearTimeout(this.keptTimer);
|
|
201
|
+
this.keptTimer = undefined;
|
|
202
|
+
}
|
|
203
|
+
this.handOpen = false;
|
|
204
|
+
this.scheduleOpen();
|
|
205
|
+
const key = `${h.from}>${h.to}`;
|
|
206
|
+
this.lastHandKey = key;
|
|
207
|
+
if (!this.relayed.includes(key)) {
|
|
208
|
+
if (this.drawTimer)
|
|
209
|
+
clearTimeout(this.drawTimer);
|
|
210
|
+
this.drawTimer = setTimeout(() => this.startDraw(key), this.reduced.reduce() ? 0 : 500);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
// keep the last one on screen while it plays its exit
|
|
215
|
+
this.handOpen = false;
|
|
216
|
+
if (this.kept && !this.keptTimer) {
|
|
217
|
+
this.keptTimer = setTimeout(() => {
|
|
218
|
+
this.kept = undefined;
|
|
219
|
+
this.keptTimer = undefined;
|
|
220
|
+
}, this.reduced.reduce() ? 0 : 700);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
scheduleOpen() {
|
|
225
|
+
if (this.handRaf)
|
|
226
|
+
cancelAnimationFrame(this.handRaf);
|
|
227
|
+
if (this.openFrame)
|
|
228
|
+
cancelAnimationFrame(this.openFrame);
|
|
229
|
+
const raf = typeof requestAnimationFrame === 'function'
|
|
230
|
+
? requestAnimationFrame
|
|
231
|
+
: (cb) => setTimeout(() => cb(0), 16);
|
|
232
|
+
this.handRaf = raf(() => {
|
|
233
|
+
this.openFrame = raf(() => {
|
|
234
|
+
this.handOpen = true;
|
|
235
|
+
this.placeStrokes();
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
startDraw(key) {
|
|
240
|
+
if (this.relayed.includes(key))
|
|
241
|
+
return;
|
|
242
|
+
this.drawing = key;
|
|
243
|
+
this.placeStrokes();
|
|
244
|
+
const to = key.split('>')[1];
|
|
245
|
+
const arrive = () => {
|
|
246
|
+
if (!this.relayed.includes(key))
|
|
247
|
+
this.relayed = [...this.relayed, key];
|
|
248
|
+
if (this.drawing === key)
|
|
249
|
+
this.drawing = undefined;
|
|
250
|
+
this.pinged = to;
|
|
251
|
+
if (this.pingTimer)
|
|
252
|
+
clearTimeout(this.pingTimer);
|
|
253
|
+
this.pingTimer = setTimeout(() => {
|
|
254
|
+
if (this.pinged === to)
|
|
255
|
+
this.pinged = undefined;
|
|
256
|
+
}, 950);
|
|
257
|
+
this.placeStrokes();
|
|
258
|
+
};
|
|
259
|
+
// the stroke draws itself from the sender's badge down to the taker's
|
|
260
|
+
const pk = this.rowsRef?.nativeElement.querySelector(`:scope>.vo-aln-pk[data-k="${CSS.escape(key)}"]`);
|
|
261
|
+
if (!pk || this.reduced.reduce()) {
|
|
262
|
+
arrive();
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
const an = pk.animate([{ transform: 'scaleY(0)' }, { transform: 'scaleY(1)' }], {
|
|
266
|
+
duration: 800,
|
|
267
|
+
easing: 'cubic-bezier(.65,0,.35,1)',
|
|
268
|
+
});
|
|
269
|
+
an.finished.then(arrive, () => { });
|
|
270
|
+
}
|
|
271
|
+
/** Lay each lit stroke from the sender's badge down to the taker's, in the gap between them. */
|
|
272
|
+
placeStrokes() {
|
|
273
|
+
const box = this.rowsRef?.nativeElement;
|
|
274
|
+
if (!box)
|
|
275
|
+
return;
|
|
276
|
+
const rr = box.getBoundingClientRect();
|
|
277
|
+
box.querySelectorAll(':scope>.vo-aln-pk').forEach((pk) => {
|
|
278
|
+
const [f, g] = (pk.dataset['k'] ?? '').split('>');
|
|
279
|
+
const a = box.querySelector(`[data-lane="${CSS.escape(f)}"] .vo-aln-av`);
|
|
280
|
+
const b = box.querySelector(`[data-lane="${CSS.escape(g)}"] .vo-aln-av`);
|
|
281
|
+
if (!a || !b)
|
|
282
|
+
return;
|
|
283
|
+
const y0 = a.getBoundingClientRect().bottom - rr.top + 4;
|
|
284
|
+
const y1 = b.getBoundingClientRect().top - rr.top - 4;
|
|
285
|
+
pk.style.top = y0 + 'px';
|
|
286
|
+
pk.style.height = Math.max(0, y1 - y0) + 'px';
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
startCounter() {
|
|
290
|
+
const shouldCount = this.seconds === undefined && !this.isPaused && !this.finished && !this.reduced.reduce();
|
|
291
|
+
if (shouldCount && !this.tick) {
|
|
292
|
+
this.tick = setInterval(() => (this.counted += 1), 1000);
|
|
293
|
+
}
|
|
294
|
+
else if (!shouldCount && this.tick) {
|
|
295
|
+
clearInterval(this.tick);
|
|
296
|
+
this.tick = undefined;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
ngOnDestroy() {
|
|
300
|
+
if (this.tick)
|
|
301
|
+
clearInterval(this.tick);
|
|
302
|
+
if (this.keptTimer)
|
|
303
|
+
clearTimeout(this.keptTimer);
|
|
304
|
+
if (this.drawTimer)
|
|
305
|
+
clearTimeout(this.drawTimer);
|
|
306
|
+
if (this.pingTimer)
|
|
307
|
+
clearTimeout(this.pingTimer);
|
|
308
|
+
if (this.handRaf)
|
|
309
|
+
cancelAnimationFrame(this.handRaf);
|
|
310
|
+
if (this.openFrame)
|
|
311
|
+
cancelAnimationFrame(this.openFrame);
|
|
312
|
+
this.ro?.disconnect();
|
|
313
|
+
}
|
|
314
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgentLanesComponent, deps: [{ token: i1.ReducedMotionService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
315
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AgentLanesComponent, isStandalone: true, selector: "vo-agent-lanes", inputs: { lanes: "lanes", title: "title", seconds: "seconds", paused: "paused", defaultPaused: "defaultPaused", pauseWired: "pauseWired", handoff: "handoff", expanded: "expanded", defaultExpanded: "defaultExpanded", bare: "bare" }, outputs: { pausedChange: "pausedChange", expandedChange: "expandedChange" }, viewQueries: [{ propertyName: "rowsRef", first: true, predicate: ["rows"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
316
|
+
<div
|
|
317
|
+
data-vo=""
|
|
318
|
+
class="vo-aln"
|
|
319
|
+
[class.vo-panel]="!bare"
|
|
320
|
+
[class.vo-fin]="finished"
|
|
321
|
+
[style.padding-inline]="bare ? '0' : null"
|
|
322
|
+
>
|
|
323
|
+
<div class="vo-aln-h">
|
|
324
|
+
<span class="vo-aln-ic">
|
|
325
|
+
@if (finished) {
|
|
326
|
+
<span class="vo-enter" style="display:grid"><vo-icon name="ok"></vo-icon></span>
|
|
327
|
+
} @else {
|
|
328
|
+
<vo-icon name="users"></vo-icon>
|
|
329
|
+
}
|
|
330
|
+
</span>
|
|
331
|
+
<span class="vo-sw vo-aln-t">{{ head }}</span>
|
|
332
|
+
<span class="vo-aln-m vo-muted vo-num">{{ clockText }}</span>
|
|
333
|
+
<span class="vo-sw vo-aln-ct vo-num">{{ stepsDone }} of {{ total }} steps</span>
|
|
334
|
+
@if (pauseWired && !finished) {
|
|
335
|
+
<button type="button" class="vo-pill vo-soft vo-sm" (click)="togglePaused()">
|
|
336
|
+
<vo-icon [name]="isPaused ? 'play' : 'pause'" size="xs"></vo-icon>
|
|
337
|
+
{{ isPaused ? 'Resume' : 'Pause all' }}
|
|
338
|
+
</button>
|
|
339
|
+
}
|
|
340
|
+
</div>
|
|
341
|
+
|
|
342
|
+
<div class="vo-aln-rows" #rows>
|
|
343
|
+
@for (v of views; track v.lane.key) {
|
|
344
|
+
@if (handFor(v.lane.key); as h) {
|
|
345
|
+
<div
|
|
346
|
+
class="vo-fold vo-aln-hf"
|
|
347
|
+
[class.vo-shut]="!(h.open && !h.leaving)"
|
|
348
|
+
[class.vo-lit]="h.lit"
|
|
349
|
+
[attr.inert]="h.open && !h.leaving ? null : ''"
|
|
350
|
+
[attr.aria-hidden]="h.open && !h.leaving ? null : 'true'"
|
|
351
|
+
[style.--vo-from]="'var(--vo-' + h.fromTone + ')'"
|
|
352
|
+
[style.--vo-to]="'var(--vo-' + h.toTone + ')'"
|
|
353
|
+
>
|
|
354
|
+
<div>
|
|
355
|
+
<div class="vo-aln-hand vo-enter">
|
|
356
|
+
<b class="vo-f">{{ h.fromName }}</b> handed {{ h.what }} to <b class="vo-t">{{ h.toName }}</b>
|
|
357
|
+
</div>
|
|
358
|
+
</div>
|
|
359
|
+
</div>
|
|
360
|
+
}
|
|
361
|
+
<div
|
|
362
|
+
class="vo-aln-lane"
|
|
363
|
+
[class.vo-sent]="v.sent"
|
|
364
|
+
[class.vo-got]="v.got"
|
|
365
|
+
[attr.data-s]="v.status"
|
|
366
|
+
[attr.data-lane]="v.lane.key"
|
|
367
|
+
[style.--vo-c]="'var(--vo-' + v.tone + ')'"
|
|
368
|
+
[style.--vo-cb]="'var(--vo-' + v.tone + '-bg)'"
|
|
369
|
+
[style.--vo-cm]="'var(--vo-aln-' + v.tone + ',var(--vo-' + v.tone + '))'"
|
|
370
|
+
>
|
|
371
|
+
<button
|
|
372
|
+
type="button"
|
|
373
|
+
class="vo-aln-row"
|
|
374
|
+
[attr.aria-expanded]="v.open"
|
|
375
|
+
(click)="toggleLane(v.lane.key)"
|
|
376
|
+
>
|
|
377
|
+
<span class="vo-aln-av" [class.vo-ping]="v.ping">
|
|
378
|
+
<vo-icon [name]="v.lane.icon"></vo-icon>
|
|
379
|
+
</span>
|
|
380
|
+
<span class="vo-aln-who">
|
|
381
|
+
<span class="vo-aln-n">{{ v.lane.name }}</span>
|
|
382
|
+
<span class="vo-sw vo-aln-a" [class.vo-live]="v.live" [class.vo-shim]="v.status === 'working'">{{ v.lane.activity }}</span>
|
|
383
|
+
</span>
|
|
384
|
+
<span class="vo-aln-tr" aria-hidden="true">
|
|
385
|
+
@for (b of v.bars; track $index) {
|
|
386
|
+
<i
|
|
387
|
+
[class.vo-on]="b.on"
|
|
388
|
+
[class.vo-run]="b.run"
|
|
389
|
+
[class.vo-ind]="b.ind"
|
|
390
|
+
[style.--vo-p]="b.progress ?? null"
|
|
391
|
+
></i>
|
|
392
|
+
}
|
|
393
|
+
</span>
|
|
394
|
+
<span class="vo-aln-st">
|
|
395
|
+
@switch (v.status) {
|
|
396
|
+
@case ('working') {
|
|
397
|
+
<span class="vo-tag vo-aln-tg"><span class="vo-spin" aria-hidden="true"></span>Working</span>
|
|
398
|
+
}
|
|
399
|
+
@case ('paused') {
|
|
400
|
+
<span class="vo-tag vo-warn">Paused</span>
|
|
401
|
+
}
|
|
402
|
+
@case ('done') {
|
|
403
|
+
<span class="vo-tag vo-ok"><vo-icon name="check" size="xs"></vo-icon>Done</span>
|
|
404
|
+
}
|
|
405
|
+
@case ('waiting') {
|
|
406
|
+
<span class="vo-tag"><vo-icon name="clock" size="xs"></vo-icon>Waiting</span>
|
|
407
|
+
}
|
|
408
|
+
@default {
|
|
409
|
+
<span class="vo-tag">Queued</span>
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
</span>
|
|
413
|
+
</button>
|
|
414
|
+
<div class="vo-fold" [class.vo-shut]="!v.open" [attr.inert]="v.open ? null : ''">
|
|
415
|
+
<div>
|
|
416
|
+
<div class="vo-aln-det">
|
|
417
|
+
@for (l of v.lane.log ?? []; track $index) {
|
|
418
|
+
<div class="vo-enter">
|
|
419
|
+
<span>{{ l.text }}</span>
|
|
420
|
+
@if (l.time) {
|
|
421
|
+
<span class="vo-muted">{{ l.time }}</span>
|
|
422
|
+
}
|
|
423
|
+
</div>
|
|
424
|
+
}
|
|
425
|
+
</div>
|
|
426
|
+
</div>
|
|
427
|
+
</div>
|
|
428
|
+
</div>
|
|
429
|
+
}
|
|
430
|
+
@for (s of strokes; track s.key) {
|
|
431
|
+
<span
|
|
432
|
+
class="vo-aln-pk"
|
|
433
|
+
[attr.data-k]="s.key"
|
|
434
|
+
aria-hidden="true"
|
|
435
|
+
[style.--vo-from]="'var(--vo-aln-' + s.fromTone + ',var(--vo-' + s.fromTone + '))'"
|
|
436
|
+
[style.--vo-to]="'var(--vo-aln-' + s.toTone + ',var(--vo-' + s.toTone + '))'"
|
|
437
|
+
></span>
|
|
438
|
+
}
|
|
439
|
+
</div>
|
|
440
|
+
</div>
|
|
441
|
+
`, isInline: true, styles: [".vo-aln{padding:var(--vo-s-2)}.vo-aln{--vo-aln-pb:#2a7bff;--vo-aln-pm:#1fa66a;--vo-aln-pl:#7a5af5}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-aln{--vo-aln-pb:var(--vo-pb);--vo-aln-pm:var(--vo-pm);--vo-aln-pl:var(--vo-pl)}}:root[data-theme=dark] .vo-aln{--vo-aln-pb:var(--vo-pb);--vo-aln-pm:var(--vo-pm);--vo-aln-pl:var(--vo-pl)}.vo-stage-in:has(>.vo-aln){display:flex;flex-direction:column;justify-content:center}.vo-aln-h{display:flex;align-items:center;gap:10px;padding:var(--vo-s-2) 10px 10px}.vo-aln-ic{color:var(--vo-fg2);display:grid;transition:color .3s}.vo-aln.vo-fin .vo-aln-ic{color:var(--vo-ok)}.vo-aln-t{font-weight:500}.vo-aln-m{font-size:12.5px}.vo-aln-ct{font-size:12.5px;color:var(--vo-muted);margin-right:auto;white-space:nowrap}.vo-aln-ct:before{content:\"\\b7\";margin-right:6px}.vo-aln-rows{position:relative}.vo-aln-rows>*{position:relative}.vo-aln-lane{border-radius:calc(14px * var(--vo-rk));transition:background .3s}@media (hover:hover) and (pointer:fine){.vo-aln-lane:hover{background:var(--vo-row)}}.vo-aln-lane[data-s=working]{background:linear-gradient(90deg,color-mix(in srgb,var(--vo-c) 8%,transparent),transparent 72%)}@media (hover:hover) and (pointer:fine){.vo-aln-lane[data-s=working]:hover{background:linear-gradient(90deg,color-mix(in srgb,var(--vo-c) 8%,transparent),transparent 72%),var(--vo-row)}}.vo-aln-rows>*:before{content:\"\";position:absolute;left:26px;width:2px;top:0;bottom:0;background:var(--vo-line);pointer-events:none}.vo-aln-lane:before{top:48px}.vo-aln-lane:last-child:before{display:none}.vo-aln-lane:after{content:\"\";position:absolute;left:26px;width:2px;top:0;height:6px;background:var(--vo-line);pointer-events:none}.vo-aln-lane:first-child:after{display:none}.vo-aln-rows>.vo-aln-lane.vo-sent:before,.vo-aln-rows>.vo-aln-lane.vo-got:after,.vo-aln-rows>.vo-aln-hf.vo-lit:before{background:transparent}.vo-aln-row{display:grid;grid-template-columns:34px minmax(0,1.2fr) minmax(0,1fr) auto;align-items:center;gap:var(--vo-s-3);width:100%;padding:10px;text-align:left}.vo-aln-av{position:relative;width:34px;height:34px;border-radius:calc(11px * var(--vo-rk));display:grid;place-items:center;color:var(--vo-c);background:var(--vo-cb);transition:color .4s,background .4s}.vo-aln-av:before{content:\"\";position:absolute;inset:0;border-radius:inherit;pointer-events:none}.vo-aln-lane[data-s=working] .vo-aln-av{animation:vo-alnbreathe 2.4s var(--vo-ease-io) infinite}@keyframes vo-alnbreathe{0%,to{box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-c) 22%,transparent),0 0 0 1px color-mix(in srgb,var(--vo-fg) 0%,transparent)}50%{box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-c) 22%,transparent),0 0 0 5px color-mix(in srgb,var(--vo-fg) 6%,transparent)}}.vo-aln-av.vo-ping:before{animation:vo-alnping .9s var(--vo-ease)}@keyframes vo-alnping{0%{box-shadow:0 0 color-mix(in srgb,var(--vo-fg) 20%,transparent)}to{box-shadow:0 0 0 12px color-mix(in srgb,var(--vo-fg) 0%,transparent)}}.vo-aln-lane[data-s=working] .vo-aln-av,.vo-aln-lane[data-s=working] .vo-aln-tg{background:var(--vo-surface);box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-c) 22%,transparent)}.vo-aln-lane[data-s=done] .vo-aln-av{background:var(--vo-cm);color:var(--vo-surface)}.vo-aln-who{min-width:0}.vo-aln-n{display:block;font-weight:500;font-size:13.5px}.vo-aln-a{display:block;font-size:12.5px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-aln-a.vo-live{color:var(--vo-fg2)}.vo-aln-tr{display:flex;gap:3px}.vo-aln-tr i{flex:1;height:10px;border-radius:5px;background:color-mix(in srgb,var(--vo-cm) 13%,var(--vo-line));position:relative;overflow:hidden}.vo-aln-tr i:after{content:\"\";position:absolute;inset:0;border-radius:inherit;background:var(--vo-cm);transform:scaleX(var(--vo-p,0));transform-origin:left;transition:transform .25s linear}.vo-aln-tr i.vo-on:after{transform:scaleX(1);transition:transform .5s var(--vo-ease)}.vo-aln-tr i.vo-run:after{background:linear-gradient(90deg,var(--vo-cm) 0 30%,color-mix(in srgb,var(--vo-cm) 30%,var(--vo-surface)) 50%,var(--vo-cm) 70% 100%) 0 0/250% 100%;animation:vo-alnsheen 1.6s linear infinite}.vo-aln-tr i.vo-run.vo-ind:after{transform:scaleX(.6);transition:transform 2.4s var(--vo-ease)}@keyframes vo-alnsheen{0%{background-position:100% 0}to{background-position:-150% 0}}.vo-aln-st{min-width:92px;display:flex;justify-content:flex-end}.vo-aln-tg{background:var(--vo-cb);color:var(--vo-c)}.vo-aln-tg .vo-spin{width:9px;height:9px}.vo-aln-det{padding:0 10px 10px 56px;font-size:12.5px;color:var(--vo-fg2)}.vo-aln-det div{display:flex;align-items:center;gap:var(--vo-s-2);padding:3px 0}.vo-aln-det div:before{content:\"\";width:5px;height:5px;border-radius:50%;background:var(--vo-c);flex:none}.vo-aln-det .vo-muted{margin-left:auto}.vo-aln-hf{transition-duration:var(--vo-t-slow)}.vo-aln-hand{padding:6px 10px 6px 56px;font-size:12.5px;line-height:18px;color:var(--vo-fg2)}.vo-aln-hand b{font-weight:500}.vo-aln-hand .vo-f{color:var(--vo-from)}.vo-aln-hand .vo-t{color:var(--vo-to)}.vo-aln-rows>.vo-aln-pk:before{display:none}.vo-aln-pk{position:absolute;left:26px;top:0;width:2px;background:linear-gradient(var(--vo-from),var(--vo-to));transform-origin:50% 0;pointer-events:none;z-index:2}@media (max-width:600px){.vo-aln-row{grid-template-columns:34px minmax(0,1fr) auto;row-gap:var(--vo-s-2)}.vo-aln-tr{grid-column:2 / -1;grid-row:2}.vo-aln-lane:before{top:48px}.vo-aln-ct{display:none}.vo-aln-m{margin-right:auto}}@media (max-width:400px){.vo-aln-ic{display:none}}:root:not([data-style=soft]) .vo-aln-rows>*:not(:where([data-style=soft],[data-style=soft] *)):before,:root:not([data-style=soft]) .vo-aln-lane:not(:where([data-style=soft],[data-style=soft] *)):after{width:1px;left:26.5px;background:repeating-linear-gradient(var(--vo-rail) 0 3px,transparent 3px 6px)}:root:not([data-style=soft]) .vo-aln-rows>.vo-aln-lane.vo-sent:not(:where([data-style=soft],[data-style=soft] *)):before,:root:not([data-style=soft]) .vo-aln-rows>.vo-aln-lane.vo-got:not(:where([data-style=soft],[data-style=soft] *)):after,:root:not([data-style=soft]) .vo-aln-rows>.vo-aln-hf.vo-lit:not(:where([data-style=soft],[data-style=soft] *)):before{background:transparent}:root:not([data-style=soft]) .vo-aln-lane[data-s=working] :is(.vo-aln-av,.vo-aln-tg):not(:where([data-style=soft],[data-style=soft] *)){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-c) 45%,transparent)}:root:not([data-style=soft]) .vo-aln-av:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-c) 35%,transparent)}:root:not([data-style=soft]) .vo-aln-lane[data-s=working] .vo-aln-av:not(:where([data-style=soft],[data-style=soft] *)){animation:vo-alnbp 1.1s steps(1,end) infinite}@keyframes vo-alnbp{0%,55%{box-shadow:inset 0 0 0 1px var(--vo-c)}56%,to{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-c) 35%,transparent)}}:root:not([data-style=soft]) .vo-aln-lane[data-s=working]:not(:where([data-style=soft],[data-style=soft] *)){background:color-mix(in srgb,var(--vo-c) 5%,transparent)}:root:not([data-style=soft]) .vo-aln-tr i:not(:where([data-style=soft],[data-style=soft] *)){height:8px}:root:not([data-style=soft]) .vo-aln-tr i.vo-run:not(:where([data-style=soft],[data-style=soft] *)):after{background:repeating-linear-gradient(135deg,var(--vo-cm) 0 4px,color-mix(in srgb,var(--vo-cm) 55%,var(--vo-surface)) 4px 7px);animation:none}:root:not([data-style=soft]) .vo-aln-pk:not(:where([data-style=soft],[data-style=soft] *)){width:1px;left:26.5px;border-radius:0;background:var(--vo-to)}:root:not([data-style=soft]) .vo-aln-av.vo-ping:not(:where([data-style=soft],[data-style=soft] *)):before{animation:vo-alnpingbp .6s steps(3,end)}@keyframes vo-alnpingbp{0%{box-shadow:0 0 0 1px var(--vo-c)}to{box-shadow:0 0 0 7px transparent}}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-muted{color:var(--vo-muted)}.vo-num{font-variant-numeric:tabular-nums}.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-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-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-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-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-tag{display:inline-flex;align-items:center;gap:5px;height:20px;padding:0 7px;border-radius:var(--vo-r-tag);font-size:11.5px;font-weight:500;white-space:nowrap;background:var(--vo-chip);color:var(--vo-fg2)}.vo-tag.vo-ok{background:var(--vo-ok-bg);color:var(--vo-ok)}.vo-tag.vo-warn{background:var(--vo-warn-bg);color:var(--vo-warn)}.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-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-pill.vo-soft{background:var(--vo-soft);color:var(--vo-fg);box-shadow:var(--vo-soft-ring)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-soft:hover{background:var(--vo-soft-h)}}@media (prefers-reduced-motion:reduce){.vo-shim{color:var(--vo-fg);background:none}.vo-enter{animation:none}.vo-aln-lane[data-s=working] .vo-aln-av,.vo-aln-av.vo-ping:before,.vo-aln-tr i.vo-run:after,.vo-spin{animation-duration:.01ms!important;animation-iteration-count:1!important}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
442
|
+
}
|
|
443
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgentLanesComponent, decorators: [{
|
|
444
|
+
type: Component,
|
|
445
|
+
args: [{ selector: 'vo-agent-lanes', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
|
|
446
|
+
<div
|
|
447
|
+
data-vo=""
|
|
448
|
+
class="vo-aln"
|
|
449
|
+
[class.vo-panel]="!bare"
|
|
450
|
+
[class.vo-fin]="finished"
|
|
451
|
+
[style.padding-inline]="bare ? '0' : null"
|
|
452
|
+
>
|
|
453
|
+
<div class="vo-aln-h">
|
|
454
|
+
<span class="vo-aln-ic">
|
|
455
|
+
@if (finished) {
|
|
456
|
+
<span class="vo-enter" style="display:grid"><vo-icon name="ok"></vo-icon></span>
|
|
457
|
+
} @else {
|
|
458
|
+
<vo-icon name="users"></vo-icon>
|
|
459
|
+
}
|
|
460
|
+
</span>
|
|
461
|
+
<span class="vo-sw vo-aln-t">{{ head }}</span>
|
|
462
|
+
<span class="vo-aln-m vo-muted vo-num">{{ clockText }}</span>
|
|
463
|
+
<span class="vo-sw vo-aln-ct vo-num">{{ stepsDone }} of {{ total }} steps</span>
|
|
464
|
+
@if (pauseWired && !finished) {
|
|
465
|
+
<button type="button" class="vo-pill vo-soft vo-sm" (click)="togglePaused()">
|
|
466
|
+
<vo-icon [name]="isPaused ? 'play' : 'pause'" size="xs"></vo-icon>
|
|
467
|
+
{{ isPaused ? 'Resume' : 'Pause all' }}
|
|
468
|
+
</button>
|
|
469
|
+
}
|
|
470
|
+
</div>
|
|
471
|
+
|
|
472
|
+
<div class="vo-aln-rows" #rows>
|
|
473
|
+
@for (v of views; track v.lane.key) {
|
|
474
|
+
@if (handFor(v.lane.key); as h) {
|
|
475
|
+
<div
|
|
476
|
+
class="vo-fold vo-aln-hf"
|
|
477
|
+
[class.vo-shut]="!(h.open && !h.leaving)"
|
|
478
|
+
[class.vo-lit]="h.lit"
|
|
479
|
+
[attr.inert]="h.open && !h.leaving ? null : ''"
|
|
480
|
+
[attr.aria-hidden]="h.open && !h.leaving ? null : 'true'"
|
|
481
|
+
[style.--vo-from]="'var(--vo-' + h.fromTone + ')'"
|
|
482
|
+
[style.--vo-to]="'var(--vo-' + h.toTone + ')'"
|
|
483
|
+
>
|
|
484
|
+
<div>
|
|
485
|
+
<div class="vo-aln-hand vo-enter">
|
|
486
|
+
<b class="vo-f">{{ h.fromName }}</b> handed {{ h.what }} to <b class="vo-t">{{ h.toName }}</b>
|
|
487
|
+
</div>
|
|
488
|
+
</div>
|
|
489
|
+
</div>
|
|
490
|
+
}
|
|
491
|
+
<div
|
|
492
|
+
class="vo-aln-lane"
|
|
493
|
+
[class.vo-sent]="v.sent"
|
|
494
|
+
[class.vo-got]="v.got"
|
|
495
|
+
[attr.data-s]="v.status"
|
|
496
|
+
[attr.data-lane]="v.lane.key"
|
|
497
|
+
[style.--vo-c]="'var(--vo-' + v.tone + ')'"
|
|
498
|
+
[style.--vo-cb]="'var(--vo-' + v.tone + '-bg)'"
|
|
499
|
+
[style.--vo-cm]="'var(--vo-aln-' + v.tone + ',var(--vo-' + v.tone + '))'"
|
|
500
|
+
>
|
|
501
|
+
<button
|
|
502
|
+
type="button"
|
|
503
|
+
class="vo-aln-row"
|
|
504
|
+
[attr.aria-expanded]="v.open"
|
|
505
|
+
(click)="toggleLane(v.lane.key)"
|
|
506
|
+
>
|
|
507
|
+
<span class="vo-aln-av" [class.vo-ping]="v.ping">
|
|
508
|
+
<vo-icon [name]="v.lane.icon"></vo-icon>
|
|
509
|
+
</span>
|
|
510
|
+
<span class="vo-aln-who">
|
|
511
|
+
<span class="vo-aln-n">{{ v.lane.name }}</span>
|
|
512
|
+
<span class="vo-sw vo-aln-a" [class.vo-live]="v.live" [class.vo-shim]="v.status === 'working'">{{ v.lane.activity }}</span>
|
|
513
|
+
</span>
|
|
514
|
+
<span class="vo-aln-tr" aria-hidden="true">
|
|
515
|
+
@for (b of v.bars; track $index) {
|
|
516
|
+
<i
|
|
517
|
+
[class.vo-on]="b.on"
|
|
518
|
+
[class.vo-run]="b.run"
|
|
519
|
+
[class.vo-ind]="b.ind"
|
|
520
|
+
[style.--vo-p]="b.progress ?? null"
|
|
521
|
+
></i>
|
|
522
|
+
}
|
|
523
|
+
</span>
|
|
524
|
+
<span class="vo-aln-st">
|
|
525
|
+
@switch (v.status) {
|
|
526
|
+
@case ('working') {
|
|
527
|
+
<span class="vo-tag vo-aln-tg"><span class="vo-spin" aria-hidden="true"></span>Working</span>
|
|
528
|
+
}
|
|
529
|
+
@case ('paused') {
|
|
530
|
+
<span class="vo-tag vo-warn">Paused</span>
|
|
531
|
+
}
|
|
532
|
+
@case ('done') {
|
|
533
|
+
<span class="vo-tag vo-ok"><vo-icon name="check" size="xs"></vo-icon>Done</span>
|
|
534
|
+
}
|
|
535
|
+
@case ('waiting') {
|
|
536
|
+
<span class="vo-tag"><vo-icon name="clock" size="xs"></vo-icon>Waiting</span>
|
|
537
|
+
}
|
|
538
|
+
@default {
|
|
539
|
+
<span class="vo-tag">Queued</span>
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
</span>
|
|
543
|
+
</button>
|
|
544
|
+
<div class="vo-fold" [class.vo-shut]="!v.open" [attr.inert]="v.open ? null : ''">
|
|
545
|
+
<div>
|
|
546
|
+
<div class="vo-aln-det">
|
|
547
|
+
@for (l of v.lane.log ?? []; track $index) {
|
|
548
|
+
<div class="vo-enter">
|
|
549
|
+
<span>{{ l.text }}</span>
|
|
550
|
+
@if (l.time) {
|
|
551
|
+
<span class="vo-muted">{{ l.time }}</span>
|
|
552
|
+
}
|
|
553
|
+
</div>
|
|
554
|
+
}
|
|
555
|
+
</div>
|
|
556
|
+
</div>
|
|
557
|
+
</div>
|
|
558
|
+
</div>
|
|
559
|
+
}
|
|
560
|
+
@for (s of strokes; track s.key) {
|
|
561
|
+
<span
|
|
562
|
+
class="vo-aln-pk"
|
|
563
|
+
[attr.data-k]="s.key"
|
|
564
|
+
aria-hidden="true"
|
|
565
|
+
[style.--vo-from]="'var(--vo-aln-' + s.fromTone + ',var(--vo-' + s.fromTone + '))'"
|
|
566
|
+
[style.--vo-to]="'var(--vo-aln-' + s.toTone + ',var(--vo-' + s.toTone + '))'"
|
|
567
|
+
></span>
|
|
568
|
+
}
|
|
569
|
+
</div>
|
|
570
|
+
</div>
|
|
571
|
+
`, styles: [".vo-aln{padding:var(--vo-s-2)}.vo-aln{--vo-aln-pb:#2a7bff;--vo-aln-pm:#1fa66a;--vo-aln-pl:#7a5af5}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-aln{--vo-aln-pb:var(--vo-pb);--vo-aln-pm:var(--vo-pm);--vo-aln-pl:var(--vo-pl)}}:root[data-theme=dark] .vo-aln{--vo-aln-pb:var(--vo-pb);--vo-aln-pm:var(--vo-pm);--vo-aln-pl:var(--vo-pl)}.vo-stage-in:has(>.vo-aln){display:flex;flex-direction:column;justify-content:center}.vo-aln-h{display:flex;align-items:center;gap:10px;padding:var(--vo-s-2) 10px 10px}.vo-aln-ic{color:var(--vo-fg2);display:grid;transition:color .3s}.vo-aln.vo-fin .vo-aln-ic{color:var(--vo-ok)}.vo-aln-t{font-weight:500}.vo-aln-m{font-size:12.5px}.vo-aln-ct{font-size:12.5px;color:var(--vo-muted);margin-right:auto;white-space:nowrap}.vo-aln-ct:before{content:\"\\b7\";margin-right:6px}.vo-aln-rows{position:relative}.vo-aln-rows>*{position:relative}.vo-aln-lane{border-radius:calc(14px * var(--vo-rk));transition:background .3s}@media (hover:hover) and (pointer:fine){.vo-aln-lane:hover{background:var(--vo-row)}}.vo-aln-lane[data-s=working]{background:linear-gradient(90deg,color-mix(in srgb,var(--vo-c) 8%,transparent),transparent 72%)}@media (hover:hover) and (pointer:fine){.vo-aln-lane[data-s=working]:hover{background:linear-gradient(90deg,color-mix(in srgb,var(--vo-c) 8%,transparent),transparent 72%),var(--vo-row)}}.vo-aln-rows>*:before{content:\"\";position:absolute;left:26px;width:2px;top:0;bottom:0;background:var(--vo-line);pointer-events:none}.vo-aln-lane:before{top:48px}.vo-aln-lane:last-child:before{display:none}.vo-aln-lane:after{content:\"\";position:absolute;left:26px;width:2px;top:0;height:6px;background:var(--vo-line);pointer-events:none}.vo-aln-lane:first-child:after{display:none}.vo-aln-rows>.vo-aln-lane.vo-sent:before,.vo-aln-rows>.vo-aln-lane.vo-got:after,.vo-aln-rows>.vo-aln-hf.vo-lit:before{background:transparent}.vo-aln-row{display:grid;grid-template-columns:34px minmax(0,1.2fr) minmax(0,1fr) auto;align-items:center;gap:var(--vo-s-3);width:100%;padding:10px;text-align:left}.vo-aln-av{position:relative;width:34px;height:34px;border-radius:calc(11px * var(--vo-rk));display:grid;place-items:center;color:var(--vo-c);background:var(--vo-cb);transition:color .4s,background .4s}.vo-aln-av:before{content:\"\";position:absolute;inset:0;border-radius:inherit;pointer-events:none}.vo-aln-lane[data-s=working] .vo-aln-av{animation:vo-alnbreathe 2.4s var(--vo-ease-io) infinite}@keyframes vo-alnbreathe{0%,to{box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-c) 22%,transparent),0 0 0 1px color-mix(in srgb,var(--vo-fg) 0%,transparent)}50%{box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-c) 22%,transparent),0 0 0 5px color-mix(in srgb,var(--vo-fg) 6%,transparent)}}.vo-aln-av.vo-ping:before{animation:vo-alnping .9s var(--vo-ease)}@keyframes vo-alnping{0%{box-shadow:0 0 color-mix(in srgb,var(--vo-fg) 20%,transparent)}to{box-shadow:0 0 0 12px color-mix(in srgb,var(--vo-fg) 0%,transparent)}}.vo-aln-lane[data-s=working] .vo-aln-av,.vo-aln-lane[data-s=working] .vo-aln-tg{background:var(--vo-surface);box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-c) 22%,transparent)}.vo-aln-lane[data-s=done] .vo-aln-av{background:var(--vo-cm);color:var(--vo-surface)}.vo-aln-who{min-width:0}.vo-aln-n{display:block;font-weight:500;font-size:13.5px}.vo-aln-a{display:block;font-size:12.5px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-aln-a.vo-live{color:var(--vo-fg2)}.vo-aln-tr{display:flex;gap:3px}.vo-aln-tr i{flex:1;height:10px;border-radius:5px;background:color-mix(in srgb,var(--vo-cm) 13%,var(--vo-line));position:relative;overflow:hidden}.vo-aln-tr i:after{content:\"\";position:absolute;inset:0;border-radius:inherit;background:var(--vo-cm);transform:scaleX(var(--vo-p,0));transform-origin:left;transition:transform .25s linear}.vo-aln-tr i.vo-on:after{transform:scaleX(1);transition:transform .5s var(--vo-ease)}.vo-aln-tr i.vo-run:after{background:linear-gradient(90deg,var(--vo-cm) 0 30%,color-mix(in srgb,var(--vo-cm) 30%,var(--vo-surface)) 50%,var(--vo-cm) 70% 100%) 0 0/250% 100%;animation:vo-alnsheen 1.6s linear infinite}.vo-aln-tr i.vo-run.vo-ind:after{transform:scaleX(.6);transition:transform 2.4s var(--vo-ease)}@keyframes vo-alnsheen{0%{background-position:100% 0}to{background-position:-150% 0}}.vo-aln-st{min-width:92px;display:flex;justify-content:flex-end}.vo-aln-tg{background:var(--vo-cb);color:var(--vo-c)}.vo-aln-tg .vo-spin{width:9px;height:9px}.vo-aln-det{padding:0 10px 10px 56px;font-size:12.5px;color:var(--vo-fg2)}.vo-aln-det div{display:flex;align-items:center;gap:var(--vo-s-2);padding:3px 0}.vo-aln-det div:before{content:\"\";width:5px;height:5px;border-radius:50%;background:var(--vo-c);flex:none}.vo-aln-det .vo-muted{margin-left:auto}.vo-aln-hf{transition-duration:var(--vo-t-slow)}.vo-aln-hand{padding:6px 10px 6px 56px;font-size:12.5px;line-height:18px;color:var(--vo-fg2)}.vo-aln-hand b{font-weight:500}.vo-aln-hand .vo-f{color:var(--vo-from)}.vo-aln-hand .vo-t{color:var(--vo-to)}.vo-aln-rows>.vo-aln-pk:before{display:none}.vo-aln-pk{position:absolute;left:26px;top:0;width:2px;background:linear-gradient(var(--vo-from),var(--vo-to));transform-origin:50% 0;pointer-events:none;z-index:2}@media (max-width:600px){.vo-aln-row{grid-template-columns:34px minmax(0,1fr) auto;row-gap:var(--vo-s-2)}.vo-aln-tr{grid-column:2 / -1;grid-row:2}.vo-aln-lane:before{top:48px}.vo-aln-ct{display:none}.vo-aln-m{margin-right:auto}}@media (max-width:400px){.vo-aln-ic{display:none}}:root:not([data-style=soft]) .vo-aln-rows>*:not(:where([data-style=soft],[data-style=soft] *)):before,:root:not([data-style=soft]) .vo-aln-lane:not(:where([data-style=soft],[data-style=soft] *)):after{width:1px;left:26.5px;background:repeating-linear-gradient(var(--vo-rail) 0 3px,transparent 3px 6px)}:root:not([data-style=soft]) .vo-aln-rows>.vo-aln-lane.vo-sent:not(:where([data-style=soft],[data-style=soft] *)):before,:root:not([data-style=soft]) .vo-aln-rows>.vo-aln-lane.vo-got:not(:where([data-style=soft],[data-style=soft] *)):after,:root:not([data-style=soft]) .vo-aln-rows>.vo-aln-hf.vo-lit:not(:where([data-style=soft],[data-style=soft] *)):before{background:transparent}:root:not([data-style=soft]) .vo-aln-lane[data-s=working] :is(.vo-aln-av,.vo-aln-tg):not(:where([data-style=soft],[data-style=soft] *)){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-c) 45%,transparent)}:root:not([data-style=soft]) .vo-aln-av:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-c) 35%,transparent)}:root:not([data-style=soft]) .vo-aln-lane[data-s=working] .vo-aln-av:not(:where([data-style=soft],[data-style=soft] *)){animation:vo-alnbp 1.1s steps(1,end) infinite}@keyframes vo-alnbp{0%,55%{box-shadow:inset 0 0 0 1px var(--vo-c)}56%,to{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-c) 35%,transparent)}}:root:not([data-style=soft]) .vo-aln-lane[data-s=working]:not(:where([data-style=soft],[data-style=soft] *)){background:color-mix(in srgb,var(--vo-c) 5%,transparent)}:root:not([data-style=soft]) .vo-aln-tr i:not(:where([data-style=soft],[data-style=soft] *)){height:8px}:root:not([data-style=soft]) .vo-aln-tr i.vo-run:not(:where([data-style=soft],[data-style=soft] *)):after{background:repeating-linear-gradient(135deg,var(--vo-cm) 0 4px,color-mix(in srgb,var(--vo-cm) 55%,var(--vo-surface)) 4px 7px);animation:none}:root:not([data-style=soft]) .vo-aln-pk:not(:where([data-style=soft],[data-style=soft] *)){width:1px;left:26.5px;border-radius:0;background:var(--vo-to)}:root:not([data-style=soft]) .vo-aln-av.vo-ping:not(:where([data-style=soft],[data-style=soft] *)):before{animation:vo-alnpingbp .6s steps(3,end)}@keyframes vo-alnpingbp{0%{box-shadow:0 0 0 1px var(--vo-c)}to{box-shadow:0 0 0 7px transparent}}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-muted{color:var(--vo-muted)}.vo-num{font-variant-numeric:tabular-nums}.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-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-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-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-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-tag{display:inline-flex;align-items:center;gap:5px;height:20px;padding:0 7px;border-radius:var(--vo-r-tag);font-size:11.5px;font-weight:500;white-space:nowrap;background:var(--vo-chip);color:var(--vo-fg2)}.vo-tag.vo-ok{background:var(--vo-ok-bg);color:var(--vo-ok)}.vo-tag.vo-warn{background:var(--vo-warn-bg);color:var(--vo-warn)}.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-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-pill.vo-soft{background:var(--vo-soft);color:var(--vo-fg);box-shadow:var(--vo-soft-ring)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-soft:hover{background:var(--vo-soft-h)}}@media (prefers-reduced-motion:reduce){.vo-shim{color:var(--vo-fg);background:none}.vo-enter{animation:none}.vo-aln-lane[data-s=working] .vo-aln-av,.vo-aln-av.vo-ping:before,.vo-aln-tr i.vo-run:after,.vo-spin{animation-duration:.01ms!important;animation-iteration-count:1!important}}\n"] }]
|
|
572
|
+
}], ctorParameters: () => [{ type: i1.ReducedMotionService }], propDecorators: { lanes: [{
|
|
573
|
+
type: Input
|
|
574
|
+
}], title: [{
|
|
575
|
+
type: Input
|
|
576
|
+
}], seconds: [{
|
|
577
|
+
type: Input
|
|
578
|
+
}], paused: [{
|
|
579
|
+
type: Input
|
|
580
|
+
}], defaultPaused: [{
|
|
581
|
+
type: Input
|
|
582
|
+
}], pauseWired: [{
|
|
583
|
+
type: Input
|
|
584
|
+
}], handoff: [{
|
|
585
|
+
type: Input
|
|
586
|
+
}], expanded: [{
|
|
587
|
+
type: Input
|
|
588
|
+
}], defaultExpanded: [{
|
|
589
|
+
type: Input
|
|
590
|
+
}], bare: [{
|
|
591
|
+
type: Input
|
|
592
|
+
}], pausedChange: [{
|
|
593
|
+
type: Output
|
|
594
|
+
}], expandedChange: [{
|
|
595
|
+
type: Output
|
|
596
|
+
}], rowsRef: [{
|
|
597
|
+
type: ViewChild,
|
|
598
|
+
args: ['rows']
|
|
599
|
+
}] } });
|
|
600
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtbGFuZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYWdlbnQtbGFuZXMvYWdlbnQtbGFuZXMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YscUVBQXFFO0FBQ3JFLGtGQUFrRjtBQUNsRixnRkFBZ0Y7QUFDaEYsaUZBQWlGO0FBQ2pGLDRFQUE0RTtBQUM1RSwwRUFBMEU7QUFDMUUsMkJBQTJCO0FBQzNCLEVBQUU7QUFDRixrRkFBa0Y7QUFDbEYsbUZBQW1GO0FBQ25GLGlEQUFpRDtBQUVqRCxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBbUIsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBb0QxRSxNQUFNLElBQUksR0FBNkI7SUFDckMsSUFBSSxFQUFFLElBQUk7SUFDVixNQUFNLEVBQUUsSUFBSTtJQUNaLEtBQUssRUFBRSxJQUFJO0lBQ1gsTUFBTSxFQUFFLElBQUk7SUFDWixHQUFHLEVBQUUsSUFBSTtJQUNULE1BQU0sRUFBRSxJQUFJO0lBQ1osSUFBSSxFQUFFLElBQUk7SUFDVixJQUFJLEVBQUUsSUFBSTtDQUNYLENBQUM7QUFDRixNQUFNLEtBQUssR0FBRyxDQUFDLENBQWEsRUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLENBQUM7QUFDakUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFTLEVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFTLEVBQVUsRUFBRSxD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dkIsTUFBTTtnQkFFb0IsT0FBTztzQkFBakMsU0FBUzt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZnJhbWV3b3JrL2FuZ3VsYXIvYWdlbnQtbGFuZXMvYWdlbnQtbGFuZXMuY29tcG9uZW50LnRzXG4vL1xuLy8gTmF0aXZlIEFuZ3VsYXIgcG9ydCBvZiBmcmFtZXdvcmsvcmVhY3QvYWdlbnQtbGFuZXMvQWdlbnRMYW5lcy50c3guXG4vLyBTZXZlcmFsIGFnZW50cyB3b3JraW5nIHNpZGUgYnkgc2lkZSwgZWFjaCBpbiBpdHMgb3duIGxhbmUgYW5kIGh1ZSwgaGFuZGluZyB3b3JrXG4vLyB0byBvbmUgYW5vdGhlciBkb3duIGEgcmVsYXkgbGluZS4gQSB3b3JraW5nIGxhbmUgYnJlYXRoZXMsIHNoaW1tZXJzIGFuZCBmaWxsc1xuLy8gaXRzIG5leHQgc3RlcDsgYSBoYW5kLW9mZiBvcGVucyBhIGxpbmUgYmV0d2VlbiB0d28gbGFuZXMgYW5kIHJ1bnMgYSBsaWdodCBkb3duXG4vLyB0aGUgcmVsYXkgbGluZSBmcm9tIHRoZSBzZW5kZXIncyBiYWRnZSB0byB0aGUgdGFrZXIncywgYW5kIHRoZSBzdHJldGNoIGl0XG4vLyBjcm9zc2VkIHN0YXlzIGxpdC4gSW5wdXRzIG1pcnJvciB0aGUgUmVhY3QgcHJvcHM7IGNhbGxiYWNrIHByb3BzIGJlY29tZVxuLy8gQE91dHB1dCgpIEV2ZW50RW1pdHRlcnMuXG4vL1xuLy8gVGhlIHJlbGF5LWxpbmUgc3Ryb2tlcyBhcmUgcG9zaXRpb25lZCBmcm9tIGJhZGdlIHRvIGJhZGdlIHdpdGggYSBSZXNpemVPYnNlcnZlclxuLy8gKHBvcnRlZCBmcm9tIHRoZSBSZWFjdCB1c2VMYXlvdXRFZmZlY3QgLyB0aGUgdmFuaWxsYSBwbGFjZSgpKS4gUmVkdWNlZCBtb3Rpb24gaXNcbi8vIHJlc3BlY3RlZCB2aWEgdGhlIHNoYXJlZCBSZWR1Y2VkTW90aW9uU2VydmljZS5cblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZvSWNvbkNvbXBvbmVudCwgdHlwZSBWb0ljb25OYW1lIH0gZnJvbSAnLi4vY29yZS9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWR1Y2VkTW90aW9uU2VydmljZSB9IGZyb20gJy4uL2NvcmUvcmVkdWNlZC1tb3Rpb24uc2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIExhbmVTdGF0dXMgPSAncXVldWVkJyB8ICd3YWl0aW5nJyB8ICd3b3JraW5nJyB8ICdwYXVzZWQnIHwgJ2RvbmUnO1xuZXhwb3J0IHR5cGUgTGFuZVRvbmUgPVxuICB8ICdibHVlJ1xuICB8ICdwdXJwbGUnXG4gIHwgJ2dyZWVuJ1xuICB8ICdvcmFuZ2UnXG4gIHwgJ3JlZCdcbiAgfCAneWVsbG93J1xuICB8ICdwaW5rJ1xuICB8ICd0ZWFsJztcblxuLyoqIE9uZSBlbnRyeSBpbiBhIGxhbmUncyBsb2csIHNob3duIHdoZW4gdGhlIGxhbmUgaXMgb3BlbmVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYW5lTG9nIHtcbiAgdGV4dDogc3RyaW5nO1xuICB0aW1lPzogc3RyaW5nO1xufVxuXG4vKiogT25lIGFnZW50J3MgbGFuZTogaXRzIG5hbWUsIGh1ZSwgc3RhdHVzLCB0aGUgc3RlcCB0cmFjayBhbmQgaXRzIGxvZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRMYW5lIHtcbiAga2V5OiBzdHJpbmc7XG4gIC8qKiBMaWtlIFwiUmVzZWFyY2hlclwiLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIGljb246IFZvSWNvbk5hbWU7XG4gIC8qKiBUaGUgbGFuZSdzIGh1ZTogaXRzIGJhZGdlLCBpdHMgdHJhY2ssIGl0cyBXb3JraW5nIHRhZyBhbmQgaXRzIHN0cmV0Y2ggb2YgdGhlIHJlbGF5IGxpbmUuIERlZmF1bHRzIHRvIGJsdWUuICovXG4gIHRvbmU/OiBMYW5lVG9uZTtcbiAgLyoqIHdvcmtpbmcgYnJlYXRoZXMsIHNoaW1tZXJzIGFuZCBmaWxscyB0aGUgbmV4dCBzdGVwLCBwYXVzZWQgaG9sZHMgaXQsIGRvbmUgZmlsbHMgdGhlIGJhZGdlIHdpdGggaXRzIGh1ZS4gKi9cbiAgc3RhdHVzOiBMYW5lU3RhdHVzO1xuICAvKiogV2hhdCB0aGUgYWdlbnQgaXMgZG9pbmcgbm93LCBvciB3aGF0IGl0IGlzIHdhaXRpbmcgZm9yLiBJdCBjcm9zc2ZhZGVzIHdoZW4gaXQgY2hhbmdlcywgYW5kIHNoaW1tZXJzIHdoaWxlIHRoZSBhZ2VudCB3b3Jrcy4gKi9cbiAgYWN0aXZpdHk6IHN0cmluZztcbiAgLyoqIEhvdyBtYW55IHN0ZXBzIHRoZSB0cmFjayBpcyBjdXQgaW50by4gRGVmYXVsdHMgdG8gMy4gKi9cbiAgc3RlcHM/OiBudW1iZXI7XG4gIC8qKiBIb3cgbWFueSBzdGVwcyBhcmUgZmluaXNoZWQuIFRoZSBuZXh0IG9uZSBmaWxscyB3aGlsZSB0aGUgYWdlbnQgd29ya3MuICovXG4gIGRvbmU/OiBudW1iZXI7XG4gIC8qKiBIb3cgZmFyIHRoZSBhZ2VudCBpcyB0aHJvdWdoIHRoZSBzdGVwIGluIGhhbmQsIGZyb20gMCB0byAxLiBMZWF2ZSBpdCBvdXQgYW5kIHRoYXQgc3RlcCBmaWxscyBwYXJ0IHdheS4gKi9cbiAgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gIC8qKiBXaGF0IHRoZSBhZ2VudCBkaWQsIHNob3duIHdoZW4gdGhlIGxhbmUgaXMgb3BlbmVkLiBOZXcgZW50cmllcyBzbGlkZSBpbi4gKi9cbiAgbG9nPzogTGFuZUxvZ1tdO1xufVxuXG4vKiogT25lIGFnZW50IHBhc3Npbmcgd29yayB0byBhbm90aGVyOiBhIGxpZ2h0IHJ1bnMgZG93biB0aGUgcmVsYXkgbGluZSBiZXR3ZWVuIHRoZWlyIGJhZGdlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRIYW5kb2ZmIHtcbiAgLyoqIEtleSBvZiB0aGUgbGFuZSBoYW5kaW5nIG92ZXIuICovXG4gIGZyb206IHN0cmluZztcbiAgLyoqIEtleSBvZiB0aGUgbGFuZSB0YWtpbmcgaXQuICovXG4gIHRvOiBzdHJpbmc7XG4gIC8qKiBXaGF0IGNoYW5nZXMgaGFuZHMsIGxpa2UgXCJ0aGUgYnJpZWZcIi4gKi9cbiAgd2hhdDogc3RyaW5nO1xufVxuXG5jb25zdCBUT05FOiBSZWNvcmQ8TGFuZVRvbmUsIHN0cmluZz4gPSB7XG4gIGJsdWU6ICdwYicsXG4gIHB1cnBsZTogJ3BsJyxcbiAgZ3JlZW46ICdwbScsXG4gIG9yYW5nZTogJ3BwJyxcbiAgcmVkOiAncHInLFxuICB5ZWxsb3c6ICdweScsXG4gIHBpbms6ICdwaycsXG4gIHRlYWw6ICdwdCcsXG59O1xuY29uc3QgaHVlT2YgPSAobD86IEFnZW50TGFuZSk6IHN0cmluZyA9PiBUT05FW2w/LnRvbmUgPz8gJ2JsdWUnXTtcbmNvbnN0IGNsYW1wMDEgPSAobjogbnVtYmVyKTogbnVtYmVyID0+IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG4pKTtcbmNvbnN0IGNsb2NrID0gKHM6IG51bWJlcik6IHN0cmluZyA9PlxuICBgJHtNYXRoLmZsb29yKHMgLyA2MCl9OiR7U3RyaW5nKHMgJSA2MCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuXG4vKiogQSBsYW5lIHByZXBhcmVkIGZvciB0aGUgdGVtcGxhdGUuICovXG5pbnRlcmZhY2UgTGFuZVZpZXcge1xuICBsYW5lOiBBZ2VudExhbmU7XG4gIHN0YXR1czogTGFuZVN0YXR1cztcbiAgdG9uZTogc3RyaW5nO1xuICBsaXZlOiBib29sZWFuO1xuICBzZW50OiBib29sZWFuO1xuICBnb3Q6IGJvb2xlYW47XG4gIHBpbmc6IGJvb2xlYW47XG4gIG9wZW46IGJvb2xlYW47XG4gIGJhcnM6IEJhclZpZXdbXTtcbn1cblxuLyoqIE9uZSBzZWdtZW50IG9mIGEgbGFuZSdzIHN0ZXAgdHJhY2suICovXG5pbnRlcmZhY2UgQmFyVmlldyB7XG4gIG9uOiBib29sZWFuO1xuICBydW46IGJvb2xlYW47XG4gIGluZDogYm9vbGVhbjtcbiAgcHJvZ3Jlc3M/OiBudW1iZXI7XG59XG5cbi8qKiBUaGUgaGFuZC1vZmYgbGluZSBrZXB0IG9uIHNjcmVlbiAod2l0aCBpdHMgZXhpdCBzdGF0ZSB3aGlsZSBpdCBsZWF2ZXMpLiAqL1xuaW50ZXJmYWNlIEhhbmRWaWV3IHtcbiAga2V5OiBzdHJpbmc7XG4gIGZyb206IHN0cmluZztcbiAgdG86IHN0cmluZztcbiAgd2hhdDogc3RyaW5nO1xuICBmcm9tTmFtZTogc3RyaW5nO1xuICB0b05hbWU6IHN0cmluZztcbiAgZnJvbVRvbmU6IHN0cmluZztcbiAgdG9Ub25lOiBzdHJpbmc7XG4gIG9wZW46IGJvb2xlYW47XG4gIGxlYXZpbmc6IGJvb2xlYW47XG4gIGxpdDogYm9vbGVhbjtcbn1cblxuLyoqIEEgbGl0IHN0cmV0Y2ggb2YgdGhlIHJlbGF5IGxpbmUsIGRyYXduIGZyb20gb25lIGJhZGdlIGRvd24gdG8gdGhlIG5leHQuICovXG5pbnRlcmZhY2UgU3Ryb2tlVmlldyB7XG4gIGtleTogc3RyaW5nO1xuICBmcm9tOiBzdHJpbmc7XG4gIHRvOiBzdHJpbmc7XG4gIGZyb21Ub25lOiBzdHJpbmc7XG4gIHRvVG9uZTogc3RyaW5nO1xufVxuXG4vKiogU2V2ZXJhbCBhZ2VudHMgd29ya2luZyBpbiBwYXJhbGxlbCwgZWFjaCBpbiBpdHMgb3duIGxhbmUgYW5kIGh1ZSwgd2l0aCBoYW5kLW9mZnMgZG93biBhIHJlbGF5IGxpbmUuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2by1hZ2VudC1sYW5lcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtWb0ljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdm89XCJcIlxuICAgICAgY2xhc3M9XCJ2by1hbG5cIlxuICAgICAgW2NsYXNzLnZvLXBhbmVsXT1cIiFiYXJlXCJcbiAgICAgIFtjbGFzcy52by1maW5dPVwiZmluaXNoZWRcIlxuICAgICAgW3N0eWxlLnBhZGRpbmctaW5saW5lXT1cImJhcmUgPyAnMCcgOiBudWxsXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwidm8tYWxuLWhcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hbG4taWNcIj5cbiAgICAgICAgICBAaWYgKGZpbmlzaGVkKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWVudGVyXCIgc3R5bGU9XCJkaXNwbGF5OmdyaWRcIj48dm8taWNvbiBuYW1lPVwib2tcIj48L3ZvLWljb24+PC9zcGFuPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHZvLWljb24gbmFtZT1cInVzZXJzXCI+PC92by1pY29uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXN3IHZvLWFsbi10XCI+e3sgaGVhZCB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hbG4tbSB2by1tdXRlZCB2by1udW1cIj57eyBjbG9ja1RleHQgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3cgdm8tYWxuLWN0IHZvLW51bVwiPnt7IHN0ZXBzRG9uZSB9fSBvZiB7eyB0b3RhbCB9fSBzdGVwczwvc3Bhbj5cbiAgICAgICAgQGlmIChwYXVzZVdpcmVkICYmICFmaW5pc2hlZCkge1xuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tcGlsbCB2by1zb2Z0IHZvLXNtXCIgKGNsaWNrKT1cInRvZ2dsZVBhdXNlZCgpXCI+XG4gICAgICAgICAgICA8dm8taWNvbiBbbmFtZV09XCJpc1BhdXNlZCA/ICdwbGF5JyA6ICdwYXVzZSdcIiBzaXplPVwieHNcIj48L3ZvLWljb24+XG4gICAgICAgICAgICB7eyBpc1BhdXNlZCA/ICdSZXN1bWUnIDogJ1BhdXNlIGFsbCcgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2by1hbG4tcm93c1wiICNyb3dzPlxuICAgICAgICBAZm9yICh2IG9mIHZpZXdzOyB0cmFjayB2LmxhbmUua2V5KSB7XG4gICAgICAgICAgQGlmIChoYW5kRm9yKHYubGFuZS5rZXkpOyBhcyBoKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwidm8tZm9sZCB2by1hbG4taGZcIlxuICAgICAgICAgICAgICBbY2xhc3Mudm8tc2h1dF09XCIhKGgub3BlbiAmJiAhaC5sZWF2aW5nKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy52by1saXRdPVwiaC5saXRcIlxuICAgICAgICAgICAgICBbYXR0ci5pbmVydF09XCJoLm9wZW4gJiYgIWgubGVhdmluZyA/IG51bGwgOiAnJ1wiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cImgub3BlbiAmJiAhaC5sZWF2aW5nID8gbnVsbCA6ICd0cnVlJ1wiXG4gICAgICAgICAgICAgIFtzdHlsZS4tLXZvLWZyb21dPVwiJ3ZhcigtLXZvLScgKyBoLmZyb21Ub25lICsgJyknXCJcbiAgICAgICAgICAgICAgW3N0eWxlLi0tdm8tdG9dPVwiJ3ZhcigtLXZvLScgKyBoLnRvVG9uZSArICcpJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFsbi1oYW5kIHZvLWVudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8YiBjbGFzcz1cInZvLWZcIj57eyBoLmZyb21OYW1lIH19PC9iPiBoYW5kZWQge3sgaC53aGF0IH19IHRvIDxiIGNsYXNzPVwidm8tdFwiPnt7IGgudG9OYW1lIH19PC9iPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInZvLWFsbi1sYW5lXCJcbiAgICAgICAgICAgIFtjbGFzcy52by1zZW50XT1cInYuc2VudFwiXG4gICAgICAgICAgICBbY2xhc3Mudm8tZ290XT1cInYuZ290XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtc109XCJ2LnN0YXR1c1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWxhbmVdPVwidi5sYW5lLmtleVwiXG4gICAgICAgICAgICBbc3R5bGUuLS12by1jXT1cIid2YXIoLS12by0nICsgdi50b25lICsgJyknXCJcbiAgICAgICAgICAgIFtzdHlsZS4tLXZvLWNiXT1cIid2YXIoLS12by0nICsgdi50b25lICsgJy1iZyknXCJcbiAgICAgICAgICAgIFtzdHlsZS4tLXZvLWNtXT1cIid2YXIoLS12by1hbG4tJyArIHYudG9uZSArICcsdmFyKC0tdm8tJyArIHYudG9uZSArICcpKSdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidm8tYWxuLXJvd1wiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwidi5vcGVuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUxhbmUodi5sYW5lLmtleSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFsbi1hdlwiIFtjbGFzcy52by1waW5nXT1cInYucGluZ1wiPlxuICAgICAgICAgICAgICAgIDx2by1pY29uIFtuYW1lXT1cInYubGFuZS5pY29uXCI+PC92by1pY29uPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWxuLXdob1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWxuLW5cIj57eyB2LmxhbmUubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXN3IHZvLWFsbi1hXCIgW2NsYXNzLnZvLWxpdmVdPVwidi5saXZlXCIgW2NsYXNzLnZvLXNoaW1dPVwidi5zdGF0dXMgPT09ICd3b3JraW5nJ1wiPnt7IHYubGFuZS5hY3Rpdml0eSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFsbi10clwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGIgb2Ygdi5iYXJzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy52by1vbl09XCJiLm9uXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnZvLXJ1bl09XCJiLnJ1blwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy52by1pbmRdPVwiYi5pbmRcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuLS12by1wXT1cImIucHJvZ3Jlc3MgPz8gbnVsbFwiXG4gICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFsbi1zdFwiPlxuICAgICAgICAgICAgICAgIEBzd2l0Y2ggKHYuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoJ3dvcmtpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdGFnIHZvLWFsbi10Z1wiPjxzcGFuIGNsYXNzPVwidm8tc3BpblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5Xb3JraW5nPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGNhc2UgKCdwYXVzZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdGFnIHZvLXdhcm5cIj5QYXVzZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoJ2RvbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdGFnIHZvLW9rXCI+PHZvLWljb24gbmFtZT1cImNoZWNrXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPkRvbmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoJ3dhaXRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdGFnXCI+PHZvLWljb24gbmFtZT1cImNsb2NrXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPldhaXRpbmc8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdGFnXCI+UXVldWVkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZm9sZFwiIFtjbGFzcy52by1zaHV0XT1cIiF2Lm9wZW5cIiBbYXR0ci5pbmVydF09XCJ2Lm9wZW4gPyBudWxsIDogJydcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWxuLWRldFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAobCBvZiB2LmxhbmUubG9nID8/IFtdOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWVudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgbC50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAobC50aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW11dGVkXCI+e3sgbC50aW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgQGZvciAocyBvZiBzdHJva2VzOyB0cmFjayBzLmtleSkge1xuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInZvLWFsbi1wa1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWtdPVwicy5rZXlcIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgIFtzdHlsZS4tLXZvLWZyb21dPVwiJ3ZhcigtLXZvLWFsbi0nICsgcy5mcm9tVG9uZSArICcsdmFyKC0tdm8tJyArIHMuZnJvbVRvbmUgKyAnKSknXCJcbiAgICAgICAgICAgIFtzdHlsZS4tLXZvLXRvXT1cIid2YXIoLS12by1hbG4tJyArIHMudG9Ub25lICsgJyx2YXIoLS12by0nICsgcy50b1RvbmUgKyAnKSknXCJcbiAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL2FnZW50LWxhbmVzLmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIEFnZW50TGFuZXNDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGxhbmVzOiBBZ2VudExhbmVbXSA9IFtdO1xuICAvKiogSGVhZGVyIHRleHQuIERlZmF1bHRzIHRvIFwiTiBhZ2VudHMgd29ya2luZ1wiLCBcIkFsbCBhZ2VudHMgcGF1c2VkXCIgb3IgXCJBbGwgTiBhZ2VudHMgZmluaXNoZWRcIi4gKi9cbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIC8qKiBTZWNvbmRzIHRvIHNob3cgYXMgbTpzcy4gTGVhdmUgaXQgb3V0IHRvIGxldCB0aGUgaGVhZGVyIGNvdW50IHdoaWxlIGFnZW50cyB3b3JrLiAqL1xuICBASW5wdXQoKSBzZWNvbmRzPzogbnVtYmVyO1xuICAvKiogV2hldGhlciBldmVyeSBhZ2VudCBpcyBwYXVzZWQuIFdvcmtpbmcgbGFuZXMgdGhlbiBzaG93IFBhdXNlZCBhbmQgdGhlIGNsb2NrIHN0b3BzLiAqL1xuICBASW5wdXQoKSBzZXQgcGF1c2VkKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5wYXVzZWRDb250cm9sbGVkID0gdmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgdGhpcy5pbm5lclBhdXNlZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIGRlZmF1bHRQYXVzZWQgPSBmYWxzZTtcbiAgLyoqIEFkZHMgdGhlIFBhdXNlIGFsbCAvIFJlc3VtZSBidXR0b24sIHVudGlsIGV2ZXJ5IGxhbmUgaXMgZG9uZSAoUmVhY3Q6IG9uUGF1c2VkQ2hhbmdlIHdpcmVkKS4gKi9cbiAgQElucHV0KCkgcGF1c2VXaXJlZCA9IGZhbHNlO1xuICAvKiogVGhlIGhhbmRvZmYgdG8gc2hvdy4gU2V0IGl0IGJhY2sgdG8gdW5kZWZpbmVkIGFuZCBpdHMgbGluZSBzbGlkZXMgYXdheTsgdGhlIHN0cmV0Y2ggaXQgY3Jvc3NlZCBzdGF5cyBsaXQuICovXG4gIEBJbnB1dCgpIGhhbmRvZmY/OiBBZ2VudEhhbmRvZmY7XG4gIC8qKiBLZXlzIG9mIHRoZSBsYW5lcyB0aGF0IGFyZSBvcGVuLiBMZWF2ZSBpdCBvdXQgdG8gbGV0IGVhY2ggcm93IHRvZ2dsZSBpdHNlbGYuICovXG4gIEBJbnB1dCgpIHNldCBleHBhbmRlZCh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmV4cGFuZGVkQ29udHJvbGxlZCA9IHZhbHVlICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHRoaXMuaW5uZXJFeHBhbmRlZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIGRlZmF1bHRFeHBhbmRlZDogc3RyaW5nW10gPSBbXTtcbiAgLyoqIFNpdHMgZmxhdCBpbiBhIGNoYXQgdGhyZWFkICh0aGUgZGVmYXVsdCkuIFNldCBmYWxzZSB0byBnaXZlIGl0IGEgY2FyZCBvZiBpdHMgb3duLiAqL1xuICBASW5wdXQoKSBiYXJlID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgcGF1c2VkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgZXhwYW5kZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3Jvd3MnKSBwcml2YXRlIHJvd3NSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcml2YXRlIHBhdXNlZENvbnRyb2xsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBleHBhbmRlZENvbnRyb2xsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbm5lclBhdXNlZCA9IGZhbHNlO1xuICBwcml2YXRlIGlubmVyRXhwYW5kZWQ6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgY291bnRlZCA9IDA7XG4gIHByaXZhdGUgdGljaz86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcblxuICAvLyB0aGUgaGFuZC1vZmYga2VwdCBvbiBzY3JlZW4sIHNvIGl0IGNhbiBwbGF5IGl0cyBleGl0IGFmdGVyIGBoYW5kb2ZmYCBpcyBjbGVhcmVkXG4gIHByaXZhdGUga2VwdD86IEFnZW50SGFuZG9mZjtcbiAgcHJpdmF0ZSBrZXB0VGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBoYW5kT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIG9wZW5GcmFtZT86IG51bWJlcjtcbiAgcHJpdmF0ZSBoYW5kUmFmPzogbnVtYmVyO1xuXG4gIC8vIHRoZSBoYW5kLW9mZnMgd2hvc2UgbGlnaHQgaGFzIGFycml2ZWQ6IHRoZWlyIHN0cmV0Y2ggb2YgcmVsYXkgbGluZSBzdGF5cyBsaXRcbiAgcHJpdmF0ZSByZWxheWVkOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGRyYXdpbmc/OiBzdHJpbmc7XG4gIHByaXZhdGUgcGluZ2VkPzogc3RyaW5nO1xuICBwcml2YXRlIGRyYXdUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIHBpbmdUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIGxhc3RIYW5kS2V5ID0gJyc7XG5cbiAgcHJpdmF0ZSBybz86IFJlc2l6ZU9ic2VydmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcmVkdWNlZDogUmVkdWNlZE1vdGlvblNlcnZpY2UpIHt9XG5cbiAgLy8gLS0tLS0gY29udHJvbGxhYmxlIHN0YXRlIC0tLS0tXG5cbiAgZ2V0IGlzUGF1c2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlubmVyUGF1c2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZXhwYW5kZWRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5pbm5lckV4cGFuZGVkO1xuICB9XG5cbiAgdG9nZ2xlUGF1c2VkKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSAhdGhpcy5pc1BhdXNlZDtcbiAgICBpZiAoIXRoaXMucGF1c2VkQ29udHJvbGxlZCkgdGhpcy5pbm5lclBhdXNlZCA9IG5leHQ7XG4gICAgdGhpcy5wYXVzZWRDaGFuZ2UuZW1pdChuZXh0KTtcbiAgfVxuXG4gIHRvZ2dsZUxhbmUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBvcGVuID0gdGhpcy5leHBhbmRlZEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICBjb25zdCBuZXh0ID0gb3BlbiA/IHRoaXMuZXhwYW5kZWRLZXlzLmZpbHRlcigoaykgPT4gayAhPT0ga2V5KSA6IFsuLi50aGlzLmV4cGFuZGVkS2V5cywga2V5XTtcbiAgICBpZiAoIXRoaXMuZXhwYW5kZWRDb250cm9sbGVkKSB0aGlzLmlubmVyRXhwYW5kZWQgPSBuZXh0O1xuICAgIHRoaXMuZXhwYW5kZWRDaGFuZ2UuZW1pdChuZXh0KTtcbiAgfVxuXG4gIC8vIC0tLS0tIGRlcml2ZWQgdmlldyBzdGF0ZSAtLS0tLVxuXG4gIGdldCBmaW5pc2hlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYW5lcy5sZW5ndGggPiAwICYmIHRoaXMubGFuZXMuZXZlcnkoKGwpID0+IGwuc3RhdHVzID09PSAnZG9uZScpO1xuICB9XG5cbiAgZ2V0IGhlYWQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy50aXRsZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy50aXRsZTtcbiAgICBpZiAodGhpcy5maW5pc2hlZCkgcmV0dXJuIGBBbGwgJHt0aGlzLmxhbmVzLmxlbmd0aH0gYWdlbnRzIGZpbmlzaGVkYDtcbiAgICBpZiAodGhpcy5pc1BhdXNlZCkgcmV0dXJuICdBbGwgYWdlbnRzIHBhdXNlZCc7XG4gICAgcmV0dXJuIGAke3RoaXMubGFuZXMubGVuZ3RofSBhZ2VudHMgd29ya2luZ2A7XG4gIH1cblxuICBnZXQgY2xvY2tUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsb2NrKHRoaXMuc2Vjb25kcyA/PyB0aGlzLmNvdW50ZWQpO1xuICB9XG5cbiAgZ2V0IHRvdGFsKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubGFuZXMucmVkdWNlKChuLCBsKSA9PiBuICsgKGwuc3RlcHMgPz8gMyksIDApO1xuICB9XG5cbiAgZ2V0IHN0ZXBzRG9uZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmxhbmVzLnJlZHVjZSgobiwgbCkgPT4gbiArIE1hdGgubWluKGwuZG9uZSA/PyAwLCBsLnN0ZXBzID8/IDMpLCAwKTtcbiAgfVxuXG4gIGdldCB2aWV3cygpOiBMYW5lVmlld1tdIHtcbiAgICByZXR1cm4gdGhpcy5sYW5lcy5tYXAoKGxhbmUpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1czogTGFuZVN0YXR1cyA9IHRoaXMuaXNQYXVzZWQgJiYgbGFuZS5zdGF0dXMgPT09ICd3b3JraW5nJyA/ICdwYXVzZWQnIDogbGFuZS5zdGF0dXM7XG4gICAgICBjb25zdCBzdGVwcyA9IGxhbmUuc3RlcHMgPz8gMztcbiAgICAgIGNvbnN0IGRvbmUgPSBsYW5lLmRvbmUgPz8gMDtcbiAgICAgIGNvbnN0IGxpdmUgPSBzdGF0dXMgPT09ICd3b3JraW5nJyB8fCBzdGF0dXMgPT09ICdwYXVzZWQnO1xuICAgICAgY29uc3QgYmFyczogQmFyVmlld1tdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogc3RlcHMgfSwgKF8sIGkpID0+IHtcbiAgICAgICAgY29uc3QgcnVuID0gaSA9PT0gZG9uZSAmJiBsaXZlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9uOiBpIDwgZG9uZSxcbiAgICAgICAgICBydW4sXG4gICAgICAgICAgaW5kOiBydW4gJiYgbGFuZS5wcm9ncmVzcyA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgIHByb2dyZXNzOiBydW4gJiYgbGFuZS5wcm9ncmVzcyAhPT0gdW5kZWZpbmVkID8gY2xhbXAwMShsYW5lLnByb2dyZXNzKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFuZSxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICB0b25lOiBodWVPZihsYW5lKSxcbiAgICAgICAgbGl2ZSxcbiAgICAgICAgc2VudDogdGhpcy5yZWxheWVkLnNvbWUoKGspID0+IGsuc3RhcnRzV2l0aChsYW5lLmtleSArICc+JykpLFxuICAgICAgICBnb3Q6IHRoaXMucmVsYXllZC5zb21lKChrKSA9PiBrLmVuZHNXaXRoKCc+JyArIGxhbmUua2V5KSksXG4gICAgICAgIHBpbmc6IHRoaXMucGluZ2VkID09PSBsYW5lLmtleSxcbiAgICAgICAgb3BlbjogdGhpcy5leHBhbmRlZEtleXMuaW5jbHVkZXMobGFuZS5rZXkpLFxuICAgICAgICBiYXJzLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbmFtZU9mKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sYW5lcy5maW5kKChsKSA9PiBsLmtleSA9PT0ga2V5KT8ubmFtZSA/PyBrZXk7XG4gIH1cblxuICBwcml2YXRlIHRvbmVPZihrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGh1ZU9mKHRoaXMubGFuZXMuZmluZCgobCkgPT4gbC5rZXkgPT09IGtleSkpO1xuICB9XG5cbiAgLyoqIFRoZSBoYW5kLW9mZiBsaW5lIHRvIHJlbmRlciBiZWZvcmUgdGhlIGxhbmUgaXQgaXMgaGFuZGVkIHRvLCBvciB1bmRlZmluZWQuICovXG4gIGhhbmRGb3IobGFuZUtleTogc3RyaW5nKTogSGFuZFZpZXcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGggPSB0aGlzLmtlcHQ7XG4gICAgaWYgKCFoIHx8IGgudG8gIT09IGxhbmVLZXkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3Qga2V5ID0gYCR7aC5mcm9tfT4ke2gudG99YDtcbiAgICByZXR1cm4ge1xuICAgICAga2V5LFxuICAgICAgZnJvbTogaC5mcm9tLFxuICAgICAgdG86IGgudG8sXG4gICAgICB3aGF0OiBoLndoYXQsXG4gICAgICBmcm9tTmFtZTogdGhpcy5uYW1lT2YoaC5mcm9tKSxcbiAgICAgIHRvTmFtZTogdGhpcy5uYW1lT2YoaC50byksXG4gICAgICBmcm9tVG9uZTogdGhpcy50b25lT2YoaC5mcm9tKSxcbiAgICAgIHRvVG9uZTogdGhpcy50b25lT2YoaC50byksXG4gICAgICBvcGVuOiB0aGlzLmhhbmRPcGVuLFxuICAgICAgbGVhdmluZzogdGhpcy5oYW5kb2ZmID09PSB1bmRlZmluZWQsXG4gICAgICBsaXQ6IHRoaXMucmVsYXllZC5pbmNsdWRlcyhrZXkpLFxuICAgIH07XG4gIH1cblxuICBnZXQgc3Ryb2tlcygpOiBTdHJva2VWaWV3W10ge1xuICAgIGNvbnN0IGtleXMgPVxuICAgICAgdGhpcy5kcmF3aW5nICYmICF0aGlzLnJlbGF5ZWQuaW5jbHVkZXModGhpcy5kcmF3aW5nKVxuICAgICAgICA/IFsuLi50aGlzLnJlbGF5ZWQsIHRoaXMuZHJhd2luZ11cbiAgICAgICAgOiB0aGlzLnJlbGF5ZWQ7XG4gICAgcmV0dXJuIGtleXMubWFwKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IFtmcm9tLCB0b10gPSBrZXkuc3BsaXQoJz4nKTtcbiAgICAgIHJldHVybiB7IGtleSwgZnJvbSwgdG8sIGZyb21Ub25lOiB0aGlzLnRvbmVPZihmcm9tKSwgdG9Ub25lOiB0aGlzLnRvbmVPZih0bykgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0tIGxpZmVjeWNsZSAtLS0tLVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGF1c2VkQ29udHJvbGxlZCkgdGhpcy5pbm5lclBhdXNlZCA9IHRoaXMuZGVmYXVsdFBhdXNlZDtcbiAgICBpZiAoIXRoaXMuZXhwYW5kZWRDb250cm9sbGVkICYmIHRoaXMuaW5uZXJFeHBhbmRlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaW5uZXJFeHBhbmRlZCA9IFsuLi50aGlzLmRlZmF1bHRFeHBhbmRlZF07XG4gICAgfVxuICAgIHRoaXMuc3RhcnRDb3VudGVyKCk7XG4gICAgY29uc3QgYm94ID0gdGhpcy5yb3dzUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChib3ggJiYgdHlwZW9mIFJlc2l6ZU9ic2VydmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLnJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMucGxhY2VTdHJva2VzKCkpO1xuICAgICAgdGhpcy5yby5vYnNlcnZlKGJveCk7XG4gICAgfVxuICAgIHRoaXMucGxhY2VTdHJva2VzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3NlY29uZHMnXSB8fCBjaGFuZ2VzWydwYXVzZWQnXSB8fCBjaGFuZ2VzWydsYW5lcyddKSB0aGlzLnN0YXJ0Q291bnRlcigpO1xuICAgIGlmIChjaGFuZ2VzWydoYW5kb2ZmJ10pIHRoaXMub25IYW5kb2ZmQ2hhbmdlKCk7XG4gICAgaWYgKGNoYW5nZXNbJ2xhbmVzJ10pIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMucGxhY2VTdHJva2VzKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkhhbmRvZmZDaGFuZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgaCA9IHRoaXMuaGFuZG9mZjtcbiAgICBpZiAoaCkge1xuICAgICAgLy8gYnJpbmcgdGhlIGxpbmUgaW46IG1vdW50IHNodXQsIHRoZW4gb3BlbiBvbiB0aGUgbmV4dCBmcmFtZSBzbyB0aGUgbGFuZXMgYmVsb3cgZ2xpZGUgZG93blxuICAgICAgdGhpcy5rZXB0ID0gaDtcbiAgICAgIGlmICh0aGlzLmtlcHRUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5rZXB0VGltZXIpO1xuICAgICAgICB0aGlzLmtlcHRUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFuZE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuc2NoZWR1bGVPcGVuKCk7XG4gICAgICBjb25zdCBrZXkgPSBgJHtoLmZyb219PiR7aC50b31gO1xuICAgICAgdGhpcy5sYXN0SGFuZEtleSA9IGtleTtcbiAgICAgIGlmICghdGhpcy5yZWxheWVkLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhd1RpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5kcmF3VGltZXIpO1xuICAgICAgICB0aGlzLmRyYXdUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zdGFydERyYXcoa2V5KSwgdGhpcy5yZWR1Y2VkLnJlZHVjZSgpID8gMCA6IDUwMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGtlZXAgdGhlIGxhc3Qgb25lIG9uIHNjcmVlbiB3aGlsZSBpdCBwbGF5cyBpdHMgZXhpdFxuICAgICAgdGhpcy5oYW5kT3BlbiA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMua2VwdCAmJiAhdGhpcy5rZXB0VGltZXIpIHtcbiAgICAgICAgdGhpcy5rZXB0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmtlcHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhpcy5rZXB0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH0sIHRoaXMucmVkdWNlZC5yZWR1Y2UoKSA/IDAgOiA3MDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVPcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRSYWYpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuaGFuZFJhZik7XG4gICAgaWYgKHRoaXMub3BlbkZyYW1lKSBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLm9wZW5GcmFtZSk7XG4gICAgY29uc3QgcmFmID1cbiAgICAgIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgOiAoY2I6IEZyYW1lUmVxdWVzdENhbGxiYWNrKSA9PiBzZXRUaW1lb3V0KCgpID0+IGNiKDApLCAxNikgYXMgdW5rbm93biBhcyBudW1iZXI7XG4gICAgdGhpcy5oYW5kUmFmID0gcmFmKCgpID0+IHtcbiAgICAgIHRoaXMub3BlbkZyYW1lID0gcmFmKCgpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kT3BlbiA9IHRydWU7XG4gICAgICAgIHRoaXMucGxhY2VTdHJva2VzKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnREcmF3KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVsYXllZC5pbmNsdWRlcyhrZXkpKSByZXR1cm47XG4gICAgdGhpcy5kcmF3aW5nID0ga2V5O1xuICAgIHRoaXMucGxhY2VTdHJva2VzKCk7XG4gICAgY29uc3QgdG8gPSBrZXkuc3BsaXQoJz4nKVsxXTtcbiAgICBjb25zdCBhcnJpdmUgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXRoaXMucmVsYXllZC5pbmNsdWRlcyhrZXkpKSB0aGlzLnJlbGF5ZWQgPSBbLi4udGhpcy5yZWxheWVkLCBrZXldO1xuICAgICAgaWYgKHRoaXMuZHJhd2luZyA9PT0ga2V5KSB0aGlzLmRyYXdpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnBpbmdlZCA9IHRvO1xuICAgICAgaWYgKHRoaXMucGluZ1RpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5waW5nVGltZXIpO1xuICAgICAgdGhpcy5waW5nVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucGluZ2VkID09PSB0bykgdGhpcy5waW5nZWQgPSB1bmRlZmluZWQ7XG4gICAgICB9LCA5NTApO1xuICAgICAgdGhpcy5wbGFjZVN0cm9rZXMoKTtcbiAgICB9O1xuICAgIC8vIHRoZSBzdHJva2UgZHJhd3MgaXRzZWxmIGZyb20gdGhlIHNlbmRlcidzIGJhZGdlIGRvd24gdG8gdGhlIHRha2VyJ3NcbiAgICBjb25zdCBwayA9IHRoaXMucm93c1JlZj8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgIGA6c2NvcGU+LnZvLWFsbi1wa1tkYXRhLWs9XCIke0NTUy5lc2NhcGUoa2V5KX1cIl1gLFxuICAgICk7XG4gICAgaWYgKCFwayB8fCB0aGlzLnJlZHVjZWQucmVkdWNlKCkpIHtcbiAgICAgIGFycml2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbiA9IHBrLmFuaW1hdGUoW3sgdHJhbnNmb3JtOiAnc2NhbGVZKDApJyB9LCB7IHRyYW5zZm9ybTogJ3NjYWxlWSgxKScgfV0sIHtcbiAgICAgIGR1cmF0aW9uOiA4MDAsXG4gICAgICBlYXNpbmc6ICdjdWJpYy1iZXppZXIoLjY1LDAsLjM1LDEpJyxcbiAgICB9KTtcbiAgICBhbi5maW5pc2hlZC50aGVuKGFycml2ZSwgKCkgPT4ge30pO1xuICB9XG5cbiAgLyoqIExheSBlYWNoIGxpdCBzdHJva2UgZnJvbSB0aGUgc2VuZGVyJ3MgYmFkZ2UgZG93biB0byB0aGUgdGFrZXIncywgaW4gdGhlIGdhcCBiZXR3ZWVuIHRoZW0uICovXG4gIHByaXZhdGUgcGxhY2VTdHJva2VzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJveCA9IHRoaXMucm93c1JlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWJveCkgcmV0dXJuO1xuICAgIGNvbnN0IHJyID0gYm94LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGJveC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignOnNjb3BlPi52by1hbG4tcGsnKS5mb3JFYWNoKChwaykgPT4ge1xuICAgICAgY29uc3QgW2YsIGddID0gKHBrLmRhdGFzZXRbJ2snXSA/PyAnJykuc3BsaXQoJz4nKTtcbiAgICAgIGNvbnN0IGEgPSBib3gucXVlcnlTZWxlY3RvcihgW2RhdGEtbGFuZT1cIiR7Q1NTLmVzY2FwZShmKX1cIl0gLnZvLWFsbi1hdmApO1xuICAgICAgY29uc3QgYiA9IGJveC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1sYW5lPVwiJHtDU1MuZXNjYXBlKGcpfVwiXSAudm8tYWxuLWF2YCk7XG4gICAgICBpZiAoIWEgfHwgIWIpIHJldHVybjtcbiAgICAgIGNvbnN0IHkwID0gYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gLSByci50b3AgKyA0O1xuICAgICAgY29uc3QgeTEgPSBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIHJyLnRvcCAtIDQ7XG4gICAgICBway5zdHlsZS50b3AgPSB5MCArICdweCc7XG4gICAgICBway5zdHlsZS5oZWlnaHQgPSBNYXRoLm1heCgwLCB5MSAtIHkwKSArICdweCc7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0Q291bnRlcigpOiB2b2lkIHtcbiAgICBjb25zdCBzaG91bGRDb3VudCA9XG4gICAgICB0aGlzLnNlY29uZHMgPT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pc1BhdXNlZCAmJiAhdGhpcy5maW5pc2hlZCAmJiAhdGhpcy5yZWR1Y2VkLnJlZHVjZSgpO1xuICAgIGlmIChzaG91bGRDb3VudCAmJiAhdGhpcy50aWNrKSB7XG4gICAgICB0aGlzLnRpY2sgPSBzZXRJbnRlcnZhbCgoKSA9PiAodGhpcy5jb3VudGVkICs9IDEpLCAxMDAwKTtcbiAgICB9IGVsc2UgaWYgKCFzaG91bGRDb3VudCAmJiB0aGlzLnRpY2spIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aWNrKTtcbiAgICAgIHRoaXMudGljayA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aWNrKSBjbGVhckludGVydmFsKHRoaXMudGljayk7XG4gICAgaWYgKHRoaXMua2VwdFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5rZXB0VGltZXIpO1xuICAgIGlmICh0aGlzLmRyYXdUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuZHJhd1RpbWVyKTtcbiAgICBpZiAodGhpcy5waW5nVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnBpbmdUaW1lcik7XG4gICAgaWYgKHRoaXMuaGFuZFJhZikgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5oYW5kUmFmKTtcbiAgICBpZiAodGhpcy5vcGVuRnJhbWUpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMub3BlbkZyYW1lKTtcbiAgICB0aGlzLnJvPy5kaXNjb25uZWN0KCk7XG4gIH1cbn1cbiJdfQ==
|