@elderbyte/ngx-starter 18.12.5 → 18.12.7
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/esm2022/lib/common/i18n/entity/elder-multi-translate-loader.mjs +4 -4
- package/esm2022/lib/common/utils/signal-input.mjs +3 -0
- package/esm2022/lib/components/time/elder-interval-picker/controller/interval-anchor-controller.mjs +21 -0
- package/esm2022/lib/components/time/elder-interval-picker/controller/interval-calendar-controller.mjs +24 -0
- package/esm2022/lib/components/time/elder-interval-picker/controller/interval-controller.mjs +43 -0
- package/esm2022/lib/components/time/elder-interval-picker/controller/interval-form-controller.mjs +69 -0
- package/esm2022/lib/components/time/elder-interval-picker/controller/interval-select-controller.mjs +117 -0
- package/esm2022/lib/components/time/elder-interval-picker/controller/interval-shift-controller.mjs +44 -0
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.component.mjs +76 -127
- package/esm2022/lib/components/time/elder-interval-picker/interval-picker-binding/elder-interval-picker-binding.directive.mjs +41 -0
- package/esm2022/lib/components/time/elder-interval-picker/interval-picker-toggle/elder-interval-picker-toggle.component.mjs +144 -0
- package/esm2022/lib/components/time/elder-interval-picker/manager/interval-picker-state-manager.mjs +93 -0
- package/esm2022/lib/components/time/elder-interval-picker/model/anchor-state.mjs +54 -0
- package/esm2022/lib/components/time/elder-interval-picker/model/interval-state.mjs +37 -0
- package/esm2022/lib/components/time/elder-interval-picker/model/smart-shift-state.mjs +10 -0
- package/esm2022/lib/components/time/elder-interval-picker/presenter/interval-picker-presenter.mjs +96 -0
- package/esm2022/lib/components/time/elder-interval-picker/util/interval-picker-util.mjs +194 -0
- package/esm2022/lib/components/time/elder-time.module.mjs +5 -5
- package/fesm2022/elderbyte-ngx-starter.mjs +764 -888
- package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
- package/lib/common/utils/signal-input.d.ts +2 -0
- package/lib/components/time/elder-interval-picker/controller/interval-anchor-controller.d.ts +9 -0
- package/lib/components/time/elder-interval-picker/controller/interval-calendar-controller.d.ts +7 -0
- package/lib/components/time/elder-interval-picker/controller/interval-controller.d.ts +35 -0
- package/lib/components/time/elder-interval-picker/controller/interval-form-controller.d.ts +12 -0
- package/lib/components/time/elder-interval-picker/controller/interval-select-controller.d.ts +22 -0
- package/lib/components/time/elder-interval-picker/controller/interval-shift-controller.d.ts +13 -0
- package/lib/components/time/elder-interval-picker/elder-interval-picker.component.d.ts +23 -33
- package/lib/components/time/elder-interval-picker/{elder-interval-picker-binding.directive.d.ts → interval-picker-binding/elder-interval-picker-binding.directive.d.ts} +3 -4
- package/lib/components/time/elder-interval-picker/interval-picker-toggle/elder-interval-picker-toggle.component.d.ts +37 -0
- package/lib/components/time/elder-interval-picker/manager/interval-picker-state-manager.d.ts +46 -0
- package/lib/components/time/elder-interval-picker/model/anchor-state.d.ts +20 -0
- package/lib/components/time/elder-interval-picker/model/interval-state.d.ts +16 -0
- package/lib/components/time/elder-interval-picker/model/smart-shift-state.d.ts +8 -0
- package/lib/components/time/elder-interval-picker/presenter/interval-picker-presenter.d.ts +30 -0
- package/lib/components/time/elder-interval-picker/util/interval-picker-util.d.ts +20 -0
- package/lib/components/time/elder-time.module.d.ts +4 -4
- package/package.json +1 -1
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker-binding.directive.mjs +0 -40
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker-toggle/elder-interval-picker-toggle.component.mjs +0 -202
- package/esm2022/lib/components/time/elder-interval-picker/model/interval-picker-model-editor.mjs +0 -284
- package/esm2022/lib/components/time/elder-interval-picker/model/interval-picker-model.mjs +0 -445
- package/esm2022/lib/components/time/elder-interval-picker/model/plain-date-interval-message-renderer.mjs +0 -37
- package/esm2022/lib/components/time/elder-interval-picker/model/plain-temporal-duration-message-renderer.mjs +0 -25
- package/lib/components/time/elder-interval-picker/elder-interval-picker-toggle/elder-interval-picker-toggle.component.d.ts +0 -55
- package/lib/components/time/elder-interval-picker/model/interval-picker-model-editor.d.ts +0 -77
- package/lib/components/time/elder-interval-picker/model/interval-picker-model.d.ts +0 -113
- package/lib/components/time/elder-interval-picker/model/plain-date-interval-message-renderer.d.ts +0 -7
- package/lib/components/time/elder-interval-picker/model/plain-temporal-duration-message-renderer.d.ts +0 -4
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
import { booleanAttribute, ChangeDetectionStrategy, Component, computed, input, signal, ViewChild, } from '@angular/core';
|
|
2
|
-
import { MatIconButton } from '@angular/material/button';
|
|
3
|
-
import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field';
|
|
4
|
-
import { MatIcon } from '@angular/material/icon';
|
|
5
|
-
import { LoggerFactory } from '@elderbyte/ts-logger';
|
|
6
|
-
import { Interval } from '../../../../common/time/interval';
|
|
7
|
-
import { ElderOverlayOriginDirective } from '../../../../components/overlays/elder-overlay-origin.directive';
|
|
8
|
-
import { ElderOverlayTriggerDirective } from '../../../../components/overlays/elder-overlay-trigger.directive';
|
|
9
|
-
import { ElderOverlayComponent } from '../../../../components/overlays/elder-overlay.component';
|
|
10
|
-
import { ElderDialogPanelComponent } from '../../../../components/panels/elder-dialog-panel/elder-dialog-panel.component';
|
|
11
|
-
import { ElderIntervalInputComponent, } from '../../../../components/time/elder-interval-input/elder-interval-input.component';
|
|
12
|
-
import { ElderIntervalPickerComponent } from '../elder-interval-picker.component';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
export class ElderIntervalPickerToggleComponent {
|
|
15
|
-
constructor() {
|
|
16
|
-
/***************************************************************************
|
|
17
|
-
* *
|
|
18
|
-
* Fields *
|
|
19
|
-
* *
|
|
20
|
-
**************************************************************************/
|
|
21
|
-
this.log = LoggerFactory.getLogger(this.constructor.name);
|
|
22
|
-
this.intervalInputElement = signal(undefined);
|
|
23
|
-
this.emitOnChange = input(true, { transform: (v) => booleanAttribute(v) });
|
|
24
|
-
this.showAnchor = input(false, { transform: (v) => booleanAttribute(v) });
|
|
25
|
-
this.anchorReadOnly = input(false, { transform: (v) => booleanAttribute(v) });
|
|
26
|
-
this.disabled = input(false, { transform: (v) => booleanAttribute(v) });
|
|
27
|
-
this.buttonDisabled = computed(() => this.intervalInputDisabled() || this.disabled());
|
|
28
|
-
this.intervalInputDisabled = signal(false);
|
|
29
|
-
this.showResultText = input(true, { transform: (v) => booleanAttribute(v) });
|
|
30
|
-
this.showHelpText = input(true, { transform: (v) => booleanAttribute(v) });
|
|
31
|
-
this.lastExcludesToday = input(false, { transform: (v) => booleanAttribute(v) });
|
|
32
|
-
this.anchorDateTime = input(null);
|
|
33
|
-
this.inputInterval = null;
|
|
34
|
-
this.intervalInputMode = 'date-range'; // will be overwritten by connected element after view init
|
|
35
|
-
}
|
|
36
|
-
/***************************************************************************
|
|
37
|
-
* *
|
|
38
|
-
* Life Cycle *
|
|
39
|
-
* *
|
|
40
|
-
**************************************************************************/
|
|
41
|
-
ngOnDestroy() {
|
|
42
|
-
this.inputIntervalElSubscription.unsubscribe();
|
|
43
|
-
}
|
|
44
|
-
ngAfterViewInit() {
|
|
45
|
-
const intervalControl = this.intervalInputElement();
|
|
46
|
-
if (intervalControl.disabled) {
|
|
47
|
-
this.intervalInputDisabled.set(true);
|
|
48
|
-
}
|
|
49
|
-
this.inputIntervalElSubscription = intervalControl.valueUpdated.subscribe({
|
|
50
|
-
next: (value) => this.updateModelInterval(this.coerceInterval(value)),
|
|
51
|
-
});
|
|
52
|
-
this.intervalInputMode = intervalControl.mode;
|
|
53
|
-
this.updateModelInterval(this.readIntervalInputValue(intervalControl));
|
|
54
|
-
}
|
|
55
|
-
/***************************************************************************
|
|
56
|
-
* *
|
|
57
|
-
* Public API *
|
|
58
|
-
* *
|
|
59
|
-
**************************************************************************/
|
|
60
|
-
handleOverlayAttachedChange(attached) {
|
|
61
|
-
if (this.emitOnChange()) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
this.updateModelFromIntervalInput();
|
|
65
|
-
}
|
|
66
|
-
updateModelFromIntervalInput() {
|
|
67
|
-
this.updateModelInterval(this.readIntervalInputValue(this.intervalInputElement()));
|
|
68
|
-
}
|
|
69
|
-
handleIntervalPickerDateChange(interval) {
|
|
70
|
-
this.inputInterval = interval;
|
|
71
|
-
this.updateIntervalInputElement(this.inputInterval);
|
|
72
|
-
}
|
|
73
|
-
registerInputComponent(inputComponent) {
|
|
74
|
-
this.intervalInputElement.set(inputComponent);
|
|
75
|
-
}
|
|
76
|
-
/***************************************************************************
|
|
77
|
-
* *
|
|
78
|
-
* Private methods *
|
|
79
|
-
* *
|
|
80
|
-
**************************************************************************/
|
|
81
|
-
updateModelInterval(value) {
|
|
82
|
-
this.inputInterval = value;
|
|
83
|
-
this.connectedIntervalPicker.model.setInterval(value);
|
|
84
|
-
}
|
|
85
|
-
updateIntervalInputElement(interval) {
|
|
86
|
-
const intervalControl = this.intervalInputElement();
|
|
87
|
-
if (intervalControl) {
|
|
88
|
-
intervalControl.value = interval;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
readIntervalInputValue(intervalComponent) {
|
|
92
|
-
if (intervalComponent) {
|
|
93
|
-
return this.coerceInterval(intervalComponent.value);
|
|
94
|
-
}
|
|
95
|
-
return undefined;
|
|
96
|
-
}
|
|
97
|
-
coerceInterval(value) {
|
|
98
|
-
if (value instanceof Interval) {
|
|
99
|
-
return value;
|
|
100
|
-
}
|
|
101
|
-
else if (value != undefined) {
|
|
102
|
-
return Interval.parse(value);
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
return undefined;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ElderIntervalPickerToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
109
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.5", type: ElderIntervalPickerToggleComponent, isStandalone: true, selector: "elder-interval-picker-toggle", inputs: { emitOnChange: { classPropertyName: "emitOnChange", publicName: "emitOnChange", isSignal: true, isRequired: false, transformFunction: null }, showAnchor: { classPropertyName: "showAnchor", publicName: "showAnchor", isSignal: true, isRequired: false, transformFunction: null }, anchorReadOnly: { classPropertyName: "anchorReadOnly", publicName: "anchorReadOnly", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, showResultText: { classPropertyName: "showResultText", publicName: "showResultText", isSignal: true, isRequired: false, transformFunction: null }, showHelpText: { classPropertyName: "showHelpText", publicName: "showHelpText", isSignal: true, isRequired: false, transformFunction: null }, lastExcludesToday: { classPropertyName: "lastExcludesToday", publicName: "lastExcludesToday", isSignal: true, isRequired: false, transformFunction: null }, anchorDateTime: { classPropertyName: "anchorDateTime", publicName: "anchorDateTime", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "connectedIntervalPicker", first: true, predicate: ["connectedIntervalPicker"], descendants: true }], ngImport: i0, template: `
|
|
110
|
-
<span style="padding-right: 8px">
|
|
111
|
-
<button
|
|
112
|
-
mat-icon-button
|
|
113
|
-
[elderOverlayOrigin]="dateIntervalOverlay"
|
|
114
|
-
[elderOverlayTrigger]="dateIntervalOverlay"
|
|
115
|
-
[disabled]="buttonDisabled()"
|
|
116
|
-
(click)="updateModelFromIntervalInput()"
|
|
117
|
-
class="elder-control-icon-button mat-datepicker-toggle"
|
|
118
|
-
>
|
|
119
|
-
<mat-icon>date_range</mat-icon>
|
|
120
|
-
</button>
|
|
121
|
-
</span>
|
|
122
|
-
|
|
123
|
-
<elder-overlay #dateIntervalOverlay (attachedChange)="handleOverlayAttachedChange($event)">
|
|
124
|
-
<elder-dialog-panel>
|
|
125
|
-
<div class="pb-md pt-xs">
|
|
126
|
-
<elder-interval-picker
|
|
127
|
-
#connectedIntervalPicker
|
|
128
|
-
[intervalInputMode]="intervalInputMode"
|
|
129
|
-
[emitOnChange]="emitOnChange()"
|
|
130
|
-
[interval]="inputInterval"
|
|
131
|
-
(dateChange)="handleIntervalPickerDateChange($event)"
|
|
132
|
-
[showAnchor]="showAnchor()"
|
|
133
|
-
[anchorDateTime]="anchorDateTime()"
|
|
134
|
-
[anchorReadOnly]="anchorReadOnly()"
|
|
135
|
-
[showResultText]="showResultText()"
|
|
136
|
-
[showHelpText]="showHelpText()"
|
|
137
|
-
[lastExcludesToday]="lastExcludesToday()"
|
|
138
|
-
></elder-interval-picker>
|
|
139
|
-
</div>
|
|
140
|
-
</elder-dialog-panel>
|
|
141
|
-
</elder-overlay>
|
|
142
|
-
`, isInline: true, dependencies: [{ kind: "component", type: ElderIntervalPickerComponent, selector: "elder-interval-picker", inputs: ["emitOnChange", "intervalInputMode", "showAnchor", "anchorReadOnly", "showResultText", "showHelpText", "lastExcludesToday", "interval", "anchorDateTime"], outputs: ["dateChange"] }, { kind: "component", type: ElderOverlayComponent, selector: "elder-overlay", inputs: ["originX", "originY", "overlayX", "overlayY", "offsetY", "offsetX", "backdrop", "backdropVisible", "origin", "positionStrategy", "overlaySize"], outputs: ["keydownEvents", "attachedChange"], exportAs: ["elderOverlay"] }, { kind: "component", type: ElderDialogPanelComponent, selector: "elder-dialog-panel" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: ElderOverlayTriggerDirective, selector: "[elderOverlayTrigger]", inputs: ["elderOverlayTrigger", "elderOverlayTriggerType", "elderOverlayTriggerEnabled"] }, { kind: "directive", type: ElderOverlayOriginDirective, selector: "[elderOverlayOrigin]", inputs: ["elderOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
143
|
-
}
|
|
144
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ElderIntervalPickerToggleComponent, decorators: [{
|
|
145
|
-
type: Component,
|
|
146
|
-
args: [{
|
|
147
|
-
selector: 'elder-interval-picker-toggle',
|
|
148
|
-
standalone: true,
|
|
149
|
-
imports: [
|
|
150
|
-
ElderIntervalPickerComponent,
|
|
151
|
-
ElderIntervalInputComponent,
|
|
152
|
-
MatFormField,
|
|
153
|
-
MatLabel,
|
|
154
|
-
ElderOverlayComponent,
|
|
155
|
-
ElderDialogPanelComponent,
|
|
156
|
-
MatIcon,
|
|
157
|
-
MatIconButton,
|
|
158
|
-
MatSuffix,
|
|
159
|
-
ElderOverlayTriggerDirective,
|
|
160
|
-
ElderOverlayOriginDirective,
|
|
161
|
-
],
|
|
162
|
-
template: `
|
|
163
|
-
<span style="padding-right: 8px">
|
|
164
|
-
<button
|
|
165
|
-
mat-icon-button
|
|
166
|
-
[elderOverlayOrigin]="dateIntervalOverlay"
|
|
167
|
-
[elderOverlayTrigger]="dateIntervalOverlay"
|
|
168
|
-
[disabled]="buttonDisabled()"
|
|
169
|
-
(click)="updateModelFromIntervalInput()"
|
|
170
|
-
class="elder-control-icon-button mat-datepicker-toggle"
|
|
171
|
-
>
|
|
172
|
-
<mat-icon>date_range</mat-icon>
|
|
173
|
-
</button>
|
|
174
|
-
</span>
|
|
175
|
-
|
|
176
|
-
<elder-overlay #dateIntervalOverlay (attachedChange)="handleOverlayAttachedChange($event)">
|
|
177
|
-
<elder-dialog-panel>
|
|
178
|
-
<div class="pb-md pt-xs">
|
|
179
|
-
<elder-interval-picker
|
|
180
|
-
#connectedIntervalPicker
|
|
181
|
-
[intervalInputMode]="intervalInputMode"
|
|
182
|
-
[emitOnChange]="emitOnChange()"
|
|
183
|
-
[interval]="inputInterval"
|
|
184
|
-
(dateChange)="handleIntervalPickerDateChange($event)"
|
|
185
|
-
[showAnchor]="showAnchor()"
|
|
186
|
-
[anchorDateTime]="anchorDateTime()"
|
|
187
|
-
[anchorReadOnly]="anchorReadOnly()"
|
|
188
|
-
[showResultText]="showResultText()"
|
|
189
|
-
[showHelpText]="showHelpText()"
|
|
190
|
-
[lastExcludesToday]="lastExcludesToday()"
|
|
191
|
-
></elder-interval-picker>
|
|
192
|
-
</div>
|
|
193
|
-
</elder-dialog-panel>
|
|
194
|
-
</elder-overlay>
|
|
195
|
-
`,
|
|
196
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
197
|
-
}]
|
|
198
|
-
}], propDecorators: { connectedIntervalPicker: [{
|
|
199
|
-
type: ViewChild,
|
|
200
|
-
args: ['connectedIntervalPicker']
|
|
201
|
-
}] } });
|
|
202
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItaW50ZXJ2YWwtcGlja2VyLXRvZ2dsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL3RpbWUvZWxkZXItaW50ZXJ2YWwtcGlja2VyL2VsZGVyLWludGVydmFsLXBpY2tlci10b2dnbGUvZWxkZXItaW50ZXJ2YWwtcGlja2VyLXRvZ2dsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUVwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0NBQWtDLENBQUE7QUFDM0QsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZ0VBQWdFLENBQUE7QUFDNUcsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0saUVBQWlFLENBQUE7QUFDOUcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seURBQXlELENBQUE7QUFDL0YsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0VBQStFLENBQUE7QUFDekgsT0FBTyxFQUNMLDJCQUEyQixHQUU1QixNQUFNLGlGQUFpRixDQUFBO0FBQ3hGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG9DQUFvQyxD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b0M7UUFDekQsSUFBSSxLQUFLLFlBQVksUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO2FBQU0sSUFBSSxLQUFLLElBQUksU0FBUyxFQUFFLENBQUM7WUFDOUIsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzlCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxTQUFTLENBQUE7UUFDbEIsQ0FBQztJQUNILENBQUM7OEdBekhVLGtDQUFrQztrR0FBbEMsa0NBQWtDLCsxQ0FwQ25DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ1QsNERBN0NDLDRCQUE0QiwrUEFJNUIscUJBQXFCLDhSQUNyQix5QkFBeUIsK0RBQ3pCLE9BQU8sMklBQ1AsYUFBYSw2RkFFYiw0QkFBNEIsNEpBQzVCLDJCQUEyQjs7MkZBc0NsQixrQ0FBa0M7a0JBcEQ5QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSw4QkFBOEI7b0JBQ3hDLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUU7d0JBQ1AsNEJBQTRCO3dCQUM1QiwyQkFBMkI7d0JBQzNCLFlBQVk7d0JBQ1osUUFBUTt3QkFDUixxQkFBcUI7d0JBQ3JCLHlCQUF5Qjt3QkFDekIsT0FBTzt3QkFDUCxhQUFhO3dCQUNiLFNBQVM7d0JBQ1QsNEJBQTRCO3dCQUM1QiwyQkFBMkI7cUJBQzVCO29CQUNELFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNUO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDs4QkFXQyx1QkFBdUI7c0JBRHRCLFNBQVM7dUJBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGlucHV0LFxuICBPbkRlc3Ryb3ksXG4gIHNpZ25hbCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgTWF0SWNvbkJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbidcbmltcG9ydCB7IE1hdEZvcm1GaWVsZCwgTWF0TGFiZWwsIE1hdFN1ZmZpeCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnXG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbidcbmltcG9ydCB7IExvZ2dlckZhY3RvcnkgfSBmcm9tICdAZWxkZXJieXRlL3RzLWxvZ2dlcidcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBJbnRlcnZhbCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbW1vbi90aW1lL2ludGVydmFsJ1xuaW1wb3J0IHsgRWxkZXJPdmVybGF5T3JpZ2luRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9vdmVybGF5cy9lbGRlci1vdmVybGF5LW9yaWdpbi5kaXJlY3RpdmUnXG5pbXBvcnQgeyBFbGRlck92ZXJsYXlUcmlnZ2VyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9vdmVybGF5cy9lbGRlci1vdmVybGF5LXRyaWdnZXIuZGlyZWN0aXZlJ1xuaW1wb3J0IHsgRWxkZXJPdmVybGF5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9vdmVybGF5cy9lbGRlci1vdmVybGF5LmNvbXBvbmVudCdcbmltcG9ydCB7IEVsZGVyRGlhbG9nUGFuZWxDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21wb25lbnRzL3BhbmVscy9lbGRlci1kaWFsb2ctcGFuZWwvZWxkZXItZGlhbG9nLXBhbmVsLmNvbXBvbmVudCdcbmltcG9ydCB7XG4gIEVsZGVySW50ZXJ2YWxJbnB1dENvbXBvbmVudCxcbiAgSW50ZXJ2YWxJbnB1dE1vZGUsXG59IGZyb20gJy4uLy4uLy4uLy4uL2NvbXBvbmVudHMvdGltZS9lbGRlci1pbnRlcnZhbC1pbnB1dC9lbGRlci1pbnRlcnZhbC1pbnB1dC5jb21wb25lbnQnXG5pbXBvcnQgeyBFbGRlckludGVydmFsUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZWxkZXItaW50ZXJ2YWwtcGlja2VyLmNvbXBvbmVudCdcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZWxkZXItaW50ZXJ2YWwtcGlja2VyLXRvZ2dsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBFbGRlckludGVydmFsUGlja2VyQ29tcG9uZW50LFxuICAgIEVsZGVySW50ZXJ2YWxJbnB1dENvbXBvbmVudCxcbiAgICBNYXRGb3JtRmllbGQsXG4gICAgTWF0TGFiZWwsXG4gICAgRWxkZXJPdmVybGF5Q29tcG9uZW50LFxuICAgIEVsZGVyRGlhbG9nUGFuZWxDb21wb25lbnQsXG4gICAgTWF0SWNvbixcbiAgICBNYXRJY29uQnV0dG9uLFxuICAgIE1hdFN1ZmZpeCxcbiAgICBFbGRlck92ZXJsYXlUcmlnZ2VyRGlyZWN0aXZlLFxuICAgIEVsZGVyT3ZlcmxheU9yaWdpbkRpcmVjdGl2ZSxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3BhbiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDhweFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgW2VsZGVyT3ZlcmxheU9yaWdpbl09XCJkYXRlSW50ZXJ2YWxPdmVybGF5XCJcbiAgICAgICAgW2VsZGVyT3ZlcmxheVRyaWdnZXJdPVwiZGF0ZUludGVydmFsT3ZlcmxheVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJidXR0b25EaXNhYmxlZCgpXCJcbiAgICAgICAgKGNsaWNrKT1cInVwZGF0ZU1vZGVsRnJvbUludGVydmFsSW5wdXQoKVwiXG4gICAgICAgIGNsYXNzPVwiZWxkZXItY29udHJvbC1pY29uLWJ1dHRvbiBtYXQtZGF0ZXBpY2tlci10b2dnbGVcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+ZGF0ZV9yYW5nZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L3NwYW4+XG5cbiAgICA8ZWxkZXItb3ZlcmxheSAjZGF0ZUludGVydmFsT3ZlcmxheSAoYXR0YWNoZWRDaGFuZ2UpPVwiaGFuZGxlT3ZlcmxheUF0dGFjaGVkQ2hhbmdlKCRldmVudClcIj5cbiAgICAgIDxlbGRlci1kaWFsb2ctcGFuZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYi1tZCBwdC14c1wiPlxuICAgICAgICAgIDxlbGRlci1pbnRlcnZhbC1waWNrZXJcbiAgICAgICAgICAgICNjb25uZWN0ZWRJbnRlcnZhbFBpY2tlclxuICAgICAgICAgICAgW2ludGVydmFsSW5wdXRNb2RlXT1cImludGVydmFsSW5wdXRNb2RlXCJcbiAgICAgICAgICAgIFtlbWl0T25DaGFuZ2VdPVwiZW1pdE9uQ2hhbmdlKClcIlxuICAgICAgICAgICAgW2ludGVydmFsXT1cImlucHV0SW50ZXJ2YWxcIlxuICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiaGFuZGxlSW50ZXJ2YWxQaWNrZXJEYXRlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgW3Nob3dBbmNob3JdPVwic2hvd0FuY2hvcigpXCJcbiAgICAgICAgICAgIFthbmNob3JEYXRlVGltZV09XCJhbmNob3JEYXRlVGltZSgpXCJcbiAgICAgICAgICAgIFthbmNob3JSZWFkT25seV09XCJhbmNob3JSZWFkT25seSgpXCJcbiAgICAgICAgICAgIFtzaG93UmVzdWx0VGV4dF09XCJzaG93UmVzdWx0VGV4dCgpXCJcbiAgICAgICAgICAgIFtzaG93SGVscFRleHRdPVwic2hvd0hlbHBUZXh0KClcIlxuICAgICAgICAgICAgW2xhc3RFeGNsdWRlc1RvZGF5XT1cImxhc3RFeGNsdWRlc1RvZGF5KClcIlxuICAgICAgICAgID48L2VsZGVyLWludGVydmFsLXBpY2tlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2VsZGVyLWRpYWxvZy1wYW5lbD5cbiAgICA8L2VsZGVyLW92ZXJsYXk+XG4gIGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBFbGRlckludGVydmFsUGlja2VyVG9nZ2xlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEZpZWxkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUpXG5cbiAgQFZpZXdDaGlsZCgnY29ubmVjdGVkSW50ZXJ2YWxQaWNrZXInKVxuICBjb25uZWN0ZWRJbnRlcnZhbFBpY2tlciE6IEVsZGVySW50ZXJ2YWxQaWNrZXJDb21wb25lbnRcblxuICBwdWJsaWMgcmVhZG9ubHkgaW50ZXJ2YWxJbnB1dEVsZW1lbnQgPSBzaWduYWw8RWxkZXJJbnRlcnZhbElucHV0Q29tcG9uZW50Pih1bmRlZmluZWQpXG4gIHB1YmxpYyByZWFkb25seSBlbWl0T25DaGFuZ2UgPSBpbnB1dCh0cnVlLCB7IHRyYW5zZm9ybTogKHYpID0+IGJvb2xlYW5BdHRyaWJ1dGUodikgfSlcblxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd0FuY2hvciA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogKHYpID0+IGJvb2xlYW5BdHRyaWJ1dGUodikgfSlcbiAgcHVibGljIHJlYWRvbmx5IGFuY2hvclJlYWRPbmx5ID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiAodikgPT4gYm9vbGVhbkF0dHJpYnV0ZSh2KSB9KVxuICBwdWJsaWMgcmVhZG9ubHkgZGlzYWJsZWQgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06ICh2KSA9PiBib29sZWFuQXR0cmlidXRlKHYpIH0pXG5cbiAgcHVibGljIHJlYWRvbmx5IGJ1dHRvbkRpc2FibGVkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oXG4gICAgKCkgPT4gdGhpcy5pbnRlcnZhbElucHV0RGlzYWJsZWQoKSB8fCB0aGlzLmRpc2FibGVkKClcbiAgKVxuICBwcml2YXRlIHJlYWRvbmx5IGludGVydmFsSW5wdXREaXNhYmxlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSlcblxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd1Jlc3VsdFRleHQgPSBpbnB1dCh0cnVlLCB7IHRyYW5zZm9ybTogKHYpID0+IGJvb2xlYW5BdHRyaWJ1dGUodikgfSlcbiAgcHVibGljIHJlYWRvbmx5IHNob3dIZWxwVGV4dCA9IGlucHV0KHRydWUsIHsgdHJhbnNmb3JtOiAodikgPT4gYm9vbGVhbkF0dHJpYnV0ZSh2KSB9KVxuXG4gIHB1YmxpYyByZWFkb25seSBsYXN0RXhjbHVkZXNUb2RheSA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogKHYpID0+IGJvb2xlYW5BdHRyaWJ1dGUodikgfSlcblxuICBwdWJsaWMgcmVhZG9ubHkgYW5jaG9yRGF0ZVRpbWUgPSBpbnB1dDxEYXRlPihudWxsKVxuXG4gIHB1YmxpYyBpbnB1dEludGVydmFsOiBJbnRlcnZhbCA9IG51bGxcbiAgcHVibGljIGludGVydmFsSW5wdXRNb2RlOiBJbnRlcnZhbElucHV0TW9kZSA9ICdkYXRlLXJhbmdlJyAvLyB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IGNvbm5lY3RlZCBlbGVtZW50IGFmdGVyIHZpZXcgaW5pdFxuXG4gIHByaXZhdGUgaW5wdXRJbnRlcnZhbEVsU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb25cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogTGlmZSBDeWNsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dEludGVydmFsRWxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBpbnRlcnZhbENvbnRyb2wgPSB0aGlzLmludGVydmFsSW5wdXRFbGVtZW50KClcblxuICAgIGlmIChpbnRlcnZhbENvbnRyb2wuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuaW50ZXJ2YWxJbnB1dERpc2FibGVkLnNldCh0cnVlKVxuICAgIH1cblxuICAgIHRoaXMuaW5wdXRJbnRlcnZhbEVsU3Vic2NyaXB0aW9uID0gaW50ZXJ2YWxDb250cm9sLnZhbHVlVXBkYXRlZC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHZhbHVlKSA9PiB0aGlzLnVwZGF0ZU1vZGVsSW50ZXJ2YWwodGhpcy5jb2VyY2VJbnRlcnZhbCh2YWx1ZSkpLFxuICAgIH0pXG4gICAgdGhpcy5pbnRlcnZhbElucHV0TW9kZSA9IGludGVydmFsQ29udHJvbC5tb2RlXG4gICAgdGhpcy51cGRhdGVNb2RlbEludGVydmFsKHRoaXMucmVhZEludGVydmFsSW5wdXRWYWx1ZShpbnRlcnZhbENvbnRyb2wpKVxuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFB1YmxpYyBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIGhhbmRsZU92ZXJsYXlBdHRhY2hlZENoYW5nZShhdHRhY2hlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmVtaXRPbkNoYW5nZSgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51cGRhdGVNb2RlbEZyb21JbnRlcnZhbElucHV0KClcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVNb2RlbEZyb21JbnRlcnZhbElucHV0KCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlTW9kZWxJbnRlcnZhbCh0aGlzLnJlYWRJbnRlcnZhbElucHV0VmFsdWUodGhpcy5pbnRlcnZhbElucHV0RWxlbWVudCgpKSlcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVJbnRlcnZhbFBpY2tlckRhdGVDaGFuZ2UoaW50ZXJ2YWw6IEludGVydmFsKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dEludGVydmFsID0gaW50ZXJ2YWxcbiAgICB0aGlzLnVwZGF0ZUludGVydmFsSW5wdXRFbGVtZW50KHRoaXMuaW5wdXRJbnRlcnZhbClcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlcklucHV0Q29tcG9uZW50KGlucHV0Q29tcG9uZW50OiBFbGRlckludGVydmFsSW5wdXRDb21wb25lbnQpIHtcbiAgICB0aGlzLmludGVydmFsSW5wdXRFbGVtZW50LnNldChpbnB1dENvbXBvbmVudClcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcml2YXRlIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgdXBkYXRlTW9kZWxJbnRlcnZhbCh2YWx1ZTogSW50ZXJ2YWwpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0SW50ZXJ2YWwgPSB2YWx1ZVxuICAgIHRoaXMuY29ubmVjdGVkSW50ZXJ2YWxQaWNrZXIubW9kZWwuc2V0SW50ZXJ2YWwodmFsdWUpXG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUludGVydmFsSW5wdXRFbGVtZW50KGludGVydmFsOiBJbnRlcnZhbCk6IHZvaWQge1xuICAgIGNvbnN0IGludGVydmFsQ29udHJvbCA9IHRoaXMuaW50ZXJ2YWxJbnB1dEVsZW1lbnQoKVxuICAgIGlmIChpbnRlcnZhbENvbnRyb2wpIHtcbiAgICAgIGludGVydmFsQ29udHJvbC52YWx1ZSA9IGludGVydmFsXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWFkSW50ZXJ2YWxJbnB1dFZhbHVlKFxuICAgIGludGVydmFsQ29tcG9uZW50OiBFbGRlckludGVydmFsSW5wdXRDb21wb25lbnRcbiAgKTogSW50ZXJ2YWwgfCB1bmRlZmluZWQge1xuICAgIGlmIChpbnRlcnZhbENvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29lcmNlSW50ZXJ2YWwoaW50ZXJ2YWxDb21wb25lbnQhLnZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBwcml2YXRlIGNvZXJjZUludGVydmFsKHZhbHVlOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBJbnRlcnZhbCk6IEludGVydmFsIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlcnZhbCkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBJbnRlcnZhbC5wYXJzZSh2YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgfVxufVxuIl19
|
package/esm2022/lib/components/time/elder-interval-picker/model/interval-picker-model-editor.mjs
DELETED
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
import { Temporal } from '@js-temporal/polyfill';
|
|
2
|
-
import { TemporalUtil } from '../../../../common/time/temporal-util';
|
|
3
|
-
export class IntervalPickerModelEditor {
|
|
4
|
-
/***************************************************************************
|
|
5
|
-
* *
|
|
6
|
-
* Constructor *
|
|
7
|
-
* *
|
|
8
|
-
**************************************************************************/
|
|
9
|
-
constructor(model) {
|
|
10
|
-
this.model = model;
|
|
11
|
-
}
|
|
12
|
-
/***************************************************************************
|
|
13
|
-
* *
|
|
14
|
-
* Date Shift API *
|
|
15
|
-
* *
|
|
16
|
-
**************************************************************************/
|
|
17
|
-
shiftMonth(months, staticMode = false) {
|
|
18
|
-
this.setDatesFromRange(this.dateRange().shiftMonths(months));
|
|
19
|
-
if (staticMode && this.calendarMode() !== 'months') {
|
|
20
|
-
this.setCalendarMode('days');
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
this.resetTimeRange();
|
|
24
|
-
this.setCalendarMode('months');
|
|
25
|
-
}
|
|
26
|
-
shiftDay(days) {
|
|
27
|
-
this.setDatesFromRange(this.dateRange().shiftDays(days));
|
|
28
|
-
if (this.calendarMode() === 'weeks' && (days === 7 || days === -7)) {
|
|
29
|
-
this.setCalendarMode('weeks');
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
this.setCalendarMode('days');
|
|
33
|
-
}
|
|
34
|
-
shiftYear(years, staticMode = false) {
|
|
35
|
-
this.setDatesFromRange(this.dateRange().shiftYears(years));
|
|
36
|
-
if (staticMode && this.calendarMode() !== 'years') {
|
|
37
|
-
this.setCalendarMode('days');
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
this.resetTimeRange();
|
|
41
|
-
this.setCalendarMode('years');
|
|
42
|
-
}
|
|
43
|
-
/***************************************************************************
|
|
44
|
-
* *
|
|
45
|
-
* Time Shift API *
|
|
46
|
-
* *
|
|
47
|
-
**************************************************************************/
|
|
48
|
-
shiftTime(amount, unit) {
|
|
49
|
-
if (!this.isStartAndEndDatesSet()) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
const newStartDateTime = this.startDateTime().add({ [unit]: amount });
|
|
53
|
-
const newEndDateTime = this.endDateTime().add({ [unit]: amount });
|
|
54
|
-
this.setDateRange(Temporal.PlainDate.from(newStartDateTime), Temporal.PlainDate.from(newEndDateTime));
|
|
55
|
-
this.setTimeRange(Temporal.PlainTime.from(newStartDateTime), Temporal.PlainTime.from(newEndDateTime));
|
|
56
|
-
}
|
|
57
|
-
smartShift(direction = 1) {
|
|
58
|
-
if (this.calendarMode() === 'quarters') {
|
|
59
|
-
const newRange = this.dateRange().shiftMonths(direction * 3);
|
|
60
|
-
this.setDatesFromRange(newRange);
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
if (this.calendarMode() === 'months') {
|
|
64
|
-
const newRange = this.dateRange().shiftMonths(direction);
|
|
65
|
-
this.setDatesFromRange(newRange);
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
if (this.calendarMode() === 'years') {
|
|
69
|
-
const newRange = this.dateRange().shiftYears(direction);
|
|
70
|
-
this.setDatesFromRange(newRange);
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
if (this.calendarMode() === 'weeks') {
|
|
74
|
-
const newRange = this.dateRange().shiftDays(7 * direction);
|
|
75
|
-
this.setDatesFromRange(newRange);
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
const daysDiff = this.dateRange().getDurationInDays();
|
|
79
|
-
const newRange = this.dateRange().shiftDays(daysDiff * direction);
|
|
80
|
-
this.setDatesFromRange(newRange);
|
|
81
|
-
}
|
|
82
|
-
/***************************************************************************
|
|
83
|
-
* *
|
|
84
|
-
* Date Selection API *
|
|
85
|
-
* *
|
|
86
|
-
**************************************************************************/
|
|
87
|
-
selectCurrentDay() {
|
|
88
|
-
this.setDatesFromRange(TemporalUtil.getCurrentDay(this.anchorDate()));
|
|
89
|
-
this.setCalendarMode('days');
|
|
90
|
-
this.resetTimeRange();
|
|
91
|
-
}
|
|
92
|
-
selectYesterday() {
|
|
93
|
-
this.setDatesFromRange(TemporalUtil.getYesterday(this.anchorDate()));
|
|
94
|
-
this.setCalendarMode('days');
|
|
95
|
-
this.resetTimeRange();
|
|
96
|
-
}
|
|
97
|
-
selectCurrentMonth() {
|
|
98
|
-
this.setDatesFromRange(TemporalUtil.getCurrentMonth(this.anchorDate()));
|
|
99
|
-
this.setCalendarMode('months');
|
|
100
|
-
this.resetTimeRange();
|
|
101
|
-
}
|
|
102
|
-
selectCurrentWeek() {
|
|
103
|
-
this.setDatesFromRange(TemporalUtil.getCurrentWeek(this.anchorDate()));
|
|
104
|
-
this.setCalendarMode('weeks');
|
|
105
|
-
this.resetTimeRange();
|
|
106
|
-
}
|
|
107
|
-
selectPreviousWeek() {
|
|
108
|
-
this.setDatesFromRange(TemporalUtil.getPreviousWeek(this.anchorDate()));
|
|
109
|
-
this.setCalendarMode('weeks');
|
|
110
|
-
this.resetTimeRange();
|
|
111
|
-
}
|
|
112
|
-
selectPreviousMonth() {
|
|
113
|
-
this.setDatesFromRange(TemporalUtil.getPreviousMonth(this.anchorDate()));
|
|
114
|
-
this.setCalendarMode('months');
|
|
115
|
-
this.resetTimeRange();
|
|
116
|
-
}
|
|
117
|
-
selectLastThirtyDaysExcludingToday() {
|
|
118
|
-
this.setDatesFromRange(TemporalUtil.getLastThirtyDays(this.anchorDate()));
|
|
119
|
-
this.setCalendarMode('days');
|
|
120
|
-
this.resetTimeRange();
|
|
121
|
-
}
|
|
122
|
-
selectLastThirtyDaysIncludingToday() {
|
|
123
|
-
this.setDatesFromRange(TemporalUtil.getLastThirtyDaysIncludingToday(this.anchorDate()));
|
|
124
|
-
this.setCalendarMode('days');
|
|
125
|
-
this.resetTimeRange();
|
|
126
|
-
}
|
|
127
|
-
selectCurrentYear() {
|
|
128
|
-
this.setDatesFromRange(TemporalUtil.getCurrentYear(this.anchorDate()));
|
|
129
|
-
this.setCalendarMode('years');
|
|
130
|
-
this.resetTimeRange();
|
|
131
|
-
}
|
|
132
|
-
selectPreviousYear() {
|
|
133
|
-
this.setDatesFromRange(TemporalUtil.getPreviousYear(this.anchorDate()));
|
|
134
|
-
this.setCalendarMode('years');
|
|
135
|
-
this.resetTimeRange();
|
|
136
|
-
}
|
|
137
|
-
selectLast365Days() {
|
|
138
|
-
this.setDatesFromRange(TemporalUtil.getLast365Days(this.anchorDate()));
|
|
139
|
-
this.setCalendarMode('days');
|
|
140
|
-
this.resetTimeRange();
|
|
141
|
-
}
|
|
142
|
-
selectCurrentQuarter() {
|
|
143
|
-
this.setDatesFromRange(TemporalUtil.getCurrentQuarter(this.anchorDate()));
|
|
144
|
-
this.setCalendarMode('quarters');
|
|
145
|
-
this.resetTimeRange();
|
|
146
|
-
}
|
|
147
|
-
selectPreviousQuarter() {
|
|
148
|
-
this.setDatesFromRange(TemporalUtil.getPreviousQuarter(this.anchorDate()));
|
|
149
|
-
this.setCalendarMode('quarters');
|
|
150
|
-
this.resetTimeRange();
|
|
151
|
-
}
|
|
152
|
-
selectLastSevenDaysExcludingToday() {
|
|
153
|
-
this.setDatesFromRange(TemporalUtil.getLastSevenDays(this.anchorDate()));
|
|
154
|
-
this.setCalendarMode('days');
|
|
155
|
-
this.resetTimeRange();
|
|
156
|
-
}
|
|
157
|
-
selectLastSevenDaysIncludingToday() {
|
|
158
|
-
this.setDatesFromRange(TemporalUtil.getLastSevenDaysIncludingToday(this.anchorDate()));
|
|
159
|
-
this.setCalendarMode('days');
|
|
160
|
-
this.resetTimeRange();
|
|
161
|
-
}
|
|
162
|
-
/***************************************************************************
|
|
163
|
-
* *
|
|
164
|
-
* Time Selection API *
|
|
165
|
-
* *
|
|
166
|
-
**************************************************************************/
|
|
167
|
-
// time range selections
|
|
168
|
-
selectLastHour() {
|
|
169
|
-
this.selectLastByDuration({ hours: 1 });
|
|
170
|
-
}
|
|
171
|
-
selectLast24Hours() {
|
|
172
|
-
this.selectLastByDuration({ days: 1 });
|
|
173
|
-
}
|
|
174
|
-
selectLastFiveMinutes() {
|
|
175
|
-
this.selectLastByDuration({ minutes: 5 });
|
|
176
|
-
}
|
|
177
|
-
selectLastByDuration(duration) {
|
|
178
|
-
this.refreshBaseReferenceDateTime();
|
|
179
|
-
const end = this.anchorDateTime();
|
|
180
|
-
const start = end.subtract(duration);
|
|
181
|
-
const startPlainDate = Temporal.PlainDate.from(start);
|
|
182
|
-
const startPlainTime = Temporal.PlainTime.from(start);
|
|
183
|
-
this.setDateRange(startPlainDate, this.anchorDate());
|
|
184
|
-
this.setTimeRange(startPlainTime, this.anchorTime());
|
|
185
|
-
this.setCalendarMode('days');
|
|
186
|
-
}
|
|
187
|
-
/***************************************************************************
|
|
188
|
-
* *
|
|
189
|
-
* Private methods *
|
|
190
|
-
* *
|
|
191
|
-
**************************************************************************/
|
|
192
|
-
anchorTime() {
|
|
193
|
-
return this.model.anchorTime();
|
|
194
|
-
}
|
|
195
|
-
anchorDate() {
|
|
196
|
-
return this.model.anchorDate();
|
|
197
|
-
}
|
|
198
|
-
setCalendarMode(mode) {
|
|
199
|
-
this.model.calendarMode.set(mode);
|
|
200
|
-
}
|
|
201
|
-
calendarMode() {
|
|
202
|
-
return this.model.calendarMode();
|
|
203
|
-
}
|
|
204
|
-
dateRange() {
|
|
205
|
-
return this.model.dateRange();
|
|
206
|
-
}
|
|
207
|
-
resetTimeRange() {
|
|
208
|
-
this.setTimeRange(Temporal.PlainTime.from('00:00'), Temporal.PlainTime.from('00:00'));
|
|
209
|
-
}
|
|
210
|
-
setTimeRange(start, end) {
|
|
211
|
-
this.model.setStartTime(start);
|
|
212
|
-
this.model.setEndTime(end);
|
|
213
|
-
}
|
|
214
|
-
setDateRange(start, end) {
|
|
215
|
-
this.model.setStartDate(start);
|
|
216
|
-
this.model.setEndDate(end);
|
|
217
|
-
}
|
|
218
|
-
setDatesFromRange(range) {
|
|
219
|
-
this.setDateRange(range.start, range.end);
|
|
220
|
-
}
|
|
221
|
-
shiftSelectionToAnchorDate() {
|
|
222
|
-
if (!this.isStartAndEndDatesSet() || !this.fixedAnchorDate()) {
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
const range = this.dateRange();
|
|
226
|
-
const endDate = this.fixedAnchorDate();
|
|
227
|
-
const startDate = endDate.subtract({ days: range.getDurationInDays() });
|
|
228
|
-
this.setDateRange(startDate, endDate);
|
|
229
|
-
if (this.calendarMode() === 'months') {
|
|
230
|
-
this.selectCurrentMonth();
|
|
231
|
-
}
|
|
232
|
-
if (this.calendarMode() === 'years') {
|
|
233
|
-
this.selectCurrentYear();
|
|
234
|
-
}
|
|
235
|
-
if (this.calendarMode() === 'weeks') {
|
|
236
|
-
this.selectCurrentWeek();
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
fixedAnchorDate() {
|
|
240
|
-
return this.model.fixedAnchorDate();
|
|
241
|
-
}
|
|
242
|
-
fixedAnchorTime() {
|
|
243
|
-
return this.model.fixedAnchorTime();
|
|
244
|
-
}
|
|
245
|
-
anchorDateTime() {
|
|
246
|
-
return this.model.anchorDateTime();
|
|
247
|
-
}
|
|
248
|
-
startDateTime() {
|
|
249
|
-
return this.model.startDateTime();
|
|
250
|
-
}
|
|
251
|
-
endDateTime() {
|
|
252
|
-
return this.model.endDateTime();
|
|
253
|
-
}
|
|
254
|
-
isStartAndEndDatesSet() {
|
|
255
|
-
return this.model.isStartAndEndDatesSet();
|
|
256
|
-
}
|
|
257
|
-
shiftSelectionToAnchorTime() {
|
|
258
|
-
if (!this.isStartAndEndDatesSet() || !this.fixedAnchorTime()) {
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
const duration = this.startDateTime().until(this.endDateTime());
|
|
262
|
-
const newStartDateTime = this.anchorDateTime().subtract(duration);
|
|
263
|
-
const newEndDateTime = this.anchorDateTime();
|
|
264
|
-
this.setDateRange(Temporal.PlainDate.from(newStartDateTime), Temporal.PlainDate.from(newEndDateTime));
|
|
265
|
-
this.setTimeRange(Temporal.PlainTime.from(newStartDateTime), Temporal.PlainTime.from(newEndDateTime));
|
|
266
|
-
if (this.calendarMode() === 'months') {
|
|
267
|
-
this.selectCurrentMonth();
|
|
268
|
-
}
|
|
269
|
-
if (this.calendarMode() === 'years') {
|
|
270
|
-
this.selectCurrentYear();
|
|
271
|
-
}
|
|
272
|
-
if (this.calendarMode() === 'weeks') {
|
|
273
|
-
this.selectCurrentWeek();
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
refreshBaseReferenceDateTime() {
|
|
277
|
-
const dateTime = Temporal.Now.zonedDateTimeISO();
|
|
278
|
-
const date = Temporal.PlainDate.from(dateTime);
|
|
279
|
-
const time = Temporal.PlainTime.from(dateTime);
|
|
280
|
-
this.model.baseReferenceDate.set(date);
|
|
281
|
-
this.model.baseReferenceTime.set(time);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJ2YWwtcGlja2VyLW1vZGVsLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VsZGVyYnl0ZS9uZ3gtc3RhcnRlci9zcmMvbGliL2NvbXBvbmVudHMvdGltZS9lbGRlci1pbnRlcnZhbC1waWNrZXIvbW9kZWwvaW50ZXJ2YWwtcGlja2VyLW1vZGVsLWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFFaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBR3BFLE1BQU0sT0FBTyx5QkFBeUI7SUFDcEM7Ozs7Z0ZBSTRFO0lBRTVFLFlBQTZCLEtBQTBCO1FBQTFCLFVBQUssR0FBTCxLQUFLLENBQXFCO0lBQUcsQ0FBQztJQUMzRDs7OztnRkFJNEU7SUFFckUsVUFBVSxDQUFDLE1BQWMsRUFBRSxVQUFVLEdBQUcsS0FBSztRQUNsRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQzVELElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQzVCLE9BQU07UUFDUixDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO1FBQ3JCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDaEMsQ0FBQztJQUVNLFFBQVEsQ0FBQyxJQUFZO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDeEQsSUFBSSxJQUFJLENBQUMsWUFB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QUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBQzNCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUMxQixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFTyw0QkFBNEI7UUFDbEMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQ2hELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzlDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3hDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbGVuZGFyTW9kZSwgSW50ZXJ2YWxQaWNrZXJNb2RlbCB9IGZyb20gJy4vaW50ZXJ2YWwtcGlja2VyLW1vZGVsJ1xuaW1wb3J0IHsgVGVtcG9yYWwgfSBmcm9tICdAanMtdGVtcG9yYWwvcG9seWZpbGwnXG5pbXBvcnQgeyBUZW1wb3JhbFBsYWluRGF0ZUludGVydmFsIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tbW9uL3RpbWUvdGVtcG9yYWwtcGxhaW4tZGF0ZS1pbnRlcnZhbCdcbmltcG9ydCB7IFRlbXBvcmFsVXRpbCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbW1vbi90aW1lL3RlbXBvcmFsLXV0aWwnXG5pbXBvcnQgRHVyYXRpb25MaWtlID0gVGVtcG9yYWwuRHVyYXRpb25MaWtlXG5cbmV4cG9ydCBjbGFzcyBJbnRlcnZhbFBpY2tlck1vZGVsRWRpdG9yIHtcbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIENvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBtb2RlbDogSW50ZXJ2YWxQaWNrZXJNb2RlbCkge31cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIERhdGUgU2hpZnQgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIHNoaWZ0TW9udGgobW9udGhzOiBudW1iZXIsIHN0YXRpY01vZGUgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UodGhpcy5kYXRlUmFuZ2UoKS5zaGlmdE1vbnRocyhtb250aHMpKVxuICAgIGlmIChzdGF0aWNNb2RlICYmIHRoaXMuY2FsZW5kYXJNb2RlKCkgIT09ICdtb250aHMnKSB7XG4gICAgICB0aGlzLnNldENhbGVuZGFyTW9kZSgnZGF5cycpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ21vbnRocycpXG4gIH1cblxuICBwdWJsaWMgc2hpZnREYXkoZGF5czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZSh0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0RGF5cyhkYXlzKSlcbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3dlZWtzJyAmJiAoZGF5cyA9PT0gNyB8fCBkYXlzID09PSAtNykpIHtcbiAgICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCd3ZWVrcycpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ2RheXMnKVxuICB9XG5cbiAgcHVibGljIHNoaWZ0WWVhcih5ZWFyczogbnVtYmVyLCBzdGF0aWNNb2RlID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKHRoaXMuZGF0ZVJhbmdlKCkuc2hpZnRZZWFycyh5ZWFycykpXG4gICAgaWYgKHN0YXRpY01vZGUgJiYgdGhpcy5jYWxlbmRhck1vZGUoKSAhPT0gJ3llYXJzJykge1xuICAgICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ2RheXMnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCd5ZWFycycpXG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogVGltZSBTaGlmdCBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwdWJsaWMgc2hpZnRUaW1lKGFtb3VudDogbnVtYmVyLCB1bml0OiAnaG91cnMnIHwgJ21pbnV0ZXMnKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzU3RhcnRBbmRFbmREYXRlc1NldCgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBuZXdTdGFydERhdGVUaW1lID0gdGhpcy5zdGFydERhdGVUaW1lKCkuYWRkKHsgW3VuaXRdOiBhbW91bnQgfSlcbiAgICBjb25zdCBuZXdFbmREYXRlVGltZSA9IHRoaXMuZW5kRGF0ZVRpbWUoKS5hZGQoeyBbdW5pdF06IGFtb3VudCB9KVxuXG4gICAgdGhpcy5zZXREYXRlUmFuZ2UoXG4gICAgICBUZW1wb3JhbC5QbGFpbkRhdGUuZnJvbShuZXdTdGFydERhdGVUaW1lKSxcbiAgICAgIFRlbXBvcmFsLlBsYWluRGF0ZS5mcm9tKG5ld0VuZERhdGVUaW1lKVxuICAgIClcbiAgICB0aGlzLnNldFRpbWVSYW5nZShcbiAgICAgIFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKG5ld1N0YXJ0RGF0ZVRpbWUgYXMgVGVtcG9yYWwuUGxhaW5EYXRlVGltZSksXG4gICAgICBUZW1wb3JhbC5QbGFpblRpbWUuZnJvbShuZXdFbmREYXRlVGltZSBhcyBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lKVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBzbWFydFNoaWZ0KGRpcmVjdGlvbiA9IDEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3F1YXJ0ZXJzJykge1xuICAgICAgY29uc3QgbmV3UmFuZ2UgPSB0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0TW9udGhzKGRpcmVjdGlvbiAqIDMpXG4gICAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKG5ld1JhbmdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICdtb250aHMnKSB7XG4gICAgICBjb25zdCBuZXdSYW5nZSA9IHRoaXMuZGF0ZVJhbmdlKCkuc2hpZnRNb250aHMoZGlyZWN0aW9uKVxuICAgICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShuZXdSYW5nZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAneWVhcnMnKSB7XG4gICAgICBjb25zdCBuZXdSYW5nZSA9IHRoaXMuZGF0ZVJhbmdlKCkuc2hpZnRZZWFycyhkaXJlY3Rpb24pXG4gICAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKG5ld1JhbmdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICd3ZWVrcycpIHtcbiAgICAgIGNvbnN0IG5ld1JhbmdlID0gdGhpcy5kYXRlUmFuZ2UoKS5zaGlmdERheXMoNyAqIGRpcmVjdGlvbilcbiAgICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UobmV3UmFuZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkYXlzRGlmZiA9IHRoaXMuZGF0ZVJhbmdlKCkuZ2V0RHVyYXRpb25JbkRheXMoKVxuICAgIGNvbnN0IG5ld1JhbmdlID0gdGhpcy5kYXRlUmFuZ2UoKS5zaGlmdERheXMoZGF5c0RpZmYgKiBkaXJlY3Rpb24pXG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShuZXdSYW5nZSlcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBEYXRlIFNlbGVjdGlvbiBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHB1YmxpYyBzZWxlY3RDdXJyZW50RGF5KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldEN1cnJlbnREYXkodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCdkYXlzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RZZXN0ZXJkYXkoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0WWVzdGVyZGF5KHRoaXMuYW5jaG9yRGF0ZSgpKSlcbiAgICB0aGlzLnNldENhbGVuZGFyTW9kZSgnZGF5cycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBwdWJsaWMgc2VsZWN0Q3VycmVudE1vbnRoKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldEN1cnJlbnRNb250aCh0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ21vbnRocycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBwdWJsaWMgc2VsZWN0Q3VycmVudFdlZWsoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0Q3VycmVudFdlZWsodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCd3ZWVrcycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBwdWJsaWMgc2VsZWN0UHJldmlvdXNXZWVrKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldFByZXZpb3VzV2Vlayh0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ3dlZWtzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RQcmV2aW91c01vbnRoKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldFByZXZpb3VzTW9udGgodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCdtb250aHMnKVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICB9XG5cbiAgcHVibGljIHNlbGVjdExhc3RUaGlydHlEYXlzRXhjbHVkaW5nVG9kYXkoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0TGFzdFRoaXJ0eURheXModGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCdkYXlzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RMYXN0VGhpcnR5RGF5c0luY2x1ZGluZ1RvZGF5KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldExhc3RUaGlydHlEYXlzSW5jbHVkaW5nVG9kYXkodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCdkYXlzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RDdXJyZW50WWVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRDdXJyZW50WWVhcih0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ3llYXJzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RQcmV2aW91c1llYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0UHJldmlvdXNZZWFyKHRoaXMuYW5jaG9yRGF0ZSgpKSlcbiAgICB0aGlzLnNldENhbGVuZGFyTW9kZSgneWVhcnMnKVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICB9XG5cbiAgcHVibGljIHNlbGVjdExhc3QzNjVEYXlzKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldExhc3QzNjVEYXlzKHRoaXMuYW5jaG9yRGF0ZSgpKSlcbiAgICB0aGlzLnNldENhbGVuZGFyTW9kZSgnZGF5cycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBwdWJsaWMgc2VsZWN0Q3VycmVudFF1YXJ0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0Q3VycmVudFF1YXJ0ZXIodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCdxdWFydGVycycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBwdWJsaWMgc2VsZWN0UHJldmlvdXNRdWFydGVyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldFByZXZpb3VzUXVhcnRlcih0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ3F1YXJ0ZXJzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RMYXN0U2V2ZW5EYXlzRXhjbHVkaW5nVG9kYXkoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0TGFzdFNldmVuRGF5cyh0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ2RheXMnKVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICB9XG5cbiAgcHVibGljIHNlbGVjdExhc3RTZXZlbkRheXNJbmNsdWRpbmdUb2RheSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRMYXN0U2V2ZW5EYXlzSW5jbHVkaW5nVG9kYXkodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCdkYXlzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBUaW1lIFNlbGVjdGlvbiBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8vIHRpbWUgcmFuZ2Ugc2VsZWN0aW9uc1xuICBwdWJsaWMgc2VsZWN0TGFzdEhvdXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RMYXN0QnlEdXJhdGlvbih7IGhvdXJzOiAxIH0pXG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TGFzdDI0SG91cnMoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RMYXN0QnlEdXJhdGlvbih7IGRheXM6IDEgfSlcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RMYXN0Rml2ZU1pbnV0ZXMoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RMYXN0QnlEdXJhdGlvbih7IG1pbnV0ZXM6IDUgfSlcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0TGFzdEJ5RHVyYXRpb24oZHVyYXRpb246IFRlbXBvcmFsLkR1cmF0aW9uIHwgRHVyYXRpb25MaWtlKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoQmFzZVJlZmVyZW5jZURhdGVUaW1lKClcblxuICAgIGNvbnN0IGVuZCA9IHRoaXMuYW5jaG9yRGF0ZVRpbWUoKVxuICAgIGNvbnN0IHN0YXJ0ID0gZW5kLnN1YnRyYWN0KGR1cmF0aW9uKVxuICAgIGNvbnN0IHN0YXJ0UGxhaW5EYXRlID0gVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20oc3RhcnQpXG4gICAgY29uc3Qgc3RhcnRQbGFpblRpbWUgPSBUZW1wb3JhbC5QbGFpblRpbWUuZnJvbShzdGFydClcblxuICAgIHRoaXMuc2V0RGF0ZVJhbmdlKHN0YXJ0UGxhaW5EYXRlLCB0aGlzLmFuY2hvckRhdGUoKSlcbiAgICB0aGlzLnNldFRpbWVSYW5nZShzdGFydFBsYWluVGltZSwgdGhpcy5hbmNob3JUaW1lKCkpXG5cbiAgICB0aGlzLnNldENhbGVuZGFyTW9kZSgnZGF5cycpXG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHJpdmF0ZSBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgcHJpdmF0ZSBhbmNob3JUaW1lKCk6IFRlbXBvcmFsLlBsYWluVGltZSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuYW5jaG9yVGltZSgpXG4gIH1cbiAgcHJpdmF0ZSBhbmNob3JEYXRlKCk6IFRlbXBvcmFsLlBsYWluRGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuYW5jaG9yRGF0ZSgpXG4gIH1cblxuICBwcml2YXRlIHNldENhbGVuZGFyTW9kZShtb2RlOiBDYWxlbmRhck1vZGUpIHtcbiAgICB0aGlzLm1vZGVsLmNhbGVuZGFyTW9kZS5zZXQobW9kZSlcbiAgfVxuXG4gIHByaXZhdGUgY2FsZW5kYXJNb2RlKCk6IENhbGVuZGFyTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuY2FsZW5kYXJNb2RlKClcbiAgfVxuXG4gIHByaXZhdGUgZGF0ZVJhbmdlKCk6IFRlbXBvcmFsUGxhaW5EYXRlSW50ZXJ2YWwge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLmRhdGVSYW5nZSgpXG4gIH1cblxuICBwcml2YXRlIHJlc2V0VGltZVJhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0VGltZVJhbmdlKFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKCcwMDowMCcpLCBUZW1wb3JhbC5QbGFpblRpbWUuZnJvbSgnMDA6MDAnKSlcbiAgfVxuXG4gIHByaXZhdGUgc2V0VGltZVJhbmdlKHN0YXJ0OiBUZW1wb3JhbC5QbGFpblRpbWUsIGVuZDogVGVtcG9yYWwuUGxhaW5UaW1lKSB7XG4gICAgdGhpcy5tb2RlbC5zZXRTdGFydFRpbWUoc3RhcnQpXG4gICAgdGhpcy5tb2RlbC5zZXRFbmRUaW1lKGVuZClcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGF0ZVJhbmdlKHN0YXJ0OiBUZW1wb3JhbC5QbGFpbkRhdGUsIGVuZDogVGVtcG9yYWwuUGxhaW5EYXRlKSB7XG4gICAgdGhpcy5tb2RlbC5zZXRTdGFydERhdGUoc3RhcnQpXG4gICAgdGhpcy5tb2RlbC5zZXRFbmREYXRlKGVuZClcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGF0ZXNGcm9tUmFuZ2UocmFuZ2U6IFRlbXBvcmFsUGxhaW5EYXRlSW50ZXJ2YWwpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVSYW5nZShyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKVxuICB9XG5cbiAgcHVibGljIHNoaWZ0U2VsZWN0aW9uVG9BbmNob3JEYXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSB8fCAhdGhpcy5maXhlZEFuY2hvckRhdGUoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLmRhdGVSYW5nZSgpXG4gICAgY29uc3QgZW5kRGF0ZSA9IHRoaXMuZml4ZWRBbmNob3JEYXRlKClcbiAgICBjb25zdCBzdGFydERhdGUgPSBlbmREYXRlLnN1YnRyYWN0KHsgZGF5czogcmFuZ2UuZ2V0RHVyYXRpb25JbkRheXMoKSB9KVxuICAgIHRoaXMuc2V0RGF0ZVJhbmdlKHN0YXJ0RGF0ZSwgZW5kRGF0ZSlcblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAnbW9udGhzJykge1xuICAgICAgdGhpcy5zZWxlY3RDdXJyZW50TW9udGgoKVxuICAgIH1cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3llYXJzJykge1xuICAgICAgdGhpcy5zZWxlY3RDdXJyZW50WWVhcigpXG4gICAgfVxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAnd2Vla3MnKSB7XG4gICAgICB0aGlzLnNlbGVjdEN1cnJlbnRXZWVrKClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpeGVkQW5jaG9yRGF0ZSgpOiBUZW1wb3JhbC5QbGFpbkRhdGUge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLmZpeGVkQW5jaG9yRGF0ZSgpXG4gIH1cblxuICBwcml2YXRlIGZpeGVkQW5jaG9yVGltZSgpOiBUZW1wb3JhbC5QbGFpblRpbWUge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLmZpeGVkQW5jaG9yVGltZSgpXG4gIH1cblxuICBwcml2YXRlIGFuY2hvckRhdGVUaW1lKCk6IFRlbXBvcmFsLlBsYWluRGF0ZVRpbWUge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLmFuY2hvckRhdGVUaW1lKClcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnREYXRlVGltZSgpOiBUZW1wb3JhbC5QbGFpbkRhdGUgfCBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5zdGFydERhdGVUaW1lKClcbiAgfVxuXG4gIHByaXZhdGUgZW5kRGF0ZVRpbWUoKTogVGVtcG9yYWwuUGxhaW5EYXRlIHwgVGVtcG9yYWwuUGxhaW5EYXRlVGltZSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuZW5kRGF0ZVRpbWUoKVxuICB9XG5cbiAgcHJpdmF0ZSBpc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuaXNTdGFydEFuZEVuZERhdGVzU2V0KClcbiAgfVxuXG4gIHB1YmxpYyBzaGlmdFNlbGVjdGlvblRvQW5jaG9yVGltZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNTdGFydEFuZEVuZERhdGVzU2V0KCkgfHwgIXRoaXMuZml4ZWRBbmNob3JUaW1lKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5zdGFydERhdGVUaW1lKCkudW50aWwodGhpcy5lbmREYXRlVGltZSgpKVxuICAgIGNvbnN0IG5ld1N0YXJ0RGF0ZVRpbWUgPSB0aGlzLmFuY2hvckRhdGVUaW1lKCkuc3VidHJhY3QoZHVyYXRpb24pXG4gICAgY29uc3QgbmV3RW5kRGF0ZVRpbWUgPSB0aGlzLmFuY2hvckRhdGVUaW1lKClcbiAgICB0aGlzLnNldERhdGVSYW5nZShcbiAgICAgIFRlbXBvcmFsLlBsYWluRGF0ZS5mcm9tKG5ld1N0YXJ0RGF0ZVRpbWUpLFxuICAgICAgVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20obmV3RW5kRGF0ZVRpbWUpXG4gICAgKVxuICAgIHRoaXMuc2V0VGltZVJhbmdlKFxuICAgICAgVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20obmV3U3RhcnREYXRlVGltZSksXG4gICAgICBUZW1wb3JhbC5QbGFpblRpbWUuZnJvbShuZXdFbmREYXRlVGltZSlcbiAgICApXG5cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudE1vbnRoKClcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICd5ZWFycycpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudFllYXIoKVxuICAgIH1cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3dlZWtzJykge1xuICAgICAgdGhpcy5zZWxlY3RDdXJyZW50V2VlaygpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoQmFzZVJlZmVyZW5jZURhdGVUaW1lKCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGVUaW1lID0gVGVtcG9yYWwuTm93LnpvbmVkRGF0ZVRpbWVJU08oKVxuICAgIGNvbnN0IGRhdGUgPSBUZW1wb3JhbC5QbGFpbkRhdGUuZnJvbShkYXRlVGltZSlcbiAgICBjb25zdCB0aW1lID0gVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20oZGF0ZVRpbWUpXG4gICAgdGhpcy5tb2RlbC5iYXNlUmVmZXJlbmNlRGF0ZS5zZXQoZGF0ZSlcbiAgICB0aGlzLm1vZGVsLmJhc2VSZWZlcmVuY2VUaW1lLnNldCh0aW1lKVxuICB9XG59XG4iXX0=
|