@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,916 @@
|
|
|
1
|
+
// framework/angular/artifact-card/artifact-card.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/artifact-card/ArtifactCard.tsx.
|
|
4
|
+
// A file the agent made, shown four ways: a compact row, a card with its first
|
|
5
|
+
// page, a chip inside a message, or a stack of its versions. Each plays a
|
|
6
|
+
// writing state, then opens in a reader, switches versions, copies and
|
|
7
|
+
// downloads the same way. Inputs mirror the React props; React callbacks become
|
|
8
|
+
// @Output() EventEmitters.
|
|
9
|
+
//
|
|
10
|
+
// Icon notes: the Angular core glyph set has no download/panel/maximize/layers/
|
|
11
|
+
// history glyphs, so the closest available names are substituted — Open uses
|
|
12
|
+
// `ext` (open out), Download uses `chev-d` (a downward arrow), and the Versions
|
|
13
|
+
// buttons use `clock` (history).
|
|
14
|
+
import { Component, ElementRef, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, inject, } from '@angular/core';
|
|
15
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
16
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
17
|
+
import { ReducedMotionService } from '../core/reduced-motion.service';
|
|
18
|
+
import * as i0 from "@angular/core";
|
|
19
|
+
const MIME = {
|
|
20
|
+
md: 'text/markdown',
|
|
21
|
+
csv: 'text/csv',
|
|
22
|
+
json: 'application/json',
|
|
23
|
+
html: 'text/html',
|
|
24
|
+
};
|
|
25
|
+
const slug = (s) => s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
26
|
+
const ago = (meta) => meta.replace(/^edited\s+/i, '');
|
|
27
|
+
const firstPara = (content) => content
|
|
28
|
+
.split(/\n\s*\n/)
|
|
29
|
+
.map((b) => b.trim())
|
|
30
|
+
.find((b) => b && !/^(#|[-*] |\d+\. |v\d+,)/.test(b)) ?? '';
|
|
31
|
+
const LINES = [
|
|
32
|
+
[{ t: 'p', w: 94 }, { t: 'p', w: 72 }, { t: 's' }, { t: 'b', w: 82 }, { t: 'b', w: 74 }, { t: 'b', w: 66 }, { t: 'b', w: 78 }, { t: 's' }, { t: 'p', w: 88 }, { t: 'p', w: 52 }],
|
|
33
|
+
[{ t: 'p', w: 92 }, { t: 'p', w: 86 }, { t: 'p', w: 56 }, { t: 's' }, { t: 'b', w: 80 }, { t: 'b', w: 72 }, { t: 'b', w: 86 }, { t: 'b', w: 64 }, { t: 's' }, { t: 'p', w: 70 }],
|
|
34
|
+
[{ t: 'p', w: 90 }, { t: 'p', w: 78 }, { t: 's' }, { t: 'n', w: 84 }, { t: 'n', w: 70 }, { t: 'n', w: 78 }, { t: 's' }, { t: 'b', w: 76 }, { t: 'b', w: 68 }, { t: 'b', w: 82 }],
|
|
35
|
+
];
|
|
36
|
+
// the preview's lines, a little different for each version so drafts are easy to tell apart
|
|
37
|
+
const WIDTHS = [[96, 88, 70, 82], [92, 84, 90, 64], [90, 78, 86, 72]];
|
|
38
|
+
export class ArtifactCardComponent {
|
|
39
|
+
constructor() {
|
|
40
|
+
/** How the card shows the file. */
|
|
41
|
+
this.variant = 'compact';
|
|
42
|
+
/** The versions, oldest first. */
|
|
43
|
+
this.versions = [];
|
|
44
|
+
/** 'writing' while the agent is still making the file; 'ready' once it is done. */
|
|
45
|
+
this.state = 'ready';
|
|
46
|
+
/** The line shown while writing, like "Reading the page…". */
|
|
47
|
+
this.status = 'Writing…';
|
|
48
|
+
/** The kind of file on the meta line, like "Report" or "Table". */
|
|
49
|
+
this.kind = 'Report';
|
|
50
|
+
/** The file's icon. */
|
|
51
|
+
this.icon = 'file-text';
|
|
52
|
+
/** The extension Download saves with. "csv" also shows the content as a table in the reader. */
|
|
53
|
+
this.ext = 'md';
|
|
54
|
+
this.className = '';
|
|
55
|
+
/** Emitted when the shown version changes. */
|
|
56
|
+
this.versionChange = new EventEmitter();
|
|
57
|
+
/** Emitted when the file is opened, with the version shown. With a listener, Open does not show the card's own reader. */
|
|
58
|
+
this.opened = new EventEmitter();
|
|
59
|
+
/** Emitted after Copy has put the version's content on the clipboard. */
|
|
60
|
+
this.copied = new EventEmitter();
|
|
61
|
+
/** Emitted after Download has saved the version's content as a file. */
|
|
62
|
+
this.downloaded = new EventEmitter();
|
|
63
|
+
this.host = inject(ElementRef);
|
|
64
|
+
this.motion = inject(ReducedMotionService);
|
|
65
|
+
// which version is shown (uncontrolled unless `version` is set)
|
|
66
|
+
this.curIndex = 0;
|
|
67
|
+
this.controlled = false;
|
|
68
|
+
this.flashed = null;
|
|
69
|
+
this.said = '';
|
|
70
|
+
this.settled = false;
|
|
71
|
+
this.wasWriting = false;
|
|
72
|
+
this.reading = null;
|
|
73
|
+
this.openerEl = null;
|
|
74
|
+
// versions menu
|
|
75
|
+
this.menuOpen = false;
|
|
76
|
+
this.menuLeft = 0;
|
|
77
|
+
this.menuTop = 0;
|
|
78
|
+
// stack
|
|
79
|
+
this.fanned = false;
|
|
80
|
+
this.peek = null;
|
|
81
|
+
this.typedTitle = '';
|
|
82
|
+
this.stackTimers = [];
|
|
83
|
+
this.stackAnims = [];
|
|
84
|
+
this.onDocPointer = (e) => {
|
|
85
|
+
const t = e.target;
|
|
86
|
+
if (this.menuOpen && !this.menuEl?.nativeElement.contains(t) && !this.openerTrigger?.contains(t)) {
|
|
87
|
+
this.closeMenu();
|
|
88
|
+
}
|
|
89
|
+
if (this.fanned && !this.desk?.nativeElement.contains(t) && !this.fanBtn?.nativeElement.contains(t)) {
|
|
90
|
+
this.fan(false);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
ngOnChanges(changes) {
|
|
95
|
+
if (changes['version']) {
|
|
96
|
+
this.controlled = this.version !== undefined;
|
|
97
|
+
if (this.version !== undefined)
|
|
98
|
+
this.curIndex = this.version;
|
|
99
|
+
}
|
|
100
|
+
if (changes['defaultVersion'] && !this.controlled && this.defaultVersion !== undefined) {
|
|
101
|
+
this.curIndex = this.defaultVersion;
|
|
102
|
+
}
|
|
103
|
+
if (changes['versions'] && !this.controlled && this.defaultVersion === undefined) {
|
|
104
|
+
this.curIndex = Math.max(0, this.versions.length - 1);
|
|
105
|
+
}
|
|
106
|
+
if (changes['state']) {
|
|
107
|
+
const writing = this.state === 'writing';
|
|
108
|
+
if (this.wasWriting && !writing) {
|
|
109
|
+
this.settled = true;
|
|
110
|
+
this.say(`${this.v.title} is ready, v${this.i + 1}`);
|
|
111
|
+
}
|
|
112
|
+
this.wasWriting = writing;
|
|
113
|
+
}
|
|
114
|
+
if (changes['variant'] || changes['state'])
|
|
115
|
+
this.restartStack();
|
|
116
|
+
}
|
|
117
|
+
ngAfterViewInit() {
|
|
118
|
+
this.wasWriting = this.state === 'writing';
|
|
119
|
+
document.addEventListener('pointerdown', this.onDocPointer);
|
|
120
|
+
this.restartStack();
|
|
121
|
+
}
|
|
122
|
+
ngOnDestroy() {
|
|
123
|
+
document.removeEventListener('pointerdown', this.onDocPointer);
|
|
124
|
+
clearTimeout(this.flashTimer);
|
|
125
|
+
clearTimeout(this.sayTimer);
|
|
126
|
+
this.clearStack();
|
|
127
|
+
}
|
|
128
|
+
// ---- derived state ----
|
|
129
|
+
get n() { return this.versions.length; }
|
|
130
|
+
get last() { return this.n - 1; }
|
|
131
|
+
get i() { return Math.max(0, Math.min(this.last, this.curIndex)); }
|
|
132
|
+
get v() { return this.versions[this.i] ?? { title: '', meta: '', content: '' }; }
|
|
133
|
+
get writing() { return this.state === 'writing'; }
|
|
134
|
+
get shown() { return this.fanned && this.peek != null ? this.peek : this.i; }
|
|
135
|
+
get reversed() { return this.versions.map((_, k) => k).reverse(); }
|
|
136
|
+
get actionSize() { return this.variant === 'inline' || this.variant === 'preview' ? 'sm' : 'md'; }
|
|
137
|
+
get summary() { return this.v.summary ?? firstPara(this.v.content); }
|
|
138
|
+
get previewWidths() { return WIDTHS[this.i % 3]; }
|
|
139
|
+
clamp(x) { return Math.max(0, Math.min(1, x ?? 0)); }
|
|
140
|
+
shortMeta(meta) { return ago(meta); }
|
|
141
|
+
whenHtml(meta) {
|
|
142
|
+
const short = ago(meta);
|
|
143
|
+
return short === meta ? meta : `<span class="vo-afx-ed">edited </span>${short}`;
|
|
144
|
+
}
|
|
145
|
+
stackLines(n) { return LINES[n === this.last ? 2 : n % 2]; }
|
|
146
|
+
get csvRows() {
|
|
147
|
+
return this.v.content.trim().split('\n').map((r) => r.split(','));
|
|
148
|
+
}
|
|
149
|
+
get bodyBlocks() {
|
|
150
|
+
const out = [];
|
|
151
|
+
this.v.content.split(/\n\s*\n/).map((b) => b.trim()).filter(Boolean).forEach((b) => {
|
|
152
|
+
const lines = b.split('\n');
|
|
153
|
+
if (/^# /.test(b))
|
|
154
|
+
return;
|
|
155
|
+
if (/^#{2,} /.test(b))
|
|
156
|
+
out.push({ kind: 'h3', text: b.replace(/^#+ /, '') });
|
|
157
|
+
else if (lines.every((l) => /^[-*] /.test(l)))
|
|
158
|
+
out.push({ kind: 'ul', items: lines.map((l) => l.slice(2)) });
|
|
159
|
+
else if (lines.every((l) => /^\d+\. /.test(l)))
|
|
160
|
+
out.push({ kind: 'ol', items: lines.map((l) => l.replace(/^\d+\. /, '')) });
|
|
161
|
+
else
|
|
162
|
+
out.push({ kind: 'p', text: b });
|
|
163
|
+
});
|
|
164
|
+
return out;
|
|
165
|
+
}
|
|
166
|
+
// ---- announcements and feedback ----
|
|
167
|
+
say(msg) {
|
|
168
|
+
this.said = '';
|
|
169
|
+
clearTimeout(this.sayTimer);
|
|
170
|
+
this.sayTimer = setTimeout(() => (this.said = msg), 60);
|
|
171
|
+
}
|
|
172
|
+
flash(key) {
|
|
173
|
+
this.flashed = key;
|
|
174
|
+
clearTimeout(this.flashTimer);
|
|
175
|
+
this.flashTimer = setTimeout(() => (this.flashed = null), 1600);
|
|
176
|
+
}
|
|
177
|
+
// ---- actions ----
|
|
178
|
+
pick(nn) {
|
|
179
|
+
if (nn === this.i)
|
|
180
|
+
return;
|
|
181
|
+
if (!this.controlled)
|
|
182
|
+
this.curIndex = nn;
|
|
183
|
+
this.versionChange.emit(nn);
|
|
184
|
+
this.say(`Showing v${nn + 1}, ${this.versions[nn].meta}`);
|
|
185
|
+
}
|
|
186
|
+
copy(key) {
|
|
187
|
+
try {
|
|
188
|
+
navigator.clipboard?.writeText(this.v.content).catch(() => { });
|
|
189
|
+
}
|
|
190
|
+
catch { /* the page may not write to the clipboard */ }
|
|
191
|
+
this.flash(key);
|
|
192
|
+
this.say(`Copied ${this.v.title}, v${this.i + 1}, to the clipboard`);
|
|
193
|
+
this.copied.emit(this.i);
|
|
194
|
+
}
|
|
195
|
+
download(key) {
|
|
196
|
+
const name = `${this.fileName ?? slug(this.v.title)}-v${this.i + 1}.${this.ext}`;
|
|
197
|
+
const url = URL.createObjectURL(new Blob([this.v.content], { type: MIME[this.ext] ?? 'text/plain' }));
|
|
198
|
+
const a = document.createElement('a');
|
|
199
|
+
a.href = url;
|
|
200
|
+
a.download = name;
|
|
201
|
+
a.hidden = true;
|
|
202
|
+
document.body.append(a);
|
|
203
|
+
a.click();
|
|
204
|
+
a.remove();
|
|
205
|
+
setTimeout(() => URL.revokeObjectURL(url), 5000);
|
|
206
|
+
this.flash(key);
|
|
207
|
+
this.say(`Downloaded ${name}`);
|
|
208
|
+
this.downloaded.emit(this.i);
|
|
209
|
+
}
|
|
210
|
+
open(kindOf, opener, src) {
|
|
211
|
+
if (this.writing)
|
|
212
|
+
return;
|
|
213
|
+
if (this.opened.observed) {
|
|
214
|
+
this.opened.emit(this.i);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
this.openerEl = opener;
|
|
218
|
+
this.reading = { kind: kindOf, src, opener };
|
|
219
|
+
this.say(`Opened ${this.v.title}, v${this.i + 1}`);
|
|
220
|
+
// move focus into the dialog once it renders
|
|
221
|
+
setTimeout(() => this.closeBtn?.nativeElement.focus({ preventScroll: true }));
|
|
222
|
+
}
|
|
223
|
+
closeReader() {
|
|
224
|
+
this.reading = null;
|
|
225
|
+
this.openerEl?.focus({ preventScroll: true });
|
|
226
|
+
}
|
|
227
|
+
readerKeys(e) {
|
|
228
|
+
if (e.key === 'Escape') {
|
|
229
|
+
e.preventDefault();
|
|
230
|
+
e.stopPropagation();
|
|
231
|
+
this.closeReader();
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
if (e.key !== 'Tab' || !this.pan)
|
|
235
|
+
return;
|
|
236
|
+
const f = [...this.pan.nativeElement.querySelectorAll('button,[tabindex="0"]')];
|
|
237
|
+
const first = f[0], lastEl = f[f.length - 1];
|
|
238
|
+
if (e.shiftKey && (document.activeElement === first || document.activeElement === this.pan.nativeElement)) {
|
|
239
|
+
e.preventDefault();
|
|
240
|
+
lastEl?.focus();
|
|
241
|
+
}
|
|
242
|
+
else if (!e.shiftKey && document.activeElement === lastEl) {
|
|
243
|
+
e.preventDefault();
|
|
244
|
+
first?.focus();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// ---- versions menu ----
|
|
248
|
+
toggleMenu(trigger) {
|
|
249
|
+
this.menuOpen ? this.closeMenu() : this.openMenu(trigger);
|
|
250
|
+
}
|
|
251
|
+
openMenu(trigger) {
|
|
252
|
+
this.openerTrigger = trigger;
|
|
253
|
+
this.menuOpen = true;
|
|
254
|
+
setTimeout(() => {
|
|
255
|
+
this.placeMenu(trigger);
|
|
256
|
+
const menu = this.menuEl?.nativeElement;
|
|
257
|
+
const b = menu?.querySelector('[aria-checked="true"]') ?? menu?.querySelector('.vo-mi');
|
|
258
|
+
b?.focus({ preventScroll: true });
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
closeMenu() { this.menuOpen = false; }
|
|
262
|
+
placeMenu(trigger) {
|
|
263
|
+
const menu = this.menuEl?.nativeElement, host = this.host.nativeElement;
|
|
264
|
+
if (!menu)
|
|
265
|
+
return;
|
|
266
|
+
const hr = host.getBoundingClientRect(), br = trigger.getBoundingClientRect();
|
|
267
|
+
this.menuLeft = Math.round(br.left - hr.left - 6);
|
|
268
|
+
this.menuTop = Math.round(br.bottom - hr.top + 6);
|
|
269
|
+
}
|
|
270
|
+
pickFromMenu(nn) {
|
|
271
|
+
this.pick(nn);
|
|
272
|
+
this.closeMenu();
|
|
273
|
+
this.openerTrigger?.focus({ preventScroll: true });
|
|
274
|
+
}
|
|
275
|
+
triggerKeys(e) {
|
|
276
|
+
if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {
|
|
277
|
+
e.preventDefault();
|
|
278
|
+
this.openMenu(e.currentTarget);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
menuKeys(e) {
|
|
282
|
+
const menu = this.menuEl?.nativeElement;
|
|
283
|
+
const it = [...(menu?.querySelectorAll('.vo-mi') ?? [])];
|
|
284
|
+
const k = it.indexOf(document.activeElement);
|
|
285
|
+
if (e.key === 'ArrowDown') {
|
|
286
|
+
e.preventDefault();
|
|
287
|
+
it[(k + 1) % it.length]?.focus();
|
|
288
|
+
}
|
|
289
|
+
else if (e.key === 'ArrowUp') {
|
|
290
|
+
e.preventDefault();
|
|
291
|
+
it[(k - 1 + it.length) % it.length]?.focus();
|
|
292
|
+
}
|
|
293
|
+
else if (e.key === 'Home') {
|
|
294
|
+
e.preventDefault();
|
|
295
|
+
it[0]?.focus();
|
|
296
|
+
}
|
|
297
|
+
else if (e.key === 'End') {
|
|
298
|
+
e.preventDefault();
|
|
299
|
+
it[it.length - 1]?.focus();
|
|
300
|
+
}
|
|
301
|
+
else if (e.key === 'Escape') {
|
|
302
|
+
e.preventDefault();
|
|
303
|
+
e.stopPropagation();
|
|
304
|
+
this.closeMenu();
|
|
305
|
+
this.openerTrigger?.focus({ preventScroll: true });
|
|
306
|
+
}
|
|
307
|
+
else if (e.key === 'Tab') {
|
|
308
|
+
this.closeMenu();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// ---- stack ----
|
|
312
|
+
setPeek(nn) { this.peek = nn; }
|
|
313
|
+
sheetStyle(nn) {
|
|
314
|
+
if (this.fanned) {
|
|
315
|
+
const o = nn - this.last / 2;
|
|
316
|
+
return {
|
|
317
|
+
transform: `translate(calc(${o} * var(--vo-fx)),${Math.abs(o) * 6 + (this.peek === nn ? -8 : 0)}px) rotate(${o * 6}deg)`,
|
|
318
|
+
'z-index': this.peek === nn ? 9 : nn + 1,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
const behind = this.versions.map((_, k) => k).reverse().filter((k) => k !== this.i);
|
|
322
|
+
const d = nn === this.i ? 0 : behind.indexOf(nn) + 1;
|
|
323
|
+
return { '--vo-d': d, 'z-index': this.n - d };
|
|
324
|
+
}
|
|
325
|
+
fan(on, focus = false) {
|
|
326
|
+
if (this.writing)
|
|
327
|
+
return;
|
|
328
|
+
this.fanned = on;
|
|
329
|
+
this.peek = null;
|
|
330
|
+
if (on && focus) {
|
|
331
|
+
setTimeout(() => this.desk?.nativeElement.querySelector(`[data-i="${this.i}"]`)?.focus({ preventScroll: true }));
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
sheetClick(nn, el) {
|
|
335
|
+
if (this.writing)
|
|
336
|
+
return;
|
|
337
|
+
if (this.fanned) {
|
|
338
|
+
this.pick(nn);
|
|
339
|
+
this.fan(false);
|
|
340
|
+
this.fanBtn?.nativeElement.focus({ preventScroll: true });
|
|
341
|
+
}
|
|
342
|
+
else
|
|
343
|
+
this.open('page', this.host.nativeElement.querySelector('.vo-afx-open'), el);
|
|
344
|
+
}
|
|
345
|
+
openStack(opener) {
|
|
346
|
+
if (this.writing)
|
|
347
|
+
return;
|
|
348
|
+
if (this.fanned)
|
|
349
|
+
this.fan(false);
|
|
350
|
+
this.open('page', opener, this.desk?.nativeElement.querySelector(`[data-i="${this.i}"]`) ?? null);
|
|
351
|
+
}
|
|
352
|
+
deskKeys(e) {
|
|
353
|
+
if (!this.fanned)
|
|
354
|
+
return;
|
|
355
|
+
const sheets = [...(this.desk?.nativeElement.querySelectorAll('.vo-afx-sh') ?? [])];
|
|
356
|
+
const k = sheets.indexOf(document.activeElement);
|
|
357
|
+
let nn = null;
|
|
358
|
+
if (e.key === 'ArrowRight' || e.key === 'ArrowDown')
|
|
359
|
+
nn = Math.min(this.last, k + 1);
|
|
360
|
+
else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp')
|
|
361
|
+
nn = Math.max(0, k - 1);
|
|
362
|
+
else if (e.key === 'Home')
|
|
363
|
+
nn = 0;
|
|
364
|
+
else if (e.key === 'End')
|
|
365
|
+
nn = this.last;
|
|
366
|
+
else if (e.key === 'Escape') {
|
|
367
|
+
e.preventDefault();
|
|
368
|
+
e.stopPropagation();
|
|
369
|
+
this.fan(false);
|
|
370
|
+
this.fanBtn?.nativeElement.focus({ preventScroll: true });
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
else if (e.key === 'Tab') {
|
|
374
|
+
this.fan(false);
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
if (nn != null) {
|
|
378
|
+
e.preventDefault();
|
|
379
|
+
sheets[nn]?.focus();
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// writing: a blank sheet drops onto the stack, the title is typed, and a pen draws each line of the new page
|
|
383
|
+
restartStack() {
|
|
384
|
+
this.clearStack();
|
|
385
|
+
if (this.variant !== 'stack' || !this.writing)
|
|
386
|
+
return;
|
|
387
|
+
setTimeout(() => this.runStack());
|
|
388
|
+
}
|
|
389
|
+
clearStack() {
|
|
390
|
+
this.stackTimers.forEach(clearTimeout);
|
|
391
|
+
this.stackTimers = [];
|
|
392
|
+
this.stackAnims.forEach((a) => a.cancel());
|
|
393
|
+
this.stackAnims = [];
|
|
394
|
+
this.typedTitle = '';
|
|
395
|
+
}
|
|
396
|
+
runStack() {
|
|
397
|
+
const sh = this.desk?.nativeElement.querySelector(`[data-i="${this.last}"]`);
|
|
398
|
+
if (!sh)
|
|
399
|
+
return;
|
|
400
|
+
let alive = true;
|
|
401
|
+
const onDone = () => (alive = false);
|
|
402
|
+
this.stackTimers.push(setTimeout(onDone, 60_000));
|
|
403
|
+
const sleep = (ms) => new Promise((res, rej) => this.stackTimers.push(setTimeout(() => (alive ? res() : rej(new Error('stop'))), ms)));
|
|
404
|
+
const motion = !this.motion.reduce();
|
|
405
|
+
const E = getComputedStyle(sh).getPropertyValue('--vo-ease').trim() || 'ease';
|
|
406
|
+
const T = this.versions[this.last]?.title ?? '';
|
|
407
|
+
void (async () => {
|
|
408
|
+
if (motion)
|
|
409
|
+
this.stackAnims.push(sh.animate([{ transform: 'translateY(-36px)', opacity: 0 }, { transform: 'none', opacity: 1 }], { duration: 700, easing: E, composite: 'add' }));
|
|
410
|
+
this.typedTitle = '';
|
|
411
|
+
await sleep(300);
|
|
412
|
+
if (!motion)
|
|
413
|
+
this.typedTitle = T;
|
|
414
|
+
else
|
|
415
|
+
for (let k = 1; k <= T.length; k++) {
|
|
416
|
+
this.typedTitle = T.slice(0, k);
|
|
417
|
+
await sleep(40);
|
|
418
|
+
}
|
|
419
|
+
await sleep(motion ? 250 : 0);
|
|
420
|
+
const pen = sh.querySelector('.vo-afx-pen');
|
|
421
|
+
const rows = [...sh.querySelectorAll('.vo-afx-r')].filter((x) => x.offsetParent);
|
|
422
|
+
for (const x of rows) {
|
|
423
|
+
const line = x.querySelector('i'), dot = x.querySelector('b');
|
|
424
|
+
if (!motion) {
|
|
425
|
+
this.stackAnims.push(line.animate([{ transform: 'none' }], { fill: 'forwards' }));
|
|
426
|
+
if (dot)
|
|
427
|
+
this.stackAnims.push(dot.animate([{ transform: 'none' }], { fill: 'forwards' }));
|
|
428
|
+
await sleep(150);
|
|
429
|
+
continue;
|
|
430
|
+
}
|
|
431
|
+
const x0 = x.offsetLeft + line.offsetLeft, x1 = x0 + line.offsetWidth, y = x.offsetTop + x.offsetHeight / 2 - 3.5, ms = 260 + line.offsetWidth * 1.4;
|
|
432
|
+
if (dot)
|
|
433
|
+
this.stackAnims.push(dot.animate([{ transform: 'scaleX(0)' }, { transform: 'none' }], { duration: 120, fill: 'forwards' }));
|
|
434
|
+
this.stackAnims.push(line.animate([{ transform: 'scaleX(0)' }, { transform: 'scaleX(1)' }], { duration: ms, easing: 'cubic-bezier(.4,0,.3,1)', fill: 'forwards' }));
|
|
435
|
+
if (pen)
|
|
436
|
+
this.stackAnims.push(pen.animate([{ transform: `translate(${x0 - 3}px,${y}px)`, opacity: 1 }, { transform: `translate(${x1 - 3}px,${y}px)`, opacity: 1 }], { duration: ms, easing: 'cubic-bezier(.4,0,.3,1)', fill: 'forwards' }));
|
|
437
|
+
await sleep(ms + 70);
|
|
438
|
+
}
|
|
439
|
+
pen?.getAnimations().forEach((a) => a.cancel());
|
|
440
|
+
})().catch(() => { });
|
|
441
|
+
}
|
|
442
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ArtifactCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
443
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ArtifactCardComponent, isStandalone: true, selector: "vo-artifact-card", inputs: { variant: "variant", versions: "versions", version: "version", defaultVersion: "defaultVersion", state: "state", status: "status", progress: "progress", kind: "kind", icon: "icon", fileName: "fileName", ext: "ext", openLabel: "openLabel", className: "className" }, outputs: { versionChange: "versionChange", opened: "opened", copied: "copied", downloaded: "downloaded" }, viewQueries: [{ propertyName: "menuEl", first: true, predicate: ["menuEl"], descendants: true }, { propertyName: "desk", first: true, predicate: ["desk"], descendants: true }, { propertyName: "fanBtn", first: true, predicate: ["fanBtn"], descendants: true }, { propertyName: "pan", first: true, predicate: ["pan"], descendants: true }, { propertyName: "closeBtn", first: true, predicate: ["closeBtn"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
444
|
+
<div data-vo="" class="vo-afx" [class]="className">
|
|
445
|
+
<!-- compact: an icon, the name, one line of meta and Open -->
|
|
446
|
+
@if (variant === 'compact') {
|
|
447
|
+
<div class="vo-afx-w">
|
|
448
|
+
<div class="vo-afx-cp-card vo-afx-card" [class.vo-is-writing]="writing">
|
|
449
|
+
<span class="vo-afx-ic"><span class="vo-spin" aria-hidden="true"></span><vo-icon [name]="icon"></vo-icon></span>
|
|
450
|
+
<div class="vo-afx-cp-tx"><div class="vo-afx-cp-t">{{ v.title }}</div>
|
|
451
|
+
<ng-container [ngTemplateOutlet]="metaLine"></ng-container>
|
|
452
|
+
</div>
|
|
453
|
+
<div class="vo-afx-cp-act">
|
|
454
|
+
<ng-container [ngTemplateOutlet]="actions"></ng-container>
|
|
455
|
+
<button type="button" class="vo-pill vo-sm vo-accent vo-afx-open" [attr.aria-label]="openLabel ?? 'Open ' + v.title"
|
|
456
|
+
[disabled]="writing" (click)="open('view', $any($event.currentTarget), null)"><vo-icon name="ext"></vo-icon><span class="vo-afx-lbl">Open</span></button>
|
|
457
|
+
</div>
|
|
458
|
+
@if (writing) {
|
|
459
|
+
<span class="vo-afx-cp-bar" aria-hidden="true" [style.transform]="'scaleX(' + clamp(progress) + ')'"></span>
|
|
460
|
+
}
|
|
461
|
+
</div>
|
|
462
|
+
<ng-container [ngTemplateOutlet]="versionsMenu"></ng-container>
|
|
463
|
+
</div>
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
<!-- preview: the same card with the first page showing -->
|
|
467
|
+
@if (variant === 'preview') {
|
|
468
|
+
<div class="vo-afx-w vo-afx-pv">
|
|
469
|
+
<div class="vo-afx-pv-card vo-afx-card" [class.vo-is-writing]="writing">
|
|
470
|
+
<div class="vo-afx-pv-prev" aria-hidden="true">
|
|
471
|
+
<div class="vo-afx-pv-page" #pvPage>
|
|
472
|
+
<div class="vo-afx-pv-k"><span class="vo-afx-wr">Writing…</span><span class="vo-afx-fin">{{ kind }} · v{{ i + 1 }}</span></div>
|
|
473
|
+
<div class="vo-afx-pv-h">{{ v.title }}</div>
|
|
474
|
+
<p class="vo-afx-pv-p">{{ summary }}@if (writing) {<span class="vo-afx-caret"></span>}</p>
|
|
475
|
+
<div class="vo-afx-pv-ls">
|
|
476
|
+
@for (w of previewWidths; track $index) {
|
|
477
|
+
<i [style.--vo-w]="w + '%'"></i>
|
|
478
|
+
}
|
|
479
|
+
</div>
|
|
480
|
+
</div>
|
|
481
|
+
</div>
|
|
482
|
+
<div class="vo-afx-pv-meta">
|
|
483
|
+
<span class="vo-afx-ic"><span class="vo-spin" aria-hidden="true"></span><vo-icon [name]="icon"></vo-icon></span>
|
|
484
|
+
<div class="vo-afx-pv-tx"><div class="vo-afx-pv-t">{{ v.title }}</div>
|
|
485
|
+
<ng-container [ngTemplateOutlet]="metaLine"></ng-container>
|
|
486
|
+
</div>
|
|
487
|
+
<div class="vo-afx-pv-act">
|
|
488
|
+
<ng-container [ngTemplateOutlet]="actions"></ng-container>
|
|
489
|
+
<button type="button" class="vo-ib vo-afx-open" [attr.aria-label]="openLabel ?? 'Open ' + v.title"
|
|
490
|
+
[disabled]="writing" (click)="open('page', $any($event.currentTarget), pvPage)"><vo-icon name="ext"></vo-icon></button>
|
|
491
|
+
</div>
|
|
492
|
+
</div>
|
|
493
|
+
</div>
|
|
494
|
+
<ng-container [ngTemplateOutlet]="versionsMenu"></ng-container>
|
|
495
|
+
</div>
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
<!-- inline: one line inside the message; versions and actions fold out on hover or focus -->
|
|
499
|
+
@if (variant === 'inline') {
|
|
500
|
+
<div class="vo-afx-w">
|
|
501
|
+
<span class="vo-afx-chip" [class.vo-is-writing]="writing" [class.vo-pin]="menuOpen">
|
|
502
|
+
<button type="button" class="vo-afx-in-main" [disabled]="writing" (click)="open('view', $any($event.currentTarget), null)">
|
|
503
|
+
<span class="vo-afx-in-ic"><span class="vo-spin" aria-hidden="true"></span><vo-icon [name]="icon" size="sm"></vo-icon></span>
|
|
504
|
+
<span class="vo-afx-in-t"><span class="vo-afx-sr">Open </span>{{ v.title }}</span>
|
|
505
|
+
<span class="vo-afx-in-m"><span class="vo-afx-wr vo-shim">{{ status }}</span>
|
|
506
|
+
<span class="vo-afx-fin" [class.vo-enter]="settled"><span class="vo-afx-v">v{{ i + 1 }}</span><span class="vo-afx-msep" aria-hidden="true">·</span><span class="vo-afx-when" [innerHTML]="whenHtml(v.meta)"></span></span></span>
|
|
507
|
+
</button>
|
|
508
|
+
<span class="vo-afx-tray"><span>
|
|
509
|
+
<span class="vo-afx-tsep" aria-hidden="true"></span>
|
|
510
|
+
@if (n > 1) {
|
|
511
|
+
<button type="button" class="vo-ib vo-afx-vb3" aria-label="Versions" aria-haspopup="menu"
|
|
512
|
+
[attr.aria-expanded]="menuOpen" (click)="toggleMenu($any($event.currentTarget))" (keydown)="triggerKeys($event)"><vo-icon name="clock" size="sm"></vo-icon></button>
|
|
513
|
+
}
|
|
514
|
+
<ng-container [ngTemplateOutlet]="actions"></ng-container>
|
|
515
|
+
</span></span>
|
|
516
|
+
</span>
|
|
517
|
+
<ng-container [ngTemplateOutlet]="versionsMenu"></ng-container>
|
|
518
|
+
</div>
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
<!-- stack: the report as a stack of paper; Versions lays the sheets out to pick one -->
|
|
522
|
+
@if (variant === 'stack') {
|
|
523
|
+
<div class="vo-afx-w vo-afx-st" [class.vo-is-writing]="writing" [class.vo-fan]="fanned">
|
|
524
|
+
<div class="vo-afx-desk" #desk>
|
|
525
|
+
<div class="vo-afx-stack" role="menu" [attr.aria-label]="'Versions of ' + v.title" [attr.aria-hidden]="!fanned" (keydown)="deskKeys($event)">
|
|
526
|
+
@for (x of versions; track shIdx; let shIdx = $index) {
|
|
527
|
+
<button type="button" class="vo-afx-sh" [class.vo-blank]="writing && shIdx === last" role="menuitemradio"
|
|
528
|
+
[attr.data-i]="shIdx" [attr.aria-checked]="shIdx === i" [attr.tabindex]="fanned && shIdx === i ? 0 : -1"
|
|
529
|
+
[attr.aria-label]="'v' + (shIdx + 1) + ', ' + x.meta + (x.note ? ': ' + x.note : '')" [style]="sheetStyle(shIdx)"
|
|
530
|
+
(click)="sheetClick(shIdx, $any($event.currentTarget))"
|
|
531
|
+
(pointerenter)="fanned && setPeek(shIdx)" (pointerleave)="fanned && setPeek(null)"
|
|
532
|
+
(focus)="fanned && setPeek(shIdx)" (blur)="fanned && setPeek(null)">
|
|
533
|
+
<span class="vo-afx-pg" aria-hidden="true">
|
|
534
|
+
<span class="vo-afx-st-k"><span>{{ writing && shIdx === last ? 'Writing…' : 'v' + (shIdx + 1) }}</span></span>
|
|
535
|
+
<span class="vo-afx-st-h">{{ writing && shIdx === last ? typedTitle : x.title }}</span>
|
|
536
|
+
<span class="vo-afx-st-ls">
|
|
537
|
+
@for (ln of stackLines(shIdx); track lnIdx; let lnIdx = $index) {
|
|
538
|
+
@if (ln.t === 's') {
|
|
539
|
+
<span class="vo-afx-gap"></span>
|
|
540
|
+
} @else {
|
|
541
|
+
<span class="vo-afx-r" [class.vo-n]="ln.t === 'n'">@if (ln.t !== 'p') {<b></b>}<i [style.--vo-w]="ln.w + '%'"></i></span>
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
</span>
|
|
545
|
+
@if (shIdx === last) {<span class="vo-afx-pen"></span>}
|
|
546
|
+
</span>
|
|
547
|
+
<span class="vo-afx-tab" aria-hidden="true"><vo-icon name="check" size="xs"></vo-icon><span>v{{ shIdx + 1 }}</span><span class="vo-afx-ta"> · {{ shortMeta(x.meta) }}</span></span>
|
|
548
|
+
</button>
|
|
549
|
+
}
|
|
550
|
+
</div>
|
|
551
|
+
</div>
|
|
552
|
+
<div class="vo-afx-cap">
|
|
553
|
+
<div class="vo-afx-st-t">{{ v.title }}</div>
|
|
554
|
+
<div class="vo-afx-meta vo-afx-st-m"><span class="vo-afx-wr vo-shim">{{ status }}</span>
|
|
555
|
+
<span class="vo-afx-fin" [class.vo-enter]="settled"><span>{{ kind }}</span><span aria-hidden="true">·</span><span class="vo-afx-v">v{{ shown + 1 }}</span><span aria-hidden="true">·</span><span class="vo-afx-when" [innerHTML]="whenHtml(versions[shown].meta)"></span></span>
|
|
556
|
+
</div>
|
|
557
|
+
<div class="vo-fold vo-afx-nw" [class.vo-shut]="!fanned"><div><div class="vo-afx-note">{{ versions[shown].note }}</div></div></div>
|
|
558
|
+
</div>
|
|
559
|
+
<div class="vo-afx-st-act">
|
|
560
|
+
@if (n > 1) {
|
|
561
|
+
<button type="button" class="vo-pill vo-sm vo-line vo-afx-fan" #fanBtn aria-haspopup="menu" [attr.aria-expanded]="fanned" (click)="fan(!fanned, true)"><vo-icon name="clock"></vo-icon><span>Versions</span></button>
|
|
562
|
+
}
|
|
563
|
+
<ng-container [ngTemplateOutlet]="actions"></ng-container>
|
|
564
|
+
<button type="button" class="vo-pill vo-sm vo-accent vo-afx-open" [attr.aria-label]="openLabel ?? 'Open ' + v.title"
|
|
565
|
+
[disabled]="writing" (click)="openStack($any($event.currentTarget))"><vo-icon name="ext"></vo-icon><span class="vo-afx-lbl">Open</span></button>
|
|
566
|
+
</div>
|
|
567
|
+
</div>
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
<!-- the opened file: a modal reader over the card's nearest positioned ancestor -->
|
|
571
|
+
@if (reading) {
|
|
572
|
+
<div class="vo-afx-sheet" #sheet (keydown)="readerKeys($event)">
|
|
573
|
+
<div class="vo-afx-scrim" #scrim (click)="closeReader()"></div>
|
|
574
|
+
<div class="vo-afx-pan" [class.vo-afx-page]="reading.kind === 'page'" [class.vo-afx-view]="reading.kind === 'view'"
|
|
575
|
+
role="dialog" aria-modal="true" [attr.aria-label]="v.title" tabindex="-1" #pan>
|
|
576
|
+
<div class="vo-afx-ph">
|
|
577
|
+
<span class="vo-afx-ic" aria-hidden="true"><vo-icon [name]="icon"></vo-icon></span>
|
|
578
|
+
<div class="vo-afx-ptx"><div class="vo-afx-pt">{{ v.title }}</div><div class="vo-afx-pm">{{ kind }} · v{{ i + 1 }} · {{ v.meta }}</div></div>
|
|
579
|
+
<button type="button" class="vo-ib vo-afx-x" aria-label="Close" #closeBtn (click)="closeReader()"><vo-icon name="x"></vo-icon></button>
|
|
580
|
+
</div>
|
|
581
|
+
<div class="vo-afx-pb" tabindex="0" role="region" [attr.aria-label]="v.title + ', v' + (i + 1)">
|
|
582
|
+
@if (ext === 'csv') {
|
|
583
|
+
<table class="vo-afx-tb">
|
|
584
|
+
<thead><tr>@for (h of csvRows[0]; track $index) {<th scope="col" [class.vo-num]="$index">{{ h }}</th>}</tr></thead>
|
|
585
|
+
<tbody>@for (row of csvRows.slice(1); track $index) {
|
|
586
|
+
<tr>@for (cell of row; track $index) {
|
|
587
|
+
@if ($index) {<td class="vo-num">{{ cell }}</td>} @else {<th scope="row">{{ cell }}</th>}
|
|
588
|
+
}</tr>
|
|
589
|
+
}</tbody>
|
|
590
|
+
</table>
|
|
591
|
+
} @else {
|
|
592
|
+
@for (b of bodyBlocks; track $index) {
|
|
593
|
+
@switch (b.kind) {
|
|
594
|
+
@case ('h3') { <h3>{{ b.text }}</h3> }
|
|
595
|
+
@case ('ul') { <ul>@for (li of b.items; track $index) {<li>{{ li }}</li>}</ul> }
|
|
596
|
+
@case ('ol') { <ol>@for (li of b.items; track $index) {<li>{{ li }}</li>}</ol> }
|
|
597
|
+
@default { <p>{{ b.text }}</p> }
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
</div>
|
|
602
|
+
<div class="vo-afx-pf">
|
|
603
|
+
<button type="button" class="vo-pill vo-sm vo-line vo-afx-copy" [class.vo-copied]="flashed === 'rcopy'" (click)="copy('rcopy')"><vo-icon [name]="flashed === 'rcopy' ? 'check' : 'copy'" size="sm"></vo-icon><span class="vo-afx-lbl">{{ flashed === 'rcopy' ? 'Copied' : 'Copy' }}</span></button>
|
|
604
|
+
<button type="button" class="vo-pill vo-sm vo-line vo-afx-dl" [class.vo-copied]="flashed === 'rdl'" (click)="download('rdl')"><vo-icon [name]="flashed === 'rdl' ? 'check' : 'chev-d'" size="sm"></vo-icon><span class="vo-afx-lbl">{{ flashed === 'rdl' ? 'Downloaded' : 'Download' }}</span></button>
|
|
605
|
+
</div>
|
|
606
|
+
</div>
|
|
607
|
+
</div>
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
<!-- the versions menu, shared by the compact, preview and inline variants -->
|
|
611
|
+
<ng-template #versionsMenu>
|
|
612
|
+
@if (n > 1) {
|
|
613
|
+
<div class="vo-pop vo-afx-menu" [class.vo-open]="menuOpen" role="menu" [attr.aria-label]="'Versions of ' + v.title"
|
|
614
|
+
#menuEl [attr.inert]="menuOpen ? null : ''" [style.left.px]="menuLeft" [style.top.px]="menuTop" (keydown)="menuKeys($event)">
|
|
615
|
+
<div class="vo-ph" aria-hidden="true">Versions</div>
|
|
616
|
+
@for (n2 of reversed; track n2) {
|
|
617
|
+
<button type="button" class="vo-mi" role="menuitemradio" tabindex="-1" [attr.aria-checked]="n2 === i" [attr.data-i]="n2"
|
|
618
|
+
(click)="pickFromMenu(n2)">
|
|
619
|
+
<span class="vo-afx-mb"><span>v{{ n2 + 1 }}<span class="vo-afx-mw"> · {{ shortMeta(versions[n2].meta) }}</span></span>@if (versions[n2].note) {<span class="vo-d">{{ versions[n2].note }}</span>}</span>
|
|
620
|
+
<vo-icon name="check" class="vo-ck" size="sm"></vo-icon>
|
|
621
|
+
</button>
|
|
622
|
+
}
|
|
623
|
+
</div>
|
|
624
|
+
}
|
|
625
|
+
</ng-template>
|
|
626
|
+
|
|
627
|
+
<!-- the meta line, shared by the compact and preview variants -->
|
|
628
|
+
<ng-template #metaLine>
|
|
629
|
+
<div class="vo-afx-meta">
|
|
630
|
+
<span class="vo-afx-wr vo-shim">{{ status }}</span>
|
|
631
|
+
<span class="vo-afx-fin" [class.vo-enter]="settled">
|
|
632
|
+
<span>{{ kind }}</span><span aria-hidden="true">·</span>
|
|
633
|
+
@if (n > 1) {
|
|
634
|
+
<button type="button" class="vo-afx-vb" aria-haspopup="menu" [attr.aria-expanded]="menuOpen"
|
|
635
|
+
[attr.aria-label]="'v' + (i + 1) + ' of ' + n + ' versions'" (click)="toggleMenu($any($event.currentTarget))" (keydown)="triggerKeys($event)"><span class="vo-afx-vt">v{{ i + 1 }}</span><vo-icon name="chev-d" size="xs"></vo-icon></button>
|
|
636
|
+
} @else {
|
|
637
|
+
<span class="vo-afx-v">v1</span>
|
|
638
|
+
}
|
|
639
|
+
<span aria-hidden="true">·</span><span class="vo-afx-when" [innerHTML]="whenHtml(v.meta)"></span>
|
|
640
|
+
</span>
|
|
641
|
+
</div>
|
|
642
|
+
</ng-template>
|
|
643
|
+
|
|
644
|
+
<!-- Copy and Download, shared by every variant -->
|
|
645
|
+
<ng-template #actions>
|
|
646
|
+
<button type="button" class="vo-ib vo-afx-copy" [class.vo-copied]="flashed === 'copy'" [attr.aria-label]="'Copy ' + v.title" (click)="copy('copy')"><vo-icon [name]="flashed === 'copy' ? 'check' : 'copy'" [size]="actionSize"></vo-icon></button>
|
|
647
|
+
<button type="button" class="vo-ib vo-afx-dl" [class.vo-copied]="flashed === 'dl'" [attr.aria-label]="'Download ' + v.title" (click)="download('dl')"><vo-icon [name]="flashed === 'dl' ? 'check' : 'chev-d'" [size]="actionSize"></vo-icon></button>
|
|
648
|
+
</ng-template>
|
|
649
|
+
|
|
650
|
+
<div class="vo-afx-sr" role="status" aria-live="polite">{{ said }}</div>
|
|
651
|
+
</div>
|
|
652
|
+
`, isInline: true, styles: [".vo-afx{--vo-afx-t2:var(--vo-muted);width:100%;container-type:inline-size}.vo-afx.vo-dm>.vo-afx-main{position:relative;min-height:452px;justify-content:center}@container (max-width:400px){.vo-afx.vo-dm>.vo-afx-main{min-height:474px}}:root[data-theme=dark] .vo-afx{--vo-afx-t2:#c0c0c0}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-afx{--vo-afx-t2:#c0c0c0}}.vo-afx>.vo-demo .vo-seg2 button{color:var(--vo-afx-t2)}.vo-afx>.vo-demo .vo-seg2 button[aria-pressed=true]{color:var(--vo-fg)}.vo-afx-sr{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.vo-afx-w{position:relative;width:100%;transition:transform var(--vo-t) var(--vo-ease)}.vo-afx-ic{width:36px;height:36px;border-radius:calc(10px * var(--vo-rk));display:grid;place-items:center;flex:none;background:var(--vo-accent-bg);color:var(--vo-accent-fg,var(--vo-accent))}.vo-afx-ic .vo-spin{display:none}.vo-is-writing .vo-afx-ic .vo-spin{display:inline-block}.vo-is-writing .vo-afx-ic svg{display:none}.vo-afx-meta{display:flex;align-items:center;min-width:0;height:20px;font-size:12.5px;color:var(--vo-afx-t2);white-space:nowrap}.vo-afx-fin{display:flex;align-items:center;gap:5px;min-width:0}.vo-afx-meta .vo-afx-wr{display:none;overflow:hidden;text-overflow:ellipsis}.vo-is-writing .vo-afx-meta .vo-afx-wr{display:inline}.vo-is-writing .vo-afx-meta .vo-afx-fin{display:none}.vo-afx-when{overflow:hidden;text-overflow:ellipsis;min-width:0}.vo-afx-vb{position:relative;z-index:1;display:inline-flex;align-items:center;gap:1px;height:20px;padding:0 3px 0 5px;margin:0 -2px;border-radius:calc(6px * var(--vo-rk));font-size:12.5px;font-weight:500;color:var(--vo-fg);transition:background var(--vo-t-fast)}.vo-afx-vb[aria-expanded=true]{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-afx-vb:hover{background:var(--vo-row)}}.vo-afx-vb .vo-i{color:var(--vo-fg2)}.vo-afx-menu{width:264px;max-width:calc(100% - 16px)}.vo-afx-menu:not(.vo-open){visibility:hidden;transition:opacity .2s var(--vo-ease),transform .35s var(--vo-ease),filter .2s var(--vo-ease),visibility 0s .35s}.vo-afx-menu .vo-ph{color:var(--vo-afx-t2)}.vo-afx-menu .vo-mi{align-items:flex-start;gap:var(--vo-s-2)}.vo-afx-menu .vo-mi:focus-visible{outline-offset:-2px;background:var(--vo-row)}.vo-afx-mb{display:flex;flex-direction:column;min-width:0}.vo-afx-mw{font-weight:400;color:var(--vo-afx-t2)}.vo-afx-menu .vo-mi .vo-d{color:var(--vo-afx-t2);font-weight:400;white-space:normal}@media (hover:hover) and (pointer:fine){.vo-afx-menu .vo-mi:is(:hover,.vo-hl,[aria-checked=true]) .vo-d{color:var(--vo-afx-t2);font-weight:400;white-space:normal}}.vo-afx-menu .vo-mi .vo-ck{margin-top:3px}.vo-afx-card{position:relative}.vo-afx-card .vo-afx-open:after{content:\"\";position:absolute;inset:0;border-radius:inherit}.vo-afx-card .vo-afx-open{transform:none!important}.vo-afx-card :is(.vo-afx-copy,.vo-afx-dl,.vo-afx-vb){position:relative;z-index:1}.vo-afx .vo-copied .vo-afx-lbl{color:var(--vo-fg)}.vo-afx-sheet{position:absolute;inset:0;z-index:20;border-radius:inherit;overflow:hidden}.vo-afx-scrim{position:absolute;inset:0;background:color-mix(in srgb,var(--vo-stage) 78%,transparent)}.vo-afx-pan{position:absolute;display:flex;flex-direction:column;background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow-pop);overflow:hidden;outline:none}.vo-afx-pan.vo-afx-view{inset:0}.vo-afx-pan.vo-afx-page{inset:0;margin:auto;width:min(400px,100%);transform-origin:0 0}.vo-afx-ph{display:flex;align-items:center;gap:10px;padding:10px var(--vo-s-2) 10px 14px;border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-afx-ph .vo-afx-ic{width:30px;height:30px;border-radius:var(--vo-r-sm)}.vo-afx-ptx{flex:1;min-width:0}.vo-afx-pt{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-pm{font-size:12.5px;color:var(--vo-afx-t2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-pb{flex:1;min-height:0;overflow:auto;padding:14px 18px 18px;font-size:13.5px;line-height:1.6;outline:none}.vo-afx-pb:focus-visible{box-shadow:inset 0 0 0 2px var(--vo-focus)}.vo-afx-pb h3{margin:var(--vo-s-4) 0 var(--vo-s-1);font-size:12.5px;font-weight:500;color:var(--vo-afx-t2)}.vo-afx-pb p{margin:0}.vo-afx-pb :is(ul,ol){margin:0;padding-left:18px}.vo-afx-pb li+li{margin-top:3px}.vo-afx-pb li::marker{color:var(--vo-fg2)}.vo-afx-tb{width:100%;border-collapse:collapse;font-size:13px;font-variant-numeric:tabular-nums}.vo-afx-tb :is(th,td){padding:7px var(--vo-s-2);border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent);text-align:left;font-weight:400}.vo-afx-tb thead th{font-size:12.5px;color:var(--vo-afx-t2);font-weight:500}.vo-afx-tb .vo-num{text-align:right}.vo-afx-tb tbody th{font-weight:500}.vo-afx-pf{display:flex;align-items:center;gap:6px;padding:10px 14px;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-afx-pf .vo-pill .vo-afx-lbl{min-width:58px;text-align:left}.vo-afx-pf .vo-pill.vo-copied{color:var(--vo-fg)!important}.vo-afx-pf .vo-pill.vo-copied .vo-i{color:var(--vo-ok)}.vo-afx-cp{max-width:440px;display:flex;flex-direction:column;gap:14px}.vo-afx-cp-a{margin:0;font-size:14px;line-height:1.6;text-wrap:pretty}.vo-afx-cp-list{display:flex;flex-direction:column;gap:var(--vo-s-2)}.vo-afx-cp-card{display:flex;align-items:center;gap:var(--vo-s-3);padding:10px var(--vo-s-2) 10px 10px;border-radius:var(--vo-r-in);background:var(--vo-surface);box-shadow:var(--vo-shadow);transition:background var(--vo-t-fast),box-shadow var(--vo-t-fast);overflow:hidden}@media (hover:hover) and (pointer:fine){.vo-afx-cp-card:not(.vo-is-writing):hover{background:var(--vo-wash)}}@media (hover:hover) and (pointer:fine){:root:not([data-style=soft]) .vo-afx-cp-card:not(.vo-is-writing):hover:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent)}}.vo-afx-cp-tx{flex:1;min-width:0}.vo-afx-cp-t{font-size:13.5px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-cp-act{display:flex;align-items:center;gap:2px;flex:none;transition:opacity var(--vo-t) var(--vo-ease)}.vo-afx-cp-act .vo-pill{margin-left:var(--vo-s-1);gap:6px;padding:0 10px}@media (hover:hover) and (pointer:fine){.vo-afx .vo-afx-open.vo-pill.vo-accent:hover{background:color-mix(in srgb,var(--vo-accent) 86%,#000)}}.vo-is-writing .vo-afx-cp-act{opacity:0;visibility:hidden}.vo-afx-cp-bar{position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--vo-accent-mark);transform-origin:left center;transform:scaleX(0);opacity:0;transition:transform .9s var(--vo-ease),opacity .3s var(--vo-ease)}.vo-is-writing .vo-afx-cp-bar{opacity:1}@container (max-width:400px){.vo-afx-ed{display:none}.vo-afx-fin{gap:var(--vo-s-1)}.vo-afx-card .vo-afx-ic{width:32px;height:32px;border-radius:calc(9px * var(--vo-rk))}.vo-afx-card :is(.vo-afx-copy,.vo-afx-dl,.vo-ib.vo-afx-open){width:28px;height:28px}.vo-afx-cp-act,.vo-afx-pv-act{gap:0}.vo-afx-cp-card{padding-right:6px;gap:10px}.vo-afx-pv-meta{gap:10px;padding-right:6px}.vo-afx-pv-meta .vo-afx-ic,.vo-afx-cp-act .vo-pill .vo-afx-lbl{display:none}.vo-afx-cp-act .vo-pill{width:28px;height:28px;padding:0;margin-left:2px}}.vo-afx-pv{width:min(100%,380px)}.vo-afx-pv-card{border-radius:var(--vo-r-card);background:var(--vo-surface);box-shadow:var(--vo-shadow);transition:box-shadow var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-afx-pv-card:not(.vo-is-writing):hover{box-shadow:var(--vo-shadow-pop)}}@media (hover:hover) and (pointer:fine){:root:not([data-style=soft]) .vo-afx-pv-card:not(.vo-is-writing):hover:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent)}}.vo-afx-pv-prev{position:relative;height:164px;overflow:hidden;padding:18px 22px 0;border-radius:var(--vo-r-card) var(--vo-r-card) 0 0;background:var(--vo-stage);border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-afx-pv-page{height:100%;padding:14px var(--vo-s-4) 0;border-radius:var(--vo-r-sm) var(--vo-r-sm) 0 0;background:var(--vo-surface);box-shadow:var(--vo-shadow);transition:transform var(--vo-t) var(--vo-ease)}@media (hover:hover) and (pointer:fine){.vo-afx-pv-card:not(.vo-is-writing):hover .vo-afx-pv-page{transform:translateY(-3px)}}.vo-afx-pv-k{font-size:11px;line-height:16px;color:var(--vo-afx-t2)}.vo-afx-pv-k .vo-afx-wr,.vo-is-writing .vo-afx-pv-k .vo-afx-fin{display:none}.vo-is-writing .vo-afx-pv-k .vo-afx-wr{display:inline}.vo-afx-pv-h{margin-top:2px;font-size:13px;font-weight:500;line-height:18px}.vo-afx-pv-p{margin:6px 0 0;min-height:54px;font-size:11.5px;line-height:18px;color:var(--vo-fg);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.vo-afx-caret{display:inline-block;width:1.5px;height:12px;margin-left:1px;vertical-align:-2px;background:var(--vo-accent-mark);animation:vo-bpblink 1s steps(1,end) infinite}.vo-afx-pv-ls{display:flex;flex-direction:column;gap:var(--vo-s-2);margin-top:10px;-webkit-mask-image:linear-gradient(#000 0,transparent 44px);mask-image:linear-gradient(#000 0,transparent 44px)}.vo-afx-pv-ls i{display:block;height:4px;border-radius:2px;width:var(--vo-w);background:color-mix(in srgb,var(--vo-fg) 8%,var(--vo-surface));transform-origin:left center;transition:width var(--vo-t) var(--vo-ease)}.vo-is-writing .vo-afx-pv-ls i{transform:scaleX(0)}.vo-afx-pv-meta{display:flex;align-items:center;gap:var(--vo-s-3);padding:var(--vo-s-3) var(--vo-s-2) var(--vo-s-3) 14px}.vo-afx-pv-tx{flex:1;min-width:0}.vo-afx-pv-t{font-size:13.5px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-pv-act{display:flex;align-items:center;gap:2px;flex:none;transition:opacity var(--vo-t) var(--vo-ease)}.vo-is-writing .vo-afx-pv-act{opacity:0;visibility:hidden}.vo-afx-in{max-width:440px;display:flex;flex-direction:column;gap:14px}.vo-afx-in-msg{display:flex;flex-direction:column;gap:10px}.vo-afx-in-msg p{margin:0;font-size:14px;line-height:1.6;text-wrap:pretty}.vo-afx-chip{display:inline-flex;align-items:center;align-self:flex-start;max-width:100%;height:34px;border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);transition:box-shadow var(--vo-t-fast),background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-afx-chip:not(.vo-is-writing):is(:hover,:focus-within,.vo-pin){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent),0 1px 2px #0000000d}}.vo-afx-in-main{display:inline-flex;align-items:center;gap:var(--vo-s-2);min-width:0;height:34px;padding:0 var(--vo-s-3) 0 10px;border-radius:var(--vo-r-pill);font-size:13px}.vo-afx-in-main:focus-visible{outline-offset:-2px!important}.vo-afx-in-ic{display:grid;place-items:center;width:16px;height:16px;flex:none;color:var(--vo-accent-fg,var(--vo-accent))}.vo-afx-in-ic .vo-spin{display:none;width:11px;height:11px}.vo-is-writing .vo-afx-in-ic .vo-spin{display:inline-block}.vo-is-writing .vo-afx-in-ic svg{display:none}.vo-afx-in-t{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.vo-afx-in-m{color:var(--vo-afx-t2);white-space:nowrap;font-size:12.5px}.vo-afx-in-m .vo-afx-wr{display:none}.vo-afx-in-m .vo-afx-fin{display:inline-flex;gap:var(--vo-s-1)}.vo-is-writing .vo-afx-in-m .vo-afx-wr{display:inline}.vo-is-writing .vo-afx-in-m .vo-afx-fin{display:none}.vo-afx-tray{display:grid;grid-template-columns:0fr;opacity:0;transition:grid-template-columns var(--vo-t) var(--vo-ease),opacity var(--vo-t-fast) var(--vo-ease)}.vo-afx-tray>span{display:flex;align-items:center;min-width:0;overflow:hidden}.vo-afx-tray>span>:last-child{margin-right:3px}@media (hover:hover) and (pointer:fine){.vo-afx-chip:not(.vo-is-writing):is(:hover,:focus-within,.vo-pin) .vo-afx-tray{grid-template-columns:1fr;opacity:1}}.vo-afx-tray .vo-ib{width:28px;height:28px}.vo-afx-tray .vo-ib:focus-visible{outline-offset:-2px}.vo-afx-tsep{flex:none;width:1px;height:16px;margin-right:3px;background:var(--vo-line)}@media (hover:none){.vo-afx-chip:not(.vo-is-writing) .vo-afx-tray{grid-template-columns:1fr;opacity:1}}@container (max-width:400px){.vo-afx-in-m :is(.vo-afx-when,.vo-afx-msep){display:none}}.vo-afx-st{display:flex;flex-direction:column;align-items:center;gap:18px;--vo-sw:150px;--vo-sh:194px;--vo-fx:min(122px,calc((100cqw - var(--vo-sw) - 24px) / 2));--vo-ln:color-mix(in srgb,var(--vo-fg) 26%,var(--vo-surface))}@container (max-width:360px){.vo-afx-st{--vo-sw:112px;--vo-sh:146px}}.vo-afx-desk{position:relative;width:var(--vo-sw);height:calc(var(--vo-sh) + 24px)}.vo-afx-desk:before{content:\"\";position:absolute;left:4%;right:4%;bottom:-10px;height:26px;border-radius:50%;background:radial-gradient(closest-side,rgba(0,0,0,.13),transparent);transition:opacity var(--vo-t) var(--vo-ease)}:root[data-theme=dark] .vo-afx-desk:before{background:radial-gradient(closest-side,rgba(0,0,0,.5),transparent)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-afx-desk:before{background:radial-gradient(closest-side,rgba(0,0,0,.5),transparent)}}:root:not([data-style=soft]) .vo-afx-desk:not(:where([data-style=soft],[data-style=soft] *)):before,.vo-afx-st.vo-fan .vo-afx-desk:before{opacity:0}.vo-afx-stack{position:absolute;inset:0}.vo-afx-sh{--vo-pk:-1.5px;position:absolute;left:0;top:12px;width:var(--vo-sw);height:var(--vo-sh);padding:0;text-align:left;border-radius:calc(10px * var(--vo-rk));background:var(--vo-surface);box-shadow:var(--vo-shadow);transform:translate(calc(var(--vo-d,0) * var(--vo-pk)),calc(var(--vo-d,0) * var(--vo-pk)));transition:transform var(--vo-t-slow) var(--vo-ease),box-shadow var(--vo-t) var(--vo-ease)}.vo-afx-st:not(.vo-fan):not(.vo-is-writing):has(:focus-visible) .vo-afx-sh{--vo-pk:-4px}@media (hover:hover) and (pointer:fine){.vo-afx-st:not(.vo-fan):not(.vo-is-writing) .vo-afx-desk:hover .vo-afx-sh{--vo-pk:-4px}}.vo-afx-sh:focus-visible{outline-offset:3px}.vo-afx-st:not(.vo-fan) .vo-afx-sh[aria-checked=true]{box-shadow:var(--vo-shadow-pop)}.vo-afx-st.vo-is-writing .vo-afx-sh{cursor:default}.vo-afx-pg{position:absolute;inset:0;display:flex;flex-direction:column;padding:var(--vo-s-3);border-radius:inherit;overflow:hidden}.vo-afx-st-k{display:flex;align-items:center;justify-content:space-between;font-size:11px;line-height:14px;color:var(--vo-afx-t2)}.vo-afx-st-h{min-height:32px;margin-top:var(--vo-s-1);font-size:12.5px;font-weight:500;line-height:16px;color:var(--vo-fg)}.vo-afx-st-ls{display:flex;flex-direction:column;gap:7px;margin-top:10px}.vo-afx-r{position:relative;display:flex;align-items:center;gap:5px;height:4px}.vo-afx-r i{display:block;height:3px;border-radius:2px;width:var(--vo-w);background:var(--vo-ln);transform-origin:left center}.vo-afx-r b{flex:none;width:4px;height:4px;border-radius:50%;background:var(--vo-ln)}.vo-afx-r.vo-n b{width:6px;height:6px;margin:0 -1px;background:var(--vo-accent-mark)}.vo-afx-gap{height:3px}.vo-afx-st .vo-blank .vo-afx-r :is(i,b){transform:scaleX(0)}.vo-afx-pen{position:absolute;left:0;top:0;width:7px;height:7px;border-radius:50%;background:var(--vo-accent-mark);box-shadow:0 0 0 3px var(--vo-surface);opacity:0;pointer-events:none}@container (max-width:360px){.vo-afx-st-ls{gap:6px;margin-top:var(--vo-s-2)}.vo-afx-st-ls>:nth-child(n+7){display:none}}.vo-afx-tab{position:absolute;left:50%;top:calc(100% + 10px);display:inline-flex;align-items:center;gap:var(--vo-s-1);transform:translate(-50%);white-space:nowrap;font-size:11.5px;color:var(--vo-afx-t2);opacity:0;transition:opacity var(--vo-t) var(--vo-ease)}.vo-afx-tab .vo-i{display:none;color:var(--vo-accent-fg,var(--vo-accent))}.vo-afx-st.vo-fan .vo-afx-tab{opacity:1}.vo-afx-sh[aria-checked=true] .vo-afx-tab{color:var(--vo-fg);font-weight:500}.vo-afx-sh[aria-checked=true] .vo-afx-tab .vo-i{display:inline-block}@container (max-width:360px){.vo-afx-tab .vo-afx-ta{display:none}}.vo-afx-cap{display:flex;flex-direction:column;align-items:center;max-width:100%;text-align:center;transition:margin var(--vo-t) var(--vo-ease)}.vo-afx-st.vo-fan .vo-afx-cap{margin-top:22px}.vo-afx-st-t{font-size:14px;font-weight:500}.vo-afx-st-m{justify-content:center;max-width:100%}.vo-afx-note{padding-top:2px;font-size:12.5px;color:var(--vo-fg)}.vo-afx-st-act{display:flex;align-items:center;gap:var(--vo-s-1);transition:opacity var(--vo-t) var(--vo-ease)}.vo-afx-st-act .vo-pill{gap:6px}.vo-afx-st.vo-is-writing .vo-afx-st-act{opacity:0;visibility:hidden}.vo-i{width:16px;height:16px;flex:none;display:inline-block;vertical-align:-3px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}.vo-i.vo-s{width:14px;height:14px}.vo-i.vo-xs{width:12px;height:12px}.vo-i.vo-l{width:18px;height:18px}.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)}}@keyframes vo-bpblink{50%{opacity:0}}.vo-ib{width:30px;height:30px;border-radius:50%;display:inline-grid;place-items:center;color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),transform .15s}@media (hover:hover) and (pointer:fine){.vo-ib:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-ib:active{transform:scale(.94)}.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-accent{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-accent:hover{background:var(--vo-accent-2)}}.vo-pill.vo-line{background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);color:var(--vo-fg)}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-copied{color:var(--vo-ok)!important}@media (hover:hover) and (pointer:fine){.vo-copied:hover{color:var(--vo-ok)!important}}.vo-pop{position:absolute;z-index:50;min-width:200px;background:var(--vo-raised);border-radius:calc(14px * var(--vo-rk));box-shadow:var(--vo-shadow-pop);padding:6px;opacity:0;visibility:hidden;pointer-events:none;transform:translateY(6px) scale(.98);transform-origin:var(--vo-origin,top left);filter:blur(3px);transition:opacity .2s var(--vo-ease),transform .35s var(--vo-ease),filter .2s var(--vo-ease),visibility 0s .2s}.vo-pop.vo-open{opacity:1;visibility:visible;pointer-events:auto;transform:none;filter:none;transition-property:opacity,transform,filter}.vo-pop .vo-ph{padding:6px var(--vo-s-2) var(--vo-s-1);font-size:11.5px;color:var(--vo-muted)}.vo-mi{display:flex;align-items:center;gap:10px;width:100%;padding:7px var(--vo-s-2);border-radius:calc(9px * var(--vo-rk));font-size:13px;text-align:left;color:var(--vo-fg);cursor:pointer;transition:background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-mi:hover{background:var(--vo-row)}}.vo-mi+.vo-mi{margin-top:2px}.vo-mi .vo-i{color:var(--vo-fg2)}.vo-mi .vo-d{display:block;font-size:12px;color:var(--vo-muted)}.vo-mi .vo-ck{margin-left:auto;color:var(--vo-accent-fg,var(--vo-accent));opacity:0;transition:opacity var(--vo-t-fast)}.vo-mi[aria-checked=true] .vo-ck{opacity:1}.vo-mi[aria-checked=true]{background:var(--vo-row);font-weight:500}.vo-bub{align-self:flex-end;max-width:85%;background:var(--vo-hover);border-radius:var(--vo-r-card);padding:9px 13px;font-size:14px;line-height:1.45}.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-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:hidden;min-height:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
653
|
+
}
|
|
654
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ArtifactCardComponent, decorators: [{
|
|
655
|
+
type: Component,
|
|
656
|
+
args: [{ selector: 'vo-artifact-card', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent, NgTemplateOutlet], template: `
|
|
657
|
+
<div data-vo="" class="vo-afx" [class]="className">
|
|
658
|
+
<!-- compact: an icon, the name, one line of meta and Open -->
|
|
659
|
+
@if (variant === 'compact') {
|
|
660
|
+
<div class="vo-afx-w">
|
|
661
|
+
<div class="vo-afx-cp-card vo-afx-card" [class.vo-is-writing]="writing">
|
|
662
|
+
<span class="vo-afx-ic"><span class="vo-spin" aria-hidden="true"></span><vo-icon [name]="icon"></vo-icon></span>
|
|
663
|
+
<div class="vo-afx-cp-tx"><div class="vo-afx-cp-t">{{ v.title }}</div>
|
|
664
|
+
<ng-container [ngTemplateOutlet]="metaLine"></ng-container>
|
|
665
|
+
</div>
|
|
666
|
+
<div class="vo-afx-cp-act">
|
|
667
|
+
<ng-container [ngTemplateOutlet]="actions"></ng-container>
|
|
668
|
+
<button type="button" class="vo-pill vo-sm vo-accent vo-afx-open" [attr.aria-label]="openLabel ?? 'Open ' + v.title"
|
|
669
|
+
[disabled]="writing" (click)="open('view', $any($event.currentTarget), null)"><vo-icon name="ext"></vo-icon><span class="vo-afx-lbl">Open</span></button>
|
|
670
|
+
</div>
|
|
671
|
+
@if (writing) {
|
|
672
|
+
<span class="vo-afx-cp-bar" aria-hidden="true" [style.transform]="'scaleX(' + clamp(progress) + ')'"></span>
|
|
673
|
+
}
|
|
674
|
+
</div>
|
|
675
|
+
<ng-container [ngTemplateOutlet]="versionsMenu"></ng-container>
|
|
676
|
+
</div>
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
<!-- preview: the same card with the first page showing -->
|
|
680
|
+
@if (variant === 'preview') {
|
|
681
|
+
<div class="vo-afx-w vo-afx-pv">
|
|
682
|
+
<div class="vo-afx-pv-card vo-afx-card" [class.vo-is-writing]="writing">
|
|
683
|
+
<div class="vo-afx-pv-prev" aria-hidden="true">
|
|
684
|
+
<div class="vo-afx-pv-page" #pvPage>
|
|
685
|
+
<div class="vo-afx-pv-k"><span class="vo-afx-wr">Writing…</span><span class="vo-afx-fin">{{ kind }} · v{{ i + 1 }}</span></div>
|
|
686
|
+
<div class="vo-afx-pv-h">{{ v.title }}</div>
|
|
687
|
+
<p class="vo-afx-pv-p">{{ summary }}@if (writing) {<span class="vo-afx-caret"></span>}</p>
|
|
688
|
+
<div class="vo-afx-pv-ls">
|
|
689
|
+
@for (w of previewWidths; track $index) {
|
|
690
|
+
<i [style.--vo-w]="w + '%'"></i>
|
|
691
|
+
}
|
|
692
|
+
</div>
|
|
693
|
+
</div>
|
|
694
|
+
</div>
|
|
695
|
+
<div class="vo-afx-pv-meta">
|
|
696
|
+
<span class="vo-afx-ic"><span class="vo-spin" aria-hidden="true"></span><vo-icon [name]="icon"></vo-icon></span>
|
|
697
|
+
<div class="vo-afx-pv-tx"><div class="vo-afx-pv-t">{{ v.title }}</div>
|
|
698
|
+
<ng-container [ngTemplateOutlet]="metaLine"></ng-container>
|
|
699
|
+
</div>
|
|
700
|
+
<div class="vo-afx-pv-act">
|
|
701
|
+
<ng-container [ngTemplateOutlet]="actions"></ng-container>
|
|
702
|
+
<button type="button" class="vo-ib vo-afx-open" [attr.aria-label]="openLabel ?? 'Open ' + v.title"
|
|
703
|
+
[disabled]="writing" (click)="open('page', $any($event.currentTarget), pvPage)"><vo-icon name="ext"></vo-icon></button>
|
|
704
|
+
</div>
|
|
705
|
+
</div>
|
|
706
|
+
</div>
|
|
707
|
+
<ng-container [ngTemplateOutlet]="versionsMenu"></ng-container>
|
|
708
|
+
</div>
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
<!-- inline: one line inside the message; versions and actions fold out on hover or focus -->
|
|
712
|
+
@if (variant === 'inline') {
|
|
713
|
+
<div class="vo-afx-w">
|
|
714
|
+
<span class="vo-afx-chip" [class.vo-is-writing]="writing" [class.vo-pin]="menuOpen">
|
|
715
|
+
<button type="button" class="vo-afx-in-main" [disabled]="writing" (click)="open('view', $any($event.currentTarget), null)">
|
|
716
|
+
<span class="vo-afx-in-ic"><span class="vo-spin" aria-hidden="true"></span><vo-icon [name]="icon" size="sm"></vo-icon></span>
|
|
717
|
+
<span class="vo-afx-in-t"><span class="vo-afx-sr">Open </span>{{ v.title }}</span>
|
|
718
|
+
<span class="vo-afx-in-m"><span class="vo-afx-wr vo-shim">{{ status }}</span>
|
|
719
|
+
<span class="vo-afx-fin" [class.vo-enter]="settled"><span class="vo-afx-v">v{{ i + 1 }}</span><span class="vo-afx-msep" aria-hidden="true">·</span><span class="vo-afx-when" [innerHTML]="whenHtml(v.meta)"></span></span></span>
|
|
720
|
+
</button>
|
|
721
|
+
<span class="vo-afx-tray"><span>
|
|
722
|
+
<span class="vo-afx-tsep" aria-hidden="true"></span>
|
|
723
|
+
@if (n > 1) {
|
|
724
|
+
<button type="button" class="vo-ib vo-afx-vb3" aria-label="Versions" aria-haspopup="menu"
|
|
725
|
+
[attr.aria-expanded]="menuOpen" (click)="toggleMenu($any($event.currentTarget))" (keydown)="triggerKeys($event)"><vo-icon name="clock" size="sm"></vo-icon></button>
|
|
726
|
+
}
|
|
727
|
+
<ng-container [ngTemplateOutlet]="actions"></ng-container>
|
|
728
|
+
</span></span>
|
|
729
|
+
</span>
|
|
730
|
+
<ng-container [ngTemplateOutlet]="versionsMenu"></ng-container>
|
|
731
|
+
</div>
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
<!-- stack: the report as a stack of paper; Versions lays the sheets out to pick one -->
|
|
735
|
+
@if (variant === 'stack') {
|
|
736
|
+
<div class="vo-afx-w vo-afx-st" [class.vo-is-writing]="writing" [class.vo-fan]="fanned">
|
|
737
|
+
<div class="vo-afx-desk" #desk>
|
|
738
|
+
<div class="vo-afx-stack" role="menu" [attr.aria-label]="'Versions of ' + v.title" [attr.aria-hidden]="!fanned" (keydown)="deskKeys($event)">
|
|
739
|
+
@for (x of versions; track shIdx; let shIdx = $index) {
|
|
740
|
+
<button type="button" class="vo-afx-sh" [class.vo-blank]="writing && shIdx === last" role="menuitemradio"
|
|
741
|
+
[attr.data-i]="shIdx" [attr.aria-checked]="shIdx === i" [attr.tabindex]="fanned && shIdx === i ? 0 : -1"
|
|
742
|
+
[attr.aria-label]="'v' + (shIdx + 1) + ', ' + x.meta + (x.note ? ': ' + x.note : '')" [style]="sheetStyle(shIdx)"
|
|
743
|
+
(click)="sheetClick(shIdx, $any($event.currentTarget))"
|
|
744
|
+
(pointerenter)="fanned && setPeek(shIdx)" (pointerleave)="fanned && setPeek(null)"
|
|
745
|
+
(focus)="fanned && setPeek(shIdx)" (blur)="fanned && setPeek(null)">
|
|
746
|
+
<span class="vo-afx-pg" aria-hidden="true">
|
|
747
|
+
<span class="vo-afx-st-k"><span>{{ writing && shIdx === last ? 'Writing…' : 'v' + (shIdx + 1) }}</span></span>
|
|
748
|
+
<span class="vo-afx-st-h">{{ writing && shIdx === last ? typedTitle : x.title }}</span>
|
|
749
|
+
<span class="vo-afx-st-ls">
|
|
750
|
+
@for (ln of stackLines(shIdx); track lnIdx; let lnIdx = $index) {
|
|
751
|
+
@if (ln.t === 's') {
|
|
752
|
+
<span class="vo-afx-gap"></span>
|
|
753
|
+
} @else {
|
|
754
|
+
<span class="vo-afx-r" [class.vo-n]="ln.t === 'n'">@if (ln.t !== 'p') {<b></b>}<i [style.--vo-w]="ln.w + '%'"></i></span>
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
</span>
|
|
758
|
+
@if (shIdx === last) {<span class="vo-afx-pen"></span>}
|
|
759
|
+
</span>
|
|
760
|
+
<span class="vo-afx-tab" aria-hidden="true"><vo-icon name="check" size="xs"></vo-icon><span>v{{ shIdx + 1 }}</span><span class="vo-afx-ta"> · {{ shortMeta(x.meta) }}</span></span>
|
|
761
|
+
</button>
|
|
762
|
+
}
|
|
763
|
+
</div>
|
|
764
|
+
</div>
|
|
765
|
+
<div class="vo-afx-cap">
|
|
766
|
+
<div class="vo-afx-st-t">{{ v.title }}</div>
|
|
767
|
+
<div class="vo-afx-meta vo-afx-st-m"><span class="vo-afx-wr vo-shim">{{ status }}</span>
|
|
768
|
+
<span class="vo-afx-fin" [class.vo-enter]="settled"><span>{{ kind }}</span><span aria-hidden="true">·</span><span class="vo-afx-v">v{{ shown + 1 }}</span><span aria-hidden="true">·</span><span class="vo-afx-when" [innerHTML]="whenHtml(versions[shown].meta)"></span></span>
|
|
769
|
+
</div>
|
|
770
|
+
<div class="vo-fold vo-afx-nw" [class.vo-shut]="!fanned"><div><div class="vo-afx-note">{{ versions[shown].note }}</div></div></div>
|
|
771
|
+
</div>
|
|
772
|
+
<div class="vo-afx-st-act">
|
|
773
|
+
@if (n > 1) {
|
|
774
|
+
<button type="button" class="vo-pill vo-sm vo-line vo-afx-fan" #fanBtn aria-haspopup="menu" [attr.aria-expanded]="fanned" (click)="fan(!fanned, true)"><vo-icon name="clock"></vo-icon><span>Versions</span></button>
|
|
775
|
+
}
|
|
776
|
+
<ng-container [ngTemplateOutlet]="actions"></ng-container>
|
|
777
|
+
<button type="button" class="vo-pill vo-sm vo-accent vo-afx-open" [attr.aria-label]="openLabel ?? 'Open ' + v.title"
|
|
778
|
+
[disabled]="writing" (click)="openStack($any($event.currentTarget))"><vo-icon name="ext"></vo-icon><span class="vo-afx-lbl">Open</span></button>
|
|
779
|
+
</div>
|
|
780
|
+
</div>
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
<!-- the opened file: a modal reader over the card's nearest positioned ancestor -->
|
|
784
|
+
@if (reading) {
|
|
785
|
+
<div class="vo-afx-sheet" #sheet (keydown)="readerKeys($event)">
|
|
786
|
+
<div class="vo-afx-scrim" #scrim (click)="closeReader()"></div>
|
|
787
|
+
<div class="vo-afx-pan" [class.vo-afx-page]="reading.kind === 'page'" [class.vo-afx-view]="reading.kind === 'view'"
|
|
788
|
+
role="dialog" aria-modal="true" [attr.aria-label]="v.title" tabindex="-1" #pan>
|
|
789
|
+
<div class="vo-afx-ph">
|
|
790
|
+
<span class="vo-afx-ic" aria-hidden="true"><vo-icon [name]="icon"></vo-icon></span>
|
|
791
|
+
<div class="vo-afx-ptx"><div class="vo-afx-pt">{{ v.title }}</div><div class="vo-afx-pm">{{ kind }} · v{{ i + 1 }} · {{ v.meta }}</div></div>
|
|
792
|
+
<button type="button" class="vo-ib vo-afx-x" aria-label="Close" #closeBtn (click)="closeReader()"><vo-icon name="x"></vo-icon></button>
|
|
793
|
+
</div>
|
|
794
|
+
<div class="vo-afx-pb" tabindex="0" role="region" [attr.aria-label]="v.title + ', v' + (i + 1)">
|
|
795
|
+
@if (ext === 'csv') {
|
|
796
|
+
<table class="vo-afx-tb">
|
|
797
|
+
<thead><tr>@for (h of csvRows[0]; track $index) {<th scope="col" [class.vo-num]="$index">{{ h }}</th>}</tr></thead>
|
|
798
|
+
<tbody>@for (row of csvRows.slice(1); track $index) {
|
|
799
|
+
<tr>@for (cell of row; track $index) {
|
|
800
|
+
@if ($index) {<td class="vo-num">{{ cell }}</td>} @else {<th scope="row">{{ cell }}</th>}
|
|
801
|
+
}</tr>
|
|
802
|
+
}</tbody>
|
|
803
|
+
</table>
|
|
804
|
+
} @else {
|
|
805
|
+
@for (b of bodyBlocks; track $index) {
|
|
806
|
+
@switch (b.kind) {
|
|
807
|
+
@case ('h3') { <h3>{{ b.text }}</h3> }
|
|
808
|
+
@case ('ul') { <ul>@for (li of b.items; track $index) {<li>{{ li }}</li>}</ul> }
|
|
809
|
+
@case ('ol') { <ol>@for (li of b.items; track $index) {<li>{{ li }}</li>}</ol> }
|
|
810
|
+
@default { <p>{{ b.text }}</p> }
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
</div>
|
|
815
|
+
<div class="vo-afx-pf">
|
|
816
|
+
<button type="button" class="vo-pill vo-sm vo-line vo-afx-copy" [class.vo-copied]="flashed === 'rcopy'" (click)="copy('rcopy')"><vo-icon [name]="flashed === 'rcopy' ? 'check' : 'copy'" size="sm"></vo-icon><span class="vo-afx-lbl">{{ flashed === 'rcopy' ? 'Copied' : 'Copy' }}</span></button>
|
|
817
|
+
<button type="button" class="vo-pill vo-sm vo-line vo-afx-dl" [class.vo-copied]="flashed === 'rdl'" (click)="download('rdl')"><vo-icon [name]="flashed === 'rdl' ? 'check' : 'chev-d'" size="sm"></vo-icon><span class="vo-afx-lbl">{{ flashed === 'rdl' ? 'Downloaded' : 'Download' }}</span></button>
|
|
818
|
+
</div>
|
|
819
|
+
</div>
|
|
820
|
+
</div>
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
<!-- the versions menu, shared by the compact, preview and inline variants -->
|
|
824
|
+
<ng-template #versionsMenu>
|
|
825
|
+
@if (n > 1) {
|
|
826
|
+
<div class="vo-pop vo-afx-menu" [class.vo-open]="menuOpen" role="menu" [attr.aria-label]="'Versions of ' + v.title"
|
|
827
|
+
#menuEl [attr.inert]="menuOpen ? null : ''" [style.left.px]="menuLeft" [style.top.px]="menuTop" (keydown)="menuKeys($event)">
|
|
828
|
+
<div class="vo-ph" aria-hidden="true">Versions</div>
|
|
829
|
+
@for (n2 of reversed; track n2) {
|
|
830
|
+
<button type="button" class="vo-mi" role="menuitemradio" tabindex="-1" [attr.aria-checked]="n2 === i" [attr.data-i]="n2"
|
|
831
|
+
(click)="pickFromMenu(n2)">
|
|
832
|
+
<span class="vo-afx-mb"><span>v{{ n2 + 1 }}<span class="vo-afx-mw"> · {{ shortMeta(versions[n2].meta) }}</span></span>@if (versions[n2].note) {<span class="vo-d">{{ versions[n2].note }}</span>}</span>
|
|
833
|
+
<vo-icon name="check" class="vo-ck" size="sm"></vo-icon>
|
|
834
|
+
</button>
|
|
835
|
+
}
|
|
836
|
+
</div>
|
|
837
|
+
}
|
|
838
|
+
</ng-template>
|
|
839
|
+
|
|
840
|
+
<!-- the meta line, shared by the compact and preview variants -->
|
|
841
|
+
<ng-template #metaLine>
|
|
842
|
+
<div class="vo-afx-meta">
|
|
843
|
+
<span class="vo-afx-wr vo-shim">{{ status }}</span>
|
|
844
|
+
<span class="vo-afx-fin" [class.vo-enter]="settled">
|
|
845
|
+
<span>{{ kind }}</span><span aria-hidden="true">·</span>
|
|
846
|
+
@if (n > 1) {
|
|
847
|
+
<button type="button" class="vo-afx-vb" aria-haspopup="menu" [attr.aria-expanded]="menuOpen"
|
|
848
|
+
[attr.aria-label]="'v' + (i + 1) + ' of ' + n + ' versions'" (click)="toggleMenu($any($event.currentTarget))" (keydown)="triggerKeys($event)"><span class="vo-afx-vt">v{{ i + 1 }}</span><vo-icon name="chev-d" size="xs"></vo-icon></button>
|
|
849
|
+
} @else {
|
|
850
|
+
<span class="vo-afx-v">v1</span>
|
|
851
|
+
}
|
|
852
|
+
<span aria-hidden="true">·</span><span class="vo-afx-when" [innerHTML]="whenHtml(v.meta)"></span>
|
|
853
|
+
</span>
|
|
854
|
+
</div>
|
|
855
|
+
</ng-template>
|
|
856
|
+
|
|
857
|
+
<!-- Copy and Download, shared by every variant -->
|
|
858
|
+
<ng-template #actions>
|
|
859
|
+
<button type="button" class="vo-ib vo-afx-copy" [class.vo-copied]="flashed === 'copy'" [attr.aria-label]="'Copy ' + v.title" (click)="copy('copy')"><vo-icon [name]="flashed === 'copy' ? 'check' : 'copy'" [size]="actionSize"></vo-icon></button>
|
|
860
|
+
<button type="button" class="vo-ib vo-afx-dl" [class.vo-copied]="flashed === 'dl'" [attr.aria-label]="'Download ' + v.title" (click)="download('dl')"><vo-icon [name]="flashed === 'dl' ? 'check' : 'chev-d'" [size]="actionSize"></vo-icon></button>
|
|
861
|
+
</ng-template>
|
|
862
|
+
|
|
863
|
+
<div class="vo-afx-sr" role="status" aria-live="polite">{{ said }}</div>
|
|
864
|
+
</div>
|
|
865
|
+
`, styles: [".vo-afx{--vo-afx-t2:var(--vo-muted);width:100%;container-type:inline-size}.vo-afx.vo-dm>.vo-afx-main{position:relative;min-height:452px;justify-content:center}@container (max-width:400px){.vo-afx.vo-dm>.vo-afx-main{min-height:474px}}:root[data-theme=dark] .vo-afx{--vo-afx-t2:#c0c0c0}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-afx{--vo-afx-t2:#c0c0c0}}.vo-afx>.vo-demo .vo-seg2 button{color:var(--vo-afx-t2)}.vo-afx>.vo-demo .vo-seg2 button[aria-pressed=true]{color:var(--vo-fg)}.vo-afx-sr{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.vo-afx-w{position:relative;width:100%;transition:transform var(--vo-t) var(--vo-ease)}.vo-afx-ic{width:36px;height:36px;border-radius:calc(10px * var(--vo-rk));display:grid;place-items:center;flex:none;background:var(--vo-accent-bg);color:var(--vo-accent-fg,var(--vo-accent))}.vo-afx-ic .vo-spin{display:none}.vo-is-writing .vo-afx-ic .vo-spin{display:inline-block}.vo-is-writing .vo-afx-ic svg{display:none}.vo-afx-meta{display:flex;align-items:center;min-width:0;height:20px;font-size:12.5px;color:var(--vo-afx-t2);white-space:nowrap}.vo-afx-fin{display:flex;align-items:center;gap:5px;min-width:0}.vo-afx-meta .vo-afx-wr{display:none;overflow:hidden;text-overflow:ellipsis}.vo-is-writing .vo-afx-meta .vo-afx-wr{display:inline}.vo-is-writing .vo-afx-meta .vo-afx-fin{display:none}.vo-afx-when{overflow:hidden;text-overflow:ellipsis;min-width:0}.vo-afx-vb{position:relative;z-index:1;display:inline-flex;align-items:center;gap:1px;height:20px;padding:0 3px 0 5px;margin:0 -2px;border-radius:calc(6px * var(--vo-rk));font-size:12.5px;font-weight:500;color:var(--vo-fg);transition:background var(--vo-t-fast)}.vo-afx-vb[aria-expanded=true]{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-afx-vb:hover{background:var(--vo-row)}}.vo-afx-vb .vo-i{color:var(--vo-fg2)}.vo-afx-menu{width:264px;max-width:calc(100% - 16px)}.vo-afx-menu:not(.vo-open){visibility:hidden;transition:opacity .2s var(--vo-ease),transform .35s var(--vo-ease),filter .2s var(--vo-ease),visibility 0s .35s}.vo-afx-menu .vo-ph{color:var(--vo-afx-t2)}.vo-afx-menu .vo-mi{align-items:flex-start;gap:var(--vo-s-2)}.vo-afx-menu .vo-mi:focus-visible{outline-offset:-2px;background:var(--vo-row)}.vo-afx-mb{display:flex;flex-direction:column;min-width:0}.vo-afx-mw{font-weight:400;color:var(--vo-afx-t2)}.vo-afx-menu .vo-mi .vo-d{color:var(--vo-afx-t2);font-weight:400;white-space:normal}@media (hover:hover) and (pointer:fine){.vo-afx-menu .vo-mi:is(:hover,.vo-hl,[aria-checked=true]) .vo-d{color:var(--vo-afx-t2);font-weight:400;white-space:normal}}.vo-afx-menu .vo-mi .vo-ck{margin-top:3px}.vo-afx-card{position:relative}.vo-afx-card .vo-afx-open:after{content:\"\";position:absolute;inset:0;border-radius:inherit}.vo-afx-card .vo-afx-open{transform:none!important}.vo-afx-card :is(.vo-afx-copy,.vo-afx-dl,.vo-afx-vb){position:relative;z-index:1}.vo-afx .vo-copied .vo-afx-lbl{color:var(--vo-fg)}.vo-afx-sheet{position:absolute;inset:0;z-index:20;border-radius:inherit;overflow:hidden}.vo-afx-scrim{position:absolute;inset:0;background:color-mix(in srgb,var(--vo-stage) 78%,transparent)}.vo-afx-pan{position:absolute;display:flex;flex-direction:column;background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow-pop);overflow:hidden;outline:none}.vo-afx-pan.vo-afx-view{inset:0}.vo-afx-pan.vo-afx-page{inset:0;margin:auto;width:min(400px,100%);transform-origin:0 0}.vo-afx-ph{display:flex;align-items:center;gap:10px;padding:10px var(--vo-s-2) 10px 14px;border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-afx-ph .vo-afx-ic{width:30px;height:30px;border-radius:var(--vo-r-sm)}.vo-afx-ptx{flex:1;min-width:0}.vo-afx-pt{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-pm{font-size:12.5px;color:var(--vo-afx-t2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-pb{flex:1;min-height:0;overflow:auto;padding:14px 18px 18px;font-size:13.5px;line-height:1.6;outline:none}.vo-afx-pb:focus-visible{box-shadow:inset 0 0 0 2px var(--vo-focus)}.vo-afx-pb h3{margin:var(--vo-s-4) 0 var(--vo-s-1);font-size:12.5px;font-weight:500;color:var(--vo-afx-t2)}.vo-afx-pb p{margin:0}.vo-afx-pb :is(ul,ol){margin:0;padding-left:18px}.vo-afx-pb li+li{margin-top:3px}.vo-afx-pb li::marker{color:var(--vo-fg2)}.vo-afx-tb{width:100%;border-collapse:collapse;font-size:13px;font-variant-numeric:tabular-nums}.vo-afx-tb :is(th,td){padding:7px var(--vo-s-2);border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent);text-align:left;font-weight:400}.vo-afx-tb thead th{font-size:12.5px;color:var(--vo-afx-t2);font-weight:500}.vo-afx-tb .vo-num{text-align:right}.vo-afx-tb tbody th{font-weight:500}.vo-afx-pf{display:flex;align-items:center;gap:6px;padding:10px 14px;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-afx-pf .vo-pill .vo-afx-lbl{min-width:58px;text-align:left}.vo-afx-pf .vo-pill.vo-copied{color:var(--vo-fg)!important}.vo-afx-pf .vo-pill.vo-copied .vo-i{color:var(--vo-ok)}.vo-afx-cp{max-width:440px;display:flex;flex-direction:column;gap:14px}.vo-afx-cp-a{margin:0;font-size:14px;line-height:1.6;text-wrap:pretty}.vo-afx-cp-list{display:flex;flex-direction:column;gap:var(--vo-s-2)}.vo-afx-cp-card{display:flex;align-items:center;gap:var(--vo-s-3);padding:10px var(--vo-s-2) 10px 10px;border-radius:var(--vo-r-in);background:var(--vo-surface);box-shadow:var(--vo-shadow);transition:background var(--vo-t-fast),box-shadow var(--vo-t-fast);overflow:hidden}@media (hover:hover) and (pointer:fine){.vo-afx-cp-card:not(.vo-is-writing):hover{background:var(--vo-wash)}}@media (hover:hover) and (pointer:fine){:root:not([data-style=soft]) .vo-afx-cp-card:not(.vo-is-writing):hover:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent)}}.vo-afx-cp-tx{flex:1;min-width:0}.vo-afx-cp-t{font-size:13.5px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-cp-act{display:flex;align-items:center;gap:2px;flex:none;transition:opacity var(--vo-t) var(--vo-ease)}.vo-afx-cp-act .vo-pill{margin-left:var(--vo-s-1);gap:6px;padding:0 10px}@media (hover:hover) and (pointer:fine){.vo-afx .vo-afx-open.vo-pill.vo-accent:hover{background:color-mix(in srgb,var(--vo-accent) 86%,#000)}}.vo-is-writing .vo-afx-cp-act{opacity:0;visibility:hidden}.vo-afx-cp-bar{position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--vo-accent-mark);transform-origin:left center;transform:scaleX(0);opacity:0;transition:transform .9s var(--vo-ease),opacity .3s var(--vo-ease)}.vo-is-writing .vo-afx-cp-bar{opacity:1}@container (max-width:400px){.vo-afx-ed{display:none}.vo-afx-fin{gap:var(--vo-s-1)}.vo-afx-card .vo-afx-ic{width:32px;height:32px;border-radius:calc(9px * var(--vo-rk))}.vo-afx-card :is(.vo-afx-copy,.vo-afx-dl,.vo-ib.vo-afx-open){width:28px;height:28px}.vo-afx-cp-act,.vo-afx-pv-act{gap:0}.vo-afx-cp-card{padding-right:6px;gap:10px}.vo-afx-pv-meta{gap:10px;padding-right:6px}.vo-afx-pv-meta .vo-afx-ic,.vo-afx-cp-act .vo-pill .vo-afx-lbl{display:none}.vo-afx-cp-act .vo-pill{width:28px;height:28px;padding:0;margin-left:2px}}.vo-afx-pv{width:min(100%,380px)}.vo-afx-pv-card{border-radius:var(--vo-r-card);background:var(--vo-surface);box-shadow:var(--vo-shadow);transition:box-shadow var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-afx-pv-card:not(.vo-is-writing):hover{box-shadow:var(--vo-shadow-pop)}}@media (hover:hover) and (pointer:fine){:root:not([data-style=soft]) .vo-afx-pv-card:not(.vo-is-writing):hover:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent)}}.vo-afx-pv-prev{position:relative;height:164px;overflow:hidden;padding:18px 22px 0;border-radius:var(--vo-r-card) var(--vo-r-card) 0 0;background:var(--vo-stage);border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-afx-pv-page{height:100%;padding:14px var(--vo-s-4) 0;border-radius:var(--vo-r-sm) var(--vo-r-sm) 0 0;background:var(--vo-surface);box-shadow:var(--vo-shadow);transition:transform var(--vo-t) var(--vo-ease)}@media (hover:hover) and (pointer:fine){.vo-afx-pv-card:not(.vo-is-writing):hover .vo-afx-pv-page{transform:translateY(-3px)}}.vo-afx-pv-k{font-size:11px;line-height:16px;color:var(--vo-afx-t2)}.vo-afx-pv-k .vo-afx-wr,.vo-is-writing .vo-afx-pv-k .vo-afx-fin{display:none}.vo-is-writing .vo-afx-pv-k .vo-afx-wr{display:inline}.vo-afx-pv-h{margin-top:2px;font-size:13px;font-weight:500;line-height:18px}.vo-afx-pv-p{margin:6px 0 0;min-height:54px;font-size:11.5px;line-height:18px;color:var(--vo-fg);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.vo-afx-caret{display:inline-block;width:1.5px;height:12px;margin-left:1px;vertical-align:-2px;background:var(--vo-accent-mark);animation:vo-bpblink 1s steps(1,end) infinite}.vo-afx-pv-ls{display:flex;flex-direction:column;gap:var(--vo-s-2);margin-top:10px;-webkit-mask-image:linear-gradient(#000 0,transparent 44px);mask-image:linear-gradient(#000 0,transparent 44px)}.vo-afx-pv-ls i{display:block;height:4px;border-radius:2px;width:var(--vo-w);background:color-mix(in srgb,var(--vo-fg) 8%,var(--vo-surface));transform-origin:left center;transition:width var(--vo-t) var(--vo-ease)}.vo-is-writing .vo-afx-pv-ls i{transform:scaleX(0)}.vo-afx-pv-meta{display:flex;align-items:center;gap:var(--vo-s-3);padding:var(--vo-s-3) var(--vo-s-2) var(--vo-s-3) 14px}.vo-afx-pv-tx{flex:1;min-width:0}.vo-afx-pv-t{font-size:13.5px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-pv-act{display:flex;align-items:center;gap:2px;flex:none;transition:opacity var(--vo-t) var(--vo-ease)}.vo-is-writing .vo-afx-pv-act{opacity:0;visibility:hidden}.vo-afx-in{max-width:440px;display:flex;flex-direction:column;gap:14px}.vo-afx-in-msg{display:flex;flex-direction:column;gap:10px}.vo-afx-in-msg p{margin:0;font-size:14px;line-height:1.6;text-wrap:pretty}.vo-afx-chip{display:inline-flex;align-items:center;align-self:flex-start;max-width:100%;height:34px;border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);transition:box-shadow var(--vo-t-fast),background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-afx-chip:not(.vo-is-writing):is(:hover,:focus-within,.vo-pin){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent),0 1px 2px #0000000d}}.vo-afx-in-main{display:inline-flex;align-items:center;gap:var(--vo-s-2);min-width:0;height:34px;padding:0 var(--vo-s-3) 0 10px;border-radius:var(--vo-r-pill);font-size:13px}.vo-afx-in-main:focus-visible{outline-offset:-2px!important}.vo-afx-in-ic{display:grid;place-items:center;width:16px;height:16px;flex:none;color:var(--vo-accent-fg,var(--vo-accent))}.vo-afx-in-ic .vo-spin{display:none;width:11px;height:11px}.vo-is-writing .vo-afx-in-ic .vo-spin{display:inline-block}.vo-is-writing .vo-afx-in-ic svg{display:none}.vo-afx-in-t{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.vo-afx-in-m{color:var(--vo-afx-t2);white-space:nowrap;font-size:12.5px}.vo-afx-in-m .vo-afx-wr{display:none}.vo-afx-in-m .vo-afx-fin{display:inline-flex;gap:var(--vo-s-1)}.vo-is-writing .vo-afx-in-m .vo-afx-wr{display:inline}.vo-is-writing .vo-afx-in-m .vo-afx-fin{display:none}.vo-afx-tray{display:grid;grid-template-columns:0fr;opacity:0;transition:grid-template-columns var(--vo-t) var(--vo-ease),opacity var(--vo-t-fast) var(--vo-ease)}.vo-afx-tray>span{display:flex;align-items:center;min-width:0;overflow:hidden}.vo-afx-tray>span>:last-child{margin-right:3px}@media (hover:hover) and (pointer:fine){.vo-afx-chip:not(.vo-is-writing):is(:hover,:focus-within,.vo-pin) .vo-afx-tray{grid-template-columns:1fr;opacity:1}}.vo-afx-tray .vo-ib{width:28px;height:28px}.vo-afx-tray .vo-ib:focus-visible{outline-offset:-2px}.vo-afx-tsep{flex:none;width:1px;height:16px;margin-right:3px;background:var(--vo-line)}@media (hover:none){.vo-afx-chip:not(.vo-is-writing) .vo-afx-tray{grid-template-columns:1fr;opacity:1}}@container (max-width:400px){.vo-afx-in-m :is(.vo-afx-when,.vo-afx-msep){display:none}}.vo-afx-st{display:flex;flex-direction:column;align-items:center;gap:18px;--vo-sw:150px;--vo-sh:194px;--vo-fx:min(122px,calc((100cqw - var(--vo-sw) - 24px) / 2));--vo-ln:color-mix(in srgb,var(--vo-fg) 26%,var(--vo-surface))}@container (max-width:360px){.vo-afx-st{--vo-sw:112px;--vo-sh:146px}}.vo-afx-desk{position:relative;width:var(--vo-sw);height:calc(var(--vo-sh) + 24px)}.vo-afx-desk:before{content:\"\";position:absolute;left:4%;right:4%;bottom:-10px;height:26px;border-radius:50%;background:radial-gradient(closest-side,rgba(0,0,0,.13),transparent);transition:opacity var(--vo-t) var(--vo-ease)}:root[data-theme=dark] .vo-afx-desk:before{background:radial-gradient(closest-side,rgba(0,0,0,.5),transparent)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-afx-desk:before{background:radial-gradient(closest-side,rgba(0,0,0,.5),transparent)}}:root:not([data-style=soft]) .vo-afx-desk:not(:where([data-style=soft],[data-style=soft] *)):before,.vo-afx-st.vo-fan .vo-afx-desk:before{opacity:0}.vo-afx-stack{position:absolute;inset:0}.vo-afx-sh{--vo-pk:-1.5px;position:absolute;left:0;top:12px;width:var(--vo-sw);height:var(--vo-sh);padding:0;text-align:left;border-radius:calc(10px * var(--vo-rk));background:var(--vo-surface);box-shadow:var(--vo-shadow);transform:translate(calc(var(--vo-d,0) * var(--vo-pk)),calc(var(--vo-d,0) * var(--vo-pk)));transition:transform var(--vo-t-slow) var(--vo-ease),box-shadow var(--vo-t) var(--vo-ease)}.vo-afx-st:not(.vo-fan):not(.vo-is-writing):has(:focus-visible) .vo-afx-sh{--vo-pk:-4px}@media (hover:hover) and (pointer:fine){.vo-afx-st:not(.vo-fan):not(.vo-is-writing) .vo-afx-desk:hover .vo-afx-sh{--vo-pk:-4px}}.vo-afx-sh:focus-visible{outline-offset:3px}.vo-afx-st:not(.vo-fan) .vo-afx-sh[aria-checked=true]{box-shadow:var(--vo-shadow-pop)}.vo-afx-st.vo-is-writing .vo-afx-sh{cursor:default}.vo-afx-pg{position:absolute;inset:0;display:flex;flex-direction:column;padding:var(--vo-s-3);border-radius:inherit;overflow:hidden}.vo-afx-st-k{display:flex;align-items:center;justify-content:space-between;font-size:11px;line-height:14px;color:var(--vo-afx-t2)}.vo-afx-st-h{min-height:32px;margin-top:var(--vo-s-1);font-size:12.5px;font-weight:500;line-height:16px;color:var(--vo-fg)}.vo-afx-st-ls{display:flex;flex-direction:column;gap:7px;margin-top:10px}.vo-afx-r{position:relative;display:flex;align-items:center;gap:5px;height:4px}.vo-afx-r i{display:block;height:3px;border-radius:2px;width:var(--vo-w);background:var(--vo-ln);transform-origin:left center}.vo-afx-r b{flex:none;width:4px;height:4px;border-radius:50%;background:var(--vo-ln)}.vo-afx-r.vo-n b{width:6px;height:6px;margin:0 -1px;background:var(--vo-accent-mark)}.vo-afx-gap{height:3px}.vo-afx-st .vo-blank .vo-afx-r :is(i,b){transform:scaleX(0)}.vo-afx-pen{position:absolute;left:0;top:0;width:7px;height:7px;border-radius:50%;background:var(--vo-accent-mark);box-shadow:0 0 0 3px var(--vo-surface);opacity:0;pointer-events:none}@container (max-width:360px){.vo-afx-st-ls{gap:6px;margin-top:var(--vo-s-2)}.vo-afx-st-ls>:nth-child(n+7){display:none}}.vo-afx-tab{position:absolute;left:50%;top:calc(100% + 10px);display:inline-flex;align-items:center;gap:var(--vo-s-1);transform:translate(-50%);white-space:nowrap;font-size:11.5px;color:var(--vo-afx-t2);opacity:0;transition:opacity var(--vo-t) var(--vo-ease)}.vo-afx-tab .vo-i{display:none;color:var(--vo-accent-fg,var(--vo-accent))}.vo-afx-st.vo-fan .vo-afx-tab{opacity:1}.vo-afx-sh[aria-checked=true] .vo-afx-tab{color:var(--vo-fg);font-weight:500}.vo-afx-sh[aria-checked=true] .vo-afx-tab .vo-i{display:inline-block}@container (max-width:360px){.vo-afx-tab .vo-afx-ta{display:none}}.vo-afx-cap{display:flex;flex-direction:column;align-items:center;max-width:100%;text-align:center;transition:margin var(--vo-t) var(--vo-ease)}.vo-afx-st.vo-fan .vo-afx-cap{margin-top:22px}.vo-afx-st-t{font-size:14px;font-weight:500}.vo-afx-st-m{justify-content:center;max-width:100%}.vo-afx-note{padding-top:2px;font-size:12.5px;color:var(--vo-fg)}.vo-afx-st-act{display:flex;align-items:center;gap:var(--vo-s-1);transition:opacity var(--vo-t) var(--vo-ease)}.vo-afx-st-act .vo-pill{gap:6px}.vo-afx-st.vo-is-writing .vo-afx-st-act{opacity:0;visibility:hidden}.vo-i{width:16px;height:16px;flex:none;display:inline-block;vertical-align:-3px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}.vo-i.vo-s{width:14px;height:14px}.vo-i.vo-xs{width:12px;height:12px}.vo-i.vo-l{width:18px;height:18px}.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)}}@keyframes vo-bpblink{50%{opacity:0}}.vo-ib{width:30px;height:30px;border-radius:50%;display:inline-grid;place-items:center;color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),transform .15s}@media (hover:hover) and (pointer:fine){.vo-ib:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-ib:active{transform:scale(.94)}.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-accent{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-accent:hover{background:var(--vo-accent-2)}}.vo-pill.vo-line{background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);color:var(--vo-fg)}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-copied{color:var(--vo-ok)!important}@media (hover:hover) and (pointer:fine){.vo-copied:hover{color:var(--vo-ok)!important}}.vo-pop{position:absolute;z-index:50;min-width:200px;background:var(--vo-raised);border-radius:calc(14px * var(--vo-rk));box-shadow:var(--vo-shadow-pop);padding:6px;opacity:0;visibility:hidden;pointer-events:none;transform:translateY(6px) scale(.98);transform-origin:var(--vo-origin,top left);filter:blur(3px);transition:opacity .2s var(--vo-ease),transform .35s var(--vo-ease),filter .2s var(--vo-ease),visibility 0s .2s}.vo-pop.vo-open{opacity:1;visibility:visible;pointer-events:auto;transform:none;filter:none;transition-property:opacity,transform,filter}.vo-pop .vo-ph{padding:6px var(--vo-s-2) var(--vo-s-1);font-size:11.5px;color:var(--vo-muted)}.vo-mi{display:flex;align-items:center;gap:10px;width:100%;padding:7px var(--vo-s-2);border-radius:calc(9px * var(--vo-rk));font-size:13px;text-align:left;color:var(--vo-fg);cursor:pointer;transition:background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-mi:hover{background:var(--vo-row)}}.vo-mi+.vo-mi{margin-top:2px}.vo-mi .vo-i{color:var(--vo-fg2)}.vo-mi .vo-d{display:block;font-size:12px;color:var(--vo-muted)}.vo-mi .vo-ck{margin-left:auto;color:var(--vo-accent-fg,var(--vo-accent));opacity:0;transition:opacity var(--vo-t-fast)}.vo-mi[aria-checked=true] .vo-ck{opacity:1}.vo-mi[aria-checked=true]{background:var(--vo-row);font-weight:500}.vo-bub{align-self:flex-end;max-width:85%;background:var(--vo-hover);border-radius:var(--vo-r-card);padding:9px 13px;font-size:14px;line-height:1.45}.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-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:hidden;min-height:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0}\n"] }]
|
|
866
|
+
}], propDecorators: { variant: [{
|
|
867
|
+
type: Input
|
|
868
|
+
}], versions: [{
|
|
869
|
+
type: Input
|
|
870
|
+
}], version: [{
|
|
871
|
+
type: Input
|
|
872
|
+
}], defaultVersion: [{
|
|
873
|
+
type: Input
|
|
874
|
+
}], state: [{
|
|
875
|
+
type: Input
|
|
876
|
+
}], status: [{
|
|
877
|
+
type: Input
|
|
878
|
+
}], progress: [{
|
|
879
|
+
type: Input
|
|
880
|
+
}], kind: [{
|
|
881
|
+
type: Input
|
|
882
|
+
}], icon: [{
|
|
883
|
+
type: Input
|
|
884
|
+
}], fileName: [{
|
|
885
|
+
type: Input
|
|
886
|
+
}], ext: [{
|
|
887
|
+
type: Input
|
|
888
|
+
}], openLabel: [{
|
|
889
|
+
type: Input
|
|
890
|
+
}], className: [{
|
|
891
|
+
type: Input
|
|
892
|
+
}], versionChange: [{
|
|
893
|
+
type: Output
|
|
894
|
+
}], opened: [{
|
|
895
|
+
type: Output
|
|
896
|
+
}], copied: [{
|
|
897
|
+
type: Output
|
|
898
|
+
}], downloaded: [{
|
|
899
|
+
type: Output
|
|
900
|
+
}], menuEl: [{
|
|
901
|
+
type: ViewChild,
|
|
902
|
+
args: ['menuEl']
|
|
903
|
+
}], desk: [{
|
|
904
|
+
type: ViewChild,
|
|
905
|
+
args: ['desk']
|
|
906
|
+
}], fanBtn: [{
|
|
907
|
+
type: ViewChild,
|
|
908
|
+
args: ['fanBtn']
|
|
909
|
+
}], pan: [{
|
|
910
|
+
type: ViewChild,
|
|
911
|
+
args: ['pan']
|
|
912
|
+
}], closeBtn: [{
|
|
913
|
+
type: ViewChild,
|
|
914
|
+
args: ['closeBtn']
|
|
915
|
+
}] } });
|
|
916
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWZhY3QtY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hcnRpZmFjdC1jYXJkL2FydGlmYWN0LWNhcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCxFQUFFO0FBQ0YseUVBQXlFO0FBQ3pFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsdUVBQXVFO0FBQ3ZFLGdGQUFnRjtBQUNoRiwyQkFBMkI7QUFDM0IsRUFBRTtBQUNGLGdGQUFnRjtBQUNoRiw2RUFBNkU7QUFDN0UsZ0ZBQWdGO0FBQ2hGLGlDQUFpQztBQUVqQyxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFtQixNQUFNLHdCQUF3QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQXNCdEUsTUFBTSxJQUFJLEdBQTJCO0lBQ25DLEVBQUUsRUFBRSxlQUFlO0lBQ25CLEdBQUcsRUFBRSxVQUFVO0lBQ2YsSUFBSSxFQUFFLGtCQUFrQjtJQUN4QixJQUFJLEVBQUUsV0FBVztDQUNsQixDQUFDO0FBQ0YsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUN6QixDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3BFLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5RCxNQUFNLFNBQVMsR0FBRyxDQUFDLE9BQWUsRUFBRSxFQUFFLENBQ3BDLE9BQU87S0FDSixLQUFLLENBQUMsU0FBUyxDQUFDO0tBQ2hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ3BCLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBZWhFLE1BQU0sS0FBSyxHQUFhO0lBQ3RCLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2hMLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2hMLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2pMLENBQUM7QUFDRiw0RkFBNEY7QUFDNUYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENB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QUFoQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxHQUFHO3NCQUFYLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdJLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVzQixNQUFNO3NCQUFsQyxTQUFTO3VCQUFDLFFBQVE7Z0JBQ1EsSUFBSTtzQkFBOUIsU0FBUzt1QkFBQyxNQUFNO2dCQUNZLE1BQU07c0JBQWxDLFNBQVM7dUJBQUMsUUFBUTtnQkFDTyxHQUFHO3NCQUE1QixTQUFTO3VCQUFDLEtBQUs7Z0JBQ2UsUUFBUTtzQkFBdEMsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZnJhbWV3b3JrL2FuZ3VsYXIvYXJ0aWZhY3QtY2FyZC9hcnRpZmFjdC1jYXJkLmNvbXBvbmVudC50c1xuLy9cbi8vIE5hdGl2ZSBBbmd1bGFyIHBvcnQgb2YgZnJhbWV3b3JrL3JlYWN0L2FydGlmYWN0LWNhcmQvQXJ0aWZhY3RDYXJkLnRzeC5cbi8vIEEgZmlsZSB0aGUgYWdlbnQgbWFkZSwgc2hvd24gZm91ciB3YXlzOiBhIGNvbXBhY3Qgcm93LCBhIGNhcmQgd2l0aCBpdHMgZmlyc3Rcbi8vIHBhZ2UsIGEgY2hpcCBpbnNpZGUgYSBtZXNzYWdlLCBvciBhIHN0YWNrIG9mIGl0cyB2ZXJzaW9ucy4gRWFjaCBwbGF5cyBhXG4vLyB3cml0aW5nIHN0YXRlLCB0aGVuIG9wZW5zIGluIGEgcmVhZGVyLCBzd2l0Y2hlcyB2ZXJzaW9ucywgY29waWVzIGFuZFxuLy8gZG93bmxvYWRzIHRoZSBzYW1lIHdheS4gSW5wdXRzIG1pcnJvciB0aGUgUmVhY3QgcHJvcHM7IFJlYWN0IGNhbGxiYWNrcyBiZWNvbWVcbi8vIEBPdXRwdXQoKSBFdmVudEVtaXR0ZXJzLlxuLy9cbi8vIEljb24gbm90ZXM6IHRoZSBBbmd1bGFyIGNvcmUgZ2x5cGggc2V0IGhhcyBubyBkb3dubG9hZC9wYW5lbC9tYXhpbWl6ZS9sYXllcnMvXG4vLyBoaXN0b3J5IGdseXBocywgc28gdGhlIGNsb3Nlc3QgYXZhaWxhYmxlIG5hbWVzIGFyZSBzdWJzdGl0dXRlZCDigJQgT3BlbiB1c2VzXG4vLyBgZXh0YCAob3BlbiBvdXQpLCBEb3dubG9hZCB1c2VzIGBjaGV2LWRgIChhIGRvd253YXJkIGFycm93KSwgYW5kIHRoZSBWZXJzaW9uc1xuLy8gYnV0dG9ucyB1c2UgYGNsb2NrYCAoaGlzdG9yeSkuXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVm9JY29uQ29tcG9uZW50LCB0eXBlIFZvSWNvbk5hbWUgfSBmcm9tICcuLi9jb3JlL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IFJlZHVjZWRNb3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9yZWR1Y2VkLW1vdGlvbi5zZXJ2aWNlJztcblxuLyoqIE9uZSB2ZXJzaW9uIG9mIHRoZSBmaWxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcnRpZmFjdFZlcnNpb24ge1xuICAvKiogVGhlIGZpbGUncyBuYW1lIGluIHRoaXMgdmVyc2lvbiwgbGlrZSBcIlByaWNpbmcgcGFnZSByZXZpZXdcIi4gKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqIFdoZW4gdGhpcyB2ZXJzaW9uIHdhcyBtYWRlLCBsaWtlIFwiZWRpdGVkIDIgaG91cnMgYWdvXCIuICovXG4gIG1ldGE6IHN0cmluZztcbiAgLyoqIFdoYXQgY2hhbmdlZCBpbiB0aGlzIHZlcnNpb24sIGxpa2UgXCJBZGRlZCBhIGNvbXBldGl0b3IgcHJpY2UgY2hlY2tcIi4gKi9cbiAgbm90ZT86IHN0cmluZztcbiAgLyoqIFRoZSBmaWxlIGl0c2VsZiwgYXMgTWFya2Rvd24gKG9yIENTViB3aGVuIGBleHRgIGlzIFwiY3N2XCIpLiAqL1xuICBjb250ZW50OiBzdHJpbmc7XG4gIC8qKiBUaGUgdGV4dCBvbiB0aGUgcHJldmlldydzIGZpcnN0IHBhZ2UuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBwYXJhZ3JhcGggb2YgYGNvbnRlbnRgLiAqL1xuICBzdW1tYXJ5Pzogc3RyaW5nO1xufVxuXG4vKiogSG93IHRoZSBjYXJkIHNob3dzIHRoZSBmaWxlLiAqL1xuZXhwb3J0IHR5cGUgQXJ0aWZhY3RWYXJpYW50ID0gJ2NvbXBhY3QnIHwgJ3ByZXZpZXcnIHwgJ2lubGluZScgfCAnc3RhY2snO1xuXG4vKiogV2hldGhlciB0aGUgYWdlbnQgaXMgc3RpbGwgbWFraW5nIHRoZSBmaWxlLiAqL1xuZXhwb3J0IHR5cGUgQXJ0aWZhY3RTdGF0ZSA9ICd3cml0aW5nJyB8ICdyZWFkeSc7XG5cbmNvbnN0IE1JTUU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIG1kOiAndGV4dC9tYXJrZG93bicsXG4gIGNzdjogJ3RleHQvY3N2JyxcbiAganNvbjogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICBodG1sOiAndGV4dC9odG1sJyxcbn07XG5jb25zdCBzbHVnID0gKHM6IHN0cmluZykgPT5cbiAgcy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XG5jb25zdCBhZ28gPSAobWV0YTogc3RyaW5nKSA9PiBtZXRhLnJlcGxhY2UoL15lZGl0ZWRcXHMrL2ksICcnKTtcbmNvbnN0IGZpcnN0UGFyYSA9IChjb250ZW50OiBzdHJpbmcpID0+XG4gIGNvbnRlbnRcbiAgICAuc3BsaXQoL1xcblxccypcXG4vKVxuICAgIC5tYXAoKGIpID0+IGIudHJpbSgpKVxuICAgIC5maW5kKChiKSA9PiBiICYmICEvXigjfFstKl0gfFxcZCtcXC4gfHZcXGQrLCkvLnRlc3QoYikpID8/ICcnO1xuXG4vKiogQSBibG9jayBvZiB0aGUgcmVhZGVyJ3MgcmVuZGVyZWQgYm9keS4gKi9cbmludGVyZmFjZSBCbG9jayB7XG4gIGtpbmQ6ICdoMycgfCAncCcgfCAndWwnIHwgJ29sJztcbiAgdGV4dD86IHN0cmluZztcbiAgaXRlbXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqIE9uZSBkcmF3biBsaW5lIG9uIGEgc3RhY2sgc2hlZXQ6IHAgYSBwYXJhZ3JhcGgsIGIgYSBidWxsZXQsIG4gYSBudW1iZXJlZCBmaXgsIHMgYSBnYXAuICovXG5pbnRlcmZhY2UgTGluZSB7XG4gIHQ6ICdwJyB8ICdiJyB8ICduJyB8ICdzJztcbiAgdz86IG51bWJlcjtcbn1cblxuY29uc3QgTElORVM6IExpbmVbXVtdID0gW1xuICBbeyB0OiAncCcsIHc6IDk0IH0sIHsgdDogJ3AnLCB3OiA3MiB9LCB7IHQ6ICdzJyB9LCB7IHQ6ICdiJywgdzogODIgfSwgeyB0OiAnYicsIHc6IDc0IH0sIHsgdDogJ2InLCB3OiA2NiB9LCB7IHQ6ICdiJywgdzogNzggfSwgeyB0OiAncycgfSwgeyB0OiAncCcsIHc6IDg4IH0sIHsgdDogJ3AnLCB3OiA1MiB9XSxcbiAgW3sgdDogJ3AnLCB3OiA5MiB9LCB7IHQ6ICdwJywgdzogODYgfSwgeyB0OiAncCcsIHc6IDU2IH0sIHsgdDogJ3MnIH0sIHsgdDogJ2InLCB3OiA4MCB9LCB7IHQ6ICdiJywgdzogNzIgfSwgeyB0OiAnYicsIHc6IDg2IH0sIHsgdDogJ2InLCB3OiA2NCB9LCB7IHQ6ICdzJyB9LCB7IHQ6ICdwJywgdzogNzAgfV0sXG4gIFt7IHQ6ICdwJywgdzogOTAgfSwgeyB0OiAncCcsIHc6IDc4IH0sIHsgdDogJ3MnIH0sIHsgdDogJ24nLCB3OiA4NCB9LCB7IHQ6ICduJywgdzogNzAgfSwgeyB0OiAnbicsIHc6IDc4IH0sIHsgdDogJ3MnIH0sIHsgdDogJ2InLCB3OiA3NiB9LCB7IHQ6ICdiJywgdzogNjggfSwgeyB0OiAnYicsIHc6IDgyIH1dLFxuXTtcbi8vIHRoZSBwcmV2aWV3J3MgbGluZXMsIGEgbGl0dGxlIGRpZmZlcmVudCBmb3IgZWFjaCB2ZXJzaW9uIHNvIGRyYWZ0cyBhcmUgZWFzeSB0byB0ZWxsIGFwYXJ0XG5jb25zdCBXSURUSFMgPSBbWzk2LCA4OCwgNzAsIDgyXSwgWzkyLCA4NCwgOTAsIDY0XSwgWzkwLCA3OCwgODYsIDcyXV07XG5cbi8qKiBBIHZpZXcgdGhlIHJlYWRlciBpcyBzaG93aW5nLCBvciBudWxsIHdoZW4gY2xvc2VkLiAqL1xuaW50ZXJmYWNlIFJlYWRpbmcge1xuICBraW5kOiAndmlldycgfCAncGFnZSc7XG4gIHNyYzogSFRNTEVsZW1lbnQgfCBudWxsO1xuICBvcGVuZXI6IEhUTUxFbGVtZW50IHwgbnVsbDtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndm8tYXJ0aWZhY3QtY2FyZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtWb0ljb25Db21wb25lbnQsIE5nVGVtcGxhdGVPdXRsZXRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgZGF0YS12bz1cIlwiIGNsYXNzPVwidm8tYWZ4XCIgW2NsYXNzXT1cImNsYXNzTmFtZVwiPlxuICAgICAgPCEtLSBjb21wYWN0OiBhbiBpY29uLCB0aGUgbmFtZSwgb25lIGxpbmUgb2YgbWV0YSBhbmQgT3BlbiAtLT5cbiAgICAgIEBpZiAodmFyaWFudCA9PT0gJ2NvbXBhY3QnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtY3AtY2FyZCB2by1hZngtY2FyZFwiIFtjbGFzcy52by1pcy13cml0aW5nXT1cIndyaXRpbmdcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LWljXCI+PHNwYW4gY2xhc3M9XCJ2by1zcGluXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPjx2by1pY29uIFtuYW1lXT1cImljb25cIj48L3ZvLWljb24+PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1jcC10eFwiPjxkaXYgY2xhc3M9XCJ2by1hZngtY3AtdFwiPnt7IHYudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJtZXRhTGluZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LWNwLWFjdFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFjdGlvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLXNtIHZvLWFjY2VudCB2by1hZngtb3BlblwiIFthdHRyLmFyaWEtbGFiZWxdPVwib3BlbkxhYmVsID8/ICdPcGVuICcgKyB2LnRpdGxlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid3JpdGluZ1wiIChjbGljayk9XCJvcGVuKCd2aWV3JywgJGFueSgkZXZlbnQuY3VycmVudFRhcmdldCksIG51bGwpXCI+PHZvLWljb24gbmFtZT1cImV4dFwiPjwvdm8taWNvbj48c3BhbiBjbGFzcz1cInZvLWFmeC1sYmxcIj5PcGVuPC9zcGFuPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKHdyaXRpbmcpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hZngtY3AtYmFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgW3N0eWxlLnRyYW5zZm9ybV09XCInc2NhbGVYKCcgKyBjbGFtcChwcm9ncmVzcykgKyAnKSdcIj48L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ2ZXJzaW9uc01lbnVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gcHJldmlldzogdGhlIHNhbWUgY2FyZCB3aXRoIHRoZSBmaXJzdCBwYWdlIHNob3dpbmcgLS0+XG4gICAgICBAaWYgKHZhcmlhbnQgPT09ICdwcmV2aWV3Jykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LXcgdm8tYWZ4LXB2XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1wdi1jYXJkIHZvLWFmeC1jYXJkXCIgW2NsYXNzLnZvLWlzLXdyaXRpbmddPVwid3JpdGluZ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1wdi1wcmV2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtcHYtcGFnZVwiICNwdlBhZ2U+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1wdi1rXCI+PHNwYW4gY2xhc3M9XCJ2by1hZngtd3JcIj5Xcml0aW5n4oCmPC9zcGFuPjxzcGFuIGNsYXNzPVwidm8tYWZ4LWZpblwiPnt7IGtpbmQgfX0gwrcgdnt7IGkgKyAxIH19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtcHYtaFwiPnt7IHYudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInZvLWFmeC1wdi1wXCI+e3sgc3VtbWFyeSB9fUBpZiAod3JpdGluZykgezxzcGFuIGNsYXNzPVwidm8tYWZ4LWNhcmV0XCI+PC9zcGFuPn08L3A+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1wdi1sc1wiPlxuICAgICAgICAgICAgICAgICAgQGZvciAodyBvZiBwcmV2aWV3V2lkdGhzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPGkgW3N0eWxlLi0tdm8td109XCJ3ICsgJyUnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1wdi1tZXRhXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LWljXCI+PHNwYW4gY2xhc3M9XCJ2by1zcGluXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPjx2by1pY29uIFtuYW1lXT1cImljb25cIj48L3ZvLWljb24+PC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LXB2LXR4XCI+PGRpdiBjbGFzcz1cInZvLWFmeC1wdi10XCI+e3sgdi50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibWV0YUxpbmVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtcHYtYWN0XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJhY3Rpb25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1pYiB2by1hZngtb3BlblwiIFthdHRyLmFyaWEtbGFiZWxdPVwib3BlbkxhYmVsID8/ICdPcGVuICcgKyB2LnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3cml0aW5nXCIgKGNsaWNrKT1cIm9wZW4oJ3BhZ2UnLCAkYW55KCRldmVudC5jdXJyZW50VGFyZ2V0KSwgcHZQYWdlKVwiPjx2by1pY29uIG5hbWU9XCJleHRcIj48L3ZvLWljb24+PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ2ZXJzaW9uc01lbnVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gaW5saW5lOiBvbmUgbGluZSBpbnNpZGUgdGhlIG1lc3NhZ2U7IHZlcnNpb25zIGFuZCBhY3Rpb25zIGZvbGQgb3V0IG9uIGhvdmVyIG9yIGZvY3VzIC0tPlxuICAgICAgQGlmICh2YXJpYW50ID09PSAnaW5saW5lJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LXdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1jaGlwXCIgW2NsYXNzLnZvLWlzLXdyaXRpbmddPVwid3JpdGluZ1wiIFtjbGFzcy52by1waW5dPVwibWVudU9wZW5cIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tYWZ4LWluLW1haW5cIiBbZGlzYWJsZWRdPVwid3JpdGluZ1wiIChjbGljayk9XCJvcGVuKCd2aWV3JywgJGFueSgkZXZlbnQuY3VycmVudFRhcmdldCksIG51bGwpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LWluLWljXCI+PHNwYW4gY2xhc3M9XCJ2by1zcGluXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPjx2by1pY29uIFtuYW1lXT1cImljb25cIiBzaXplPVwic21cIj48L3ZvLWljb24+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1pbi10XCI+PHNwYW4gY2xhc3M9XCJ2by1hZngtc3JcIj5PcGVuIDwvc3Bhbj57eyB2LnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1pbi1tXCI+PHNwYW4gY2xhc3M9XCJ2by1hZngtd3Igdm8tc2hpbVwiPnt7IHN0YXR1cyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1maW5cIiBbY2xhc3Mudm8tZW50ZXJdPVwic2V0dGxlZFwiPjxzcGFuIGNsYXNzPVwidm8tYWZ4LXZcIj52e3sgaSArIDEgfX08L3NwYW4+PHNwYW4gY2xhc3M9XCJ2by1hZngtbXNlcFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPsK3PC9zcGFuPjxzcGFuIGNsYXNzPVwidm8tYWZ4LXdoZW5cIiBbaW5uZXJIVE1MXT1cIndoZW5IdG1sKHYubWV0YSlcIj48L3NwYW4+PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hZngtdHJheVwiPjxzcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC10c2VwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICBAaWYgKG4gPiAxKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1pYiB2by1hZngtdmIzXCIgYXJpYS1sYWJlbD1cIlZlcnNpb25zXCIgYXJpYS1oYXNwb3B1cD1cIm1lbnVcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJtZW51T3BlblwiIChjbGljayk9XCJ0b2dnbGVNZW51KCRhbnkoJGV2ZW50LmN1cnJlbnRUYXJnZXQpKVwiIChrZXlkb3duKT1cInRyaWdnZXJLZXlzKCRldmVudClcIj48dm8taWNvbiBuYW1lPVwiY2xvY2tcIiBzaXplPVwic21cIj48L3ZvLWljb24+PC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJhY3Rpb25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3NwYW4+PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInZlcnNpb25zTWVudVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPCEtLSBzdGFjazogdGhlIHJlcG9ydCBhcyBhIHN0YWNrIG9mIHBhcGVyOyBWZXJzaW9ucyBsYXlzIHRoZSBzaGVldHMgb3V0IHRvIHBpY2sgb25lIC0tPlxuICAgICAgQGlmICh2YXJpYW50ID09PSAnc3RhY2snKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtdyB2by1hZngtc3RcIiBbY2xhc3Mudm8taXMtd3JpdGluZ109XCJ3cml0aW5nXCIgW2NsYXNzLnZvLWZhbl09XCJmYW5uZWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LWRlc2tcIiAjZGVzaz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtc3RhY2tcIiByb2xlPVwibWVudVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1ZlcnNpb25zIG9mICcgKyB2LnRpdGxlXCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIWZhbm5lZFwiIChrZXlkb3duKT1cImRlc2tLZXlzKCRldmVudClcIj5cbiAgICAgICAgICAgICAgQGZvciAoeCBvZiB2ZXJzaW9uczsgdHJhY2sgc2hJZHg7IGxldCBzaElkeCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tYWZ4LXNoXCIgW2NsYXNzLnZvLWJsYW5rXT1cIndyaXRpbmcgJiYgc2hJZHggPT09IGxhc3RcIiByb2xlPVwibWVudWl0ZW1yYWRpb1wiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWldPVwic2hJZHhcIiBbYXR0ci5hcmlhLWNoZWNrZWRdPVwic2hJZHggPT09IGlcIiBbYXR0ci50YWJpbmRleF09XCJmYW5uZWQgJiYgc2hJZHggPT09IGkgPyAwIDogLTFcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIndicgKyAoc2hJZHggKyAxKSArICcsICcgKyB4Lm1ldGEgKyAoeC5ub3RlID8gJzogJyArIHgubm90ZSA6ICcnKVwiIFtzdHlsZV09XCJzaGVldFN0eWxlKHNoSWR4KVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hlZXRDbGljayhzaElkeCwgJGFueSgkZXZlbnQuY3VycmVudFRhcmdldCkpXCJcbiAgICAgICAgICAgICAgICAgIChwb2ludGVyZW50ZXIpPVwiZmFubmVkICYmIHNldFBlZWsoc2hJZHgpXCIgKHBvaW50ZXJsZWF2ZSk9XCJmYW5uZWQgJiYgc2V0UGVlayhudWxsKVwiXG4gICAgICAgICAgICAgICAgICAoZm9jdXMpPVwiZmFubmVkICYmIHNldFBlZWsoc2hJZHgpXCIgKGJsdXIpPVwiZmFubmVkICYmIHNldFBlZWsobnVsbClcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LXBnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LXN0LWtcIj48c3Bhbj57eyB3cml0aW5nICYmIHNoSWR4ID09PSBsYXN0ID8gJ1dyaXRpbmfigKYnIDogJ3YnICsgKHNoSWR4ICsgMSkgfX08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1zdC1oXCI+e3sgd3JpdGluZyAmJiBzaElkeCA9PT0gbGFzdCA/IHR5cGVkVGl0bGUgOiB4LnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1zdC1sc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGxuIG9mIHN0YWNrTGluZXMoc2hJZHgpOyB0cmFjayBsbklkeDsgbGV0IGxuSWR4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGxuLnQgPT09ICdzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1nYXBcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hZngtclwiIFtjbGFzcy52by1uXT1cImxuLnQgPT09ICduJ1wiPkBpZiAobG4udCAhPT0gJ3AnKSB7PGI+PC9iPn08aSBbc3R5bGUuLS12by13XT1cImxuLncgKyAnJSdcIj48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKHNoSWR4ID09PSBsYXN0KSB7PHNwYW4gY2xhc3M9XCJ2by1hZngtcGVuXCI+PC9zcGFuPn1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LXRhYlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjx2by1pY29uIG5hbWU9XCJjaGVja1wiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj48c3Bhbj52e3sgc2hJZHggKyAxIH19PC9zcGFuPjxzcGFuIGNsYXNzPVwidm8tYWZ4LXRhXCI+IMK3IHt7IHNob3J0TWV0YSh4Lm1ldGEpIH19PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1jYXBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtc3QtdFwiPnt7IHYudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtbWV0YSB2by1hZngtc3QtbVwiPjxzcGFuIGNsYXNzPVwidm8tYWZ4LXdyIHZvLXNoaW1cIj57eyBzdGF0dXMgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LWZpblwiIFtjbGFzcy52by1lbnRlcl09XCJzZXR0bGVkXCI+PHNwYW4+e3sga2luZCB9fTwvc3Bhbj48c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj7Ctzwvc3Bhbj48c3BhbiBjbGFzcz1cInZvLWFmeC12XCI+dnt7IHNob3duICsgMSB9fTwvc3Bhbj48c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj7Ctzwvc3Bhbj48c3BhbiBjbGFzcz1cInZvLWFmeC13aGVuXCIgW2lubmVySFRNTF09XCJ3aGVuSHRtbCh2ZXJzaW9uc1tzaG93bl0ubWV0YSlcIj48L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZm9sZCB2by1hZngtbndcIiBbY2xhc3Mudm8tc2h1dF09XCIhZmFubmVkXCI+PGRpdj48ZGl2IGNsYXNzPVwidm8tYWZ4LW5vdGVcIj57eyB2ZXJzaW9uc1tzaG93bl0ubm90ZSB9fTwvZGl2PjwvZGl2PjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtc3QtYWN0XCI+XG4gICAgICAgICAgICBAaWYgKG4gPiAxKSB7XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tcGlsbCB2by1zbSB2by1saW5lIHZvLWFmeC1mYW5cIiAjZmFuQnRuIGFyaWEtaGFzcG9wdXA9XCJtZW51XCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJmYW5uZWRcIiAoY2xpY2spPVwiZmFuKCFmYW5uZWQsIHRydWUpXCI+PHZvLWljb24gbmFtZT1cImNsb2NrXCI+PC92by1pY29uPjxzcGFuPlZlcnNpb25zPC9zcGFuPjwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJhY3Rpb25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tc20gdm8tYWNjZW50IHZvLWFmeC1vcGVuXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJvcGVuTGFiZWwgPz8gJ09wZW4gJyArIHYudGl0bGVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid3JpdGluZ1wiIChjbGljayk9XCJvcGVuU3RhY2soJGFueSgkZXZlbnQuY3VycmVudFRhcmdldCkpXCI+PHZvLWljb24gbmFtZT1cImV4dFwiPjwvdm8taWNvbj48c3BhbiBjbGFzcz1cInZvLWFmeC1sYmxcIj5PcGVuPC9zcGFuPjwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPCEtLSB0aGUgb3BlbmVkIGZpbGU6IGEgbW9kYWwgcmVhZGVyIG92ZXIgdGhlIGNhcmQncyBuZWFyZXN0IHBvc2l0aW9uZWQgYW5jZXN0b3IgLS0+XG4gICAgICBAaWYgKHJlYWRpbmcpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1zaGVldFwiICNzaGVldCAoa2V5ZG93bik9XCJyZWFkZXJLZXlzKCRldmVudClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LXNjcmltXCIgI3NjcmltIChjbGljayk9XCJjbG9zZVJlYWRlcigpXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1wYW5cIiBbY2xhc3Mudm8tYWZ4LXBhZ2VdPVwicmVhZGluZy5raW5kID09PSAncGFnZSdcIiBbY2xhc3Mudm8tYWZ4LXZpZXddPVwicmVhZGluZy5raW5kID09PSAndmlldydcIlxuICAgICAgICAgICAgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ2LnRpdGxlXCIgdGFiaW5kZXg9XCItMVwiICNwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LXBoXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LWljXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PHZvLWljb24gW25hbWVdPVwiaWNvblwiPjwvdm8taWNvbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtcHR4XCI+PGRpdiBjbGFzcz1cInZvLWFmeC1wdFwiPnt7IHYudGl0bGUgfX08L2Rpdj48ZGl2IGNsYXNzPVwidm8tYWZ4LXBtXCI+e3sga2luZCB9fSDCtyB2e3sgaSArIDEgfX0gwrcge3sgdi5tZXRhIH19PC9kaXY+PC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8taWIgdm8tYWZ4LXhcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAjY2xvc2VCdG4gKGNsaWNrKT1cImNsb3NlUmVhZGVyKClcIj48dm8taWNvbiBuYW1lPVwieFwiPjwvdm8taWNvbj48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1wYlwiIHRhYmluZGV4PVwiMFwiIHJvbGU9XCJyZWdpb25cIiBbYXR0ci5hcmlhLWxhYmVsXT1cInYudGl0bGUgKyAnLCB2JyArIChpICsgMSlcIj5cbiAgICAgICAgICAgICAgQGlmIChleHQgPT09ICdjc3YnKSB7XG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidm8tYWZ4LXRiXCI+XG4gICAgICAgICAgICAgICAgICA8dGhlYWQ+PHRyPkBmb3IgKGggb2YgY3N2Um93c1swXTsgdHJhY2sgJGluZGV4KSB7PHRoIHNjb3BlPVwiY29sXCIgW2NsYXNzLnZvLW51bV09XCIkaW5kZXhcIj57eyBoIH19PC90aD59PC90cj48L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgPHRib2R5PkBmb3IgKHJvdyBvZiBjc3ZSb3dzLnNsaWNlKDEpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPHRyPkBmb3IgKGNlbGwgb2Ygcm93OyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKCRpbmRleCkgezx0ZCBjbGFzcz1cInZvLW51bVwiPnt7IGNlbGwgfX08L3RkPn0gQGVsc2Ugezx0aCBzY29wZT1cInJvd1wiPnt7IGNlbGwgfX08L3RoPn1cbiAgICAgICAgICAgICAgICAgICAgfTwvdHI+XG4gICAgICAgICAgICAgICAgICB9PC90Ym9keT5cbiAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAZm9yIChiIG9mIGJvZHlCbG9ja3M7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgQHN3aXRjaCAoYi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlICgnaDMnKSB7IDxoMz57eyBiLnRleHQgfX08L2gzPiB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlICgndWwnKSB7IDx1bD5AZm9yIChsaSBvZiBiLml0ZW1zOyB0cmFjayAkaW5kZXgpIHs8bGk+e3sgbGkgfX08L2xpPn08L3VsPiB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlICgnb2wnKSB7IDxvbD5AZm9yIChsaSBvZiBiLml0ZW1zOyB0cmFjayAkaW5kZXgpIHs8bGk+e3sgbGkgfX08L2xpPn08L29sPiB9XG4gICAgICAgICAgICAgICAgICAgIEBkZWZhdWx0IHsgPHA+e3sgYi50ZXh0IH19PC9wPiB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtcGZcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLXNtIHZvLWxpbmUgdm8tYWZ4LWNvcHlcIiBbY2xhc3Mudm8tY29waWVkXT1cImZsYXNoZWQgPT09ICdyY29weSdcIiAoY2xpY2spPVwiY29weSgncmNvcHknKVwiPjx2by1pY29uIFtuYW1lXT1cImZsYXNoZWQgPT09ICdyY29weScgPyAnY2hlY2snIDogJ2NvcHknXCIgc2l6ZT1cInNtXCI+PC92by1pY29uPjxzcGFuIGNsYXNzPVwidm8tYWZ4LWxibFwiPnt7IGZsYXNoZWQgPT09ICdyY29weScgPyAnQ29waWVkJyA6ICdDb3B5JyB9fTwvc3Bhbj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLXNtIHZvLWxpbmUgdm8tYWZ4LWRsXCIgW2NsYXNzLnZvLWNvcGllZF09XCJmbGFzaGVkID09PSAncmRsJ1wiIChjbGljayk9XCJkb3dubG9hZCgncmRsJylcIj48dm8taWNvbiBbbmFtZV09XCJmbGFzaGVkID09PSAncmRsJyA/ICdjaGVjaycgOiAnY2hldi1kJ1wiIHNpemU9XCJzbVwiPjwvdm8taWNvbj48c3BhbiBjbGFzcz1cInZvLWFmeC1sYmxcIj57eyBmbGFzaGVkID09PSAncmRsJyA/ICdEb3dubG9hZGVkJyA6ICdEb3dubG9hZCcgfX08L3NwYW4+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gdGhlIHZlcnNpb25zIG1lbnUsIHNoYXJlZCBieSB0aGUgY29tcGFjdCwgcHJldmlldyBhbmQgaW5saW5lIHZhcmlhbnRzIC0tPlxuICAgICAgPG5nLXRlbXBsYXRlICN2ZXJzaW9uc01lbnU+XG4gICAgICAgIEBpZiAobiA+IDEpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tcG9wIHZvLWFmeC1tZW51XCIgW2NsYXNzLnZvLW9wZW5dPVwibWVudU9wZW5cIiByb2xlPVwibWVudVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1ZlcnNpb25zIG9mICcgKyB2LnRpdGxlXCJcbiAgICAgICAgICAgICNtZW51RWwgW2F0dHIuaW5lcnRdPVwibWVudU9wZW4gPyBudWxsIDogJydcIiBbc3R5bGUubGVmdC5weF09XCJtZW51TGVmdFwiIFtzdHlsZS50b3AucHhdPVwibWVudVRvcFwiIChrZXlkb3duKT1cIm1lbnVLZXlzKCRldmVudClcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1waFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlZlcnNpb25zPC9kaXY+XG4gICAgICAgICAgICBAZm9yIChuMiBvZiByZXZlcnNlZDsgdHJhY2sgbjIpIHtcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1taVwiIHJvbGU9XCJtZW51aXRlbXJhZGlvXCIgdGFiaW5kZXg9XCItMVwiIFthdHRyLmFyaWEtY2hlY2tlZF09XCJuMiA9PT0gaVwiIFthdHRyLmRhdGEtaV09XCJuMlwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInBpY2tGcm9tTWVudShuMilcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1tYlwiPjxzcGFuPnZ7eyBuMiArIDEgfX08c3BhbiBjbGFzcz1cInZvLWFmeC1td1wiPiDCtyB7eyBzaG9ydE1ldGEodmVyc2lvbnNbbjJdLm1ldGEpIH19PC9zcGFuPjwvc3Bhbj5AaWYgKHZlcnNpb25zW24yXS5ub3RlKSB7PHNwYW4gY2xhc3M9XCJ2by1kXCI+e3sgdmVyc2lvbnNbbjJdLm5vdGUgfX08L3NwYW4+fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiY2hlY2tcIiBjbGFzcz1cInZvLWNrXCIgc2l6ZT1cInNtXCI+PC92by1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPCEtLSB0aGUgbWV0YSBsaW5lLCBzaGFyZWQgYnkgdGhlIGNvbXBhY3QgYW5kIHByZXZpZXcgdmFyaWFudHMgLS0+XG4gICAgICA8bmctdGVtcGxhdGUgI21ldGFMaW5lPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LW1ldGFcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC13ciB2by1zaGltXCI+e3sgc3RhdHVzIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LWZpblwiIFtjbGFzcy52by1lbnRlcl09XCJzZXR0bGVkXCI+XG4gICAgICAgICAgICA8c3Bhbj57eyBraW5kIH19PC9zcGFuPjxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPsK3PC9zcGFuPlxuICAgICAgICAgICAgQGlmIChuID4gMSkge1xuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLWFmeC12YlwiIGFyaWEtaGFzcG9wdXA9XCJtZW51XCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJtZW51T3BlblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIndicgKyAoaSArIDEpICsgJyBvZiAnICsgbiArICcgdmVyc2lvbnMnXCIgKGNsaWNrKT1cInRvZ2dsZU1lbnUoJGFueSgkZXZlbnQuY3VycmVudFRhcmdldCkpXCIgKGtleWRvd24pPVwidHJpZ2dlcktleXMoJGV2ZW50KVwiPjxzcGFuIGNsYXNzPVwidm8tYWZ4LXZ0XCI+dnt7IGkgKyAxIH19PC9zcGFuPjx2by1pY29uIG5hbWU9XCJjaGV2LWRcIiBzaXplPVwieHNcIj48L3ZvLWljb24+PC9idXR0b24+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hZngtdlwiPnYxPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+wrc8L3NwYW4+PHNwYW4gY2xhc3M9XCJ2by1hZngtd2hlblwiIFtpbm5lckhUTUxdPVwid2hlbkh0bWwodi5tZXRhKVwiPjwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPCEtLSBDb3B5IGFuZCBEb3dubG9hZCwgc2hhcmVkIGJ5IGV2ZXJ5IHZhcmlhbnQgLS0+XG4gICAgICA8bmctdGVtcGxhdGUgI2FjdGlvbnM+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8taWIgdm8tYWZ4LWNvcHlcIiBbY2xhc3Mudm8tY29waWVkXT1cImZsYXNoZWQgPT09ICdjb3B5J1wiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0NvcHkgJyArIHYudGl0bGVcIiAoY2xpY2spPVwiY29weSgnY29weScpXCI+PHZvLWljb24gW25hbWVdPVwiZmxhc2hlZCA9PT0gJ2NvcHknID8gJ2NoZWNrJyA6ICdjb3B5J1wiIFtzaXplXT1cImFjdGlvblNpemVcIj48L3ZvLWljb24+PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8taWIgdm8tYWZ4LWRsXCIgW2NsYXNzLnZvLWNvcGllZF09XCJmbGFzaGVkID09PSAnZGwnXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInRG93bmxvYWQgJyArIHYudGl0bGVcIiAoY2xpY2spPVwiZG93bmxvYWQoJ2RsJylcIj48dm8taWNvbiBbbmFtZV09XCJmbGFzaGVkID09PSAnZGwnID8gJ2NoZWNrJyA6ICdjaGV2LWQnXCIgW3NpemVdPVwiYWN0aW9uU2l6ZVwiPjwvdm8taWNvbj48L2J1dHRvbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtc3JcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCI+e3sgc2FpZCB9fTwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vYXJ0aWZhY3QtY2FyZC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBBcnRpZmFjdENhcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBIb3cgdGhlIGNhcmQgc2hvd3MgdGhlIGZpbGUuICovXG4gIEBJbnB1dCgpIHZhcmlhbnQ6IEFydGlmYWN0VmFyaWFudCA9ICdjb21wYWN0JztcbiAgLyoqIFRoZSB2ZXJzaW9ucywgb2xkZXN0IGZpcnN0LiAqL1xuICBASW5wdXQoKSB2ZXJzaW9uczogQXJ0aWZhY3RWZXJzaW9uW10gPSBbXTtcbiAgLyoqIEluZGV4IG9mIHRoZSB2ZXJzaW9uIHNob3duLiBMZWF2ZSBpdCBvdXQgdG8gbGV0IHRoZSB2ZXJzaW9ucyBtZW51IGNoYW5nZSBpdC4gKi9cbiAgQElucHV0KCkgdmVyc2lvbj86IG51bWJlcjtcbiAgLyoqIERlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi4gKi9cbiAgQElucHV0KCkgZGVmYXVsdFZlcnNpb24/OiBudW1iZXI7XG4gIC8qKiAnd3JpdGluZycgd2hpbGUgdGhlIGFnZW50IGlzIHN0aWxsIG1ha2luZyB0aGUgZmlsZTsgJ3JlYWR5JyBvbmNlIGl0IGlzIGRvbmUuICovXG4gIEBJbnB1dCgpIHN0YXRlOiBBcnRpZmFjdFN0YXRlID0gJ3JlYWR5JztcbiAgLyoqIFRoZSBsaW5lIHNob3duIHdoaWxlIHdyaXRpbmcsIGxpa2UgXCJSZWFkaW5nIHRoZSBwYWdl4oCmXCIuICovXG4gIEBJbnB1dCgpIHN0YXR1cyA9ICdXcml0aW5n4oCmJztcbiAgLyoqIEhvdyBmYXIgdGhlIHdyaXRpbmcgaGFzIGdvdCwgZnJvbSAwIHRvIDEgKHRoZSBjb21wYWN0IGNhcmQgZHJhd3MgaXQgYWxvbmcgaXRzIGJvdHRvbSBlZGdlKS4gKi9cbiAgQElucHV0KCkgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gIC8qKiBUaGUga2luZCBvZiBmaWxlIG9uIHRoZSBtZXRhIGxpbmUsIGxpa2UgXCJSZXBvcnRcIiBvciBcIlRhYmxlXCIuICovXG4gIEBJbnB1dCgpIGtpbmQgPSAnUmVwb3J0JztcbiAgLyoqIFRoZSBmaWxlJ3MgaWNvbi4gKi9cbiAgQElucHV0KCkgaWNvbjogVm9JY29uTmFtZSA9ICdmaWxlLXRleHQnO1xuICAvKiogVGhlIG5hbWUgRG93bmxvYWQgc2F2ZXMgdW5kZXIsIGJlZm9yZSBcIi12My5tZFwiLiBEZWZhdWx0cyB0byB0aGUgdGl0bGUgaW4gbG93ZXJjYXNlLCB3aXRoIGRhc2hlcy4gKi9cbiAgQElucHV0KCkgZmlsZU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBUaGUgZXh0ZW5zaW9uIERvd25sb2FkIHNhdmVzIHdpdGguIFwiY3N2XCIgYWxzbyBzaG93cyB0aGUgY29udGVudCBhcyBhIHRhYmxlIGluIHRoZSByZWFkZXIuICovXG4gIEBJbnB1dCgpIGV4dCA9ICdtZCc7XG4gIC8qKiBUaGUgT3BlbiBidXR0b24ncyB0aXAsIGxpa2UgXCJPcGVuIGJlc2lkZSB0aGUgY2hhdFwiLiBJdHMgbGFiZWwgc3RheXMgXCJPcGVuXCIuICovXG4gIEBJbnB1dCgpIG9wZW5MYWJlbD86IHN0cmluZztcbiAgQElucHV0KCkgY2xhc3NOYW1lID0gJyc7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgc2hvd24gdmVyc2lvbiBjaGFuZ2VzLiAqL1xuICBAT3V0cHV0KCkgdmVyc2lvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSBmaWxlIGlzIG9wZW5lZCwgd2l0aCB0aGUgdmVyc2lvbiBzaG93bi4gV2l0aCBhIGxpc3RlbmVyLCBPcGVuIGRvZXMgbm90IHNob3cgdGhlIGNhcmQncyBvd24gcmVhZGVyLiAqL1xuICBAT3V0cHV0KCkgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIC8qKiBFbWl0dGVkIGFmdGVyIENvcHkgaGFzIHB1dCB0aGUgdmVyc2lvbidzIGNvbnRlbnQgb24gdGhlIGNsaXBib2FyZC4gKi9cbiAgQE91dHB1dCgpIGNvcGllZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICAvKiogRW1pdHRlZCBhZnRlciBEb3dubG9hZCBoYXMgc2F2ZWQgdGhlIHZlcnNpb24ncyBjb250ZW50IGFzIGEgZmlsZS4gKi9cbiAgQE91dHB1dCgpIGRvd25sb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBAVmlld0NoaWxkKCdtZW51RWwnKSBwcml2YXRlIG1lbnVFbD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdkZXNrJykgcHJpdmF0ZSBkZXNrPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2ZhbkJ0bicpIHByaXZhdGUgZmFuQnRuPzogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhbicpIHByaXZhdGUgcGFuPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2Nsb3NlQnRuJykgcHJpdmF0ZSBjbG9zZUJ0bj86IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW90aW9uID0gaW5qZWN0KFJlZHVjZWRNb3Rpb25TZXJ2aWNlKTtcblxuICAvLyB3aGljaCB2ZXJzaW9uIGlzIHNob3duICh1bmNvbnRyb2xsZWQgdW5sZXNzIGB2ZXJzaW9uYCBpcyBzZXQpXG4gIHByaXZhdGUgY3VySW5kZXggPSAwO1xuICBwcml2YXRlIGNvbnRyb2xsZWQgPSBmYWxzZTtcbiAgZmxhc2hlZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZmxhc2hUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBzYWlkID0gJyc7XG4gIHByaXZhdGUgc2F5VGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgc2V0dGxlZCA9IGZhbHNlO1xuICBwcml2YXRlIHdhc1dyaXRpbmcgPSBmYWxzZTtcbiAgcmVhZGluZzogUmVhZGluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG9wZW5lckVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8vIHZlcnNpb25zIG1lbnVcbiAgbWVudU9wZW4gPSBmYWxzZTtcbiAgbWVudUxlZnQgPSAwO1xuICBtZW51VG9wID0gMDtcbiAgcHJpdmF0ZSBvcGVuZXJUcmlnZ2VyPzogSFRNTEVsZW1lbnQ7XG5cbiAgLy8gc3RhY2tcbiAgZmFubmVkID0gZmFsc2U7XG4gIHBlZWs6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICB0eXBlZFRpdGxlID0gJyc7XG4gIHByaXZhdGUgc3RhY2tUaW1lcnM6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+W10gPSBbXTtcbiAgcHJpdmF0ZSBzdGFja0FuaW1zOiBBbmltYXRpb25bXSA9IFtdO1xuXG4gIHByaXZhdGUgb25Eb2NQb2ludGVyID0gKGU6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgIGNvbnN0IHQgPSBlLnRhcmdldCBhcyBOb2RlO1xuICAgIGlmICh0aGlzLm1lbnVPcGVuICYmICF0aGlzLm1lbnVFbD8ubmF0aXZlRWxlbWVudC5jb250YWlucyh0KSAmJiAhdGhpcy5vcGVuZXJUcmlnZ2VyPy5jb250YWlucyh0KSkge1xuICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmFubmVkICYmICF0aGlzLmRlc2s/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModCkgJiYgIXRoaXMuZmFuQnRuPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHQpKSB7XG4gICAgICB0aGlzLmZhbihmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndmVyc2lvbiddKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZWQgPSB0aGlzLnZlcnNpb24gIT09IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLnZlcnNpb24gIT09IHVuZGVmaW5lZCkgdGhpcy5jdXJJbmRleCA9IHRoaXMudmVyc2lvbjtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2RlZmF1bHRWZXJzaW9uJ10gJiYgIXRoaXMuY29udHJvbGxlZCAmJiB0aGlzLmRlZmF1bHRWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY3VySW5kZXggPSB0aGlzLmRlZmF1bHRWZXJzaW9uO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmVyc2lvbnMnXSAmJiAhdGhpcy5jb250cm9sbGVkICYmIHRoaXMuZGVmYXVsdFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXJJbmRleCA9IE1hdGgubWF4KDAsIHRoaXMudmVyc2lvbnMubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzdGF0ZSddKSB7XG4gICAgICBjb25zdCB3cml0aW5nID0gdGhpcy5zdGF0ZSA9PT0gJ3dyaXRpbmcnO1xuICAgICAgaWYgKHRoaXMud2FzV3JpdGluZyAmJiAhd3JpdGluZykge1xuICAgICAgICB0aGlzLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNheShgJHt0aGlzLnYudGl0bGV9IGlzIHJlYWR5LCB2JHt0aGlzLmkgKyAxfWApO1xuICAgICAgfVxuICAgICAgdGhpcy53YXNXcml0aW5nID0gd3JpdGluZztcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZhcmlhbnQnXSB8fCBjaGFuZ2VzWydzdGF0ZSddKSB0aGlzLnJlc3RhcnRTdGFjaygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMud2FzV3JpdGluZyA9IHRoaXMuc3RhdGUgPT09ICd3cml0aW5nJztcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub25Eb2NQb2ludGVyKTtcbiAgICB0aGlzLnJlc3RhcnRTdGFjaygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uRG9jUG9pbnRlcik7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmxhc2hUaW1lcik7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuc2F5VGltZXIpO1xuICAgIHRoaXMuY2xlYXJTdGFjaygpO1xuICB9XG5cbiAgLy8gLS0tLSBkZXJpdmVkIHN0YXRlIC0tLS1cbiAgZ2V0IG4oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMudmVyc2lvbnMubGVuZ3RoOyB9XG4gIGdldCBsYXN0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLm4gLSAxOyB9XG4gIGdldCBpKCk6IG51bWJlciB7IHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLmxhc3QsIHRoaXMuY3VySW5kZXgpKTsgfVxuICBnZXQgdigpOiBBcnRpZmFjdFZlcnNpb24geyByZXR1cm4gdGhpcy52ZXJzaW9uc1t0aGlzLmldID8/IHsgdGl0bGU6ICcnLCBtZXRhOiAnJywgY29udGVudDogJycgfTsgfVxuICBnZXQgd3JpdGluZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc3RhdGUgPT09ICd3cml0aW5nJzsgfVxuICBnZXQgc2hvd24oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZmFubmVkICYmIHRoaXMucGVlayAhPSBudWxsID8gdGhpcy5wZWVrIDogdGhpcy5pOyB9XG4gIGdldCByZXZlcnNlZCgpOiBudW1iZXJbXSB7IHJldHVybiB0aGlzLnZlcnNpb25zLm1hcCgoXywgaykgPT4gaykucmV2ZXJzZSgpOyB9XG4gIGdldCBhY3Rpb25TaXplKCk6ICdzbScgfCAnbWQnIHsgcmV0dXJuIHRoaXMudmFyaWFudCA9PT0gJ2lubGluZScgfHwgdGhpcy52YXJpYW50ID09PSAncHJldmlldycgPyAnc20nIDogJ21kJzsgfVxuICBnZXQgc3VtbWFyeSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy52LnN1bW1hcnkgPz8gZmlyc3RQYXJhKHRoaXMudi5jb250ZW50KTsgfVxuICBnZXQgcHJldmlld1dpZHRocygpOiBudW1iZXJbXSB7IHJldHVybiBXSURUSFNbdGhpcy5pICUgM107IH1cblxuICBjbGFtcCh4PzogbnVtYmVyKTogbnVtYmVyIHsgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHggPz8gMCkpOyB9XG4gIHNob3J0TWV0YShtZXRhOiBzdHJpbmcpOiBzdHJpbmcgeyByZXR1cm4gYWdvKG1ldGEpOyB9XG4gIHdoZW5IdG1sKG1ldGE6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2hvcnQgPSBhZ28obWV0YSk7XG4gICAgcmV0dXJuIHNob3J0ID09PSBtZXRhID8gbWV0YSA6IGA8c3BhbiBjbGFzcz1cInZvLWFmeC1lZFwiPmVkaXRlZCA8L3NwYW4+JHtzaG9ydH1gO1xuICB9XG4gIHN0YWNrTGluZXMobjogbnVtYmVyKTogTGluZVtdIHsgcmV0dXJuIExJTkVTW24gPT09IHRoaXMubGFzdCA/IDIgOiBuICUgMl07IH1cblxuICBnZXQgY3N2Um93cygpOiBzdHJpbmdbXVtdIHtcbiAgICByZXR1cm4gdGhpcy52LmNvbnRlbnQudHJpbSgpLnNwbGl0KCdcXG4nKS5tYXAoKHIpID0+IHIuc3BsaXQoJywnKSk7XG4gIH1cbiAgZ2V0IGJvZHlCbG9ja3MoKTogQmxvY2tbXSB7XG4gICAgY29uc3Qgb3V0OiBCbG9ja1tdID0gW107XG4gICAgdGhpcy52LmNvbnRlbnQuc3BsaXQoL1xcblxccypcXG4vKS5tYXAoKGIpID0+IGIudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaCgoYikgPT4ge1xuICAgICAgY29uc3QgbGluZXMgPSBiLnNwbGl0KCdcXG4nKTtcbiAgICAgIGlmICgvXiMgLy50ZXN0KGIpKSByZXR1cm47XG4gICAgICBpZiAoL14jezIsfSAvLnRlc3QoYikpIG91dC5wdXNoKHsga2luZDogJ2gzJywgdGV4dDogYi5yZXBsYWNlKC9eIysgLywgJycpIH0pO1xuICAgICAgZWxzZSBpZiAobGluZXMuZXZlcnkoKGwpID0+IC9eWy0qXSAvLnRlc3QobCkpKSBvdXQucHVzaCh7IGtpbmQ6ICd1bCcsIGl0ZW1zOiBsaW5lcy5tYXAoKGwpID0+IGwuc2xpY2UoMikpIH0pO1xuICAgICAgZWxzZSBpZiAobGluZXMuZXZlcnkoKGwpID0+IC9eXFxkK1xcLiAvLnRlc3QobCkpKSBvdXQucHVzaCh7IGtpbmQ6ICdvbCcsIGl0ZW1zOiBsaW5lcy5tYXAoKGwpID0+IGwucmVwbGFjZSgvXlxcZCtcXC4gLywgJycpKSB9KTtcbiAgICAgIGVsc2Ugb3V0LnB1c2goeyBraW5kOiAncCcsIHRleHQ6IGIgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8vIC0tLS0gYW5ub3VuY2VtZW50cyBhbmQgZmVlZGJhY2sgLS0tLVxuICBwcml2YXRlIHNheShtc2c6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2FpZCA9ICcnO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnNheVRpbWVyKTtcbiAgICB0aGlzLnNheVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiAodGhpcy5zYWlkID0gbXNnKSwgNjApO1xuICB9XG4gIHByaXZhdGUgZmxhc2goa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmZsYXNoZWQgPSBrZXk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmxhc2hUaW1lcik7XG4gICAgdGhpcy5mbGFzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiAodGhpcy5mbGFzaGVkID0gbnVsbCksIDE2MDApO1xuICB9XG5cbiAgLy8gLS0tLSBhY3Rpb25zIC0tLS1cbiAgcHJpdmF0ZSBwaWNrKG5uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAobm4gPT09IHRoaXMuaSkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jb250cm9sbGVkKSB0aGlzLmN1ckluZGV4ID0gbm47XG4gICAgdGhpcy52ZXJzaW9uQ2hhbmdlLmVtaXQobm4pO1xuICAgIHRoaXMuc2F5KGBTaG93aW5nIHYke25uICsgMX0sICR7dGhpcy52ZXJzaW9uc1tubl0ubWV0YX1gKTtcbiAgfVxuICBjb3B5KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHsgbmF2aWdhdG9yLmNsaXBib2FyZD8ud3JpdGVUZXh0KHRoaXMudi5jb250ZW50KS5jYXRjaCgoKSA9PiB7fSk7IH0gY2F0Y2ggeyAvKiB0aGUgcGFnZSBtYXkgbm90IHdyaXRlIHRvIHRoZSBjbGlwYm9hcmQgKi8gfVxuICAgIHRoaXMuZmxhc2goa2V5KTtcbiAgICB0aGlzLnNheShgQ29waWVkICR7dGhpcy52LnRpdGxlfSwgdiR7dGhpcy5pICsgMX0sIHRvIHRoZSBjbGlwYm9hcmRgKTtcbiAgICB0aGlzLmNvcGllZC5lbWl0KHRoaXMuaSk7XG4gIH1cbiAgZG93bmxvYWQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gYCR7dGhpcy5maWxlTmFtZSA/PyBzbHVnKHRoaXMudi50aXRsZSl9LXYke3RoaXMuaSArIDF9LiR7dGhpcy5leHR9YDtcbiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0aGlzLnYuY29udGVudF0sIHsgdHlwZTogTUlNRVt0aGlzLmV4dF0gPz8gJ3RleHQvcGxhaW4nIH0pKTtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IHVybDsgYS5kb3dubG9hZCA9IG5hbWU7IGEuaGlkZGVuID0gdHJ1ZTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChhKTsgYS5jbGljaygpOyBhLnJlbW92ZSgpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpLCA1MDAwKTtcbiAgICB0aGlzLmZsYXNoKGtleSk7XG4gICAgdGhpcy5zYXkoYERvd25sb2FkZWQgJHtuYW1lfWApO1xuICAgIHRoaXMuZG93bmxvYWRlZC5lbWl0KHRoaXMuaSk7XG4gIH1cbiAgb3BlbihraW5kT2Y6ICd2aWV3JyB8ICdwYWdlJywgb3BlbmVyOiBIVE1MRWxlbWVudCB8IG51bGwsIHNyYzogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud3JpdGluZykgcmV0dXJuO1xuICAgIGlmICh0aGlzLm9wZW5lZC5vYnNlcnZlZCkgeyB0aGlzLm9wZW5lZC5lbWl0KHRoaXMuaSk7IHJldHVybjsgfVxuICAgIHRoaXMub3BlbmVyRWwgPSBvcGVuZXI7XG4gICAgdGhpcy5yZWFkaW5nID0geyBraW5kOiBraW5kT2YsIHNyYywgb3BlbmVyIH07XG4gICAgdGhpcy5zYXkoYE9wZW5lZCAke3RoaXMudi50aXRsZX0sIHYke3RoaXMuaSArIDF9YCk7XG4gICAgLy8gbW92ZSBmb2N1cyBpbnRvIHRoZSBkaWFsb2cgb25jZSBpdCByZW5kZXJzXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmNsb3NlQnRuPy5uYXRpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KSk7XG4gIH1cbiAgY2xvc2VSZWFkZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZWFkaW5nID0gbnVsbDtcbiAgICB0aGlzLm9wZW5lckVsPy5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gIH1cbiAgcmVhZGVyS2V5cyhlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRoaXMuY2xvc2VSZWFkZXIoKTsgcmV0dXJuOyB9XG4gICAgaWYgKGUua2V5ICE9PSAnVGFiJyB8fCAhdGhpcy5wYW4pIHJldHVybjtcbiAgICBjb25zdCBmID0gWy4uLnRoaXMucGFuLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ2J1dHRvbixbdGFiaW5kZXg9XCIwXCJdJyldO1xuICAgIGNvbnN0IGZpcnN0ID0gZlswXSwgbGFzdEVsID0gZltmLmxlbmd0aCAtIDFdO1xuICAgIGlmIChlLnNoaWZ0S2V5ICYmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBmaXJzdCB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnBhbi5uYXRpdmVFbGVtZW50KSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGxhc3RFbD8uZm9jdXMoKTsgfVxuICAgIGVsc2UgaWYgKCFlLnNoaWZ0S2V5ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGxhc3RFbCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGZpcnN0Py5mb2N1cygpOyB9XG4gIH1cblxuICAvLyAtLS0tIHZlcnNpb25zIG1lbnUgLS0tLVxuICB0b2dnbGVNZW51KHRyaWdnZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5tZW51T3BlbiA/IHRoaXMuY2xvc2VNZW51KCkgOiB0aGlzLm9wZW5NZW51KHRyaWdnZXIpO1xuICB9XG4gIHByaXZhdGUgb3Blbk1lbnUodHJpZ2dlcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5lclRyaWdnZXIgPSB0cmlnZ2VyO1xuICAgIHRoaXMubWVudU9wZW4gPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5wbGFjZU1lbnUodHJpZ2dlcik7XG4gICAgICBjb25zdCBtZW51ID0gdGhpcy5tZW51RWw/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBiID0gbWVudT8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1thcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdJykgPz8gbWVudT8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy52by1taScpO1xuICAgICAgYj8uZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgIH0pO1xuICB9XG4gIGNsb3NlTWVudSgpOiB2b2lkIHsgdGhpcy5tZW51T3BlbiA9IGZhbHNlOyB9XG4gIHByaXZhdGUgcGxhY2VNZW51KHRyaWdnZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgbWVudSA9IHRoaXMubWVudUVsPy5uYXRpdmVFbGVtZW50LCBob3N0ID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFtZW51KSByZXR1cm47XG4gICAgY29uc3QgaHIgPSBob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBiciA9IHRyaWdnZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5tZW51TGVmdCA9IE1hdGgucm91bmQoYnIubGVmdCAtIGhyLmxlZnQgLSA2KTtcbiAgICB0aGlzLm1lbnVUb3AgPSBNYXRoLnJvdW5kKGJyLmJvdHRvbSAtIGhyLnRvcCArIDYpO1xuICB9XG4gIHBpY2tGcm9tTWVudShubjogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5waWNrKG5uKTtcbiAgICB0aGlzLmNsb3NlTWVudSgpO1xuICAgIHRoaXMub3BlbmVyVHJpZ2dlcj8uZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICB9XG4gIHRyaWdnZXJLZXlzKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZS5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IGUua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMub3Blbk1lbnUoZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgbWVudUtleXMoZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IG1lbnUgPSB0aGlzLm1lbnVFbD8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBpdCA9IFsuLi4obWVudT8ucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy52by1taScpID8/IFtdKV07XG4gICAgY29uc3QgayA9IGl0LmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgaWYgKGUua2V5ID09PSAnQXJyb3dEb3duJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGl0WyhrICsgMSkgJSBpdC5sZW5ndGhdPy5mb2N1cygpOyB9XG4gICAgZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1VwJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGl0WyhrIC0gMSArIGl0Lmxlbmd0aCkgJSBpdC5sZW5ndGhdPy5mb2N1cygpOyB9XG4gICAgZWxzZSBpZiAoZS5rZXkgPT09ICdIb21lJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGl0WzBdPy5mb2N1cygpOyB9XG4gICAgZWxzZSBpZiAoZS5rZXkgPT09ICdFbmQnKSB7IGUucHJldmVudERlZmF1bHQoKTsgaXRbaXQubGVuZ3RoIC0gMV0/LmZvY3VzKCk7IH1cbiAgICBlbHNlIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0aGlzLmNsb3NlTWVudSgpOyB0aGlzLm9wZW5lclRyaWdnZXI/LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgfVxuICAgIGVsc2UgaWYgKGUua2V5ID09PSAnVGFiJykgeyB0aGlzLmNsb3NlTWVudSgpOyB9XG4gIH1cblxuICAvLyAtLS0tIHN0YWNrIC0tLS1cbiAgc2V0UGVlayhubjogbnVtYmVyIHwgbnVsbCk6IHZvaWQgeyB0aGlzLnBlZWsgPSBubjsgfVxuICBzaGVldFN0eWxlKG5uOiBudW1iZXIpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+IHtcbiAgICBpZiAodGhpcy5mYW5uZWQpIHtcbiAgICAgIGNvbnN0IG8gPSBubiAtIHRoaXMubGFzdCAvIDI7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUoY2FsYygke299ICogdmFyKC0tdm8tZngpKSwke01hdGguYWJzKG8pICogNiArICh0aGlzLnBlZWsgPT09IG5uID8gLTggOiAwKX1weCkgcm90YXRlKCR7byAqIDZ9ZGVnKWAsXG4gICAgICAgICd6LWluZGV4JzogdGhpcy5wZWVrID09PSBubiA/IDkgOiBubiArIDEsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBiZWhpbmQgPSB0aGlzLnZlcnNpb25zLm1hcCgoXywgaykgPT4gaykucmV2ZXJzZSgpLmZpbHRlcigoaykgPT4gayAhPT0gdGhpcy5pKTtcbiAgICBjb25zdCBkID0gbm4gPT09IHRoaXMuaSA/IDAgOiBiZWhpbmQuaW5kZXhPZihubikgKyAxO1xuICAgIHJldHVybiB7ICctLXZvLWQnOiBkLCAnei1pbmRleCc6IHRoaXMubiAtIGQgfTtcbiAgfVxuICBmYW4ob246IGJvb2xlYW4sIGZvY3VzID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53cml0aW5nKSByZXR1cm47XG4gICAgdGhpcy5mYW5uZWQgPSBvbjsgdGhpcy5wZWVrID0gbnVsbDtcbiAgICBpZiAob24gJiYgZm9jdXMpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5kZXNrPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBbZGF0YS1pPVwiJHt0aGlzLml9XCJdYCk/LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KSk7XG4gICAgfVxuICB9XG4gIHNoZWV0Q2xpY2sobm46IG51bWJlciwgZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMud3JpdGluZykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmZhbm5lZCkgeyB0aGlzLnBpY2sobm4pOyB0aGlzLmZhbihmYWxzZSk7IHRoaXMuZmFuQnRuPy5uYXRpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgfVxuICAgIGVsc2UgdGhpcy5vcGVuKCdwYWdlJywgdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy52by1hZngtb3BlbicpLCBlbCk7XG4gIH1cbiAgb3BlblN0YWNrKG9wZW5lcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53cml0aW5nKSByZXR1cm47XG4gICAgaWYgKHRoaXMuZmFubmVkKSB0aGlzLmZhbihmYWxzZSk7XG4gICAgdGhpcy5vcGVuKCdwYWdlJywgb3BlbmVyLCB0aGlzLmRlc2s/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtkYXRhLWk9XCIke3RoaXMuaX1cIl1gKSA/PyBudWxsKTtcbiAgfVxuICBkZXNrS2V5cyhlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZhbm5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IHNoZWV0cyA9IFsuLi4odGhpcy5kZXNrPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcudm8tYWZ4LXNoJykgPz8gW10pXTtcbiAgICBjb25zdCBrID0gc2hlZXRzLmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgbGV0IG5uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoZS5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBlLmtleSA9PT0gJ0Fycm93RG93bicpIG5uID0gTWF0aC5taW4odGhpcy5sYXN0LCBrICsgMSk7XG4gICAgZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd0xlZnQnIHx8IGUua2V5ID09PSAnQXJyb3dVcCcpIG5uID0gTWF0aC5tYXgoMCwgayAtIDEpO1xuICAgIGVsc2UgaWYgKGUua2V5ID09PSAnSG9tZScpIG5uID0gMDtcbiAgICBlbHNlIGlmIChlLmtleSA9PT0gJ0VuZCcpIG5uID0gdGhpcy5sYXN0O1xuICAgIGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRoaXMuZmFuKGZhbHNlKTsgdGhpcy5mYW5CdG4/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pOyByZXR1cm47IH1cbiAgICBlbHNlIGlmIChlLmtleSA9PT0gJ1RhYicpIHsgdGhpcy5mYW4oZmFsc2UpOyByZXR1cm47IH1cbiAgICBpZiAobm4gIT0gbnVsbCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHNoZWV0c1tubl0/LmZvY3VzKCk7IH1cbiAgfVxuXG4gIC8vIHdyaXRpbmc6IGEgYmxhbmsgc2hlZXQgZHJvcHMgb250byB0aGUgc3RhY2ssIHRoZSB0aXRsZSBpcyB0eXBlZCwgYW5kIGEgcGVuIGRyYXdzIGVhY2ggbGluZSBvZiB0aGUgbmV3IHBhZ2VcbiAgcHJpdmF0ZSByZXN0YXJ0U3RhY2soKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclN0YWNrKCk7XG4gICAgaWYgKHRoaXMudmFyaWFudCAhPT0gJ3N0YWNrJyB8fCAhdGhpcy53cml0aW5nKSByZXR1cm47XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJ1blN0YWNrKCkpO1xuICB9XG4gIHByaXZhdGUgY2xlYXJTdGFjaygpOiB2b2lkIHtcbiAgICB0aGlzLnN0YWNrVGltZXJzLmZvckVhY2goY2xlYXJUaW1lb3V0KTtcbiAgICB0aGlzLnN0YWNrVGltZXJzID0gW107XG4gICAgdGhpcy5zdGFja0FuaW1zLmZvckVhY2goKGEpID0+IGEuY2FuY2VsKCkpO1xuICAgIHRoaXMuc3RhY2tBbmltcyA9IFtdO1xuICAgIHRoaXMudHlwZWRUaXRsZSA9ICcnO1xuICB9XG4gIHByaXZhdGUgcnVuU3RhY2soKTogdm9pZCB7XG4gICAgY29uc3Qgc2ggPSB0aGlzLmRlc2s/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtkYXRhLWk9XCIke3RoaXMubGFzdH1cIl1gKTtcbiAgICBpZiAoIXNoKSByZXR1cm47XG4gICAgbGV0IGFsaXZlID0gdHJ1ZTtcbiAgICBjb25zdCBvbkRvbmUgPSAoKSA9PiAoYWxpdmUgPSBmYWxzZSk7XG4gICAgdGhpcy5zdGFja1RpbWVycy5wdXNoKHNldFRpbWVvdXQob25Eb25lLCA2MF8wMDApKTtcbiAgICBjb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZTx2b2lkPigocmVzLCByZWopID0+IHRoaXMuc3RhY2tUaW1lcnMucHVzaChzZXRUaW1lb3V0KCgpID0+IChhbGl2ZSA/IHJlcygpIDogcmVqKG5ldyBFcnJvcignc3RvcCcpKSksIG1zKSkpO1xuICAgIGNvbnN0IG1vdGlvbiA9ICF0aGlzLm1vdGlvbi5yZWR1Y2UoKTtcbiAgICBjb25zdCBFID0gZ2V0Q29tcHV0ZWRTdHlsZShzaCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS12by1lYXNlJykudHJpbSgpIHx8ICdlYXNlJztcbiAgICBjb25zdCBUID0gdGhpcy52ZXJzaW9uc1t0aGlzLmxhc3RdPy50aXRsZSA/PyAnJztcbiAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAobW90aW9uKSB0aGlzLnN0YWNrQW5pbXMucHVzaChzaC5hbmltYXRlKFt7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTM2cHgpJywgb3BhY2l0eTogMCB9LCB7IHRyYW5zZm9ybTogJ25vbmUnLCBvcGFjaXR5OiAxIH1dLCB7IGR1cmF0aW9uOiA3MDAsIGVhc2luZzogRSwgY29tcG9zaXRlOiAnYWRkJyB9KSk7XG4gICAgICB0aGlzLnR5cGVkVGl0bGUgPSAnJztcbiAgICAgIGF3YWl0IHNsZWVwKDMwMCk7XG4gICAgICBpZiAoIW1vdGlvbikgdGhpcy50eXBlZFRpdGxlID0gVDtcbiAgICAgIGVsc2UgZm9yIChsZXQgayA9IDE7IGsgPD0gVC5sZW5ndGg7IGsrKykgeyB0aGlzLnR5cGVkVGl0bGUgPSBULnNsaWNlKDAsIGspOyBhd2FpdCBzbGVlcCg0MCk7IH1cbiAgICAgIGF3YWl0IHNsZWVwKG1vdGlvbiA/IDI1MCA6IDApO1xuICAgICAgY29uc3QgcGVuID0gc2gucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy52by1hZngtcGVuJyk7XG4gICAgICBjb25zdCByb3dzID0gWy4uLnNoLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcudm8tYWZ4LXInKV0uZmlsdGVyKCh4KSA9PiB4Lm9mZnNldFBhcmVudCk7XG4gICAgICBmb3IgKGNvbnN0IHggb2Ygcm93cykge1xuICAgICAgICBjb25zdCBsaW5lID0geC5xdWVyeVNlbGVjdG9yKCdpJykhLCBkb3QgPSB4LnF1ZXJ5U2VsZWN0b3IoJ2InKTtcbiAgICAgICAgaWYgKCFtb3Rpb24pIHsgdGhpcy5zdGFja0FuaW1zLnB1c2gobGluZS5hbmltYXRlKFt7IHRyYW5zZm9ybTogJ25vbmUnIH1dLCB7IGZpbGw6ICdmb3J3YXJkcycgfSkpOyBpZiAoZG90KSB0aGlzLnN0YWNrQW5pbXMucHVzaChkb3QuYW5pbWF0ZShbeyB0cmFuc2Zvcm06ICdub25lJyB9XSwgeyBmaWxsOiAnZm9yd2FyZHMnIH0pKTsgYXdhaXQgc2xlZXAoMTUwKTsgY29udGludWU7IH1cbiAgICAgICAgY29uc3QgeDAgPSB4Lm9mZnNldExlZnQgKyBsaW5lLm9mZnNldExlZnQsIHgxID0geDAgKyBsaW5lLm9mZnNldFdpZHRoLCB5ID0geC5vZmZzZXRUb3AgKyB4Lm9mZnNldEhlaWdodCAvIDIgLSAzLjUsIG1zID0gMjYwICsgbGluZS5vZmZzZXRXaWR0aCAqIDEuNDtcbiAgICAgICAgaWYgKGRvdCkgdGhpcy5zdGFja0FuaW1zLnB1c2goZG90LmFuaW1hdGUoW3sgdHJhbnNmb3JtOiAnc2NhbGVYKDApJyB9LCB7IHRyYW5zZm9ybTogJ25vbmUnIH1dLCB7IGR1cmF0aW9uOiAxMjAsIGZpbGw6ICdmb3J3YXJkcycgfSkpO1xuICAgICAgICB0aGlzLnN0YWNrQW5pbXMucHVzaChsaW5lLmFuaW1hdGUoW3sgdHJhbnNmb3JtOiAnc2NhbGVYKDApJyB9LCB7IHRyYW5zZm9ybTogJ3NjYWxlWCgxKScgfV0sIHsgZHVyYXRpb246IG1zLCBlYXNpbmc6ICdjdWJpYy1iZXppZXIoLjQsMCwuMywxKScsIGZpbGw6ICdmb3J3YXJkcycgfSkpO1xuICAgICAgICBpZiAocGVuKSB0aGlzLnN0YWNrQW5pbXMucHVzaChwZW4uYW5pbWF0ZShbeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUoJHt4MCAtIDN9cHgsJHt5fXB4KWAsIG9wYWNpdHk6IDEgfSwgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUoJHt4MSAtIDN9cHgsJHt5fXB4KWAsIG9wYWNpdHk6IDEgfV0sIHsgZHVyYXRpb246IG1zLCBlYXNpbmc6ICdjdWJpYy1iZXppZXIoLjQsMCwuMywxKScsIGZpbGw6ICdmb3J3YXJkcycgfSkpO1xuICAgICAgICBhd2FpdCBzbGVlcChtcyArIDcwKTtcbiAgICAgIH1cbiAgICAgIHBlbj8uZ2V0QW5pbWF0aW9ucygpLmZvckVhY2goKGEpID0+IGEuY2FuY2VsKCkpO1xuICAgIH0pKCkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG59XG4iXX0=
|