@firestitch/system 18.0.42 → 18.0.43

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.
@@ -6,6 +6,7 @@ export declare class DashboardComponent implements OnInit, OnDestroy {
6
6
  private _message;
7
7
  private _cdRef;
8
8
  private _buildService;
9
+ private _process;
9
10
  init: () => any;
10
11
  upgrade: () => any;
11
12
  load: () => any;
@@ -19,7 +20,34 @@ export declare class DashboardComponent implements OnInit, OnDestroy {
19
20
  ngOnDestroy(): void;
20
21
  actionClick(action: any): void;
21
22
  initClick(): void;
23
+ /**
24
+ * Run the pending upgrades as a process rather than behind a spinner.
25
+ *
26
+ * A spinner says the same thing for ten seconds and for ten minutes, which is
27
+ * the whole problem: an upgrade that rebuilds the largest table in a schema
28
+ * looks exactly like one that has hung, and the only way anybody found out
29
+ * which was to wait for a proxy to give up.
30
+ *
31
+ * Works whether or not the application's endpoint streams. Where it does, each
32
+ * NDJSON event becomes a line in the process log — which function is running,
33
+ * how far through it is, what each one cost. Where it does not, the single
34
+ * reply produces no lines and the process is simply a labelled spinner, which
35
+ * is what every application had before this.
36
+ */
22
37
  upgradeClick(): void;
38
+ /**
39
+ * One emission off the upgrade endpoint, as a line for the process log — or
40
+ * null for anything with nothing to say, which is dropped rather than logged.
41
+ *
42
+ * `FsApi.stream()` wraps every NDJSON line in a `StreamEventData`, and
43
+ * `FsProcess` logs a string emission verbatim. So the mapping happens here: an
44
+ * object handed to the log renders as `[object Object]`.
45
+ *
46
+ * `ping` is deliberately silent. It is the heartbeat that stops a proxy
47
+ * closing a run that is still working, it fires after every statement, and it
48
+ * would bury the events worth reading.
49
+ */
50
+ private _upgradeLine;
23
51
  private _load;
24
52
  static ɵfac: i0.ɵɵFactoryDeclaration<DashboardComponent, never>;
25
53
  static ɵcmp: i0.ɵɵComponentDeclaration<DashboardComponent, "fs-system-dashboard", never, { "init": { "alias": "init"; "required": false; }; "upgrade": { "alias": "upgrade"; "required": false; }; "load": { "alias": "load"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; }, {}, never, never, true, never>;
@@ -2,3 +2,4 @@ export * from './dashboard-action';
2
2
  export * from './process-action';
3
3
  export * from './process';
4
4
  export * from './system-config';
5
+ export * from './upgrade-event';
@@ -0,0 +1,25 @@
1
+ /**
2
+ * One NDJSON line off a streaming upgrade endpoint.
3
+ *
4
+ * The framework's system view streams these only when the caller asks for a
5
+ * stream, so an application that has not opted in emits an ordinary reply and
6
+ * none of this applies — see `DashboardComponent._upgradeLine()`, which treats
7
+ * anything unrecognised as having nothing to log.
8
+ *
9
+ * `start` arrives once with the full list of pending functions, because "working
10
+ * on 2 of 9" is only meaningful to somebody who was told there were 9. `upgrade`
11
+ * arrives twice per function, on either side of it, carrying what it cost.
12
+ * `ping` is the heartbeat and says nothing.
13
+ */
14
+ export interface UpgradeEvent {
15
+ type: 'start' | 'upgrade' | 'log' | 'ping' | 'done';
16
+ state?: 'started' | 'completed' | 'failed';
17
+ name?: string;
18
+ index?: number;
19
+ total?: number;
20
+ completed?: number;
21
+ duration?: string;
22
+ seconds?: number;
23
+ message?: string;
24
+ functions?: string[];
25
+ }
@@ -1,8 +1,10 @@
1
1
  import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, inject } from '@angular/core';
2
+ import { StreamEventData } from '@firestitch/api';
2
3
  import { FsBuildService } from '@firestitch/build';
3
4
  import { FsMessage } from '@firestitch/message';
5
+ import { FsProcess, ProcessState } from '@firestitch/process';
4
6
  import { Subject } from 'rxjs';
5
- import { takeUntil } from 'rxjs/operators';
7
+ import { filter, map, take, takeUntil } from 'rxjs/operators';
6
8
  import { differenceInMinutes } from 'date-fns';
7
9
  import { FsSkeletonModule } from '@firestitch/skeleton';
8
10
  import { FsLabelModule } from '@firestitch/label';
@@ -21,6 +23,7 @@ export class DashboardComponent {
21
23
  _message = inject(FsMessage);
22
24
  _cdRef = inject(ChangeDetectorRef);
23
25
  _buildService = inject(FsBuildService);
26
+ _process = inject(FsProcess);
24
27
  init;
25
28
  upgrade;
26
29
  load;
@@ -59,13 +62,77 @@ export class DashboardComponent {
59
62
  this._message.success('Successfully initialized the system');
60
63
  });
61
64
  }
65
+ /**
66
+ * Run the pending upgrades as a process rather than behind a spinner.
67
+ *
68
+ * A spinner says the same thing for ten seconds and for ten minutes, which is
69
+ * the whole problem: an upgrade that rebuilds the largest table in a schema
70
+ * looks exactly like one that has hung, and the only way anybody found out
71
+ * which was to wait for a proxy to give up.
72
+ *
73
+ * Works whether or not the application's endpoint streams. Where it does, each
74
+ * NDJSON event becomes a line in the process log — which function is running,
75
+ * how far through it is, what each one cost. Where it does not, the single
76
+ * reply produces no lines and the process is simply a labelled spinner, which
77
+ * is what every application had before this.
78
+ */
62
79
  upgradeClick() {
63
- this.upgrade()
64
- .subscribe(() => {
80
+ const process = this._process.run('System upgrade', this.upgrade()
81
+ .pipe(map((event) => this._upgradeLine(event)), filter((line) => line !== null)));
82
+ // The pending-upgrade count on this screen is the thing the button was
83
+ // pressed to change, so it is re-read when the run settles — including when
84
+ // it FAILS, because a run that stopped halfway still completed everything
85
+ // before the one that broke.
86
+ process.completed$
87
+ .pipe(take(1), takeUntil(this._destroy$))
88
+ .subscribe((state) => {
65
89
  this._load();
66
- this._message.success('Successfully upgraded the system');
90
+ if (state === ProcessState.Success) {
91
+ this._message.success('Successfully upgraded the system');
92
+ }
67
93
  });
68
94
  }
95
+ /**
96
+ * One emission off the upgrade endpoint, as a line for the process log — or
97
+ * null for anything with nothing to say, which is dropped rather than logged.
98
+ *
99
+ * `FsApi.stream()` wraps every NDJSON line in a `StreamEventData`, and
100
+ * `FsProcess` logs a string emission verbatim. So the mapping happens here: an
101
+ * object handed to the log renders as `[object Object]`.
102
+ *
103
+ * `ping` is deliberately silent. It is the heartbeat that stops a proxy
104
+ * closing a run that is still working, it fires after every statement, and it
105
+ * would bury the events worth reading.
106
+ */
107
+ _upgradeLine(event) {
108
+ const data = (event instanceof StreamEventData ? event.data : event);
109
+ if (typeof data === 'string') {
110
+ return data;
111
+ }
112
+ if (!data || !data.type || data.type === 'ping') {
113
+ return null;
114
+ }
115
+ const step = `${data.index} of ${data.total}`;
116
+ switch (data.type) {
117
+ case 'start':
118
+ return data.total
119
+ ? `${data.total} upgrade(s) to run: ${(data.functions || []).join(', ')}`
120
+ : 'Nothing to upgrade';
121
+ case 'upgrade':
122
+ if (data.state === 'started') {
123
+ return `${step} ${data.name}…`;
124
+ }
125
+ return data.state === 'completed'
126
+ ? `${step} ${data.name} — ${data.duration}`
127
+ : `${step} ${data.name} FAILED — ${data.message}`;
128
+ case 'done':
129
+ return data.completed
130
+ ? `Completed ${data.completed} upgrade(s)`
131
+ : 'Nothing to upgrade';
132
+ default:
133
+ return data.message || null;
134
+ }
135
+ }
69
136
  _load() {
70
137
  this.load()
71
138
  .subscribe((dashboard) => {
@@ -99,4 +166,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
99
166
  }], actions: [{
100
167
  type: Input
101
168
  }] } });
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9kYXNoYm9hcmQvZGFzaGJvYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9kYXNoYm9hcmQvZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEgsT0FBTyxFQUFhLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVks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QWtCLCtKQ3RDL0Isc3dJQXlLTSw4a0JEN0lFLGdCQUFnQixpS0FDaEIsYUFBYSxnUkFDYixPQUFPLG9GQUNQLE9BQU8sMklBQ1AsVUFBVSxpUkFDVixTQUFTLGdMQUNULFlBQVksaVNBQ1osWUFBWTs7MkZBR1Asa0JBQWtCO2tCQWpCOUIsU0FBUzsrQkFDSSxxQkFBcUIsbUJBR2QsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ0wsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxVQUFVO3dCQUNWLFNBQVM7d0JBQ1QsWUFBWTt3QkFDWixZQUFZO3FCQUNmOzhCQVFhLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUVVLE9BQU87c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQnVpbGREYXRhLCBGc0J1aWxkU2VydmljZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2J1aWxkJztcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IGRpZmZlcmVuY2VJbk1pbnV0ZXMgfSBmcm9tICdkYXRlLWZucyc7XG5cbmltcG9ydCB7IERhc2hib2FyZEFjdGlvbiB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcy9kYXNoYm9hcmQtYWN0aW9uJztcbmltcG9ydCB7IEZzU2tlbGV0b25Nb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9za2VsZXRvbic7XG5pbXBvcnQgeyBGc0xhYmVsTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGFiZWwnO1xuaW1wb3J0IHsgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBNYXRCdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgRnNNZW51TW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVudSc7XG5pbXBvcnQgeyBGc0RhdGVNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kYXRlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZzLXN5c3RlbS1kYXNoYm9hcmQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2Rhc2hib2FyZC5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBGc1NrZWxldG9uTW9kdWxlLFxuICAgICAgICBGc0xhYmVsTW9kdWxlLFxuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBNYXRJY29uLFxuICAgICAgICBNYXRUb29sdGlwLFxuICAgICAgICBNYXRCdXR0b24sXG4gICAgICAgIEZzTWVudU1vZHVsZSxcbiAgICAgICAgRnNEYXRlTW9kdWxlLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIERhc2hib2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChGc01lc3NhZ2UpO1xuICBwcml2YXRlIF9jZFJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgX2J1aWxkU2VydmljZSA9IGluamVjdChGc0J1aWxkU2VydmljZSk7XG5cblxuICBASW5wdXQoKSBwdWJsaWMgaW5pdDogKCkgPT4gYW55O1xuICBASW5wdXQoKSBwdWJsaWMgdXBncmFkZTogKCkgPT4gYW55O1xuICBASW5wdXQoKSBwdWJsaWMgbG9hZDogKCkgPT4gYW55O1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBhY3Rpb25zOiBEYXNoYm9hcmRBY3Rpb25bXSA9IFtdO1xuXG4gIHB1YmxpYyBkYXNoYm9hcmQ7XG4gIHB1YmxpYyBidXR0b25BY3Rpb25zOiBEYXNoYm9hcmRBY3Rpb25bXSA9IFtdO1xuICBwdWJsaWMgYnVpbGQ6IEJ1aWxkRGF0YTtcbiAgcHVibGljIG1lbnVBY3Rpb25zOiBEYXNoYm9hcmRBY3Rpb25bXSA9IFtdO1xuXG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fbG9hZCgpO1xuICAgIHRoaXMuYnV0dG9uQWN0aW9ucyA9IHRoaXMuYWN0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgIHJldHVybiAhaXRlbS5tZW51OyBcbiAgICB9KTtcbiAgICB0aGlzLm1lbnVBY3Rpb25zID0gdGhpcy5hY3Rpb25zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgcmV0dXJuIGl0ZW0ubWVudTsgXG4gICAgfSk7XG5cbiAgICB0aGlzLmJ1aWxkID0gdGhpcy5fYnVpbGRTZXJ2aWNlLmJ1aWxkO1xuICAgIHRoaXMuX2J1aWxkU2VydmljZS5idWlsZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoYnVpbGQ6IEJ1aWxkRGF0YSkgPT4ge1xuICAgICAgICB0aGlzLmJ1aWxkID0gYnVpbGQ7XG4gICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dChudWxsKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGFjdGlvbkNsaWNrKGFjdGlvbikge1xuICAgIGFjdGlvbi5jbGljaygpO1xuICB9XG5cbiAgcHVibGljIGluaXRDbGljaygpIHtcbiAgICB0aGlzLmluaXQoKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnU3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIHRoZSBzeXN0ZW0nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVDbGljaygpIHtcbiAgICB0aGlzLnVwZ3JhZGUoKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvYWQoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTdWNjZXNzZnVsbHkgdXBncmFkZWQgdGhlIHN5c3RlbScpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9sb2FkKCkge1xuICAgIHRoaXMubG9hZCgpXG4gICAgICAuc3Vic2NyaWJlKChkYXNoYm9hcmQpID0+IHtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmQgPSBkYXNoYm9hcmQ7XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkLmNyb25SYW5BdHRlbnRpb24gPSAhZGFzaGJvYXJkLmNyb25SYW4gfHxcbiAgICAgICAgIGRpZmZlcmVuY2VJbk1pbnV0ZXMobmV3IERhdGUoKSwgbmV3IERhdGUoZGFzaGJvYXJkLmNyb25SYW4pKSA+IDE1O1xuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2ICpmc1NrZWxldG9uPVwiZGFzaGJvYXJkXCI+XG4gIDxkaXYgY2xhc3M9XCJmcy1yb3cuZ2FwLWxnLndyYXAuYWxpZ24tc3RhcnRcIj5cbiAgICA8ZGl2PlxuICAgICAgPGgyPlxuICAgICAgICBTZXJ2ZXJcbiAgICAgIDwvaDI+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBEYXRlL1RpbWVcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3sgZGFzaGJvYXJkLnNlcnZlclRpbWUgfCBmc0RhdGVGb3JtYXQ6ICdkYXRlLXRpbWUnIH19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgVGltZXpvbmVcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3sgZGFzaGJvYXJkLnNlcnZlclRpbWV6b25lIH19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgSG9zdG5hbWVcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3sgZGFzaGJvYXJkLnNlcnZlckhvc3RuYW1lIH19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgRGlyZWN0b3J5XG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7IGRhc2hib2FyZC5hcHBEaXJlY3RvcnkgfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxoMj5cbiAgICAgICAgU3lzdGVtXG4gICAgICA8L2gyPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgTW9kZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7eyBkYXNoYm9hcmQuYXBwTW9kZSB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIE5vdGlmaWNhdGlvbiBSZWNpcGllbnRzXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7IGRhc2hib2FyZC5ub3RpZnlSZWNpcGllbnRzLmpvaW4oJywgJykgfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxoMj5cbiAgICAgICAgRGF0YWJhc2VcbiAgICAgIDwvaDI+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBOYW1lXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7IGRhc2hib2FyZC5kYXRhYmFzZU5hbWUgfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBEYXRlL1RpbWVcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3sgZGFzaGJvYXJkLmRhdGFiYXNlVGltZSB8IGZzRGF0ZUZvcm1hdDogJ2RhdGUtdGltZScgfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBUaW1lem9uZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7eyBkYXNoYm9hcmQuZGF0YWJhc2VUaW1lem9uZSB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKGJ1aWxkIHx8IGRhc2hib2FyZC51cGdyYWRlcy5sZW5ndGgpIHtcbiAgICAgIDxkaXY+XG4gICAgICAgIEBpZiAoYnVpbGQpIHtcbiAgICAgICAgICA8aDI+XG4gICAgICAgICAgICBCdWlsZFxuICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgICAgICBWZXJzaW9uXG4gICAgICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICAgICAge3sgYnVpbGQudmVyc2lvbiB8fCAnVW5rbm93bicgfX1cbiAgICAgICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgICAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICAgICAgRGF0ZVxuICAgICAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAgICAgIHt7IChidWlsZC5kYXRlIHwgZnNEYXRlRm9ybWF0OiAnZGF0ZS10aW1lJykgfHwgJ1Vua25vd24nIH19XG4gICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGRhc2hib2FyZC51cGdyYWRlcy5sZW5ndGgpIHtcbiAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICAgIFBlbmRpbmcgVXBncmFkZXNcbiAgICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cImF0dGVudGlvblwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ25lZWRzLWF0dGVudGlvbic6ICEhZGFzaGJvYXJkLnVwZ3JhZGVzLmxlbmd0aCB9XCI+XG4gICAgICAgICAgICAgIHt7IGRhc2hib2FyZC51cGdyYWRlcy5sZW5ndGggfX1cbiAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiZGFzaGJvYXJkLnVwZ3JhZGVzLmpvaW4oJ1xcbicpXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwQ2xhc3M9XCJ0b29sdGlwLXBlbmRpbmctdXBncmFkZXNcIj5cbiAgICAgICAgICAgICAgICB3YXJuaW5nXG4gICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIDxkaXY+XG4gICAgICA8aDI+XG4gICAgICAgIENyb25cbiAgICAgIDwvaDI+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBMYXN0IFJhblxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwiYXR0ZW50aW9uXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7ICduZWVkcy1hdHRlbnRpb24nOiBkYXNoYm9hcmQuY3JvblJhbkF0dGVudGlvbiB9XCI+XG4gICAgICAgICAgQGlmICghZGFzaGJvYXJkLmNyb25SYW4pIHtcbiAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICBOZXZlclxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGRhc2hib2FyZC5jcm9uUmFuKSB7XG4gICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAge3sgZGFzaGJvYXJkLmNyb25SYW4gfCBmc0RhdGVGb3JtYXQ6ICdkYXRlLXRpbWUnIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxtYXQtaWNvbj5cbiAgICAgICAgICAgIHdhcm5pbmdcbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgICAgKGNsaWNrKT1cInVwZ3JhZGVDbGljaygpXCI+XG4gICAgICAgIFJ1biBVcGdyYWRlc1xuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAoY2xpY2spPVwiaW5pdENsaWNrKClcIj5cbiAgICAgICAgSW5pdCBTeXN0ZW1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgQGZvciAoYWN0aW9uIG9mIGJ1dHRvbkFjdGlvbnM7IHRyYWNrIGFjdGlvbikge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNsaWNrKGFjdGlvbilcIj5cbiAgICAgICAgICB7eyBhY3Rpb24ubGFiZWwgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgICBAaWYgKG1lbnVBY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICA8ZnMtbWVudSBidXR0b25DbGFzcz1cIm1hdC1zdHJva2VkLWJ1dHRvbiBtZW51LWJ1dHRvblwiPlxuICAgICAgICAgIEBmb3IgKGFjdGlvbiBvZiBtZW51QWN0aW9uczsgdHJhY2sgYWN0aW9uKSB7XG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25DbGljayhhY3Rpb24pXCI+XG4gICAgICAgICAgICAgIHt7IGFjdGlvbi5sYWJlbCB9fVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZnMtbWVudT5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9kYXNoYm9hcmQvZGFzaGJvYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9kYXNoYm9hcmQvZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBYSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFB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T0FBTywySUFDUCxVQUFVLGlSQUNWLFNBQVMsZ0xBQ1QsWUFBWSxpU0FDWixZQUFZOzsyRkFHUCxrQkFBa0I7a0JBakI5QixTQUFTOytCQUNJLHFCQUFxQixtQkFHZCx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDTCxnQkFBZ0I7d0JBQ2hCLGFBQWE7d0JBQ2IsT0FBTzt3QkFDUCxPQUFPO3dCQUNQLFVBQVU7d0JBQ1YsU0FBUzt3QkFDVCxZQUFZO3dCQUNaLFlBQVk7cUJBQ2Y7OEJBU2EsSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxPQUFPO3NCQUF0QixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBRVUsT0FBTztzQkFBdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTdHJlYW1FdmVudERhdGEgfSBmcm9tICdAZmlyZXN0aXRjaC9hcGknO1xuaW1wb3J0IHsgQnVpbGREYXRhLCBGc0J1aWxkU2VydmljZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2J1aWxkJztcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9jZXNzLCBQcm9jZXNzU3RhdGUgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9jZXNzJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgZGlmZmVyZW5jZUluTWludXRlcyB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgRGFzaGJvYXJkQWN0aW9uIH0gZnJvbSAnLi8uLi8uLi9pbnRlcmZhY2VzL2Rhc2hib2FyZC1hY3Rpb24nO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcbmltcG9ydCB7IEZzTGFiZWxNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9sYWJlbCc7XG5pbXBvcnQgeyBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBGc01lbnVNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9tZW51JztcbmltcG9ydCB7IEZzRGF0ZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGUnO1xuaW1wb3J0IHsgVXBncmFkZUV2ZW50IH0gZnJvbSAnLi8uLi8uLi9pbnRlcmZhY2VzL3VwZ3JhZGUtZXZlbnQnO1xuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZnMtc3lzdGVtLWRhc2hib2FyZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGFzaGJvYXJkLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEZzU2tlbGV0b25Nb2R1bGUsXG4gICAgICAgIEZzTGFiZWxNb2R1bGUsXG4gICAgICAgIE5nQ2xhc3MsXG4gICAgICAgIE1hdEljb24sXG4gICAgICAgIE1hdFRvb2x0aXAsXG4gICAgICAgIE1hdEJ1dHRvbixcbiAgICAgICAgRnNNZW51TW9kdWxlLFxuICAgICAgICBGc0RhdGVNb2R1bGUsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgX2NkUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSBfYnVpbGRTZXJ2aWNlID0gaW5qZWN0KEZzQnVpbGRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfcHJvY2VzcyA9IGluamVjdChGc1Byb2Nlc3MpO1xuXG5cbiAgQElucHV0KCkgcHVibGljIGluaXQ6ICgpID0+IGFueTtcbiAgQElucHV0KCkgcHVibGljIHVwZ3JhZGU6ICgpID0+IGFueTtcbiAgQElucHV0KCkgcHVibGljIGxvYWQ6ICgpID0+IGFueTtcblxuICBASW5wdXQoKSBwdWJsaWMgYWN0aW9uczogRGFzaGJvYXJkQWN0aW9uW10gPSBbXTtcblxuICBwdWJsaWMgZGFzaGJvYXJkO1xuICBwdWJsaWMgYnV0dG9uQWN0aW9uczogRGFzaGJvYXJkQWN0aW9uW10gPSBbXTtcbiAgcHVibGljIGJ1aWxkOiBCdWlsZERhdGE7XG4gIHB1YmxpYyBtZW51QWN0aW9uczogRGFzaGJvYXJkQWN0aW9uW10gPSBbXTtcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX2xvYWQoKTtcbiAgICB0aGlzLmJ1dHRvbkFjdGlvbnMgPSB0aGlzLmFjdGlvbnMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICByZXR1cm4gIWl0ZW0ubWVudTsgXG4gICAgfSk7XG4gICAgdGhpcy5tZW51QWN0aW9ucyA9IHRoaXMuYWN0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgIHJldHVybiBpdGVtLm1lbnU7IFxuICAgIH0pO1xuXG4gICAgdGhpcy5idWlsZCA9IHRoaXMuX2J1aWxkU2VydmljZS5idWlsZDtcbiAgICB0aGlzLl9idWlsZFNlcnZpY2UuYnVpbGQkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGJ1aWxkOiBCdWlsZERhdGEpID0+IHtcbiAgICAgICAgdGhpcy5idWlsZCA9IGJ1aWxkO1xuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhY3Rpb25DbGljayhhY3Rpb24pIHtcbiAgICBhY3Rpb24uY2xpY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0Q2xpY2soKSB7XG4gICAgdGhpcy5pbml0KClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1N1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCB0aGUgc3lzdGVtJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIHBlbmRpbmcgdXBncmFkZXMgYXMgYSBwcm9jZXNzIHJhdGhlciB0aGFuIGJlaGluZCBhIHNwaW5uZXIuXG4gICAqXG4gICAqIEEgc3Bpbm5lciBzYXlzIHRoZSBzYW1lIHRoaW5nIGZvciB0ZW4gc2Vjb25kcyBhbmQgZm9yIHRlbiBtaW51dGVzLCB3aGljaCBpc1xuICAgKiB0aGUgd2hvbGUgcHJvYmxlbTogYW4gdXBncmFkZSB0aGF0IHJlYnVpbGRzIHRoZSBsYXJnZXN0IHRhYmxlIGluIGEgc2NoZW1hXG4gICAqIGxvb2tzIGV4YWN0bHkgbGlrZSBvbmUgdGhhdCBoYXMgaHVuZywgYW5kIHRoZSBvbmx5IHdheSBhbnlib2R5IGZvdW5kIG91dFxuICAgKiB3aGljaCB3YXMgdG8gd2FpdCBmb3IgYSBwcm94eSB0byBnaXZlIHVwLlxuICAgKlxuICAgKiBXb3JrcyB3aGV0aGVyIG9yIG5vdCB0aGUgYXBwbGljYXRpb24ncyBlbmRwb2ludCBzdHJlYW1zLiBXaGVyZSBpdCBkb2VzLCBlYWNoXG4gICAqIE5ESlNPTiBldmVudCBiZWNvbWVzIGEgbGluZSBpbiB0aGUgcHJvY2VzcyBsb2cg4oCUIHdoaWNoIGZ1bmN0aW9uIGlzIHJ1bm5pbmcsXG4gICAqIGhvdyBmYXIgdGhyb3VnaCBpdCBpcywgd2hhdCBlYWNoIG9uZSBjb3N0LiBXaGVyZSBpdCBkb2VzIG5vdCwgdGhlIHNpbmdsZVxuICAgKiByZXBseSBwcm9kdWNlcyBubyBsaW5lcyBhbmQgdGhlIHByb2Nlc3MgaXMgc2ltcGx5IGEgbGFiZWxsZWQgc3Bpbm5lciwgd2hpY2hcbiAgICogaXMgd2hhdCBldmVyeSBhcHBsaWNhdGlvbiBoYWQgYmVmb3JlIHRoaXMuXG4gICAqL1xuICBwdWJsaWMgdXBncmFkZUNsaWNrKCkge1xuICAgIGNvbnN0IHByb2Nlc3MgPSB0aGlzLl9wcm9jZXNzLnJ1bihcbiAgICAgICdTeXN0ZW0gdXBncmFkZScsXG4gICAgICB0aGlzLnVwZ3JhZGUoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoKGV2ZW50KSA9PiB0aGlzLl91cGdyYWRlTGluZShldmVudCkpLFxuICAgICAgICAgIGZpbHRlcigobGluZSk6IGxpbmUgaXMgc3RyaW5nID0+IGxpbmUgIT09IG51bGwpLFxuICAgICAgICApLFxuICAgICk7XG5cbiAgICAvLyBUaGUgcGVuZGluZy11cGdyYWRlIGNvdW50IG9uIHRoaXMgc2NyZWVuIGlzIHRoZSB0aGluZyB0aGUgYnV0dG9uIHdhc1xuICAgIC8vIHByZXNzZWQgdG8gY2hhbmdlLCBzbyBpdCBpcyByZS1yZWFkIHdoZW4gdGhlIHJ1biBzZXR0bGVzIOKAlCBpbmNsdWRpbmcgd2hlblxuICAgIC8vIGl0IEZBSUxTLCBiZWNhdXNlIGEgcnVuIHRoYXQgc3RvcHBlZCBoYWxmd2F5IHN0aWxsIGNvbXBsZXRlZCBldmVyeXRoaW5nXG4gICAgLy8gYmVmb3JlIHRoZSBvbmUgdGhhdCBicm9rZS5cbiAgICBwcm9jZXNzLmNvbXBsZXRlZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoc3RhdGU6IFByb2Nlc3NTdGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLl9sb2FkKCk7XG5cbiAgICAgICAgaWYgKHN0YXRlID09PSBQcm9jZXNzU3RhdGUuU3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnU3VjY2Vzc2Z1bGx5IHVwZ3JhZGVkIHRoZSBzeXN0ZW0nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT25lIGVtaXNzaW9uIG9mZiB0aGUgdXBncmFkZSBlbmRwb2ludCwgYXMgYSBsaW5lIGZvciB0aGUgcHJvY2VzcyBsb2cg4oCUIG9yXG4gICAqIG51bGwgZm9yIGFueXRoaW5nIHdpdGggbm90aGluZyB0byBzYXksIHdoaWNoIGlzIGRyb3BwZWQgcmF0aGVyIHRoYW4gbG9nZ2VkLlxuICAgKlxuICAgKiBgRnNBcGkuc3RyZWFtKClgIHdyYXBzIGV2ZXJ5IE5ESlNPTiBsaW5lIGluIGEgYFN0cmVhbUV2ZW50RGF0YWAsIGFuZFxuICAgKiBgRnNQcm9jZXNzYCBsb2dzIGEgc3RyaW5nIGVtaXNzaW9uIHZlcmJhdGltLiBTbyB0aGUgbWFwcGluZyBoYXBwZW5zIGhlcmU6IGFuXG4gICAqIG9iamVjdCBoYW5kZWQgdG8gdGhlIGxvZyByZW5kZXJzIGFzIGBbb2JqZWN0IE9iamVjdF1gLlxuICAgKlxuICAgKiBgcGluZ2AgaXMgZGVsaWJlcmF0ZWx5IHNpbGVudC4gSXQgaXMgdGhlIGhlYXJ0YmVhdCB0aGF0IHN0b3BzIGEgcHJveHlcbiAgICogY2xvc2luZyBhIHJ1biB0aGF0IGlzIHN0aWxsIHdvcmtpbmcsIGl0IGZpcmVzIGFmdGVyIGV2ZXJ5IHN0YXRlbWVudCwgYW5kIGl0XG4gICAqIHdvdWxkIGJ1cnkgdGhlIGV2ZW50cyB3b3J0aCByZWFkaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfdXBncmFkZUxpbmUoZXZlbnQ6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBkYXRhOiBVcGdyYWRlRXZlbnQgPSAoZXZlbnQgaW5zdGFuY2VvZiBTdHJlYW1FdmVudERhdGEgPyBldmVudC5kYXRhIDogZXZlbnQpIGFzIFVwZ3JhZGVFdmVudDtcblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGlmICghZGF0YSB8fCAhZGF0YS50eXBlIHx8IGRhdGEudHlwZSA9PT0gJ3BpbmcnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGVwID0gYCR7ZGF0YS5pbmRleH0gb2YgJHtkYXRhLnRvdGFsfWA7XG5cbiAgICBzd2l0Y2ggKGRhdGEudHlwZSkge1xuICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICByZXR1cm4gZGF0YS50b3RhbFxuICAgICAgICAgID8gYCR7ZGF0YS50b3RhbH0gdXBncmFkZShzKSB0byBydW46ICR7KGRhdGEuZnVuY3Rpb25zIHx8IFtdKS5qb2luKCcsICcpfWBcbiAgICAgICAgICA6ICdOb3RoaW5nIHRvIHVwZ3JhZGUnO1xuXG4gICAgICBjYXNlICd1cGdyYWRlJzpcbiAgICAgICAgaWYgKGRhdGEuc3RhdGUgPT09ICdzdGFydGVkJykge1xuICAgICAgICAgIHJldHVybiBgJHtzdGVwfSAke2RhdGEubmFtZX3igKZgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGEuc3RhdGUgPT09ICdjb21wbGV0ZWQnXG4gICAgICAgICAgPyBgJHtzdGVwfSAke2RhdGEubmFtZX0g4oCUICR7ZGF0YS5kdXJhdGlvbn1gXG4gICAgICAgICAgOiBgJHtzdGVwfSAke2RhdGEubmFtZX0gRkFJTEVEIOKAlCAke2RhdGEubWVzc2FnZX1gO1xuXG4gICAgICBjYXNlICdkb25lJzpcbiAgICAgICAgcmV0dXJuIGRhdGEuY29tcGxldGVkXG4gICAgICAgICAgPyBgQ29tcGxldGVkICR7ZGF0YS5jb21wbGV0ZWR9IHVwZ3JhZGUocylgXG4gICAgICAgICAgOiAnTm90aGluZyB0byB1cGdyYWRlJztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGRhdGEubWVzc2FnZSB8fCBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xvYWQoKSB7XG4gICAgdGhpcy5sb2FkKClcbiAgICAgIC5zdWJzY3JpYmUoKGRhc2hib2FyZCkgPT4ge1xuICAgICAgICB0aGlzLmRhc2hib2FyZCA9IGRhc2hib2FyZDtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmQuY3JvblJhbkF0dGVudGlvbiA9ICFkYXNoYm9hcmQuY3JvblJhbiB8fFxuICAgICAgICAgZGlmZmVyZW5jZUluTWludXRlcyhuZXcgRGF0ZSgpLCBuZXcgRGF0ZShkYXNoYm9hcmQuY3JvblJhbikpID4gMTU7XG4gICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgKmZzU2tlbGV0b249XCJkYXNoYm9hcmRcIj5cbiAgPGRpdiBjbGFzcz1cImZzLXJvdy5nYXAtbGcud3JhcC5hbGlnbi1zdGFydFwiPlxuICAgIDxkaXY+XG4gICAgICA8aDI+XG4gICAgICAgIFNlcnZlclxuICAgICAgPC9oMj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIERhdGUvVGltZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7eyBkYXNoYm9hcmQuc2VydmVyVGltZSB8IGZzRGF0ZUZvcm1hdDogJ2RhdGUtdGltZScgfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBUaW1lem9uZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7eyBkYXNoYm9hcmQuc2VydmVyVGltZXpvbmUgfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBIb3N0bmFtZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7eyBkYXNoYm9hcmQuc2VydmVySG9zdG5hbWUgfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBEaXJlY3RvcnlcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3sgZGFzaGJvYXJkLmFwcERpcmVjdG9yeSB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPGgyPlxuICAgICAgICBTeXN0ZW1cbiAgICAgIDwvaDI+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBNb2RlXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7IGRhc2hib2FyZC5hcHBNb2RlIH19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgTm90aWZpY2F0aW9uIFJlY2lwaWVudHNcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3sgZGFzaGJvYXJkLm5vdGlmeVJlY2lwaWVudHMuam9pbignLCAnKSB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPGgyPlxuICAgICAgICBEYXRhYmFzZVxuICAgICAgPC9oMj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIE5hbWVcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3sgZGFzaGJvYXJkLmRhdGFiYXNlTmFtZSB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIERhdGUvVGltZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7eyBkYXNoYm9hcmQuZGF0YWJhc2VUaW1lIHwgZnNEYXRlRm9ybWF0OiAnZGF0ZS10aW1lJyB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIFRpbWV6b25lXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7IGRhc2hib2FyZC5kYXRhYmFzZVRpbWV6b25lIH19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIEBpZiAoYnVpbGQgfHwgZGFzaGJvYXJkLnVwZ3JhZGVzLmxlbmd0aCkge1xuICAgICAgPGRpdj5cbiAgICAgICAgQGlmIChidWlsZCkge1xuICAgICAgICAgIDxoMj5cbiAgICAgICAgICAgIEJ1aWxkXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICAgIFZlcnNpb25cbiAgICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgICB7eyBidWlsZC52ZXJzaW9uIHx8ICdVbmtub3duJyB9fVxuICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgICAgICBEYXRlXG4gICAgICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICAgICAge3sgKGJ1aWxkLmRhdGUgfCBmc0RhdGVGb3JtYXQ6ICdkYXRlLXRpbWUnKSB8fCAnVW5rbm93bicgfX1cbiAgICAgICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoZGFzaGJvYXJkLnVwZ3JhZGVzLmxlbmd0aCkge1xuICAgICAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICAgICAgUGVuZGluZyBVcGdyYWRlc1xuICAgICAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW50aW9uXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnbmVlZHMtYXR0ZW50aW9uJzogISFkYXNoYm9hcmQudXBncmFkZXMubGVuZ3RoIH1cIj5cbiAgICAgICAgICAgICAge3sgZGFzaGJvYXJkLnVwZ3JhZGVzLmxlbmd0aCB9fVxuICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJkYXNoYm9hcmQudXBncmFkZXMuam9pbignXFxuJylcIlxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBDbGFzcz1cInRvb2x0aXAtcGVuZGluZy11cGdyYWRlc1wiPlxuICAgICAgICAgICAgICAgIHdhcm5pbmdcbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgPGRpdj5cbiAgICAgIDxoMj5cbiAgICAgICAgQ3JvblxuICAgICAgPC9oMj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIExhc3QgUmFuXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJhdHRlbnRpb25cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ25lZWRzLWF0dGVudGlvbic6IGRhc2hib2FyZC5jcm9uUmFuQXR0ZW50aW9uIH1cIj5cbiAgICAgICAgICBAaWYgKCFkYXNoYm9hcmQuY3JvblJhbikge1xuICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgIE5ldmVyXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoZGFzaGJvYXJkLmNyb25SYW4pIHtcbiAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICB7eyBkYXNoYm9hcmQuY3JvblJhbiB8IGZzRGF0ZUZvcm1hdDogJ2RhdGUtdGltZScgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPG1hdC1pY29uPlxuICAgICAgICAgICAgd2FybmluZ1xuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAoY2xpY2spPVwidXBncmFkZUNsaWNrKClcIj5cbiAgICAgICAgUnVuIFVwZ3JhZGVzXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJpbml0Q2xpY2soKVwiPlxuICAgICAgICBJbml0IFN5c3RlbVxuICAgICAgPC9idXR0b24+XG4gICAgICBAZm9yIChhY3Rpb24gb2YgYnV0dG9uQWN0aW9uczsgdHJhY2sgYWN0aW9uKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ2xpY2soYWN0aW9uKVwiPlxuICAgICAgICAgIHt7IGFjdGlvbi5sYWJlbCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAobWVudUFjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIDxmcy1tZW51IGJ1dHRvbkNsYXNzPVwibWF0LXN0cm9rZWQtYnV0dG9uIG1lbnUtYnV0dG9uXCI+XG4gICAgICAgICAgQGZvciAoYWN0aW9uIG9mIG1lbnVBY3Rpb25zOyB0cmFjayBhY3Rpb24pIHtcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNsaWNrKGFjdGlvbilcIj5cbiAgICAgICAgICAgICAge3sgYWN0aW9uLmxhYmVsIH19XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9mcy1tZW51PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
@@ -2,4 +2,5 @@ export * from './dashboard-action';
2
2
  export * from './process-action';
3
3
  export * from './process';
4
4
  export * from './system-config';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvc3lzdGVtL2ludGVyZmFjZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsaUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Rhc2hib2FyZC1hY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9wcm9jZXNzLWFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3Byb2Nlc3MnO1xuZXhwb3J0ICogZnJvbSAnLi9zeXN0ZW0tY29uZmlnJztcbiJdfQ==
5
+ export * from './upgrade-event';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvc3lzdGVtL2ludGVyZmFjZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZGFzaGJvYXJkLWFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3Byb2Nlc3MtYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvY2Vzcyc7XG5leHBvcnQgKiBmcm9tICcuL3N5c3RlbS1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi91cGdyYWRlLWV2ZW50JztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBncmFkZS1ldmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vaW50ZXJmYWNlcy91cGdyYWRlLWV2ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9uZSBOREpTT04gbGluZSBvZmYgYSBzdHJlYW1pbmcgdXBncmFkZSBlbmRwb2ludC5cbiAqXG4gKiBUaGUgZnJhbWV3b3JrJ3Mgc3lzdGVtIHZpZXcgc3RyZWFtcyB0aGVzZSBvbmx5IHdoZW4gdGhlIGNhbGxlciBhc2tzIGZvciBhXG4gKiBzdHJlYW0sIHNvIGFuIGFwcGxpY2F0aW9uIHRoYXQgaGFzIG5vdCBvcHRlZCBpbiBlbWl0cyBhbiBvcmRpbmFyeSByZXBseSBhbmRcbiAqIG5vbmUgb2YgdGhpcyBhcHBsaWVzIOKAlCBzZWUgYERhc2hib2FyZENvbXBvbmVudC5fdXBncmFkZUxpbmUoKWAsIHdoaWNoIHRyZWF0c1xuICogYW55dGhpbmcgdW5yZWNvZ25pc2VkIGFzIGhhdmluZyBub3RoaW5nIHRvIGxvZy5cbiAqXG4gKiBgc3RhcnRgIGFycml2ZXMgb25jZSB3aXRoIHRoZSBmdWxsIGxpc3Qgb2YgcGVuZGluZyBmdW5jdGlvbnMsIGJlY2F1c2UgXCJ3b3JraW5nXG4gKiBvbiAyIG9mIDlcIiBpcyBvbmx5IG1lYW5pbmdmdWwgdG8gc29tZWJvZHkgd2hvIHdhcyB0b2xkIHRoZXJlIHdlcmUgOS4gYHVwZ3JhZGVgXG4gKiBhcnJpdmVzIHR3aWNlIHBlciBmdW5jdGlvbiwgb24gZWl0aGVyIHNpZGUgb2YgaXQsIGNhcnJ5aW5nIHdoYXQgaXQgY29zdC5cbiAqIGBwaW5nYCBpcyB0aGUgaGVhcnRiZWF0IGFuZCBzYXlzIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBncmFkZUV2ZW50IHtcbiAgdHlwZTogJ3N0YXJ0JyB8ICd1cGdyYWRlJyB8ICdsb2cnIHwgJ3BpbmcnIHwgJ2RvbmUnO1xuICBzdGF0ZT86ICdzdGFydGVkJyB8ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGluZGV4PzogbnVtYmVyO1xuICB0b3RhbD86IG51bWJlcjtcbiAgY29tcGxldGVkPzogbnVtYmVyO1xuICBkdXJhdGlvbj86IHN0cmluZztcbiAgc2Vjb25kcz86IG51bWJlcjtcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgZnVuY3Rpb25zPzogc3RyaW5nW107XG59XG4iXX0=
@@ -17,4 +17,4 @@ export { LinkifyPipe } from './app/modules/system/pipes/linkify.pipe';
17
17
  export { ApiLogStates, CronStates, ProcessStates } from './app/modules/system/consts';
18
18
  export { ApiLogState, CronState, ProcessState } from './app/modules/system/enums';
19
19
  export { FS_SYSTEM_CONFIG } from './app/modules/system/injectors/system-config.injector';
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDcEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDbEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRXRFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBSWxGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgeyBGc1N5c3RlbU1vZHVsZSB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2ZzLXN5c3RlbS5tb2R1bGUnO1xuXG5leHBvcnQgeyBRdWVyeUxvZ3NDb21wb25lbnQgfSBmcm9tICcuL2FwcC9tb2R1bGVzL3F1ZXJ5LWxvZ3MvY29tcG9uZW50cyc7XG5leHBvcnQgeyBBcGlMb2dDb21wb25lbnQgfSBmcm9tICcuL2FwcC9tb2R1bGVzL3N5c3RlbS9jb21wb25lbnRzL2FwaS1sb2cnO1xuZXhwb3J0IHsgQXBpTG9nc0NvbXBvbmVudCB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvYXBpLWxvZ3MnO1xuZXhwb3J0IHsgQ3JvbkNvbXBvbmVudCB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvY3Jvbic7XG5leHBvcnQgeyBDcm9uTG9nQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9jcm9uLWxvZyc7XG5leHBvcnQgeyBDcm9uc0NvbXBvbmVudCB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvY3JvbnMnO1xuZXhwb3J0IHsgRGFzaGJvYXJkQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9kYXNoYm9hcmQnO1xuZXhwb3J0IHsgSW5mb0NvbXBvbmVudCB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvaW5mbyc7XG5leHBvcnQgeyBQcm9jZXNzQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9wcm9jZXNzJztcbmV4cG9ydCB7IFByb2Nlc3Nlc0NvbXBvbmVudCB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvcHJvY2Vzc2VzJztcbmV4cG9ydCB7IFNlcnZlckxvZ3NDb21wb25lbnQgfSBmcm9tICcuL2FwcC9tb2R1bGVzL3N5c3RlbS9jb21wb25lbnRzL3NlcnZlci1sb2dzJztcbmV4cG9ydCB7IFNldHRpbmdzQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9zZXR0aW5ncyc7XG5leHBvcnQgeyBVcGdyYWRlTG9nc0NvbXBvbmVudCB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvdXBncmFkZS1sb2dzJztcbmV4cG9ydCB7IEtleU5hbWVWYWx1ZVBpcGUgfSBmcm9tICcuL2FwcC9tb2R1bGVzL3N5c3RlbS9waXBlcy9rZXktbmFtZS12YWx1ZS5waXBlJztcbmV4cG9ydCB7IExpbmtpZnlQaXBlIH0gZnJvbSAnLi9hcHAvbW9kdWxlcy9zeXN0ZW0vcGlwZXMvbGlua2lmeS5waXBlJztcblxuZXhwb3J0IHsgQXBpTG9nU3RhdGVzLCBDcm9uU3RhdGVzLCBQcm9jZXNzU3RhdGVzIH0gZnJvbSAnLi9hcHAvbW9kdWxlcy9zeXN0ZW0vY29uc3RzJztcbmV4cG9ydCB7IEFwaUxvZ1N0YXRlLCBDcm9uU3RhdGUsIFByb2Nlc3NTdGF0ZSB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2VudW1zJztcblxuZXhwb3J0IHsgRGFzaGJvYXJkQWN0aW9uLCBGc1N5c3RlbUNvbmZpZywgUHJvY2Vzc0FjdGlvbiB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgeyBGU19TWVNURU1fQ09ORklHIH0gZnJvbSAnLi9hcHAvbW9kdWxlcy9zeXN0ZW0vaW5qZWN0b3JzL3N5c3RlbS1jb25maWcuaW5qZWN0b3InO1xuIl19
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDcEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDbEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRXRFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBSWxGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgeyBGc1N5c3RlbU1vZHVsZSB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2ZzLXN5c3RlbS5tb2R1bGUnO1xuXG5leHBvcnQgeyBRdWVyeUxvZ3NDb21wb25lbnQgfSBmcm9tICcuL2FwcC9tb2R1bGVzL3F1ZXJ5LWxvZ3MvY29tcG9uZW50cyc7XG5leHBvcnQgeyBBcGlMb2dDb21wb25lbnQgfSBmcm9tICcuL2FwcC9tb2R1bGVzL3N5c3RlbS9jb21wb25lbnRzL2FwaS1sb2cnO1xuZXhwb3J0IHsgQXBpTG9nc0NvbXBvbmVudCB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvYXBpLWxvZ3MnO1xuZXhwb3J0IHsgQ3JvbkNvbXBvbmVudCB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvY3Jvbic7XG5leHBvcnQgeyBDcm9uTG9nQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9jcm9uLWxvZyc7XG5leHBvcnQgeyBDcm9uc0NvbXBvbmVudCB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvY3JvbnMnO1xuZXhwb3J0IHsgRGFzaGJvYXJkQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9kYXNoYm9hcmQnO1xuZXhwb3J0IHsgSW5mb0NvbXBvbmVudCB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvaW5mbyc7XG5leHBvcnQgeyBQcm9jZXNzQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9wcm9jZXNzJztcbmV4cG9ydCB7IFByb2Nlc3Nlc0NvbXBvbmVudCB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvcHJvY2Vzc2VzJztcbmV4cG9ydCB7IFNlcnZlckxvZ3NDb21wb25lbnQgfSBmcm9tICcuL2FwcC9tb2R1bGVzL3N5c3RlbS9jb21wb25lbnRzL3NlcnZlci1sb2dzJztcbmV4cG9ydCB7IFNldHRpbmdzQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9zZXR0aW5ncyc7XG5leHBvcnQgeyBVcGdyYWRlTG9nc0NvbXBvbmVudCB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvdXBncmFkZS1sb2dzJztcbmV4cG9ydCB7IEtleU5hbWVWYWx1ZVBpcGUgfSBmcm9tICcuL2FwcC9tb2R1bGVzL3N5c3RlbS9waXBlcy9rZXktbmFtZS12YWx1ZS5waXBlJztcbmV4cG9ydCB7IExpbmtpZnlQaXBlIH0gZnJvbSAnLi9hcHAvbW9kdWxlcy9zeXN0ZW0vcGlwZXMvbGlua2lmeS5waXBlJztcblxuZXhwb3J0IHsgQXBpTG9nU3RhdGVzLCBDcm9uU3RhdGVzLCBQcm9jZXNzU3RhdGVzIH0gZnJvbSAnLi9hcHAvbW9kdWxlcy9zeXN0ZW0vY29uc3RzJztcbmV4cG9ydCB7IEFwaUxvZ1N0YXRlLCBDcm9uU3RhdGUsIFByb2Nlc3NTdGF0ZSB9IGZyb20gJy4vYXBwL21vZHVsZXMvc3lzdGVtL2VudW1zJztcblxuZXhwb3J0IHsgRGFzaGJvYXJkQWN0aW9uLCBGc1N5c3RlbUNvbmZpZywgUHJvY2Vzc0FjdGlvbiwgVXBncmFkZUV2ZW50IH0gZnJvbSAnLi9hcHAvbW9kdWxlcy9zeXN0ZW0vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCB7IEZTX1NZU1RFTV9DT05GSUcgfSBmcm9tICcuL2FwcC9tb2R1bGVzL3N5c3RlbS9pbmplY3RvcnMvc3lzdGVtLWNvbmZpZy5pbmplY3Rvcic7XG4iXX0=
@@ -47,7 +47,7 @@ import { FsApi, RequestMethod, StreamEventData, StreamEventType } from '@firesti
47
47
  import { Subject, timer, Observable } from 'rxjs';
48
48
  import { addMinutes, addHours, addDays, subSeconds, differenceInSeconds, getDaysInMonth, differenceInMinutes } from 'date-fns';
49
49
  import { FsMessage } from '@firestitch/message';
50
- import { FsProcess } from '@firestitch/process';
50
+ import { FsProcess, ProcessState as ProcessState$1 } from '@firestitch/process';
51
51
  import { FsPrompt } from '@firestitch/prompt';
52
52
  import { SelectionActionType } from '@firestitch/selection';
53
53
  import { FsBuildService } from '@firestitch/build';
@@ -848,6 +848,7 @@ class DashboardComponent {
848
848
  _message = inject(FsMessage);
849
849
  _cdRef = inject(ChangeDetectorRef);
850
850
  _buildService = inject(FsBuildService);
851
+ _process = inject(FsProcess);
851
852
  init;
852
853
  upgrade;
853
854
  load;
@@ -886,13 +887,77 @@ class DashboardComponent {
886
887
  this._message.success('Successfully initialized the system');
887
888
  });
888
889
  }
890
+ /**
891
+ * Run the pending upgrades as a process rather than behind a spinner.
892
+ *
893
+ * A spinner says the same thing for ten seconds and for ten minutes, which is
894
+ * the whole problem: an upgrade that rebuilds the largest table in a schema
895
+ * looks exactly like one that has hung, and the only way anybody found out
896
+ * which was to wait for a proxy to give up.
897
+ *
898
+ * Works whether or not the application's endpoint streams. Where it does, each
899
+ * NDJSON event becomes a line in the process log — which function is running,
900
+ * how far through it is, what each one cost. Where it does not, the single
901
+ * reply produces no lines and the process is simply a labelled spinner, which
902
+ * is what every application had before this.
903
+ */
889
904
  upgradeClick() {
890
- this.upgrade()
891
- .subscribe(() => {
905
+ const process = this._process.run('System upgrade', this.upgrade()
906
+ .pipe(map((event) => this._upgradeLine(event)), filter((line) => line !== null)));
907
+ // The pending-upgrade count on this screen is the thing the button was
908
+ // pressed to change, so it is re-read when the run settles — including when
909
+ // it FAILS, because a run that stopped halfway still completed everything
910
+ // before the one that broke.
911
+ process.completed$
912
+ .pipe(take(1), takeUntil(this._destroy$))
913
+ .subscribe((state) => {
892
914
  this._load();
893
- this._message.success('Successfully upgraded the system');
915
+ if (state === ProcessState$1.Success) {
916
+ this._message.success('Successfully upgraded the system');
917
+ }
894
918
  });
895
919
  }
920
+ /**
921
+ * One emission off the upgrade endpoint, as a line for the process log — or
922
+ * null for anything with nothing to say, which is dropped rather than logged.
923
+ *
924
+ * `FsApi.stream()` wraps every NDJSON line in a `StreamEventData`, and
925
+ * `FsProcess` logs a string emission verbatim. So the mapping happens here: an
926
+ * object handed to the log renders as `[object Object]`.
927
+ *
928
+ * `ping` is deliberately silent. It is the heartbeat that stops a proxy
929
+ * closing a run that is still working, it fires after every statement, and it
930
+ * would bury the events worth reading.
931
+ */
932
+ _upgradeLine(event) {
933
+ const data = (event instanceof StreamEventData ? event.data : event);
934
+ if (typeof data === 'string') {
935
+ return data;
936
+ }
937
+ if (!data || !data.type || data.type === 'ping') {
938
+ return null;
939
+ }
940
+ const step = `${data.index} of ${data.total}`;
941
+ switch (data.type) {
942
+ case 'start':
943
+ return data.total
944
+ ? `${data.total} upgrade(s) to run: ${(data.functions || []).join(', ')}`
945
+ : 'Nothing to upgrade';
946
+ case 'upgrade':
947
+ if (data.state === 'started') {
948
+ return `${step} ${data.name}…`;
949
+ }
950
+ return data.state === 'completed'
951
+ ? `${step} ${data.name} — ${data.duration}`
952
+ : `${step} ${data.name} FAILED — ${data.message}`;
953
+ case 'done':
954
+ return data.completed
955
+ ? `Completed ${data.completed} upgrade(s)`
956
+ : 'Nothing to upgrade';
957
+ default:
958
+ return data.message || null;
959
+ }
960
+ }
896
961
  _load() {
897
962
  this.load()
898
963
  .subscribe((dashboard) => {