@sbb-esta/lyne-elements-experimental-dev 5.0.0-next.3-dev.1779482518 → 5.0.0-next.3-dev.1779513428

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.
@@ -1,581 +0,0 @@
1
- import { a as millisecondsInMinute, i as millisecondsInHour, n as constructFrom, t as toDate } from "./toDate-CDWut5fS.js";
2
- import { n as differenceInCalendarDays, r as normalizeDates, t as isValid } from "./isValid-40Olgzo1.js";
3
- import { n as getRoundingMethod, r as addMinutes, t as differenceInMinutes } from "./differenceInMinutes-CJllL661.js";
4
- import { i18nDurationDay, i18nDurationHour, i18nDurationMinute } from "@sbb-esta/lyne-elements/core.js";
5
- //#region node_modules/date-fns/addDays.js
6
- /**
7
- * The {@link addDays} function options.
8
- */
9
- /**
10
- * @name addDays
11
- * @category Day Helpers
12
- * @summary Add the specified number of days to the given date.
13
- *
14
- * @description
15
- * Add the specified number of days to the given date.
16
- *
17
- * **You don't need date-fns\***:
18
- *
19
- * Temporal has a built-in `add` method on all its classes:
20
- *
21
- * - [`Temporal.Instant.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/Instant/add)
22
- * - [`Temporal.PlainDate.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainDate/add)
23
- * - [`Temporal.PlainDateTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainDateTime/add)
24
- * - [`Temporal.PlainTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainTime/add)
25
- * - [`Temporal.PlainYearMonth.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainYearMonth/add)
26
- * - [`Temporal.ZonedDateTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/ZonedDateTime/add)
27
- *
28
- * \* **Not really**, see: https://date-fns.org/you-dont-need-date-fns
29
- *
30
- * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
31
- * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
32
- *
33
- * @param date - The date to be changed
34
- * @param amount - The amount of days to be added.
35
- * @param options - An object with options
36
- *
37
- * @returns The new date with the days added
38
- *
39
- * @example
40
- * // Add 10 days to 1 September 2014:
41
- * const result = addDays(new Date(2014, 8, 1), 10)
42
- * //=> Thu Sep 11 2014 00:00:00
43
- *
44
- * @example
45
- * // Using Temporal:
46
- * // Add 10 days to 1 September 2014:
47
- * Temporal.PlainDate.from("2014-09-01").add({ days: 10 }).toString();
48
- * //=> "2014-09-11"
49
- */
50
- function addDays(date, amount, options) {
51
- const _date = toDate(date, options?.in);
52
- if (isNaN(amount)) return constructFrom(options?.in || date, NaN);
53
- if (!amount) return _date;
54
- _date.setDate(_date.getDate() + amount);
55
- return _date;
56
- }
57
- //#endregion
58
- //#region node_modules/date-fns/addMilliseconds.js
59
- /**
60
- * The {@link addMilliseconds} function options.
61
- */
62
- /**
63
- * @name addMilliseconds
64
- * @category Millisecond Helpers
65
- * @summary Add the specified number of milliseconds to the given date.
66
- *
67
- * @description
68
- * Add the specified number of milliseconds to the given date.
69
- *
70
- * **You don't need date-fns\***:
71
- *
72
- * Temporal has a built-in `add` method on all its classes:
73
- *
74
- * - [`Temporal.Instant.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/Instant/add)
75
- * - [`Temporal.PlainDate.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainDate/add)
76
- * - [`Temporal.PlainDateTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainDateTime/add)
77
- * - [`Temporal.PlainTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainTime/add)
78
- * - [`Temporal.PlainYearMonth.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainYearMonth/add)
79
- * - [`Temporal.ZonedDateTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/ZonedDateTime/add)
80
- *
81
- * \* **Not really**, see: https://date-fns.org/you-dont-need-date-fns
82
- *
83
- * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
84
- * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
85
- *
86
- * @param date - The date to be changed
87
- * @param amount - The amount of milliseconds to be added.
88
- * @param options - The options object
89
- *
90
- * @returns The new date with the milliseconds added
91
- *
92
- * @example
93
- * // Add 750 milliseconds to 10 July 2014 12:45:30.000:
94
- * const result = addMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750)
95
- * //=> Thu Jul 10 2014 12:45:30.750
96
- *
97
- * @example
98
- * // Using Temporal:
99
- * // Add 750 milliseconds to 10 July 2014 12:45:30.000:
100
- * Temporal.PlainDateTime.from("2014-07-10T12:45:30.000")
101
- * .add({ milliseconds: 750 })
102
- * .toString();
103
- * //=> "2014-07-10T12:45:30.750"
104
- */
105
- function addMilliseconds(date, amount, options) {
106
- return constructFrom(options?.in || date, +toDate(date) + amount);
107
- }
108
- //#endregion
109
- //#region node_modules/date-fns/addHours.js
110
- /**
111
- * The {@link addHours} function options.
112
- */
113
- /**
114
- * @name addHours
115
- * @category Hour Helpers
116
- * @summary Add the specified number of hours to the given date.
117
- *
118
- * @description
119
- * Add the specified number of hours to the given date.
120
- *
121
- * **You don't need date-fns\***:
122
- *
123
- * Temporal has a built-in `add` method on all its classes:
124
- *
125
- * - [`Temporal.Instant.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/Instant/add)
126
- * - [`Temporal.PlainDate.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainDate/add)
127
- * - [`Temporal.PlainDateTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainDateTime/add)
128
- * - [`Temporal.PlainTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainTime/add)
129
- * - [`Temporal.PlainYearMonth.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainYearMonth/add)
130
- * - [`Temporal.ZonedDateTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/ZonedDateTime/add)
131
- *
132
- * \* **Not really**, see: https://date-fns.org/you-dont-need-date-fns
133
- *
134
- * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
135
- * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
136
- *
137
- * @param date - The date to be changed
138
- * @param amount - The amount of hours to be added
139
- * @param options - An object with options
140
- *
141
- * @returns The new date with the hours added
142
- *
143
- * @example
144
- * // Add 2 hours to 10 July 2014 23:00:00:
145
- * const result = addHours(new Date(2014, 6, 10, 23, 0), 2)
146
- * //=> Fri Jul 11 2014 01:00:00
147
- *
148
- * @example
149
- * // Using Temporal:
150
- * // Add 2 hours to 10 July 2014 23:00:00:
151
- * Temporal.PlainDateTime.from("2014-07-10T23:00:00")
152
- * .add({ hours: 2 })
153
- * .toString();
154
- * //=> "2014-07-11T01:00:00"
155
- */
156
- function addHours(date, amount, options) {
157
- return addMilliseconds(date, amount * millisecondsInHour, options);
158
- }
159
- //#endregion
160
- //#region node_modules/date-fns/differenceInDays.js
161
- /**
162
- * The {@link differenceInDays} function options.
163
- */
164
- /**
165
- * @name differenceInDays
166
- * @category Day Helpers
167
- * @summary Get the number of full days between the given dates.
168
- *
169
- * @description
170
- * Get the number of full day periods between two dates. Fractional days are
171
- * truncated towards zero.
172
- *
173
- * One "full day" is the distance between a local time in one day to the same
174
- * local time on the next or previous day. A full day can sometimes be less than
175
- * or more than 24 hours if a daylight savings change happens between two dates.
176
- *
177
- * To ignore DST and only measure exact 24-hour periods, use this instead:
178
- * `Math.trunc(differenceInHours(dateLeft, dateRight)/24)|0`.
179
- *
180
- * @param laterDate - The later date
181
- * @param earlierDate - The earlier date
182
- * @param options - An object with options
183
- *
184
- * @returns The number of full days according to the local timezone
185
- *
186
- * @example
187
- * // How many full days are between
188
- * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?
189
- * const result = differenceInDays(
190
- * new Date(2012, 6, 2, 0, 0),
191
- * new Date(2011, 6, 2, 23, 0)
192
- * )
193
- * //=> 365
194
- *
195
- * @example
196
- * // How many full days are between
197
- * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?
198
- * const result = differenceInDays(
199
- * new Date(2011, 6, 3, 0, 1),
200
- * new Date(2011, 6, 2, 23, 59)
201
- * )
202
- * //=> 0
203
- *
204
- * @example
205
- * // How many full days are between
206
- * // 1 March 2020 0:00 and 1 June 2020 0:00 ?
207
- * // Note: because local time is used, the
208
- * // result will always be 92 days, even in
209
- * // time zones where DST starts and the
210
- * // period has only 92*24-1 hours.
211
- * const result = differenceInDays(
212
- * new Date(2020, 5, 1),
213
- * new Date(2020, 2, 1)
214
- * )
215
- * //=> 92
216
- */
217
- function differenceInDays(laterDate, earlierDate, options) {
218
- const [laterDate_, earlierDate_] = normalizeDates(options?.in, laterDate, earlierDate);
219
- const sign = compareLocalAsc(laterDate_, earlierDate_);
220
- const difference = Math.abs(differenceInCalendarDays(laterDate_, earlierDate_));
221
- laterDate_.setDate(laterDate_.getDate() - sign * difference);
222
- const result = sign * (difference - Number(compareLocalAsc(laterDate_, earlierDate_) === -sign));
223
- return result === 0 ? 0 : result;
224
- }
225
- function compareLocalAsc(laterDate, earlierDate) {
226
- const diff = laterDate.getFullYear() - earlierDate.getFullYear() || laterDate.getMonth() - earlierDate.getMonth() || laterDate.getDate() - earlierDate.getDate() || laterDate.getHours() - earlierDate.getHours() || laterDate.getMinutes() - earlierDate.getMinutes() || laterDate.getSeconds() - earlierDate.getSeconds() || laterDate.getMilliseconds() - earlierDate.getMilliseconds();
227
- if (diff < 0) return -1;
228
- if (diff > 0) return 1;
229
- return diff;
230
- }
231
- //#endregion
232
- //#region node_modules/date-fns/differenceInHours.js
233
- /**
234
- * The {@link differenceInHours} function options.
235
- */
236
- /**
237
- * @name differenceInHours
238
- * @category Hour Helpers
239
- * @summary Get the number of hours between the given dates.
240
- *
241
- * @description
242
- * Get the number of hours between the given dates.
243
- *
244
- * @param laterDate - The later date
245
- * @param earlierDate - The earlier date
246
- * @param options - An object with options.
247
- *
248
- * @returns The number of hours
249
- *
250
- * @example
251
- * // How many hours are between 2 July 2014 06:50:00 and 2 July 2014 19:00:00?
252
- * const result = differenceInHours(
253
- * new Date(2014, 6, 2, 19, 0),
254
- * new Date(2014, 6, 2, 6, 50)
255
- * )
256
- * //=> 12
257
- */
258
- function differenceInHours(laterDate, earlierDate, options) {
259
- const [laterDate_, earlierDate_] = normalizeDates(options?.in, laterDate, earlierDate);
260
- const diff = (+laterDate_ - +earlierDate_) / millisecondsInHour;
261
- return getRoundingMethod(options?.roundingMethod)(diff);
262
- }
263
- //#endregion
264
- //#region node_modules/date-fns/subDays.js
265
- /**
266
- * The {@link subDays} function options.
267
- */
268
- /**
269
- * @name subDays
270
- * @category Day Helpers
271
- * @summary Subtract the specified number of days from the given date.
272
- *
273
- * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
274
- * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
275
- *
276
- * @param date - The date to be changed
277
- * @param amount - The amount of days to be subtracted.
278
- * @param options - An object with options
279
- *
280
- * @returns The new date with the days subtracted
281
- *
282
- * @example
283
- * // Subtract 10 days from 1 September 2014:
284
- * const result = subDays(new Date(2014, 8, 1), 10)
285
- * //=> Fri Aug 22 2014 00:00:00
286
- */
287
- function subDays(date, amount, options) {
288
- return addDays(date, -amount, options);
289
- }
290
- //#endregion
291
- //#region node_modules/date-fns/parseISO.js
292
- /**
293
- * The {@link parseISO} function options.
294
- */
295
- /**
296
- * @name parseISO
297
- * @category Common Helpers
298
- * @summary Parse ISO string
299
- *
300
- * @description
301
- * Parse the given string in ISO 8601 format and return an instance of Date.
302
- *
303
- * Function accepts complete ISO 8601 formats as well as partial implementations.
304
- * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601
305
- *
306
- * If the argument isn't a string, the function cannot parse the string or
307
- * the values are invalid, it returns Invalid Date.
308
- *
309
- * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
310
- * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
311
- *
312
- * @param argument - The value to convert
313
- * @param options - An object with options
314
- *
315
- * @returns The parsed date in the local time zone
316
- *
317
- * @example
318
- * // Convert string '2014-02-11T11:30:30' to date:
319
- * const result = parseISO('2014-02-11T11:30:30')
320
- * //=> Tue Feb 11 2014 11:30:30
321
- *
322
- * @example
323
- * // Convert string '+02014101' to date,
324
- * // if the additional number of digits in the extended year format is 1:
325
- * const result = parseISO('+02014101', { additionalDigits: 1 })
326
- * //=> Fri Apr 11 2014 00:00:00
327
- */
328
- function parseISO(argument, options) {
329
- const invalidDate = () => constructFrom(options?.in, NaN);
330
- const additionalDigits = options?.additionalDigits ?? 2;
331
- const dateStrings = splitDateString(argument);
332
- let date;
333
- if (dateStrings.date) {
334
- const parseYearResult = parseYear(dateStrings.date, additionalDigits);
335
- date = parseDate(parseYearResult.restDateString, parseYearResult.year);
336
- }
337
- if (!date || isNaN(+date)) return invalidDate();
338
- const timestamp = +date;
339
- let time = 0;
340
- let offset;
341
- if (dateStrings.time) {
342
- time = parseTime(dateStrings.time);
343
- if (isNaN(time)) return invalidDate();
344
- }
345
- if (dateStrings.timezone) {
346
- offset = parseTimezone(dateStrings.timezone);
347
- if (isNaN(offset)) return invalidDate();
348
- } else {
349
- const tmpDate = new Date(timestamp + time);
350
- const result = toDate(0, options?.in);
351
- result.setFullYear(tmpDate.getUTCFullYear(), tmpDate.getUTCMonth(), tmpDate.getUTCDate());
352
- result.setHours(tmpDate.getUTCHours(), tmpDate.getUTCMinutes(), tmpDate.getUTCSeconds(), tmpDate.getUTCMilliseconds());
353
- return result;
354
- }
355
- return toDate(timestamp + time + offset, options?.in);
356
- }
357
- var patterns = {
358
- dateTimeDelimiter: /[T ]/,
359
- timeZoneDelimiter: /[Z ]/i,
360
- timezone: /([Z+-].*)$/
361
- };
362
- var dateRegex = /^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/;
363
- var timeRegex = /^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/;
364
- var timezoneRegex = /^([+-])(\d{2})(?::?(\d{2}))?$/;
365
- function splitDateString(dateString) {
366
- const dateStrings = {};
367
- const array = dateString.split(patterns.dateTimeDelimiter);
368
- let timeString;
369
- if (array.length > 2) return dateStrings;
370
- if (/:/.test(array[0])) timeString = array[0];
371
- else {
372
- dateStrings.date = array[0];
373
- timeString = array[1];
374
- if (patterns.timeZoneDelimiter.test(dateStrings.date)) {
375
- dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];
376
- timeString = dateString.substr(dateStrings.date.length, dateString.length);
377
- }
378
- }
379
- if (timeString) {
380
- const token = patterns.timezone.exec(timeString);
381
- if (token) {
382
- dateStrings.time = timeString.replace(token[1], "");
383
- dateStrings.timezone = token[1];
384
- } else dateStrings.time = timeString;
385
- }
386
- return dateStrings;
387
- }
388
- function parseYear(dateString, additionalDigits) {
389
- const regex = new RegExp("^(?:(\\d{4}|[+-]\\d{" + (4 + additionalDigits) + "})|(\\d{2}|[+-]\\d{" + (2 + additionalDigits) + "})$)");
390
- const captures = dateString.match(regex);
391
- if (!captures) return {
392
- year: NaN,
393
- restDateString: ""
394
- };
395
- const year = captures[1] ? parseInt(captures[1]) : null;
396
- const century = captures[2] ? parseInt(captures[2]) : null;
397
- return {
398
- year: century === null ? year : century * 100,
399
- restDateString: dateString.slice((captures[1] || captures[2]).length)
400
- };
401
- }
402
- function parseDate(dateString, year) {
403
- if (year === null) return /* @__PURE__ */ new Date(NaN);
404
- const captures = dateString.match(dateRegex);
405
- if (!captures) return /* @__PURE__ */ new Date(NaN);
406
- const isWeekDate = !!captures[4];
407
- const dayOfYear = parseDateUnit(captures[1]);
408
- const month = parseDateUnit(captures[2]) - 1;
409
- const day = parseDateUnit(captures[3]);
410
- const week = parseDateUnit(captures[4]);
411
- const dayOfWeek = parseDateUnit(captures[5]) - 1;
412
- if (isWeekDate) {
413
- if (!validateWeekDate(year, week, dayOfWeek)) return /* @__PURE__ */ new Date(NaN);
414
- return dayOfISOWeekYear(year, week, dayOfWeek);
415
- } else {
416
- const date = /* @__PURE__ */ new Date(0);
417
- if (!validateDate(year, month, day) || !validateDayOfYearDate(year, dayOfYear)) return /* @__PURE__ */ new Date(NaN);
418
- date.setUTCFullYear(year, month, Math.max(dayOfYear, day));
419
- return date;
420
- }
421
- }
422
- function parseDateUnit(value) {
423
- return value ? parseInt(value) : 1;
424
- }
425
- function parseTime(timeString) {
426
- const captures = timeString.match(timeRegex);
427
- if (!captures) return NaN;
428
- const hours = parseTimeUnit(captures[1]);
429
- const minutes = parseTimeUnit(captures[2]);
430
- const seconds = parseTimeUnit(captures[3]);
431
- if (!validateTime(hours, minutes, seconds)) return NaN;
432
- return hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1e3;
433
- }
434
- function parseTimeUnit(value) {
435
- return value && parseFloat(value.replace(",", ".")) || 0;
436
- }
437
- function parseTimezone(timezoneString) {
438
- if (timezoneString === "Z") return 0;
439
- const captures = timezoneString.match(timezoneRegex);
440
- if (!captures) return 0;
441
- const sign = captures[1] === "+" ? -1 : 1;
442
- const hours = parseInt(captures[2]);
443
- const minutes = captures[3] && parseInt(captures[3]) || 0;
444
- if (!validateTimezone(hours, minutes)) return NaN;
445
- return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);
446
- }
447
- function dayOfISOWeekYear(isoWeekYear, week, day) {
448
- const date = /* @__PURE__ */ new Date(0);
449
- date.setUTCFullYear(isoWeekYear, 0, 4);
450
- const fourthOfJanuaryDay = date.getUTCDay() || 7;
451
- const diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;
452
- date.setUTCDate(date.getUTCDate() + diff);
453
- return date;
454
- }
455
- var daysInMonths = [
456
- 31,
457
- null,
458
- 31,
459
- 30,
460
- 31,
461
- 30,
462
- 31,
463
- 31,
464
- 30,
465
- 31,
466
- 30,
467
- 31
468
- ];
469
- function isLeapYearIndex(year) {
470
- return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0;
471
- }
472
- function validateDate(year, month, date) {
473
- return month >= 0 && month <= 11 && date >= 1 && date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28));
474
- }
475
- function validateDayOfYearDate(year, dayOfYear) {
476
- return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);
477
- }
478
- function validateWeekDate(_year, week, day) {
479
- return week >= 1 && week <= 53 && day >= 0 && day <= 6;
480
- }
481
- function validateTime(hours, minutes, seconds) {
482
- if (hours === 24) return minutes === 0 && seconds === 0;
483
- return seconds >= 0 && seconds < 60 && minutes >= 0 && minutes < 60 && hours >= 0 && hours < 25;
484
- }
485
- function validateTimezone(_hours, minutes) {
486
- return minutes >= 0 && minutes <= 59;
487
- }
488
- //#endregion
489
- //#region node_modules/date-fns/subHours.js
490
- /**
491
- * The {@link subHours} function options.
492
- */
493
- /**
494
- * @name subHours
495
- * @category Hour Helpers
496
- * @summary Subtract the specified number of hours from the given date.
497
- *
498
- * @description
499
- * Subtract the specified number of hours from the given date.
500
- *
501
- * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
502
- * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
503
- *
504
- * @param date - The date to be changed
505
- * @param amount - The amount of hours to be subtracted.
506
- * @param options - The options
507
- *
508
- * @returns The new date with the hours subtracted
509
- *
510
- * @example
511
- * // Subtract 2 hours from 11 July 2014 01:00:00:
512
- * const result = subHours(new Date(2014, 6, 11, 1, 0), 2)
513
- * //=> Thu Jul 10 2014 23:00:00
514
- */
515
- function subHours(date, amount, options) {
516
- return addHours(date, -amount, options);
517
- }
518
- //#endregion
519
- //#region src/elements-experimental/core/datetime/date-helper.ts
520
- /**
521
- * This function removes the offset of a ISO date string. This needs to be done to make sure that the offset is ignored.
522
- * If it is not removed the time would be converted to the browsers local time.
523
- * Example: "2022-08-29T09:30:00+03:00" would be changed to "2022-08-29T08:30:00+02:00" --> not the desired outcome, as we want to use the time in the timezone and not the local time.
524
- *
525
- * After the offset is removed a new date is created in the browsers local time. This ensures that the time of the ISO date string is displayed and not a converted time.
526
- * Example: "2022-08-29T09:30:00+03:00" would be changed to "2022-08-29T09:30:00+02:00" --> desired outcome
527
- * Attention: This function does not convert the time to the correct time in the local timezone. It is a workaround to make sure, that the given time is displayed without being converted.
528
- *
529
- * Offset: Difference between the timezone and Coordinated Universal Time.
530
- *
531
- * @param isoTime - the iso time with the timezone offset
532
- * @returns a new date with the local timezone with the local offset
533
- */
534
- function removeTimezoneFromISOTimeString(isoTime) {
535
- if (!isoTime) return;
536
- if (!isValid(parseISO(isoTime))) return;
537
- if (isoTime.includes("Z")) return new Date(isoTime.replace("Z", ""));
538
- if (isoTime.includes("T")) {
539
- const dateTime = isoTime.split("T");
540
- if (dateTime[1] && (dateTime[1].includes("+") || dateTime[1].includes("-"))) return /* @__PURE__ */ new Date(`${dateTime[0]}T${dateTime[1].split(/[+-]/)[0]}`);
541
- }
542
- return new Date(isoTime);
543
- }
544
- /**
545
- * This function converts a duration number to date string with specific format
546
- *
547
- * @param duration - duration in minutes
548
- * @param currentLanguage - currentLanguage
549
- * @returns an Object with two strings in the format "dd hh mm" (short) an "x Day(s) x Hour(s) x Minute(s) (long)"
550
- * */
551
- var durationToTime = (duration, currentLanguage) => {
552
- const short = [];
553
- const long = [];
554
- const now = 0;
555
- let future = addMinutes(now, duration);
556
- const days = differenceInDays(future, now);
557
- if (days > 0) {
558
- short.push(`${days} d`);
559
- if (currentLanguage) long.push(`${days} ${days > 1 ? i18nDurationDay.multiple.long[currentLanguage] : i18nDurationDay.single.long[currentLanguage]}`);
560
- future = subDays(future, days);
561
- }
562
- const hours = differenceInHours(future, now);
563
- if (hours > 0) {
564
- short.push(`${hours} h`);
565
- if (currentLanguage) long.push(`${hours} ${hours > 1 ? i18nDurationHour.multiple.long[currentLanguage] : i18nDurationHour.single.long[currentLanguage]}`);
566
- future = subHours(future, hours);
567
- }
568
- const minutes = differenceInMinutes(future, now);
569
- if (minutes > 0) {
570
- short.push(`${minutes} min`);
571
- if (currentLanguage) long.push(`${minutes} ${minutes > 1 ? i18nDurationMinute.multiple.long[currentLanguage] : i18nDurationMinute.single.long[currentLanguage]}`);
572
- }
573
- return {
574
- short: short.join(" "),
575
- long: long.join(" ")
576
- };
577
- };
578
- //#endregion
579
- export { removeTimezoneFromISOTimeString as n, durationToTime as t };
580
-
581
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1oZWxwZXItZDdzRkZDdFkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZERheXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTWlsbGlzZWNvbmRzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZEhvdXJzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkRheXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluSG91cnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViRGF5cy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZUlTTy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJIb3Vycy5qcyIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvY29yZS9kYXRldGltZS9kYXRlLWhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBhZGREYXlzfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgYWRkRGF5c1xuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqICoqWW91IGRvbid0IG5lZWQgZGF0ZS1mbnNcXCoqKjpcbiAqXG4gKiBUZW1wb3JhbCBoYXMgYSBidWlsdC1pbiBgYWRkYCBtZXRob2Qgb24gYWxsIGl0cyBjbGFzc2VzOlxuICpcbiAqIC0gW2BUZW1wb3JhbC5JbnN0YW50LnByb3RvdHlwZS5hZGQoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1RlbXBvcmFsL0luc3RhbnQvYWRkKVxuICogLSBbYFRlbXBvcmFsLlBsYWluRGF0ZS5wcm90b3R5cGUuYWRkKClgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9UZW1wb3JhbC9QbGFpbkRhdGUvYWRkKVxuICogLSBbYFRlbXBvcmFsLlBsYWluRGF0ZVRpbWUucHJvdG90eXBlLmFkZCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvVGVtcG9yYWwvUGxhaW5EYXRlVGltZS9hZGQpXG4gKiAtIFtgVGVtcG9yYWwuUGxhaW5UaW1lLnByb3RvdHlwZS5hZGQoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1RlbXBvcmFsL1BsYWluVGltZS9hZGQpXG4gKiAtIFtgVGVtcG9yYWwuUGxhaW5ZZWFyTW9udGgucHJvdG90eXBlLmFkZCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvVGVtcG9yYWwvUGxhaW5ZZWFyTW9udGgvYWRkKVxuICogLSBbYFRlbXBvcmFsLlpvbmVkRGF0ZVRpbWUucHJvdG90eXBlLmFkZCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvVGVtcG9yYWwvWm9uZWREYXRlVGltZS9hZGQpXG4gKlxuICogXFwqICoqTm90IHJlYWxseSoqLCBzZWU6IGh0dHBzOi8vZGF0ZS1mbnMub3JnL3lvdS1kb250LW5lZWQtZGF0ZS1mbnNcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBkYXlzIHRvIGJlIGFkZGVkLlxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGRheXMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDEwIGRheXMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZERheXMobmV3IERhdGUoMjAxNCwgOCwgMSksIDEwKVxuICogLy89PiBUaHUgU2VwIDExIDIwMTQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVXNpbmcgVGVtcG9yYWw6XG4gKiAvLyBBZGQgMTAgZGF5cyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20oXCIyMDE0LTA5LTAxXCIpLmFkZCh7IGRheXM6IDEwIH0pLnRvU3RyaW5nKCk7XG4gKiAvLz0+IFwiMjAxNC0wOS0xMVwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGREYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGlmIChpc05hTihhbW91bnQpKSByZXR1cm4gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBOYU4pO1xuXG4gIC8vIElmIDAgZGF5cywgbm8tb3AgdG8gYXZvaWQgY2hhbmdpbmcgdGltZXMgaW4gdGhlIGhvdXIgYmVmb3JlIGVuZCBvZiBEU1RcbiAgaWYgKCFhbW91bnQpIHJldHVybiBfZGF0ZTtcblxuICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSArIGFtb3VudCk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGFkZE1pbGxpc2Vjb25kc30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGFkZE1pbGxpc2Vjb25kc1xuICogQGNhdGVnb3J5IE1pbGxpc2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqICoqWW91IGRvbid0IG5lZWQgZGF0ZS1mbnNcXCoqKjpcbiAqXG4gKiBUZW1wb3JhbCBoYXMgYSBidWlsdC1pbiBgYWRkYCBtZXRob2Qgb24gYWxsIGl0cyBjbGFzc2VzOlxuICpcbiAqIC0gW2BUZW1wb3JhbC5JbnN0YW50LnByb3RvdHlwZS5hZGQoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1RlbXBvcmFsL0luc3RhbnQvYWRkKVxuICogLSBbYFRlbXBvcmFsLlBsYWluRGF0ZS5wcm90b3R5cGUuYWRkKClgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9UZW1wb3JhbC9QbGFpbkRhdGUvYWRkKVxuICogLSBbYFRlbXBvcmFsLlBsYWluRGF0ZVRpbWUucHJvdG90eXBlLmFkZCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvVGVtcG9yYWwvUGxhaW5EYXRlVGltZS9hZGQpXG4gKiAtIFtgVGVtcG9yYWwuUGxhaW5UaW1lLnByb3RvdHlwZS5hZGQoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1RlbXBvcmFsL1BsYWluVGltZS9hZGQpXG4gKiAtIFtgVGVtcG9yYWwuUGxhaW5ZZWFyTW9udGgucHJvdG90eXBlLmFkZCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvVGVtcG9yYWwvUGxhaW5ZZWFyTW9udGgvYWRkKVxuICogLSBbYFRlbXBvcmFsLlpvbmVkRGF0ZVRpbWUucHJvdG90eXBlLmFkZCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvVGVtcG9yYWwvWm9uZWREYXRlVGltZS9hZGQpXG4gKlxuICogXFwqICoqTm90IHJlYWxseSoqLCBzZWU6IGh0dHBzOi8vZGF0ZS1mbnMub3JnL3lvdS1kb250LW5lZWQtZGF0ZS1mbnNcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gYmUgYWRkZWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtaWxsaXNlY29uZHMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDc1MCBtaWxsaXNlY29uZHMgdG8gMTAgSnVseSAyMDE0IDEyOjQ1OjMwLjAwMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZE1pbGxpc2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMTIsIDQ1LCAzMCwgMCksIDc1MClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjQ1OjMwLjc1MFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBVc2luZyBUZW1wb3JhbDpcbiAqIC8vIEFkZCA3NTAgbWlsbGlzZWNvbmRzIHRvIDEwIEp1bHkgMjAxNCAxMjo0NTozMC4wMDA6XG4gKiBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lLmZyb20oXCIyMDE0LTA3LTEwVDEyOjQ1OjMwLjAwMFwiKVxuICogICAuYWRkKHsgbWlsbGlzZWNvbmRzOiA3NTAgfSlcbiAqICAgLnRvU3RyaW5nKCk7XG4gKiAvLz0+IFwiMjAxNC0wNy0xMFQxMjo0NTozMC43NTBcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTWlsbGlzZWNvbmRzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykge1xuICByZXR1cm4gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCArdG9EYXRlKGRhdGUpICsgYW1vdW50KTtcbn1cbiIsImltcG9ydCB7IGFkZE1pbGxpc2Vjb25kcyB9IGZyb20gXCIuL2FkZE1pbGxpc2Vjb25kcy5qc1wiO1xuaW1wb3J0IHsgbWlsbGlzZWNvbmRzSW5Ib3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBhZGRIb3Vyc30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGFkZEhvdXJzXG4gKiBAY2F0ZWdvcnkgSG91ciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgaG91cnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgaG91cnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogKipZb3UgZG9uJ3QgbmVlZCBkYXRlLWZuc1xcKioqOlxuICpcbiAqIFRlbXBvcmFsIGhhcyBhIGJ1aWx0LWluIGBhZGRgIG1ldGhvZCBvbiBhbGwgaXRzIGNsYXNzZXM6XG4gKlxuICogLSBbYFRlbXBvcmFsLkluc3RhbnQucHJvdG90eXBlLmFkZCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvVGVtcG9yYWwvSW5zdGFudC9hZGQpXG4gKiAtIFtgVGVtcG9yYWwuUGxhaW5EYXRlLnByb3RvdHlwZS5hZGQoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1RlbXBvcmFsL1BsYWluRGF0ZS9hZGQpXG4gKiAtIFtgVGVtcG9yYWwuUGxhaW5EYXRlVGltZS5wcm90b3R5cGUuYWRkKClgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9UZW1wb3JhbC9QbGFpbkRhdGVUaW1lL2FkZClcbiAqIC0gW2BUZW1wb3JhbC5QbGFpblRpbWUucHJvdG90eXBlLmFkZCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvVGVtcG9yYWwvUGxhaW5UaW1lL2FkZClcbiAqIC0gW2BUZW1wb3JhbC5QbGFpblllYXJNb250aC5wcm90b3R5cGUuYWRkKClgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9UZW1wb3JhbC9QbGFpblllYXJNb250aC9hZGQpXG4gKiAtIFtgVGVtcG9yYWwuWm9uZWREYXRlVGltZS5wcm90b3R5cGUuYWRkKClgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9UZW1wb3JhbC9ab25lZERhdGVUaW1lL2FkZClcbiAqXG4gKiBcXCogKipOb3QgcmVhbGx5KiosIHNlZTogaHR0cHM6Ly9kYXRlLWZucy5vcmcveW91LWRvbnQtbmVlZC1kYXRlLWZuc1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIGhvdXJzIHRvIGJlIGFkZGVkXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgaG91cnMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDIgaG91cnMgdG8gMTAgSnVseSAyMDE0IDIzOjAwOjAwOlxuICogY29uc3QgcmVzdWx0ID0gYWRkSG91cnMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDIzLCAwKSwgMilcbiAqIC8vPT4gRnJpIEp1bCAxMSAyMDE0IDAxOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFVzaW5nIFRlbXBvcmFsOlxuICogLy8gQWRkIDIgaG91cnMgdG8gMTAgSnVseSAyMDE0IDIzOjAwOjAwOlxuICogVGVtcG9yYWwuUGxhaW5EYXRlVGltZS5mcm9tKFwiMjAxNC0wNy0xMFQyMzowMDowMFwiKVxuICogICAuYWRkKHsgaG91cnM6IDIgfSlcbiAqICAgLnRvU3RyaW5nKCk7XG4gKiAvLz0+IFwiMjAxNC0wNy0xMVQwMTowMDowMFwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRIb3VycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGFkZE1pbGxpc2Vjb25kcyhkYXRlLCBhbW91bnQgKiBtaWxsaXNlY29uZHNJbkhvdXIsIG9wdGlvbnMpO1xufVxuIiwiaW1wb3J0IHsgbm9ybWFsaXplRGF0ZXMgfSBmcm9tIFwiLi9fbGliL25vcm1hbGl6ZURhdGVzLmpzXCI7XG5pbXBvcnQgeyBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMgfSBmcm9tIFwiLi9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGRpZmZlcmVuY2VJbkRheXN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5EYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGZ1bGwgZGF5cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGZ1bGwgZGF5IHBlcmlvZHMgYmV0d2VlbiB0d28gZGF0ZXMuIEZyYWN0aW9uYWwgZGF5cyBhcmVcbiAqIHRydW5jYXRlZCB0b3dhcmRzIHplcm8uXG4gKlxuICogT25lIFwiZnVsbCBkYXlcIiBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBhIGxvY2FsIHRpbWUgaW4gb25lIGRheSB0byB0aGUgc2FtZVxuICogbG9jYWwgdGltZSBvbiB0aGUgbmV4dCBvciBwcmV2aW91cyBkYXkuIEEgZnVsbCBkYXkgY2FuIHNvbWV0aW1lcyBiZSBsZXNzIHRoYW5cbiAqIG9yIG1vcmUgdGhhbiAyNCBob3VycyBpZiBhIGRheWxpZ2h0IHNhdmluZ3MgY2hhbmdlIGhhcHBlbnMgYmV0d2VlbiB0d28gZGF0ZXMuXG4gKlxuICogVG8gaWdub3JlIERTVCBhbmQgb25seSBtZWFzdXJlIGV4YWN0IDI0LWhvdXIgcGVyaW9kcywgdXNlIHRoaXMgaW5zdGVhZDpcbiAqIGBNYXRoLnRydW5jKGRpZmZlcmVuY2VJbkhvdXJzKGRhdGVMZWZ0LCBkYXRlUmlnaHQpLzI0KXwwYC5cbiAqXG4gKiBAcGFyYW0gbGF0ZXJEYXRlIC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBlYXJsaWVyRGF0ZSAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgZnVsbCBkYXlzIGFjY29yZGluZyB0byB0aGUgbG9jYWwgdGltZXpvbmVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgZnVsbCBkYXlzIGFyZSBiZXR3ZWVuXG4gKiAvLyAyIEp1bHkgMjAxMSAyMzowMDowMCBhbmQgMiBKdWx5IDIwMTIgMDA6MDA6MDA/XG4gKiBjb25zdCByZXN1bHQgPSBkaWZmZXJlbmNlSW5EYXlzKFxuICogICBuZXcgRGF0ZSgyMDEyLCA2LCAyLCAwLCAwKSxcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMiwgMjMsIDApXG4gKiApXG4gKiAvLz0+IDM2NVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBmdWxsIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjU5OjAwIGFuZCAzIEp1bHkgMjAxMSAwMDowMTowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkRheXMoXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDMsIDAsIDEpLFxuICogICBuZXcgRGF0ZSgyMDExLCA2LCAyLCAyMywgNTkpXG4gKiApXG4gKiAvLz0+IDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgZnVsbCBkYXlzIGFyZSBiZXR3ZWVuXG4gKiAvLyAxIE1hcmNoIDIwMjAgMDowMCBhbmQgMSBKdW5lIDIwMjAgMDowMCA/XG4gKiAvLyBOb3RlOiBiZWNhdXNlIGxvY2FsIHRpbWUgaXMgdXNlZCwgdGhlXG4gKiAvLyByZXN1bHQgd2lsbCBhbHdheXMgYmUgOTIgZGF5cywgZXZlbiBpblxuICogLy8gdGltZSB6b25lcyB3aGVyZSBEU1Qgc3RhcnRzIGFuZCB0aGVcbiAqIC8vIHBlcmlvZCBoYXMgb25seSA5MioyNC0xIGhvdXJzLlxuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluRGF5cyhcbiAqICAgbmV3IERhdGUoMjAyMCwgNSwgMSksXG4gKiAgIG5ldyBEYXRlKDIwMjAsIDIsIDEpXG4gKiApXG4gKiAvLz0+IDkyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmZXJlbmNlSW5EYXlzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcyhcbiAgICBvcHRpb25zPy5pbixcbiAgICBsYXRlckRhdGUsXG4gICAgZWFybGllckRhdGUsXG4gICk7XG5cbiAgY29uc3Qgc2lnbiA9IGNvbXBhcmVMb2NhbEFzYyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pO1xuICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoXG4gICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyksXG4gICk7XG5cbiAgbGF0ZXJEYXRlXy5zZXREYXRlKGxhdGVyRGF0ZV8uZ2V0RGF0ZSgpIC0gc2lnbiAqIGRpZmZlcmVuY2UpO1xuXG4gIC8vIE1hdGguYWJzKGRpZmYgaW4gZnVsbCBkYXlzIC0gZGlmZiBpbiBjYWxlbmRhciBkYXlzKSA9PT0gMSBpZiBsYXN0IGNhbGVuZGFyIGRheSBpcyBub3QgZnVsbFxuICAvLyBJZiBzbywgcmVzdWx0IG11c3QgYmUgZGVjcmVhc2VkIGJ5IDEgaW4gYWJzb2x1dGUgdmFsdWVcbiAgY29uc3QgaXNMYXN0RGF5Tm90RnVsbCA9IE51bWJlcihcbiAgICBjb21wYXJlTG9jYWxBc2MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKSA9PT0gLXNpZ24sXG4gICk7XG5cbiAgY29uc3QgcmVzdWx0ID0gc2lnbiAqIChkaWZmZXJlbmNlIC0gaXNMYXN0RGF5Tm90RnVsbCk7XG4gIC8vIFByZXZlbnQgbmVnYXRpdmUgemVyb1xuICByZXR1cm4gcmVzdWx0ID09PSAwID8gMCA6IHJlc3VsdDtcbn1cblxuLy8gTGlrZSBgY29tcGFyZUFzY2AgYnV0IHVzZXMgbG9jYWwgdGltZSBub3QgVVRDLCB3aGljaCBpcyBuZWVkZWRcbi8vIGZvciBhY2N1cmF0ZSBlcXVhbGl0eSBjb21wYXJpc29ucyBvZiBVVEMgdGltZXN0YW1wcyB0aGF0IGVuZCB1cFxuLy8gaGF2aW5nIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGluIGxvY2FsIHRpbWUsIGUuZy4gb25lIGhvdXIgYmVmb3JlXG4vLyBEU1QgZW5kcyB2cy4gdGhlIGluc3RhbnQgdGhhdCBEU1QgZW5kcy5cbmZ1bmN0aW9uIGNvbXBhcmVMb2NhbEFzYyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlKSB7XG4gIGNvbnN0IGRpZmYgPVxuICAgIGxhdGVyRGF0ZS5nZXRGdWxsWWVhcigpIC0gZWFybGllckRhdGUuZ2V0RnVsbFllYXIoKSB8fFxuICAgIGxhdGVyRGF0ZS5nZXRNb250aCgpIC0gZWFybGllckRhdGUuZ2V0TW9udGgoKSB8fFxuICAgIGxhdGVyRGF0ZS5nZXREYXRlKCkgLSBlYXJsaWVyRGF0ZS5nZXREYXRlKCkgfHxcbiAgICBsYXRlckRhdGUuZ2V0SG91cnMoKSAtIGVhcmxpZXJEYXRlLmdldEhvdXJzKCkgfHxcbiAgICBsYXRlckRhdGUuZ2V0TWludXRlcygpIC0gZWFybGllckRhdGUuZ2V0TWludXRlcygpIHx8XG4gICAgbGF0ZXJEYXRlLmdldFNlY29uZHMoKSAtIGVhcmxpZXJEYXRlLmdldFNlY29uZHMoKSB8fFxuICAgIGxhdGVyRGF0ZS5nZXRNaWxsaXNlY29uZHMoKSAtIGVhcmxpZXJEYXRlLmdldE1pbGxpc2Vjb25kcygpO1xuXG4gIGlmIChkaWZmIDwgMCkgcmV0dXJuIC0xO1xuICBpZiAoZGlmZiA+IDApIHJldHVybiAxO1xuXG4gIC8vIFJldHVybiAwIGlmIGRpZmYgaXMgMDsgcmV0dXJuIE5hTiBpZiBkaWZmIGlzIE5hTlxuICByZXR1cm4gZGlmZjtcbn1cbiIsImltcG9ydCB7IGdldFJvdW5kaW5nTWV0aG9kIH0gZnJvbSBcIi4vX2xpYi9nZXRSb3VuZGluZ01ldGhvZC5qc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplRGF0ZXMgfSBmcm9tIFwiLi9fbGliL25vcm1hbGl6ZURhdGVzLmpzXCI7XG5pbXBvcnQgeyBtaWxsaXNlY29uZHNJbkhvdXIgfSBmcm9tIFwiLi9jb25zdGFudHMuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGRpZmZlcmVuY2VJbkhvdXJzfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZGlmZmVyZW5jZUluSG91cnNcbiAqIEBjYXRlZ29yeSBIb3VyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGhvdXJzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgaG91cnMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQHBhcmFtIGxhdGVyRGF0ZSAtIFRoZSBsYXRlciBkYXRlXG4gKiBAcGFyYW0gZWFybGllckRhdGUgLSBUaGUgZWFybGllciBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBob3Vyc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBob3VycyBhcmUgYmV0d2VlbiAyIEp1bHkgMjAxNCAwNjo1MDowMCBhbmQgMiBKdWx5IDIwMTQgMTk6MDA6MDA/XG4gKiBjb25zdCByZXN1bHQgPSBkaWZmZXJlbmNlSW5Ib3VycyhcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMiwgMTksIDApLFxuICogICBuZXcgRGF0ZSgyMDE0LCA2LCAyLCA2LCA1MClcbiAqIClcbiAqIC8vPT4gMTJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZlcmVuY2VJbkhvdXJzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcyhcbiAgICBvcHRpb25zPy5pbixcbiAgICBsYXRlckRhdGUsXG4gICAgZWFybGllckRhdGUsXG4gICk7XG4gIGNvbnN0IGRpZmYgPSAoK2xhdGVyRGF0ZV8gLSArZWFybGllckRhdGVfKSAvIG1pbGxpc2Vjb25kc0luSG91cjtcbiAgcmV0dXJuIGdldFJvdW5kaW5nTWV0aG9kKG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kKShkaWZmKTtcbn1cbiIsImltcG9ydCB7IGFkZERheXMgfSBmcm9tIFwiLi9hZGREYXlzLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdWJEYXlzfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc3ViRGF5c1xuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgZGF5cyB0byBiZSBzdWJ0cmFjdGVkLlxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGRheXMgc3VidHJhY3RlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTdWJ0cmFjdCAxMCBkYXlzIGZyb20gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN1YkRheXMobmV3IERhdGUoMjAxNCwgOCwgMSksIDEwKVxuICogLy89PiBGcmkgQXVnIDIyIDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YkRheXMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7XG4gIHJldHVybiBhZGREYXlzKGRhdGUsIC1hbW91bnQsIG9wdGlvbnMpO1xufVxuIiwiaW1wb3J0IHtcbiAgbWlsbGlzZWNvbmRzSW5Ib3VyLFxuICBtaWxsaXNlY29uZHNJbk1pbnV0ZSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzLmpzXCI7XG5pbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBwYXJzZUlTT30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHBhcnNlSVNPXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFBhcnNlIElTTyBzdHJpbmdcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFBhcnNlIHRoZSBnaXZlbiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0IGFuZCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBGdW5jdGlvbiBhY2NlcHRzIGNvbXBsZXRlIElTTyA4NjAxIGZvcm1hdHMgYXMgd2VsbCBhcyBwYXJ0aWFsIGltcGxlbWVudGF0aW9ucy5cbiAqIElTTyA4NjAxOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzbid0IGEgc3RyaW5nLCB0aGUgZnVuY3Rpb24gY2Fubm90IHBhcnNlIHRoZSBzdHJpbmcgb3JcbiAqIHRoZSB2YWx1ZXMgYXJlIGludmFsaWQsIGl0IHJldHVybnMgSW52YWxpZCBEYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gYXJndW1lbnQgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBkYXRlIGluIHRoZSBsb2NhbCB0aW1lIHpvbmVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCBzdHJpbmcgJzIwMTQtMDItMTFUMTE6MzA6MzAnIHRvIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBwYXJzZUlTTygnMjAxNC0wMi0xMVQxMTozMDozMCcpXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IHN0cmluZyAnKzAyMDE0MTAxJyB0byBkYXRlLFxuICogLy8gaWYgdGhlIGFkZGl0aW9uYWwgbnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgZXh0ZW5kZWQgeWVhciBmb3JtYXQgaXMgMTpcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlSVNPKCcrMDIwMTQxMDEnLCB7IGFkZGl0aW9uYWxEaWdpdHM6IDEgfSlcbiAqIC8vPT4gRnJpIEFwciAxMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUlTTyhhcmd1bWVudCwgb3B0aW9ucykge1xuICBjb25zdCBpbnZhbGlkRGF0ZSA9ICgpID0+IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4sIE5hTik7XG5cbiAgY29uc3QgYWRkaXRpb25hbERpZ2l0cyA9IG9wdGlvbnM/LmFkZGl0aW9uYWxEaWdpdHMgPz8gMjtcbiAgY29uc3QgZGF0ZVN0cmluZ3MgPSBzcGxpdERhdGVTdHJpbmcoYXJndW1lbnQpO1xuXG4gIGxldCBkYXRlO1xuICBpZiAoZGF0ZVN0cmluZ3MuZGF0ZSkge1xuICAgIGNvbnN0IHBhcnNlWWVhclJlc3VsdCA9IHBhcnNlWWVhcihkYXRlU3RyaW5ncy5kYXRlLCBhZGRpdGlvbmFsRGlnaXRzKTtcbiAgICBkYXRlID0gcGFyc2VEYXRlKHBhcnNlWWVhclJlc3VsdC5yZXN0RGF0ZVN0cmluZywgcGFyc2VZZWFyUmVzdWx0LnllYXIpO1xuICB9XG5cbiAgaWYgKCFkYXRlIHx8IGlzTmFOKCtkYXRlKSkgcmV0dXJuIGludmFsaWREYXRlKCk7XG5cbiAgY29uc3QgdGltZXN0YW1wID0gK2RhdGU7XG4gIGxldCB0aW1lID0gMDtcbiAgbGV0IG9mZnNldDtcblxuICBpZiAoZGF0ZVN0cmluZ3MudGltZSkge1xuICAgIHRpbWUgPSBwYXJzZVRpbWUoZGF0ZVN0cmluZ3MudGltZSk7XG4gICAgaWYgKGlzTmFOKHRpbWUpKSByZXR1cm4gaW52YWxpZERhdGUoKTtcbiAgfVxuXG4gIGlmIChkYXRlU3RyaW5ncy50aW1lem9uZSkge1xuICAgIG9mZnNldCA9IHBhcnNlVGltZXpvbmUoZGF0ZVN0cmluZ3MudGltZXpvbmUpO1xuICAgIGlmIChpc05hTihvZmZzZXQpKSByZXR1cm4gaW52YWxpZERhdGUoKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0bXBEYXRlID0gbmV3IERhdGUodGltZXN0YW1wICsgdGltZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdG9EYXRlKDAsIG9wdGlvbnM/LmluKTtcbiAgICByZXN1bHQuc2V0RnVsbFllYXIoXG4gICAgICB0bXBEYXRlLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICB0bXBEYXRlLmdldFVUQ01vbnRoKCksXG4gICAgICB0bXBEYXRlLmdldFVUQ0RhdGUoKSxcbiAgICApO1xuICAgIHJlc3VsdC5zZXRIb3VycyhcbiAgICAgIHRtcERhdGUuZ2V0VVRDSG91cnMoKSxcbiAgICAgIHRtcERhdGUuZ2V0VVRDTWludXRlcygpLFxuICAgICAgdG1wRGF0ZS5nZXRVVENTZWNvbmRzKCksXG4gICAgICB0bXBEYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpLFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiB0b0RhdGUodGltZXN0YW1wICsgdGltZSArIG9mZnNldCwgb3B0aW9ucz8uaW4pO1xufVxuXG5jb25zdCBwYXR0ZXJucyA9IHtcbiAgZGF0ZVRpbWVEZWxpbWl0ZXI6IC9bVCBdLyxcbiAgdGltZVpvbmVEZWxpbWl0ZXI6IC9bWiBdL2ksXG4gIHRpbWV6b25lOiAvKFtaKy1dLiopJC8sXG59O1xuXG5jb25zdCBkYXRlUmVnZXggPVxuICAvXi0/KD86KFxcZHszfSl8KFxcZHsyfSkoPzotPyhcXGR7Mn0pKT98VyhcXGR7Mn0pKD86LT8oXFxkezF9KSk/fCkkLztcbmNvbnN0IHRpbWVSZWdleCA9XG4gIC9eKFxcZHsyfSg/OlsuLF1cXGQqKT8pKD86Oj8oXFxkezJ9KD86Wy4sXVxcZCopPykpPyg/Ojo/KFxcZHsyfSg/OlsuLF1cXGQqKT8pKT8kLztcbmNvbnN0IHRpbWV6b25lUmVnZXggPSAvXihbKy1dKShcXGR7Mn0pKD86Oj8oXFxkezJ9KSk/JC87XG5cbmZ1bmN0aW9uIHNwbGl0RGF0ZVN0cmluZyhkYXRlU3RyaW5nKSB7XG4gIGNvbnN0IGRhdGVTdHJpbmdzID0ge307XG4gIGNvbnN0IGFycmF5ID0gZGF0ZVN0cmluZy5zcGxpdChwYXR0ZXJucy5kYXRlVGltZURlbGltaXRlcik7XG4gIGxldCB0aW1lU3RyaW5nO1xuXG4gIC8vIFRoZSByZWdleCBtYXRjaCBzaG91bGQgb25seSByZXR1cm4gYXQgbWF4aW11bSB0d28gYXJyYXkgZWxlbWVudHMuXG4gIC8vIFtkYXRlXSwgW3RpbWVdLCBvciBbZGF0ZSwgdGltZV0uXG4gIGlmIChhcnJheS5sZW5ndGggPiAyKSB7XG4gICAgcmV0dXJuIGRhdGVTdHJpbmdzO1xuICB9XG5cbiAgaWYgKC86Ly50ZXN0KGFycmF5WzBdKSkge1xuICAgIHRpbWVTdHJpbmcgPSBhcnJheVswXTtcbiAgfSBlbHNlIHtcbiAgICBkYXRlU3RyaW5ncy5kYXRlID0gYXJyYXlbMF07XG4gICAgdGltZVN0cmluZyA9IGFycmF5WzFdO1xuICAgIGlmIChwYXR0ZXJucy50aW1lWm9uZURlbGltaXRlci50ZXN0KGRhdGVTdHJpbmdzLmRhdGUpKSB7XG4gICAgICBkYXRlU3RyaW5ncy5kYXRlID0gZGF0ZVN0cmluZy5zcGxpdChwYXR0ZXJucy50aW1lWm9uZURlbGltaXRlcilbMF07XG4gICAgICB0aW1lU3RyaW5nID0gZGF0ZVN0cmluZy5zdWJzdHIoXG4gICAgICAgIGRhdGVTdHJpbmdzLmRhdGUubGVuZ3RoLFxuICAgICAgICBkYXRlU3RyaW5nLmxlbmd0aCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRpbWVTdHJpbmcpIHtcbiAgICBjb25zdCB0b2tlbiA9IHBhdHRlcm5zLnRpbWV6b25lLmV4ZWModGltZVN0cmluZyk7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICBkYXRlU3RyaW5ncy50aW1lID0gdGltZVN0cmluZy5yZXBsYWNlKHRva2VuWzFdLCBcIlwiKTtcbiAgICAgIGRhdGVTdHJpbmdzLnRpbWV6b25lID0gdG9rZW5bMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGVTdHJpbmdzLnRpbWUgPSB0aW1lU3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRlU3RyaW5ncztcbn1cblxuZnVuY3Rpb24gcGFyc2VZZWFyKGRhdGVTdHJpbmcsIGFkZGl0aW9uYWxEaWdpdHMpIHtcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFxuICAgIFwiXig/OihcXFxcZHs0fXxbKy1dXFxcXGR7XCIgK1xuICAgICAgKDQgKyBhZGRpdGlvbmFsRGlnaXRzKSArXG4gICAgICBcIn0pfChcXFxcZHsyfXxbKy1dXFxcXGR7XCIgK1xuICAgICAgKDIgKyBhZGRpdGlvbmFsRGlnaXRzKSArXG4gICAgICBcIn0pJClcIixcbiAgKTtcblxuICBjb25zdCBjYXB0dXJlcyA9IGRhdGVTdHJpbmcubWF0Y2gocmVnZXgpO1xuICAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgeWVhclxuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4geyB5ZWFyOiBOYU4sIHJlc3REYXRlU3RyaW5nOiBcIlwiIH07XG5cbiAgY29uc3QgeWVhciA9IGNhcHR1cmVzWzFdID8gcGFyc2VJbnQoY2FwdHVyZXNbMV0pIDogbnVsbDtcbiAgY29uc3QgY2VudHVyeSA9IGNhcHR1cmVzWzJdID8gcGFyc2VJbnQoY2FwdHVyZXNbMl0pIDogbnVsbDtcblxuICAvLyBlaXRoZXIgeWVhciBvciBjZW50dXJ5IGlzIG51bGwsIG5vdCBib3RoXG4gIHJldHVybiB7XG4gICAgeWVhcjogY2VudHVyeSA9PT0gbnVsbCA/IHllYXIgOiBjZW50dXJ5ICogMTAwLFxuICAgIHJlc3REYXRlU3RyaW5nOiBkYXRlU3RyaW5nLnNsaWNlKChjYXB0dXJlc1sxXSB8fCBjYXB0dXJlc1syXSkubGVuZ3RoKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEYXRlKGRhdGVTdHJpbmcsIHllYXIpIHtcbiAgLy8gSW52YWxpZCBJU08tZm9ybWF0dGVkIHllYXJcbiAgaWYgKHllYXIgPT09IG51bGwpIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuXG4gIGNvbnN0IGNhcHR1cmVzID0gZGF0ZVN0cmluZy5tYXRjaChkYXRlUmVnZXgpO1xuICAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgc3RyaW5nXG4gIGlmICghY2FwdHVyZXMpIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuXG4gIGNvbnN0IGlzV2Vla0RhdGUgPSAhIWNhcHR1cmVzWzRdO1xuICBjb25zdCBkYXlPZlllYXIgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzFdKTtcbiAgY29uc3QgbW9udGggPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzJdKSAtIDE7XG4gIGNvbnN0IGRheSA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbM10pO1xuICBjb25zdCB3ZWVrID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1s0XSk7XG4gIGNvbnN0IGRheU9mV2VlayA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbNV0pIC0gMTtcblxuICBpZiAoaXNXZWVrRGF0ZSkge1xuICAgIGlmICghdmFsaWRhdGVXZWVrRGF0ZSh5ZWFyLCB3ZWVrLCBkYXlPZldlZWspKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgICB9XG4gICAgcmV0dXJuIGRheU9mSVNPV2Vla1llYXIoeWVhciwgd2VlaywgZGF5T2ZXZWVrKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgaWYgKFxuICAgICAgIXZhbGlkYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF5KSB8fFxuICAgICAgIXZhbGlkYXRlRGF5T2ZZZWFyRGF0ZSh5ZWFyLCBkYXlPZlllYXIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgICB9XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5ZWFyLCBtb250aCwgTWF0aC5tYXgoZGF5T2ZZZWFyLCBkYXkpKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZURhdGVVbml0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA/IHBhcnNlSW50KHZhbHVlKSA6IDE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGltZSh0aW1lU3RyaW5nKSB7XG4gIGNvbnN0IGNhcHR1cmVzID0gdGltZVN0cmluZy5tYXRjaCh0aW1lUmVnZXgpO1xuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gTmFOOyAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgdGltZVxuXG4gIGNvbnN0IGhvdXJzID0gcGFyc2VUaW1lVW5pdChjYXB0dXJlc1sxXSk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZVRpbWVVbml0KGNhcHR1cmVzWzJdKTtcbiAgY29uc3Qgc2Vjb25kcyA9IHBhcnNlVGltZVVuaXQoY2FwdHVyZXNbM10pO1xuXG4gIGlmICghdmFsaWRhdGVUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGhvdXJzICogbWlsbGlzZWNvbmRzSW5Ib3VyICsgbWludXRlcyAqIG1pbGxpc2Vjb25kc0luTWludXRlICsgc2Vjb25kcyAqIDEwMDBcbiAgKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lVW5pdCh2YWx1ZSkge1xuICByZXR1cm4gKHZhbHVlICYmIHBhcnNlRmxvYXQodmFsdWUucmVwbGFjZShcIixcIiwgXCIuXCIpKSkgfHwgMDtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lem9uZSh0aW1lem9uZVN0cmluZykge1xuICBpZiAodGltZXpvbmVTdHJpbmcgPT09IFwiWlwiKSByZXR1cm4gMDtcblxuICBjb25zdCBjYXB0dXJlcyA9IHRpbWV6b25lU3RyaW5nLm1hdGNoKHRpbWV6b25lUmVnZXgpO1xuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gMDtcblxuICBjb25zdCBzaWduID0gY2FwdHVyZXNbMV0gPT09IFwiK1wiID8gLTEgOiAxO1xuICBjb25zdCBob3VycyA9IHBhcnNlSW50KGNhcHR1cmVzWzJdKTtcbiAgY29uc3QgbWludXRlcyA9IChjYXB0dXJlc1szXSAmJiBwYXJzZUludChjYXB0dXJlc1szXSkpIHx8IDA7XG5cbiAgaWYgKCF2YWxpZGF0ZVRpbWV6b25lKGhvdXJzLCBtaW51dGVzKSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cblxuICByZXR1cm4gc2lnbiAqIChob3VycyAqIG1pbGxpc2Vjb25kc0luSG91ciArIG1pbnV0ZXMgKiBtaWxsaXNlY29uZHNJbk1pbnV0ZSk7XG59XG5cbmZ1bmN0aW9uIGRheU9mSVNPV2Vla1llYXIoaXNvV2Vla1llYXIsIHdlZWssIGRheSkge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gIGRhdGUuc2V0VVRDRnVsbFllYXIoaXNvV2Vla1llYXIsIDAsIDQpO1xuICBjb25zdCBmb3VydGhPZkphbnVhcnlEYXkgPSBkYXRlLmdldFVUQ0RheSgpIHx8IDc7XG4gIGNvbnN0IGRpZmYgPSAod2VlayAtIDEpICogNyArIGRheSArIDEgLSBmb3VydGhPZkphbnVhcnlEYXk7XG4gIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIGRpZmYpO1xuICByZXR1cm4gZGF0ZTtcbn1cblxuLy8gVmFsaWRhdGlvbiBmdW5jdGlvbnNcblxuLy8gRmVicnVhcnkgaXMgbnVsbCB0byBoYW5kbGUgdGhlIGxlYXAgeWVhciAodXNpbmcgfHwpXG5jb25zdCBkYXlzSW5Nb250aHMgPSBbMzEsIG51bGwsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcblxuZnVuY3Rpb24gaXNMZWFwWWVhckluZGV4KHllYXIpIHtcbiAgcmV0dXJuIHllYXIgJSA0MDAgPT09IDAgfHwgKHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDApO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZURhdGUoeWVhciwgbW9udGgsIGRhdGUpIHtcbiAgcmV0dXJuIChcbiAgICBtb250aCA+PSAwICYmXG4gICAgbW9udGggPD0gMTEgJiZcbiAgICBkYXRlID49IDEgJiZcbiAgICBkYXRlIDw9IChkYXlzSW5Nb250aHNbbW9udGhdIHx8IChpc0xlYXBZZWFySW5kZXgoeWVhcikgPyAyOSA6IDI4KSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVEYXlPZlllYXJEYXRlKHllYXIsIGRheU9mWWVhcikge1xuICByZXR1cm4gZGF5T2ZZZWFyID49IDEgJiYgZGF5T2ZZZWFyIDw9IChpc0xlYXBZZWFySW5kZXgoeWVhcikgPyAzNjYgOiAzNjUpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVdlZWtEYXRlKF95ZWFyLCB3ZWVrLCBkYXkpIHtcbiAgcmV0dXJuIHdlZWsgPj0gMSAmJiB3ZWVrIDw9IDUzICYmIGRheSA+PSAwICYmIGRheSA8PSA2O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpIHtcbiAgaWYgKGhvdXJzID09PSAyNCkge1xuICAgIHJldHVybiBtaW51dGVzID09PSAwICYmIHNlY29uZHMgPT09IDA7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIHNlY29uZHMgPj0gMCAmJlxuICAgIHNlY29uZHMgPCA2MCAmJlxuICAgIG1pbnV0ZXMgPj0gMCAmJlxuICAgIG1pbnV0ZXMgPCA2MCAmJlxuICAgIGhvdXJzID49IDAgJiZcbiAgICBob3VycyA8IDI1XG4gICk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGltZXpvbmUoX2hvdXJzLCBtaW51dGVzKSB7XG4gIHJldHVybiBtaW51dGVzID49IDAgJiYgbWludXRlcyA8PSA1OTtcbn1cbiIsImltcG9ydCB7IGFkZEhvdXJzIH0gZnJvbSBcIi4vYWRkSG91cnMuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN1YkhvdXJzfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc3ViSG91cnNcbiAqIEBjYXRlZ29yeSBIb3VyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGhvdXJzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBob3VycyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIGhvdXJzIHRvIGJlIHN1YnRyYWN0ZWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGhvdXJzIHN1YnRyYWN0ZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3VidHJhY3QgMiBob3VycyBmcm9tIDExIEp1bHkgMjAxNCAwMTowMDowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN1YkhvdXJzKG5ldyBEYXRlKDIwMTQsIDYsIDExLCAxLCAwKSwgMilcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDIzOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJIb3VycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGFkZEhvdXJzKGRhdGUsIC1hbW91bnQsIG9wdGlvbnMpO1xufVxuIiwiaW1wb3J0IHtcbiAgaTE4bkR1cmF0aW9uRGF5LFxuICBpMThuRHVyYXRpb25Ib3VyLFxuICBpMThuRHVyYXRpb25NaW51dGUsXG59IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUuanMnO1xuaW1wb3J0IHtcbiAgYWRkTWludXRlcyxcbiAgZGlmZmVyZW5jZUluRGF5cyxcbiAgZGlmZmVyZW5jZUluSG91cnMsXG4gIGRpZmZlcmVuY2VJbk1pbnV0ZXMsXG4gIGlzVmFsaWQsXG4gIHBhcnNlSVNPLFxuICBzdWJEYXlzLFxuICBzdWJIb3Vycyxcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgb2Zmc2V0IG9mIGEgSVNPIGRhdGUgc3RyaW5nLiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG9mZnNldCBpcyBpZ25vcmVkLlxuICogSWYgaXQgaXMgbm90IHJlbW92ZWQgdGhlIHRpbWUgd291bGQgYmUgY29udmVydGVkIHRvIHRoZSBicm93c2VycyBsb2NhbCB0aW1lLlxuICogRXhhbXBsZTogXCIyMDIyLTA4LTI5VDA5OjMwOjAwKzAzOjAwXCIgd291bGQgYmUgY2hhbmdlZCB0byBcIjIwMjItMDgtMjlUMDg6MzA6MDArMDI6MDBcIiAtLT4gbm90IHRoZSBkZXNpcmVkIG91dGNvbWUsIGFzIHdlIHdhbnQgdG8gdXNlIHRoZSB0aW1lIGluIHRoZSB0aW1lem9uZSBhbmQgbm90IHRoZSBsb2NhbCB0aW1lLlxuICpcbiAqIEFmdGVyIHRoZSBvZmZzZXQgaXMgcmVtb3ZlZCBhIG5ldyBkYXRlIGlzIGNyZWF0ZWQgaW4gdGhlIGJyb3dzZXJzIGxvY2FsIHRpbWUuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB0aW1lIG9mIHRoZSBJU08gZGF0ZSBzdHJpbmcgaXMgZGlzcGxheWVkIGFuZCBub3QgYSBjb252ZXJ0ZWQgdGltZS5cbiAqIEV4YW1wbGU6IFwiMjAyMi0wOC0yOVQwOTozMDowMCswMzowMFwiIHdvdWxkIGJlIGNoYW5nZWQgdG8gXCIyMDIyLTA4LTI5VDA5OjMwOjAwKzAyOjAwXCIgLS0+IGRlc2lyZWQgb3V0Y29tZVxuICogQXR0ZW50aW9uOiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhlIGNvcnJlY3QgdGltZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuIEl0IGlzIGEgd29ya2Fyb3VuZCB0byBtYWtlIHN1cmUsIHRoYXQgdGhlIGdpdmVuIHRpbWUgaXMgZGlzcGxheWVkIHdpdGhvdXQgYmVpbmcgY29udmVydGVkLlxuICpcbiAqIE9mZnNldDogRGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0aW1lem9uZSBhbmQgQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUuXG4gKlxuICogQHBhcmFtIGlzb1RpbWUgLSB0aGUgaXNvIHRpbWUgd2l0aCB0aGUgdGltZXpvbmUgb2Zmc2V0XG4gKiBAcmV0dXJucyBhIG5ldyBkYXRlIHdpdGggdGhlIGxvY2FsIHRpbWV6b25lIHdpdGggdGhlIGxvY2FsIG9mZnNldFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVGltZXpvbmVGcm9tSVNPVGltZVN0cmluZyhpc29UaW1lPzogc3RyaW5nKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghaXNvVGltZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgcGFyc2VkRGF0ZSA9IHBhcnNlSVNPKGlzb1RpbWUpO1xuXG4gIGlmICghaXNWYWxpZChwYXJzZWREYXRlKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoaXNvVGltZS5pbmNsdWRlcygnWicpKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGlzb1RpbWUucmVwbGFjZSgnWicsICcnKSk7XG4gIH1cblxuICBpZiAoaXNvVGltZS5pbmNsdWRlcygnVCcpKSB7XG4gICAgY29uc3QgZGF0ZVRpbWUgPSBpc29UaW1lLnNwbGl0KCdUJyk7XG5cbiAgICBpZiAoZGF0ZVRpbWVbMV0gJiYgKGRhdGVUaW1lWzFdLmluY2x1ZGVzKCcrJykgfHwgZGF0ZVRpbWVbMV0uaW5jbHVkZXMoJy0nKSkpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShgJHtkYXRlVGltZVswXX1UJHtkYXRlVGltZVsxXS5zcGxpdCgvWystXS8pWzBdfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IERhdGUoaXNvVGltZSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIGR1cmF0aW9uIG51bWJlciB0byBkYXRlIHN0cmluZyB3aXRoIHNwZWNpZmljIGZvcm1hdFxuICpcbiAqIEBwYXJhbSBkdXJhdGlvbiAtIGR1cmF0aW9uIGluIG1pbnV0ZXNcbiAqIEBwYXJhbSBjdXJyZW50TGFuZ3VhZ2UgLSBjdXJyZW50TGFuZ3VhZ2VcbiAqIEByZXR1cm5zIGFuIE9iamVjdCB3aXRoIHR3byBzdHJpbmdzIGluIHRoZSBmb3JtYXQgXCJkZCBoaCBtbVwiIChzaG9ydCkgYW4gXCJ4IERheShzKSB4IEhvdXIocykgeCBNaW51dGUocykgKGxvbmcpXCJcbiAqICovXG5cbmV4cG9ydCBjb25zdCBkdXJhdGlvblRvVGltZSA9IChcbiAgZHVyYXRpb246IG51bWJlcixcbiAgY3VycmVudExhbmd1YWdlPzogc3RyaW5nLFxuKTogeyBzaG9ydDogc3RyaW5nOyBsb25nOiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IHNob3J0ID0gW107XG4gIGNvbnN0IGxvbmcgPSBbXTtcblxuICBjb25zdCBub3cgPSAwO1xuICBsZXQgZnV0dXJlID0gYWRkTWludXRlcyhub3csIGR1cmF0aW9uKTtcblxuICBjb25zdCBkYXlzID0gZGlmZmVyZW5jZUluRGF5cyhmdXR1cmUsIG5vdyk7XG4gIGlmIChkYXlzID4gMCkge1xuICAgIHNob3J0LnB1c2goYCR7ZGF5c30gZGApO1xuICAgIGlmIChjdXJyZW50TGFuZ3VhZ2UpIHtcbiAgICAgIGxvbmcucHVzaChcbiAgICAgICAgYCR7ZGF5c30gJHtcbiAgICAgICAgICBkYXlzID4gMVxuICAgICAgICAgICAgPyBpMThuRHVyYXRpb25EYXkubXVsdGlwbGUubG9uZ1tjdXJyZW50TGFuZ3VhZ2VdXG4gICAgICAgICAgICA6IGkxOG5EdXJhdGlvbkRheS5zaW5nbGUubG9uZ1tjdXJyZW50TGFuZ3VhZ2VdXG4gICAgICAgIH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgZnV0dXJlID0gc3ViRGF5cyhmdXR1cmUsIGRheXMpO1xuICB9XG5cbiAgY29uc3QgaG91cnMgPSBkaWZmZXJlbmNlSW5Ib3VycyhmdXR1cmUsIG5vdyk7XG4gIGlmIChob3VycyA+IDApIHtcbiAgICBzaG9ydC5wdXNoKGAke2hvdXJzfSBoYCk7XG4gICAgaWYgKGN1cnJlbnRMYW5ndWFnZSkge1xuICAgICAgbG9uZy5wdXNoKFxuICAgICAgICBgJHtob3Vyc30gJHtcbiAgICAgICAgICBob3VycyA+IDFcbiAgICAgICAgICAgID8gaTE4bkR1cmF0aW9uSG91ci5tdWx0aXBsZS5sb25nW2N1cnJlbnRMYW5ndWFnZV1cbiAgICAgICAgICAgIDogaTE4bkR1cmF0aW9uSG91ci5zaW5nbGUubG9uZ1tjdXJyZW50TGFuZ3VhZ2VdXG4gICAgICAgIH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgZnV0dXJlID0gc3ViSG91cnMoZnV0dXJlLCBob3Vycyk7XG4gIH1cblxuICBjb25zdCBtaW51dGVzID0gZGlmZmVyZW5jZUluTWludXRlcyhmdXR1cmUsIG5vdyk7XG4gIGlmIChtaW51dGVzID4gMCkge1xuICAgIHNob3J0LnB1c2goYCR7bWludXRlc30gbWluYCk7XG4gICAgaWYgKGN1cnJlbnRMYW5ndWFnZSkge1xuICAgICAgbG9uZy5wdXNoKFxuICAgICAgICBgJHttaW51dGVzfSAke1xuICAgICAgICAgIG1pbnV0ZXMgPiAxXG4gICAgICAgICAgICA/IGkxOG5EdXJhdGlvbk1pbnV0ZS5tdWx0aXBsZS5sb25nW2N1cnJlbnRMYW5ndWFnZV1cbiAgICAgICAgICAgIDogaTE4bkR1cmF0aW9uTWludXRlLnNpbmdsZS5sb25nW2N1cnJlbnRMYW5ndWFnZV1cbiAgICAgICAgfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2hvcnQ6IHNob3J0LmpvaW4oJyAnKSxcbiAgICBsb25nOiBsb25nLmpvaW4oJyAnKSxcbiAgfTtcbn07XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsN10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0RBLFNBQWdCLFFBQVEsTUFBTSxRQUFRLFNBQVM7Q0FDN0MsTUFBTSxRQUFRLE9BQU8sTUFBTSxTQUFTLEVBQUU7Q0FDdEMsSUFBSSxNQUFNLE1BQU0sR0FBRyxPQUFPLGNBQWMsU0FBUyxNQUFNLE1BQU0sR0FBRztDQUdoRSxJQUFJLENBQUMsUUFBUSxPQUFPO0NBRXBCLE1BQU0sUUFBUSxNQUFNLFFBQVEsSUFBSSxNQUFNO0NBQ3RDLE9BQU87QUFDVDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1BBLFNBQWdCLGdCQUFnQixNQUFNLFFBQVEsU0FBUztDQUNyRCxPQUFPLGNBQWMsU0FBUyxNQUFNLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxNQUFNO0FBQ2xFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRkEsU0FBZ0IsU0FBUyxNQUFNLFFBQVEsU0FBUztDQUM5QyxPQUFPLGdCQUFnQixNQUFNLFNBQVMsb0JBQW9CLE9BQU87QUFDbkU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUUEsU0FBZ0Is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