@cqa-lib/cqa-ui 1.1.496 → 1.1.497
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/esm2020/lib/test-case-details/api-mocking-card/api-mocking-card.component.mjs +129 -0
- package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +66 -5
- package/esm2020/lib/test-case-details/test-case-details.component.mjs +58 -4
- package/esm2020/lib/ui-kit.module.mjs +6 -1
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +247 -5
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +247 -5
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/test-case-details/api-mocking-card/api-mocking-card.component.d.ts +78 -0
- package/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.d.ts +36 -1
- package/lib/test-case-details/test-case-details.component.d.ts +25 -1
- package/lib/ui-kit.module.d.ts +40 -39
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/styles.css +1 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../../custom-toggle/custom-toggle.component";
|
|
4
|
+
import * as i2 from "@angular/common";
|
|
5
|
+
/**
|
|
6
|
+
* Dual-mode card summarising the API mocking configuration of a test case.
|
|
7
|
+
*
|
|
8
|
+
* The card surfaces **one boolean choice** — `restoreMock` — as two mutually-exclusive rows
|
|
9
|
+
* labelled "Capture API responses" and "Renew API responses":
|
|
10
|
+
*
|
|
11
|
+
* restoreMock === true → Renew = ON, Capture = OFF
|
|
12
|
+
* restoreMock === false → Renew = OFF, Capture = ON
|
|
13
|
+
*
|
|
14
|
+
* In read-only mode both rows show a value text ("On"/"Off") derived from `restoreMock`.
|
|
15
|
+
* In edit mode both rows render a toggle; interacting with either one flips `restoreMock`
|
|
16
|
+
* and the card emits `restoreMockChange` so the parent can persist the new value.
|
|
17
|
+
*/
|
|
18
|
+
export class ApiMockingCardComponent {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.title = 'API Mocking';
|
|
21
|
+
this.statusLabel = 'Not configured';
|
|
22
|
+
this.captureLabel = 'Capture API responses';
|
|
23
|
+
this.renewLabel = 'Renew API responses';
|
|
24
|
+
/**
|
|
25
|
+
* Single source of truth for the card's dual-toggle state.
|
|
26
|
+
* Defaults to `false` → Capture is ON, Renew is OFF.
|
|
27
|
+
*/
|
|
28
|
+
this.restoreMock = false;
|
|
29
|
+
this.mockedApisCount = 0;
|
|
30
|
+
this.totalApisCount = 0;
|
|
31
|
+
this.progressPercent = 0;
|
|
32
|
+
this.configureButtonLabel = 'Configure';
|
|
33
|
+
this.editing = false;
|
|
34
|
+
/**
|
|
35
|
+
* Controls whether the "Mocked X of Y / progress bar / percent" block is shown.
|
|
36
|
+
* Hidden when the test case has no captured mock summary yet (and always hidden in
|
|
37
|
+
* edit mode regardless of this flag).
|
|
38
|
+
*/
|
|
39
|
+
this.showProgress = false;
|
|
40
|
+
this.configure = new EventEmitter();
|
|
41
|
+
/**
|
|
42
|
+
* Emitted whenever the effective `restoreMock` value changes (either row's toggle was
|
|
43
|
+
* interacted with in edit mode). Parent components should persist this value — e.g. under
|
|
44
|
+
* `testCase.mockApiSettings.restoreMock`.
|
|
45
|
+
*/
|
|
46
|
+
this.restoreMockChange = new EventEmitter();
|
|
47
|
+
}
|
|
48
|
+
// Derived per-row state (template binds these directly so the two rows stay in lock-step).
|
|
49
|
+
get renewEnabled() { return this.restoreMock; }
|
|
50
|
+
get captureEnabled() { return !this.restoreMock; }
|
|
51
|
+
get renewValueText() { return this.restoreMock ? 'On' : 'Off'; }
|
|
52
|
+
get captureValueText() { return this.restoreMock ? 'Off' : 'On'; }
|
|
53
|
+
get computedSummaryText() {
|
|
54
|
+
if (this.summaryText)
|
|
55
|
+
return this.summaryText;
|
|
56
|
+
return `${this.mockedApisCount} of ${this.totalApisCount} APIs set to mock`;
|
|
57
|
+
}
|
|
58
|
+
get computedPercentText() {
|
|
59
|
+
if (this.percentText)
|
|
60
|
+
return this.percentText;
|
|
61
|
+
return `${this.progressPercent}% of calls will use mock responses`;
|
|
62
|
+
}
|
|
63
|
+
get progressWidth() {
|
|
64
|
+
const clamped = Math.max(0, Math.min(100, Number(this.progressPercent) || 0));
|
|
65
|
+
return `${clamped}%`;
|
|
66
|
+
}
|
|
67
|
+
onConfigureClick() {
|
|
68
|
+
this.configure.emit();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* User interacted with the "Renew API responses" toggle in edit mode.
|
|
72
|
+
* Renew ON → restoreMock = true (Capture OFF).
|
|
73
|
+
* Renew OFF → restoreMock = false (Capture ON — mutual exclusivity).
|
|
74
|
+
*/
|
|
75
|
+
onRenewToggle(value) {
|
|
76
|
+
this.setRestoreMock(value);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* User interacted with the "Capture API responses" toggle in edit mode.
|
|
80
|
+
* Capture ON → restoreMock = false (Renew OFF).
|
|
81
|
+
* Capture OFF → restoreMock = true (Renew ON — mutual exclusivity).
|
|
82
|
+
*/
|
|
83
|
+
onCaptureToggle(value) {
|
|
84
|
+
this.setRestoreMock(!value);
|
|
85
|
+
}
|
|
86
|
+
setRestoreMock(next) {
|
|
87
|
+
if (this.restoreMock === next)
|
|
88
|
+
return;
|
|
89
|
+
this.restoreMock = next;
|
|
90
|
+
this.restoreMockChange.emit(next);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
ApiMockingCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiMockingCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
94
|
+
ApiMockingCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ApiMockingCardComponent, selector: "cqa-api-mocking-card", inputs: { title: "title", statusLabel: "statusLabel", captureLabel: "captureLabel", renewLabel: "renewLabel", restoreMock: "restoreMock", mockedApisCount: "mockedApisCount", totalApisCount: "totalApisCount", progressPercent: "progressPercent", summaryText: "summaryText", percentText: "percentText", configureButtonLabel: "configureButtonLabel", editing: "editing", showProgress: "showProgress" }, outputs: { configure: "configure", restoreMockChange: "restoreMockChange" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-amc-card\">\n <div class=\"cqa-amc-header\">\n <span class=\"cqa-amc-title\">{{ title }}</span>\n <span class=\"cqa-amc-status\" *ngIf=\"statusLabel\">{{ statusLabel }}</span>\n </div>\n\n <!-- Read-only rows -->\n <ng-container *ngIf=\"!editing\">\n <div class=\"cqa-amc-row\">\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n <span class=\"cqa-amc-value\">{{ captureValueText }}</span>\n </div>\n <div class=\"cqa-amc-row\">\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n <span class=\"cqa-amc-value\">{{ renewValueText }}</span>\n </div>\n </ng-container>\n\n <!-- Edit rows: toggles -->\n <ng-container *ngIf=\"editing\">\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n <cqa-custom-toggle\n [checked]=\"captureEnabled\"\n [ariaLabel]=\"captureLabel\"\n (checkedChange)=\"onCaptureToggle($event)\">\n </cqa-custom-toggle>\n </div>\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n <cqa-custom-toggle\n [checked]=\"renewEnabled\"\n [ariaLabel]=\"renewLabel\"\n (checkedChange)=\"onRenewToggle($event)\">\n </cqa-custom-toggle>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"showProgress && !editing\">\n <p class=\"cqa-amc-summary\">{{ computedSummaryText }}</p>\n <div class=\"cqa-amc-progress-track\">\n <div class=\"cqa-amc-progress-fill\" [style.width]=\"progressWidth\"></div>\n </div>\n <p class=\"cqa-amc-percent\">{{ computedPercentText }}</p>\n </ng-container>\n\n <button\n *ngIf=\"!editing\"\n type=\"button\"\n class=\"cqa-amc-configure-btn\"\n (click)=\"onConfigureClick()\">\n {{ configureButtonLabel }}\n </button>\n</div>\n", components: [{ type: i1.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
95
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiMockingCardComponent, decorators: [{
|
|
96
|
+
type: Component,
|
|
97
|
+
args: [{ selector: 'cqa-api-mocking-card', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-amc-card\">\n <div class=\"cqa-amc-header\">\n <span class=\"cqa-amc-title\">{{ title }}</span>\n <span class=\"cqa-amc-status\" *ngIf=\"statusLabel\">{{ statusLabel }}</span>\n </div>\n\n <!-- Read-only rows -->\n <ng-container *ngIf=\"!editing\">\n <div class=\"cqa-amc-row\">\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n <span class=\"cqa-amc-value\">{{ captureValueText }}</span>\n </div>\n <div class=\"cqa-amc-row\">\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n <span class=\"cqa-amc-value\">{{ renewValueText }}</span>\n </div>\n </ng-container>\n\n <!-- Edit rows: toggles -->\n <ng-container *ngIf=\"editing\">\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n <cqa-custom-toggle\n [checked]=\"captureEnabled\"\n [ariaLabel]=\"captureLabel\"\n (checkedChange)=\"onCaptureToggle($event)\">\n </cqa-custom-toggle>\n </div>\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n <cqa-custom-toggle\n [checked]=\"renewEnabled\"\n [ariaLabel]=\"renewLabel\"\n (checkedChange)=\"onRenewToggle($event)\">\n </cqa-custom-toggle>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"showProgress && !editing\">\n <p class=\"cqa-amc-summary\">{{ computedSummaryText }}</p>\n <div class=\"cqa-amc-progress-track\">\n <div class=\"cqa-amc-progress-fill\" [style.width]=\"progressWidth\"></div>\n </div>\n <p class=\"cqa-amc-percent\">{{ computedPercentText }}</p>\n </ng-container>\n\n <button\n *ngIf=\"!editing\"\n type=\"button\"\n class=\"cqa-amc-configure-btn\"\n (click)=\"onConfigureClick()\">\n {{ configureButtonLabel }}\n </button>\n</div>\n", styles: [] }]
|
|
98
|
+
}], propDecorators: { title: [{
|
|
99
|
+
type: Input
|
|
100
|
+
}], statusLabel: [{
|
|
101
|
+
type: Input
|
|
102
|
+
}], captureLabel: [{
|
|
103
|
+
type: Input
|
|
104
|
+
}], renewLabel: [{
|
|
105
|
+
type: Input
|
|
106
|
+
}], restoreMock: [{
|
|
107
|
+
type: Input
|
|
108
|
+
}], mockedApisCount: [{
|
|
109
|
+
type: Input
|
|
110
|
+
}], totalApisCount: [{
|
|
111
|
+
type: Input
|
|
112
|
+
}], progressPercent: [{
|
|
113
|
+
type: Input
|
|
114
|
+
}], summaryText: [{
|
|
115
|
+
type: Input
|
|
116
|
+
}], percentText: [{
|
|
117
|
+
type: Input
|
|
118
|
+
}], configureButtonLabel: [{
|
|
119
|
+
type: Input
|
|
120
|
+
}], editing: [{
|
|
121
|
+
type: Input
|
|
122
|
+
}], showProgress: [{
|
|
123
|
+
type: Input
|
|
124
|
+
}], configure: [{
|
|
125
|
+
type: Output
|
|
126
|
+
}], restoreMockChange: [{
|
|
127
|
+
type: Output
|
|
128
|
+
}] } });
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1tb2NraW5nLWNhcmQvYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1tb2NraW5nLWNhcmQvYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBWWhHOzs7Ozs7Ozs7Ozs7R0FZRztBQVVILE1BQU0sT0FBTyx1QkFBdUI7SUFUcEM7UUFVVyxVQUFLLEdBQVcsYUFBYSxDQUFDO1FBQzlCLGdCQUFXLEdBQVcsZ0JBQWdCLENBQUM7UUFFdkMsaUJBQVksR0FBVyx1QkFBdUIsQ0FBQztRQUMvQyxlQUFVLEdBQVcscUJBQXFCLENBQUM7UUFFcEQ7OztXQUdHO1FBQ00sZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFN0Isb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFDNUIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFDM0Isb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFLNUIseUJBQW9CLEdBQVcsV0FBVyxDQUFDO1FBQzNDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFFbEM7Ozs7V0FJRztRQUNNLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRTdCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQy9DOzs7O1dBSUc7UUFDTyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0tBa0QzRDtJQWhEQywyRkFBMkY7SUFDM0YsSUFBSSxZQUFZLEtBQWMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN4RCxJQUFJLGNBQWMsS0FBYyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDM0QsSUFBSSxjQUFjLEtBQWEsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEUsSUFBSSxnQkFBZ0IsS0FBYSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUxRSxJQUFJLG1CQUFtQjtRQUNyQixJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzlDLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxPQUFPLElBQUksQ0FBQyxjQUFjLG1CQUFtQixDQUFDO0lBQzlFLENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzlDLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxvQ0FBb0MsQ0FBQztJQUNyRSxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLE9BQU8sR0FBRyxPQUFPLEdBQUcsQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxLQUFjO1FBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxlQUFlLENBQUMsS0FBYztRQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxJQUFhO1FBQ2xDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJO1lBQUUsT0FBTztRQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7O29IQXJGVSx1QkFBdUI7d0dBQXZCLHVCQUF1Qixna0JDbENwQyw4MERBc0RBOzJGRHBCYSx1QkFBdUI7a0JBVG5DLFNBQVM7K0JBQ0Usc0JBQXNCLFFBSzFCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxtQkFDYix1QkFBdUIsQ0FBQyxNQUFNOzhCQUd0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFPRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVJLFNBQVM7c0JBQWxCLE1BQU07Z0JBTUcsaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogTGVnYWN5IHRvZ2dsZS1jaGFuZ2UgcGF5bG9hZCBrZXB0IGZvciBiYWNrLWNvbXBhdCB3aXRoIGNvbnN1bWVycyB0aGF0IGhhdmVuJ3QgbWlncmF0ZWRcbiAqIHRvIGByZXN0b3JlTW9ja0NoYW5nZWAgeWV0LiBga2V5YCBpZGVudGlmaWVzIHdoaWNoIHJvdyB3YXMgdG9nZ2xlZDsgYHZhbHVlYCBpcyB0aGUgbmV3XG4gKiBjaGVja2VkIHN0YXRlIG9mIHRoYXQgcm93LiBOZXcgY29kZSBzaG91bGQgbGlzdGVuIHRvIGByZXN0b3JlTW9ja0NoYW5nZWAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlNb2NraW5nQ2FyZFRvZ2dsZUNoYW5nZSB7XG4gIGtleTogJ2NhcHR1cmVBcGlSZXNwb25zZXMnIHwgJ3JlbmV3QXBpUmVzcG9uc2VzJztcbiAgdmFsdWU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRHVhbC1tb2RlIGNhcmQgc3VtbWFyaXNpbmcgdGhlIEFQSSBtb2NraW5nIGNvbmZpZ3VyYXRpb24gb2YgYSB0ZXN0IGNhc2UuXG4gKlxuICogVGhlIGNhcmQgc3VyZmFjZXMgKipvbmUgYm9vbGVhbiBjaG9pY2UqKiDigJQgYHJlc3RvcmVNb2NrYCDigJQgYXMgdHdvIG11dHVhbGx5LWV4Y2x1c2l2ZSByb3dzXG4gKiBsYWJlbGxlZCBcIkNhcHR1cmUgQVBJIHJlc3BvbnNlc1wiIGFuZCBcIlJlbmV3IEFQSSByZXNwb25zZXNcIjpcbiAqXG4gKiAgIHJlc3RvcmVNb2NrID09PSB0cnVlICAg4oaSICAgUmVuZXcgPSBPTiwgIENhcHR1cmUgPSBPRkZcbiAqICAgcmVzdG9yZU1vY2sgPT09IGZhbHNlICDihpIgICBSZW5ldyA9IE9GRiwgQ2FwdHVyZSA9IE9OXG4gKlxuICogSW4gcmVhZC1vbmx5IG1vZGUgYm90aCByb3dzIHNob3cgYSB2YWx1ZSB0ZXh0IChcIk9uXCIvXCJPZmZcIikgZGVyaXZlZCBmcm9tIGByZXN0b3JlTW9ja2AuXG4gKiBJbiBlZGl0IG1vZGUgYm90aCByb3dzIHJlbmRlciBhIHRvZ2dsZTsgaW50ZXJhY3Rpbmcgd2l0aCBlaXRoZXIgb25lIGZsaXBzIGByZXN0b3JlTW9ja2BcbiAqIGFuZCB0aGUgY2FyZCBlbWl0cyBgcmVzdG9yZU1vY2tDaGFuZ2VgIHNvIHRoZSBwYXJlbnQgY2FuIHBlcnNpc3QgdGhlIG5ldyB2YWx1ZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWFwaS1tb2NraW5nLWNhcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIC8vIFN0eWxlcyBsaXZlIGluIHNyYy9saWIvc3R5bGVzL3RhaWx3aW5kLmNzcyAodGhlIGxpYiBzaGlwcyBhIHNpbmdsZSBjb21waWxlZCBzdHlsZXNoZWV0KTtcbiAgLy8gcGVyLWNvbXBvbmVudCAuc2NzcyBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGUgbmctcGFja2FnciBidWlsZCBmb3IgdGhpcyBsaWIuXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFwaU1vY2tpbmdDYXJkQ29tcG9uZW50IHtcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZyA9ICdBUEkgTW9ja2luZyc7XG4gIEBJbnB1dCgpIHN0YXR1c0xhYmVsOiBzdHJpbmcgPSAnTm90IGNvbmZpZ3VyZWQnO1xuXG4gIEBJbnB1dCgpIGNhcHR1cmVMYWJlbDogc3RyaW5nID0gJ0NhcHR1cmUgQVBJIHJlc3BvbnNlcyc7XG4gIEBJbnB1dCgpIHJlbmV3TGFiZWw6IHN0cmluZyA9ICdSZW5ldyBBUEkgcmVzcG9uc2VzJztcblxuICAvKipcbiAgICogU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGNhcmQncyBkdWFsLXRvZ2dsZSBzdGF0ZS5cbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYCDihpIgQ2FwdHVyZSBpcyBPTiwgUmVuZXcgaXMgT0ZGLlxuICAgKi9cbiAgQElucHV0KCkgcmVzdG9yZU1vY2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBtb2NrZWRBcGlzQ291bnQ6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIHRvdGFsQXBpc0NvdW50OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBwcm9ncmVzc1BlcmNlbnQ6IG51bWJlciA9IDA7XG5cbiAgQElucHV0KCkgc3VtbWFyeVRleHQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBlcmNlbnRUZXh0Pzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGNvbmZpZ3VyZUJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnQ29uZmlndXJlJztcbiAgQElucHV0KCkgZWRpdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBcIk1vY2tlZCBYIG9mIFkgLyBwcm9ncmVzcyBiYXIgLyBwZXJjZW50XCIgYmxvY2sgaXMgc2hvd24uXG4gICAqIEhpZGRlbiB3aGVuIHRoZSB0ZXN0IGNhc2UgaGFzIG5vIGNhcHR1cmVkIG1vY2sgc3VtbWFyeSB5ZXQgKGFuZCBhbHdheXMgaGlkZGVuIGluXG4gICAqIGVkaXQgbW9kZSByZWdhcmRsZXNzIG9mIHRoaXMgZmxhZykuXG4gICAqL1xuICBASW5wdXQoKSBzaG93UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgY29uZmlndXJlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuZXZlciB0aGUgZWZmZWN0aXZlIGByZXN0b3JlTW9ja2AgdmFsdWUgY2hhbmdlcyAoZWl0aGVyIHJvdydzIHRvZ2dsZSB3YXNcbiAgICogaW50ZXJhY3RlZCB3aXRoIGluIGVkaXQgbW9kZSkuIFBhcmVudCBjb21wb25lbnRzIHNob3VsZCBwZXJzaXN0IHRoaXMgdmFsdWUg4oCUIGUuZy4gdW5kZXJcbiAgICogYHRlc3RDYXNlLm1vY2tBcGlTZXR0aW5ncy5yZXN0b3JlTW9ja2AuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVzdG9yZU1vY2tDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLy8gRGVyaXZlZCBwZXItcm93IHN0YXRlICh0ZW1wbGF0ZSBiaW5kcyB0aGVzZSBkaXJlY3RseSBzbyB0aGUgdHdvIHJvd3Mgc3RheSBpbiBsb2NrLXN0ZXApLlxuICBnZXQgcmVuZXdFbmFibGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZXN0b3JlTW9jazsgfVxuICBnZXQgY2FwdHVyZUVuYWJsZWQoKTogYm9vbGVhbiB7IHJldHVybiAhdGhpcy5yZXN0b3JlTW9jazsgfVxuICBnZXQgcmVuZXdWYWx1ZVRleHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMucmVzdG9yZU1vY2sgPyAnT24nIDogJ09mZic7IH1cbiAgZ2V0IGNhcHR1cmVWYWx1ZVRleHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMucmVzdG9yZU1vY2sgPyAnT2ZmJyA6ICdPbic7IH1cblxuICBnZXQgY29tcHV0ZWRTdW1tYXJ5VGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnN1bW1hcnlUZXh0KSByZXR1cm4gdGhpcy5zdW1tYXJ5VGV4dDtcbiAgICByZXR1cm4gYCR7dGhpcy5tb2NrZWRBcGlzQ291bnR9IG9mICR7dGhpcy50b3RhbEFwaXNDb3VudH0gQVBJcyBzZXQgdG8gbW9ja2A7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRQZXJjZW50VGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnBlcmNlbnRUZXh0KSByZXR1cm4gdGhpcy5wZXJjZW50VGV4dDtcbiAgICByZXR1cm4gYCR7dGhpcy5wcm9ncmVzc1BlcmNlbnR9JSBvZiBjYWxscyB3aWxsIHVzZSBtb2NrIHJlc3BvbnNlc2A7XG4gIH1cblxuICBnZXQgcHJvZ3Jlc3NXaWR0aCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIE51bWJlcih0aGlzLnByb2dyZXNzUGVyY2VudCkgfHwgMCkpO1xuICAgIHJldHVybiBgJHtjbGFtcGVkfSVgO1xuICB9XG5cbiAgb25Db25maWd1cmVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZ3VyZS5lbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXNlciBpbnRlcmFjdGVkIHdpdGggdGhlIFwiUmVuZXcgQVBJIHJlc3BvbnNlc1wiIHRvZ2dsZSBpbiBlZGl0IG1vZGUuXG4gICAqIFJlbmV3IE9OICDihpIgcmVzdG9yZU1vY2sgPSB0cnVlICAoQ2FwdHVyZSBPRkYpLlxuICAgKiBSZW5ldyBPRkYg4oaSIHJlc3RvcmVNb2NrID0gZmFsc2UgKENhcHR1cmUgT04g4oCUIG11dHVhbCBleGNsdXNpdml0eSkuXG4gICAqL1xuICBvblJlbmV3VG9nZ2xlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zZXRSZXN0b3JlTW9jayh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlciBpbnRlcmFjdGVkIHdpdGggdGhlIFwiQ2FwdHVyZSBBUEkgcmVzcG9uc2VzXCIgdG9nZ2xlIGluIGVkaXQgbW9kZS5cbiAgICogQ2FwdHVyZSBPTiAg4oaSIHJlc3RvcmVNb2NrID0gZmFsc2UgKFJlbmV3IE9GRikuXG4gICAqIENhcHR1cmUgT0ZGIOKGkiByZXN0b3JlTW9jayA9IHRydWUgIChSZW5ldyBPTiDigJQgbXV0dWFsIGV4Y2x1c2l2aXR5KS5cbiAgICovXG4gIG9uQ2FwdHVyZVRvZ2dsZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2V0UmVzdG9yZU1vY2soIXZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UmVzdG9yZU1vY2sobmV4dDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc3RvcmVNb2NrID09PSBuZXh0KSByZXR1cm47XG4gICAgdGhpcy5yZXN0b3JlTW9jayA9IG5leHQ7XG4gICAgdGhpcy5yZXN0b3JlTW9ja0NoYW5nZS5lbWl0KG5leHQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWFtYy1jYXJkXCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYW1jLWhlYWRlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy10aXRsZVwiPnt7IHRpdGxlIH19PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy1zdGF0dXNcIiAqbmdJZj1cInN0YXR1c0xhYmVsXCI+e3sgc3RhdHVzTGFiZWwgfX08L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDwhLS0gUmVhZC1vbmx5IHJvd3MgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZWRpdGluZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLXJvd1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLWxhYmVsXCI+e3sgY2FwdHVyZUxhYmVsIH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLXZhbHVlXCI+e3sgY2FwdHVyZVZhbHVlVGV4dCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWFtYy1yb3dcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy1sYWJlbFwiPnt7IHJlbmV3TGFiZWwgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1hbWMtdmFsdWVcIj57eyByZW5ld1ZhbHVlVGV4dCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBFZGl0IHJvd3M6IHRvZ2dsZXMgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0aW5nXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1hbWMtcm93IGNxYS1hbWMtcm93LS1lZGl0XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1hbWMtbGFiZWxcIj57eyBjYXB0dXJlTGFiZWwgfX08L3NwYW4+XG4gICAgICA8Y3FhLWN1c3RvbS10b2dnbGVcbiAgICAgICAgW2NoZWNrZWRdPVwiY2FwdHVyZUVuYWJsZWRcIlxuICAgICAgICBbYXJpYUxhYmVsXT1cImNhcHR1cmVMYWJlbFwiXG4gICAgICAgIChjaGVja2VkQ2hhbmdlKT1cIm9uQ2FwdHVyZVRvZ2dsZSgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLXJvdyBjcWEtYW1jLXJvdy0tZWRpdFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLWxhYmVsXCI+e3sgcmVuZXdMYWJlbCB9fTwvc3Bhbj5cbiAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZVxuICAgICAgICBbY2hlY2tlZF09XCJyZW5ld0VuYWJsZWRcIlxuICAgICAgICBbYXJpYUxhYmVsXT1cInJlbmV3TGFiZWxcIlxuICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJvblJlbmV3VG9nZ2xlKCRldmVudClcIj5cbiAgICAgIDwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UHJvZ3Jlc3MgJiYgIWVkaXRpbmdcIj5cbiAgICA8cCBjbGFzcz1cImNxYS1hbWMtc3VtbWFyeVwiPnt7IGNvbXB1dGVkU3VtbWFyeVRleHQgfX08L3A+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1hbWMtcHJvZ3Jlc3MtdHJhY2tcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLXByb2dyZXNzLWZpbGxcIiBbc3R5bGUud2lkdGhdPVwicHJvZ3Jlc3NXaWR0aFwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxwIGNsYXNzPVwiY3FhLWFtYy1wZXJjZW50XCI+e3sgY29tcHV0ZWRQZXJjZW50VGV4dCB9fTwvcD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwiIWVkaXRpbmdcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwiY3FhLWFtYy1jb25maWd1cmUtYnRuXCJcbiAgICAoY2xpY2spPVwib25Db25maWd1cmVDbGljaygpXCI+XG4gICAge3sgY29uZmlndXJlQnV0dG9uTGFiZWwgfX1cbiAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==
|