@oneluiz/dual-datepicker 4.0.0 → 4.0.2
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 +26 -2
- package/fesm2022/oneluiz-dual-datepicker.mjs +75 -71
- package/fesm2022/oneluiz-dual-datepicker.mjs.map +1 -1
- package/package.json +8 -9
- package/types/oneluiz-dual-datepicker.d.ts +1618 -0
- package/dual-datepicker.component.d.ts +0 -243
- package/esm2022/core/built-in-presets.mjs +0 -289
- package/esm2022/core/calendar-grid/cache.config.mjs +0 -35
- package/esm2022/core/calendar-grid/calendar-grid.cache.mjs +0 -98
- package/esm2022/core/calendar-grid/calendar-grid.factory.mjs +0 -97
- package/esm2022/core/calendar-grid/calendar-grid.types.mjs +0 -8
- package/esm2022/core/calendar-grid/range-highlighter.cache.mjs +0 -200
- package/esm2022/core/calendar-grid/range-highlighter.mjs +0 -185
- package/esm2022/core/calendar-grid/range-highlighter.types.mjs +0 -11
- package/esm2022/core/calendar-grid/virtual-weeks.logic.mjs +0 -149
- package/esm2022/core/calendar-grid/virtual-weeks.types.mjs +0 -11
- package/esm2022/core/date-adapter.mjs +0 -77
- package/esm2022/core/date-clock.mjs +0 -65
- package/esm2022/core/dual-date-range.store.mjs +0 -329
- package/esm2022/core/internal.mjs +0 -92
- package/esm2022/core/native-date-adapter.mjs +0 -286
- package/esm2022/core/preset-providers.mjs +0 -243
- package/esm2022/core/preset-registry.mjs +0 -277
- package/esm2022/core/preset.engine.mjs +0 -179
- package/esm2022/core/public.mjs +0 -94
- package/esm2022/core/range-preset.plugin.mjs +0 -70
- package/esm2022/core/range.validator.mjs +0 -105
- package/esm2022/core/system-clock.mjs +0 -34
- package/esm2022/core/testing/date.helpers.mjs +0 -49
- package/esm2022/core/testing/fixed-clock.mjs +0 -30
- package/esm2022/core/testing/index.mjs +0 -8
- package/esm2022/dual-datepicker.component.mjs +0 -1314
- package/esm2022/oneluiz-dual-datepicker.mjs +0 -5
- package/esm2022/public-api.mjs +0 -43
- package/index.d.ts +0 -5
- package/public-api.d.ts +0 -44
|
@@ -1,329 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Headless Date Range Store using Angular Signals
|
|
3
|
-
*
|
|
4
|
-
* Version: 3.5.1
|
|
5
|
-
*
|
|
6
|
-
* Architecture:
|
|
7
|
-
* - State lives HERE, not in UI component
|
|
8
|
-
* - Deterministic: no hidden side effects
|
|
9
|
-
* - SSR-compatible: no window/document dependencies
|
|
10
|
-
* - Timezone-safe: uses DateAdapter for all date operations
|
|
11
|
-
* - Testable: pure signal-based state
|
|
12
|
-
* - Reusable: inject anywhere (services, components, guards)
|
|
13
|
-
*
|
|
14
|
-
* Usage:
|
|
15
|
-
* ```typescript
|
|
16
|
-
* // In component
|
|
17
|
-
* const rangeStore = inject(DualDateRangeStore);
|
|
18
|
-
* rangeStore.applyPreset('THIS_MONTH');
|
|
19
|
-
*
|
|
20
|
-
* // In service (headless!)
|
|
21
|
-
* const store = inject(DualDateRangeStore);
|
|
22
|
-
* const range = store.range();
|
|
23
|
-
* this.http.get(`/api/sales?start=${range.start}&end=${range.end}`);
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
import { Injectable, signal, computed, inject } from '@angular/core';
|
|
27
|
-
import { validateRangeOrder, validateRangeBounds, isDateDisabled, applyBounds } from './range.validator';
|
|
28
|
-
import { PresetEngine } from './preset.engine';
|
|
29
|
-
import { DATE_CLOCK } from './date-clock';
|
|
30
|
-
import { SystemClock } from './system-clock';
|
|
31
|
-
import { DATE_ADAPTER } from './date-adapter';
|
|
32
|
-
import { NativeDateAdapter } from './native-date-adapter';
|
|
33
|
-
import * as i0 from "@angular/core";
|
|
34
|
-
export class DualDateRangeStore {
|
|
35
|
-
// Dependency Injection - SSR-Safe & Timezone-Safe
|
|
36
|
-
presetEngine = inject(PresetEngine);
|
|
37
|
-
clock;
|
|
38
|
-
adapter;
|
|
39
|
-
constructor() {
|
|
40
|
-
// Try to inject DATE_CLOCK, fallback to SystemClock if not provided
|
|
41
|
-
try {
|
|
42
|
-
this.clock = inject(DATE_CLOCK, { optional: true }) ?? new SystemClock();
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
// In case inject() fails (e.g., called outside injection context)
|
|
46
|
-
this.clock = new SystemClock();
|
|
47
|
-
}
|
|
48
|
-
// Try to inject DATE_ADAPTER, fallback to NativeDateAdapter if not provided
|
|
49
|
-
try {
|
|
50
|
-
this.adapter = inject(DATE_ADAPTER, { optional: true }) ?? new NativeDateAdapter();
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
this.adapter = new NativeDateAdapter();
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
// Configuration
|
|
57
|
-
config = signal({
|
|
58
|
-
enableTimePicker: false,
|
|
59
|
-
defaultStartTime: '00:00',
|
|
60
|
-
defaultEndTime: '23:59'
|
|
61
|
-
});
|
|
62
|
-
// Core state - using signals
|
|
63
|
-
_startDate = signal(null);
|
|
64
|
-
_endDate = signal(null);
|
|
65
|
-
_leftMonth = signal(new Date());
|
|
66
|
-
_rightMonth = signal(this.getNextMonth(new Date()));
|
|
67
|
-
_selectingStart = signal(true);
|
|
68
|
-
// Time state
|
|
69
|
-
_startTime = signal('00:00');
|
|
70
|
-
_endTime = signal('23:59');
|
|
71
|
-
// Pending state for requireApply mode
|
|
72
|
-
_pendingStart = signal(null);
|
|
73
|
-
_pendingEnd = signal(null);
|
|
74
|
-
_hasPendingChanges = signal(false);
|
|
75
|
-
// Public read-only signals
|
|
76
|
-
startDate = this._startDate.asReadonly();
|
|
77
|
-
endDate = this._endDate.asReadonly();
|
|
78
|
-
leftMonth = this._leftMonth.asReadonly();
|
|
79
|
-
rightMonth = this._rightMonth.asReadonly();
|
|
80
|
-
selectingStart = this._selectingStart.asReadonly();
|
|
81
|
-
startTime = this._startTime.asReadonly();
|
|
82
|
-
endTime = this._endTime.asReadonly();
|
|
83
|
-
hasPendingChanges = this._hasPendingChanges.asReadonly();
|
|
84
|
-
// Computed: ISO range for API consumption
|
|
85
|
-
range = computed(() => {
|
|
86
|
-
const start = this._startDate();
|
|
87
|
-
const end = this._endDate();
|
|
88
|
-
const cfg = this.config();
|
|
89
|
-
const result = {
|
|
90
|
-
start: this.adapter.toISODate(start),
|
|
91
|
-
end: this.adapter.toISODate(end)
|
|
92
|
-
};
|
|
93
|
-
if (cfg.enableTimePicker) {
|
|
94
|
-
result.startTime = this._startTime();
|
|
95
|
-
result.endTime = this._endTime();
|
|
96
|
-
}
|
|
97
|
-
return result;
|
|
98
|
-
});
|
|
99
|
-
// Computed: validation state
|
|
100
|
-
isValid = computed(() => {
|
|
101
|
-
const start = this._startDate();
|
|
102
|
-
const end = this._endDate();
|
|
103
|
-
const cfg = this.config();
|
|
104
|
-
const orderValidation = validateRangeOrder(start, end);
|
|
105
|
-
if (!orderValidation.valid)
|
|
106
|
-
return false;
|
|
107
|
-
const boundsValidation = validateRangeBounds(start, end, cfg.minDate, cfg.maxDate);
|
|
108
|
-
return boundsValidation.valid;
|
|
109
|
-
});
|
|
110
|
-
// Computed: range text for display
|
|
111
|
-
rangeText = computed(() => {
|
|
112
|
-
const start = this._startDate();
|
|
113
|
-
const end = this._endDate();
|
|
114
|
-
if (!start && !end)
|
|
115
|
-
return '';
|
|
116
|
-
if (!start)
|
|
117
|
-
return `? - ${this.formatDateShort(end)}`;
|
|
118
|
-
if (!end)
|
|
119
|
-
return `${this.formatDateShort(start)}`;
|
|
120
|
-
return `${this.formatDateShort(start)} - ${this.formatDateShort(end)}`;
|
|
121
|
-
});
|
|
122
|
-
/**
|
|
123
|
-
* Configure the store
|
|
124
|
-
*/
|
|
125
|
-
configure(config) {
|
|
126
|
-
this.config.update(current => ({ ...current, ...config }));
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Set start date (with validation)
|
|
130
|
-
*/
|
|
131
|
-
setStart(date) {
|
|
132
|
-
const parsedDate = this.parseDate(date);
|
|
133
|
-
if (parsedDate) {
|
|
134
|
-
const cfg = this.config();
|
|
135
|
-
// Apply bounds
|
|
136
|
-
const boundedDate = applyBounds(parsedDate, cfg.minDate, cfg.maxDate);
|
|
137
|
-
// Check if disabled
|
|
138
|
-
if (isDateDisabled(boundedDate, cfg.disabledDates)) {
|
|
139
|
-
console.warn('Cannot select disabled date');
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
this._startDate.set(boundedDate);
|
|
143
|
-
this._selectingStart.set(false);
|
|
144
|
-
// Auto-adjust end if it becomes invalid
|
|
145
|
-
const end = this._endDate();
|
|
146
|
-
if (end && end < boundedDate) {
|
|
147
|
-
this._endDate.set(null);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
this._startDate.set(null);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Set end date (with validation)
|
|
156
|
-
*/
|
|
157
|
-
setEnd(date) {
|
|
158
|
-
const parsedDate = this.parseDate(date);
|
|
159
|
-
if (parsedDate) {
|
|
160
|
-
const cfg = this.config();
|
|
161
|
-
// Apply bounds
|
|
162
|
-
const boundedDate = applyBounds(parsedDate, cfg.minDate, cfg.maxDate);
|
|
163
|
-
// Check if disabled
|
|
164
|
-
if (isDateDisabled(boundedDate, cfg.disabledDates)) {
|
|
165
|
-
console.warn('Cannot select disabled date');
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
// Validate order
|
|
169
|
-
const start = this._startDate();
|
|
170
|
-
if (start && boundedDate < start) {
|
|
171
|
-
console.warn('End date cannot be before start date');
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
this._endDate.set(boundedDate);
|
|
175
|
-
this._selectingStart.set(true); // Ready for next selection
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
this._endDate.set(null);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Set complete range at once
|
|
183
|
-
*/
|
|
184
|
-
setRange(start, end) {
|
|
185
|
-
this.setStart(start);
|
|
186
|
-
this.setEnd(end);
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Set pending selection (for requireApply mode)
|
|
190
|
-
*/
|
|
191
|
-
setPendingStart(date) {
|
|
192
|
-
const parsedDate = this.parseDate(date);
|
|
193
|
-
this._pendingStart.set(parsedDate);
|
|
194
|
-
this._hasPendingChanges.set(true);
|
|
195
|
-
}
|
|
196
|
-
setPendingEnd(date) {
|
|
197
|
-
const parsedDate = this.parseDate(date);
|
|
198
|
-
this._pendingEnd.set(parsedDate);
|
|
199
|
-
this._hasPendingChanges.set(true);
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Apply pending changes
|
|
203
|
-
*/
|
|
204
|
-
applyPending() {
|
|
205
|
-
const pendingStart = this._pendingStart();
|
|
206
|
-
const pendingEnd = this._pendingEnd();
|
|
207
|
-
if (pendingStart)
|
|
208
|
-
this.setStart(pendingStart);
|
|
209
|
-
if (pendingEnd)
|
|
210
|
-
this.setEnd(pendingEnd);
|
|
211
|
-
this.clearPending();
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Cancel pending changes
|
|
215
|
-
*/
|
|
216
|
-
cancelPending() {
|
|
217
|
-
this.clearPending();
|
|
218
|
-
}
|
|
219
|
-
clearPending() {
|
|
220
|
-
this._pendingStart.set(null);
|
|
221
|
-
this._pendingEnd.set(null);
|
|
222
|
-
this._hasPendingChanges.set(false);
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Reset to empty state
|
|
226
|
-
*/
|
|
227
|
-
reset() {
|
|
228
|
-
this._startDate.set(null);
|
|
229
|
-
this._endDate.set(null);
|
|
230
|
-
this._selectingStart.set(true);
|
|
231
|
-
this.clearPending();
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Apply a preset by key
|
|
235
|
-
*
|
|
236
|
-
* SSR-Safe: Uses injected DateClock for deterministic resolution
|
|
237
|
-
*
|
|
238
|
-
* @param presetKey - Preset identifier (e.g., 'TODAY', 'LAST_7_DAYS')
|
|
239
|
-
* @param now - Optional date override (defaults to clock.now())
|
|
240
|
-
*/
|
|
241
|
-
applyPreset(presetKey, now) {
|
|
242
|
-
const currentDate = now ?? this.clock.now();
|
|
243
|
-
const range = this.presetEngine.resolve(presetKey, currentDate);
|
|
244
|
-
if (range) {
|
|
245
|
-
this.setRange(range.start, range.end);
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
console.warn(`Preset "${presetKey}" not found`);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Navigate left calendar month
|
|
253
|
-
*/
|
|
254
|
-
setLeftMonth(date) {
|
|
255
|
-
this._leftMonth.set(date);
|
|
256
|
-
// Ensure right month is always after left
|
|
257
|
-
const right = this._rightMonth();
|
|
258
|
-
if (right <= date) {
|
|
259
|
-
this._rightMonth.set(this.getNextMonth(date));
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* Navigate right calendar month
|
|
264
|
-
*/
|
|
265
|
-
setRightMonth(date) {
|
|
266
|
-
this._rightMonth.set(date);
|
|
267
|
-
// Ensure left month is always before right
|
|
268
|
-
const left = this._leftMonth();
|
|
269
|
-
if (left >= date) {
|
|
270
|
-
this._leftMonth.set(this.getPreviousMonth(date));
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Set time values
|
|
275
|
-
*/
|
|
276
|
-
setStartTime(time) {
|
|
277
|
-
this._startTime.set(time);
|
|
278
|
-
}
|
|
279
|
-
setEndTime(time) {
|
|
280
|
-
this._endTime.set(time);
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Get current state as snapshot
|
|
284
|
-
*/
|
|
285
|
-
getSnapshot() {
|
|
286
|
-
return this.range();
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Load state from snapshot
|
|
290
|
-
*/
|
|
291
|
-
loadSnapshot(snapshot) {
|
|
292
|
-
this.setRange(snapshot.start, snapshot.end);
|
|
293
|
-
if (snapshot.startTime) {
|
|
294
|
-
this.setStartTime(snapshot.startTime);
|
|
295
|
-
}
|
|
296
|
-
if (snapshot.endTime) {
|
|
297
|
-
this.setEndTime(snapshot.endTime);
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
// Helper methods - using DateAdapter for timezone safety
|
|
301
|
-
parseDate(date) {
|
|
302
|
-
if (!date)
|
|
303
|
-
return null;
|
|
304
|
-
if (date instanceof Date)
|
|
305
|
-
return this.adapter.normalize(date);
|
|
306
|
-
return this.adapter.parseISODate(date);
|
|
307
|
-
}
|
|
308
|
-
getNextMonth(date) {
|
|
309
|
-
return this.adapter.addMonths(date, 1);
|
|
310
|
-
}
|
|
311
|
-
getPreviousMonth(date) {
|
|
312
|
-
return this.adapter.addMonths(date, -1);
|
|
313
|
-
}
|
|
314
|
-
formatDateShort(date) {
|
|
315
|
-
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
316
|
-
const month = this.adapter.getMonth(date);
|
|
317
|
-
const day = this.adapter.getDay(date);
|
|
318
|
-
return `${day} ${months[month]}`;
|
|
319
|
-
}
|
|
320
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDateRangeStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
321
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDateRangeStore, providedIn: 'root' });
|
|
322
|
-
}
|
|
323
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDateRangeStore, decorators: [{
|
|
324
|
-
type: Injectable,
|
|
325
|
-
args: [{
|
|
326
|
-
providedIn: 'root'
|
|
327
|
-
}]
|
|
328
|
-
}], ctorParameters: () => [] });
|
|
329
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVhbC1kYXRlLXJhbmdlLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvZHVhbC1kYXRlLXJhbmdlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLGNBQWMsRUFDZCxXQUFXLEVBR1osTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFlLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQXFCMUQsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixrREFBa0Q7SUFDMUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwQyxLQUFLLENBQVk7SUFDakIsT0FBTyxDQUFjO0lBRTdCO1FBQ0Usb0VBQW9FO1FBQ3BFLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLGtFQUFrRTtZQUNsRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSxJ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QUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBVTtRQUM3QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBVTtRQUNqQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxlQUFlLENBQUMsSUFBVTtRQUNoQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEcsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsT0FBTyxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztJQUNuQyxDQUFDO3dHQTVVVSxrQkFBa0I7NEdBQWxCLGtCQUFrQixjQUZqQixNQUFNOzs0RkFFUCxrQkFBa0I7a0JBSDlCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIZWFkbGVzcyBEYXRlIFJhbmdlIFN0b3JlIHVzaW5nIEFuZ3VsYXIgU2lnbmFsc1xuICogXG4gKiBWZXJzaW9uOiAzLjUuMVxuICogXG4gKiBBcmNoaXRlY3R1cmU6XG4gKiAtIFN0YXRlIGxpdmVzIEhFUkUsIG5vdCBpbiBVSSBjb21wb25lbnRcbiAqIC0gRGV0ZXJtaW5pc3RpYzogbm8gaGlkZGVuIHNpZGUgZWZmZWN0c1xuICogLSBTU1ItY29tcGF0aWJsZTogbm8gd2luZG93L2RvY3VtZW50IGRlcGVuZGVuY2llc1xuICogLSBUaW1lem9uZS1zYWZlOiB1c2VzIERhdGVBZGFwdGVyIGZvciBhbGwgZGF0ZSBvcGVyYXRpb25zXG4gKiAtIFRlc3RhYmxlOiBwdXJlIHNpZ25hbC1iYXNlZCBzdGF0ZVxuICogLSBSZXVzYWJsZTogaW5qZWN0IGFueXdoZXJlIChzZXJ2aWNlcywgY29tcG9uZW50cywgZ3VhcmRzKVxuICogXG4gKiBVc2FnZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluIGNvbXBvbmVudFxuICogY29uc3QgcmFuZ2VTdG9yZSA9IGluamVjdChEdWFsRGF0ZVJhbmdlU3RvcmUpO1xuICogcmFuZ2VTdG9yZS5hcHBseVByZXNldCgnVEhJU19NT05USCcpO1xuICogXG4gKiAvLyBJbiBzZXJ2aWNlIChoZWFkbGVzcyEpXG4gKiBjb25zdCBzdG9yZSA9IGluamVjdChEdWFsRGF0ZVJhbmdlU3RvcmUpO1xuICogY29uc3QgcmFuZ2UgPSBzdG9yZS5yYW5nZSgpO1xuICogdGhpcy5odHRwLmdldChgL2FwaS9zYWxlcz9zdGFydD0ke3JhbmdlLnN0YXJ0fSZlbmQ9JHtyYW5nZS5lbmR9YCk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgXG4gIHZhbGlkYXRlUmFuZ2VPcmRlciwgXG4gIHZhbGlkYXRlUmFuZ2VCb3VuZHMsIFxuICBpc0RhdGVEaXNhYmxlZCxcbiAgYXBwbHlCb3VuZHMsXG4gIHBhcnNlSVNPRGF0ZSxcbiAgZm9ybWF0SVNPRGF0ZVxufSBmcm9tICcuL3JhbmdlLnZhbGlkYXRvcic7XG5pbXBvcnQgeyBQcmVzZXRFbmdpbmUsIFByZXNldFJhbmdlIH0gZnJvbSAnLi9wcmVzZXQuZW5naW5lJztcbmltcG9ydCB7IERhdGVDbG9jaywgREFURV9DTE9DSyB9IGZyb20gJy4vZGF0ZS1jbG9jayc7XG5pbXBvcnQgeyBTeXN0ZW1DbG9jayB9IGZyb20gJy4vc3lzdGVtLWNsb2NrJztcbmltcG9ydCB7IERhdGVBZGFwdGVyLCBEQVRFX0FEQVBURVIgfSBmcm9tICcuL2RhdGUtYWRhcHRlcic7XG5pbXBvcnQgeyBOYXRpdmVEYXRlQWRhcHRlciB9IGZyb20gJy4vbmF0aXZlLWRhdGUtYWRhcHRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVJhbmdlU3RhdGUge1xuICBzdGFydDogc3RyaW5nOyAvLyBJU08gZGF0ZVxuICBlbmQ6IHN0cmluZzsgLy8gSVNPIGRhdGVcbiAgc3RhcnRUaW1lPzogc3RyaW5nOyAvLyBISDptbVxuICBlbmRUaW1lPzogc3RyaW5nOyAvLyBISDptbVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVSYW5nZUNvbmZpZyB7XG4gIG1pbkRhdGU/OiBEYXRlO1xuICBtYXhEYXRlPzogRGF0ZTtcbiAgZGlzYWJsZWREYXRlcz86IERhdGVbXSB8ICgoZGF0ZTogRGF0ZSkgPT4gYm9vbGVhbik7XG4gIGVuYWJsZVRpbWVQaWNrZXI/OiBib29sZWFuO1xuICBkZWZhdWx0U3RhcnRUaW1lPzogc3RyaW5nO1xuICBkZWZhdWx0RW5kVGltZT86IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRHVhbERhdGVSYW5nZVN0b3JlIHtcbiAgLy8gRGVwZW5kZW5jeSBJbmplY3Rpb24gLSBTU1ItU2FmZSAmIFRpbWV6b25lLVNhZmVcbiAgcHJpdmF0ZSBwcmVzZXRFbmdpbmUgPSBpbmplY3QoUHJlc2V0RW5naW5lKTtcbiAgcHJpdmF0ZSBjbG9jazogRGF0ZUNsb2NrO1xuICBwcml2YXRlIGFkYXB0ZXI6IERhdGVBZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFRyeSB0byBpbmplY3QgREFURV9DTE9DSywgZmFsbGJhY2sgdG8gU3lzdGVtQ2xvY2sgaWYgbm90IHByb3ZpZGVkXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2xvY2sgPSBpbmplY3QoREFURV9DTE9DSywgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyBuZXcgU3lzdGVtQ2xvY2soKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEluIGNhc2UgaW5qZWN0KCkgZmFpbHMgKGUuZy4sIGNhbGxlZCBvdXRzaWRlIGluamVjdGlvbiBjb250ZXh0KVxuICAgICAgdGhpcy5jbG9jayA9IG5ldyBTeXN0ZW1DbG9jaygpO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBpbmplY3QgREFURV9BREFQVEVSLCBmYWxsYmFjayB0byBOYXRpdmVEYXRlQWRhcHRlciBpZiBub3QgcHJvdmlkZWRcbiAgICB0cnkge1xuICAgICAgdGhpcy5hZGFwdGVyID0gaW5qZWN0KERBVEVfQURBUFRFUiwgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyBuZXcgTmF0aXZlRGF0ZUFkYXB0ZXIoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuYWRhcHRlciA9IG5ldyBOYXRpdmVEYXRlQWRhcHRlcigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBjb25maWcgPSBzaWduYWw8RGF0ZVJhbmdlQ29uZmlnPih7XG4gICAgZW5hYmxlVGltZVBpY2tlcjogZmFsc2UsXG4gICAgZGVmYXVsdFN0YXJ0VGltZTogJzAwOjAwJyxcbiAgICBkZWZhdWx0RW5kVGltZTogJzIzOjU5J1xuICB9KTtcblxuICAvLyBDb3JlIHN0YXRlIC0gdXNpbmcgc2lnbmFsc1xuICBwcml2YXRlIF9zdGFydERhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIF9lbmREYXRlID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBfbGVmdE1vbnRoID0gc2lnbmFsPERhdGU+KG5ldyBEYXRlKCkpO1xuICBwcml2YXRlIF9yaWdodE1vbnRoID0gc2lnbmFsPERhdGU+KHRoaXMuZ2V0TmV4dE1vbnRoKG5ldyBEYXRlKCkpKTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW5nU3RhcnQgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgLy8gVGltZSBzdGF0ZVxuICBwcml2YXRlIF9zdGFydFRpbWUgPSBzaWduYWw8c3RyaW5nPignMDA6MDAnKTtcbiAgcHJpdmF0ZSBfZW5kVGltZSA9IHNpZ25hbDxzdHJpbmc+KCcyMzo1OScpO1xuXG4gIC8vIFBlbmRpbmcgc3RhdGUgZm9yIHJlcXVpcmVBcHBseSBtb2RlXG4gIHByaXZhdGUgX3BlbmRpbmdTdGFydCA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgX3BlbmRpbmdFbmQgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIF9oYXNQZW5kaW5nQ2hhbmdlcyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gUHVibGljIHJlYWQtb25seSBzaWduYWxzXG4gIHJlYWRvbmx5IHN0YXJ0RGF0ZSA9IHRoaXMuX3N0YXJ0RGF0ZS5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IGVuZERhdGUgPSB0aGlzLl9lbmREYXRlLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgbGVmdE1vbnRoID0gdGhpcy5fbGVmdE1vbnRoLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgcmlnaHRNb250aCA9IHRoaXMuX3JpZ2h0TW9udGguYXNSZWFkb25seSgpO1xuICByZWFkb25seSBzZWxlY3RpbmdTdGFydCA9IHRoaXMuX3NlbGVjdGluZ1N0YXJ0LmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgc3RhcnRUaW1lID0gdGhpcy5fc3RhcnRUaW1lLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgZW5kVGltZSA9IHRoaXMuX2VuZFRpbWUuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBoYXNQZW5kaW5nQ2hhbmdlcyA9IHRoaXMuX2hhc1BlbmRpbmdDaGFuZ2VzLmFzUmVhZG9ubHkoKTtcblxuICAvLyBDb21wdXRlZDogSVNPIHJhbmdlIGZvciBBUEkgY29uc3VtcHRpb25cbiAgcmVhZG9ubHkgcmFuZ2UgPSBjb21wdXRlZDxEYXRlUmFuZ2VTdGF0ZT4oKCkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fc3RhcnREYXRlKCk7XG4gICAgY29uc3QgZW5kID0gdGhpcy5fZW5kRGF0ZSgpO1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnKCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IERhdGVSYW5nZVN0YXRlID0ge1xuICAgICAgc3RhcnQ6IHRoaXMuYWRhcHRlci50b0lTT0RhdGUoc3RhcnQpLFxuICAgICAgZW5kOiB0aGlzLmFkYXB0ZXIudG9JU09EYXRlKGVuZClcbiAgICB9O1xuXG4gICAgaWYgKGNmZy5lbmFibGVUaW1lUGlja2VyKSB7XG4gICAgICByZXN1bHQuc3RhcnRUaW1lID0gdGhpcy5fc3RhcnRUaW1lKCk7XG4gICAgICByZXN1bHQuZW5kVGltZSA9IHRoaXMuX2VuZFRpbWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcblxuICAvLyBDb21wdXRlZDogdmFsaWRhdGlvbiBzdGF0ZVxuICByZWFkb25seSBpc1ZhbGlkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fc3RhcnREYXRlKCk7XG4gICAgY29uc3QgZW5kID0gdGhpcy5fZW5kRGF0ZSgpO1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnKCk7XG5cbiAgICBjb25zdCBvcmRlclZhbGlkYXRpb24gPSB2YWxpZGF0ZVJhbmdlT3JkZXIoc3RhcnQsIGVuZCk7XG4gICAgaWYgKCFvcmRlclZhbGlkYXRpb24udmFsaWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGJvdW5kc1ZhbGlkYXRpb24gPSB2YWxpZGF0ZVJhbmdlQm91bmRzKFxuICAgICAgc3RhcnQsXG4gICAgICBlbmQsXG4gICAgICBjZmcubWluRGF0ZSxcbiAgICAgIGNmZy5tYXhEYXRlXG4gICAgKTtcbiAgICByZXR1cm4gYm91bmRzVmFsaWRhdGlvbi52YWxpZDtcbiAgfSk7XG5cbiAgLy8gQ29tcHV0ZWQ6IHJhbmdlIHRleHQgZm9yIGRpc3BsYXlcbiAgcmVhZG9ubHkgcmFuZ2VUZXh0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fc3RhcnREYXRlKCk7XG4gICAgY29uc3QgZW5kID0gdGhpcy5fZW5kRGF0ZSgpO1xuXG4gICAgaWYgKCFzdGFydCAmJiAhZW5kKSByZXR1cm4gJyc7XG4gICAgaWYgKCFzdGFydCkgcmV0dXJuIGA/IC0gJHt0aGlzLmZvcm1hdERhdGVTaG9ydChlbmQhKX1gO1xuICAgIGlmICghZW5kKSByZXR1cm4gYCR7dGhpcy5mb3JtYXREYXRlU2hvcnQoc3RhcnQpfWA7XG5cbiAgICByZXR1cm4gYCR7dGhpcy5mb3JtYXREYXRlU2hvcnQoc3RhcnQpfSAtICR7dGhpcy5mb3JtYXREYXRlU2hvcnQoZW5kKX1gO1xuICB9KTtcblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSBzdG9yZVxuICAgKi9cbiAgY29uZmlndXJlKGNvbmZpZzogUGFydGlhbDxEYXRlUmFuZ2VDb25maWc+KTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcudXBkYXRlKGN1cnJlbnQgPT4gKHsgLi4uY3VycmVudCwgLi4uY29uZmlnIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc3RhcnQgZGF0ZSAod2l0aCB2YWxpZGF0aW9uKVxuICAgKi9cbiAgc2V0U3RhcnQoZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZSk7XG4gICAgXG4gICAgaWYgKHBhcnNlZERhdGUpIHtcbiAgICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnKCk7XG4gICAgICBcbiAgICAgIC8vIEFwcGx5IGJvdW5kc1xuICAgICAgY29uc3QgYm91bmRlZERhdGUgPSBhcHBseUJvdW5kcyhwYXJzZWREYXRlLCBjZmcubWluRGF0ZSwgY2ZnLm1heERhdGUpO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBkaXNhYmxlZFxuICAgICAgaWYgKGlzRGF0ZURpc2FibGVkKGJvdW5kZWREYXRlLCBjZmcuZGlzYWJsZWREYXRlcykpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdDYW5ub3Qgc2VsZWN0IGRpc2FibGVkIGRhdGUnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zdGFydERhdGUuc2V0KGJvdW5kZWREYXRlKTtcbiAgICAgIHRoaXMuX3NlbGVjdGluZ1N0YXJ0LnNldChmYWxzZSk7XG5cbiAgICAgIC8vIEF1dG8tYWRqdXN0IGVuZCBpZiBpdCBiZWNvbWVzIGludmFsaWRcbiAgICAgIGNvbnN0IGVuZCA9IHRoaXMuX2VuZERhdGUoKTtcbiAgICAgIGlmIChlbmQgJiYgZW5kIDwgYm91bmRlZERhdGUpIHtcbiAgICAgICAgdGhpcy5fZW5kRGF0ZS5zZXQobnVsbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3N0YXJ0RGF0ZS5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBlbmQgZGF0ZSAod2l0aCB2YWxpZGF0aW9uKVxuICAgKi9cbiAgc2V0RW5kKGRhdGU6IERhdGUgfCBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VEYXRlKGRhdGUpO1xuICAgIFxuICAgIGlmIChwYXJzZWREYXRlKSB7XG4gICAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZygpO1xuICAgICAgXG4gICAgICAvLyBBcHBseSBib3VuZHNcbiAgICAgIGNvbnN0IGJvdW5kZWREYXRlID0gYXBwbHlCb3VuZHMocGFyc2VkRGF0ZSwgY2ZnLm1pbkRhdGUsIGNmZy5tYXhEYXRlKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgZGlzYWJsZWRcbiAgICAgIGlmIChpc0RhdGVEaXNhYmxlZChib3VuZGVkRGF0ZSwgY2ZnLmRpc2FibGVkRGF0ZXMpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHNlbGVjdCBkaXNhYmxlZCBkYXRlJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgb3JkZXJcbiAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fc3RhcnREYXRlKCk7XG4gICAgICBpZiAoc3RhcnQgJiYgYm91bmRlZERhdGUgPCBzdGFydCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0VuZCBkYXRlIGNhbm5vdCBiZSBiZWZvcmUgc3RhcnQgZGF0ZScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VuZERhdGUuc2V0KGJvdW5kZWREYXRlKTtcbiAgICAgIHRoaXMuX3NlbGVjdGluZ1N0YXJ0LnNldCh0cnVlKTsgLy8gUmVhZHkgZm9yIG5leHQgc2VsZWN0aW9uXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2VuZERhdGUuc2V0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY29tcGxldGUgcmFuZ2UgYXQgb25jZVxuICAgKi9cbiAgc2V0UmFuZ2Uoc3RhcnQ6IERhdGUgfCBzdHJpbmcgfCBudWxsLCBlbmQ6IERhdGUgfCBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZXRTdGFydChzdGFydCk7XG4gICAgdGhpcy5zZXRFbmQoZW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcGVuZGluZyBzZWxlY3Rpb24gKGZvciByZXF1aXJlQXBwbHkgbW9kZSlcbiAgICovXG4gIHNldFBlbmRpbmdTdGFydChkYXRlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcnNlZERhdGUgPSB0aGlzLnBhcnNlRGF0ZShkYXRlKTtcbiAgICB0aGlzLl9wZW5kaW5nU3RhcnQuc2V0KHBhcnNlZERhdGUpO1xuICAgIHRoaXMuX2hhc1BlbmRpbmdDaGFuZ2VzLnNldCh0cnVlKTtcbiAgfVxuXG4gIHNldFBlbmRpbmdFbmQoZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZSk7XG4gICAgdGhpcy5fcGVuZGluZ0VuZC5zZXQocGFyc2VkRGF0ZSk7XG4gICAgdGhpcy5faGFzUGVuZGluZ0NoYW5nZXMuc2V0KHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHBlbmRpbmcgY2hhbmdlc1xuICAgKi9cbiAgYXBwbHlQZW5kaW5nKCk6IHZvaWQge1xuICAgIGNvbnN0IHBlbmRpbmdTdGFydCA9IHRoaXMuX3BlbmRpbmdTdGFydCgpO1xuICAgIGNvbnN0IHBlbmRpbmdFbmQgPSB0aGlzLl9wZW5kaW5nRW5kKCk7XG5cbiAgICBpZiAocGVuZGluZ1N0YXJ0KSB0aGlzLnNldFN0YXJ0KHBlbmRpbmdTdGFydCk7XG4gICAgaWYgKHBlbmRpbmdFbmQpIHRoaXMuc2V0RW5kKHBlbmRpbmdFbmQpO1xuXG4gICAgdGhpcy5jbGVhclBlbmRpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgcGVuZGluZyBjaGFuZ2VzXG4gICAqL1xuICBjYW5jZWxQZW5kaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJQZW5kaW5nKCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUGVuZGluZygpOiB2b2lkIHtcbiAgICB0aGlzLl9wZW5kaW5nU3RhcnQuc2V0KG51bGwpO1xuICAgIHRoaXMuX3BlbmRpbmdFbmQuc2V0KG51bGwpO1xuICAgIHRoaXMuX2hhc1BlbmRpbmdDaGFuZ2VzLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdG8gZW1wdHkgc3RhdGVcbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXJ0RGF0ZS5zZXQobnVsbCk7XG4gICAgdGhpcy5fZW5kRGF0ZS5zZXQobnVsbCk7XG4gICAgdGhpcy5fc2VsZWN0aW5nU3RhcnQuc2V0KHRydWUpO1xuICAgIHRoaXMuY2xlYXJQZW5kaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYSBwcmVzZXQgYnkga2V5XG4gICAqIFxuICAgKiBTU1ItU2FmZTogVXNlcyBpbmplY3RlZCBEYXRlQ2xvY2sgZm9yIGRldGVybWluaXN0aWMgcmVzb2x1dGlvblxuICAgKiBcbiAgICogQHBhcmFtIHByZXNldEtleSAtIFByZXNldCBpZGVudGlmaWVyIChlLmcuLCAnVE9EQVknLCAnTEFTVF83X0RBWVMnKVxuICAgKiBAcGFyYW0gbm93IC0gT3B0aW9uYWwgZGF0ZSBvdmVycmlkZSAoZGVmYXVsdHMgdG8gY2xvY2subm93KCkpXG4gICAqL1xuICBhcHBseVByZXNldChwcmVzZXRLZXk6IHN0cmluZywgbm93PzogRGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbm93ID8/IHRoaXMuY2xvY2subm93KCk7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLnByZXNldEVuZ2luZS5yZXNvbHZlKHByZXNldEtleSwgY3VycmVudERhdGUpO1xuICAgIFxuICAgIGlmIChyYW5nZSkge1xuICAgICAgdGhpcy5zZXRSYW5nZShyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBQcmVzZXQgXCIke3ByZXNldEtleX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGUgbGVmdCBjYWxlbmRhciBtb250aFxuICAgKi9cbiAgc2V0TGVmdE1vbnRoKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9sZWZ0TW9udGguc2V0KGRhdGUpO1xuICAgIFxuICAgIC8vIEVuc3VyZSByaWdodCBtb250aCBpcyBhbHdheXMgYWZ0ZXIgbGVmdFxuICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5fcmlnaHRNb250aCgpO1xuICAgIGlmIChyaWdodCA8PSBkYXRlKSB7XG4gICAgICB0aGlzLl9yaWdodE1vbnRoLnNldCh0aGlzLmdldE5leHRNb250aChkYXRlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlIHJpZ2h0IGNhbGVuZGFyIG1vbnRoXG4gICAqL1xuICBzZXRSaWdodE1vbnRoKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9yaWdodE1vbnRoLnNldChkYXRlKTtcbiAgICBcbiAgICAvLyBFbnN1cmUgbGVmdCBtb250aCBpcyBhbHdheXMgYmVmb3JlIHJpZ2h0XG4gICAgY29uc3QgbGVmdCA9IHRoaXMuX2xlZnRNb250aCgpO1xuICAgIGlmIChsZWZ0ID49IGRhdGUpIHtcbiAgICAgIHRoaXMuX2xlZnRNb250aC5zZXQodGhpcy5nZXRQcmV2aW91c01vbnRoKGRhdGUpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRpbWUgdmFsdWVzXG4gICAqL1xuICBzZXRTdGFydFRpbWUodGltZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhcnRUaW1lLnNldCh0aW1lKTtcbiAgfVxuXG4gIHNldEVuZFRpbWUodGltZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fZW5kVGltZS5zZXQodGltZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgc3RhdGUgYXMgc25hcHNob3RcbiAgICovXG4gIGdldFNuYXBzaG90KCk6IERhdGVSYW5nZVN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5yYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgc3RhdGUgZnJvbSBzbmFwc2hvdFxuICAgKi9cbiAgbG9hZFNuYXBzaG90KHNuYXBzaG90OiBEYXRlUmFuZ2VTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuc2V0UmFuZ2Uoc25hcHNob3Quc3RhcnQsIHNuYXBzaG90LmVuZCk7XG4gICAgXG4gICAgaWYgKHNuYXBzaG90LnN0YXJ0VGltZSkge1xuICAgICAgdGhpcy5zZXRTdGFydFRpbWUoc25hcHNob3Quc3RhcnRUaW1lKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHNuYXBzaG90LmVuZFRpbWUpIHtcbiAgICAgIHRoaXMuc2V0RW5kVGltZShzbmFwc2hvdC5lbmRUaW1lKTtcbiAgICB9XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kcyAtIHVzaW5nIERhdGVBZGFwdGVyIGZvciB0aW1lem9uZSBzYWZldHlcbiAgcHJpdmF0ZSBwYXJzZURhdGUoZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwpOiBEYXRlIHwgbnVsbCB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB0aGlzLmFkYXB0ZXIubm9ybWFsaXplKGRhdGUpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucGFyc2VJU09EYXRlKGRhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROZXh0TW9udGgoZGF0ZTogRGF0ZSk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuYWRkTW9udGhzKGRhdGUsIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcmV2aW91c01vbnRoKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmFkZE1vbnRocyhkYXRlLCAtMSk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdERhdGVTaG9ydChkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107XG4gICAgY29uc3QgbW9udGggPSB0aGlzLmFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSk7XG4gICAgY29uc3QgZGF5ID0gdGhpcy5hZGFwdGVyLmdldERheShkYXRlKTtcbiAgICByZXR1cm4gYCR7ZGF5fSAke21vbnRoc1ttb250aF19YDtcbiAgfVxufVxuIl19
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* INTERNAL API for @oneluiz/dual-datepicker
|
|
3
|
-
*
|
|
4
|
-
* This file exports implementation details required by the component itself.
|
|
5
|
-
* These exports are NOT part of the public API and may change without notice.
|
|
6
|
-
*
|
|
7
|
-
* ⚠️ DO NOT import from this file in your application code.
|
|
8
|
-
* ⚠️ Use the public API from '@oneluiz/dual-datepicker/core' instead.
|
|
9
|
-
*
|
|
10
|
-
* @internal
|
|
11
|
-
* @packageDocumentation
|
|
12
|
-
* @since v4.0.0
|
|
13
|
-
*/
|
|
14
|
-
/**
|
|
15
|
-
* CalendarGridFactory - Deterministic grid generation
|
|
16
|
-
*
|
|
17
|
-
* Creates normalized 42-cell grids (6 weeks × 7 days).
|
|
18
|
-
* Pure function approach with no side effects.
|
|
19
|
-
*
|
|
20
|
-
* @internal
|
|
21
|
-
*/
|
|
22
|
-
export { CalendarGridFactory } from './calendar-grid/calendar-grid.factory';
|
|
23
|
-
/**
|
|
24
|
-
* CalendarGridCache - LRU cache for grid structures
|
|
25
|
-
*
|
|
26
|
-
* Memoizes calendar grids by month/weekStart/locale.
|
|
27
|
-
* Prevents redundant grid generation on re-renders.
|
|
28
|
-
*
|
|
29
|
-
* @internal
|
|
30
|
-
*/
|
|
31
|
-
export { CalendarGridCache } from './calendar-grid/calendar-grid.cache';
|
|
32
|
-
/**
|
|
33
|
-
* RangeHighlighter - Pure decoration logic
|
|
34
|
-
*
|
|
35
|
-
* Applies range highlighting to calendar grids.
|
|
36
|
-
* Handles start/end/hover/disabled states.
|
|
37
|
-
*
|
|
38
|
-
* @internal
|
|
39
|
-
*/
|
|
40
|
-
export { RangeHighlighter } from './calendar-grid/range-highlighter';
|
|
41
|
-
/**
|
|
42
|
-
* RangeHighlighterCache - LRU cache for decorated grids
|
|
43
|
-
*
|
|
44
|
-
* Memoizes decorated grids by range parameters.
|
|
45
|
-
* Eliminates redundant decoration computations.
|
|
46
|
-
*
|
|
47
|
-
* @internal
|
|
48
|
-
*/
|
|
49
|
-
export { RangeHighlighterCache } from './calendar-grid/range-highlighter.cache';
|
|
50
|
-
/**
|
|
51
|
-
* Virtual Weeks Logic
|
|
52
|
-
*
|
|
53
|
-
* Functions for calculating visible week windows.
|
|
54
|
-
* Enables progressive rendering and infinite scroll.
|
|
55
|
-
*
|
|
56
|
-
* @internal
|
|
57
|
-
*/
|
|
58
|
-
export { getVisibleWeeks, navigateWeekWindow, isVirtualWeeksEnabled } from './calendar-grid/virtual-weeks.logic';
|
|
59
|
-
// ============================================================================
|
|
60
|
-
// CACHE CONFIGURATION (v3.9.2+)
|
|
61
|
-
// ============================================================================
|
|
62
|
-
/**
|
|
63
|
-
* Cache Configuration
|
|
64
|
-
*
|
|
65
|
-
* Shared cache size limits for memory safety.
|
|
66
|
-
* MAX_CACHE_ENTRIES = 48 (4 years of navigation)
|
|
67
|
-
*
|
|
68
|
-
* @internal
|
|
69
|
-
*/
|
|
70
|
-
export { MAX_CACHE_ENTRIES } from './calendar-grid/cache.config';
|
|
71
|
-
/**
|
|
72
|
-
* SystemClock - Default implementation
|
|
73
|
-
*
|
|
74
|
-
* Uses native Date.now() and new Date().
|
|
75
|
-
* Default time source for production.
|
|
76
|
-
*
|
|
77
|
-
* @internal
|
|
78
|
-
*/
|
|
79
|
-
export { SystemClock } from './system-clock';
|
|
80
|
-
// ============================================================================
|
|
81
|
-
// TESTING UTILITIES
|
|
82
|
-
// ============================================================================
|
|
83
|
-
/**
|
|
84
|
-
* Testing Helpers
|
|
85
|
-
*
|
|
86
|
-
* Utilities for writing deterministic tests.
|
|
87
|
-
* FixedClock, makeDate, etc.
|
|
88
|
-
*
|
|
89
|
-
* @internal
|
|
90
|
-
*/
|
|
91
|
-
export * from './testing';
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9pbnRlcm5hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFvQkg7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTVFOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQXFCeEU7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXJFOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQW1CaEY7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFDTCxlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUN0QixNQUFNLHFDQUFxQyxDQUFDO0FBRTdDLCtFQUErRTtBQUMvRSxnQ0FBZ0M7QUFDaEMsK0VBQStFO0FBRS9FOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQWdCakU7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QywrRUFBK0U7QUFDL0Usb0JBQW9CO0FBQ3BCLCtFQUErRTtBQUUvRTs7Ozs7OztHQU9HO0FBQ0gsY0FBYyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIElOVEVSTkFMIEFQSSBmb3IgQG9uZWx1aXovZHVhbC1kYXRlcGlja2VyXG4gKiBcbiAqIFRoaXMgZmlsZSBleHBvcnRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMgcmVxdWlyZWQgYnkgdGhlIGNvbXBvbmVudCBpdHNlbGYuXG4gKiBUaGVzZSBleHBvcnRzIGFyZSBOT1QgcGFydCBvZiB0aGUgcHVibGljIEFQSSBhbmQgbWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS5cbiAqIFxuICog4pqg77iPIERPIE5PVCBpbXBvcnQgZnJvbSB0aGlzIGZpbGUgaW4geW91ciBhcHBsaWNhdGlvbiBjb2RlLlxuICog4pqg77iPIFVzZSB0aGUgcHVibGljIEFQSSBmcm9tICdAb25lbHVpei9kdWFsLWRhdGVwaWNrZXIvY29yZScgaW5zdGVhZC5cbiAqIFxuICogQGludGVybmFsXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIEBzaW5jZSB2NC4wLjBcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDQUxFTkRBUiBHUklEIFNZU1RFTSAodjMuNy4wKylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDYWxlbmRhciBHcmlkIFR5cGVzXG4gKiBcbiAqIENvcmUgdHlwZXMgZm9yIDQyLWNlbGwgY2FsZW5kYXIgZ3JpZCBzdHJ1Y3R1cmUuXG4gKiBVc2VkIGJ5IHRoZSBjb21wb25lbnQgZm9yIHJlbmRlcmluZyBtb250aCB2aWV3cy5cbiAqIFxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQ2FsZW5kYXJHcmlkLFxuICBDYWxlbmRhckNlbGwsXG4gIENhbGVuZGFyR3JpZENhY2hlS2V5XG59IGZyb20gJy4vY2FsZW5kYXItZ3JpZC9jYWxlbmRhci1ncmlkLnR5cGVzJztcblxuLyoqXG4gKiBDYWxlbmRhckdyaWRGYWN0b3J5IC0gRGV0ZXJtaW5pc3RpYyBncmlkIGdlbmVyYXRpb25cbiAqIFxuICogQ3JlYXRlcyBub3JtYWxpemVkIDQyLWNlbGwgZ3JpZHMgKDYgd2Vla3Mgw5cgNyBkYXlzKS5cbiAqIFB1cmUgZnVuY3Rpb24gYXBwcm9hY2ggd2l0aCBubyBzaWRlIGVmZmVjdHMuXG4gKiBcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgeyBDYWxlbmRhckdyaWRGYWN0b3J5IH0gZnJvbSAnLi9jYWxlbmRhci1ncmlkL2NhbGVuZGFyLWdyaWQuZmFjdG9yeSc7XG5cbi8qKlxuICogQ2FsZW5kYXJHcmlkQ2FjaGUgLSBMUlUgY2FjaGUgZm9yIGdyaWQgc3RydWN0dXJlc1xuICogXG4gKiBNZW1vaXplcyBjYWxlbmRhciBncmlkcyBieSBtb250aC93ZWVrU3RhcnQvbG9jYWxlLlxuICogUHJldmVudHMgcmVkdW5kYW50IGdyaWQgZ2VuZXJhdGlvbiBvbiByZS1yZW5kZXJzLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHsgQ2FsZW5kYXJHcmlkQ2FjaGUgfSBmcm9tICcuL2NhbGVuZGFyLWdyaWQvY2FsZW5kYXItZ3JpZC5jYWNoZSc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJBTkdFIEhJR0hMSUdIVElORyBTWVNURU0gKHYzLjguMCspXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUmFuZ2UgSGlnaGxpZ2h0ZXIgVHlwZXNcbiAqIFxuICogVHlwZXMgZm9yIGRlY29yYXRlZCBncmlkcyB3aXRoIHJhbmdlIGhpZ2hsaWdodGluZy5cbiAqIFVzZWQgYnkgdGhlIGNvbXBvbmVudCBmb3IgdmlzdWFsIGRlY29yYXRpb25zLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUge1xuICBEZWNvcmF0ZWRHcmlkLFxuICBEZWNvcmF0ZWRDZWxsLFxuICBSYW5nZURlY29yYXRpb25QYXJhbXMsXG4gIERlY29yYXRlZEdyaWRDYWNoZUtleVxufSBmcm9tICcuL2NhbGVuZGFyLWdyaWQvcmFuZ2UtaGlnaGxpZ2h0ZXIudHlwZXMnO1xuXG4vKipcbiAqIFJhbmdlSGlnaGxpZ2h0ZXIgLSBQdXJlIGRlY29yYXRpb24gbG9naWNcbiAqIFxuICogQXBwbGllcyByYW5nZSBoaWdobGlnaHRpbmcgdG8gY2FsZW5kYXIgZ3JpZHMuXG4gKiBIYW5kbGVzIHN0YXJ0L2VuZC9ob3Zlci9kaXNhYmxlZCBzdGF0ZXMuXG4gKiBcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgeyBSYW5nZUhpZ2hsaWdodGVyIH0gZnJvbSAnLi9jYWxlbmRhci1ncmlkL3JhbmdlLWhpZ2hsaWdodGVyJztcblxuLyoqXG4gKiBSYW5nZUhpZ2hsaWdodGVyQ2FjaGUgLSBMUlUgY2FjaGUgZm9yIGRlY29yYXRlZCBncmlkc1xuICogXG4gKiBNZW1vaXplcyBkZWNvcmF0ZWQgZ3JpZHMgYnkgcmFuZ2UgcGFyYW1ldGVycy5cbiAqIEVsaW1pbmF0ZXMgcmVkdW5kYW50IGRlY29yYXRpb24gY29tcHV0YXRpb25zLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHsgUmFuZ2VIaWdobGlnaHRlckNhY2hlIH0gZnJvbSAnLi9jYWxlbmRhci1ncmlkL3JhbmdlLWhpZ2hsaWdodGVyLmNhY2hlJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVklSVFVBTCBXRUVLUyBTWVNURU0gKHYzLjkuMCspXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogVmlydHVhbCBXZWVrcyBUeXBlc1xuICogXG4gKiBUeXBlcyBmb3Igd2luZG93ZWQgcmVuZGVyaW5nIG9mIGNhbGVuZGFyIHdlZWtzLlxuICogUmVkdWNlcyBET00gY29tcGxleGl0eSBmb3IgbGFyZ2UgY2FsZW5kYXJzLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUge1xuICBWaXJ0dWFsV2Vla3NDb25maWcsXG4gIFZpcnR1YWxXZWVrV2luZG93XG59IGZyb20gJy4vY2FsZW5kYXItZ3JpZC92aXJ0dWFsLXdlZWtzLnR5cGVzJztcblxuLyoqXG4gKiBWaXJ0dWFsIFdlZWtzIExvZ2ljXG4gKiBcbiAqIEZ1bmN0aW9ucyBmb3IgY2FsY3VsYXRpbmcgdmlzaWJsZSB3ZWVrIHdpbmRvd3MuXG4gKiBFbmFibGVzIHByb2dyZXNzaXZlIHJlbmRlcmluZyBhbmQgaW5maW5pdGUgc2Nyb2xsLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHtcbiAgZ2V0VmlzaWJsZVdlZWtzLFxuICBuYXZpZ2F0ZVdlZWtXaW5kb3csXG4gIGlzVmlydHVhbFdlZWtzRW5hYmxlZFxufSBmcm9tICcuL2NhbGVuZGFyLWdyaWQvdmlydHVhbC13ZWVrcy5sb2dpYyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENBQ0hFIENPTkZJR1VSQVRJT04gKHYzLjkuMispXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2FjaGUgQ29uZmlndXJhdGlvblxuICogXG4gKiBTaGFyZWQgY2FjaGUgc2l6ZSBsaW1pdHMgZm9yIG1lbW9yeSBzYWZldHkuXG4gKiBNQVhfQ0FDSEVfRU5UUklFUyA9IDQ4ICg0IHllYXJzIG9mIG5hdmlnYXRpb24pXG4gKiBcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgeyBNQVhfQ0FDSEVfRU5UUklFUyB9IGZyb20gJy4vY2FsZW5kYXItZ3JpZC9jYWNoZS5jb25maWcnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEQVRFIENMT0NLIFNZU1RFTVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIERhdGVDbG9jayAtIEFic3RyYWN0IHRpbWUgc291cmNlXG4gKiBcbiAqIEludGVyZmFjZSBmb3IgaW5qZWN0aW5nIGN1c3RvbSB0aW1lIHNvdXJjZXMuXG4gKiBFbmFibGVzIGRldGVybWluaXN0aWMgdGVzdGluZyBhbmQgU1NSLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUgeyBEYXRlQ2xvY2sgfSBmcm9tICcuL2RhdGUtY2xvY2snO1xuXG4vKipcbiAqIFN5c3RlbUNsb2NrIC0gRGVmYXVsdCBpbXBsZW1lbnRhdGlvblxuICogXG4gKiBVc2VzIG5hdGl2ZSBEYXRlLm5vdygpIGFuZCBuZXcgRGF0ZSgpLlxuICogRGVmYXVsdCB0aW1lIHNvdXJjZSBmb3IgcHJvZHVjdGlvbi5cbiAqIFxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB7IFN5c3RlbUNsb2NrIH0gZnJvbSAnLi9zeXN0ZW0tY2xvY2snO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBURVNUSU5HIFVUSUxJVElFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFRlc3RpbmcgSGVscGVyc1xuICogXG4gKiBVdGlsaXRpZXMgZm9yIHdyaXRpbmcgZGV0ZXJtaW5pc3RpYyB0ZXN0cy5cbiAqIEZpeGVkQ2xvY2ssIG1ha2VEYXRlLCBldGMuXG4gKiBcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgKiBmcm9tICcuL3Rlc3RpbmcnO1xuIl19
|