@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.
Files changed (175) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +56 -2
  3. package/account-table/account-table.component.d.ts +72 -0
  4. package/action-log/action-log.component.d.ts +41 -0
  5. package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
  6. package/agent-inbox/agent-inbox.component.d.ts +75 -0
  7. package/agent-lanes/agent-lanes.component.d.ts +152 -0
  8. package/agent-phases/agent-phases.component.d.ts +62 -0
  9. package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
  10. package/agent-tree/agent-tree.component.d.ts +80 -0
  11. package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
  12. package/artifact-card/artifact-card.component.d.ts +145 -0
  13. package/attachment-tray/attachment-tray.component.d.ts +84 -0
  14. package/badge/badge.component.d.ts +25 -0
  15. package/bar-chart/bar-chart.component.d.ts +87 -0
  16. package/browser-session/browser-session.component.d.ts +70 -0
  17. package/buttons/buttons.component.d.ts +63 -0
  18. package/card/card.component.d.ts +21 -0
  19. package/change-review/change-review.component.d.ts +97 -0
  20. package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
  21. package/code-viewer/code-viewer.component.d.ts +86 -0
  22. package/composer/composer.component.d.ts +114 -0
  23. package/context-meter/context-meter.component.d.ts +60 -0
  24. package/core/icon.component.d.ts +10 -0
  25. package/core/reduced-motion.service.d.ts +15 -0
  26. package/decision-prompt/decision-prompt.component.d.ts +56 -0
  27. package/design-review/design-review.component.d.ts +108 -0
  28. package/design-tuner/design-tuner.component.d.ts +75 -0
  29. package/details-panel/details-panel.component.d.ts +150 -0
  30. package/donut-chart/donut-chart.component.d.ts +63 -0
  31. package/draft-review/draft-review.component.d.ts +128 -0
  32. package/error-recovery/error-recovery.component.d.ts +59 -0
  33. package/esm2022/account-table/account-table.component.mjs +399 -0
  34. package/esm2022/action-log/action-log.component.mjs +177 -0
  35. package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
  36. package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
  37. package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
  38. package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
  39. package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
  40. package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
  41. package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
  42. package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
  43. package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
  44. package/esm2022/badge/badge.component.mjs +97 -0
  45. package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
  46. package/esm2022/browser-session/browser-session.component.mjs +352 -0
  47. package/esm2022/buttons/buttons.component.mjs +215 -0
  48. package/esm2022/card/card.component.mjs +107 -0
  49. package/esm2022/change-review/change-review.component.mjs +398 -0
  50. package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
  51. package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
  52. package/esm2022/composer/composer.component.mjs +743 -0
  53. package/esm2022/context-meter/context-meter.component.mjs +275 -0
  54. package/esm2022/core/icon.component.mjs +111 -0
  55. package/esm2022/core/reduced-motion.service.mjs +34 -0
  56. package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
  57. package/esm2022/design-review/design-review.component.mjs +428 -0
  58. package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
  59. package/esm2022/details-panel/details-panel.component.mjs +537 -0
  60. package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
  61. package/esm2022/draft-review/draft-review.component.mjs +549 -0
  62. package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
  63. package/esm2022/eval-results/eval-results.component.mjs +368 -0
  64. package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
  65. package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
  66. package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
  67. package/esm2022/grid/grid.component.mjs +66 -0
  68. package/esm2022/health-score/health-score.component.mjs +420 -0
  69. package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
  70. package/esm2022/image-generation/image-generation.component.mjs +1028 -0
  71. package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
  72. package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
  73. package/esm2022/line-chart/line-chart.component.mjs +417 -0
  74. package/esm2022/live-answer/live-answer.component.mjs +411 -0
  75. package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
  76. package/esm2022/modal/modal.component.mjs +202 -0
  77. package/esm2022/model-picker/model-picker.component.mjs +491 -0
  78. package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
  79. package/esm2022/plan-review/plan-review.component.mjs +432 -0
  80. package/esm2022/progress/progress.component.mjs +503 -0
  81. package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
  82. package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
  83. package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
  84. package/esm2022/public-api.mjs +88 -0
  85. package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
  86. package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
  87. package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
  88. package/esm2022/response-versions/response-versions.component.mjs +288 -0
  89. package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
  90. package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
  91. package/esm2022/run-cost/run-cost.component.mjs +215 -0
  92. package/esm2022/run-queue/run-queue.component.mjs +481 -0
  93. package/esm2022/run-summary/run-summary.component.mjs +331 -0
  94. package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
  95. package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
  96. package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
  97. package/esm2022/source-stack/source-stack.component.mjs +245 -0
  98. package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
  99. package/esm2022/status-pill/status-pill.component.mjs +305 -0
  100. package/esm2022/steering/steering.component.mjs +343 -0
  101. package/esm2022/step-loader/step-loader.component.mjs +209 -0
  102. package/esm2022/task-table/task-table.component.mjs +534 -0
  103. package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
  104. package/esm2022/thinking/thinking.component.mjs +276 -0
  105. package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
  106. package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
  107. package/esm2022/toast/toast.component.mjs +195 -0
  108. package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
  109. package/esm2022/tool-call/tool-call.component.mjs +273 -0
  110. package/esm2022/tooltip/tooltip.component.mjs +417 -0
  111. package/esm2022/top-pages/top-pages.component.mjs +240 -0
  112. package/esm2022/trace-view/trace-view.component.mjs +440 -0
  113. package/esm2022/visuno-angular.mjs +5 -0
  114. package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
  115. package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
  116. package/esm2022/web-search/web-search.component.mjs +374 -0
  117. package/eval-results/eval-results.component.d.ts +67 -0
  118. package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
  119. package/fesm2022/visuno-angular.mjs +31992 -0
  120. package/fesm2022/visuno-angular.mjs.map +1 -0
  121. package/field-extraction/field-extraction.component.d.ts +82 -0
  122. package/funnel-chart/funnel-chart.component.d.ts +70 -0
  123. package/grid/grid.component.d.ts +22 -0
  124. package/health-score/health-score.component.d.ts +87 -0
  125. package/human-handoff/human-handoff.component.d.ts +125 -0
  126. package/image-generation/image-generation.component.d.ts +253 -0
  127. package/index.d.ts +5 -0
  128. package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
  129. package/launch-checklist/launch-checklist.component.d.ts +46 -0
  130. package/line-chart/line-chart.component.d.ts +89 -0
  131. package/live-answer/live-answer.component.d.ts +110 -0
  132. package/metric-insight/metric-insight.component.d.ts +110 -0
  133. package/modal/modal.component.d.ts +37 -0
  134. package/model-picker/model-picker.component.d.ts +97 -0
  135. package/package.json +51 -4
  136. package/permission-gate/permission-gate.component.d.ts +100 -0
  137. package/plan-review/plan-review.component.d.ts +86 -0
  138. package/progress/progress.component.d.ts +91 -0
  139. package/prompt-library/prompt-library.component.d.ts +121 -0
  140. package/prompt-starters/prompt-starters.component.d.ts +65 -0
  141. package/proposal-card/proposal-card.component.d.ts +101 -0
  142. package/public-api.d.ts +82 -0
  143. package/radar-chart/radar-chart.component.d.ts +110 -0
  144. package/radial-goals/radial-goals.component.d.ts +90 -0
  145. package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
  146. package/response-versions/response-versions.component.d.ts +54 -0
  147. package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
  148. package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
  149. package/run-cost/run-cost.component.d.ts +43 -0
  150. package/run-queue/run-queue.component.d.ts +93 -0
  151. package/run-summary/run-summary.component.d.ts +81 -0
  152. package/scatter-chart/scatter-chart.component.d.ts +139 -0
  153. package/score-breakdown/score-breakdown.component.d.ts +107 -0
  154. package/segmented-control/segmented-control.component.d.ts +44 -0
  155. package/source-stack/source-stack.component.d.ts +60 -0
  156. package/stat-cards/stat-cards.component.d.ts +86 -0
  157. package/status-pill/status-pill.component.d.ts +64 -0
  158. package/steering/steering.component.d.ts +75 -0
  159. package/step-loader/step-loader.component.d.ts +40 -0
  160. package/styles.css +424 -0
  161. package/task-table/task-table.component.d.ts +114 -0
  162. package/terminal-stream/terminal-stream.component.d.ts +110 -0
  163. package/thinking/thinking.component.d.ts +63 -0
  164. package/thinking-states/thinking-states.component.d.ts +51 -0
  165. package/thread-panel/thread-panel.component.d.ts +75 -0
  166. package/toast/toast.component.d.ts +56 -0
  167. package/toast-stack/toast-stack.component.d.ts +72 -0
  168. package/tokens.css +424 -0
  169. package/tool-call/tool-call.component.d.ts +61 -0
  170. package/tooltip/tooltip.component.d.ts +89 -0
  171. package/top-pages/top-pages.component.d.ts +75 -0
  172. package/trace-view/trace-view.component.d.ts +95 -0
  173. package/voice-capture/voice-capture.component.d.ts +103 -0
  174. package/voice-orb/voice-orb.component.d.ts +78 -0
  175. package/web-search/web-search.component.d.ts +77 -0
@@ -0,0 +1,503 @@
1
+ // framework/angular/progress/progress.component.ts
2
+ //
3
+ // Native Angular port of framework/react/progress/Progress.tsx.
4
+ // A run's progress three ways (a ring for the whole run, segments for its steps,
5
+ // a bar for the step in hand), with state colours (running = accent, paused =
6
+ // grey, error = red + Retry, complete = green) and an optional credits meter
7
+ // that warns in words as it fills. Inputs mirror the React props; callbacks
8
+ // become @Output() EventEmitters.
9
+ import { Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core';
10
+ import { VoIconComponent } from '../core/icon.component';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "../core/reduced-motion.service";
13
+ const CODE = {
14
+ indeterminate: 'ind',
15
+ running: 'run',
16
+ paused: 'paused',
17
+ error: 'err',
18
+ complete: 'done',
19
+ };
20
+ const TAG = {
21
+ indeterminate: ['Starting', ''],
22
+ running: ['Running', 'vo-run'],
23
+ paused: ['Paused', ''],
24
+ error: ['Failed', 'vo-bad'],
25
+ complete: ['Done', 'vo-ok'],
26
+ };
27
+ const fmt = (n) => Math.round(n).toLocaleString('en-US');
28
+ /** A run's progress three ways, with an optional meter that warns as it fills. */
29
+ export class ProgressComponent {
30
+ constructor(motion) {
31
+ this.motion = motion;
32
+ /** Like "Indexing the docs". */
33
+ this.title = '';
34
+ this.state = 'running';
35
+ this.steps = [];
36
+ /** The step in hand, from 0. */
37
+ this.step = 0;
38
+ /** How far the step in hand is, 0 to 1. */
39
+ this.stepProgress = 0;
40
+ /** What failed, shown over the bar with a Retry button while state is "error". */
41
+ this.error = 'The step failed';
42
+ this.onPause = new EventEmitter();
43
+ this.onResume = new EventEmitter();
44
+ this.onRetry = new EventEmitter();
45
+ this.onRestart = new EventEmitter();
46
+ /** Whether the respective callbacks are wired (so their controls show). */
47
+ this.pauseWired = true;
48
+ this.resumeWired = true;
49
+ this.retryWired = true;
50
+ this.restartWired = true;
51
+ this.said = '';
52
+ this.tagOut = false;
53
+ this.shownTag = '';
54
+ }
55
+ /* ---------- derived values ---------- */
56
+ get n() {
57
+ return this.steps.length;
58
+ }
59
+ get at() {
60
+ return Math.max(0, Math.min(this.step, this.n - 1));
61
+ }
62
+ get cur() {
63
+ return this.steps[this.at] ?? { label: '', unit: '', total: 0 };
64
+ }
65
+ get done() {
66
+ return this.state === 'complete';
67
+ }
68
+ get ind() {
69
+ return this.state === 'indeterminate';
70
+ }
71
+ get sub() {
72
+ return this.done ? 1 : Math.max(0, Math.min(1, this.stepProgress));
73
+ }
74
+ get all() {
75
+ return this.done ? 1 : (this.at + this.sub) / this.n;
76
+ }
77
+ get pct() {
78
+ return Math.round(this.all * 100);
79
+ }
80
+ get subPct() {
81
+ return Math.round(this.sub * 100);
82
+ }
83
+ get code() {
84
+ return CODE[this.state];
85
+ }
86
+ get tagClass() {
87
+ return 'vo-prg-st ' + TAG[this.state][1];
88
+ }
89
+ get words() {
90
+ if (this.valueText !== undefined)
91
+ return this.valueText;
92
+ const at = this.at;
93
+ const n = this.n;
94
+ if (this.ind)
95
+ return 'Preparing the run';
96
+ if (this.state === 'paused')
97
+ return `Paused at step ${at + 1} of ${n}`;
98
+ if (this.state === 'error')
99
+ return `Failed at step ${at + 1} of ${n}`;
100
+ if (this.done)
101
+ return `All ${n} steps done`;
102
+ return `Step ${at + 1} of ${n}, ${this.cur.label.toLowerCase()}`;
103
+ }
104
+ get btn() {
105
+ if (this.state === 'paused')
106
+ return { icon: 'play', label: 'Resume', on: this.resumeWired ? this.onResume : null };
107
+ if (this.done)
108
+ return { icon: 'refresh', label: 'Run again', on: this.restartWired ? this.onRestart : null };
109
+ return { icon: 'pause', label: 'Pause', on: this.pauseWired ? this.onPause : null };
110
+ }
111
+ /* ---------- meter ---------- */
112
+ get warnAt() {
113
+ return this.meter?.warnAt ?? 0.75;
114
+ }
115
+ get dangerAt() {
116
+ return this.meter?.dangerAt ?? 0.9;
117
+ }
118
+ get m() {
119
+ return this.meter ? this.meter.value / this.meter.max : 0;
120
+ }
121
+ get band() {
122
+ if (!this.meter)
123
+ return 0;
124
+ return this.m >= this.dangerAt ? 2 : this.m >= this.warnAt ? 1 : 0;
125
+ }
126
+ get meterFillPct() {
127
+ return Math.min(100, this.m * 100);
128
+ }
129
+ get meterNow() {
130
+ return Math.round(this.meter?.value ?? 0);
131
+ }
132
+ get meterValueText() {
133
+ if (!this.meter)
134
+ return '';
135
+ const base = `${fmt(this.meter.value)} of ${fmt(this.meter.max)} ${this.meter.unit ?? ''}`.trim();
136
+ const tail = ['', ', running low', ', ' + (this.meter.dangerLabel ?? 'almost out').toLowerCase()][this.band];
137
+ return base + tail;
138
+ }
139
+ segFill(j) {
140
+ if (this.done || j < this.at)
141
+ return 1;
142
+ if (j === this.at && !this.ind)
143
+ return this.sub;
144
+ return 0;
145
+ }
146
+ fmtN(n) {
147
+ return fmt(n);
148
+ }
149
+ ngOnChanges(changes) {
150
+ if (this.was === undefined) {
151
+ this.was = this.state;
152
+ this.shownTag = TAG[this.state][0];
153
+ return;
154
+ }
155
+ if (changes['state'] && this.was !== this.state) {
156
+ this.was = this.state;
157
+ // announce only a change of state, never every percent
158
+ const msg = {
159
+ indeterminate: 'Starting',
160
+ running: 'Running',
161
+ paused: 'Paused',
162
+ error: `Step ${this.at + 1} failed: ${this.error}`,
163
+ complete: 'Done. ' + this.words,
164
+ };
165
+ clearTimeout(this.saidTimer);
166
+ this.saidTimer = setTimeout(() => (this.said = msg[this.state]));
167
+ // the tag text blurs out and back in on a state change (Swap)
168
+ this.tagOut = true;
169
+ clearTimeout(this.tagTimer);
170
+ this.tagTimer = setTimeout(() => {
171
+ this.shownTag = TAG[this.state][0];
172
+ this.tagOut = false;
173
+ }, this.motion.reduce() ? 0 : 170);
174
+ }
175
+ }
176
+ ngOnDestroy() {
177
+ clearTimeout(this.saidTimer);
178
+ clearTimeout(this.tagTimer);
179
+ }
180
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProgressComponent, deps: [{ token: i1.ReducedMotionService }], target: i0.ɵɵFactoryTarget.Component }); }
181
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ProgressComponent, isStandalone: true, selector: "vo-progress", inputs: { title: "title", state: "state", steps: "steps", step: "step", stepProgress: "stepProgress", valueText: "valueText", error: "error", meter: "meter", pauseWired: "pauseWired", resumeWired: "resumeWired", retryWired: "retryWired", restartWired: "restartWired" }, outputs: { onPause: "onPause", onResume: "onResume", onRetry: "onRetry", onRestart: "onRestart" }, usesOnChanges: true, ngImport: i0, template: `
182
+ <div data-vo="" [attr.data-s]="code" class="vo-prg vo-panel">
183
+ <div class="vo-prg-h">
184
+ <span
185
+ class="vo-prg-ring"
186
+ role="progressbar"
187
+ aria-label="Run progress"
188
+ [attr.aria-valuemin]="ind ? null : 0"
189
+ [attr.aria-valuemax]="ind ? null : 100"
190
+ [attr.aria-valuenow]="ind ? null : pct"
191
+ [attr.aria-valuetext]="ind ? 'Preparing the run' : pct + '% of the run'"
192
+ >
193
+ <svg viewBox="0 0 36 36" aria-hidden="true">
194
+ <circle class="vo-tr" cx="18" cy="18" r="15"></circle>
195
+ <circle
196
+ class="vo-fl"
197
+ cx="18"
198
+ cy="18"
199
+ r="15"
200
+ pathLength="100"
201
+ [style.stroke-dasharray]="ind ? null : all * 100 + ' 100'"
202
+ ></circle>
203
+ </svg>
204
+ <span class="vo-prg-pc vo-num">
205
+ @if (done) {
206
+ <vo-icon name="check" size="xs" class="vo-enter"></vo-icon>
207
+ } @else if (!ind) {
208
+ {{ pct }}%
209
+ }
210
+ </span>
211
+ </span>
212
+ <div class="vo-prg-t">
213
+ <b>{{ title }}</b>
214
+ <span class="vo-muted vo-prg-vt">{{ words }}</span>
215
+ </div>
216
+ <span class="vo-tag vo-prg-st" [class]="tagClass">
217
+ <span class="vo-sw" [class.vo-out]="tagOut">{{ shownTag }}</span>
218
+ </span>
219
+ @if (btn.on) {
220
+ <button
221
+ type="button"
222
+ class="vo-ib vo-prg-btn"
223
+ [attr.aria-label]="btn.label"
224
+ (click)="btn.on!.emit()"
225
+ [disabled]="state === 'error' || ind"
226
+ [style.visibility]="state === 'error' ? 'hidden' : null"
227
+ >
228
+ <vo-icon [name]="btn.icon"></vo-icon>
229
+ </button>
230
+ }
231
+ </div>
232
+
233
+ <div
234
+ class="vo-prg-seg"
235
+ role="progressbar"
236
+ aria-label="Steps"
237
+ [attr.aria-valuemin]="0"
238
+ [attr.aria-valuemax]="n"
239
+ [attr.aria-valuenow]="done ? n : at"
240
+ [attr.aria-valuetext]="done ? 'All ' + n + ' steps done' : ind ? 'Not started' : 'Step ' + (at + 1) + ' of ' + n"
241
+ >
242
+ @for (s of steps; track $index; let j = $index) {
243
+ <i><b [style.--vo-f]="segFill(j)"></b></i>
244
+ }
245
+ </div>
246
+
247
+ <div class="vo-prg-ll">
248
+ @if (state === 'error') {
249
+ <span class="vo-e vo-enter">
250
+ <vo-icon name="alert" size="xs"></vo-icon>
251
+ <span>{{ error }}</span>
252
+ </span>
253
+ @if (retryWired) {
254
+ <button type="button" class="vo-pill vo-line vo-sm" (click)="onRetry.emit()">
255
+ <vo-icon name="refresh" size="xs"></vo-icon>Retry
256
+ </button>
257
+ }
258
+ } @else if (ind) {
259
+ <span>Getting ready</span><span class="vo-n">Counting</span>
260
+ } @else {
261
+ <span>{{ cur.unit }}</span>
262
+ <span class="vo-n vo-num">{{ fmtN(sub * cur.total) }} of {{ fmtN(cur.total) }}</span>
263
+ }
264
+ </div>
265
+
266
+ <div
267
+ class="vo-prg-lin"
268
+ [class.vo-ind]="ind"
269
+ role="progressbar"
270
+ aria-label="This step"
271
+ [attr.aria-valuemin]="0"
272
+ [attr.aria-valuemax]="100"
273
+ [attr.aria-valuenow]="ind ? null : subPct"
274
+ [attr.aria-valuetext]="ind ? 'Working out how much there is' : fmtN(sub * cur.total) + ' of ' + fmtN(cur.total) + ' ' + cur.unit.toLowerCase()"
275
+ >
276
+ <i [style.width]="ind ? null : sub * 100 + '%'"></i>
277
+ </div>
278
+
279
+ @if (meter) {
280
+ <div class="vo-prg-meter">
281
+ <div class="vo-prg-mh">
282
+ <span>{{ meter.label }}</span>
283
+ <span class="vo-num vo-muted"
284
+ ><b class="vo-prg-mv">{{ fmtN(meter.value) }}</b> of {{ fmtN(meter.max) }}</span
285
+ >
286
+ </div>
287
+ <div
288
+ class="vo-prg-mb"
289
+ [class.vo-warn]="band === 1"
290
+ [class.vo-bad]="band === 2"
291
+ role="meter"
292
+ [attr.aria-label]="meter.label"
293
+ [attr.aria-valuemin]="0"
294
+ [attr.aria-valuemax]="meter.max"
295
+ [attr.aria-valuenow]="meterNow"
296
+ [attr.aria-valuetext]="meterValueText"
297
+ >
298
+ <i class="vo-fl" [style.width]="meterFillPct + '%'"></i>
299
+ <i class="vo-th" [style.left]="warnAt * 100 + '%'"></i>
300
+ <i class="vo-th" [style.left]="dangerAt * 100 + '%'"></i>
301
+ </div>
302
+ <div class="vo-prg-ml">
303
+ <span [class.vo-enter]="band > 0">
304
+ @if (band === 2) {
305
+ <span class="vo-tag vo-bad"
306
+ ><vo-icon name="alert" size="xs"></vo-icon>{{ meter.dangerLabel ?? 'Almost out' }}</span
307
+ >
308
+ } @else if (band === 1) {
309
+ <span class="vo-tag vo-warn"><vo-icon name="warn" size="xs"></vo-icon>Running low</span>
310
+ } @else {
311
+ <span class="vo-muted">On track</span>
312
+ }
313
+ </span>
314
+ @if (meter.note) {
315
+ <span class="vo-muted">{{ meter.note }}</span>
316
+ }
317
+ </div>
318
+ </div>
319
+ }
320
+
321
+ <p class="vo-prg-sr" aria-live="polite">{{ said }}</p>
322
+ </div>
323
+ `, isInline: true, styles: [".vo-prg{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:var(--vo-s-3);--vo-prg-c:var(--vo-accent-mark,var(--vo-accent))}.vo-prg[data-s=paused]{--vo-prg-c:var(--vo-faint)}.vo-prg[data-s=err]{--vo-prg-c:var(--vo-bad)}.vo-prg[data-s=done]{--vo-prg-c:var(--vo-ok-mark)}.vo-prg-h{display:flex;align-items:center;gap:var(--vo-s-3)}.vo-prg-ring{position:relative;width:44px;height:44px;flex:none;display:grid;place-items:center;color:var(--vo-ok-mark)}.vo-prg-ring>svg{position:absolute;inset:0;width:100%;height:100%;transform:rotate(-90deg)}.vo-prg-ring circle{fill:none;stroke-width:3}.vo-prg-ring .vo-tr{stroke:var(--vo-chip)}.vo-prg-ring .vo-fl{stroke:var(--vo-prg-c);stroke-dasharray:0 100;stroke-linecap:round;transition:stroke-dasharray .6s var(--vo-ease),stroke .3s}.vo-prg[data-s=ind] .vo-prg-ring>svg{animation:vo-rot 1.1s linear infinite}.vo-prg[data-s=ind] .vo-prg-ring .vo-fl{stroke-dasharray:25 100;transition:none}.vo-prg-pc{font-size:13px;font-weight:500;color:var(--vo-fg);line-height:1;letter-spacing:-.02em}.vo-prg-t{flex:1;min-width:0;display:flex;flex-direction:column;font-size:13.5px;line-height:1.4}.vo-prg-t b{font-weight:500}.vo-prg-vt{font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-prg-st{flex:none}.vo-prg-st.vo-run{background:var(--vo-accent-bg);color:var(--vo-accent-fg,var(--vo-accent))}.vo-prg-seg{display:flex;gap:var(--vo-s-1)}.vo-prg-seg i,.vo-prg-lin{position:relative;flex:none;height:6px;border-radius:calc(3px * var(--vo-rk));background:var(--vo-chip);overflow:hidden}.vo-prg-seg i{flex:1}.vo-prg-seg b{position:absolute;inset:0;border-radius:inherit;background:var(--vo-prg-c);transform-origin:left;transform:scaleX(var(--vo-f,0));transition:transform .45s var(--vo-ease),background .3s}.vo-prg-ll{display:flex;align-items:center;justify-content:space-between;gap:var(--vo-s-2);min-height:28px;margin-bottom:calc(var(--vo-s-1) * -1);font-size:12.5px;color:var(--vo-fg2)}.vo-prg-ll .vo-n{color:var(--vo-muted)}.vo-prg-ll .vo-e{display:flex;align-items:center;gap:6px;min-width:0;color:var(--vo-bad)}.vo-prg-ll .vo-e span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-prg-lin i{position:absolute;left:0;top:0;bottom:0;width:0;border-radius:inherit;background:var(--vo-prg-c);transition:width .45s var(--vo-ease),background .3s}.vo-prg-lin.vo-ind i{width:32%;animation:vo-prgsweep 1.3s var(--vo-ease-io) infinite;transition:none}@keyframes vo-prgsweep{0%{transform:translate(-100%)}to{transform:translate(320%)}}.vo-prg-meter{display:flex;flex-direction:column;gap:var(--vo-s-2);margin-top:var(--vo-s-1);padding-top:var(--vo-s-4);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-prg-mh{display:flex;align-items:baseline;justify-content:space-between;gap:var(--vo-s-2);font-size:13px}.vo-prg-mh b{font-weight:500;color:var(--vo-fg)}.vo-prg-mh .vo-muted{font-size:12.5px}.vo-prg-mb{position:relative;height:8px;border-radius:calc(4px * var(--vo-rk));background:var(--vo-chip)}.vo-prg-mb .vo-fl{position:absolute;left:0;top:0;bottom:0;width:0;border-radius:inherit;background:var(--vo-accent-mark,var(--vo-accent));transition:width .6s var(--vo-ease),background .3s}.vo-prg-mb.vo-warn .vo-fl{background:var(--vo-warn-mark)}.vo-prg-mb.vo-bad .vo-fl{background:var(--vo-bad)}.vo-prg-mb .vo-th{position:absolute;top:-3px;bottom:-3px;width:2px;margin-left:-1px;border-radius:1px;background:color-mix(in srgb,var(--vo-fg) 35%,transparent)}.vo-prg-ml{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--vo-s-1) var(--vo-s-2);min-height:20px;font-size:12px}.vo-prg-ml .vo-tag .vo-i{margin-left:-1px}.vo-prg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@media (prefers-reduced-motion:reduce){.vo-prg[data-s=ind] .vo-prg-ring>svg{animation:none}.vo-prg-lin.vo-ind i{animation:none;width:100%;opacity:.35}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
324
+ }
325
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProgressComponent, decorators: [{
326
+ type: Component,
327
+ args: [{ selector: 'vo-progress', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
328
+ <div data-vo="" [attr.data-s]="code" class="vo-prg vo-panel">
329
+ <div class="vo-prg-h">
330
+ <span
331
+ class="vo-prg-ring"
332
+ role="progressbar"
333
+ aria-label="Run progress"
334
+ [attr.aria-valuemin]="ind ? null : 0"
335
+ [attr.aria-valuemax]="ind ? null : 100"
336
+ [attr.aria-valuenow]="ind ? null : pct"
337
+ [attr.aria-valuetext]="ind ? 'Preparing the run' : pct + '% of the run'"
338
+ >
339
+ <svg viewBox="0 0 36 36" aria-hidden="true">
340
+ <circle class="vo-tr" cx="18" cy="18" r="15"></circle>
341
+ <circle
342
+ class="vo-fl"
343
+ cx="18"
344
+ cy="18"
345
+ r="15"
346
+ pathLength="100"
347
+ [style.stroke-dasharray]="ind ? null : all * 100 + ' 100'"
348
+ ></circle>
349
+ </svg>
350
+ <span class="vo-prg-pc vo-num">
351
+ @if (done) {
352
+ <vo-icon name="check" size="xs" class="vo-enter"></vo-icon>
353
+ } @else if (!ind) {
354
+ {{ pct }}%
355
+ }
356
+ </span>
357
+ </span>
358
+ <div class="vo-prg-t">
359
+ <b>{{ title }}</b>
360
+ <span class="vo-muted vo-prg-vt">{{ words }}</span>
361
+ </div>
362
+ <span class="vo-tag vo-prg-st" [class]="tagClass">
363
+ <span class="vo-sw" [class.vo-out]="tagOut">{{ shownTag }}</span>
364
+ </span>
365
+ @if (btn.on) {
366
+ <button
367
+ type="button"
368
+ class="vo-ib vo-prg-btn"
369
+ [attr.aria-label]="btn.label"
370
+ (click)="btn.on!.emit()"
371
+ [disabled]="state === 'error' || ind"
372
+ [style.visibility]="state === 'error' ? 'hidden' : null"
373
+ >
374
+ <vo-icon [name]="btn.icon"></vo-icon>
375
+ </button>
376
+ }
377
+ </div>
378
+
379
+ <div
380
+ class="vo-prg-seg"
381
+ role="progressbar"
382
+ aria-label="Steps"
383
+ [attr.aria-valuemin]="0"
384
+ [attr.aria-valuemax]="n"
385
+ [attr.aria-valuenow]="done ? n : at"
386
+ [attr.aria-valuetext]="done ? 'All ' + n + ' steps done' : ind ? 'Not started' : 'Step ' + (at + 1) + ' of ' + n"
387
+ >
388
+ @for (s of steps; track $index; let j = $index) {
389
+ <i><b [style.--vo-f]="segFill(j)"></b></i>
390
+ }
391
+ </div>
392
+
393
+ <div class="vo-prg-ll">
394
+ @if (state === 'error') {
395
+ <span class="vo-e vo-enter">
396
+ <vo-icon name="alert" size="xs"></vo-icon>
397
+ <span>{{ error }}</span>
398
+ </span>
399
+ @if (retryWired) {
400
+ <button type="button" class="vo-pill vo-line vo-sm" (click)="onRetry.emit()">
401
+ <vo-icon name="refresh" size="xs"></vo-icon>Retry
402
+ </button>
403
+ }
404
+ } @else if (ind) {
405
+ <span>Getting ready</span><span class="vo-n">Counting</span>
406
+ } @else {
407
+ <span>{{ cur.unit }}</span>
408
+ <span class="vo-n vo-num">{{ fmtN(sub * cur.total) }} of {{ fmtN(cur.total) }}</span>
409
+ }
410
+ </div>
411
+
412
+ <div
413
+ class="vo-prg-lin"
414
+ [class.vo-ind]="ind"
415
+ role="progressbar"
416
+ aria-label="This step"
417
+ [attr.aria-valuemin]="0"
418
+ [attr.aria-valuemax]="100"
419
+ [attr.aria-valuenow]="ind ? null : subPct"
420
+ [attr.aria-valuetext]="ind ? 'Working out how much there is' : fmtN(sub * cur.total) + ' of ' + fmtN(cur.total) + ' ' + cur.unit.toLowerCase()"
421
+ >
422
+ <i [style.width]="ind ? null : sub * 100 + '%'"></i>
423
+ </div>
424
+
425
+ @if (meter) {
426
+ <div class="vo-prg-meter">
427
+ <div class="vo-prg-mh">
428
+ <span>{{ meter.label }}</span>
429
+ <span class="vo-num vo-muted"
430
+ ><b class="vo-prg-mv">{{ fmtN(meter.value) }}</b> of {{ fmtN(meter.max) }}</span
431
+ >
432
+ </div>
433
+ <div
434
+ class="vo-prg-mb"
435
+ [class.vo-warn]="band === 1"
436
+ [class.vo-bad]="band === 2"
437
+ role="meter"
438
+ [attr.aria-label]="meter.label"
439
+ [attr.aria-valuemin]="0"
440
+ [attr.aria-valuemax]="meter.max"
441
+ [attr.aria-valuenow]="meterNow"
442
+ [attr.aria-valuetext]="meterValueText"
443
+ >
444
+ <i class="vo-fl" [style.width]="meterFillPct + '%'"></i>
445
+ <i class="vo-th" [style.left]="warnAt * 100 + '%'"></i>
446
+ <i class="vo-th" [style.left]="dangerAt * 100 + '%'"></i>
447
+ </div>
448
+ <div class="vo-prg-ml">
449
+ <span [class.vo-enter]="band > 0">
450
+ @if (band === 2) {
451
+ <span class="vo-tag vo-bad"
452
+ ><vo-icon name="alert" size="xs"></vo-icon>{{ meter.dangerLabel ?? 'Almost out' }}</span
453
+ >
454
+ } @else if (band === 1) {
455
+ <span class="vo-tag vo-warn"><vo-icon name="warn" size="xs"></vo-icon>Running low</span>
456
+ } @else {
457
+ <span class="vo-muted">On track</span>
458
+ }
459
+ </span>
460
+ @if (meter.note) {
461
+ <span class="vo-muted">{{ meter.note }}</span>
462
+ }
463
+ </div>
464
+ </div>
465
+ }
466
+
467
+ <p class="vo-prg-sr" aria-live="polite">{{ said }}</p>
468
+ </div>
469
+ `, styles: [".vo-prg{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:var(--vo-s-3);--vo-prg-c:var(--vo-accent-mark,var(--vo-accent))}.vo-prg[data-s=paused]{--vo-prg-c:var(--vo-faint)}.vo-prg[data-s=err]{--vo-prg-c:var(--vo-bad)}.vo-prg[data-s=done]{--vo-prg-c:var(--vo-ok-mark)}.vo-prg-h{display:flex;align-items:center;gap:var(--vo-s-3)}.vo-prg-ring{position:relative;width:44px;height:44px;flex:none;display:grid;place-items:center;color:var(--vo-ok-mark)}.vo-prg-ring>svg{position:absolute;inset:0;width:100%;height:100%;transform:rotate(-90deg)}.vo-prg-ring circle{fill:none;stroke-width:3}.vo-prg-ring .vo-tr{stroke:var(--vo-chip)}.vo-prg-ring .vo-fl{stroke:var(--vo-prg-c);stroke-dasharray:0 100;stroke-linecap:round;transition:stroke-dasharray .6s var(--vo-ease),stroke .3s}.vo-prg[data-s=ind] .vo-prg-ring>svg{animation:vo-rot 1.1s linear infinite}.vo-prg[data-s=ind] .vo-prg-ring .vo-fl{stroke-dasharray:25 100;transition:none}.vo-prg-pc{font-size:13px;font-weight:500;color:var(--vo-fg);line-height:1;letter-spacing:-.02em}.vo-prg-t{flex:1;min-width:0;display:flex;flex-direction:column;font-size:13.5px;line-height:1.4}.vo-prg-t b{font-weight:500}.vo-prg-vt{font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-prg-st{flex:none}.vo-prg-st.vo-run{background:var(--vo-accent-bg);color:var(--vo-accent-fg,var(--vo-accent))}.vo-prg-seg{display:flex;gap:var(--vo-s-1)}.vo-prg-seg i,.vo-prg-lin{position:relative;flex:none;height:6px;border-radius:calc(3px * var(--vo-rk));background:var(--vo-chip);overflow:hidden}.vo-prg-seg i{flex:1}.vo-prg-seg b{position:absolute;inset:0;border-radius:inherit;background:var(--vo-prg-c);transform-origin:left;transform:scaleX(var(--vo-f,0));transition:transform .45s var(--vo-ease),background .3s}.vo-prg-ll{display:flex;align-items:center;justify-content:space-between;gap:var(--vo-s-2);min-height:28px;margin-bottom:calc(var(--vo-s-1) * -1);font-size:12.5px;color:var(--vo-fg2)}.vo-prg-ll .vo-n{color:var(--vo-muted)}.vo-prg-ll .vo-e{display:flex;align-items:center;gap:6px;min-width:0;color:var(--vo-bad)}.vo-prg-ll .vo-e span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-prg-lin i{position:absolute;left:0;top:0;bottom:0;width:0;border-radius:inherit;background:var(--vo-prg-c);transition:width .45s var(--vo-ease),background .3s}.vo-prg-lin.vo-ind i{width:32%;animation:vo-prgsweep 1.3s var(--vo-ease-io) infinite;transition:none}@keyframes vo-prgsweep{0%{transform:translate(-100%)}to{transform:translate(320%)}}.vo-prg-meter{display:flex;flex-direction:column;gap:var(--vo-s-2);margin-top:var(--vo-s-1);padding-top:var(--vo-s-4);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-prg-mh{display:flex;align-items:baseline;justify-content:space-between;gap:var(--vo-s-2);font-size:13px}.vo-prg-mh b{font-weight:500;color:var(--vo-fg)}.vo-prg-mh .vo-muted{font-size:12.5px}.vo-prg-mb{position:relative;height:8px;border-radius:calc(4px * var(--vo-rk));background:var(--vo-chip)}.vo-prg-mb .vo-fl{position:absolute;left:0;top:0;bottom:0;width:0;border-radius:inherit;background:var(--vo-accent-mark,var(--vo-accent));transition:width .6s var(--vo-ease),background .3s}.vo-prg-mb.vo-warn .vo-fl{background:var(--vo-warn-mark)}.vo-prg-mb.vo-bad .vo-fl{background:var(--vo-bad)}.vo-prg-mb .vo-th{position:absolute;top:-3px;bottom:-3px;width:2px;margin-left:-1px;border-radius:1px;background:color-mix(in srgb,var(--vo-fg) 35%,transparent)}.vo-prg-ml{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--vo-s-1) var(--vo-s-2);min-height:20px;font-size:12px}.vo-prg-ml .vo-tag .vo-i{margin-left:-1px}.vo-prg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@media (prefers-reduced-motion:reduce){.vo-prg[data-s=ind] .vo-prg-ring>svg{animation:none}.vo-prg-lin.vo-ind i{animation:none;width:100%;opacity:.35}}\n"] }]
470
+ }], ctorParameters: () => [{ type: i1.ReducedMotionService }], propDecorators: { title: [{
471
+ type: Input
472
+ }], state: [{
473
+ type: Input
474
+ }], steps: [{
475
+ type: Input
476
+ }], step: [{
477
+ type: Input
478
+ }], stepProgress: [{
479
+ type: Input
480
+ }], valueText: [{
481
+ type: Input
482
+ }], error: [{
483
+ type: Input
484
+ }], meter: [{
485
+ type: Input
486
+ }], onPause: [{
487
+ type: Output
488
+ }], onResume: [{
489
+ type: Output
490
+ }], onRetry: [{
491
+ type: Output
492
+ }], onRestart: [{
493
+ type: Output
494
+ }], pauseWired: [{
495
+ type: Input
496
+ }], resumeWired: [{
497
+ type: Input
498
+ }], retryWired: [{
499
+ type: Input
500
+ }], restartWired: [{
501
+ type: Input
502
+ }] } });
503
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvZ3Jlc3MvcHJvZ3Jlc3MuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1EQUFtRDtBQUNuRCxFQUFFO0FBQ0YsZ0VBQWdFO0FBQ2hFLGlGQUFpRjtBQUNqRiw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSxrQ0FBa0M7QUFFbEMsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUErQnpELE1BQU0sSUFBSSxHQUFrQztJQUMxQyxhQUFhLEVBQUUsS0FBSztJQUNwQixPQUFPLEVBQUUsS0FBSztJQUNkLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLEtBQUssRUFBRSxLQUFLO0lBQ1osUUFBUSxFQUFFLE1BQU07Q0FDakIsQ0FBQztBQUNGLE1BQU0sR0FBRyxHQUE0QztJQUNuRCxhQUFhLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO0lBQy9CLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUM7SUFDOUIsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztJQUN0QixLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO0lBQzNCLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7Q0FDNUIsQ0FBQztBQUNGLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBUyxFQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUV6RSxrRkFBa0Y7QUF1SmxGLE1BQU0sT0FBTyxpQkFBaUI7SUFpQzVCLFlBQTZCLE1BQTRCO1FBQTVCLFdBQU0sR0FBTixNQUFNLENBQXNCO1FBaEN6RCxnQ0FBZ0M7UUFDdkIsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLFVBQUssR0FBa0IsU0FBUyxDQUFDO1FBQ2pDLFVBQUssR0FBbUIsRUFBRSxDQUFDO1FBQ3BDLGdDQUFnQztRQUN2QixTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLDJDQUEyQztRQUNsQyxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUcxQixrRkFBa0Y7UUFDekUsVUFBSyxHQUFHLGlCQUFpQixDQUFDO1FBR3pCLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ25DLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3BDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ25DLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRS9DLDJFQUEyRTtRQUNsRSxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ25CLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFFN0IsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFJZixhQUFRLEdBQUcsRUFBRSxDQUFDO0lBRThDLENBQUM7SUFFN0QsMENBQTBDO0lBQzFDLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQUksRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBSSxHQUFHO1FBQ0wsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDbEUsQ0FBQztJQUNELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxlQUFlLENBQUM7SUFDeEMsQ0FBQztJQUNELElBQUksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsSUFBSSxHQUFHO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsSUFBSSxHQUFHO1FBQ0wsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQUksUUFBUTtRQUNWLE9BQU8sWUFBWSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELElBQUksS0FBSztRQUNQLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNqQixJQUFJLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxtQkFBbUIsQ0FBQztRQUN6QyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sa0JBQWtCLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdkUsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLE9BQU87WUFBRSxPQUFPLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3RFLElBQUksSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDNUMsT0FBTyxRQUFRLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUNELElBQUksR0FBRztRQUNMLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRO1lBQ3pCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hGLElBQUksSUFBSSxDQUFDLElBQUk7WUFDWCxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoRyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0RixDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDO0lBQ3BDLENBQUM7SUFDRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxJQUFJLEdBQUcsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFDRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzNCLE1BQU0sSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEcsTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLFlBQVksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQy9GLElBQUksQ0FBQyxJQUFJLENBQ1YsQ0FBQztRQUNGLE9BQU8sSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQsT0FBTyxDQUFDLENBQVM7UUFDZixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELElBQUksQ0FBQyxDQUFTO1FBQ1osT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN0Qix1REFBdUQ7WUFDdkQsTUFBTSxHQUFHLEdBQWtDO2dCQUN6QyxhQUFhLEVBQUUsVUFBVTtnQkFDekIsT0FBTyxFQUFFLFNBQVM7Z0JBQ2xCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixLQUFLLEVBQUUsUUFBUSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNsRCxRQUFRLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLO2FBQ2hDLENBQUM7WUFDRixZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRSw4REFBOEQ7WUFDOUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FDeEIsR0FBRyxFQUFFO2dCQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDdEIsQ0FBQyxFQUNELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUMvQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QixZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLENBQUM7K0dBaEtVLGlCQUFpQjttR0FBakIsaUJBQWlCLDZjQWpKbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4SVQsNjVIQS9JUyxlQUFlOzs0RkFrSmQsaUJBQWlCO2tCQXRKN0IsU0FBUzsrQkFDRSxhQUFhLGNBQ1gsSUFBSSxpQkFDRCxpQkFBaUIsQ0FBQyxJQUFJLFdBQzVCLENBQUMsZUFBZSxDQUFDLFlBQ2hCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOElUO3lGQUtRLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFFSSxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUdFLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBmcmFtZXdvcmsvYW5ndWxhci9wcm9ncmVzcy9wcm9ncmVzcy5jb21wb25lbnQudHNcbi8vXG4vLyBOYXRpdmUgQW5ndWxhciBwb3J0IG9mIGZyYW1ld29yay9yZWFjdC9wcm9ncmVzcy9Qcm9ncmVzcy50c3guXG4vLyBBIHJ1bidzIHByb2dyZXNzIHRocmVlIHdheXMgKGEgcmluZyBmb3IgdGhlIHdob2xlIHJ1biwgc2VnbWVudHMgZm9yIGl0cyBzdGVwcyxcbi8vIGEgYmFyIGZvciB0aGUgc3RlcCBpbiBoYW5kKSwgd2l0aCBzdGF0ZSBjb2xvdXJzIChydW5uaW5nID0gYWNjZW50LCBwYXVzZWQgPVxuLy8gZ3JleSwgZXJyb3IgPSByZWQgKyBSZXRyeSwgY29tcGxldGUgPSBncmVlbikgYW5kIGFuIG9wdGlvbmFsIGNyZWRpdHMgbWV0ZXJcbi8vIHRoYXQgd2FybnMgaW4gd29yZHMgYXMgaXQgZmlsbHMuIElucHV0cyBtaXJyb3IgdGhlIFJlYWN0IHByb3BzOyBjYWxsYmFja3Ncbi8vIGJlY29tZSBAT3V0cHV0KCkgRXZlbnRFbWl0dGVycy5cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWb0ljb25Db21wb25lbnQgfSBmcm9tICcuLi9jb3JlL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IFJlZHVjZWRNb3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9yZWR1Y2VkLW1vdGlvbi5zZXJ2aWNlJztcblxuZXhwb3J0IHR5cGUgUHJvZ3Jlc3NTdGF0ZSA9ICdpbmRldGVybWluYXRlJyB8ICdydW5uaW5nJyB8ICdwYXVzZWQnIHwgJ2Vycm9yJyB8ICdjb21wbGV0ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZ3Jlc3NTdGVwIHtcbiAgLyoqIExpa2UgXCJJbmRleGluZyBmaWxlc1wiLiAqL1xuICBsYWJlbDogc3RyaW5nO1xuICAvKiogV2hhdCB0aGUgc3RlcCBjb3VudHMsIGxpa2UgXCJGaWxlc1wiLiAqL1xuICB1bml0OiBzdHJpbmc7XG4gIC8qKiBIb3cgbWFueSB0aGVyZSBhcmUgdG8gY291bnQsIGxpa2UgMjAwMC4gKi9cbiAgdG90YWw6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc01ldGVyIHtcbiAgLyoqIExpa2UgXCJDcmVkaXRzIHRoaXMgbW9udGhcIi4gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IG51bWJlcjtcbiAgbWF4OiBudW1iZXI7XG4gIC8qKiBUaGUgdW5pdCBpbiB0aGUgbWV0ZXIncyBzcG9rZW4gdmFsdWUsIGxpa2UgXCJjcmVkaXRzXCIuICovXG4gIHVuaXQ/OiBzdHJpbmc7XG4gIC8qKiBTaGFyZSBvZiBtYXggd2hlcmUgaXQgc2F5cyBcIlJ1bm5pbmcgbG93XCIgKDAuNzUpLiAqL1xuICB3YXJuQXQ/OiBudW1iZXI7XG4gIC8qKiBTaGFyZSBvZiBtYXggd2hlcmUgaXQgd2FybnMgbW9yZSBzdHJvbmdseSAoMC45KS4gKi9cbiAgZGFuZ2VyQXQ/OiBudW1iZXI7XG4gIC8qKiBUaGUgd29yZHMgZm9yIHRoZSBzdHJvbmdlciB3YXJuaW5nIChcIkFsbW9zdCBvdXRcIikuICovXG4gIGRhbmdlckxhYmVsPzogc3RyaW5nO1xuICAvKiogUXVpZXQgdGV4dCBhdCB0aGUgcmlnaHQgdW5kZXIgdGhlIG1ldGVyLCBsaWtlIFwiUmVzZXRzIERlYyAxXCIuICovXG4gIG5vdGU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IENPREU6IFJlY29yZDxQcm9ncmVzc1N0YXRlLCBzdHJpbmc+ID0ge1xuICBpbmRldGVybWluYXRlOiAnaW5kJyxcbiAgcnVubmluZzogJ3J1bicsXG4gIHBhdXNlZDogJ3BhdXNlZCcsXG4gIGVycm9yOiAnZXJyJyxcbiAgY29tcGxldGU6ICdkb25lJyxcbn07XG5jb25zdCBUQUc6IFJlY29yZDxQcm9ncmVzc1N0YXRlLCBbc3RyaW5nLCBzdHJpbmddPiA9IHtcbiAgaW5kZXRlcm1pbmF0ZTogWydTdGFydGluZycsICcnXSxcbiAgcnVubmluZzogWydSdW5uaW5nJywgJ3ZvLXJ1biddLFxuICBwYXVzZWQ6IFsnUGF1c2VkJywgJyddLFxuICBlcnJvcjogWydGYWlsZWQnLCAndm8tYmFkJ10sXG4gIGNvbXBsZXRlOiBbJ0RvbmUnLCAndm8tb2snXSxcbn07XG5jb25zdCBmbXQgPSAobjogbnVtYmVyKTogc3RyaW5nID0+IE1hdGgucm91bmQobikudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyk7XG5cbi8qKiBBIHJ1bidzIHByb2dyZXNzIHRocmVlIHdheXMsIHdpdGggYW4gb3B0aW9uYWwgbWV0ZXIgdGhhdCB3YXJucyBhcyBpdCBmaWxscy4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZvLXByb2dyZXNzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW1ZvSWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBkYXRhLXZvPVwiXCIgW2F0dHIuZGF0YS1zXT1cImNvZGVcIiBjbGFzcz1cInZvLXByZyB2by1wYW5lbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInZvLXByZy1oXCI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJ2by1wcmctcmluZ1wiXG4gICAgICAgICAgcm9sZT1cInByb2dyZXNzYmFyXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiUnVuIHByb2dyZXNzXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbWluXT1cImluZCA/IG51bGwgOiAwXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbWF4XT1cImluZCA/IG51bGwgOiAxMDBcIlxuICAgICAgICAgIFthdHRyLmFyaWEtdmFsdWVub3ddPVwiaW5kID8gbnVsbCA6IHBjdFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZXRleHRdPVwiaW5kID8gJ1ByZXBhcmluZyB0aGUgcnVuJyA6IHBjdCArICclIG9mIHRoZSBydW4nXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAzNiAzNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInZvLXRyXCIgY3g9XCIxOFwiIGN5PVwiMThcIiByPVwiMTVcIj48L2NpcmNsZT5cbiAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgY2xhc3M9XCJ2by1mbFwiXG4gICAgICAgICAgICAgIGN4PVwiMThcIlxuICAgICAgICAgICAgICBjeT1cIjE4XCJcbiAgICAgICAgICAgICAgcj1cIjE1XCJcbiAgICAgICAgICAgICAgcGF0aExlbmd0aD1cIjEwMFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5zdHJva2UtZGFzaGFycmF5XT1cImluZCA/IG51bGwgOiBhbGwgKiAxMDAgKyAnIDEwMCdcIlxuICAgICAgICAgICAgPjwvY2lyY2xlPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tcHJnLXBjIHZvLW51bVwiPlxuICAgICAgICAgICAgQGlmIChkb25lKSB7XG4gICAgICAgICAgICAgIDx2by1pY29uIG5hbWU9XCJjaGVja1wiIHNpemU9XCJ4c1wiIGNsYXNzPVwidm8tZW50ZXJcIj48L3ZvLWljb24+XG4gICAgICAgICAgICB9IEBlbHNlIGlmICghaW5kKSB7XG4gICAgICAgICAgICAgIHt7IHBjdCB9fSVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZvLXByZy10XCI+XG4gICAgICAgICAgPGI+e3sgdGl0bGUgfX08L2I+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1tdXRlZCB2by1wcmctdnRcIj57eyB3b3JkcyB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdGFnIHZvLXByZy1zdFwiIFtjbGFzc109XCJ0YWdDbGFzc1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3dcIiBbY2xhc3Mudm8tb3V0XT1cInRhZ091dFwiPnt7IHNob3duVGFnIH19PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIEBpZiAoYnRuLm9uKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInZvLWliIHZvLXByZy1idG5cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJidG4ubGFiZWxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImJ0bi5vbiEuZW1pdCgpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzdGF0ZSA9PT0gJ2Vycm9yJyB8fCBpbmRcIlxuICAgICAgICAgICAgW3N0eWxlLnZpc2liaWxpdHldPVwic3RhdGUgPT09ICdlcnJvcicgPyAnaGlkZGVuJyA6IG51bGxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2by1pY29uIFtuYW1lXT1cImJ0bi5pY29uXCI+PC92by1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInZvLXByZy1zZWdcIlxuICAgICAgICByb2xlPVwicHJvZ3Jlc3NiYXJcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiU3RlcHNcIlxuICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbWluXT1cIjBcIlxuICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbWF4XT1cIm5cIlxuICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbm93XT1cImRvbmUgPyBuIDogYXRcIlxuICAgICAgICBbYXR0ci5hcmlhLXZhbHVldGV4dF09XCJkb25lID8gJ0FsbCAnICsgbiArICcgc3RlcHMgZG9uZScgOiBpbmQgPyAnTm90IHN0YXJ0ZWQnIDogJ1N0ZXAgJyArIChhdCArIDEpICsgJyBvZiAnICsgblwiXG4gICAgICA+XG4gICAgICAgIEBmb3IgKHMgb2Ygc3RlcHM7IHRyYWNrICRpbmRleDsgbGV0IGogPSAkaW5kZXgpIHtcbiAgICAgICAgICA8aT48YiBbc3R5bGUuLS12by1mXT1cInNlZ0ZpbGwoailcIj48L2I+PC9pPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInZvLXByZy1sbFwiPlxuICAgICAgICBAaWYgKHN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1lIHZvLWVudGVyXCI+XG4gICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiYWxlcnRcIiBzaXplPVwieHNcIj48L3ZvLWljb24+XG4gICAgICAgICAgICA8c3Bhbj57eyBlcnJvciB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgQGlmIChyZXRyeVdpcmVkKSB7XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tbGluZSB2by1zbVwiIChjbGljayk9XCJvblJldHJ5LmVtaXQoKVwiPlxuICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwicmVmcmVzaFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5SZXRyeVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICB9IEBlbHNlIGlmIChpbmQpIHtcbiAgICAgICAgICA8c3Bhbj5HZXR0aW5nIHJlYWR5PC9zcGFuPjxzcGFuIGNsYXNzPVwidm8tblwiPkNvdW50aW5nPC9zcGFuPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8c3Bhbj57eyBjdXIudW5pdCB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW4gdm8tbnVtXCI+e3sgZm10TihzdWIgKiBjdXIudG90YWwpIH19IG9mIHt7IGZtdE4oY3VyLnRvdGFsKSB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJ2by1wcmctbGluXCJcbiAgICAgICAgW2NsYXNzLnZvLWluZF09XCJpbmRcIlxuICAgICAgICByb2xlPVwicHJvZ3Jlc3NiYXJcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiVGhpcyBzdGVwXCJcbiAgICAgICAgW2F0dHIuYXJpYS12YWx1ZW1pbl09XCIwXCJcbiAgICAgICAgW2F0dHIuYXJpYS12YWx1ZW1heF09XCIxMDBcIlxuICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbm93XT1cImluZCA/IG51bGwgOiBzdWJQY3RcIlxuICAgICAgICBbYXR0ci5hcmlhLXZhbHVldGV4dF09XCJpbmQgPyAnV29ya2luZyBvdXQgaG93IG11Y2ggdGhlcmUgaXMnIDogZm10TihzdWIgKiBjdXIudG90YWwpICsgJyBvZiAnICsgZm10TihjdXIudG90YWwpICsgJyAnICsgY3VyLnVuaXQudG9Mb3dlckNhc2UoKVwiXG4gICAgICA+XG4gICAgICAgIDxpIFtzdHlsZS53aWR0aF09XCJpbmQgPyBudWxsIDogc3ViICogMTAwICsgJyUnXCI+PC9pPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAobWV0ZXIpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInZvLXByZy1tZXRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1wcmctbWhcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IG1ldGVyLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1udW0gdm8tbXV0ZWRcIlxuICAgICAgICAgICAgICA+PGIgY2xhc3M9XCJ2by1wcmctbXZcIj57eyBmbXROKG1ldGVyLnZhbHVlKSB9fTwvYj4gb2Yge3sgZm10TihtZXRlci5tYXgpIH19PC9zcGFuXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJ2by1wcmctbWJcIlxuICAgICAgICAgICAgW2NsYXNzLnZvLXdhcm5dPVwiYmFuZCA9PT0gMVwiXG4gICAgICAgICAgICBbY2xhc3Mudm8tYmFkXT1cImJhbmQgPT09IDJcIlxuICAgICAgICAgICAgcm9sZT1cIm1ldGVyXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibWV0ZXIubGFiZWxcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZW1pbl09XCIwXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtdmFsdWVtYXhdPVwibWV0ZXIubWF4XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtdmFsdWVub3ddPVwibWV0ZXJOb3dcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZXRleHRdPVwibWV0ZXJWYWx1ZVRleHRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwidm8tZmxcIiBbc3R5bGUud2lkdGhdPVwibWV0ZXJGaWxsUGN0ICsgJyUnXCI+PC9pPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJ2by10aFwiIFtzdHlsZS5sZWZ0XT1cIndhcm5BdCAqIDEwMCArICclJ1wiPjwvaT5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwidm8tdGhcIiBbc3R5bGUubGVmdF09XCJkYW5nZXJBdCAqIDEwMCArICclJ1wiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tcHJnLW1sXCI+XG4gICAgICAgICAgICA8c3BhbiBbY2xhc3Mudm8tZW50ZXJdPVwiYmFuZCA+IDBcIj5cbiAgICAgICAgICAgICAgQGlmIChiYW5kID09PSAyKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10YWcgdm8tYmFkXCJcbiAgICAgICAgICAgICAgICAgID48dm8taWNvbiBuYW1lPVwiYWxlcnRcIiBzaXplPVwieHNcIj48L3ZvLWljb24+e3sgbWV0ZXIuZGFuZ2VyTGFiZWwgPz8gJ0FsbW9zdCBvdXQnIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB9IEBlbHNlIGlmIChiYW5kID09PSAxKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10YWcgdm8td2FyblwiPjx2by1pY29uIG5hbWU9XCJ3YXJuXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPlJ1bm5pbmcgbG93PC9zcGFuPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW11dGVkXCI+T24gdHJhY2s8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIEBpZiAobWV0ZXIubm90ZSkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW11dGVkXCI+e3sgbWV0ZXIubm90ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDxwIGNsYXNzPVwidm8tcHJnLXNyXCIgYXJpYS1saXZlPVwicG9saXRlXCI+e3sgc2FpZCB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL3Byb2dyZXNzLmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFByb2dyZXNzQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvKiogTGlrZSBcIkluZGV4aW5nIHRoZSBkb2NzXCIuICovXG4gIEBJbnB1dCgpIHRpdGxlID0gJyc7XG4gIEBJbnB1dCgpIHN0YXRlOiBQcm9ncmVzc1N0YXRlID0gJ3J1bm5pbmcnO1xuICBASW5wdXQoKSBzdGVwczogUHJvZ3Jlc3NTdGVwW10gPSBbXTtcbiAgLyoqIFRoZSBzdGVwIGluIGhhbmQsIGZyb20gMC4gKi9cbiAgQElucHV0KCkgc3RlcCA9IDA7XG4gIC8qKiBIb3cgZmFyIHRoZSBzdGVwIGluIGhhbmQgaXMsIDAgdG8gMS4gKi9cbiAgQElucHV0KCkgc3RlcFByb2dyZXNzID0gMDtcbiAgLyoqIFRoZSBsaW5lIHVuZGVyIHRoZSB0aXRsZS4gRGVmYXVsdHMgdG8gXCJTdGVwIDMgb2YgNSwgaW5kZXhpbmcgZmlsZXNcIi4gKi9cbiAgQElucHV0KCkgdmFsdWVUZXh0Pzogc3RyaW5nO1xuICAvKiogV2hhdCBmYWlsZWQsIHNob3duIG92ZXIgdGhlIGJhciB3aXRoIGEgUmV0cnkgYnV0dG9uIHdoaWxlIHN0YXRlIGlzIFwiZXJyb3JcIi4gKi9cbiAgQElucHV0KCkgZXJyb3IgPSAnVGhlIHN0ZXAgZmFpbGVkJztcbiAgQElucHV0KCkgbWV0ZXI/OiBQcm9ncmVzc01ldGVyO1xuXG4gIEBPdXRwdXQoKSBvblBhdXNlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgb25SZXN1bWUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBvblJldHJ5ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgb25SZXN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSByZXNwZWN0aXZlIGNhbGxiYWNrcyBhcmUgd2lyZWQgKHNvIHRoZWlyIGNvbnRyb2xzIHNob3cpLiAqL1xuICBASW5wdXQoKSBwYXVzZVdpcmVkID0gdHJ1ZTtcbiAgQElucHV0KCkgcmVzdW1lV2lyZWQgPSB0cnVlO1xuICBASW5wdXQoKSByZXRyeVdpcmVkID0gdHJ1ZTtcbiAgQElucHV0KCkgcmVzdGFydFdpcmVkID0gdHJ1ZTtcblxuICBzYWlkID0gJyc7XG4gIHRhZ091dCA9IGZhbHNlO1xuICBwcml2YXRlIHdhcz86IFByb2dyZXNzU3RhdGU7XG4gIHByaXZhdGUgc2FpZFRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgdGFnVGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgc2hvd25UYWcgPSAnJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1vdGlvbjogUmVkdWNlZE1vdGlvblNlcnZpY2UpIHt9XG5cbiAgLyogLS0tLS0tLS0tLSBkZXJpdmVkIHZhbHVlcyAtLS0tLS0tLS0tICovXG4gIGdldCBuKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcHMubGVuZ3RoO1xuICB9XG4gIGdldCBhdCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLnN0ZXAsIHRoaXMubiAtIDEpKTtcbiAgfVxuICBnZXQgY3VyKCk6IFByb2dyZXNzU3RlcCB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcHNbdGhpcy5hdF0gPz8geyBsYWJlbDogJycsIHVuaXQ6ICcnLCB0b3RhbDogMCB9O1xuICB9XG4gIGdldCBkb25lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlID09PSAnY29tcGxldGUnO1xuICB9XG4gIGdldCBpbmQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUgPT09ICdpbmRldGVybWluYXRlJztcbiAgfVxuICBnZXQgc3ViKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZG9uZSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB0aGlzLnN0ZXBQcm9ncmVzcykpO1xuICB9XG4gIGdldCBhbGwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kb25lID8gMSA6ICh0aGlzLmF0ICsgdGhpcy5zdWIpIC8gdGhpcy5uO1xuICB9XG4gIGdldCBwY3QoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLmFsbCAqIDEwMCk7XG4gIH1cbiAgZ2V0IHN1YlBjdCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMuc3ViICogMTAwKTtcbiAgfVxuICBnZXQgY29kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBDT0RFW3RoaXMuc3RhdGVdO1xuICB9XG4gIGdldCB0YWdDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiAndm8tcHJnLXN0ICcgKyBUQUdbdGhpcy5zdGF0ZV1bMV07XG4gIH1cbiAgZ2V0IHdvcmRzKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudmFsdWVUZXh0ICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnZhbHVlVGV4dDtcbiAgICBjb25zdCBhdCA9IHRoaXMuYXQ7XG4gICAgY29uc3QgbiA9IHRoaXMubjtcbiAgICBpZiAodGhpcy5pbmQpIHJldHVybiAnUHJlcGFyaW5nIHRoZSBydW4nO1xuICAgIGlmICh0aGlzLnN0YXRlID09PSAncGF1c2VkJykgcmV0dXJuIGBQYXVzZWQgYXQgc3RlcCAke2F0ICsgMX0gb2YgJHtufWA7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdlcnJvcicpIHJldHVybiBgRmFpbGVkIGF0IHN0ZXAgJHthdCArIDF9IG9mICR7bn1gO1xuICAgIGlmICh0aGlzLmRvbmUpIHJldHVybiBgQWxsICR7bn0gc3RlcHMgZG9uZWA7XG4gICAgcmV0dXJuIGBTdGVwICR7YXQgKyAxfSBvZiAke259LCAke3RoaXMuY3VyLmxhYmVsLnRvTG93ZXJDYXNlKCl9YDtcbiAgfVxuICBnZXQgYnRuKCk6IHsgaWNvbjogJ3BsYXknIHwgJ3BhdXNlJyB8ICdyZWZyZXNoJzsgbGFiZWw6IHN0cmluZzsgb246IEV2ZW50RW1pdHRlcjx2b2lkPiB8IG51bGwgfSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdwYXVzZWQnKVxuICAgICAgcmV0dXJuIHsgaWNvbjogJ3BsYXknLCBsYWJlbDogJ1Jlc3VtZScsIG9uOiB0aGlzLnJlc3VtZVdpcmVkID8gdGhpcy5vblJlc3VtZSA6IG51bGwgfTtcbiAgICBpZiAodGhpcy5kb25lKVxuICAgICAgcmV0dXJuIHsgaWNvbjogJ3JlZnJlc2gnLCBsYWJlbDogJ1J1biBhZ2FpbicsIG9uOiB0aGlzLnJlc3RhcnRXaXJlZCA/IHRoaXMub25SZXN0YXJ0IDogbnVsbCB9O1xuICAgIHJldHVybiB7IGljb246ICdwYXVzZScsIGxhYmVsOiAnUGF1c2UnLCBvbjogdGhpcy5wYXVzZVdpcmVkID8gdGhpcy5vblBhdXNlIDogbnVsbCB9O1xuICB9XG5cbiAgLyogLS0tLS0tLS0tLSBtZXRlciAtLS0tLS0tLS0tICovXG4gIGdldCB3YXJuQXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tZXRlcj8ud2FybkF0ID8/IDAuNzU7XG4gIH1cbiAgZ2V0IGRhbmdlckF0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWV0ZXI/LmRhbmdlckF0ID8/IDAuOTtcbiAgfVxuICBnZXQgbSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1ldGVyID8gdGhpcy5tZXRlci52YWx1ZSAvIHRoaXMubWV0ZXIubWF4IDogMDtcbiAgfVxuICBnZXQgYmFuZCgpOiAwIHwgMSB8IDIge1xuICAgIGlmICghdGhpcy5tZXRlcikgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHRoaXMubSA+PSB0aGlzLmRhbmdlckF0ID8gMiA6IHRoaXMubSA+PSB0aGlzLndhcm5BdCA/IDEgOiAwO1xuICB9XG4gIGdldCBtZXRlckZpbGxQY3QoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCB0aGlzLm0gKiAxMDApO1xuICB9XG4gIGdldCBtZXRlck5vdygpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMubWV0ZXI/LnZhbHVlID8/IDApO1xuICB9XG4gIGdldCBtZXRlclZhbHVlVGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5tZXRlcikgcmV0dXJuICcnO1xuICAgIGNvbnN0IGJhc2UgPSBgJHtmbXQodGhpcy5tZXRlci52YWx1ZSl9IG9mICR7Zm10KHRoaXMubWV0ZXIubWF4KX0gJHt0aGlzLm1ldGVyLnVuaXQgPz8gJyd9YC50cmltKCk7XG4gICAgY29uc3QgdGFpbCA9IFsnJywgJywgcnVubmluZyBsb3cnLCAnLCAnICsgKHRoaXMubWV0ZXIuZGFuZ2VyTGFiZWwgPz8gJ2FsbW9zdCBvdXQnKS50b0xvd2VyQ2FzZSgpXVtcbiAgICAgIHRoaXMuYmFuZFxuICAgIF07XG4gICAgcmV0dXJuIGJhc2UgKyB0YWlsO1xuICB9XG5cbiAgc2VnRmlsbChqOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmRvbmUgfHwgaiA8IHRoaXMuYXQpIHJldHVybiAxO1xuICAgIGlmIChqID09PSB0aGlzLmF0ICYmICF0aGlzLmluZCkgcmV0dXJuIHRoaXMuc3ViO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgZm10TihuOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBmbXQobik7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud2FzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMud2FzID0gdGhpcy5zdGF0ZTtcbiAgICAgIHRoaXMuc2hvd25UYWcgPSBUQUdbdGhpcy5zdGF0ZV1bMF07XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzdGF0ZSddICYmIHRoaXMud2FzICE9PSB0aGlzLnN0YXRlKSB7XG4gICAgICB0aGlzLndhcyA9IHRoaXMuc3RhdGU7XG4gICAgICAvLyBhbm5vdW5jZSBvbmx5IGEgY2hhbmdlIG9mIHN0YXRlLCBuZXZlciBldmVyeSBwZXJjZW50XG4gICAgICBjb25zdCBtc2c6IFJlY29yZDxQcm9ncmVzc1N0YXRlLCBzdHJpbmc+ID0ge1xuICAgICAgICBpbmRldGVybWluYXRlOiAnU3RhcnRpbmcnLFxuICAgICAgICBydW5uaW5nOiAnUnVubmluZycsXG4gICAgICAgIHBhdXNlZDogJ1BhdXNlZCcsXG4gICAgICAgIGVycm9yOiBgU3RlcCAke3RoaXMuYXQgKyAxfSBmYWlsZWQ6ICR7dGhpcy5lcnJvcn1gLFxuICAgICAgICBjb21wbGV0ZTogJ0RvbmUuICcgKyB0aGlzLndvcmRzLFxuICAgICAgfTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNhaWRUaW1lcik7XG4gICAgICB0aGlzLnNhaWRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuc2FpZCA9IG1zZ1t0aGlzLnN0YXRlXSkpO1xuICAgICAgLy8gdGhlIHRhZyB0ZXh0IGJsdXJzIG91dCBhbmQgYmFjayBpbiBvbiBhIHN0YXRlIGNoYW5nZSAoU3dhcClcbiAgICAgIHRoaXMudGFnT3V0ID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRhZ1RpbWVyKTtcbiAgICAgIHRoaXMudGFnVGltZXIgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93blRhZyA9IFRBR1t0aGlzLnN0YXRlXVswXTtcbiAgICAgICAgICB0aGlzLnRhZ091dCA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICB0aGlzLm1vdGlvbi5yZWR1Y2UoKSA/IDAgOiAxNzAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnNhaWRUaW1lcik7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGFnVGltZXIpO1xuICB9XG59XG4iXX0=