nxt-pick-datetime 11.0.0 → 13.0.1
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/README.md +221 -221
- package/assets/picker.scss +668 -668
- package/esm2020/lib/class/date-time-adapter.class.mjs +112 -0
- package/esm2020/lib/class/date-time-format.class.mjs +4 -0
- package/esm2020/lib/class/date-time.class.mjs +161 -0
- package/esm2020/lib/class/dialog-config.class.mjs +56 -0
- package/esm2020/lib/class/dialog-ref.class.mjs +121 -0
- package/esm2020/lib/date-time/calendar/calendar.component.mjs +345 -0
- package/esm2020/lib/date-time/calendar-body/calendar-body.component.mjs +145 -0
- package/esm2020/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +438 -0
- package/esm2020/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +359 -0
- package/esm2020/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +369 -0
- package/esm2020/lib/date-time/date-time-inline/date-time-inline.component.mjs +264 -0
- package/esm2020/lib/date-time/date-time-picker/date-time-picker.component.mjs +529 -0
- package/esm2020/lib/date-time/date-time-picker-container/date-time-picker-container.animations.mjs +18 -0
- package/esm2020/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +390 -0
- package/esm2020/lib/date-time/date-time-picker-input.directive.mjs +624 -0
- package/esm2020/lib/date-time/date-time-picker-intl.service.mjs +61 -0
- package/esm2020/lib/date-time/date-time-picker-trigger.directive.mjs +68 -0
- package/esm2020/lib/date-time/date-time.module.mjs +88 -0
- package/esm2020/lib/date-time/number-fixed-len.pipe.mjs +25 -0
- package/esm2020/lib/date-time/timer/timer.component.mjs +292 -0
- package/esm2020/lib/date-time/timer-box/timer-box.component.mjs +88 -0
- package/esm2020/lib/dialog/dialog-container/dialog-container.component.mjs +243 -0
- package/esm2020/lib/dialog/dialog.module.mjs +34 -0
- package/esm2020/lib/dialog/dialog.service.mjs +240 -0
- package/esm2020/lib/utils/object.mjs +23 -0
- package/esm2020/moment-adapter/date-time-adapter.class.mjs +215 -0
- package/{esm2015/moment-adapter/date-time-format.class.js → esm2020/moment-adapter/date-time-format.class.mjs} +1 -1
- package/esm2020/moment-adapter/moment-adapter.module.mjs +41 -0
- package/esm2020/moment-adapter/nxt-pick-datetime-moment-adapter.mjs +5 -0
- package/{esm2015/moment-adapter/public-api.js → esm2020/moment-adapter/public-api.mjs} +1 -1
- package/esm2020/native-adapter/date-time-adapter.class.mjs +344 -0
- package/{esm2015/native-adapter/date-time-format.class.js → esm2020/native-adapter/date-time-format.class.mjs} +1 -1
- package/esm2020/native-adapter/native-adapter.module.mjs +35 -0
- package/esm2020/native-adapter/nxt-pick-datetime-native-adapter.mjs +5 -0
- package/{esm2015/native-adapter/public-api.js → esm2020/native-adapter/public-api.mjs} +1 -1
- package/esm2020/nxt-pick-datetime.mjs +5 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +1 -1
- package/fesm2015/nxt-pick-datetime-moment-adapter.mjs +269 -0
- package/fesm2015/nxt-pick-datetime-moment-adapter.mjs.map +1 -0
- package/fesm2015/{nxt-pick-datetime-native-adapter.js → nxt-pick-datetime-native-adapter.mjs} +41 -27
- package/fesm2015/nxt-pick-datetime-native-adapter.mjs.map +1 -0
- package/fesm2015/nxt-pick-datetime.mjs +4974 -0
- package/fesm2015/nxt-pick-datetime.mjs.map +1 -0
- package/{fesm2015/nxt-pick-datetime-moment-adapter.js → fesm2020/nxt-pick-datetime-moment-adapter.mjs} +48 -27
- package/fesm2020/nxt-pick-datetime-moment-adapter.mjs.map +1 -0
- package/fesm2020/nxt-pick-datetime-native-adapter.mjs +390 -0
- package/fesm2020/nxt-pick-datetime-native-adapter.mjs.map +1 -0
- package/{fesm2015/nxt-pick-datetime.js → fesm2020/nxt-pick-datetime.mjs} +2207 -1967
- package/fesm2020/nxt-pick-datetime.mjs.map +1 -0
- package/lib/class/date-time.class.d.ts +3 -0
- package/lib/class/dialog-ref.class.d.ts +2 -0
- package/lib/date-time/calendar/calendar.component.d.ts +3 -0
- package/lib/date-time/calendar-body/calendar-body.component.d.ts +3 -0
- package/lib/date-time/calendar-month-view/calendar-month-view.component.d.ts +3 -0
- package/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +3 -0
- package/lib/date-time/calendar-year-view/calendar-year-view.component.d.ts +3 -0
- package/lib/date-time/date-time-inline/date-time-inline.component.d.ts +3 -0
- package/lib/date-time/date-time-picker/date-time-picker.component.d.ts +3 -0
- package/lib/date-time/date-time-picker-container/date-time-picker-container.component.d.ts +3 -0
- package/lib/date-time/date-time-picker-input.directive.d.ts +3 -0
- package/lib/date-time/date-time-picker-intl.service.d.ts +3 -0
- package/lib/date-time/date-time-picker-trigger.directive.d.ts +3 -0
- package/lib/date-time/date-time.module.d.ts +21 -0
- package/lib/date-time/number-fixed-len.pipe.d.ts +3 -0
- package/lib/date-time/timer/timer.component.d.ts +3 -0
- package/lib/date-time/timer-box/timer-box.component.d.ts +3 -0
- package/lib/dialog/dialog-container/dialog-container.component.d.ts +5 -2
- package/lib/dialog/dialog.module.d.ts +9 -0
- package/lib/dialog/dialog.service.d.ts +6 -2
- package/moment-adapter/date-time-adapter.class.d.ts +3 -0
- package/moment-adapter/moment-adapter.module.d.ts +7 -0
- package/moment-adapter/nxt-pick-datetime-moment-adapter.d.ts +1 -3
- package/moment-adapter/package.json +6 -7
- package/native-adapter/date-time-adapter.class.d.ts +3 -0
- package/native-adapter/native-adapter.module.d.ts +8 -0
- package/native-adapter/nxt-pick-datetime-native-adapter.d.ts +1 -3
- package/native-adapter/package.json +6 -7
- package/nxt-pick-datetime.d.ts +1 -14
- package/package.json +44 -13
- package/bundles/nxt-pick-datetime-moment-adapter.umd.js +0 -579
- package/bundles/nxt-pick-datetime-moment-adapter.umd.js.map +0 -1
- package/bundles/nxt-pick-datetime-moment-adapter.umd.min.js +0 -16
- package/bundles/nxt-pick-datetime-moment-adapter.umd.min.js.map +0 -1
- package/bundles/nxt-pick-datetime-native-adapter.umd.js +0 -706
- package/bundles/nxt-pick-datetime-native-adapter.umd.js.map +0 -1
- package/bundles/nxt-pick-datetime-native-adapter.umd.min.js +0 -16
- package/bundles/nxt-pick-datetime-native-adapter.umd.min.js.map +0 -1
- package/bundles/nxt-pick-datetime.umd.js +0 -5809
- package/bundles/nxt-pick-datetime.umd.js.map +0 -1
- package/bundles/nxt-pick-datetime.umd.min.js +0 -17
- package/bundles/nxt-pick-datetime.umd.min.js.map +0 -1
- package/esm2015/lib/class/date-time-adapter.class.js +0 -112
- package/esm2015/lib/class/date-time-format.class.js +0 -4
- package/esm2015/lib/class/date-time.class.js +0 -151
- package/esm2015/lib/class/dialog-config.class.js +0 -56
- package/esm2015/lib/class/dialog-ref.class.js +0 -113
- package/esm2015/lib/date-time/calendar/calendar.component.js +0 -331
- package/esm2015/lib/date-time/calendar-body/calendar-body.component.js +0 -144
- package/esm2015/lib/date-time/calendar-month-view/calendar-month-view.component.js +0 -425
- package/esm2015/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.js +0 -347
- package/esm2015/lib/date-time/calendar-year-view/calendar-year-view.component.js +0 -356
- package/esm2015/lib/date-time/date-time-inline/date-time-inline.component.js +0 -246
- package/esm2015/lib/date-time/date-time-picker/date-time-picker.component.js +0 -511
- package/esm2015/lib/date-time/date-time-picker-container/date-time-picker-container.animations.js +0 -18
- package/esm2015/lib/date-time/date-time-picker-container/date-time-picker-container.component.js +0 -373
- package/esm2015/lib/date-time/date-time-picker-input.directive.js +0 -592
- package/esm2015/lib/date-time/date-time-picker-intl.service.js +0 -59
- package/esm2015/lib/date-time/date-time-picker-trigger.directive.js +0 -63
- package/esm2015/lib/date-time/date-time.module.js +0 -60
- package/esm2015/lib/date-time/number-fixed-len.pipe.js +0 -21
- package/esm2015/lib/date-time/timer/timer.component.js +0 -287
- package/esm2015/lib/date-time/timer-box/timer-box.component.js +0 -77
- package/esm2015/lib/dialog/dialog-container/dialog-container.component.js +0 -202
- package/esm2015/lib/dialog/dialog.module.js +0 -26
- package/esm2015/lib/dialog/dialog.service.js +0 -225
- package/esm2015/lib/utils/object.js +0 -23
- package/esm2015/moment-adapter/date-time-adapter.class.js +0 -206
- package/esm2015/moment-adapter/moment-adapter.module.js +0 -28
- package/esm2015/moment-adapter/nxt-pick-datetime-moment-adapter.js +0 -8
- package/esm2015/native-adapter/date-time-adapter.class.js +0 -342
- package/esm2015/native-adapter/native-adapter.module.js +0 -26
- package/esm2015/native-adapter/nxt-pick-datetime-native-adapter.js +0 -8
- package/esm2015/nxt-pick-datetime.js +0 -19
- package/fesm2015/nxt-pick-datetime-moment-adapter.js.map +0 -1
- package/fesm2015/nxt-pick-datetime-native-adapter.js.map +0 -1
- package/fesm2015/nxt-pick-datetime.js.map +0 -1
- package/moment-adapter/nxt-pick-datetime-moment-adapter.metadata.json +0 -1
- package/native-adapter/nxt-pick-datetime-native-adapter.metadata.json +0 -1
- package/nxt-pick-datetime.metadata.json +0 -1
package/esm2015/lib/date-time/date-time-picker-container/date-time-picker-container.component.js
DELETED
|
@@ -1,373 +0,0 @@
|
|
|
1
|
-
import { DOWN_ARROW, LEFT_ARROW, RIGHT_ARROW, SPACE, UP_ARROW } from '@angular/cdk/keycodes';
|
|
2
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, HostListener, Optional, ViewChild } from '@angular/core';
|
|
3
|
-
import { Subject } from 'rxjs';
|
|
4
|
-
import { DateTimeAdapter } from '../../class/date-time-adapter.class';
|
|
5
|
-
import { OwlCalendarComponent } from '../calendar/calendar.component';
|
|
6
|
-
import { OwlDateTimeIntl } from '../date-time-picker-intl.service';
|
|
7
|
-
import { OwlTimerComponent } from '../timer/timer.component';
|
|
8
|
-
import { owlDateTimePickerAnimations } from './date-time-picker-container.animations';
|
|
9
|
-
export class OwlDateTimeContainerComponent {
|
|
10
|
-
constructor(cdRef, elmRef, pickerIntl, dateTimeAdapter) {
|
|
11
|
-
this.cdRef = cdRef;
|
|
12
|
-
this.elmRef = elmRef;
|
|
13
|
-
this.pickerIntl = pickerIntl;
|
|
14
|
-
this.dateTimeAdapter = dateTimeAdapter;
|
|
15
|
-
this.activeSelectedIndex = 0; // The current active SelectedIndex in range select mode (0: 'from', 1: 'to')
|
|
16
|
-
/**
|
|
17
|
-
* Stream emits when try to hide picker
|
|
18
|
-
* */
|
|
19
|
-
this.hidePicker$ = new Subject();
|
|
20
|
-
/**
|
|
21
|
-
* Stream emits when try to confirm the selected value
|
|
22
|
-
* */
|
|
23
|
-
this.confirmSelected$ = new Subject();
|
|
24
|
-
this.pickerOpened$ = new Subject();
|
|
25
|
-
}
|
|
26
|
-
get hidePickerStream() {
|
|
27
|
-
return this.hidePicker$.asObservable();
|
|
28
|
-
}
|
|
29
|
-
get confirmSelectedStream() {
|
|
30
|
-
return this.confirmSelected$.asObservable();
|
|
31
|
-
}
|
|
32
|
-
get pickerOpenedStream() {
|
|
33
|
-
return this.pickerOpened$.asObservable();
|
|
34
|
-
}
|
|
35
|
-
get pickerMoment() {
|
|
36
|
-
return this._clamPickerMoment;
|
|
37
|
-
}
|
|
38
|
-
set pickerMoment(value) {
|
|
39
|
-
if (value) {
|
|
40
|
-
this._clamPickerMoment = this.dateTimeAdapter.clampDate(value, this.picker.minDateTime, this.picker.maxDateTime);
|
|
41
|
-
}
|
|
42
|
-
this.cdRef.markForCheck();
|
|
43
|
-
}
|
|
44
|
-
get pickerType() {
|
|
45
|
-
return this.picker.pickerType;
|
|
46
|
-
}
|
|
47
|
-
get cancelLabel() {
|
|
48
|
-
return this.pickerIntl.cancelBtnLabel;
|
|
49
|
-
}
|
|
50
|
-
get setLabel() {
|
|
51
|
-
return this.pickerIntl.setBtnLabel;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* The range 'from' label
|
|
55
|
-
* */
|
|
56
|
-
get fromLabel() {
|
|
57
|
-
return this.pickerIntl.rangeFromLabel;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* The range 'to' label
|
|
61
|
-
* */
|
|
62
|
-
get toLabel() {
|
|
63
|
-
return this.pickerIntl.rangeToLabel;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* The range 'from' formatted value
|
|
67
|
-
* */
|
|
68
|
-
get fromFormattedValue() {
|
|
69
|
-
const value = this.picker.selecteds[0];
|
|
70
|
-
return value
|
|
71
|
-
? this.dateTimeAdapter.format(value, this.picker.formatString)
|
|
72
|
-
: '';
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* The range 'to' formatted value
|
|
76
|
-
* */
|
|
77
|
-
get toFormattedValue() {
|
|
78
|
-
const value = this.picker.selecteds[1];
|
|
79
|
-
return value
|
|
80
|
-
? this.dateTimeAdapter.format(value, this.picker.formatString)
|
|
81
|
-
: '';
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Cases in which the control buttons show in the picker
|
|
85
|
-
* 1) picker mode is 'dialog'
|
|
86
|
-
* 2) picker type is NOT 'calendar' and the picker mode is NOT 'inline'
|
|
87
|
-
* */
|
|
88
|
-
get showControlButtons() {
|
|
89
|
-
return (this.picker.pickerMode === 'dialog' ||
|
|
90
|
-
(this.picker.pickerType !== 'calendar' &&
|
|
91
|
-
this.picker.pickerMode !== 'inline'));
|
|
92
|
-
}
|
|
93
|
-
get containerElm() {
|
|
94
|
-
return this.elmRef.nativeElement;
|
|
95
|
-
}
|
|
96
|
-
get owlDTContainerClass() {
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
99
|
-
get owlDTPopupContainerClass() {
|
|
100
|
-
return this.picker.pickerMode === 'popup';
|
|
101
|
-
}
|
|
102
|
-
get owlDTDialogContainerClass() {
|
|
103
|
-
return this.picker.pickerMode === 'dialog';
|
|
104
|
-
}
|
|
105
|
-
get owlDTInlineContainerClass() {
|
|
106
|
-
return this.picker.pickerMode === 'inline';
|
|
107
|
-
}
|
|
108
|
-
get owlDTContainerDisabledClass() {
|
|
109
|
-
return this.picker.disabled;
|
|
110
|
-
}
|
|
111
|
-
get owlDTContainerId() {
|
|
112
|
-
return this.picker.id;
|
|
113
|
-
}
|
|
114
|
-
get owlDTContainerAnimation() {
|
|
115
|
-
return this.picker.pickerMode === 'inline' ? '' : 'enter';
|
|
116
|
-
}
|
|
117
|
-
ngOnInit() { }
|
|
118
|
-
ngAfterContentInit() {
|
|
119
|
-
this.initPicker();
|
|
120
|
-
}
|
|
121
|
-
ngAfterViewInit() {
|
|
122
|
-
this.focusPicker();
|
|
123
|
-
}
|
|
124
|
-
handleContainerAnimationDone(event) {
|
|
125
|
-
const toState = event.toState;
|
|
126
|
-
if (toState === 'enter') {
|
|
127
|
-
this.pickerOpened$.next();
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
dateSelected(date) {
|
|
131
|
-
let result;
|
|
132
|
-
if (this.picker.isInSingleMode) {
|
|
133
|
-
result = this.dateSelectedInSingleMode(date);
|
|
134
|
-
if (result) {
|
|
135
|
-
this.pickerMoment = result;
|
|
136
|
-
this.picker.select(result);
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
// we close the picker when result is null and pickerType is calendar.
|
|
140
|
-
if (this.pickerType === 'calendar') {
|
|
141
|
-
this.hidePicker$.next(null);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
if (this.picker.isInRangeMode) {
|
|
147
|
-
result = this.dateSelectedInRangeMode(date);
|
|
148
|
-
if (result) {
|
|
149
|
-
this.pickerMoment = result[this.activeSelectedIndex];
|
|
150
|
-
this.picker.select(result);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
timeSelected(time) {
|
|
155
|
-
this.pickerMoment = this.dateTimeAdapter.clone(time);
|
|
156
|
-
if (!this.picker.dateTimeChecker(this.pickerMoment)) {
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
if (this.picker.isInSingleMode) {
|
|
160
|
-
this.picker.select(this.pickerMoment);
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
if (this.picker.isInRangeMode) {
|
|
164
|
-
const selecteds = [...this.picker.selecteds];
|
|
165
|
-
// check if the 'from' is after 'to' or 'to'is before 'from'
|
|
166
|
-
// In this case, we set both the 'from' and 'to' the same value
|
|
167
|
-
if ((this.activeSelectedIndex === 0 &&
|
|
168
|
-
selecteds[1] &&
|
|
169
|
-
this.dateTimeAdapter.compare(this.pickerMoment, selecteds[1]) === 1) ||
|
|
170
|
-
(this.activeSelectedIndex === 1 &&
|
|
171
|
-
selecteds[0] &&
|
|
172
|
-
this.dateTimeAdapter.compare(this.pickerMoment, selecteds[0]) === -1)) {
|
|
173
|
-
selecteds[0] = this.pickerMoment;
|
|
174
|
-
selecteds[1] = this.pickerMoment;
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
selecteds[this.activeSelectedIndex] = this.pickerMoment;
|
|
178
|
-
}
|
|
179
|
-
this.picker.select(selecteds);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Handle click on cancel button
|
|
184
|
-
*/
|
|
185
|
-
onCancelClicked(event) {
|
|
186
|
-
this.hidePicker$.next(null);
|
|
187
|
-
event.preventDefault();
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Handle click on set button
|
|
192
|
-
*/
|
|
193
|
-
onSetClicked(event) {
|
|
194
|
-
if (!this.picker.dateTimeChecker(this.pickerMoment)) {
|
|
195
|
-
this.hidePicker$.next(null);
|
|
196
|
-
event.preventDefault();
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
this.confirmSelected$.next(event);
|
|
200
|
-
event.preventDefault();
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Handle click on inform radio group
|
|
205
|
-
*/
|
|
206
|
-
handleClickOnInfoGroup(event, index) {
|
|
207
|
-
this.setActiveSelectedIndex(index);
|
|
208
|
-
event.preventDefault();
|
|
209
|
-
event.stopPropagation();
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Handle click on inform radio group
|
|
213
|
-
*/
|
|
214
|
-
handleKeydownOnInfoGroup(event, next, index) {
|
|
215
|
-
switch (event.keyCode) {
|
|
216
|
-
case DOWN_ARROW:
|
|
217
|
-
case RIGHT_ARROW:
|
|
218
|
-
case UP_ARROW:
|
|
219
|
-
case LEFT_ARROW:
|
|
220
|
-
next.focus();
|
|
221
|
-
this.setActiveSelectedIndex(index === 0 ? 1 : 0);
|
|
222
|
-
event.preventDefault();
|
|
223
|
-
event.stopPropagation();
|
|
224
|
-
break;
|
|
225
|
-
case SPACE:
|
|
226
|
-
this.setActiveSelectedIndex(index);
|
|
227
|
-
event.preventDefault();
|
|
228
|
-
event.stopPropagation();
|
|
229
|
-
break;
|
|
230
|
-
default:
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* Set the value of activeSelectedIndex
|
|
236
|
-
*/
|
|
237
|
-
setActiveSelectedIndex(index) {
|
|
238
|
-
if (this.picker.selectMode === 'range' &&
|
|
239
|
-
this.activeSelectedIndex !== index) {
|
|
240
|
-
this.activeSelectedIndex = index;
|
|
241
|
-
const selected = this.picker.selecteds[this.activeSelectedIndex];
|
|
242
|
-
if (this.picker.selecteds && selected) {
|
|
243
|
-
this.pickerMoment = this.dateTimeAdapter.clone(selected);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
initPicker() {
|
|
249
|
-
this.pickerMoment = this.picker.startAt || this.dateTimeAdapter.now();
|
|
250
|
-
this.activeSelectedIndex = this.picker.selectMode === 'rangeTo' ? 1 : 0;
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Select calendar date in single mode,
|
|
254
|
-
* it returns null when date is not selected.
|
|
255
|
-
*/
|
|
256
|
-
dateSelectedInSingleMode(date) {
|
|
257
|
-
if (this.dateTimeAdapter.isSameDay(date, this.picker.selected)) {
|
|
258
|
-
return null;
|
|
259
|
-
}
|
|
260
|
-
return this.updateAndCheckCalendarDate(date);
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* Select dates in range Mode
|
|
264
|
-
*/
|
|
265
|
-
dateSelectedInRangeMode(date) {
|
|
266
|
-
let from = this.picker.selecteds[0];
|
|
267
|
-
let to = this.picker.selecteds[1];
|
|
268
|
-
const result = this.updateAndCheckCalendarDate(date);
|
|
269
|
-
if (!result) {
|
|
270
|
-
return null;
|
|
271
|
-
}
|
|
272
|
-
// if the given calendar day is after or equal to 'from',
|
|
273
|
-
// set ths given date as 'to'
|
|
274
|
-
// otherwise, set it as 'from' and set 'to' to null
|
|
275
|
-
if (this.picker.selectMode === 'range') {
|
|
276
|
-
if (this.picker.selecteds &&
|
|
277
|
-
this.picker.selecteds.length &&
|
|
278
|
-
!to &&
|
|
279
|
-
from &&
|
|
280
|
-
this.dateTimeAdapter.differenceInCalendarDays(result, from) >= 0) {
|
|
281
|
-
to = result;
|
|
282
|
-
this.activeSelectedIndex = 1;
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
from = result;
|
|
286
|
-
to = null;
|
|
287
|
-
this.activeSelectedIndex = 0;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
else if (this.picker.selectMode === 'rangeFrom') {
|
|
291
|
-
from = result;
|
|
292
|
-
// if the from value is after the to value, set the to value as null
|
|
293
|
-
if (to && this.dateTimeAdapter.compare(from, to) > 0) {
|
|
294
|
-
to = null;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
else if (this.picker.selectMode === 'rangeTo') {
|
|
298
|
-
to = result;
|
|
299
|
-
// if the from value is after the to value, set the from value as null
|
|
300
|
-
if (from && this.dateTimeAdapter.compare(from, to) > 0) {
|
|
301
|
-
from = null;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
return [from, to];
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* Update the given calendar date's time and check if it is valid
|
|
308
|
-
* Because the calendar date has 00:00:00 as default time, if the picker type is 'both',
|
|
309
|
-
* we need to update the given calendar date's time before selecting it.
|
|
310
|
-
* if it is valid, return the updated dateTime
|
|
311
|
-
* if it is not valid, return null
|
|
312
|
-
*/
|
|
313
|
-
updateAndCheckCalendarDate(date) {
|
|
314
|
-
let result;
|
|
315
|
-
// if the picker is 'both', update the calendar date's time value
|
|
316
|
-
if (this.picker.pickerType === 'both') {
|
|
317
|
-
result = this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(date), this.dateTimeAdapter.getMonth(date), this.dateTimeAdapter.getDate(date), this.dateTimeAdapter.getHours(this.pickerMoment), this.dateTimeAdapter.getMinutes(this.pickerMoment), this.dateTimeAdapter.getSeconds(this.pickerMoment));
|
|
318
|
-
result = this.dateTimeAdapter.clampDate(result, this.picker.minDateTime, this.picker.maxDateTime);
|
|
319
|
-
}
|
|
320
|
-
else {
|
|
321
|
-
result = this.dateTimeAdapter.clone(date);
|
|
322
|
-
}
|
|
323
|
-
// check the updated dateTime
|
|
324
|
-
return this.picker.dateTimeChecker(result) ? result : null;
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Focus to the picker
|
|
328
|
-
* */
|
|
329
|
-
focusPicker() {
|
|
330
|
-
if (this.picker.pickerMode === 'inline') {
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
if (this.calendar) {
|
|
334
|
-
this.calendar.focusActiveCell();
|
|
335
|
-
}
|
|
336
|
-
else if (this.timer) {
|
|
337
|
-
this.timer.focus();
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
OwlDateTimeContainerComponent.decorators = [
|
|
342
|
-
{ type: Component, args: [{
|
|
343
|
-
exportAs: 'owlDateTimeContainer',
|
|
344
|
-
selector: 'owl-date-time-container',
|
|
345
|
-
template: "<div [cdkTrapFocus]=\"picker?.pickerMode !== 'inline'\"\n [@fadeInPicker]=\"picker?.pickerMode === 'inline'? '' : 'enter'\"\n class=\"owl-dt-container-inner\">\n\n <owl-date-time-calendar *ngIf=\"pickerType === 'both' || pickerType === 'calendar'\"\n class=\"owl-dt-container-row\"\n [firstDayOfWeek]=\"picker?.firstDayOfWeek\"\n [(pickerMoment)]=\"pickerMoment\"\n [selected]=\"picker?.selected\"\n [selecteds]=\"picker?.selecteds\"\n [selectMode]=\"picker?.selectMode\"\n [minDate]=\"picker?.minDateTime\"\n [maxDate]=\"picker?.maxDateTime\"\n [dateFilter]=\"picker?.dateTimeFilter\"\n [startView]=\"picker?.startView\"\n [hideOtherMonths]=\"picker?.hideOtherMonths\"\n (yearSelected)=\"picker?.selectYear($event)\"\n (monthSelected)=\"picker?.selectMonth($event)\"\n (selectedChange)=\"dateSelected($event)\"></owl-date-time-calendar>\n\n <owl-date-time-timer *ngIf=\"pickerType === 'both' || pickerType === 'timer'\"\n class=\"owl-dt-container-row\"\n [pickerMoment]=\"pickerMoment\"\n [minDateTime]=\"picker?.minDateTime\"\n [maxDateTime]=\"picker?.maxDateTime\"\n [showSecondsTimer]=\"picker?.showSecondsTimer\"\n [hour12Timer]=\"picker?.hour12Timer\"\n [stepHour]=\"picker?.stepHour\"\n [stepMinute]=\"picker?.stepMinute\"\n [stepSecond]=\"picker?.stepSecond\"\n (selectedChange)=\"timeSelected($event)\"></owl-date-time-timer>\n\n <div *ngIf=\"picker?.isInRangeMode\"\n role=\"radiogroup\"\n class=\"owl-dt-container-info owl-dt-container-row\">\n <div role=\"radio\"\n [tabindex]=\"activeSelectedIndex === 0 ? 0 : -1\"\n [attr.aria-checked]=\"activeSelectedIndex === 0\"\n class=\"owl-dt-control owl-dt-container-range owl-dt-container-from\"\n [ngClass]=\"{'owl-dt-container-info-active': activeSelectedIndex === 0}\"\n (click)=\"handleClickOnInfoGroup($event, 0)\"\n (keydown)=\"handleKeydownOnInfoGroup($event, to, 0)\"\n #from>\n <span class=\"owl-dt-control-content owl-dt-container-range-content\"\n tabindex=\"-1\">\n <span class=\"owl-dt-container-info-label\">{{fromLabel}}:</span>\n <span class=\"owl-dt-container-info-value\">{{fromFormattedValue}}</span>\n </span>\n </div>\n <div role=\"radio\"\n [tabindex]=\"activeSelectedIndex === 1 ? 0 : -1\"\n [attr.aria-checked]=\"activeSelectedIndex === 1\"\n class=\"owl-dt-control owl-dt-container-range owl-dt-container-to\"\n [ngClass]=\"{'owl-dt-container-info-active': activeSelectedIndex === 1}\"\n (click)=\"handleClickOnInfoGroup($event, 1)\"\n (keydown)=\"handleKeydownOnInfoGroup($event, from, 1)\"\n #to>\n <span class=\"owl-dt-control-content owl-dt-container-range-content\"\n tabindex=\"-1\">\n <span class=\"owl-dt-container-info-label\">{{toLabel}}:</span>\n <span class=\"owl-dt-container-info-value\">{{toFormattedValue}}</span>\n </span>\n </div>\n </div>\n\n <div *ngIf=\"showControlButtons\"\n class=\"owl-dt-container-buttons owl-dt-container-row\">\n <button class=\"owl-dt-control owl-dt-control-button owl-dt-container-control-button\"\n type=\"button\"\n tabindex=\"0\"\n (click)=\"onCancelClicked($event)\">\n <span class=\"owl-dt-control-content owl-dt-control-button-content\"\n tabindex=\"-1\">\n {{cancelLabel}}\n </span>\n </button>\n <button class=\"owl-dt-control owl-dt-control-button owl-dt-container-control-button\"\n type=\"button\"\n tabindex=\"0\"\n (click)=\"onSetClicked($event)\">\n <span class=\"owl-dt-control-content owl-dt-control-button-content\"\n tabindex=\"-1\">\n {{setLabel}}\n </span>\n </button>\n </div>\n</div>\n",
|
|
346
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
347
|
-
preserveWhitespaces: false,
|
|
348
|
-
animations: [
|
|
349
|
-
owlDateTimePickerAnimations.transformPicker,
|
|
350
|
-
owlDateTimePickerAnimations.fadeInPicker
|
|
351
|
-
],
|
|
352
|
-
styles: [""]
|
|
353
|
-
},] }
|
|
354
|
-
];
|
|
355
|
-
OwlDateTimeContainerComponent.ctorParameters = () => [
|
|
356
|
-
{ type: ChangeDetectorRef },
|
|
357
|
-
{ type: ElementRef },
|
|
358
|
-
{ type: OwlDateTimeIntl },
|
|
359
|
-
{ type: DateTimeAdapter, decorators: [{ type: Optional }] }
|
|
360
|
-
];
|
|
361
|
-
OwlDateTimeContainerComponent.propDecorators = {
|
|
362
|
-
calendar: [{ type: ViewChild, args: [OwlCalendarComponent,] }],
|
|
363
|
-
timer: [{ type: ViewChild, args: [OwlTimerComponent,] }],
|
|
364
|
-
owlDTContainerClass: [{ type: HostBinding, args: ['class.owl-dt-container',] }],
|
|
365
|
-
owlDTPopupContainerClass: [{ type: HostBinding, args: ['class.owl-dt-popup-container',] }],
|
|
366
|
-
owlDTDialogContainerClass: [{ type: HostBinding, args: ['class.owl-dt-dialog-container',] }],
|
|
367
|
-
owlDTInlineContainerClass: [{ type: HostBinding, args: ['class.owl-dt-inline-container',] }],
|
|
368
|
-
owlDTContainerDisabledClass: [{ type: HostBinding, args: ['class.owl-dt-container-disabled',] }],
|
|
369
|
-
owlDTContainerId: [{ type: HostBinding, args: ['attr.id',] }],
|
|
370
|
-
owlDTContainerAnimation: [{ type: HostBinding, args: ['@transformPicker',] }],
|
|
371
|
-
handleContainerAnimationDone: [{ type: HostListener, args: ['@transformPicker.done', ['$event'],] }]
|
|
372
|
-
};
|
|
373
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uL3Byb2plY3RzL254dC1waWNrLWRhdGV0aW1lL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9kYXRlLXRpbWUvZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIvZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDNUYsT0FBTyxFQUFtQyx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQVUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUMxTCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQTtBQUVyRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUE7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDNUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUNBQXlDLENBQUE7QUFjckYsTUFBTSxPQUFPLDZCQUE2QjtJQXlKdEMsWUFBb0IsS0FBd0IsRUFDaEMsTUFBa0IsRUFDbEIsVUFBMkIsRUFDZixlQUFtQztRQUh2QyxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUNoQyxXQUFNLEdBQU4sTUFBTSxDQUFZO1FBQ2xCLGVBQVUsR0FBVixVQUFVLENBQWlCO1FBQ2Ysb0JBQWUsR0FBZixlQUFlLENBQW9CO1FBcEpwRCx3QkFBbUIsR0FBRyxD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J0Bhbmd1bGFyL2FuaW1hdGlvbnMnXHJcbmltcG9ydCB7IERPV05fQVJST1csIExFRlRfQVJST1csIFJJR0hUX0FSUk9XLCBTUEFDRSwgVVBfQVJST1cgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnXHJcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBPbkluaXQsIE9wdGlvbmFsLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcydcclxuaW1wb3J0IHsgRGF0ZVRpbWVBZGFwdGVyIH0gZnJvbSAnLi4vLi4vY2xhc3MvZGF0ZS10aW1lLWFkYXB0ZXIuY2xhc3MnXHJcbmltcG9ydCB7IE93bERhdGVUaW1lRGlyZWN0aXZlLCBQaWNrZXJUeXBlIH0gZnJvbSAnLi4vLi4vY2xhc3MvZGF0ZS10aW1lLmNsYXNzJ1xyXG5pbXBvcnQgeyBPd2xDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJy4uL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudCdcclxuaW1wb3J0IHsgT3dsRGF0ZVRpbWVJbnRsIH0gZnJvbSAnLi4vZGF0ZS10aW1lLXBpY2tlci1pbnRsLnNlcnZpY2UnXHJcbmltcG9ydCB7IE93bFRpbWVyQ29tcG9uZW50IH0gZnJvbSAnLi4vdGltZXIvdGltZXIuY29tcG9uZW50J1xyXG5pbXBvcnQgeyBvd2xEYXRlVGltZVBpY2tlckFuaW1hdGlvbnMgfSBmcm9tICcuL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyLmFuaW1hdGlvbnMnXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIGV4cG9ydEFzOiAnb3dsRGF0ZVRpbWVDb250YWluZXInLFxyXG4gICAgc2VsZWN0b3I6ICdvd2wtZGF0ZS10aW1lLWNvbnRhaW5lcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXHJcbiAgICBhbmltYXRpb25zOiBbXHJcbiAgICAgICAgb3dsRGF0ZVRpbWVQaWNrZXJBbmltYXRpb25zLnRyYW5zZm9ybVBpY2tlcixcclxuICAgICAgICBvd2xEYXRlVGltZVBpY2tlckFuaW1hdGlvbnMuZmFkZUluUGlja2VyXHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBPd2xEYXRlVGltZUNvbnRhaW5lckNvbXBvbmVudDxUPlxyXG4gICAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gICAgQFZpZXdDaGlsZChPd2xDYWxlbmRhckNvbXBvbmVudClcclxuICAgIGNhbGVuZGFyOiBPd2xDYWxlbmRhckNvbXBvbmVudDxUPlxyXG4gICAgQFZpZXdDaGlsZChPd2xUaW1lckNvbXBvbmVudClcclxuICAgIHRpbWVyOiBPd2xUaW1lckNvbXBvbmVudDxUPlxyXG5cclxuICAgIHB1YmxpYyBwaWNrZXI6IE93bERhdGVUaW1lRGlyZWN0aXZlPFQ+XHJcbiAgICBwdWJsaWMgYWN0aXZlU2VsZWN0ZWRJbmRleCA9IDAgLy8gVGhlIGN1cnJlbnQgYWN0aXZlIFNlbGVjdGVkSW5kZXggaW4gcmFuZ2Ugc2VsZWN0IG1vZGUgKDA6ICdmcm9tJywgMTogJ3RvJylcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0cmVhbSBlbWl0cyB3aGVuIHRyeSB0byBoaWRlIHBpY2tlclxyXG4gICAgICogKi9cclxuICAgIHByaXZhdGUgaGlkZVBpY2tlciQgPSBuZXcgU3ViamVjdDxhbnk+KClcclxuXHJcbiAgICBnZXQgaGlkZVBpY2tlclN0cmVhbSgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhpZGVQaWNrZXIkLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJlYW0gZW1pdHMgd2hlbiB0cnkgdG8gY29uZmlybSB0aGUgc2VsZWN0ZWQgdmFsdWVcclxuICAgICAqICovXHJcbiAgICBwcml2YXRlIGNvbmZpcm1TZWxlY3RlZCQgPSBuZXcgU3ViamVjdDxhbnk+KClcclxuXHJcbiAgICBnZXQgY29uZmlybVNlbGVjdGVkU3RyZWFtKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlybVNlbGVjdGVkJC5hc09ic2VydmFibGUoKVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGlja2VyT3BlbmVkJCA9IG5ldyBTdWJqZWN0PGFueT4oKVxyXG5cclxuICAgIGdldCBwaWNrZXJPcGVuZWRTdHJlYW0oKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJPcGVuZWQkLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY3VycmVudCBwaWNrZXIgbW9tZW50LiBUaGlzIGRldGVybWluZXMgd2hpY2ggdGltZSBwZXJpb2QgaXMgc2hvd24gYW5kIHdoaWNoIGRhdGUgaXNcclxuICAgICAqIGhpZ2hsaWdodGVkIHdoZW4gdXNpbmcga2V5Ym9hcmQgbmF2aWdhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfY2xhbVBpY2tlck1vbWVudDogVFxyXG5cclxuICAgIGdldCBwaWNrZXJNb21lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsYW1QaWNrZXJNb21lbnRcclxuICAgIH1cclxuXHJcbiAgICBzZXQgcGlja2VyTW9tZW50KHZhbHVlOiBUKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsYW1QaWNrZXJNb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jbGFtcERhdGUoXHJcbiAgICAgICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLm1pbkRhdGVUaW1lLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIubWF4RGF0ZVRpbWVcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBpY2tlclR5cGUoKTogUGlja2VyVHlwZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VyLnBpY2tlclR5cGVcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2FuY2VsTGFiZWwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJJbnRsLmNhbmNlbEJ0bkxhYmVsXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNldExhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VySW50bC5zZXRCdG5MYWJlbFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHJhbmdlICdmcm9tJyBsYWJlbFxyXG4gICAgICogKi9cclxuICAgIGdldCBmcm9tTGFiZWwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJJbnRsLnJhbmdlRnJvbUxhYmVsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmFuZ2UgJ3RvJyBsYWJlbFxyXG4gICAgICogKi9cclxuICAgIGdldCB0b0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VySW50bC5yYW5nZVRvTGFiZWxcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSByYW5nZSAnZnJvbScgZm9ybWF0dGVkIHZhbHVlXHJcbiAgICAgKiAqL1xyXG4gICAgZ2V0IGZyb21Gb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5waWNrZXIuc2VsZWN0ZWRzWzBdXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlXHJcbiAgICAgICAgICAgID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KHZhbHVlLCB0aGlzLnBpY2tlci5mb3JtYXRTdHJpbmcpXHJcbiAgICAgICAgICAgIDogJydcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSByYW5nZSAndG8nIGZvcm1hdHRlZCB2YWx1ZVxyXG4gICAgICogKi9cclxuICAgIGdldCB0b0Zvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnBpY2tlci5zZWxlY3RlZHNbMV1cclxuICAgICAgICByZXR1cm4gdmFsdWVcclxuICAgICAgICAgICAgPyB0aGlzLmRhdGVUaW1lQWRhcHRlci5mb3JtYXQodmFsdWUsIHRoaXMucGlja2VyLmZvcm1hdFN0cmluZylcclxuICAgICAgICAgICAgOiAnJ1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FzZXMgaW4gd2hpY2ggdGhlIGNvbnRyb2wgYnV0dG9ucyBzaG93IGluIHRoZSBwaWNrZXJcclxuICAgICAqIDEpIHBpY2tlciBtb2RlIGlzICdkaWFsb2cnXHJcbiAgICAgKiAyKSBwaWNrZXIgdHlwZSBpcyBOT1QgJ2NhbGVuZGFyJyBhbmQgdGhlIHBpY2tlciBtb2RlIGlzIE5PVCAnaW5saW5lJ1xyXG4gICAgICogKi9cclxuICAgIGdldCBzaG93Q29udHJvbEJ1dHRvbnMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdGhpcy5waWNrZXIucGlja2VyTW9kZSA9PT0gJ2RpYWxvZycgfHxcclxuICAgICAgICAgICAgKHRoaXMucGlja2VyLnBpY2tlclR5cGUgIT09ICdjYWxlbmRhcicgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLnBpY2tlck1vZGUgIT09ICdpbmxpbmUnKVxyXG4gICAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29udGFpbmVyRWxtKCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudFxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mub3dsLWR0LWNvbnRhaW5lcicpXHJcbiAgICBnZXQgb3dsRFRDb250YWluZXJDbGFzcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mub3dsLWR0LXBvcHVwLWNvbnRhaW5lcicpXHJcbiAgICBnZXQgb3dsRFRQb3B1cENvbnRhaW5lckNsYXNzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlci5waWNrZXJNb2RlID09PSAncG9wdXAnXHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5vd2wtZHQtZGlhbG9nLWNvbnRhaW5lcicpXHJcbiAgICBnZXQgb3dsRFREaWFsb2dDb250YWluZXJDbGFzcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXIucGlja2VyTW9kZSA9PT0gJ2RpYWxvZydcclxuICAgIH1cclxuXHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm93bC1kdC1pbmxpbmUtY29udGFpbmVyJylcclxuICAgIGdldCBvd2xEVElubGluZUNvbnRhaW5lckNsYXNzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlci5waWNrZXJNb2RlID09PSAnaW5saW5lJ1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mub3dsLWR0LWNvbnRhaW5lci1kaXNhYmxlZCcpXHJcbiAgICBnZXQgb3dsRFRDb250YWluZXJEaXNhYmxlZENsYXNzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlci5kaXNhYmxlZFxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXHJcbiAgICBnZXQgb3dsRFRDb250YWluZXJJZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlci5pZFxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0QmluZGluZygnQHRyYW5zZm9ybVBpY2tlcicpXHJcbiAgICBnZXQgb3dsRFRDb250YWluZXJBbmltYXRpb24oKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXIucGlja2VyTW9kZSA9PT0gJ2lubGluZScgPyAnJyA6ICdlbnRlcidcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICBwcml2YXRlIGVsbVJlZjogRWxlbWVudFJlZixcclxuICAgICAgICBwcml2YXRlIHBpY2tlckludGw6IE93bERhdGVUaW1lSW50bCxcclxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRhdGVUaW1lQWRhcHRlcjogRGF0ZVRpbWVBZGFwdGVyPFQ+KSB7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25Jbml0KCkgeyB9XHJcblxyXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmluaXRQaWNrZXIoKVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5mb2N1c1BpY2tlcigpXHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignQHRyYW5zZm9ybVBpY2tlci5kb25lJywgWyckZXZlbnQnXSlcclxuICAgIHB1YmxpYyBoYW5kbGVDb250YWluZXJBbmltYXRpb25Eb25lKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRvU3RhdGUgPSBldmVudC50b1N0YXRlXHJcbiAgICAgICAgaWYgKHRvU3RhdGUgPT09ICdlbnRlcicpIHtcclxuICAgICAgICAgICAgdGhpcy5waWNrZXJPcGVuZWQkLm5leHQoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGF0ZVNlbGVjdGVkKGRhdGU6IFQpOiB2b2lkIHtcclxuICAgICAgICBsZXQgcmVzdWx0XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBpY2tlci5pc0luU2luZ2xlTW9kZSkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmRhdGVTZWxlY3RlZEluU2luZ2xlTW9kZShkYXRlKVxyXG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudCA9IHJlc3VsdFxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0KHJlc3VsdClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIHdlIGNsb3NlIHRoZSBwaWNrZXIgd2hlbiByZXN1bHQgaXMgbnVsbCBhbmQgcGlja2VyVHlwZSBpcyBjYWxlbmRhci5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBpY2tlclR5cGUgPT09ICdjYWxlbmRhcicpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVQaWNrZXIkLm5leHQobnVsbClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBpY2tlci5pc0luUmFuZ2VNb2RlKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZGF0ZVNlbGVjdGVkSW5SYW5nZU1vZGUoZGF0ZSlcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQgPSByZXN1bHRbdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4XVxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0KHJlc3VsdClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdGltZVNlbGVjdGVkKHRpbWU6IFQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBpY2tlck1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNsb25lKHRpbWUpXHJcblxyXG4gICAgICAgIGlmICghdGhpcy5waWNrZXIuZGF0ZVRpbWVDaGVja2VyKHRoaXMucGlja2VyTW9tZW50KSkge1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBpY2tlci5pc0luU2luZ2xlTW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLnBpY2tlci5zZWxlY3QodGhpcy5waWNrZXJNb21lbnQpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGlja2VyLmlzSW5SYW5nZU1vZGUpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRzID0gWy4uLnRoaXMucGlja2VyLnNlbGVjdGVkc11cclxuXHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSAnZnJvbScgaXMgYWZ0ZXIgJ3RvJyBvciAndG8naXMgYmVmb3JlICdmcm9tJ1xyXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHNldCBib3RoIHRoZSAnZnJvbScgYW5kICd0bycgdGhlIHNhbWUgdmFsdWVcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgKHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkc1sxXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZHNbMV1cclxuICAgICAgICAgICAgICAgICAgICApID09PSAxKSB8fFxyXG4gICAgICAgICAgICAgICAgKHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkc1swXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZHNbMF1cclxuICAgICAgICAgICAgICAgICAgICApID09PSAtMSlcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZHNbMF0gPSB0aGlzLnBpY2tlck1vbWVudFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRzWzFdID0gdGhpcy5waWNrZXJNb21lbnRcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkc1t0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXhdID0gdGhpcy5waWNrZXJNb21lbnRcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0KHNlbGVjdGVkcylcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUgY2xpY2sgb24gY2FuY2VsIGJ1dHRvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25DYW5jZWxDbGlja2VkKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmhpZGVQaWNrZXIkLm5leHQobnVsbClcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUgY2xpY2sgb24gc2V0IGJ1dHRvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25TZXRDbGlja2VkKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucGlja2VyLmRhdGVUaW1lQ2hlY2tlcih0aGlzLnBpY2tlck1vbWVudCkpIHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlUGlja2VyJC5uZXh0KG51bGwpXHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNvbmZpcm1TZWxlY3RlZCQubmV4dChldmVudClcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUgY2xpY2sgb24gaW5mb3JtIHJhZGlvIGdyb3VwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYW5kbGVDbGlja09uSW5mb0dyb3VwKGV2ZW50OiBhbnksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkSW5kZXgoaW5kZXgpXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUgY2xpY2sgb24gaW5mb3JtIHJhZGlvIGdyb3VwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYW5kbGVLZXlkb3duT25JbmZvR3JvdXAoXHJcbiAgICAgICAgZXZlbnQ6IGFueSxcclxuICAgICAgICBuZXh0OiBhbnksXHJcbiAgICAgICAgaW5kZXg6IG51bWJlclxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRE9XTl9BUlJPVzpcclxuICAgICAgICAgICAgY2FzZSBSSUdIVF9BUlJPVzpcclxuICAgICAgICAgICAgY2FzZSBVUF9BUlJPVzpcclxuICAgICAgICAgICAgY2FzZSBMRUZUX0FSUk9XOlxyXG4gICAgICAgICAgICAgICAgbmV4dC5mb2N1cygpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkSW5kZXgoaW5kZXggPT09IDAgPyAxIDogMClcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICAgICAgY2FzZSBTUEFDRTpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRJbmRleChpbmRleClcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdmFsdWUgb2YgYWN0aXZlU2VsZWN0ZWRJbmRleFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldEFjdGl2ZVNlbGVjdGVkSW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJyAmJlxyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXggIT09IGluZGV4XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9IGluZGV4XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMucGlja2VyLnNlbGVjdGVkc1t0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXhdXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBpY2tlci5zZWxlY3RlZHMgJiYgc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY2xvbmUoc2VsZWN0ZWQpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0UGlja2VyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGlja2VyTW9tZW50ID0gdGhpcy5waWNrZXIuc3RhcnRBdCB8fCB0aGlzLmRhdGVUaW1lQWRhcHRlci5ub3coKVxyXG4gICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9IHRoaXMucGlja2VyLnNlbGVjdE1vZGUgPT09ICdyYW5nZVRvJyA/IDEgOiAwXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWxlY3QgY2FsZW5kYXIgZGF0ZSBpbiBzaW5nbGUgbW9kZSxcclxuICAgICAqIGl0IHJldHVybnMgbnVsbCB3aGVuIGRhdGUgaXMgbm90IHNlbGVjdGVkLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGRhdGVTZWxlY3RlZEluU2luZ2xlTW9kZShkYXRlOiBUKTogVCB8IG51bGwge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1NhbWVEYXkoZGF0ZSwgdGhpcy5waWNrZXIuc2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVBbmRDaGVja0NhbGVuZGFyRGF0ZShkYXRlKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VsZWN0IGRhdGVzIGluIHJhbmdlIE1vZGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBkYXRlU2VsZWN0ZWRJblJhbmdlTW9kZShkYXRlOiBUKTogVFtdIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGZyb20gPSB0aGlzLnBpY2tlci5zZWxlY3RlZHNbMF1cclxuICAgICAgICBsZXQgdG8gPSB0aGlzLnBpY2tlci5zZWxlY3RlZHNbMV1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy51cGRhdGVBbmRDaGVja0NhbGVuZGFyRGF0ZShkYXRlKVxyXG5cclxuICAgICAgICBpZiAoIXJlc3VsdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgdGhlIGdpdmVuIGNhbGVuZGFyIGRheSBpcyBhZnRlciBvciBlcXVhbCB0byAnZnJvbScsXHJcbiAgICAgICAgLy8gc2V0IHRocyBnaXZlbiBkYXRlIGFzICd0bydcclxuICAgICAgICAvLyBvdGhlcndpc2UsIHNldCBpdCBhcyAnZnJvbScgYW5kIHNldCAndG8nIHRvIG51bGxcclxuICAgICAgICBpZiAodGhpcy5waWNrZXIuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJykge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlci5zZWxlY3RlZHMgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLnNlbGVjdGVkcy5sZW5ndGggJiZcclxuICAgICAgICAgICAgICAgICF0byAmJlxyXG4gICAgICAgICAgICAgICAgZnJvbSAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKHJlc3VsdCwgZnJvbSkgPj0gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRvID0gcmVzdWx0XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXggPSAxXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmcm9tID0gcmVzdWx0XHJcbiAgICAgICAgICAgICAgICB0byA9IG51bGxcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9IDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5waWNrZXIuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlRnJvbScpIHtcclxuICAgICAgICAgICAgZnJvbSA9IHJlc3VsdFxyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhlIGZyb20gdmFsdWUgaXMgYWZ0ZXIgdGhlIHRvIHZhbHVlLCBzZXQgdGhlIHRvIHZhbHVlIGFzIG51bGxcclxuICAgICAgICAgICAgaWYgKHRvICYmIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmUoZnJvbSwgdG8pID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdG8gPSBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGlja2VyLnNlbGVjdE1vZGUgPT09ICdyYW5nZVRvJykge1xyXG4gICAgICAgICAgICB0byA9IHJlc3VsdFxyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhlIGZyb20gdmFsdWUgaXMgYWZ0ZXIgdGhlIHRvIHZhbHVlLCBzZXQgdGhlIGZyb20gdmFsdWUgYXMgbnVsbFxyXG4gICAgICAgICAgICBpZiAoZnJvbSAmJiB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKGZyb20sIHRvKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZyb20gPSBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBbZnJvbSwgdG9dXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIGdpdmVuIGNhbGVuZGFyIGRhdGUncyB0aW1lIGFuZCBjaGVjayBpZiBpdCBpcyB2YWxpZFxyXG4gICAgICogQmVjYXVzZSB0aGUgY2FsZW5kYXIgZGF0ZSBoYXMgMDA6MDA6MDAgYXMgZGVmYXVsdCB0aW1lLCBpZiB0aGUgcGlja2VyIHR5cGUgaXMgJ2JvdGgnLFxyXG4gICAgICogd2UgbmVlZCB0byB1cGRhdGUgdGhlIGdpdmVuIGNhbGVuZGFyIGRhdGUncyB0aW1lIGJlZm9yZSBzZWxlY3RpbmcgaXQuXHJcbiAgICAgKiBpZiBpdCBpcyB2YWxpZCwgcmV0dXJuIHRoZSB1cGRhdGVkIGRhdGVUaW1lXHJcbiAgICAgKiBpZiBpdCBpcyBub3QgdmFsaWQsIHJldHVybiBudWxsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlQW5kQ2hlY2tDYWxlbmRhckRhdGUoZGF0ZTogVCk6IFQge1xyXG4gICAgICAgIGxldCByZXN1bHRcclxuXHJcbiAgICAgICAgLy8gaWYgdGhlIHBpY2tlciBpcyAnYm90aCcsIHVwZGF0ZSB0aGUgY2FsZW5kYXIgZGF0ZSdzIHRpbWUgdmFsdWVcclxuICAgICAgICBpZiAodGhpcy5waWNrZXIucGlja2VyVHlwZSA9PT0gJ2JvdGgnKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKGRhdGUpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXREYXRlKGRhdGUpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0SG91cnModGhpcy5waWNrZXJNb21lbnQpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TWludXRlcyh0aGlzLnBpY2tlck1vbWVudCksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRTZWNvbmRzKHRoaXMucGlja2VyTW9tZW50KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNsYW1wRGF0ZShcclxuICAgICAgICAgICAgICAgIHJlc3VsdCxcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLm1pbkRhdGVUaW1lLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIubWF4RGF0ZVRpbWVcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNsb25lKGRhdGUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjaGVjayB0aGUgdXBkYXRlZCBkYXRlVGltZVxyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlci5kYXRlVGltZUNoZWNrZXIocmVzdWx0KSA/IHJlc3VsdCA6IG51bGxcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvY3VzIHRvIHRoZSBwaWNrZXJcclxuICAgICAqICovXHJcbiAgICBwcml2YXRlIGZvY3VzUGlja2VyKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnBpY2tlci5waWNrZXJNb2RlID09PSAnaW5saW5lJykge1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNhbGVuZGFyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXIuZm9jdXNBY3RpdmVDZWxsKClcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGltZXIpIHtcclxuICAgICAgICAgICAgdGhpcy50aW1lci5mb2N1cygpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
|