nmce-func 1.4.0 → 1.5.0

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,308 +0,0 @@
1
- import { DateTime, Duration, Settings } from 'luxon';
2
- export class DateFunc {
3
- /**
4
- * At runtime, there's no simple guarantee that the input is Date. Sometimes you codes expect date, but the response from the Web service may give you string or number.
5
- * This function give you safe parse of date data from I/O, not of your control.
6
- * If the data is invalid, throws RangeError or TypeError.
7
- * @param dt
8
- * @returns
9
- */
10
- static dateDataToDate(dt) {
11
- if (dt instanceof Date) {
12
- return dt;
13
- }
14
- if (typeof dt === 'string') {
15
- const r = Date.parse(dt);
16
- if (isNaN(r)) {
17
- throw new RangeError('Invalid string for Date');
18
- }
19
- return new Date(r);
20
- }
21
- if (typeof dt === 'number') {
22
- const rd = new Date(dt);
23
- if (Number.isNaN(rd.valueOf())) {
24
- throw new RangeError('Invalid number for Date');
25
- }
26
- return rd;
27
- }
28
- throw new TypeError('Expect Date, string or number');
29
- }
30
- /**
31
- * Similar to dateDataToDate, but allow null and defined semantically.
32
- * @param dt
33
- * @returns
34
- */
35
- static dateDataToDateOrNull(dt) {
36
- if (dt instanceof Date) {
37
- return dt;
38
- }
39
- if (typeof dt === 'string') {
40
- const r = Date.parse(dt);
41
- if (isNaN(r)) {
42
- throw new RangeError('Invalid string for Date');
43
- }
44
- return new Date(r);
45
- }
46
- if (typeof dt === 'number') {
47
- const rd = new Date(dt);
48
- if (Number.isNaN(rd.valueOf())) {
49
- throw new RangeError('Invalid number for Date');
50
- }
51
- return rd;
52
- }
53
- if (dt == null) {
54
- return dt;
55
- }
56
- throw new TypeError('Expect Date, string or number');
57
- }
58
- /**
59
- * Transform UTC DateTime to local date without H, M and S. For example, the month day of 2018-01-23T22:00:00Z is 24 in Australia.
60
- * @param dtUtc
61
- */
62
- static dateTimeUtcToLocalDateNumber(dtUtc) {
63
- if (dtUtc == null) {
64
- return dtUtc;
65
- }
66
- const localDt = this.dateDataToDate(dtUtc);
67
- const localDNum = localDt.setHours(0, 0, 0, 0);
68
- return localDNum;
69
- }
70
- /**
71
- * Date only. However, the date may still be in UTC.
72
- * @param dtUtc
73
- * @returns new Date object.
74
- */
75
- static dateTimeUtcToLocalDate(dtUtc) {
76
- if (dtUtc == null) {
77
- return dtUtc;
78
- }
79
- const localDt = this.dateDataToDate(dtUtc);
80
- const localNum = localDt.setHours(0, 0, 0, 0);
81
- return new Date(localNum);
82
- }
83
- /**
84
- * '2018-01-23T22:00:00Z' will become '2018-01-24' in Australia.
85
- * @param dtUtc
86
- * @returns new Date object.
87
- */
88
- static localISODateString(dtUtc) {
89
- const dt = this.dateTimeUtcToLocalDate(dtUtc);
90
- if (dt == null) {
91
- return dt;
92
- }
93
- const d = DateTime.fromJSDate(dt);
94
- return d.toISODate();
95
- }
96
- /**
97
- * local date ONLY (no time) to UTC date.
98
- * The input could be a string of yyyy-MM-dd, or a Date Object.
99
- * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
100
- * While the time value at the heart of a Date object is UTC, the basic methods to fetch the date and time
101
- * or its components all work in the local (i.e. host system) time zone and offset.
102
- * @param dt if dt contain time info, it will become dt.setHours(0, 0, 0, 0)
103
- */
104
- static localDateToUtc(d) {
105
- if (d == null) {
106
- return d;
107
- }
108
- const dt = this.dateDataToDate(d);
109
- const n = dt.setHours(0, 0, 0, 0);
110
- const offset = dt.getTimezoneOffset() * 60000;
111
- return new Date(n + offset);
112
- }
113
- static getEndOfWeek(dt) {
114
- const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
115
- return dateTime.endOf('week').toJSDate();
116
- }
117
- static getStartOfWeek(dt) {
118
- const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
119
- return dateTime.startOf('week').toJSDate();
120
- }
121
- static getEndOfMonth(dt) {
122
- const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
123
- return dateTime.endOf('month').toJSDate();
124
- }
125
- static getStartOfMonth(dt) {
126
- const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
127
- return dateTime.startOf('month').toJSDate();
128
- }
129
- static getEndOfDate(dt) {
130
- const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
131
- return dateTime.endOf('day').toJSDate();
132
- }
133
- static getStartOfDate(dt) {
134
- const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
135
- return dateTime.startOf('day').toJSDate();
136
- }
137
- static getEndOfToday() {
138
- return this.getEndOfDate(Date.now());
139
- }
140
- static getStartOfToday() {
141
- return this.getStartOfDate(Date.now());
142
- }
143
- static getDaysBetween(d1, d2) {
144
- const dm1 = DateTime.fromJSDate(this.dateDataToDate(d1));
145
- const dm2 = DateTime.fromJSDate(this.dateDataToDate(d1));
146
- return dm2.diff(dm1, 'days').days;
147
- }
148
- //inspired https://stackoverflow.com/questions/563406/add-days-to-javascript-date
149
- static addDays(dt, days) {
150
- const dat = DateTime.fromJSDate(this.dateDataToDate(dt));
151
- const r = dat.plus({ days: days });
152
- return r.toJSDate();
153
- }
154
- /**
155
- * Start of today
156
- */
157
- static get today() {
158
- return this.getStartOfToday();
159
- }
160
- static get now() {
161
- return new Date(Date.now());
162
- }
163
- /**
164
- * From now, next 5 minute mark. For example 2:23:44 will be 2:25:00;
165
- * @returns
166
- */
167
- static getNext5MinuteMark() {
168
- const m = DateTime.now().set({ second: 0, millisecond: 0 });
169
- const minute = m.minute;
170
- const mod = minute % 5;
171
- if (mod) {
172
- const delta = 5 - mod;
173
- return m.plus({ minutes: delta }).toJSDate();
174
- }
175
- return m.toJSDate();
176
- }
177
- static getYMD(d) {
178
- const dt = DateTime.fromJSDate(this.dateDataToDate(d));
179
- return dt.toFormat('yyyyMMdd');
180
- }
181
- static getDMYWithSlash(d) {
182
- const dt = DateTime.fromJSDate(this.dateDataToDate(d));
183
- return dt.toFormat('dd/MM/yyyy');
184
- }
185
- static getDMYHmWithSlash(d) {
186
- const dt = DateTime.fromJSDate(this.dateDataToDate(d));
187
- return dt.toFormat('dd/MM/yyyy HH:mm');
188
- }
189
- /**
190
- *
191
- * @param dtUtc In 24 hour format, and the date separator depending on the system or Luxon default locale
192
- * @returns
193
- */
194
- static getDateTime24Simple(dtUtc) {
195
- if (dtUtc == null) {
196
- return dtUtc;
197
- }
198
- const d = this.dateDataToDate(dtUtc);
199
- const dt = DateTime.fromJSDate(d);
200
- return dt.toLocaleString(DateTime.DATE_SHORT) + ' ' + dt.toLocaleString(DateTime.TIME_24_SIMPLE);
201
- }
202
- static setDefaultLocale(locale) {
203
- Settings.defaultLocale = locale;
204
- }
205
- static getDefaultLocale() {
206
- return Settings.defaultLocale;
207
- }
208
- static setDefaultZone(zone) {
209
- Settings.defaultZone = zone;
210
- }
211
- static getDefaultZone() {
212
- return Settings.defaultZone.name;
213
- }
214
- static isZoneValid() {
215
- return Settings.defaultZone.isValid;
216
- }
217
- /**
218
- * For example, in AEST, it is -600.
219
- * @returns
220
- */
221
- static getLocalTimezoneOffset() {
222
- const dt = new Date(Date.now());
223
- return dt.getTimezoneOffset();
224
- }
225
- /**
226
- * Get hour of the date. If Date is not defined, the hour will be current hour.
227
- * @param dtUtc
228
- */
229
- static getHour(dtUtc) {
230
- const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
231
- return dt.hour;
232
- }
233
- static getMinute(dtUtc) {
234
- const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
235
- return dt.minute;
236
- }
237
- static GetHM(dtUtc) {
238
- const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
239
- return { h: dt.hour, m: dt.minute };
240
- }
241
- static composeDateTime(dt, h = 0, minute = 0, second = 0) {
242
- return new Date(this.dateDataToDate(dt).setHours(h, minute, second, 0));
243
- }
244
- static olderThan24Hours(d) {
245
- const m = DateTime.fromJSDate(this.dateDataToDate(d));
246
- return DateTime.now().diff(m, 'hours') >= Duration.fromISO('PT24H');
247
- }
248
- static olderThanHours(d, hours) {
249
- const m = DateTime.fromJSDate(this.dateDataToDate(d));
250
- const diff = DateTime.now().diff(m, 'hours');
251
- const duration = Duration.fromISO(`PT${hours}H`);
252
- console.debug('diff: ' + diff.hours + ' duration: ' + duration.hours);
253
- return diff.hours >= duration.hours;
254
- }
255
- static olderThanMinutes(d, minutes) {
256
- const m = DateTime.fromJSDate(this.dateDataToDate(d));
257
- return DateTime.now().diff(m, 'minutes') >= Duration.fromMillis(minutes * 60 * 1000);
258
- }
259
- /**
260
- * It could be 11PM yesterday, and 1 AM today. Actually based on local today.
261
- */
262
- static olderThan1Day(dtUtc) {
263
- return DateFunc.getDayAge(dtUtc) > 0;
264
- }
265
- static getHourAge(d) {
266
- const m = DateTime.fromJSDate(this.dateDataToDate(d));
267
- return DateTime.now().diff(m, 'hours').hours;
268
- }
269
- /**
270
- * Compare date with now.
271
- * @param dtUtc
272
- */
273
- static getDayAge(d) {
274
- const m = DateTime.fromJSDate(this.dateDataToDate(d));
275
- return DateTime.now().diff(m, 'days').days;
276
- }
277
- /**
278
- * How many years from now.
279
- * @param d
280
- * @returns
281
- */
282
- static getAge(d) {
283
- const m = DateTime.fromJSDate(this.dateDataToDate(d));
284
- return DateTime.now().diff(m, 'years').years;
285
- }
286
- /**
287
- * Convert minutes from midnight to HH:mm text
288
- * @param minutes
289
- */
290
- static getHMFromMins(minutes) {
291
- if (minutes >= 24 * 60 || minutes < 0) {
292
- throw new RangeError('Valid input should be greater than or equal to 0 and less than 1440.');
293
- }
294
- const h = minutes / 60 | 0, m = minutes % 60 | 0;
295
- return DateTime.utc().set({ hour: h, minute: m }).toFormat('HH:mm');
296
- }
297
- static getMinutesSinceMidnight(d) {
298
- const dt = DateTime.fromJSDate(this.dateDataToDate(d));
299
- const midnight = dt.startOf('day');
300
- return dt.diff(midnight, 'minutes').minutes;
301
- }
302
- static getMinutesBetween(start, end) {
303
- const m = DateTime.fromJSDate(this.dateDataToDate(start));
304
- const m2 = DateTime.fromJSDate(this.dateDataToDate(end));
305
- return m2.diff(m, 'minutes').minutes;
306
- }
307
- }
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZUZ1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2RhdGVGdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUVyRCxNQUFNLE9BQU8sUUFBUTtJQUNwQjs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQTBCO1FBQy9DLElBQUksRUFBRSxZQUFZLElBQUksRUFBQyxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxDQUFDO1FBQ1gsQ0FBQztRQUVELElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO2dCQUNiLE1BQU0sSUFBSSxVQUFVLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBRUQsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQUMsQ0FBQztZQUMzQixNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUN2QixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFFRCxPQUFPLEVBQUUsQ0FBQztRQUNYLENBQUM7UUFFRCxNQUFNLElBQUksU0FBUyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMs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QUFDLENBQUMsT0FBTyxDQUFDO0lBQ3RDLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVUaW1lLCBEdXJhdGlvbiwgU2V0dGluZ3MgfSBmcm9tICdsdXhvbic7XHJcblxyXG5leHBvcnQgY2xhc3MgRGF0ZUZ1bmMge1xyXG5cdC8qKlxyXG5cdCAqIEF0IHJ1bnRpbWUsIHRoZXJlJ3Mgbm8gc2ltcGxlIGd1YXJhbnRlZSB0aGF0IHRoZSBpbnB1dCBpcyBEYXRlLiBTb21ldGltZXMgeW91IGNvZGVzIGV4cGVjdCBkYXRlLCBidXQgdGhlIHJlc3BvbnNlIGZyb20gdGhlIFdlYiBzZXJ2aWNlIG1heSBnaXZlIHlvdSBzdHJpbmcgb3IgbnVtYmVyLlxyXG5cdCAqIFRoaXMgZnVuY3Rpb24gZ2l2ZSB5b3Ugc2FmZSBwYXJzZSBvZiBkYXRlIGRhdGEgZnJvbSBJL08sIG5vdCBvZiB5b3VyIGNvbnRyb2wuXHJcblx0ICogSWYgdGhlIGRhdGEgaXMgaW52YWxpZCwgdGhyb3dzIFJhbmdlRXJyb3Igb3IgVHlwZUVycm9yLlxyXG5cdCAqIEBwYXJhbSBkdCBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgZGF0ZURhdGFUb0RhdGUoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRpZiAoZHQgaW5zdGFuY2VvZiBEYXRlKXtcclxuXHRcdFx0cmV0dXJuIGR0O1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0eXBlb2YgZHQgPT09ICdzdHJpbmcnKXtcclxuXHRcdFx0Y29uc3QgciA9IERhdGUucGFyc2UoZHQpO1xyXG5cdFx0XHRpZiAoaXNOYU4ocikpe1xyXG5cdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0cmluZyBmb3IgRGF0ZScpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbmV3IERhdGUocik7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBkdCA9PT0gJ251bWJlcicpe1xyXG5cdFx0XHRjb25zdCByZCA9IG5ldyBEYXRlKGR0KVxyXG5cdFx0XHRpZiAoTnVtYmVyLmlzTmFOKHJkLnZhbHVlT2YoKSkpe1xyXG5cdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIG51bWJlciBmb3IgRGF0ZScpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gcmQ7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0IERhdGUsIHN0cmluZyBvciBudW1iZXInKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNpbWlsYXIgdG8gZGF0ZURhdGFUb0RhdGUsIGJ1dCBhbGxvdyBudWxsIGFuZCBkZWZpbmVkIHNlbWFudGljYWxseS5cclxuXHQgKiBAcGFyYW0gZHQgXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0c3RhdGljIGRhdGVEYXRhVG9EYXRlT3JOdWxsKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCkgOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcblx0XHRpZiAoZHQgaW5zdGFuY2VvZiBEYXRlKXtcclxuXHRcdFx0cmV0dXJuIGR0O1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0eXBlb2YgZHQgPT09ICdzdHJpbmcnKXtcclxuXHRcdFx0Y29uc3QgciA9IERhdGUucGFyc2UoZHQpO1xyXG5cdFx0XHRpZiAoaXNOYU4ocikpe1xyXG5cdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0cmluZyBmb3IgRGF0ZScpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbmV3IERhdGUocik7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBkdCA9PT0gJ251bWJlcicpe1xyXG5cdFx0XHRjb25zdCByZCA9IG5ldyBEYXRlKGR0KVxyXG5cdFx0XHRpZiAoTnVtYmVyLmlzTmFOKHJkLnZhbHVlT2YoKSkpe1xyXG5cdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIG51bWJlciBmb3IgRGF0ZScpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gcmQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGR0ID09IG51bGwpeyBcclxuXHRcdFx0cmV0dXJuIGR0O1xyXG5cdFx0fVxyXG5cclxuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdCBEYXRlLCBzdHJpbmcgb3IgbnVtYmVyJyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2Zvcm0gVVRDIERhdGVUaW1lIHRvIGxvY2FsIGRhdGUgd2l0aG91dCBILCBNIGFuZCBTLiBGb3IgZXhhbXBsZSwgdGhlIG1vbnRoIGRheSBvZiAyMDE4LTAxLTIzVDIyOjAwOjAwWiBpcyAyNCBpbiBBdXN0cmFsaWEuXHJcblx0ICogQHBhcmFtIGR0VXRjXHJcblx0ICovXHJcblx0c3RhdGljIGRhdGVUaW1lVXRjVG9Mb2NhbERhdGVOdW1iZXIoZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcblx0XHRpZiAoZHRVdGMgPT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm4gZHRVdGM7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbG9jYWxEdCA9IHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpO1xyXG5cdFx0Y29uc3QgbG9jYWxETnVtID0gbG9jYWxEdC5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuXHJcblx0XHRyZXR1cm4gbG9jYWxETnVtO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGF0ZSBvbmx5LiBIb3dldmVyLCB0aGUgZGF0ZSBtYXkgc3RpbGwgYmUgaW4gVVRDLlxyXG5cdCAqIEBwYXJhbSBkdFV0Y1xyXG5cdCAqIEByZXR1cm5zIG5ldyBEYXRlIG9iamVjdC5cclxuXHQgKi9cclxuXHRzdGF0aWMgZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZShkdFV0YzogRGF0ZSB8IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcblx0XHRpZiAoZHRVdGMgPT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm4gZHRVdGM7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbG9jYWxEdCA9IHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpO1xyXG5cdFx0Y29uc3QgbG9jYWxOdW0gPSBsb2NhbER0LnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG5cdFx0cmV0dXJuIG5ldyBEYXRlKGxvY2FsTnVtKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqICcyMDE4LTAxLTIzVDIyOjAwOjAwWicgd2lsbCBiZWNvbWUgJzIwMTgtMDEtMjQnIGluIEF1c3RyYWxpYS5cclxuXHQgKiBAcGFyYW0gZHRVdGMgXHJcblx0ICogQHJldHVybnMgIG5ldyBEYXRlIG9iamVjdC5cclxuXHQgKi9cclxuXHRzdGF0aWMgbG9jYWxJU09EYXRlU3RyaW5nKGR0VXRjOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1x0XHRcclxuXHQgICAgY29uc3QgZHQgPSB0aGlzLmRhdGVUaW1lVXRjVG9Mb2NhbERhdGUoZHRVdGMpO1xyXG5cdFx0aWYgKGR0ID09IG51bGwpIHtcclxuXHRcdFx0cmV0dXJuIGR0O1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGQ9IERhdGVUaW1lLmZyb21KU0RhdGUoZHQpO1xyXG5cdFx0cmV0dXJuIGQudG9JU09EYXRlKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBsb2NhbCBkYXRlIE9OTFkgKG5vIHRpbWUpIHRvIFVUQyBkYXRlLlxyXG5cdCAqIFRoZSBpbnB1dCBjb3VsZCBiZSBhIHN0cmluZyBvZiB5eXl5LU1NLWRkLCBvciBhIERhdGUgT2JqZWN0LlxyXG5cdCAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVcclxuXHQgKiBXaGlsZSB0aGUgdGltZSB2YWx1ZSBhdCB0aGUgaGVhcnQgb2YgYSBEYXRlIG9iamVjdCBpcyBVVEMsIHRoZSBiYXNpYyBtZXRob2RzIHRvIGZldGNoIHRoZSBkYXRlIGFuZCB0aW1lIFxyXG5cdCAqIG9yIGl0cyBjb21wb25lbnRzIGFsbCB3b3JrIGluIHRoZSBsb2NhbCAoaS5lLiBob3N0IHN5c3RlbSkgdGltZSB6b25lIGFuZCBvZmZzZXQuXHJcblx0ICogQHBhcmFtIGR0IGlmIGR0IGNvbnRhaW4gdGltZSBpbmZvLCBpdCB3aWxsIGJlY29tZSBkdC5zZXRIb3VycygwLCAwLCAwLCAwKVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBsb2NhbERhdGVUb1V0YyhkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZyk6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkIHtcclxuXHRcdGlmIChkID09IG51bGwpIHtcclxuXHRcdFx0cmV0dXJuIGQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZHQgPSB0aGlzLmRhdGVEYXRhVG9EYXRlKGQpO1xyXG5cdFx0Y29uc3QgbiA9IGR0LnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG5cdFx0Y29uc3Qgb2Zmc2V0ID0gZHQuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwO1xyXG5cdFx0cmV0dXJuIG5ldyBEYXRlKG4gKyBvZmZzZXQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEVuZE9mV2VlayhkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikgOiBEYXRlIHtcclxuXHRcdGNvbnN0IGRhdGVUaW1lID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0KSk7XHJcblx0XHRyZXR1cm4gZGF0ZVRpbWUuZW5kT2YoJ3dlZWsnKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFN0YXJ0T2ZXZWVrKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSA6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5zdGFydE9mKCd3ZWVrJykudG9KU0RhdGUoKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRFbmRPZk1vbnRoKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSA6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5lbmRPZignbW9udGgnKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFN0YXJ0T2ZNb250aChkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikgOiBEYXRlIHtcclxuXHRcdGNvbnN0IGRhdGVUaW1lID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0KSk7XHJcblx0XHRyZXR1cm4gZGF0ZVRpbWUuc3RhcnRPZignbW9udGgnKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEVuZE9mRGF0ZShkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcik6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5lbmRPZignZGF5JykudG9KU0RhdGUoKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRTdGFydE9mRGF0ZShkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcik6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5zdGFydE9mKCdkYXknKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEVuZE9mVG9kYXkoKTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQge1xyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RW5kT2ZEYXRlKERhdGUubm93KCkpO1xyXG5cclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRTdGFydE9mVG9kYXkoKTogRGF0ZSB7XHJcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGFydE9mRGF0ZShEYXRlLm5vdygpKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXREYXlzQmV0d2VlbihkMTogRGF0ZSB8IHN0cmluZyB8IG51bWJlciwgZDI6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0Y29uc3QgZG0xID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQxKSk7XHJcblx0XHRjb25zdCBkbTIgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZDEpKTtcclxuXHRcdHJldHVybiBkbTIuZGlmZihkbTEsICdkYXlzJykuZGF5cztcclxuXHR9XHJcblxyXG5cdC8vaW5zcGlyZWQgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTYzNDA2L2FkZC1kYXlzLXRvLWphdmFzY3JpcHQtZGF0ZVxyXG5cdHN0YXRpYyBhZGREYXlzKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBkYXlzOiBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdGNvbnN0IHIgPSBkYXQucGx1cyh7ZGF5czogZGF5c30pO1xyXG5cdFx0cmV0dXJuIHIudG9KU0RhdGUoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0IG9mIHRvZGF5XHJcblx0ICovXHJcblx0c3RhdGljIGdldCB0b2RheSgpOiBEYXRlIHtcclxuXHRcdHJldHVybiB0aGlzLmdldFN0YXJ0T2ZUb2RheSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldCBub3coKTogRGF0ZSB7XHJcblx0XHRyZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcm9tIG5vdywgbmV4dCA1IG1pbnV0ZSBtYXJrLiBGb3IgZXhhbXBsZSAyOjIzOjQ0IHdpbGwgYmUgMjoyNTowMDtcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0TmV4dDVNaW51dGVNYXJrKCk6IERhdGUge1xyXG5cdFx0Y29uc3QgbSA9IERhdGVUaW1lLm5vdygpLnNldCh7c2Vjb25kOiAwLCBtaWxsaXNlY29uZDowfSk7XHJcblx0XHRjb25zdCBtaW51dGUgPSBtLm1pbnV0ZTtcclxuXHRcdGNvbnN0IG1vZCA9IG1pbnV0ZSAlIDU7XHJcblx0XHRpZiAobW9kKSB7XHJcblx0XHRcdGNvbnN0IGRlbHRhID0gNSAtIG1vZDtcclxuXHRcdFx0cmV0dXJuIG0ucGx1cyh7bWludXRlczogZGVsdGF9KS50b0pTRGF0ZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtLnRvSlNEYXRlKCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0WU1EKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBkdC50b0Zvcm1hdCgneXl5eU1NZGQnKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRETVlXaXRoU2xhc2goZDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikge1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0cmV0dXJuIGR0LnRvRm9ybWF0KCdkZC9NTS95eXl5Jyk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RE1ZSG1XaXRoU2xhc2goZDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikge1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0cmV0dXJuIGR0LnRvRm9ybWF0KCdkZC9NTS95eXl5IEhIOm1tJyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gZHRVdGMgSW4gMjQgaG91ciBmb3JtYXQsIGFuZCB0aGUgZGF0ZSBzZXBhcmF0b3IgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0gb3IgTHV4b24gZGVmYXVsdCBsb2NhbGVcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0RGF0ZVRpbWUyNFNpbXBsZShkdFV0YzogRGF0ZSB8IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkdFV0YyA9PSBudWxsKSB7XHJcblx0XHRcdHJldHVybiBkdFV0YztcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Y29uc3QgZCA9IHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpO1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKGQpO1xyXG5cdFx0cmV0dXJuIGR0LnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfU0hPUlQpICsgJyAnICsgZHQudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuVElNRV8yNF9TSU1QTEUpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHNldERlZmF1bHRMb2NhbGUobG9jYWxlOiBzdHJpbmcpe1xyXG5cdFx0U2V0dGluZ3MuZGVmYXVsdExvY2FsZT1sb2NhbGU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RGVmYXVsdExvY2FsZSgpe1xyXG5cdFx0cmV0dXJuIFNldHRpbmdzLmRlZmF1bHRMb2NhbGU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgc2V0RGVmYXVsdFpvbmUoem9uZTogc3RyaW5nKXtcclxuXHRcdFNldHRpbmdzLmRlZmF1bHRab25lPXpvbmU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RGVmYXVsdFpvbmUoKSA6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gU2V0dGluZ3MuZGVmYXVsdFpvbmUubmFtZTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBpc1pvbmVWYWxpZCgpOiBib29sZWFue1xyXG5cdFx0cmV0dXJuIFNldHRpbmdzLmRlZmF1bHRab25lLmlzVmFsaWQ7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGb3IgZXhhbXBsZSwgaW4gQUVTVCwgaXQgaXMgLTYwMC5cclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0TG9jYWxUaW1lem9uZU9mZnNldCgpOiBudW1iZXIge1xyXG5cdFx0Y29uc3QgZHQgPSBuZXcgRGF0ZShEYXRlLm5vdygpKTtcclxuXHRcdHJldHVybiBkdC5nZXRUaW1lem9uZU9mZnNldCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0IGhvdXIgb2YgdGhlIGRhdGUuIElmIERhdGUgaXMgbm90IGRlZmluZWQsIHRoZSBob3VyIHdpbGwgYmUgY3VycmVudCBob3VyLlxyXG5cdCAqIEBwYXJhbSBkdFV0Y1xyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRIb3VyKGR0VXRjOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0VXRjKSk7XHJcblx0XHRyZXR1cm4gZHQuaG91cjtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRNaW51dGUoZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpKTtcclxuXHRcdHJldHVybiBkdC5taW51dGU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgR2V0SE0oZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpOiB7aDogbnVtYmVyLCBtOiBudW1iZXJ9e1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpKTtcclxuXHRcdHJldHVybiB7aDogZHQuaG91ciwgbTogZHQubWludXRlfTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBjb21wb3NlRGF0ZVRpbWUoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsIGg6IG51bWJlciA9IDAsIG1pbnV0ZTogbnVtYmVyID0gMCwgc2Vjb25kOiBudW1iZXIgPSAwKTogRGF0ZSB7XHJcblx0XHRyZXR1cm4gbmV3IERhdGUoIHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpLnNldEhvdXJzKGgsIG1pbnV0ZSwgc2Vjb25kLCAwKSk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgb2xkZXJUaGFuMjRIb3VycyhkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XHJcblx0XHRjb25zdCBtID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBEYXRlVGltZS5ub3coKS5kaWZmKG0sICdob3VycycpID49IER1cmF0aW9uLmZyb21JU08oJ1BUMjRIJyk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgb2xkZXJUaGFuSG91cnMoZDogRGF0ZSB8IHN0cmluZyB8IG51bWJlciwgaG91cnM6IG51bWJlcikgOiBib29sZWFuIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0Y29uc3QgZGlmZiA9IERhdGVUaW1lLm5vdygpLmRpZmYobSwgJ2hvdXJzJyk7IFxyXG5cdFx0Y29uc3QgZHVyYXRpb24gPSBEdXJhdGlvbi5mcm9tSVNPKGBQVCR7aG91cnN9SGApO1xyXG5cdFx0Y29uc29sZS5kZWJ1ZygnZGlmZjogJyArIGRpZmYuaG91cnMgKyAnICAgZHVyYXRpb246ICcgKyBkdXJhdGlvbi5ob3Vycyk7XHJcblx0XHRyZXR1cm4gZGlmZi5ob3VycyA+PSBkdXJhdGlvbi5ob3VycztcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBvbGRlclRoYW5NaW51dGVzKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsIG1pbnV0ZXM6IG51bWJlcikge1xyXG5cdFx0Y29uc3QgbSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkKSk7XHJcblx0XHRyZXR1cm4gRGF0ZVRpbWUubm93KCkuZGlmZihtLCAnbWludXRlcycpID49IER1cmF0aW9uLmZyb21NaWxsaXMobWludXRlcyo2MCoxMDAwKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IGNvdWxkIGJlIDExUE0geWVzdGVyZGF5LCBhbmQgMSBBTSB0b2RheS4gQWN0dWFsbHkgYmFzZWQgb24gbG9jYWwgdG9kYXkuXHJcblx0ICovXHJcblx0c3RhdGljIG9sZGVyVGhhbjFEYXkoZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBEYXRlRnVuYy5nZXREYXlBZ2UoZHRVdGMpID4gMDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRIb3VyQWdlKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0cmV0dXJuIERhdGVUaW1lLm5vdygpLmRpZmYobSwgJ2hvdXJzJykuaG91cnM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wYXJlIGRhdGUgd2l0aCBub3cuXHJcblx0ICogQHBhcmFtIGR0VXRjXHJcblx0ICovXHJcblx0c3RhdGljIGdldERheUFnZShkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XHJcblx0XHRjb25zdCBtID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBEYXRlVGltZS5ub3coKS5kaWZmKG0sICdkYXlzJykuZGF5cztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhvdyBtYW55IHllYXJzIGZyb20gbm93LlxyXG5cdCAqIEBwYXJhbSBkXHJcblx0ICogQHJldHVybnNcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0QWdlKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0cmV0dXJuIERhdGVUaW1lLm5vdygpLmRpZmYobSwgJ3llYXJzJykueWVhcnM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0IG1pbnV0ZXMgZnJvbSBtaWRuaWdodCB0byBISDptbSB0ZXh0XHJcblx0ICogQHBhcmFtIG1pbnV0ZXNcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0SE1Gcm9tTWlucyhtaW51dGVzOiBudW1iZXIpOiBzdHJpbmcge1xyXG5cdFx0aWYgKG1pbnV0ZXMgPj0gMjQgKiA2MCB8fCBtaW51dGVzIDwgMCkge1xyXG5cdFx0XHR0aHJvdyBuZXcgUmFuZ2VFcnJvcignVmFsaWQgaW5wdXQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIGFuZCBsZXNzIHRoYW4gMTQ0MC4nKTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGggPSBtaW51dGVzIC8gNjAgfCAwLFxyXG5cdFx0XHRtID0gbWludXRlcyAlIDYwIHwgMDtcclxuXHRcdHJldHVybiBEYXRlVGltZS51dGMoKS5zZXQoe2hvdXI6IGgsIG1pbnV0ZTogbX0pLnRvRm9ybWF0KCdISDptbScpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldE1pbnV0ZXNTaW5jZU1pZG5pZ2h0KGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdGNvbnN0IG1pZG5pZ2h0ID0gZHQuc3RhcnRPZignZGF5Jyk7XHJcblx0XHRyZXR1cm4gZHQuZGlmZihtaWRuaWdodCwgJ21pbnV0ZXMnKS5taW51dGVzO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldE1pbnV0ZXNCZXR3ZWVuKHN0YXJ0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBlbmQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoc3RhcnQpKTtcclxuXHRcdGNvbnN0IG0yID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGVuZCkpO1xyXG5cdFx0cmV0dXJuIG0yLmRpZmYobSwgJ21pbnV0ZXMnKS5taW51dGVzO1xyXG5cdH1cclxufVxyXG5cclxuIl19
@@ -1,45 +0,0 @@
1
- export class HtmlPrintFunc {
2
- /**
3
- * Print with CSS for internal reports
4
- * @param htmlTags
5
- * @param cssUrl
6
- */
7
- static printWithCSS(htmlTags, cssUrl) {
8
- if (window) {
9
- const htmlToPrint = `<html><head>
10
- <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
11
- <link rel="stylesheet" type="text/css" href="${cssUrl}" media="screen,print"/>
12
- </head><body onload="window.print()">${htmlTags}</body></html>`;
13
- const popup = window.open('', '_blank', 'width=1024,height=768');
14
- popup?.document.open();
15
- popup?.document.write(htmlToPrint);
16
- popup?.document.close();
17
- }
18
- return true;
19
- }
20
- /**
21
- * Print for external documents.
22
- * @param htmlTags
23
- */
24
- static print(htmlTags) {
25
- if (window) {
26
- const htmlToPrint = `<html><head>
27
- <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
28
- </head><body onload="window.print()">${htmlTags}</body></html>`;
29
- const popup = window.open('', '_blank', 'width=1024,height=768');
30
- popup?.document.open();
31
- popup?.document.write(htmlToPrint);
32
- popup?.document.close();
33
- }
34
- return true;
35
- }
36
- /**
37
- * Print image url through html img.
38
- * @param url
39
- */
40
- static printImage(url) {
41
- const imageTags = `<img src="${url}" alt="Image from URL"/>`;
42
- HtmlPrintFunc.print(imageTags);
43
- }
44
- }
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbFByaW50RnVuYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25tY2UtZnVuYy9zcmMvX2Z1bmMvaHRtbFByaW50RnVuYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sYUFBYTtJQUN6Qjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFnQixFQUFFLE1BQWM7UUFDbkQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sV0FBVyxHQUFHOzsrQ0FFd0IsTUFBTTt1Q0FDZCxRQUFRLGdCQUFnQixDQUFDO1lBRTdELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1lBQ2pFLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFbkMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFnQjtRQUM1QixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxXQUFXLEdBQUc7O3VDQUVnQixRQUFRLGdCQUFnQixDQUFDO1lBRTdELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1lBQ2pFLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFbkMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFXO1FBQzVCLE1BQU0sU0FBUyxHQUFHLGFBQWEsR0FBRywwQkFBMEIsQ0FBQztRQUM3RCxhQUFhLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBIdG1sUHJpbnRGdW5jIHtcclxuXHQvKipcclxuXHQgKiBQcmludCB3aXRoIENTUyBmb3IgaW50ZXJuYWwgcmVwb3J0c1xyXG5cdCAqIEBwYXJhbSBodG1sVGFnc1xyXG5cdCAqIEBwYXJhbSBjc3NVcmxcclxuXHQgKi9cclxuXHRzdGF0aWMgcHJpbnRXaXRoQ1NTKGh0bWxUYWdzOiBzdHJpbmcsIGNzc1VybDogc3RyaW5nKSB7XHJcblx0XHRpZiAod2luZG93KSB7XHJcblx0XHRcdGNvbnN0IGh0bWxUb1ByaW50ID0gYDxodG1sPjxoZWFkPlxyXG48bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEsIHNocmluay10by1maXQ9bm9cIi8+XHJcbjxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBocmVmPVwiJHtjc3NVcmx9XCIgbWVkaWE9XCJzY3JlZW4scHJpbnRcIi8+XHJcbjwvaGVhZD48Ym9keSBvbmxvYWQ9XCJ3aW5kb3cucHJpbnQoKVwiPiR7aHRtbFRhZ3N9PC9ib2R5PjwvaHRtbD5gO1xyXG5cclxuXHRcdFx0Y29uc3QgcG9wdXAgPSB3aW5kb3cub3BlbignJywgJ19ibGFuaycsICd3aWR0aD0xMDI0LGhlaWdodD03NjgnKTtcclxuXHRcdFx0cG9wdXA/LmRvY3VtZW50Lm9wZW4oKTtcclxuXHRcdFx0cG9wdXA/LmRvY3VtZW50LndyaXRlKGh0bWxUb1ByaW50KTtcclxuXHJcblx0XHRcdHBvcHVwPy5kb2N1bWVudC5jbG9zZSgpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcmludCBmb3IgZXh0ZXJuYWwgZG9jdW1lbnRzLlxyXG5cdCAqIEBwYXJhbSBodG1sVGFnc1xyXG5cdCAqL1xyXG5cdHN0YXRpYyBwcmludChodG1sVGFnczogc3RyaW5nKSB7XHJcblx0XHRpZiAod2luZG93KSB7XHJcblx0XHRcdGNvbnN0IGh0bWxUb1ByaW50ID0gYDxodG1sPjxoZWFkPlxyXG48bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEsIHNocmluay10by1maXQ9bm9cIi8+XHJcbjwvaGVhZD48Ym9keSBvbmxvYWQ9XCJ3aW5kb3cucHJpbnQoKVwiPiR7aHRtbFRhZ3N9PC9ib2R5PjwvaHRtbD5gO1xyXG5cclxuXHRcdFx0Y29uc3QgcG9wdXAgPSB3aW5kb3cub3BlbignJywgJ19ibGFuaycsICd3aWR0aD0xMDI0LGhlaWdodD03NjgnKTtcclxuXHRcdFx0cG9wdXA/LmRvY3VtZW50Lm9wZW4oKTtcclxuXHRcdFx0cG9wdXA/LmRvY3VtZW50LndyaXRlKGh0bWxUb1ByaW50KTtcclxuXHJcblx0XHRcdHBvcHVwPy5kb2N1bWVudC5jbG9zZSgpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcmludCBpbWFnZSB1cmwgdGhyb3VnaCBodG1sIGltZy5cclxuXHQgKiBAcGFyYW0gdXJsIFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBwcmludEltYWdlKHVybDogc3RyaW5nKSB7XHJcblx0XHRjb25zdCBpbWFnZVRhZ3MgPSBgPGltZyBzcmM9XCIke3VybH1cIiBhbHQ9XCJJbWFnZSBmcm9tIFVSTFwiLz5gO1xyXG5cdFx0SHRtbFByaW50RnVuYy5wcmludChpbWFnZVRhZ3MpO1xyXG5cdH1cclxufVxyXG4iXX0=
@@ -1,10 +0,0 @@
1
- export * from './addressFunc';
2
- export * from './currencyFunc';
3
- export * from './dateFunc';
4
- export * from './htmlPrintFunc';
5
- export * from './javascriptFunc';
6
- export * from './jsonFunc';
7
- export * from './stringAusFunc';
8
- export * from './stringFunc';
9
- export * from './uuidFunc';
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FkZHJlc3NGdW5jJztcclxuZXhwb3J0ICogZnJvbSAnLi9jdXJyZW5jeUZ1bmMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2RhdGVGdW5jJztcclxuZXhwb3J0ICogZnJvbSAnLi9odG1sUHJpbnRGdW5jJztcclxuZXhwb3J0ICogZnJvbSAnLi9qYXZhc2NyaXB0RnVuYyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vanNvbkZ1bmMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3N0cmluZ0F1c0Z1bmMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3N0cmluZ0Z1bmMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V1aWRGdW5jJztcclxuXHJcblxyXG4iXX0=
@@ -1,21 +0,0 @@
1
- export class JavaScriptFunc {
2
- /**
3
- * Some business functions depend on external JavaScript libraries. Lazy loading of respective business modules is good,
4
- * and this function supports lazy loading of JS libraries.
5
- * @param scriptUrl
6
- * @param type things like module.
7
- * @returns Promise for subsequent JS function calls.
8
- */
9
- static loadExternalScript(scriptUrl, type) {
10
- return new Promise((resolve, reject) => {
11
- const scriptElement = document.createElement('script');
12
- if (type) {
13
- scriptElement.type = type;
14
- }
15
- scriptElement.src = scriptUrl;
16
- scriptElement.onload = resolve;
17
- document.body.appendChild(scriptElement);
18
- });
19
- }
20
- }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdEZ1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2phdmFzY3JpcHRGdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxjQUFjO0lBQzFCOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFpQixFQUFFLElBQWE7UUFDekQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN0QyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZELElBQUksSUFBSSxFQUFDLENBQUM7Z0JBQ1QsYUFBYSxDQUFDLElBQUksR0FBQyxJQUFJLENBQUM7WUFDekIsQ0FBQztZQUVELGFBQWEsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDO1lBQzlCLGFBQWEsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBQy9CLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEphdmFTY3JpcHRGdW5jIHtcclxuXHQvKipcclxuXHQgKiBTb21lIGJ1c2luZXNzIGZ1bmN0aW9ucyBkZXBlbmQgb24gZXh0ZXJuYWwgSmF2YVNjcmlwdCBsaWJyYXJpZXMuIExhenkgbG9hZGluZyBvZiByZXNwZWN0aXZlIGJ1c2luZXNzIG1vZHVsZXMgaXMgZ29vZCwgXHJcblx0ICogYW5kIHRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgbGF6eSBsb2FkaW5nIG9mIEpTIGxpYnJhcmllcy5cclxuXHQgKiBAcGFyYW0gc2NyaXB0VXJsIFxyXG5cdCAqIEBwYXJhbSB0eXBlIHRoaW5ncyBsaWtlIG1vZHVsZS5cclxuXHQgKiBAcmV0dXJucyBQcm9taXNlIGZvciBzdWJzZXF1ZW50IEpTIGZ1bmN0aW9uIGNhbGxzLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBsb2FkRXh0ZXJuYWxTY3JpcHQoc2NyaXB0VXJsOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpIHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHRcdGNvbnN0IHNjcmlwdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuXHRcdFx0aWYgKHR5cGUpe1xyXG5cdFx0XHRcdHNjcmlwdEVsZW1lbnQudHlwZT10eXBlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzY3JpcHRFbGVtZW50LnNyYyA9IHNjcmlwdFVybDtcclxuXHRcdFx0c2NyaXB0RWxlbWVudC5vbmxvYWQgPSByZXNvbHZlO1xyXG5cdFx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcbiJdfQ==
@@ -1,69 +0,0 @@
1
- import { DateFunc } from './dateFunc';
2
- /**
3
- * Basic JSON functions
4
- */
5
- export class JsonFunc {
6
- /**
7
- *
8
- * @param array Group by a property of array element.
9
- * @param propertyName
10
- * @returns
11
- */
12
- static groupBy(array, propertyName) {
13
- return array.reduce(function (acc, obj) {
14
- const key = obj[propertyName];
15
- if (!acc[key]) {
16
- acc[key] = [];
17
- }
18
- acc[key].push(obj);
19
- return acc;
20
- }, {});
21
- }
22
- /**
23
- * Group by a date property. The key is always of string type and representing milliseconds.
24
- * The client should convert the string to number.
25
- * Angular date pipe could actually consume such string without explicitly converting to number.
26
- * @param array
27
- * @param propertyName
28
- */
29
- static groupByDate(array, propertyName) {
30
- return array.reduce(function (acc, obj) {
31
- const key = DateFunc.dateTimeUtcToLocalDateNumber(obj[propertyName]);
32
- if (key != null) {
33
- if (!acc[key]) {
34
- acc[key] = [];
35
- }
36
- acc[key].push(obj);
37
- }
38
- return acc;
39
- }, {});
40
- }
41
- /**
42
- * Remove null or empty fields including those in nested objects.
43
- * This is useful for reducing payload of AJAX serialization.
44
- * @param obj
45
- */
46
- static removeNullOrEmptyFields(obj) {
47
- for (const f in obj) {
48
- let p = obj[f];
49
- if (p === null || p === '') {
50
- delete obj[f];
51
- }
52
- else if (typeof p === 'object' && p !== null) {
53
- this.removeNullOrEmptyFields(p);
54
- }
55
- }
56
- }
57
- /**
58
- *
59
- * @param obj Remove null fields of object at only the 1st level.
60
- */
61
- static removeNullFields(obj) {
62
- for (const f in obj) {
63
- if (obj[f] === null) {
64
- delete obj[f];
65
- }
66
- }
67
- }
68
- }
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkZ1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2pzb25GdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQUNwQjs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUksS0FBZSxFQUFFLFlBQW9CO1FBQ3RELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQVEsRUFBRSxHQUFRO1lBQy9DLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNmLENBQUM7WUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLE9BQU8sR0FBRyxDQUFDO1FBQ1osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxXQUFXLENBQUksS0FBZSxFQUFFLFlBQW9CO1FBQzFELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQVEsRUFBRSxHQUFRO1lBQy9DLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNyRSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNmLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2YsQ0FBQztnQkFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLENBQUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNaLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEdBQVE7UUFDdEMsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUM1QixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNmLENBQUM7aUJBQU0sSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNGLENBQUM7SUFDRixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQVE7UUFDL0IsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixDQUFDO1FBQ0YsQ0FBQztJQUNGLENBQUM7Q0FFRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVGdW5jIH0gZnJvbSAnLi9kYXRlRnVuYyc7XHJcblxyXG4vKipcclxuICogQmFzaWMgSlNPTiBmdW5jdGlvbnNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBKc29uRnVuYyB7XHJcblx0LyoqXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGFycmF5IEdyb3VwIGJ5IGEgcHJvcGVydHkgb2YgYXJyYXkgZWxlbWVudC5cclxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBncm91cEJ5PFQ+KGFycmF5OiBBcnJheTxUPiwgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcclxuXHRcdHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKGFjYzogYW55LCBvYmo6IGFueSkge1xyXG5cdFx0XHRjb25zdCBrZXkgPSBvYmpbcHJvcGVydHlOYW1lXTtcclxuXHRcdFx0aWYgKCFhY2Nba2V5XSkge1xyXG5cdFx0XHRcdGFjY1trZXldID0gW107XHJcblx0XHRcdH1cclxuXHRcdFx0YWNjW2tleV0ucHVzaChvYmopO1xyXG5cdFx0XHRyZXR1cm4gYWNjO1xyXG5cdFx0fSwge30pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR3JvdXAgYnkgYSBkYXRlIHByb3BlcnR5LiBUaGUga2V5IGlzIGFsd2F5cyBvZiBzdHJpbmcgdHlwZSBhbmQgcmVwcmVzZW50aW5nIG1pbGxpc2Vjb25kcy4gXHJcblx0ICogVGhlIGNsaWVudCBzaG91bGQgY29udmVydCB0aGUgc3RyaW5nIHRvIG51bWJlci5cclxuXHQgKiBBbmd1bGFyIGRhdGUgcGlwZSBjb3VsZCBhY3R1YWxseSBjb25zdW1lIHN1Y2ggc3RyaW5nIHdpdGhvdXQgZXhwbGljaXRseSBjb252ZXJ0aW5nIHRvIG51bWJlci5cclxuXHQgKiBAcGFyYW0gYXJyYXlcclxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lXHJcblx0ICovXHJcblx0c3RhdGljIGdyb3VwQnlEYXRlPFQ+KGFycmF5OiBBcnJheTxUPiwgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcclxuXHRcdHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKGFjYzogYW55LCBvYmo6IGFueSkge1xyXG5cdFx0XHRjb25zdCBrZXkgPSBEYXRlRnVuYy5kYXRlVGltZVV0Y1RvTG9jYWxEYXRlTnVtYmVyKG9ialtwcm9wZXJ0eU5hbWVdKTtcclxuXHRcdFx0aWYgKGtleSAhPSBudWxsKSB7XHJcblx0XHRcdFx0aWYgKCFhY2Nba2V5XSkge1xyXG5cdFx0XHRcdFx0YWNjW2tleV0gPSBbXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YWNjW2tleV0ucHVzaChvYmopO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBhY2M7XHJcblx0XHR9LCB7fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmUgbnVsbCBvciBlbXB0eSBmaWVsZHMgaW5jbHVkaW5nIHRob3NlIGluIG5lc3RlZCBvYmplY3RzLlxyXG5cdCAqIFRoaXMgaXMgdXNlZnVsIGZvciByZWR1Y2luZyBwYXlsb2FkIG9mIEFKQVggc2VyaWFsaXphdGlvbi5cclxuXHQgKiBAcGFyYW0gb2JqIFxyXG5cdCAqL1xyXG5cdHN0YXRpYyByZW1vdmVOdWxsT3JFbXB0eUZpZWxkcyhvYmo6IGFueSkge1xyXG5cdFx0Zm9yIChjb25zdCBmIGluIG9iaikge1xyXG5cdFx0XHRsZXQgcCA9IG9ialtmXTtcclxuXHRcdFx0aWYgKHAgPT09IG51bGwgfHwgcCA9PT0gJycpIHtcclxuXHRcdFx0XHRkZWxldGUgb2JqW2ZdO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwID09PSAnb2JqZWN0JyAmJiBwICE9PSBudWxsKSB7XHJcblx0XHRcdFx0dGhpcy5yZW1vdmVOdWxsT3JFbXB0eUZpZWxkcyhwKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHJcblx0ICogQHBhcmFtIG9iaiBSZW1vdmUgbnVsbCBmaWVsZHMgb2Ygb2JqZWN0IGF0IG9ubHkgdGhlIDFzdCBsZXZlbC5cclxuXHQgKi9cclxuXHRzdGF0aWMgcmVtb3ZlTnVsbEZpZWxkcyhvYmo6IGFueSkge1xyXG5cdFx0Zm9yIChjb25zdCBmIGluIG9iaikge1xyXG5cdFx0XHRpZiAob2JqW2ZdID09PSBudWxsKSB7XHJcblx0XHRcdFx0ZGVsZXRlIG9ialtmXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcbn1cclxuIl19