raain-app 1.6.21 → 1.6.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -1
- package/cumulative-selector/cumulative-selector.component.d.ts +45 -0
- package/esm2020/cumulative-selector/cumulative-selector.component.mjs +199 -0
- package/esm2020/index.mjs +2 -1
- package/esm2020/profile.service.mjs +55 -1
- package/esm2020/raain-compare-stack/raain-compare-stack.component.mjs +3 -3
- package/esm2020/raain-details/raain-details.component.mjs +73 -7
- package/esm2020/shared.module.mjs +8 -3
- package/esm2020/tools/CompareManager.mjs +31 -8
- package/esm2020/tools/RefreshManager.mjs +2 -2
- package/fesm2015/raain-app.mjs +1622 -1267
- package/fesm2015/raain-app.mjs.map +1 -1
- package/fesm2020/raain-app.mjs +1515 -1175
- package/fesm2020/raain-app.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/package.json +2 -2
- package/profile.service.d.ts +14 -1
- package/raain-details/raain-details.component.d.ts +7 -1
- package/shared.module.d.ts +6 -5
- package/tools/CompareManager.d.ts +8 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,7 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
## [1.6.
|
|
10
|
+
## [1.6.23] - 2026-01-19
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- New `CumulativeSelectorComponent` for selecting and creating cumulative periods
|
|
15
|
+
- Lists available cumulative periods with window duration display
|
|
16
|
+
- Validates base cumulative coverage before allowing new period creation
|
|
17
|
+
- Polls for computation completion with progress feedback
|
|
18
|
+
- ProfileService: `getCumulativePeriods()` to list available cumulative periods
|
|
19
|
+
- ProfileService: `createCumulativePeriod()` to trigger cumulative computation
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- Cumulative toggle now shows selector popup when enabling (instead of direct toggle)
|
|
24
|
+
- RaainDetails: cumulative period selection flow with `onCumulativePeriodSelected()`
|
|
25
|
+
|
|
26
|
+
## [1.6.22] - 2025-12-16
|
|
11
27
|
|
|
12
28
|
### Added
|
|
13
29
|
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ChangeDetectorRef, EventEmitter, OnInit } from '@angular/core';
|
|
2
|
+
import { ProfileService } from '../profile.service';
|
|
3
|
+
import { CumulativePeriod } from 'raain-model';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export interface CumulativeSelection {
|
|
6
|
+
periodBegin: Date;
|
|
7
|
+
periodEnd: Date;
|
|
8
|
+
windowInMinutes: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class CumulativeSelectorComponent implements OnInit {
|
|
11
|
+
private profileService;
|
|
12
|
+
private cdr;
|
|
13
|
+
rainId: string;
|
|
14
|
+
currentPeriodBegin: Date;
|
|
15
|
+
currentPeriodEnd: Date;
|
|
16
|
+
provider: string;
|
|
17
|
+
timeStepInMinutes: number;
|
|
18
|
+
isAdmin: boolean;
|
|
19
|
+
periodSelected: EventEmitter<CumulativeSelection>;
|
|
20
|
+
cancelled: EventEmitter<void>;
|
|
21
|
+
availablePeriods: CumulativePeriod[];
|
|
22
|
+
baseCumulatives: CumulativePeriod;
|
|
23
|
+
loading: boolean;
|
|
24
|
+
creating: boolean;
|
|
25
|
+
creationProgress: string;
|
|
26
|
+
errorMessage: string;
|
|
27
|
+
coveragePercent: number;
|
|
28
|
+
canCreateNew: boolean;
|
|
29
|
+
currentWindowMinutes: number;
|
|
30
|
+
private readonly POLL_TIMEOUT_MS;
|
|
31
|
+
private readonly POLL_INTERVAL_MS;
|
|
32
|
+
constructor(profileService: ProfileService, cdr: ChangeDetectorRef);
|
|
33
|
+
ngOnInit(): Promise<void>;
|
|
34
|
+
loadAvailablePeriods(): Promise<void>;
|
|
35
|
+
calculateCoverage(): void;
|
|
36
|
+
selectPeriod(period: CumulativePeriod): void;
|
|
37
|
+
createNewPeriod(): Promise<void>;
|
|
38
|
+
private pollForCompletion;
|
|
39
|
+
private sleep;
|
|
40
|
+
cancel(): void;
|
|
41
|
+
formatPeriod(period: CumulativePeriod): string;
|
|
42
|
+
formatWindow(minutes: number): string;
|
|
43
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CumulativeSelectorComponent, never>;
|
|
44
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<CumulativeSelectorComponent, "cumulative-selector", never, { "rainId": "rainId"; "currentPeriodBegin": "currentPeriodBegin"; "currentPeriodEnd": "currentPeriodEnd"; "provider": "provider"; "timeStepInMinutes": "timeStepInMinutes"; "isAdmin": "isAdmin"; }, { "periodSelected": "periodSelected"; "cancelled": "cancelled"; }, never, never, false, never>;
|
|
45
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../profile.service";
|
|
4
|
+
import * as i2 from "@angular/common";
|
|
5
|
+
import * as i3 from "@ionic/angular";
|
|
6
|
+
export class CumulativeSelectorComponent {
|
|
7
|
+
constructor(profileService, cdr) {
|
|
8
|
+
this.profileService = profileService;
|
|
9
|
+
this.cdr = cdr;
|
|
10
|
+
this.timeStepInMinutes = 5;
|
|
11
|
+
this.isAdmin = false;
|
|
12
|
+
this.periodSelected = new EventEmitter();
|
|
13
|
+
this.cancelled = new EventEmitter();
|
|
14
|
+
this.availablePeriods = [];
|
|
15
|
+
this.baseCumulatives = null;
|
|
16
|
+
this.loading = true;
|
|
17
|
+
this.creating = false;
|
|
18
|
+
this.creationProgress = '';
|
|
19
|
+
this.errorMessage = '';
|
|
20
|
+
this.coveragePercent = 0;
|
|
21
|
+
this.canCreateNew = false;
|
|
22
|
+
this.currentWindowMinutes = 0;
|
|
23
|
+
this.POLL_TIMEOUT_MS = 900000; // 900 seconds
|
|
24
|
+
this.POLL_INTERVAL_MS = 3000;
|
|
25
|
+
}
|
|
26
|
+
async ngOnInit() {
|
|
27
|
+
this.currentWindowMinutes = Math.round((this.currentPeriodEnd.getTime() - this.currentPeriodBegin.getTime()) / 60000);
|
|
28
|
+
await this.loadAvailablePeriods();
|
|
29
|
+
}
|
|
30
|
+
async loadAvailablePeriods() {
|
|
31
|
+
this.loading = true;
|
|
32
|
+
this.errorMessage = '';
|
|
33
|
+
this.cdr.markForCheck();
|
|
34
|
+
try {
|
|
35
|
+
// Fetch all cumulative periods (admin sees all, non-admin sees only customer-launched)
|
|
36
|
+
const response = await this.profileService.getCumulativePeriods(this.rainId, {
|
|
37
|
+
provider: this.provider,
|
|
38
|
+
forced: this.isAdmin,
|
|
39
|
+
});
|
|
40
|
+
// Filter for existing custom cumulatives (window > 0)
|
|
41
|
+
this.availablePeriods = response.periods.filter((p) => p.windowInMinutes > 0);
|
|
42
|
+
// Get base cumulatives (window = 0) to check coverage
|
|
43
|
+
this.baseCumulatives = response.periods.find((p) => p.windowInMinutes === 0);
|
|
44
|
+
this.calculateCoverage();
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
this.errorMessage = 'Failed to load cumulative periods';
|
|
48
|
+
console.error('Error loading cumulative periods:', e);
|
|
49
|
+
}
|
|
50
|
+
this.loading = false;
|
|
51
|
+
this.cdr.markForCheck();
|
|
52
|
+
}
|
|
53
|
+
calculateCoverage() {
|
|
54
|
+
if (!this.baseCumulatives) {
|
|
55
|
+
this.coveragePercent = 0;
|
|
56
|
+
this.canCreateNew = false;
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const baseBegin = new Date(this.baseCumulatives.periodBegin);
|
|
60
|
+
const baseEnd = new Date(this.baseCumulatives.periodEnd);
|
|
61
|
+
// Check if current period is within base coverage
|
|
62
|
+
const currentInRange = this.currentPeriodBegin >= baseBegin && this.currentPeriodEnd <= baseEnd;
|
|
63
|
+
if (!currentInRange) {
|
|
64
|
+
this.coveragePercent = 0;
|
|
65
|
+
this.canCreateNew = false;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Calculate expected number of base cumulatives needed
|
|
69
|
+
const expectedCount = Math.ceil(this.currentWindowMinutes / this.timeStepInMinutes);
|
|
70
|
+
// Check if enough base cumulatives exist
|
|
71
|
+
// We assume coverage is complete if count >= expected (simplified check)
|
|
72
|
+
if (this.baseCumulatives.count >= expectedCount) {
|
|
73
|
+
this.coveragePercent = 100;
|
|
74
|
+
this.canCreateNew = true;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this.coveragePercent = Math.round((this.baseCumulatives.count / expectedCount) * 100);
|
|
78
|
+
this.canCreateNew = this.coveragePercent >= 100;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
selectPeriod(period) {
|
|
82
|
+
this.periodSelected.emit({
|
|
83
|
+
periodBegin: new Date(period.periodBegin),
|
|
84
|
+
periodEnd: new Date(period.periodEnd),
|
|
85
|
+
windowInMinutes: period.windowInMinutes,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async createNewPeriod() {
|
|
89
|
+
if (!this.canCreateNew || this.creating) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
this.creating = true;
|
|
93
|
+
this.creationProgress = 'Starting cumulative computation...';
|
|
94
|
+
this.errorMessage = '';
|
|
95
|
+
this.cdr.markForCheck();
|
|
96
|
+
try {
|
|
97
|
+
// Trigger cumulative creation
|
|
98
|
+
const result = await this.profileService.createCumulativePeriod(this.rainId, {
|
|
99
|
+
periodBegin: this.currentPeriodBegin,
|
|
100
|
+
periodEnd: this.currentPeriodEnd,
|
|
101
|
+
provider: this.provider,
|
|
102
|
+
timeStepInMinutes: this.timeStepInMinutes,
|
|
103
|
+
});
|
|
104
|
+
if (!result) {
|
|
105
|
+
throw new Error('Failed to trigger cumulative computation');
|
|
106
|
+
}
|
|
107
|
+
this.creationProgress = `Jobs queued. Polling for completion...`;
|
|
108
|
+
this.cdr.markForCheck();
|
|
109
|
+
// Poll for completion
|
|
110
|
+
const success = await this.pollForCompletion();
|
|
111
|
+
if (success) {
|
|
112
|
+
this.periodSelected.emit({
|
|
113
|
+
periodBegin: this.currentPeriodBegin,
|
|
114
|
+
periodEnd: this.currentPeriodEnd,
|
|
115
|
+
windowInMinutes: this.currentWindowMinutes,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
this.errorMessage = 'Timeout waiting for cumulative computation';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
this.errorMessage = `Error: ${e.message || 'Unknown error'}`;
|
|
124
|
+
console.error('Error creating cumulative:', e);
|
|
125
|
+
}
|
|
126
|
+
this.creating = false;
|
|
127
|
+
this.cdr.markForCheck();
|
|
128
|
+
}
|
|
129
|
+
async pollForCompletion() {
|
|
130
|
+
const startTime = Date.now();
|
|
131
|
+
while (Date.now() - startTime < this.POLL_TIMEOUT_MS) {
|
|
132
|
+
try {
|
|
133
|
+
const progress = await this.profileService.getRainProgress(this.rainId);
|
|
134
|
+
if (progress === 0) {
|
|
135
|
+
// Queue is empty, check if cumulative exists (admin sees all cumulatives)
|
|
136
|
+
const response = await this.profileService.getCumulativePeriods(this.rainId, {
|
|
137
|
+
provider: this.provider,
|
|
138
|
+
windowInMinutes: this.currentWindowMinutes,
|
|
139
|
+
forced: this.isAdmin,
|
|
140
|
+
});
|
|
141
|
+
const found = response.periods.find((p) => p.windowInMinutes === this.currentWindowMinutes);
|
|
142
|
+
if (found) {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const elapsed = Math.round((Date.now() - startTime) / 1000);
|
|
147
|
+
this.creationProgress = `Computing... (${elapsed}s, queue: ${progress})`;
|
|
148
|
+
this.cdr.markForCheck();
|
|
149
|
+
await this.sleep(this.POLL_INTERVAL_MS);
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
console.warn('Poll error:', e);
|
|
153
|
+
await this.sleep(this.POLL_INTERVAL_MS);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
sleep(ms) {
|
|
159
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
160
|
+
}
|
|
161
|
+
cancel() {
|
|
162
|
+
this.cancelled.emit();
|
|
163
|
+
}
|
|
164
|
+
formatPeriod(period) {
|
|
165
|
+
const begin = new Date(period.periodBegin);
|
|
166
|
+
const end = new Date(period.periodEnd);
|
|
167
|
+
return `${begin.toLocaleString()} → ${end.toLocaleString()}`;
|
|
168
|
+
}
|
|
169
|
+
formatWindow(minutes) {
|
|
170
|
+
if (minutes < 60) {
|
|
171
|
+
return `${minutes} min`;
|
|
172
|
+
}
|
|
173
|
+
const hours = minutes / 60;
|
|
174
|
+
return hours === 1 ? '1 hour' : `${hours} hours`;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
CumulativeSelectorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CumulativeSelectorComponent, deps: [{ token: i1.ProfileService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
178
|
+
CumulativeSelectorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CumulativeSelectorComponent, selector: "cumulative-selector", inputs: { rainId: "rainId", currentPeriodBegin: "currentPeriodBegin", currentPeriodEnd: "currentPeriodEnd", provider: "provider", timeStepInMinutes: "timeStepInMinutes", isAdmin: "isAdmin" }, outputs: { periodSelected: "periodSelected", cancelled: "cancelled" }, ngImport: i0, template: "<div class=\"cumulative-selector-overlay\">\n <div class=\"cumulative-selector-modal\">\n <div class=\"modal-header\">\n <h2>Select Cumulative Period</h2>\n <ion-button fill=\"clear\" (click)=\"cancel()\">\n <ion-icon name=\"close\"></ion-icon>\n </ion-button>\n </div>\n\n <div class=\"modal-content\">\n <!-- Loading state -->\n <div *ngIf=\"loading\" class=\"loading-state\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n <p>Loading available periods...</p>\n </div>\n\n <!-- Error message -->\n <div *ngIf=\"errorMessage\" class=\"error-message\">\n <ion-icon name=\"warning-outline\"></ion-icon>\n <span>{{ errorMessage }}</span>\n </div>\n\n <!-- Available periods list -->\n <div *ngIf=\"!loading && availablePeriods.length > 0\" class=\"periods-section\">\n <h3>Available Cumulative Periods</h3>\n <ion-list>\n <ion-item *ngFor=\"let period of availablePeriods\"\n button\n (click)=\"selectPeriod(period)\"\n [disabled]=\"creating\">\n <ion-icon name=\"layers-outline\" slot=\"start\"></ion-icon>\n <ion-label>\n <h2>{{ formatWindow(period.windowInMinutes) }}</h2>\n <p>{{ formatPeriod(period) }}</p>\n <p class=\"count-info\">{{ period.count }} cumulative(s)</p>\n </ion-label>\n <ion-icon name=\"chevron-forward\" slot=\"end\"></ion-icon>\n </ion-item>\n </ion-list>\n </div>\n\n <!-- No periods available -->\n <div *ngIf=\"!loading && availablePeriods.length === 0\" class=\"no-periods\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>No cumulative periods available yet.</p>\n </div>\n\n <!-- Create new section (admin only) -->\n <div *ngIf=\"!loading && isAdmin\" class=\"create-section\">\n <h3>Create New Cumulative</h3>\n <div class=\"create-info\">\n <p>\n <strong>Period:</strong>\n {{ currentPeriodBegin?.toLocaleString() }} \u2192 {{ currentPeriodEnd?.toLocaleString() }}\n </p>\n <p>\n <strong>Window:</strong> {{ formatWindow(currentWindowMinutes) }}\n </p>\n <p *ngIf=\"baseCumulatives\" class=\"coverage-info\"\n [class.coverage-ok]=\"coveragePercent >= 100\"\n [class.coverage-warn]=\"coveragePercent > 0 && coveragePercent < 100\"\n [class.coverage-error]=\"coveragePercent === 0\">\n <ion-icon [name]=\"coveragePercent >= 100 ? 'checkmark-circle' : 'alert-circle'\"></ion-icon>\n Base data coverage: {{ coveragePercent }}%\n </p>\n <p *ngIf=\"!baseCumulatives\" class=\"coverage-error\">\n <ion-icon name=\"alert-circle\"></ion-icon>\n No base cumulatives available\n </p>\n </div>\n\n <!-- Creation progress -->\n <div *ngIf=\"creating\" class=\"creation-progress\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n <span>{{ creationProgress }}</span>\n </div>\n\n <ion-button [disabled]=\"!canCreateNew || creating\"\n expand=\"block\"\n (click)=\"createNewPeriod()\">\n <ion-icon name=\"add-circle-outline\" slot=\"start\"></ion-icon>\n Create {{ formatWindow(currentWindowMinutes) }} Cumulative\n </ion-button>\n\n <p *ngIf=\"!canCreateNew && !creating\" class=\"create-hint\">\n Create is disabled because base 5-min cumulatives don't fully cover the selected period.\n </p>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <ion-button fill=\"outline\" (click)=\"cancel()\" [disabled]=\"creating\">\n Cancel\n </ion-button>\n </div>\n </div>\n</div>\n", styles: [".cumulative-selector-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:flex;align-items:center;justify-content:center;z-index:1000}.cumulative-selector-modal{background:var(--ion-background-color, #fff);border-radius:12px;max-width:500px;width:90%;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 4px 20px #0000004d}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--ion-border-color, #ddd)}.modal-header h2{margin:0;font-size:1.25rem;font-weight:600}.modal-header ion-button{--padding-start: 8px;--padding-end: 8px}.modal-content{flex:1;overflow-y:auto;padding:16px 20px}.loading-state{display:flex;flex-direction:column;align-items:center;padding:40px 0}.loading-state ion-spinner{margin-bottom:16px}.loading-state p{color:var(--ion-color-medium)}.error-message{display:flex;align-items:center;gap:8px;padding:12px;background:var(--ion-color-danger-tint);color:var(--ion-color-danger);border-radius:8px;margin-bottom:16px}.error-message ion-icon{font-size:1.25rem}.periods-section{margin-bottom:24px}.periods-section h3{font-size:1rem;font-weight:600;margin-bottom:12px;color:var(--ion-color-dark)}.periods-section ion-list{border-radius:8px;overflow:hidden}.periods-section ion-item{--padding-start: 12px;--padding-end: 12px}.periods-section ion-item ion-label h2{font-weight:500}.periods-section ion-item ion-label p{font-size:.85rem;color:var(--ion-color-medium)}.periods-section ion-item ion-label .count-info{font-size:.75rem;color:var(--ion-color-primary)}.no-periods{display:flex;flex-direction:column;align-items:center;padding:24px;text-align:center;color:var(--ion-color-medium)}.no-periods ion-icon{font-size:2rem;margin-bottom:8px}.create-section{border-top:1px solid var(--ion-border-color, #ddd);padding-top:16px}.create-section h3{font-size:1rem;font-weight:600;margin-bottom:12px;color:var(--ion-color-dark)}.create-section .create-info{background:var(--ion-color-light);padding:12px;border-radius:8px;margin-bottom:16px}.create-section .create-info p{margin:4px 0;font-size:.9rem}.create-section .coverage-info{display:flex;align-items:center;gap:6px}.create-section .coverage-info ion-icon{font-size:1.1rem}.create-section .coverage-ok{color:var(--ion-color-success)}.create-section .coverage-warn{color:var(--ion-color-warning)}.create-section .coverage-error{color:var(--ion-color-danger)}.create-section .creation-progress{display:flex;align-items:center;gap:12px;padding:16px;background:var(--ion-color-primary-tint);border-radius:8px;margin-bottom:16px}.create-section .creation-progress ion-spinner{--color: var(--ion-color-primary)}.create-section .creation-progress span{color:var(--ion-color-primary);font-size:.9rem}.create-section .create-hint{font-size:.8rem;color:var(--ion-color-medium);text-align:center;margin-top:8px}.modal-footer{padding:16px 20px;border-top:1px solid var(--ion-border-color, #ddd);display:flex;justify-content:flex-end}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i3.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
179
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CumulativeSelectorComponent, decorators: [{
|
|
180
|
+
type: Component,
|
|
181
|
+
args: [{ selector: 'cumulative-selector', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cumulative-selector-overlay\">\n <div class=\"cumulative-selector-modal\">\n <div class=\"modal-header\">\n <h2>Select Cumulative Period</h2>\n <ion-button fill=\"clear\" (click)=\"cancel()\">\n <ion-icon name=\"close\"></ion-icon>\n </ion-button>\n </div>\n\n <div class=\"modal-content\">\n <!-- Loading state -->\n <div *ngIf=\"loading\" class=\"loading-state\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n <p>Loading available periods...</p>\n </div>\n\n <!-- Error message -->\n <div *ngIf=\"errorMessage\" class=\"error-message\">\n <ion-icon name=\"warning-outline\"></ion-icon>\n <span>{{ errorMessage }}</span>\n </div>\n\n <!-- Available periods list -->\n <div *ngIf=\"!loading && availablePeriods.length > 0\" class=\"periods-section\">\n <h3>Available Cumulative Periods</h3>\n <ion-list>\n <ion-item *ngFor=\"let period of availablePeriods\"\n button\n (click)=\"selectPeriod(period)\"\n [disabled]=\"creating\">\n <ion-icon name=\"layers-outline\" slot=\"start\"></ion-icon>\n <ion-label>\n <h2>{{ formatWindow(period.windowInMinutes) }}</h2>\n <p>{{ formatPeriod(period) }}</p>\n <p class=\"count-info\">{{ period.count }} cumulative(s)</p>\n </ion-label>\n <ion-icon name=\"chevron-forward\" slot=\"end\"></ion-icon>\n </ion-item>\n </ion-list>\n </div>\n\n <!-- No periods available -->\n <div *ngIf=\"!loading && availablePeriods.length === 0\" class=\"no-periods\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>No cumulative periods available yet.</p>\n </div>\n\n <!-- Create new section (admin only) -->\n <div *ngIf=\"!loading && isAdmin\" class=\"create-section\">\n <h3>Create New Cumulative</h3>\n <div class=\"create-info\">\n <p>\n <strong>Period:</strong>\n {{ currentPeriodBegin?.toLocaleString() }} \u2192 {{ currentPeriodEnd?.toLocaleString() }}\n </p>\n <p>\n <strong>Window:</strong> {{ formatWindow(currentWindowMinutes) }}\n </p>\n <p *ngIf=\"baseCumulatives\" class=\"coverage-info\"\n [class.coverage-ok]=\"coveragePercent >= 100\"\n [class.coverage-warn]=\"coveragePercent > 0 && coveragePercent < 100\"\n [class.coverage-error]=\"coveragePercent === 0\">\n <ion-icon [name]=\"coveragePercent >= 100 ? 'checkmark-circle' : 'alert-circle'\"></ion-icon>\n Base data coverage: {{ coveragePercent }}%\n </p>\n <p *ngIf=\"!baseCumulatives\" class=\"coverage-error\">\n <ion-icon name=\"alert-circle\"></ion-icon>\n No base cumulatives available\n </p>\n </div>\n\n <!-- Creation progress -->\n <div *ngIf=\"creating\" class=\"creation-progress\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n <span>{{ creationProgress }}</span>\n </div>\n\n <ion-button [disabled]=\"!canCreateNew || creating\"\n expand=\"block\"\n (click)=\"createNewPeriod()\">\n <ion-icon name=\"add-circle-outline\" slot=\"start\"></ion-icon>\n Create {{ formatWindow(currentWindowMinutes) }} Cumulative\n </ion-button>\n\n <p *ngIf=\"!canCreateNew && !creating\" class=\"create-hint\">\n Create is disabled because base 5-min cumulatives don't fully cover the selected period.\n </p>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <ion-button fill=\"outline\" (click)=\"cancel()\" [disabled]=\"creating\">\n Cancel\n </ion-button>\n </div>\n </div>\n</div>\n", styles: [".cumulative-selector-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:flex;align-items:center;justify-content:center;z-index:1000}.cumulative-selector-modal{background:var(--ion-background-color, #fff);border-radius:12px;max-width:500px;width:90%;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 4px 20px #0000004d}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--ion-border-color, #ddd)}.modal-header h2{margin:0;font-size:1.25rem;font-weight:600}.modal-header ion-button{--padding-start: 8px;--padding-end: 8px}.modal-content{flex:1;overflow-y:auto;padding:16px 20px}.loading-state{display:flex;flex-direction:column;align-items:center;padding:40px 0}.loading-state ion-spinner{margin-bottom:16px}.loading-state p{color:var(--ion-color-medium)}.error-message{display:flex;align-items:center;gap:8px;padding:12px;background:var(--ion-color-danger-tint);color:var(--ion-color-danger);border-radius:8px;margin-bottom:16px}.error-message ion-icon{font-size:1.25rem}.periods-section{margin-bottom:24px}.periods-section h3{font-size:1rem;font-weight:600;margin-bottom:12px;color:var(--ion-color-dark)}.periods-section ion-list{border-radius:8px;overflow:hidden}.periods-section ion-item{--padding-start: 12px;--padding-end: 12px}.periods-section ion-item ion-label h2{font-weight:500}.periods-section ion-item ion-label p{font-size:.85rem;color:var(--ion-color-medium)}.periods-section ion-item ion-label .count-info{font-size:.75rem;color:var(--ion-color-primary)}.no-periods{display:flex;flex-direction:column;align-items:center;padding:24px;text-align:center;color:var(--ion-color-medium)}.no-periods ion-icon{font-size:2rem;margin-bottom:8px}.create-section{border-top:1px solid var(--ion-border-color, #ddd);padding-top:16px}.create-section h3{font-size:1rem;font-weight:600;margin-bottom:12px;color:var(--ion-color-dark)}.create-section .create-info{background:var(--ion-color-light);padding:12px;border-radius:8px;margin-bottom:16px}.create-section .create-info p{margin:4px 0;font-size:.9rem}.create-section .coverage-info{display:flex;align-items:center;gap:6px}.create-section .coverage-info ion-icon{font-size:1.1rem}.create-section .coverage-ok{color:var(--ion-color-success)}.create-section .coverage-warn{color:var(--ion-color-warning)}.create-section .coverage-error{color:var(--ion-color-danger)}.create-section .creation-progress{display:flex;align-items:center;gap:12px;padding:16px;background:var(--ion-color-primary-tint);border-radius:8px;margin-bottom:16px}.create-section .creation-progress ion-spinner{--color: var(--ion-color-primary)}.create-section .creation-progress span{color:var(--ion-color-primary);font-size:.9rem}.create-section .create-hint{font-size:.8rem;color:var(--ion-color-medium);text-align:center;margin-top:8px}.modal-footer{padding:16px 20px;border-top:1px solid var(--ion-border-color, #ddd);display:flex;justify-content:flex-end}\n"] }]
|
|
182
|
+
}], ctorParameters: function () { return [{ type: i1.ProfileService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { rainId: [{
|
|
183
|
+
type: Input
|
|
184
|
+
}], currentPeriodBegin: [{
|
|
185
|
+
type: Input
|
|
186
|
+
}], currentPeriodEnd: [{
|
|
187
|
+
type: Input
|
|
188
|
+
}], provider: [{
|
|
189
|
+
type: Input
|
|
190
|
+
}], timeStepInMinutes: [{
|
|
191
|
+
type: Input
|
|
192
|
+
}], isAdmin: [{
|
|
193
|
+
type: Input
|
|
194
|
+
}], periodSelected: [{
|
|
195
|
+
type: Output
|
|
196
|
+
}], cancelled: [{
|
|
197
|
+
type: Output
|
|
198
|
+
}] } });
|
|
199
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VtdWxhdGl2ZS1zZWxlY3Rvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvY3VtdWxhdGl2ZS1zZWxlY3Rvci9jdW11bGF0aXZlLXNlbGVjdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3NoYXJlZC9jdW11bGF0aXZlLXNlbGVjdG9yL2N1bXVsYXRpdmUtc2VsZWN0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7Ozs7O0FBZ0J2QixNQUFNLE9BQU8sMkJBQTJCO0lBeUJwQyxZQUNZLGNBQThCLEVBQzlCLEdBQXNCO1FBRHRCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXRCekIsc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBQzlCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFFeEIsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUN6RCxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUUvQyxxQkFBZ0IsR0FBdUIsRUFBRSxDQUFDO1FBQzFDLG9CQUFlLEdBQXFCLElBQUksQ0FBQztRQUN6QyxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDdEIsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFFbEIsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFDcEIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIseUJBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBRVIsb0JBQWUsR0FBRyxNQUFNLENBQUMsQ0FBQyxjQUFjO1FBQ3hDLHFCQUFnQixHQUFHLElBQUksQ0FB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dGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1Byb2ZpbGVTZXJ2aWNlfSBmcm9tICcuLi9wcm9maWxlLnNlcnZpY2UnO1xuaW1wb3J0IHtDdW11bGF0aXZlUGVyaW9kfSBmcm9tICdyYWFpbi1tb2RlbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VtdWxhdGl2ZVNlbGVjdGlvbiB7XG4gICAgcGVyaW9kQmVnaW46IERhdGU7XG4gICAgcGVyaW9kRW5kOiBEYXRlO1xuICAgIHdpbmRvd0luTWludXRlczogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2N1bXVsYXRpdmUtc2VsZWN0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jdW11bGF0aXZlLXNlbGVjdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jdW11bGF0aXZlLXNlbGVjdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEN1bXVsYXRpdmVTZWxlY3RvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQElucHV0KCkgcmFpbklkOiBzdHJpbmc7XG4gICAgQElucHV0KCkgY3VycmVudFBlcmlvZEJlZ2luOiBEYXRlO1xuICAgIEBJbnB1dCgpIGN1cnJlbnRQZXJpb2RFbmQ6IERhdGU7XG4gICAgQElucHV0KCkgcHJvdmlkZXI6IHN0cmluZztcbiAgICBASW5wdXQoKSB0aW1lU3RlcEluTWludXRlczogbnVtYmVyID0gNTtcbiAgICBASW5wdXQoKSBpc0FkbWluOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBAT3V0cHV0KCkgcGVyaW9kU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEN1bXVsYXRpdmVTZWxlY3Rpb24+KCk7XG4gICAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIGF2YWlsYWJsZVBlcmlvZHM6IEN1bXVsYXRpdmVQZXJpb2RbXSA9IFtdO1xuICAgIGJhc2VDdW11bGF0aXZlczogQ3VtdWxhdGl2ZVBlcmlvZCA9IG51bGw7XG4gICAgbG9hZGluZyA9IHRydWU7XG4gICAgY3JlYXRpbmcgPSBmYWxzZTtcbiAgICBjcmVhdGlvblByb2dyZXNzID0gJyc7XG4gICAgZXJyb3JNZXNzYWdlID0gJyc7XG5cbiAgICBjb3ZlcmFnZVBlcmNlbnQgPSAwO1xuICAgIGNhbkNyZWF0ZU5ldyA9IGZhbHNlO1xuICAgIGN1cnJlbnRXaW5kb3dNaW51dGVzID0gMDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgUE9MTF9USU1FT1VUX01TID0gOTAwMDAwOyAvLyA5MDAgc2Vjb25kc1xuICAgIHByaXZhdGUgcmVhZG9ubHkgUE9MTF9JTlRFUlZBTF9NUyA9IDMwMDA7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBwcm9maWxlU2VydmljZTogUHJvZmlsZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICAgICkge31cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRXaW5kb3dNaW51dGVzID0gTWF0aC5yb3VuZChcbiAgICAgICAgICAgICh0aGlzLmN1cnJlbnRQZXJpb2RFbmQuZ2V0VGltZSgpIC0gdGhpcy5jdXJyZW50UGVyaW9kQmVnaW4uZ2V0VGltZSgpKSAvIDYwMDAwXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZEF2YWlsYWJsZVBlcmlvZHMoKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkQXZhaWxhYmxlUGVyaW9kcygpIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEZldGNoIGFsbCBjdW11bGF0aXZlIHBlcmlvZHMgKGFkbWluIHNlZXMgYWxsLCBub24tYWRtaW4gc2VlcyBvbmx5IGN1c3RvbWVyLWxhdW5jaGVkKVxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldEN1bXVsYXRpdmVQZXJpb2RzKHRoaXMucmFpbklkLCB7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXI6IHRoaXMucHJvdmlkZXIsXG4gICAgICAgICAgICAgICAgZm9yY2VkOiB0aGlzLmlzQWRtaW4sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gRmlsdGVyIGZvciBleGlzdGluZyBjdXN0b20gY3VtdWxhdGl2ZXMgKHdpbmRvdyA+IDApXG4gICAgICAgICAgICB0aGlzLmF2YWlsYWJsZVBlcmlvZHMgPSByZXNwb25zZS5wZXJpb2RzLmZpbHRlcigocCkgPT4gcC53aW5kb3dJbk1pbnV0ZXMgPiAwKTtcblxuICAgICAgICAgICAgLy8gR2V0IGJhc2UgY3VtdWxhdGl2ZXMgKHdpbmRvdyA9IDApIHRvIGNoZWNrIGNvdmVyYWdlXG4gICAgICAgICAgICB0aGlzLmJhc2VDdW11bGF0aXZlcyA9IHJlc3BvbnNlLnBlcmlvZHMuZmluZCgocCkgPT4gcC53aW5kb3dJbk1pbnV0ZXMgPT09IDApO1xuXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvdmVyYWdlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ0ZhaWxlZCB0byBsb2FkIGN1bXVsYXRpdmUgcGVyaW9kcyc7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGN1bXVsYXRpdmUgcGVyaW9kczonLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVDb3ZlcmFnZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJhc2VDdW11bGF0aXZlcykge1xuICAgICAgICAgICAgdGhpcy5jb3ZlcmFnZVBlcmNlbnQgPSAwO1xuICAgICAgICAgICAgdGhpcy5jYW5DcmVhdGVOZXcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2VCZWdpbiA9IG5ldyBEYXRlKHRoaXMuYmFzZUN1bXVsYXRpdmVzLnBlcmlvZEJlZ2luKTtcbiAgICAgICAgY29uc3QgYmFzZUVuZCA9IG5ldyBEYXRlKHRoaXMuYmFzZUN1bXVsYXRpdmVzLnBlcmlvZEVuZCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgY3VycmVudCBwZXJpb2QgaXMgd2l0aGluIGJhc2UgY292ZXJhZ2VcbiAgICAgICAgY29uc3QgY3VycmVudEluUmFuZ2UgPVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGVyaW9kQmVnaW4gPj0gYmFzZUJlZ2luICYmIHRoaXMuY3VycmVudFBlcmlvZEVuZCA8PSBiYXNlRW5kO1xuXG4gICAgICAgIGlmICghY3VycmVudEluUmFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuY292ZXJhZ2VQZXJjZW50ID0gMDtcbiAgICAgICAgICAgIHRoaXMuY2FuQ3JlYXRlTmV3ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxjdWxhdGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGJhc2UgY3VtdWxhdGl2ZXMgbmVlZGVkXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkQ291bnQgPSBNYXRoLmNlaWwodGhpcy5jdXJyZW50V2luZG93TWludXRlcyAvIHRoaXMudGltZVN0ZXBJbk1pbnV0ZXMpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGVub3VnaCBiYXNlIGN1bXVsYXRpdmVzIGV4aXN0XG4gICAgICAgIC8vIFdlIGFzc3VtZSBjb3ZlcmFnZSBpcyBjb21wbGV0ZSBpZiBjb3VudCA+PSBleHBlY3RlZCAoc2ltcGxpZmllZCBjaGVjaylcbiAgICAgICAgaWYgKHRoaXMuYmFzZUN1bXVsYXRpdmVzLmNvdW50ID49IGV4cGVjdGVkQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMuY292ZXJhZ2VQZXJjZW50ID0gMTAwO1xuICAgICAgICAgICAgdGhpcy5jYW5DcmVhdGVOZXcgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb3ZlcmFnZVBlcmNlbnQgPSBNYXRoLnJvdW5kKCh0aGlzLmJhc2VDdW11bGF0aXZlcy5jb3VudCAvIGV4cGVjdGVkQ291bnQpICogMTAwKTtcbiAgICAgICAgICAgIHRoaXMuY2FuQ3JlYXRlTmV3ID0gdGhpcy5jb3ZlcmFnZVBlcmNlbnQgPj0gMTAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0UGVyaW9kKHBlcmlvZDogQ3VtdWxhdGl2ZVBlcmlvZCkge1xuICAgICAgICB0aGlzLnBlcmlvZFNlbGVjdGVkLmVtaXQoe1xuICAgICAgICAgICAgcGVyaW9kQmVnaW46IG5ldyBEYXRlKHBlcmlvZC5wZXJpb2RCZWdpbiksXG4gICAgICAgICAgICBwZXJpb2RFbmQ6IG5ldyBEYXRlKHBlcmlvZC5wZXJpb2RFbmQpLFxuICAgICAgICAgICAgd2luZG93SW5NaW51dGVzOiBwZXJpb2Qud2luZG93SW5NaW51dGVzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBjcmVhdGVOZXdQZXJpb2QoKSB7XG4gICAgICAgIGlmICghdGhpcy5jYW5DcmVhdGVOZXcgfHwgdGhpcy5jcmVhdGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcmVhdGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuY3JlYXRpb25Qcm9ncmVzcyA9ICdTdGFydGluZyBjdW11bGF0aXZlIGNvbXB1dGF0aW9uLi4uJztcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFRyaWdnZXIgY3VtdWxhdGl2ZSBjcmVhdGlvblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5jcmVhdGVDdW11bGF0aXZlUGVyaW9kKHRoaXMucmFpbklkLCB7XG4gICAgICAgICAgICAgICAgcGVyaW9kQmVnaW46IHRoaXMuY3VycmVudFBlcmlvZEJlZ2luLFxuICAgICAgICAgICAgICAgIHBlcmlvZEVuZDogdGhpcy5jdXJyZW50UGVyaW9kRW5kLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyOiB0aGlzLnByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIHRpbWVTdGVwSW5NaW51dGVzOiB0aGlzLnRpbWVTdGVwSW5NaW51dGVzLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gdHJpZ2dlciBjdW11bGF0aXZlIGNvbXB1dGF0aW9uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY3JlYXRpb25Qcm9ncmVzcyA9IGBKb2JzIHF1ZXVlZC4gUG9sbGluZyBmb3IgY29tcGxldGlvbi4uLmA7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICAgICAgLy8gUG9sbCBmb3IgY29tcGxldGlvblxuICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IHRoaXMucG9sbEZvckNvbXBsZXRpb24oKTtcblxuICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmlvZFNlbGVjdGVkLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICBwZXJpb2RCZWdpbjogdGhpcy5jdXJyZW50UGVyaW9kQmVnaW4sXG4gICAgICAgICAgICAgICAgICAgIHBlcmlvZEVuZDogdGhpcy5jdXJyZW50UGVyaW9kRW5kLFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3dJbk1pbnV0ZXM6IHRoaXMuY3VycmVudFdpbmRvd01pbnV0ZXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ1RpbWVvdXQgd2FpdGluZyBmb3IgY3VtdWxhdGl2ZSBjb21wdXRhdGlvbic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gYEVycm9yOiAke2UubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YDtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNyZWF0aW5nIGN1bXVsYXRpdmU6JywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNyZWF0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcG9sbEZvckNvbXBsZXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPCB0aGlzLlBPTExfVElNRU9VVF9NUykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UmFpblByb2dyZXNzKHRoaXMucmFpbklkKTtcblxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBRdWV1ZSBpcyBlbXB0eSwgY2hlY2sgaWYgY3VtdWxhdGl2ZSBleGlzdHMgKGFkbWluIHNlZXMgYWxsIGN1bXVsYXRpdmVzKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0Q3VtdWxhdGl2ZVBlcmlvZHModGhpcy5yYWluSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyOiB0aGlzLnByb3ZpZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93SW5NaW51dGVzOiB0aGlzLmN1cnJlbnRXaW5kb3dNaW51dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VkOiB0aGlzLmlzQWRtaW4sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gcmVzcG9uc2UucGVyaW9kcy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHApID0+IHAud2luZG93SW5NaW51dGVzID09PSB0aGlzLmN1cnJlbnRXaW5kb3dNaW51dGVzXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDApO1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRpb25Qcm9ncmVzcyA9IGBDb21wdXRpbmcuLi4gKCR7ZWxhcHNlZH1zLCBxdWV1ZTogJHtwcm9ncmVzc30pYDtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2xlZXAodGhpcy5QT0xMX0lOVEVSVkFMX01TKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1BvbGwgZXJyb3I6JywgZSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zbGVlcCh0aGlzLlBPTExfSU5URVJWQUxfTVMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgICB9XG5cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgICB9XG5cbiAgICBmb3JtYXRQZXJpb2QocGVyaW9kOiBDdW11bGF0aXZlUGVyaW9kKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYmVnaW4gPSBuZXcgRGF0ZShwZXJpb2QucGVyaW9kQmVnaW4pO1xuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShwZXJpb2QucGVyaW9kRW5kKTtcbiAgICAgICAgcmV0dXJuIGAke2JlZ2luLnRvTG9jYWxlU3RyaW5nKCl9IOKGkiAke2VuZC50b0xvY2FsZVN0cmluZygpfWA7XG4gICAgfVxuXG4gICAgZm9ybWF0V2luZG93KG1pbnV0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGlmIChtaW51dGVzIDwgNjApIHtcbiAgICAgICAgICAgIHJldHVybiBgJHttaW51dGVzfSBtaW5gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhvdXJzID0gbWludXRlcyAvIDYwO1xuICAgICAgICByZXR1cm4gaG91cnMgPT09IDEgPyAnMSBob3VyJyA6IGAke2hvdXJzfSBob3Vyc2A7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImN1bXVsYXRpdmUtc2VsZWN0b3Itb3ZlcmxheVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjdW11bGF0aXZlLXNlbGVjdG9yLW1vZGFsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxoMj5TZWxlY3QgQ3VtdWxhdGl2ZSBQZXJpb2Q8L2gyPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjbG9zZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICA8IS0tIExvYWRpbmcgc3RhdGUgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwibG9hZGluZy1zdGF0ZVwiPlxuICAgICAgICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgICAgICAgIDxwPkxvYWRpbmcgYXZhaWxhYmxlIHBlcmlvZHMuLi48L3A+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBFcnJvciBtZXNzYWdlIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImVycm9yTWVzc2FnZVwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwid2FybmluZy1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBlcnJvck1lc3NhZ2UgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBBdmFpbGFibGUgcGVyaW9kcyBsaXN0IC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nICYmIGF2YWlsYWJsZVBlcmlvZHMubGVuZ3RoID4gMFwiIGNsYXNzPVwicGVyaW9kcy1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGgzPkF2YWlsYWJsZSBDdW11bGF0aXZlIFBlcmlvZHM8L2gzPlxuICAgICAgICAgICAgICAgIDxpb24tbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1pdGVtICpuZ0Zvcj1cImxldCBwZXJpb2Qgb2YgYXZhaWxhYmxlUGVyaW9kc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQZXJpb2QocGVyaW9kKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwibGF5ZXJzLW91dGxpbmVcIiBzbG90PVwic3RhcnRcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3sgZm9ybWF0V2luZG93KHBlcmlvZC53aW5kb3dJbk1pbnV0ZXMpIH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD57eyBmb3JtYXRQZXJpb2QocGVyaW9kKSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNvdW50LWluZm9cIj57eyBwZXJpb2QuY291bnQgfX0gY3VtdWxhdGl2ZShzKTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGV2cm9uLWZvcndhcmRcIiBzbG90PVwiZW5kXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICAgICAgICA8L2lvbi1saXN0PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gTm8gcGVyaW9kcyBhdmFpbGFibGUgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRpbmcgJiYgYXZhaWxhYmxlUGVyaW9kcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cIm5vLXBlcmlvZHNcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImluZm9ybWF0aW9uLWNpcmNsZS1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICA8cD5ObyBjdW11bGF0aXZlIHBlcmlvZHMgYXZhaWxhYmxlIHlldC48L3A+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBDcmVhdGUgbmV3IHNlY3Rpb24gKGFkbWluIG9ubHkpIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nICYmIGlzQWRtaW5cIiBjbGFzcz1cImNyZWF0ZS1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGgzPkNyZWF0ZSBOZXcgQ3VtdWxhdGl2ZTwvaDM+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNyZWF0ZS1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5QZXJpb2Q6PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW50UGVyaW9kQmVnaW4/LnRvTG9jYWxlU3RyaW5nKCkgfX0g4oaSIHt7IGN1cnJlbnRQZXJpb2RFbmQ/LnRvTG9jYWxlU3RyaW5nKCkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+V2luZG93Ojwvc3Ryb25nPiB7eyBmb3JtYXRXaW5kb3coY3VycmVudFdpbmRvd01pbnV0ZXMpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJiYXNlQ3VtdWxhdGl2ZXNcIiBjbGFzcz1cImNvdmVyYWdlLWluZm9cIlxuICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY292ZXJhZ2Utb2tdPVwiY292ZXJhZ2VQZXJjZW50ID49IDEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jb3ZlcmFnZS13YXJuXT1cImNvdmVyYWdlUGVyY2VudCA+IDAgJiYgY292ZXJhZ2VQZXJjZW50IDwgMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmNvdmVyYWdlLWVycm9yXT1cImNvdmVyYWdlUGVyY2VudCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIFtuYW1lXT1cImNvdmVyYWdlUGVyY2VudCA+PSAxMDAgPyAnY2hlY2ttYXJrLWNpcmNsZScgOiAnYWxlcnQtY2lyY2xlJ1wiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICBCYXNlIGRhdGEgY292ZXJhZ2U6IHt7IGNvdmVyYWdlUGVyY2VudCB9fSVcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIiFiYXNlQ3VtdWxhdGl2ZXNcIiBjbGFzcz1cImNvdmVyYWdlLWVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFsZXJ0LWNpcmNsZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICBObyBiYXNlIGN1bXVsYXRpdmVzIGF2YWlsYWJsZVxuICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIENyZWF0aW9uIHByb2dyZXNzIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjcmVhdGluZ1wiIGNsYXNzPVwiY3JlYXRpb24tcHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNyZWF0aW9uUHJvZ3Jlc3MgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBbZGlzYWJsZWRdPVwiIWNhbkNyZWF0ZU5ldyB8fCBjcmVhdGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kPVwiYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjcmVhdGVOZXdQZXJpb2QoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFkZC1jaXJjbGUtb3V0bGluZVwiIHNsb3Q9XCJzdGFydFwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgIENyZWF0ZSB7eyBmb3JtYXRXaW5kb3coY3VycmVudFdpbmRvd01pbnV0ZXMpIH19IEN1bXVsYXRpdmVcbiAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIiFjYW5DcmVhdGVOZXcgJiYgIWNyZWF0aW5nXCIgY2xhc3M9XCJjcmVhdGUtaGludFwiPlxuICAgICAgICAgICAgICAgICAgICBDcmVhdGUgaXMgZGlzYWJsZWQgYmVjYXVzZSBiYXNlIDUtbWluIGN1bXVsYXRpdmVzIGRvbid0IGZ1bGx5IGNvdmVyIHRoZSBzZWxlY3RlZCBwZXJpb2QuXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJvdXRsaW5lXCIgKGNsaWNrKT1cImNhbmNlbCgpXCIgW2Rpc2FibGVkXT1cImNyZWF0aW5nXCI+XG4gICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
package/esm2020/index.mjs
CHANGED
|
@@ -7,6 +7,7 @@ export * from './raain-speed/raain-speed.component';
|
|
|
7
7
|
export * from './raain-compare-stack/raain-compare-stack.component';
|
|
8
8
|
export * from './raain-globe/raain-globe.component';
|
|
9
9
|
export * from './raain-details/raain-details.component';
|
|
10
|
+
export * from './cumulative-selector/cumulative-selector.component';
|
|
10
11
|
export * from './tools';
|
|
11
12
|
export * from './cache.service';
|
|
12
13
|
export * from './fidj-storage.model';
|
|
@@ -19,4 +20,4 @@ export * from './storage.service';
|
|
|
19
20
|
export * from './xytype';
|
|
20
21
|
export * from './profile-icon.directive';
|
|
21
22
|
export * from './pipes.module';
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9zaGFyZWQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMscURBQXFELENBQUM7QUFDcEUsY0FBYywrQ0FBK0MsQ0FBQztBQUM5RCxjQUFjLG1EQUFtRCxDQUFDO0FBQ2xFLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyxxREFBcUQsQ0FBQztBQUNwRSxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYyxxREFBcUQsQ0FBQztBQUVwRSxjQUFjLFNBQVMsQ0FBQztBQUV4QixjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcmFhaW4tbWFwL3JhYWluLW1hcC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9yYWFpbi1jb21wYXJlL3JhYWluLWNvbXBhcmUuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vcmFhaW4tY29uZmlndXJhdGlvbi9yYWFpbi1jb25maWd1cmF0aW9uLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3JhYWluLWRhdGUtZm9jdXMvcmFhaW4tZGF0ZS1mb2N1cy5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9yYWFpbi1kYXRlLWR5bmFtaWMvcmFhaW4tZGF0ZS1keW5hbWljLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3JhYWluLXNwZWVkL3JhYWluLXNwZWVkLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3JhYWluLWNvbXBhcmUtc3RhY2svcmFhaW4tY29tcGFyZS1zdGFjay5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9yYWFpbi1nbG9iZS9yYWFpbi1nbG9iZS5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9yYWFpbi1kZXRhaWxzL3JhYWluLWRldGFpbHMuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vY3VtdWxhdGl2ZS1zZWxlY3Rvci9jdW11bGF0aXZlLXNlbGVjdG9yLmNvbXBvbmVudCc7XG5cbmV4cG9ydCAqIGZyb20gJy4vdG9vbHMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NhY2hlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9maWRqLXN0b3JhZ2UubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9wcm9maWxlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9yYWRhci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2hhcmVkLmNvbnN0JztcbmV4cG9ydCAqIGZyb20gJy4vc2hhcmVkLnBpcGUnO1xuZXhwb3J0ICogZnJvbSAnLi9zaGFyZWQubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4veHl0eXBlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvZmlsZS1pY29uLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3BpcGVzLm1vZHVsZSc7XG4iXX0=
|