ms-time-sheet 0.0.10 → 0.0.13

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.
@@ -2,14 +2,338 @@ import { Pipe } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  export class FilterPipe {
4
4
  transform(items, searchText, key) {
5
- if (!items || !searchText)
5
+ if (!items || !searchText || searchText.trim() === '')
6
6
  return items;
7
- searchText = searchText.toLowerCase();
7
+ const searchTerms = searchText.toLowerCase().trim().split(/\s+/);
8
8
  return items.filter(item => {
9
- const value = key ? item?.[key] : item;
10
- return value?.toString().toLowerCase().includes(searchText);
9
+ return searchTerms.every(term => this.matchesSearchTerm(item, term, key));
11
10
  });
12
11
  }
12
+ matchesSearchTerm(item, searchTerm, key) {
13
+ if (!item)
14
+ return false;
15
+ // If key is specified, search only in that property
16
+ if (key) {
17
+ const value = this.getNestedValue(item, key);
18
+ return this.valueMatchesTerm(value, searchTerm);
19
+ }
20
+ // Otherwise, search in all properties recursively
21
+ return this.searchInObject(item, searchTerm);
22
+ }
23
+ getNestedValue(obj, path) {
24
+ return path.split('.').reduce((current, key) => current?.[key], obj);
25
+ }
26
+ searchInObject(obj, searchTerm) {
27
+ if (!obj)
28
+ return false;
29
+ // Handle different data types
30
+ if (typeof obj === 'string') {
31
+ // Try to parse as date/time first
32
+ const parsedDate = this.tryParseDate(obj);
33
+ if (parsedDate) {
34
+ return this.dateMatchesTerm(parsedDate, searchTerm);
35
+ }
36
+ return this.stringMatchesTerm(obj, searchTerm);
37
+ }
38
+ if (typeof obj === 'number') {
39
+ return obj.toString().includes(searchTerm) || this.isNumericMatch(obj, searchTerm);
40
+ }
41
+ if (obj instanceof Date) {
42
+ return this.dateMatchesTerm(obj, searchTerm);
43
+ }
44
+ if (Array.isArray(obj)) {
45
+ return obj.some(item => this.searchInObject(item, searchTerm));
46
+ }
47
+ if (typeof obj === 'object') {
48
+ // Deep search in object properties
49
+ for (const key in obj) {
50
+ if (obj.hasOwnProperty(key)) {
51
+ const value = obj[key];
52
+ if (this.searchInObject(value, searchTerm)) {
53
+ return true;
54
+ }
55
+ // Also check property names for matches
56
+ if (this.stringMatchesTerm(key, searchTerm)) {
57
+ return true;
58
+ }
59
+ }
60
+ }
61
+ }
62
+ return false;
63
+ }
64
+ valueMatchesTerm(value, searchTerm) {
65
+ if (value == null)
66
+ return false;
67
+ if (typeof value === 'string') {
68
+ return this.stringMatchesTerm(value, searchTerm);
69
+ }
70
+ if (typeof value === 'number') {
71
+ return value.toString().includes(searchTerm) || this.isNumericMatch(value, searchTerm);
72
+ }
73
+ if (value instanceof Date) {
74
+ return this.dateMatchesTerm(value, searchTerm);
75
+ }
76
+ if (Array.isArray(value)) {
77
+ return value.some(item => this.valueMatchesTerm(item, searchTerm));
78
+ }
79
+ if (typeof value === 'object') {
80
+ return this.searchInObject(value, searchTerm);
81
+ }
82
+ return value.toString().toLowerCase().includes(searchTerm);
83
+ }
84
+ stringMatchesTerm(str, searchTerm) {
85
+ const lowerStr = str.toLowerCase();
86
+ // Exact match
87
+ if (lowerStr.includes(searchTerm))
88
+ return true;
89
+ // Fuzzy match - check if all characters of searchTerm appear in order
90
+ if (this.fuzzyMatch(lowerStr, searchTerm))
91
+ return true;
92
+ // Levenshtein distance for better fuzzy matching
93
+ if (this.levenshteinDistance(lowerStr, searchTerm) <= Math.max(1, Math.floor(searchTerm.length * 0.3)))
94
+ return true;
95
+ // Check for common typos and variations
96
+ if (this.checkCommonVariations(lowerStr, searchTerm))
97
+ return true;
98
+ // Check for partial word matches
99
+ if (this.partialWordMatch(lowerStr, searchTerm))
100
+ return true;
101
+ return false;
102
+ }
103
+ fuzzyMatch(text, pattern) {
104
+ let patternIndex = 0;
105
+ for (let i = 0; i < text.length && patternIndex < pattern.length; i++) {
106
+ if (text[i] === pattern[patternIndex]) {
107
+ patternIndex++;
108
+ }
109
+ }
110
+ return patternIndex === pattern.length;
111
+ }
112
+ levenshteinDistance(str1, str2) {
113
+ const matrix = [];
114
+ for (let i = 0; i <= str2.length; i++) {
115
+ matrix[i] = [i];
116
+ }
117
+ for (let j = 0; j <= str1.length; j++) {
118
+ matrix[0][j] = j;
119
+ }
120
+ for (let i = 1; i <= str2.length; i++) {
121
+ for (let j = 1; j <= str1.length; j++) {
122
+ if (str2.charAt(i - 1) === str1.charAt(j - 1)) {
123
+ matrix[i][j] = matrix[i - 1][j - 1];
124
+ }
125
+ else {
126
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
127
+ matrix[i][j - 1] + 1, // insertion
128
+ matrix[i - 1][j] + 1 // deletion
129
+ );
130
+ }
131
+ }
132
+ }
133
+ return matrix[str2.length][str1.length];
134
+ }
135
+ partialWordMatch(text, searchTerm) {
136
+ const words = text.split(/\s+/);
137
+ return words.some(word => {
138
+ // Check if search term is contained in any word
139
+ if (word.toLowerCase().includes(searchTerm))
140
+ return true;
141
+ // Check if word starts with search term
142
+ if (word.toLowerCase().startsWith(searchTerm))
143
+ return true;
144
+ // Check if search term is an abbreviation or partial match
145
+ if (searchTerm.length >= 2 && word.toLowerCase().includes(searchTerm))
146
+ return true;
147
+ return false;
148
+ });
149
+ }
150
+ tryParseDate(str) {
151
+ // Try various date formats
152
+ const datePatterns = [
153
+ /^\d{4}-\d{2}-\d{2}$/, // yyyy-MM-dd
154
+ /^\d{2}\/\d{2}\/\d{4}$/, // dd/MM/yyyy or MM/dd/yyyy
155
+ /^\d{2}-\d{2}-\d{4}$/, // dd-MM-yyyy or MM-dd-yyyy
156
+ /^\d{4}\/\d{2}\/\d{2}$/, // yyyy/MM/dd
157
+ /^\d{2}\/\d{2}\/\d{2}$/, // dd/MM/yy or MM/dd/yy
158
+ /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/, // ISO with time
159
+ /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/, // yyyy-MM-dd HH:mm:ss
160
+ /^\d{2}\/\d{2}\/\d{4} \d{2}:\d{2}/, // dd/MM/yyyy HH:mm
161
+ /^\d{2}:\d{2}:\d{2}$/, // HH:mm:ss
162
+ /^\d{2}:\d{2}$/, // HH:mm
163
+ /^\d{1,2}:\d{2} (AM|PM|am|pm)$/, // h:mm a
164
+ ];
165
+ // Check if string matches any date pattern
166
+ if (datePatterns.some(pattern => pattern.test(str))) {
167
+ const parsed = new Date(str);
168
+ if (!isNaN(parsed.getTime())) {
169
+ return parsed;
170
+ }
171
+ }
172
+ // Try parsing with more flexible approach
173
+ const flexibleParse = new Date(str);
174
+ if (!isNaN(flexibleParse.getTime())) {
175
+ return flexibleParse;
176
+ }
177
+ return null;
178
+ }
179
+ checkCommonVariations(text, searchTerm) {
180
+ // Handle common spelling variations
181
+ const variations = this.generateVariations(searchTerm);
182
+ return variations.some(variation => text.includes(variation));
183
+ }
184
+ generateVariations(term) {
185
+ const variations = [term];
186
+ // Common letter substitutions
187
+ const substitutions = {
188
+ 'a': ['e', 'i', 'o'],
189
+ 'e': ['a', 'i', 'o'],
190
+ 'i': ['a', 'e', 'o'],
191
+ 'o': ['a', 'e', 'i'],
192
+ 'u': ['oo'],
193
+ 'c': ['k', 's'],
194
+ 'k': ['c', 'q', 'ck'],
195
+ 's': ['c', 'z'],
196
+ 'z': ['s'],
197
+ 'ph': ['f'],
198
+ 'f': ['ph'],
199
+ 'ck': ['k'],
200
+ 'qu': ['kw'],
201
+ 'x': ['ks'],
202
+ 'y': ['i'],
203
+ 'ie': ['ei'],
204
+ 'ei': ['ie']
205
+ };
206
+ // Generate variations by substituting common letters
207
+ for (const [original, subs] of Object.entries(substitutions)) {
208
+ if (term.includes(original)) {
209
+ subs.forEach(sub => {
210
+ variations.push(term.replace(original, sub));
211
+ });
212
+ }
213
+ }
214
+ return variations;
215
+ }
216
+ isNumericMatch(num, searchTerm) {
217
+ // Check if search term is a number or contains numbers
218
+ const numStr = num.toString();
219
+ if (numStr.includes(searchTerm))
220
+ return true;
221
+ // Check for approximate matches (e.g., "10" matches "10.5")
222
+ const searchNum = parseFloat(searchTerm);
223
+ if (!isNaN(searchNum)) {
224
+ return Math.abs(num - searchNum) < 0.01; // Allow small floating point differences
225
+ }
226
+ return false;
227
+ }
228
+ dateMatchesTerm(date, searchTerm) {
229
+ // Format date in various common formats and check for matches
230
+ const formats = [
231
+ 'dd/MM/yyyy',
232
+ 'MM/dd/yyyy',
233
+ 'yyyy-MM-dd',
234
+ 'dd-MM-yyyy',
235
+ 'MM-dd-yyyy',
236
+ 'dd MMM yyyy',
237
+ 'MMM dd yyyy',
238
+ 'yyyy/MM/dd',
239
+ 'dd/MM/yy',
240
+ 'MM/dd/yy',
241
+ 'yyyy-MM-ddTHH:mm:ss',
242
+ 'yyyy-MM-dd HH:mm:ss',
243
+ 'dd/MM/yyyy HH:mm',
244
+ 'MM/dd/yyyy HH:mm',
245
+ 'HH:mm:ss',
246
+ 'HH:mm',
247
+ 'h:mm a',
248
+ 'h:mm:ss a'
249
+ ];
250
+ const formattedDates = formats.map(format => this.formatDate(date, format));
251
+ if (formattedDates.some(d => d.toLowerCase().includes(searchTerm)))
252
+ return true;
253
+ // Check month names
254
+ const monthNames = [
255
+ 'january', 'february', 'march', 'april', 'may', 'june',
256
+ 'july', 'august', 'september', 'october', 'november', 'december',
257
+ 'jan', 'feb', 'mar', 'apr', 'may', 'jun',
258
+ 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'
259
+ ];
260
+ const monthIndex = date.getMonth();
261
+ if (monthNames.some(month => month.includes(searchTerm) || searchTerm.includes(month))) {
262
+ return true;
263
+ }
264
+ // Check day names
265
+ const dayNames = [
266
+ 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday',
267
+ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'
268
+ ];
269
+ const dayIndex = date.getDay();
270
+ if (dayNames.some(day => day.includes(searchTerm) || searchTerm.includes(day))) {
271
+ return true;
272
+ }
273
+ // Check year
274
+ const year = date.getFullYear().toString();
275
+ if (year.includes(searchTerm) || searchTerm.includes(year))
276
+ return true;
277
+ // Check for relative date terms
278
+ const now = new Date();
279
+ const diffTime = now.getTime() - date.getTime();
280
+ const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));
281
+ if (searchTerm.includes('today') && diffDays === 0)
282
+ return true;
283
+ if (searchTerm.includes('yesterday') && diffDays === 1)
284
+ return true;
285
+ if (searchTerm.includes('tomorrow') && diffDays === -1)
286
+ return true;
287
+ // Check for time ranges
288
+ const hours = date.getHours();
289
+ const minutes = date.getMinutes();
290
+ if (searchTerm.includes('morning') && hours >= 6 && hours < 12)
291
+ return true;
292
+ if (searchTerm.includes('afternoon') && hours >= 12 && hours < 17)
293
+ return true;
294
+ if (searchTerm.includes('evening') && hours >= 17 && hours < 21)
295
+ return true;
296
+ if (searchTerm.includes('night') && (hours >= 21 || hours < 6))
297
+ return true;
298
+ return false;
299
+ }
300
+ formatDate(date, format) {
301
+ const day = date.getDate().toString().padStart(2, '0');
302
+ const month = (date.getMonth() + 1).toString().padStart(2, '0');
303
+ const year = date.getFullYear().toString();
304
+ const shortYear = year.slice(-2);
305
+ const monthNames = [
306
+ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
307
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
308
+ ];
309
+ const monthName = monthNames[date.getMonth()];
310
+ const hours24 = date.getHours().toString().padStart(2, '0');
311
+ const hours12 = (date.getHours() % 12 || 12).toString();
312
+ const minutes = date.getMinutes().toString().padStart(2, '0');
313
+ const seconds = date.getSeconds().toString().padStart(2, '0');
314
+ const ampm = date.getHours() >= 12 ? 'PM' : 'AM';
315
+ switch (format) {
316
+ case 'dd/MM/yyyy': return `${day}/${month}/${year}`;
317
+ case 'MM/dd/yyyy': return `${month}/${day}/${year}`;
318
+ case 'yyyy-MM-dd': return `${year}-${month}-${day}`;
319
+ case 'dd-MM-yyyy': return `${day}-${month}-${year}`;
320
+ case 'MM-dd-yyyy': return `${month}-${day}-${year}`;
321
+ case 'dd MMM yyyy': return `${day} ${monthName} ${year}`;
322
+ case 'MMM dd yyyy': return `${monthName} ${day} ${year}`;
323
+ case 'yyyy/MM/dd': return `${year}/${month}/${day}`;
324
+ case 'dd/MM/yy': return `${day}/${month}/${shortYear}`;
325
+ case 'MM/dd/yy': return `${month}/${day}/${shortYear}`;
326
+ case 'yyyy-MM-ddTHH:mm:ss': return `${year}-${month}-${day}T${hours24}:${minutes}:${seconds}`;
327
+ case 'yyyy-MM-dd HH:mm:ss': return `${year}-${month}-${day} ${hours24}:${minutes}:${seconds}`;
328
+ case 'dd/MM/yyyy HH:mm': return `${day}/${month}/${year} ${hours24}:${minutes}`;
329
+ case 'MM/dd/yyyy HH:mm': return `${month}/${day}/${year} ${hours24}:${minutes}`;
330
+ case 'HH:mm:ss': return `${hours24}:${minutes}:${seconds}`;
331
+ case 'HH:mm': return `${hours24}:${minutes}`;
332
+ case 'h:mm a': return `${hours12}:${minutes} ${ampm}`;
333
+ case 'h:mm:ss a': return `${hours12}:${minutes}:${seconds} ${ampm}`;
334
+ default: return date.toLocaleDateString();
335
+ }
336
+ }
13
337
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FilterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
14
338
  static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: FilterPipe, isStandalone: true, name: "filter" }); }
15
339
  }
@@ -20,4 +344,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
20
344
  standalone: true
21
345
  }]
22
346
  }] });
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tcy10aW1lLXNoZWV0L3NyYy9saWIvcGlwZXMvZmlsdGVyLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBTXBELE1BQU0sT0FBTyxVQUFVO0lBQ3ZCLFNBQVMsQ0FBQyxLQUFZLEVBQUUsVUFBa0IsRUFBRyxHQUFZO1FBQ3ZELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFeEMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV4QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkIsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3ZDLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBVlksVUFBVTs2R0FBVixVQUFVOzs0RkFBVixVQUFVO2tCQUp0QixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxRQUFRO29CQUNkLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBQaXBlKHtcclxuICBuYW1lOiAnZmlsdGVyJyxcclxuICBzdGFuZGFsb25lOiB0cnVlXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbnRyYW5zZm9ybShpdGVtczogYW55W10sIHNlYXJjaFRleHQ6IHN0cmluZywgIGtleT86IHN0cmluZyk6IGFueVtdIHtcclxuICBpZiAoIWl0ZW1zIHx8ICFzZWFyY2hUZXh0KSByZXR1cm4gaXRlbXM7XHJcblxyXG4gIHNlYXJjaFRleHQgPSBzZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCk7XHJcblxyXG5yZXR1cm4gaXRlbXMuZmlsdGVyKGl0ZW0gPT4ge1xyXG4gICAgY29uc3QgdmFsdWUgPSBrZXkgPyBpdGVtPy5ba2V5XSA6IGl0ZW07XHJcbiAgICByZXR1cm4gdmFsdWU/LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KTtcclxuICB9KTtcclxufX1cclxuIl19
347
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tcy10aW1lLXNoZWV0L3NyYy9saWIvcGlwZXMvZmlsdGVyLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBTXBELE1BQU0sT0FBTyxVQUFVO0lBRXJCLFNBQVMsQ0FBQyxLQUFZLEVBQUUsVUFBa0IsRUFBRSxHQUFZO1FBQ3RELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUVwRSxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpFLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN6QixPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGlCQUFpQixDQUFDLElBQVMsRUFBRSxVQUFrQixFQUFFLEdBQVk7UUFDbkUsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUV4QixvREFBb0Q7UUFDcEQsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzdDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBRUQsa0RBQWtEO1FBQ2xELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVPLGNBQWMsQ0FBQyxHQUFRLEVBQUUsSUFBWTtRQUMzQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVPLGNBQWMsQ0FBQyxHQUFRLEVBQUUsVUFBa0I7UUFDakQsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUV2Qiw4QkFBOEI7UUFDOUIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM1QixrQ0FBa0M7WUFDbEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM1QixPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUVELElBQUksR0FBRyxZQUFZLElBQUksRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUIsbUNBQW1DO1lBQ25DLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUM1QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3ZCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQzt3QkFDM0MsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCx3Q0FBd0M7b0JBQ3hDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDO3dCQUM1QyxPQUFPLElBQUksQ0FBQztvQkFDZCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEtBQVUsRUFBRSxVQUFrQjtRQUNyRCxJQUFJLEtBQUssSUFBSSxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFaEMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3pGLENBQUM7UUFFRCxJQUFJLEtBQUssWUFBWSxJQUFJLEVBQUUsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxHQUFXLEVBQUUsVUFBa0I7UUFDdkQsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRW5DLGNBQWM7UUFDZCxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFL0Msc0VBQXNFO1FBQ3RFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFdkQsaURBQWlEO1FBQ2pELElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVwSCx3Q0FBd0M7UUFDeEMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRWxFLGlDQUFpQztRQUNqQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFN0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sVUFBVSxDQUFDLElBQVksRUFBRSxPQUFlO1FBQzlDLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxZQUFZLEVBQUUsQ0FBQztZQUNqQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sWUFBWSxLQUFLLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDekMsQ0FBQztJQUVPLG1CQUFtQixDQUFDLElBQVksRUFBRSxJQUFZO1FBQ3BELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUM5QyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDckIsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLGVBQWU7b0JBQ3pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFNLFlBQVk7b0JBQ3RDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFNLFdBQVc7cUJBQ3RDLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBWSxFQUFFLFVBQWtCO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLGdEQUFnRDtZQUNoRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBRXpELHdDQUF3QztZQUN4QyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBRTNELDJEQUEyRDtZQUMzRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBRW5GLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sWUFBWSxDQUFDLEdBQVc7UUFDOUIsMkJBQTJCO1FBQzNCLE1BQU0sWUFBWSxHQUFHO1lBQ25CLHFCQUFxQixFQUFFLGFBQWE7WUFDcEMsdUJBQXVCLEVBQUUsMkJBQTJCO1lBQ3BELHFCQUFxQixFQUFFLDJCQUEyQjtZQUNsRCx1QkFBdUIsRUFBRSxhQUFhO1lBQ3RDLHVCQUF1QixFQUFFLHVCQUF1QjtZQUNoRCxzQ0FBc0MsRUFBRSxnQkFBZ0I7WUFDeEQsc0NBQXNDLEVBQUUsc0JBQXNCO1lBQzlELGtDQUFrQyxFQUFFLG1CQUFtQjtZQUN2RCxxQkFBcUIsRUFBRSxXQUFXO1lBQ2xDLGVBQWUsRUFBRSxRQUFRO1lBQ3pCLCtCQUErQixFQUFFLFNBQVM7U0FDM0MsQ0FBQztRQUVGLDJDQUEyQztRQUMzQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO1FBRUQsMENBQTBDO1FBQzFDLE1BQU0sYUFBYSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNwQyxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8scUJBQXFCLENBQUMsSUFBWSxFQUFFLFVBQWtCO1FBQzVELG9DQUFvQztRQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkQsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxJQUFZO1FBQ3JDLE1BQU0sVUFBVSxHQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEMsOEJBQThCO1FBQzlCLE1BQU0sYUFBYSxHQUFnQztZQUNqRCxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUNwQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUNwQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUNwQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUNwQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDWCxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQ2YsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUM7WUFDckIsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUNmLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUNWLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUNYLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNYLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUNYLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztZQUNaLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNYLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUNWLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztZQUNaLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztTQUNiLENBQUM7UUFFRixxREFBcUQ7UUFDckQsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUM3RCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDakIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxHQUFXLEVBQUUsVUFBa0I7UUFDcEQsdURBQXVEO1FBQ3ZELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFN0MsNERBQTREO1FBQzVELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyx5Q0FBeUM7UUFDcEYsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLGVBQWUsQ0FBQyxJQUFVLEVBQUUsVUFBa0I7UUFDcEQsOERBQThEO1FBQzlELE1BQU0sT0FBTyxHQUFHO1lBQ2QsWUFBWTtZQUNaLFlBQVk7WUFDWixZQUFZO1lBQ1osWUFBWTtZQUNaLFlBQVk7WUFDWixhQUFhO1lBQ2IsYUFBYTtZQUNiLFlBQVk7WUFDWixVQUFVO1lBQ1YsVUFBVTtZQUNWLHFCQUFxQjtZQUNyQixxQkFBcUI7WUFDckIsa0JBQWtCO1lBQ2xCLGtCQUFrQjtZQUNsQixVQUFVO1lBQ1YsT0FBTztZQUNQLFFBQVE7WUFDUixXQUFXO1NBQ1osQ0FBQztRQUVGLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVoRixvQkFBb0I7UUFDcEIsTUFBTSxVQUFVLEdBQUc7WUFDakIsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNO1lBQ3RELE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVTtZQUNoRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7WUFDeEMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLO1NBQ3pDLENBQUM7UUFFRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2RixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxrQkFBa0I7UUFDbEIsTUFBTSxRQUFRLEdBQUc7WUFDZixRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVO1lBQzVFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7U0FDaEQsQ0FBQztRQUVGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMvQixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9FLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELGFBQWE7UUFDYixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0MsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFeEUsZ0NBQWdDO1FBQ2hDLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFOUQsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEUsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDcEUsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVwRSx3QkFBd0I7UUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzVFLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxJQUFJLEtBQUssR0FBRyxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDL0UsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM3RSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUU1RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxVQUFVLENBQUMsSUFBVSxFQUFFLE1BQWM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdkQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSztZQUN4QyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7U0FDekMsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUU5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1RCxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFakQsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNmLEtBQUssWUFBWSxDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDcEQsS0FBSyxZQUFZLENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNwRCxLQUFLLFlBQVksQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3BELEtBQUssWUFBWSxDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDcEQsS0FBSyxZQUFZLENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNwRCxLQUFLLGFBQWEsQ0FBQyxDQUFDLE9BQU8sR0FBRyxHQUFHLElBQUksU0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3pELEtBQUssYUFBYSxDQUFDLENBQUMsT0FBTyxHQUFHLFNBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDekQsS0FBSyxZQUFZLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNwRCxLQUFLLFVBQVUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxHQUFHLElBQUksS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3ZELEtBQUssVUFBVSxDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDdkQsS0FBSyxxQkFBcUIsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzlGLEtBQUsscUJBQXFCLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM5RixLQUFLLGtCQUFrQixDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNoRixLQUFLLGtCQUFrQixDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNoRixLQUFLLFVBQVUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksT0FBTyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzNELEtBQUssT0FBTyxDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3QyxLQUFLLFFBQVEsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3RELEtBQUssV0FBVyxDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3BFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUMsQ0FBQztJQUNILENBQUM7K0dBclhVLFVBQVU7NkdBQVYsVUFBVTs7NEZBQVYsVUFBVTtrQkFKdEIsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsUUFBUTtvQkFDZCxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AUGlwZSh7XHJcbiAgbmFtZTogJ2ZpbHRlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsdGVyUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG5cclxuICB0cmFuc2Zvcm0oaXRlbXM6IGFueVtdLCBzZWFyY2hUZXh0OiBzdHJpbmcsIGtleT86IHN0cmluZyk6IGFueVtdIHtcclxuICAgIGlmICghaXRlbXMgfHwgIXNlYXJjaFRleHQgfHwgc2VhcmNoVGV4dC50cmltKCkgPT09ICcnKSByZXR1cm4gaXRlbXM7XHJcblxyXG4gICAgY29uc3Qgc2VhcmNoVGVybXMgPSBzZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcclxuICAgICAgcmV0dXJuIHNlYXJjaFRlcm1zLmV2ZXJ5KHRlcm0gPT4gdGhpcy5tYXRjaGVzU2VhcmNoVGVybShpdGVtLCB0ZXJtLCBrZXkpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXRjaGVzU2VhcmNoVGVybShpdGVtOiBhbnksIHNlYXJjaFRlcm06IHN0cmluZywga2V5Pzogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBJZiBrZXkgaXMgc3BlY2lmaWVkLCBzZWFyY2ggb25seSBpbiB0aGF0IHByb3BlcnR5XHJcbiAgICBpZiAoa2V5KSB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXROZXN0ZWRWYWx1ZShpdGVtLCBrZXkpO1xyXG4gICAgICByZXR1cm4gdGhpcy52YWx1ZU1hdGNoZXNUZXJtKHZhbHVlLCBzZWFyY2hUZXJtKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBPdGhlcndpc2UsIHNlYXJjaCBpbiBhbGwgcHJvcGVydGllcyByZWN1cnNpdmVseVxyXG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoSW5PYmplY3QoaXRlbSwgc2VhcmNoVGVybSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5lc3RlZFZhbHVlKG9iajogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKGN1cnJlbnQsIGtleSkgPT4gY3VycmVudD8uW2tleV0sIG9iaik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlYXJjaEluT2JqZWN0KG9iajogYW55LCBzZWFyY2hUZXJtOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICghb2JqKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBkYXRhIHR5cGVzXHJcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgLy8gVHJ5IHRvIHBhcnNlIGFzIGRhdGUvdGltZSBmaXJzdFxyXG4gICAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy50cnlQYXJzZURhdGUob2JqKTtcclxuICAgICAgaWYgKHBhcnNlZERhdGUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRlTWF0Y2hlc1Rlcm0ocGFyc2VkRGF0ZSwgc2VhcmNoVGVybSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nTWF0Y2hlc1Rlcm0ob2JqLCBzZWFyY2hUZXJtKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicpIHtcclxuICAgICAgcmV0dXJuIG9iai50b1N0cmluZygpLmluY2x1ZGVzKHNlYXJjaFRlcm0pIHx8IHRoaXMuaXNOdW1lcmljTWF0Y2gob2JqLCBzZWFyY2hUZXJtKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5kYXRlTWF0Y2hlc1Rlcm0ob2JqLCBzZWFyY2hUZXJtKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XHJcbiAgICAgIHJldHVybiBvYmouc29tZShpdGVtID0+IHRoaXMuc2VhcmNoSW5PYmplY3QoaXRlbSwgc2VhcmNoVGVybSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAvLyBEZWVwIHNlYXJjaCBpbiBvYmplY3QgcHJvcGVydGllc1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcclxuICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbk9iamVjdCh2YWx1ZSwgc2VhcmNoVGVybSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBBbHNvIGNoZWNrIHByb3BlcnR5IG5hbWVzIGZvciBtYXRjaGVzXHJcbiAgICAgICAgICBpZiAodGhpcy5zdHJpbmdNYXRjaGVzVGVybShrZXksIHNlYXJjaFRlcm0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsdWVNYXRjaGVzVGVybSh2YWx1ZTogYW55LCBzZWFyY2hUZXJtOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nTWF0Y2hlc1Rlcm0odmFsdWUsIHNlYXJjaFRlcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpLmluY2x1ZGVzKHNlYXJjaFRlcm0pIHx8IHRoaXMuaXNOdW1lcmljTWF0Y2godmFsdWUsIHNlYXJjaFRlcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGF0ZU1hdGNoZXNUZXJtKHZhbHVlLCBzZWFyY2hUZXJtKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlLnNvbWUoaXRlbSA9PiB0aGlzLnZhbHVlTWF0Y2hlc1Rlcm0oaXRlbSwgc2VhcmNoVGVybSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNlYXJjaEluT2JqZWN0KHZhbHVlLCBzZWFyY2hUZXJtKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdHJpbmdNYXRjaGVzVGVybShzdHI6IHN0cmluZywgc2VhcmNoVGVybTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBsb3dlclN0ciA9IHN0ci50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIC8vIEV4YWN0IG1hdGNoXHJcbiAgICBpZiAobG93ZXJTdHIuaW5jbHVkZXMoc2VhcmNoVGVybSkpIHJldHVybiB0cnVlO1xyXG5cclxuICAgIC8vIEZ1enp5IG1hdGNoIC0gY2hlY2sgaWYgYWxsIGNoYXJhY3RlcnMgb2Ygc2VhcmNoVGVybSBhcHBlYXIgaW4gb3JkZXJcclxuICAgIGlmICh0aGlzLmZ1enp5TWF0Y2gobG93ZXJTdHIsIHNlYXJjaFRlcm0pKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyBMZXZlbnNodGVpbiBkaXN0YW5jZSBmb3IgYmV0dGVyIGZ1enp5IG1hdGNoaW5nXHJcbiAgICBpZiAodGhpcy5sZXZlbnNodGVpbkRpc3RhbmNlKGxvd2VyU3RyLCBzZWFyY2hUZXJtKSA8PSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHNlYXJjaFRlcm0ubGVuZ3RoICogMC4zKSkpIHJldHVybiB0cnVlO1xyXG5cclxuICAgIC8vIENoZWNrIGZvciBjb21tb24gdHlwb3MgYW5kIHZhcmlhdGlvbnNcclxuICAgIGlmICh0aGlzLmNoZWNrQ29tbW9uVmFyaWF0aW9ucyhsb3dlclN0ciwgc2VhcmNoVGVybSkpIHJldHVybiB0cnVlO1xyXG5cclxuICAgIC8vIENoZWNrIGZvciBwYXJ0aWFsIHdvcmQgbWF0Y2hlc1xyXG4gICAgaWYgKHRoaXMucGFydGlhbFdvcmRNYXRjaChsb3dlclN0ciwgc2VhcmNoVGVybSkpIHJldHVybiB0cnVlO1xyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZnV6enlNYXRjaCh0ZXh0OiBzdHJpbmcsIHBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHBhdHRlcm5JbmRleCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoICYmIHBhdHRlcm5JbmRleCA8IHBhdHRlcm4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRleHRbaV0gPT09IHBhdHRlcm5bcGF0dGVybkluZGV4XSkge1xyXG4gICAgICAgIHBhdHRlcm5JbmRleCsrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGF0dGVybkluZGV4ID09PSBwYXR0ZXJuLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbGV2ZW5zaHRlaW5EaXN0YW5jZShzdHIxOiBzdHJpbmcsIHN0cjI6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBtYXRyaXggPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHN0cjIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbWF0cml4W2ldID0gW2ldO1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPD0gc3RyMS5sZW5ndGg7IGorKykge1xyXG4gICAgICBtYXRyaXhbMF1bal0gPSBqO1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gc3RyMi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmb3IgKGxldCBqID0gMTsgaiA8PSBzdHIxLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaWYgKHN0cjIuY2hhckF0KGkgLSAxKSA9PT0gc3RyMS5jaGFyQXQoaiAtIDEpKSB7XHJcbiAgICAgICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbaSAtIDFdW2ogLSAxXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbWF0cml4W2ldW2pdID0gTWF0aC5taW4oXHJcbiAgICAgICAgICAgIG1hdHJpeFtpIC0gMV1baiAtIDFdICsgMSwgLy8gc3Vic3RpdHV0aW9uXHJcbiAgICAgICAgICAgIG1hdHJpeFtpXVtqIC0gMV0gKyAxLCAgICAgLy8gaW5zZXJ0aW9uXHJcbiAgICAgICAgICAgIG1hdHJpeFtpIC0gMV1bal0gKyAxICAgICAgLy8gZGVsZXRpb25cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWF0cml4W3N0cjIubGVuZ3RoXVtzdHIxLmxlbmd0aF07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhcnRpYWxXb3JkTWF0Y2godGV4dDogc3RyaW5nLCBzZWFyY2hUZXJtOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHdvcmRzID0gdGV4dC5zcGxpdCgvXFxzKy8pO1xyXG4gICAgcmV0dXJuIHdvcmRzLnNvbWUod29yZCA9PiB7XHJcbiAgICAgIC8vIENoZWNrIGlmIHNlYXJjaCB0ZXJtIGlzIGNvbnRhaW5lZCBpbiBhbnkgd29yZFxyXG4gICAgICBpZiAod29yZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0pKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIENoZWNrIGlmIHdvcmQgc3RhcnRzIHdpdGggc2VhcmNoIHRlcm1cclxuICAgICAgaWYgKHdvcmQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHNlYXJjaFRlcm0pKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIENoZWNrIGlmIHNlYXJjaCB0ZXJtIGlzIGFuIGFiYnJldmlhdGlvbiBvciBwYXJ0aWFsIG1hdGNoXHJcbiAgICAgIGlmIChzZWFyY2hUZXJtLmxlbmd0aCA+PSAyICYmIHdvcmQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXJtKSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJ5UGFyc2VEYXRlKHN0cjogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xyXG4gICAgLy8gVHJ5IHZhcmlvdXMgZGF0ZSBmb3JtYXRzXHJcbiAgICBjb25zdCBkYXRlUGF0dGVybnMgPSBbXHJcbiAgICAgIC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLywgLy8geXl5eS1NTS1kZFxyXG4gICAgICAvXlxcZHsyfVxcL1xcZHsyfVxcL1xcZHs0fSQvLCAvLyBkZC9NTS95eXl5IG9yIE1NL2RkL3l5eXlcclxuICAgICAgL15cXGR7Mn0tXFxkezJ9LVxcZHs0fSQvLCAvLyBkZC1NTS15eXl5IG9yIE1NLWRkLXl5eXlcclxuICAgICAgL15cXGR7NH1cXC9cXGR7Mn1cXC9cXGR7Mn0kLywgLy8geXl5eS9NTS9kZFxyXG4gICAgICAvXlxcZHsyfVxcL1xcZHsyfVxcL1xcZHsyfSQvLCAvLyBkZC9NTS95eSBvciBNTS9kZC95eVxyXG4gICAgICAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9LywgLy8gSVNPIHdpdGggdGltZVxyXG4gICAgICAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9IFxcZHsyfTpcXGR7Mn06XFxkezJ9LywgLy8geXl5eS1NTS1kZCBISDptbTpzc1xyXG4gICAgICAvXlxcZHsyfVxcL1xcZHsyfVxcL1xcZHs0fSBcXGR7Mn06XFxkezJ9LywgLy8gZGQvTU0veXl5eSBISDptbVxyXG4gICAgICAvXlxcZHsyfTpcXGR7Mn06XFxkezJ9JC8sIC8vIEhIOm1tOnNzXHJcbiAgICAgIC9eXFxkezJ9OlxcZHsyfSQvLCAvLyBISDptbVxyXG4gICAgICAvXlxcZHsxLDJ9OlxcZHsyfSAoQU18UE18YW18cG0pJC8sIC8vIGg6bW0gYVxyXG4gICAgXTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiBzdHJpbmcgbWF0Y2hlcyBhbnkgZGF0ZSBwYXR0ZXJuXHJcbiAgICBpZiAoZGF0ZVBhdHRlcm5zLnNvbWUocGF0dGVybiA9PiBwYXR0ZXJuLnRlc3Qoc3RyKSkpIHtcclxuICAgICAgY29uc3QgcGFyc2VkID0gbmV3IERhdGUoc3RyKTtcclxuICAgICAgaWYgKCFpc05hTihwYXJzZWQuZ2V0VGltZSgpKSkge1xyXG4gICAgICAgIHJldHVybiBwYXJzZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUcnkgcGFyc2luZyB3aXRoIG1vcmUgZmxleGlibGUgYXBwcm9hY2hcclxuICAgIGNvbnN0IGZsZXhpYmxlUGFyc2UgPSBuZXcgRGF0ZShzdHIpO1xyXG4gICAgaWYgKCFpc05hTihmbGV4aWJsZVBhcnNlLmdldFRpbWUoKSkpIHtcclxuICAgICAgcmV0dXJuIGZsZXhpYmxlUGFyc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrQ29tbW9uVmFyaWF0aW9ucyh0ZXh0OiBzdHJpbmcsIHNlYXJjaFRlcm06IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgLy8gSGFuZGxlIGNvbW1vbiBzcGVsbGluZyB2YXJpYXRpb25zXHJcbiAgICBjb25zdCB2YXJpYXRpb25zID0gdGhpcy5nZW5lcmF0ZVZhcmlhdGlvbnMoc2VhcmNoVGVybSk7XHJcbiAgICByZXR1cm4gdmFyaWF0aW9ucy5zb21lKHZhcmlhdGlvbiA9PiB0ZXh0LmluY2x1ZGVzKHZhcmlhdGlvbikpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZVZhcmlhdGlvbnModGVybTogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgdmFyaWF0aW9uczogc3RyaW5nW10gPSBbdGVybV07XHJcblxyXG4gICAgLy8gQ29tbW9uIGxldHRlciBzdWJzdGl0dXRpb25zXHJcbiAgICBjb25zdCBzdWJzdGl0dXRpb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7XHJcbiAgICAgICdhJzogWydlJywgJ2knLCAnbyddLFxyXG4gICAgICAnZSc6IFsnYScsICdpJywgJ28nXSxcclxuICAgICAgJ2knOiBbJ2EnLCAnZScsICdvJ10sXHJcbiAgICAgICdvJzogWydhJywgJ2UnLCAnaSddLFxyXG4gICAgICAndSc6IFsnb28nXSxcclxuICAgICAgJ2MnOiBbJ2snLCAncyddLFxyXG4gICAgICAnayc6IFsnYycsICdxJywgJ2NrJ10sXHJcbiAgICAgICdzJzogWydjJywgJ3onXSxcclxuICAgICAgJ3onOiBbJ3MnXSxcclxuICAgICAgJ3BoJzogWydmJ10sXHJcbiAgICAgICdmJzogWydwaCddLFxyXG4gICAgICAnY2snOiBbJ2snXSxcclxuICAgICAgJ3F1JzogWydrdyddLFxyXG4gICAgICAneCc6IFsna3MnXSxcclxuICAgICAgJ3knOiBbJ2knXSxcclxuICAgICAgJ2llJzogWydlaSddLFxyXG4gICAgICAnZWknOiBbJ2llJ11cclxuICAgIH07XHJcblxyXG4gICAgLy8gR2VuZXJhdGUgdmFyaWF0aW9ucyBieSBzdWJzdGl0dXRpbmcgY29tbW9uIGxldHRlcnNcclxuICAgIGZvciAoY29uc3QgW29yaWdpbmFsLCBzdWJzXSBvZiBPYmplY3QuZW50cmllcyhzdWJzdGl0dXRpb25zKSkge1xyXG4gICAgICBpZiAodGVybS5pbmNsdWRlcyhvcmlnaW5hbCkpIHtcclxuICAgICAgICBzdWJzLmZvckVhY2goc3ViID0+IHtcclxuICAgICAgICAgIHZhcmlhdGlvbnMucHVzaCh0ZXJtLnJlcGxhY2Uob3JpZ2luYWwsIHN1YikpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZhcmlhdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzTnVtZXJpY01hdGNoKG51bTogbnVtYmVyLCBzZWFyY2hUZXJtOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vIENoZWNrIGlmIHNlYXJjaCB0ZXJtIGlzIGEgbnVtYmVyIG9yIGNvbnRhaW5zIG51bWJlcnNcclxuICAgIGNvbnN0IG51bVN0ciA9IG51bS50b1N0cmluZygpO1xyXG4gICAgaWYgKG51bVN0ci5pbmNsdWRlcyhzZWFyY2hUZXJtKSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgLy8gQ2hlY2sgZm9yIGFwcHJveGltYXRlIG1hdGNoZXMgKGUuZy4sIFwiMTBcIiBtYXRjaGVzIFwiMTAuNVwiKVxyXG4gICAgY29uc3Qgc2VhcmNoTnVtID0gcGFyc2VGbG9hdChzZWFyY2hUZXJtKTtcclxuICAgIGlmICghaXNOYU4oc2VhcmNoTnVtKSkge1xyXG4gICAgICByZXR1cm4gTWF0aC5hYnMobnVtIC0gc2VhcmNoTnVtKSA8IDAuMDE7IC8vIEFsbG93IHNtYWxsIGZsb2F0aW5nIHBvaW50IGRpZmZlcmVuY2VzXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkYXRlTWF0Y2hlc1Rlcm0oZGF0ZTogRGF0ZSwgc2VhcmNoVGVybTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAvLyBGb3JtYXQgZGF0ZSBpbiB2YXJpb3VzIGNvbW1vbiBmb3JtYXRzIGFuZCBjaGVjayBmb3IgbWF0Y2hlc1xyXG4gICAgY29uc3QgZm9ybWF0cyA9IFtcclxuICAgICAgJ2RkL01NL3l5eXknLFxyXG4gICAgICAnTU0vZGQveXl5eScsXHJcbiAgICAgICd5eXl5LU1NLWRkJyxcclxuICAgICAgJ2RkLU1NLXl5eXknLFxyXG4gICAgICAnTU0tZGQteXl5eScsXHJcbiAgICAgICdkZCBNTU0geXl5eScsXHJcbiAgICAgICdNTU0gZGQgeXl5eScsXHJcbiAgICAgICd5eXl5L01NL2RkJyxcclxuICAgICAgJ2RkL01NL3l5JyxcclxuICAgICAgJ01NL2RkL3l5JyxcclxuICAgICAgJ3l5eXktTU0tZGRUSEg6bW06c3MnLFxyXG4gICAgICAneXl5eS1NTS1kZCBISDptbTpzcycsXHJcbiAgICAgICdkZC9NTS95eXl5IEhIOm1tJyxcclxuICAgICAgJ01NL2RkL3l5eXkgSEg6bW0nLFxyXG4gICAgICAnSEg6bW06c3MnLFxyXG4gICAgICAnSEg6bW0nLFxyXG4gICAgICAnaDptbSBhJyxcclxuICAgICAgJ2g6bW06c3MgYSdcclxuICAgIF07XHJcblxyXG4gICAgY29uc3QgZm9ybWF0dGVkRGF0ZXMgPSBmb3JtYXRzLm1hcChmb3JtYXQgPT4gdGhpcy5mb3JtYXREYXRlKGRhdGUsIGZvcm1hdCkpO1xyXG4gICAgaWYgKGZvcm1hdHRlZERhdGVzLnNvbWUoZCA9PiBkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybSkpKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyBDaGVjayBtb250aCBuYW1lc1xyXG4gICAgY29uc3QgbW9udGhOYW1lcyA9IFtcclxuICAgICAgJ2phbnVhcnknLCAnZmVicnVhcnknLCAnbWFyY2gnLCAnYXByaWwnLCAnbWF5JywgJ2p1bmUnLFxyXG4gICAgICAnanVseScsICdhdWd1c3QnLCAnc2VwdGVtYmVyJywgJ29jdG9iZXInLCAnbm92ZW1iZXInLCAnZGVjZW1iZXInLFxyXG4gICAgICAnamFuJywgJ2ZlYicsICdtYXInLCAnYXByJywgJ21heScsICdqdW4nLFxyXG4gICAgICAnanVsJywgJ2F1ZycsICdzZXAnLCAnb2N0JywgJ25vdicsICdkZWMnXHJcbiAgICBdO1xyXG5cclxuICAgIGNvbnN0IG1vbnRoSW5kZXggPSBkYXRlLmdldE1vbnRoKCk7XHJcbiAgICBpZiAobW9udGhOYW1lcy5zb21lKG1vbnRoID0+IG1vbnRoLmluY2x1ZGVzKHNlYXJjaFRlcm0pIHx8IHNlYXJjaFRlcm0uaW5jbHVkZXMobW9udGgpKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBkYXkgbmFtZXNcclxuICAgIGNvbnN0IGRheU5hbWVzID0gW1xyXG4gICAgICAnc3VuZGF5JywgJ21vbmRheScsICd0dWVzZGF5JywgJ3dlZG5lc2RheScsICd0aHVyc2RheScsICdmcmlkYXknLCAnc2F0dXJkYXknLFxyXG4gICAgICAnc3VuJywgJ21vbicsICd0dWUnLCAnd2VkJywgJ3RodScsICdmcmknLCAnc2F0J1xyXG4gICAgXTtcclxuXHJcbiAgICBjb25zdCBkYXlJbmRleCA9IGRhdGUuZ2V0RGF5KCk7XHJcbiAgICBpZiAoZGF5TmFtZXMuc29tZShkYXkgPT4gZGF5LmluY2x1ZGVzKHNlYXJjaFRlcm0pIHx8IHNlYXJjaFRlcm0uaW5jbHVkZXMoZGF5KSkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgeWVhclxyXG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpO1xyXG4gICAgaWYgKHllYXIuaW5jbHVkZXMoc2VhcmNoVGVybSkgfHwgc2VhcmNoVGVybS5pbmNsdWRlcyh5ZWFyKSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgLy8gQ2hlY2sgZm9yIHJlbGF0aXZlIGRhdGUgdGVybXNcclxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICBjb25zdCBkaWZmVGltZSA9IG5vdy5nZXRUaW1lKCkgLSBkYXRlLmdldFRpbWUoKTtcclxuICAgIGNvbnN0IGRpZmZEYXlzID0gTWF0aC5mbG9vcihkaWZmVGltZSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7XHJcblxyXG4gICAgaWYgKHNlYXJjaFRlcm0uaW5jbHVkZXMoJ3RvZGF5JykgJiYgZGlmZkRheXMgPT09IDApIHJldHVybiB0cnVlO1xyXG4gICAgaWYgKHNlYXJjaFRlcm0uaW5jbHVkZXMoJ3llc3RlcmRheScpICYmIGRpZmZEYXlzID09PSAxKSByZXR1cm4gdHJ1ZTtcclxuICAgIGlmIChzZWFyY2hUZXJtLmluY2x1ZGVzKCd0b21vcnJvdycpICYmIGRpZmZEYXlzID09PSAtMSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgLy8gQ2hlY2sgZm9yIHRpbWUgcmFuZ2VzXHJcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcclxuICAgIGNvbnN0IG1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKTtcclxuICAgIGlmIChzZWFyY2hUZXJtLmluY2x1ZGVzKCdtb3JuaW5nJykgJiYgaG91cnMgPj0gNiAmJiBob3VycyA8IDEyKSByZXR1cm4gdHJ1ZTtcclxuICAgIGlmIChzZWFyY2hUZXJtLmluY2x1ZGVzKCdhZnRlcm5vb24nKSAmJiBob3VycyA+PSAxMiAmJiBob3VycyA8IDE3KSByZXR1cm4gdHJ1ZTtcclxuICAgIGlmIChzZWFyY2hUZXJtLmluY2x1ZGVzKCdldmVuaW5nJykgJiYgaG91cnMgPj0gMTcgJiYgaG91cnMgPCAyMSkgcmV0dXJuIHRydWU7XHJcbiAgICBpZiAoc2VhcmNoVGVybS5pbmNsdWRlcygnbmlnaHQnKSAmJiAoaG91cnMgPj0gMjEgfHwgaG91cnMgPCA2KSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IG1vbnRoID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcclxuICAgIGNvbnN0IHNob3J0WWVhciA9IHllYXIuc2xpY2UoLTIpO1xyXG5cclxuICAgIGNvbnN0IG1vbnRoTmFtZXMgPSBbXHJcbiAgICAgICdKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsXHJcbiAgICAgICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYydcclxuICAgIF07XHJcblxyXG4gICAgY29uc3QgbW9udGhOYW1lID0gbW9udGhOYW1lc1tkYXRlLmdldE1vbnRoKCldO1xyXG5cclxuICAgIGNvbnN0IGhvdXJzMjQgPSBkYXRlLmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgY29uc3QgaG91cnMxMiA9IChkYXRlLmdldEhvdXJzKCkgJSAxMiB8fCAxMikudG9TdHJpbmcoKTtcclxuICAgIGNvbnN0IG1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICBjb25zdCBzZWNvbmRzID0gZGF0ZS5nZXRTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgY29uc3QgYW1wbSA9IGRhdGUuZ2V0SG91cnMoKSA+PSAxMiA/ICdQTScgOiAnQU0nO1xyXG5cclxuICAgIHN3aXRjaCAoZm9ybWF0KSB7XHJcbiAgICAgIGNhc2UgJ2RkL01NL3l5eXknOiByZXR1cm4gYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9YDtcclxuICAgICAgY2FzZSAnTU0vZGQveXl5eSc6IHJldHVybiBgJHttb250aH0vJHtkYXl9LyR7eWVhcn1gO1xyXG4gICAgICBjYXNlICd5eXl5LU1NLWRkJzogcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XHJcbiAgICAgIGNhc2UgJ2RkLU1NLXl5eXknOiByZXR1cm4gYCR7ZGF5fS0ke21vbnRofS0ke3llYXJ9YDtcclxuICAgICAgY2FzZSAnTU0tZGQteXl5eSc6IHJldHVybiBgJHttb250aH0tJHtkYXl9LSR7eWVhcn1gO1xyXG4gICAgICBjYXNlICdkZCBNTU0geXl5eSc6IHJldHVybiBgJHtkYXl9ICR7bW9udGhOYW1lfSAke3llYXJ9YDtcclxuICAgICAgY2FzZSAnTU1NIGRkIHl5eXknOiByZXR1cm4gYCR7bW9udGhOYW1lfSAke2RheX0gJHt5ZWFyfWA7XHJcbiAgICAgIGNhc2UgJ3l5eXkvTU0vZGQnOiByZXR1cm4gYCR7eWVhcn0vJHttb250aH0vJHtkYXl9YDtcclxuICAgICAgY2FzZSAnZGQvTU0veXknOiByZXR1cm4gYCR7ZGF5fS8ke21vbnRofS8ke3Nob3J0WWVhcn1gO1xyXG4gICAgICBjYXNlICdNTS9kZC95eSc6IHJldHVybiBgJHttb250aH0vJHtkYXl9LyR7c2hvcnRZZWFyfWA7XHJcbiAgICAgIGNhc2UgJ3l5eXktTU0tZGRUSEg6bW06c3MnOiByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9VCR7aG91cnMyNH06JHttaW51dGVzfToke3NlY29uZHN9YDtcclxuICAgICAgY2FzZSAneXl5eS1NTS1kZCBISDptbTpzcyc6IHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtob3VyczI0fToke21pbnV0ZXN9OiR7c2Vjb25kc31gO1xyXG4gICAgICBjYXNlICdkZC9NTS95eXl5IEhIOm1tJzogcmV0dXJuIGAke2RheX0vJHttb250aH0vJHt5ZWFyfSAke2hvdXJzMjR9OiR7bWludXRlc31gO1xyXG4gICAgICBjYXNlICdNTS9kZC95eXl5IEhIOm1tJzogcmV0dXJuIGAke21vbnRofS8ke2RheX0vJHt5ZWFyfSAke2hvdXJzMjR9OiR7bWludXRlc31gO1xyXG4gICAgICBjYXNlICdISDptbTpzcyc6IHJldHVybiBgJHtob3VyczI0fToke21pbnV0ZXN9OiR7c2Vjb25kc31gO1xyXG4gICAgICBjYXNlICdISDptbSc6IHJldHVybiBgJHtob3VyczI0fToke21pbnV0ZXN9YDtcclxuICAgICAgY2FzZSAnaDptbSBhJzogcmV0dXJuIGAke2hvdXJzMTJ9OiR7bWludXRlc30gJHthbXBtfWA7XHJcbiAgICAgIGNhc2UgJ2g6bW06c3MgYSc6IHJldHVybiBgJHtob3VyczEyfToke21pbnV0ZXN9OiR7c2Vjb25kc30gJHthbXBtfWA7XHJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,186 @@
1
+ import { Pipe } from '@angular/core';
2
+ import * as moment from 'moment-timezone';
3
+ import * as i0 from "@angular/core";
4
+ export class TimezoneFormatPipe {
5
+ constructor() {
6
+ this.formatCache = new Map();
7
+ }
8
+ transform(value, prefs, formatType = 'datetime') {
9
+ if (!value) {
10
+ return '';
11
+ }
12
+ const timeZone = prefs?.timeZone || 'America/New_York';
13
+ // Convert Angular DatePipe format to moment.js format for parsing
14
+ const dateFormat = this.convertAngularToMomentFormat(prefs?.dateFormat || 'MM/dd/yyyy');
15
+ const timeFormat = this.convertAngularToMomentFormat(prefs?.timeFormat || 'HH:mm');
16
+ // Detect if value is time-only (e.g. '09:00', '9:00', '09:00:00' format)
17
+ const isTimeOnly = /^\d{1,2}:\d{2}(:\d{2})?$/.test(String(value));
18
+ let finalFormat;
19
+ if (formatType === 'date') {
20
+ finalFormat = dateFormat;
21
+ }
22
+ else if (formatType === 'time') {
23
+ finalFormat = timeFormat;
24
+ }
25
+ else {
26
+ finalFormat = `${dateFormat} ${timeFormat}`;
27
+ }
28
+ let date;
29
+ if (isTimeOnly) {
30
+ // Combine with today's date for timezone context
31
+ const today = new Date().toISOString().split('T')[0];
32
+ const timeStr = String(value);
33
+ // Ensure time has seconds if not present
34
+ const fullTimeStr = timeStr.includes(':') && timeStr.split(':').length === 2 ? `${timeStr}:00` : timeStr;
35
+ const dateTimeString = `${today}T${fullTimeStr}`;
36
+ date = new Date(dateTimeString);
37
+ return this.formatDate(date, prefs, formatType);
38
+ }
39
+ else {
40
+ // Parse as date
41
+ if (value instanceof Date) {
42
+ date = value;
43
+ }
44
+ else {
45
+ date = new Date(value);
46
+ }
47
+ if (isNaN(date.getTime())) {
48
+ return '';
49
+ }
50
+ }
51
+ return this.formatDate(value, prefs, formatType);
52
+ // return this.formatDate(date, finalFormat, prefs);
53
+ }
54
+ formatDate(date, prefs, formatType = 'datetime') {
55
+ if (!date)
56
+ return '';
57
+ // Parse the actual date in the correct timezone
58
+ const currentDate = moment.tz(date, prefs.timeZone);
59
+ let timeString;
60
+ // Choose 12h or 24h format dynamically
61
+ switch (formatType) {
62
+ case 'date':
63
+ return currentDate.format(prefs.dateFormat);
64
+ case 'time':
65
+ if (prefs.timeFormat === 'hh:mm A') {
66
+ timeString = currentDate.format('hh:mm A');
67
+ }
68
+ else {
69
+ timeString = currentDate.format('HH:mm');
70
+ }
71
+ return timeString;
72
+ case 'datetime':
73
+ if (prefs.timeFormat === 'hh:mm A') {
74
+ timeString = currentDate.format(prefs.dateFormat + ' hh:mm A');
75
+ }
76
+ else {
77
+ timeString = currentDate.format(prefs.dateFormat + ' HH:mm');
78
+ }
79
+ return timeString;
80
+ }
81
+ }
82
+ __formatDate(date, format, timeZone) {
83
+ const options = this.parseFormatToIntlOptions(format);
84
+ options.timeZone = timeZone;
85
+ const formatter = new Intl.DateTimeFormat('en-US', options);
86
+ return formatter.format(date);
87
+ }
88
+ parseFormatToIntlOptions(format) {
89
+ const cacheKey = format;
90
+ if (this.formatCache.has(cacheKey)) {
91
+ return { ...this.formatCache.get(cacheKey) };
92
+ }
93
+ const options = {};
94
+ // Parse moment.js style format strings
95
+ // Handle year
96
+ if (format.includes('YYYY')) {
97
+ options.year = 'numeric';
98
+ }
99
+ else if (format.includes('YY')) {
100
+ options.year = '2-digit';
101
+ }
102
+ // Handle month
103
+ if (format.includes('MMMM')) {
104
+ options.month = 'long';
105
+ }
106
+ else if (format.includes('MMM')) {
107
+ options.month = 'short';
108
+ }
109
+ else if (format.includes('MM')) {
110
+ options.month = '2-digit';
111
+ }
112
+ else if (format.includes('M')) {
113
+ options.month = 'numeric';
114
+ }
115
+ // Handle day
116
+ if (format.includes('DD')) {
117
+ options.day = '2-digit';
118
+ }
119
+ else if (format.includes('D')) {
120
+ options.day = 'numeric';
121
+ }
122
+ // Handle weekday
123
+ if (format.includes('dddd')) {
124
+ options.weekday = 'long';
125
+ }
126
+ else if (format.includes('ddd')) {
127
+ options.weekday = 'short';
128
+ }
129
+ // Handle hour
130
+ if (format.includes('HH') || format.includes('H')) {
131
+ options.hour = format.includes('HH') ? '2-digit' : 'numeric';
132
+ options.hour12 = false;
133
+ }
134
+ else if (format.includes('hh') || format.includes('h')) {
135
+ options.hour = format.includes('hh') ? '2-digit' : 'numeric';
136
+ options.hour12 = true;
137
+ }
138
+ // Handle minute
139
+ if (format.includes('mm')) {
140
+ options.minute = '2-digit';
141
+ }
142
+ else if (format.includes('m')) {
143
+ options.minute = 'numeric';
144
+ }
145
+ // Handle second
146
+ if (format.includes('ss')) {
147
+ options.second = '2-digit';
148
+ }
149
+ else if (format.includes('s')) {
150
+ options.second = 'numeric';
151
+ }
152
+ // Handle AM/PM (overrides hour12 if explicitly set)
153
+ if (format.includes('A') || format.includes('a')) {
154
+ options.hour12 = true;
155
+ }
156
+ this.formatCache.set(cacheKey, { ...options });
157
+ return options;
158
+ }
159
+ convertAngularToMomentFormat(angularFormat) {
160
+ // Convert Angular DatePipe format to moment.js format
161
+ return angularFormat
162
+ .replace(/dd/g, 'DD') // Day of month: dd -> DD
163
+ .replace(/yyyy/g, 'YYYY') // Year: yyyy -> YYYY
164
+ .replace(/yy/g, 'YY') // Year: yy -> YY
165
+ .replace(/MM/g, 'MM') // Month: MM -> MM (same)
166
+ .replace(/M/g, 'M') // Month: M -> M (same)
167
+ .replace(/HH/g, 'HH') // Hour 24: HH -> HH (same)
168
+ .replace(/H/g, 'H') // Hour 24: H -> H (same)
169
+ .replace(/h/g, 'h') // Hour 12: h -> h (same)
170
+ .replace(/mm/g, 'mm') // Minute: mm -> mm (same)
171
+ .replace(/m/g, 'm') // Minute: m -> m (same)
172
+ .replace(/ss/g, 'ss') // Second: ss -> ss (same)
173
+ .replace(/s/g, 's') // Second: s -> s (same)
174
+ .replace(/a/g, 'a'); // AM/PM: a -> a (same)
175
+ }
176
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TimezoneFormatPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
177
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: TimezoneFormatPipe, isStandalone: true, name: "timezoneFormat" }); }
178
+ }
179
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TimezoneFormatPipe, decorators: [{
180
+ type: Pipe,
181
+ args: [{
182
+ name: 'timezoneFormat',
183
+ standalone: true
184
+ }]
185
+ }] });
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXpvbmUtZm9ybWF0LnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tcy10aW1lLXNoZWV0L3NyYy9saWIvcGlwZXMvdGltZXpvbmUtZm9ybWF0LnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQzs7QUFXMUMsTUFBTSxPQUFPLGtCQUFrQjtJQUovQjtRQU1VLGdCQUFXLEdBQUcsSUFBSSxHQUFHLEVBQXNDLENBQUM7S0FxTHJFO0lBbkxDLFNBQVMsQ0FDUCxLQUF1QyxFQUN2QyxLQUFvRSxFQUNwRSxhQUEyQyxVQUFVO1FBRXJELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLEtBQUssRUFBRSxRQUFRLElBQUksa0JBQWtCLENBQUM7UUFDdkQsa0VBQWtFO1FBQ2xFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsVUFBVSxJQUFJLFlBQVksQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsVUFBVSxJQUFJLE9BQU8sQ0FBQyxDQUFDO1FBRW5GLHlFQUF5RTtRQUN6RSxNQUFNLFVBQVUsR0FBRywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFbEUsSUFBSSxXQUFtQixDQUFDO1FBQ3hCLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzFCLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFDM0IsQ0FBQzthQUFNLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLFdBQVcsR0FBRyxVQUFVLENB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YTthQUNqQixPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFFLHlCQUF5QjthQUMvQyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFFLHFCQUFxQjthQUMvQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFFLGlCQUFpQjthQUN2QyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFFLHlCQUF5QjthQUMvQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFFLHVCQUF1QjthQUMzQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFFLDJCQUEyQjthQUNqRCxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFFLHlCQUF5QjthQUM3QyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFFLHlCQUF5QjthQUM3QyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFFLDBCQUEwQjthQUNoRCxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFFLHdCQUF3QjthQUM1QyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFFLDBCQUEwQjthQUNoRCxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFFLHdCQUF3QjthQUM1QyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsdUJBQXVCO0lBQ2hELENBQUM7K0dBdExVLGtCQUFrQjs2R0FBbEIsa0JBQWtCOzs0RkFBbEIsa0JBQWtCO2tCQUo5QixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudC10aW1lem9uZSc7XHJcblxyXG5pbnRlcmZhY2UgRGF0ZVRpbWVQcmVmcyB7XHJcbiAgdGltZVpvbmU6IHN0cmluZztcclxuICBkYXRlRm9ybWF0OiBzdHJpbmc7XHJcbiAgdGltZUZvcm1hdDogc3RyaW5nO1xyXG59XHJcbkBQaXBlKHtcclxuICBuYW1lOiAndGltZXpvbmVGb3JtYXQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIFRpbWV6b25lRm9ybWF0UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG5cclxuICBwcml2YXRlIGZvcm1hdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zPigpO1xyXG5cclxuICB0cmFuc2Zvcm0oXHJcbiAgICB2YWx1ZTogc3RyaW5nIHwgRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsXHJcbiAgICBwcmVmcz86IHsgdGltZVpvbmU6IHN0cmluZywgZGF0ZUZvcm1hdDogc3RyaW5nLCB0aW1lRm9ybWF0OiBzdHJpbmcgfSxcclxuICAgIGZvcm1hdFR5cGU6ICdkYXRlJyB8ICd0aW1lJyB8ICdkYXRldGltZScgPSAnZGF0ZXRpbWUnXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRpbWVab25lID0gcHJlZnM/LnRpbWVab25lIHx8ICdBbWVyaWNhL05ld19Zb3JrJztcclxuICAgIC8vIENvbnZlcnQgQW5ndWxhciBEYXRlUGlwZSBmb3JtYXQgdG8gbW9tZW50LmpzIGZvcm1hdCBmb3IgcGFyc2luZ1xyXG4gICAgY29uc3QgZGF0ZUZvcm1hdCA9IHRoaXMuY29udmVydEFuZ3VsYXJUb01vbWVudEZvcm1hdChwcmVmcz8uZGF0ZUZvcm1hdCB8fCAnTU0vZGQveXl5eScpO1xyXG4gICAgY29uc3QgdGltZUZvcm1hdCA9IHRoaXMuY29udmVydEFuZ3VsYXJUb01vbWVudEZvcm1hdChwcmVmcz8udGltZUZvcm1hdCB8fCAnSEg6bW0nKTtcclxuXHJcbiAgICAvLyBEZXRlY3QgaWYgdmFsdWUgaXMgdGltZS1vbmx5IChlLmcuICcwOTowMCcsICc5OjAwJywgJzA5OjAwOjAwJyBmb3JtYXQpXHJcbiAgICBjb25zdCBpc1RpbWVPbmx5ID0gL15cXGR7MSwyfTpcXGR7Mn0oOlxcZHsyfSk/JC8udGVzdChTdHJpbmcodmFsdWUpKTtcclxuXHJcbiAgICBsZXQgZmluYWxGb3JtYXQ6IHN0cmluZztcclxuICAgIGlmIChmb3JtYXRUeXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgZmluYWxGb3JtYXQgPSBkYXRlRm9ybWF0O1xyXG4gICAgfSBlbHNlIGlmIChmb3JtYXRUeXBlID09PSAndGltZScpIHtcclxuICAgICAgZmluYWxGb3JtYXQgPSB0aW1lRm9ybWF0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZmluYWxGb3JtYXQgPSBgJHtkYXRlRm9ybWF0fSAke3RpbWVGb3JtYXR9YDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0ZTogRGF0ZTtcclxuICAgIGlmIChpc1RpbWVPbmx5KSB7XHJcbiAgICAgIC8vIENvbWJpbmUgd2l0aCB0b2RheSdzIGRhdGUgZm9yIHRpbWV6b25lIGNvbnRleHRcclxuICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcclxuICAgICAgY29uc3QgdGltZVN0ciA9IFN0cmluZyh2YWx1ZSk7XHJcbiAgICAgIC8vIEVuc3VyZSB0aW1lIGhhcyBzZWNvbmRzIGlmIG5vdCBwcmVzZW50XHJcbiAgICAgIGNvbnN0IGZ1bGxUaW1lU3RyID0gdGltZVN0ci5pbmNsdWRlcygnOicpICYmIHRpbWVTdHIuc3BsaXQoJzonKS5sZW5ndGggPT09IDIgPyBgJHt0aW1lU3RyfTowMGAgOiB0aW1lU3RyO1xyXG4gICAgICBjb25zdCBkYXRlVGltZVN0cmluZyA9IGAke3RvZGF5fVQke2Z1bGxUaW1lU3RyfWA7XHJcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlVGltZVN0cmluZyk7XHJcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdERhdGUoZGF0ZSwgcHJlZnMsIGZvcm1hdFR5cGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gUGFyc2UgYXMgZGF0ZVxyXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgZGF0ZSA9IHZhbHVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZSh2YWx1ZSwgcHJlZnMsIGZvcm1hdFR5cGUpO1xyXG4gICAgLy8gcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZShkYXRlLCBmaW5hbEZvcm1hdCwgcHJlZnMpO1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0RGF0ZShkYXRlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBwcmVmczogRGF0ZVRpbWVQcmVmcyxcclxuICAgIGZvcm1hdFR5cGU6ICdkYXRlJyB8ICd0aW1lJyB8ICdkYXRldGltZScgPSAnZGF0ZXRpbWUnXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGlmICghZGF0ZSkgcmV0dXJuICcnO1xyXG4gICAgLy8gUGFyc2UgdGhlIGFjdHVhbCBkYXRlIGluIHRoZSBjb3JyZWN0IHRpbWV6b25lXHJcbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG1vbWVudC50eihkYXRlLCBwcmVmcy50aW1lWm9uZSk7XHJcbiAgICBsZXQgdGltZVN0cmluZzogc3RyaW5nO1xyXG5cclxuICAgIC8vIENob29zZSAxMmggb3IgMjRoIGZvcm1hdCBkeW5hbWljYWxseVxyXG4gICAgc3dpdGNoIChmb3JtYXRUeXBlKSB7XHJcbiAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQocHJlZnMuZGF0ZUZvcm1hdCk7XHJcbiAgICAgIGNhc2UgJ3RpbWUnOlxyXG4gICAgICAgIGlmIChwcmVmcy50aW1lRm9ybWF0ID09PSAnaGg6bW0gQScpIHtcclxuICAgICAgICAgIHRpbWVTdHJpbmcgPSBjdXJyZW50RGF0ZS5mb3JtYXQoJ2hoOm1tIEEnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGltZVN0cmluZyA9IGN1cnJlbnREYXRlLmZvcm1hdCgnSEg6bW0nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRpbWVTdHJpbmc7XHJcbiAgICAgIGNhc2UgJ2RhdGV0aW1lJzpcclxuICAgICAgICBpZiAocHJlZnMudGltZUZvcm1hdCA9PT0gJ2hoOm1tIEEnKSB7XHJcbiAgICAgICAgICB0aW1lU3RyaW5nID0gY3VycmVudERhdGUuZm9ybWF0KHByZWZzLmRhdGVGb3JtYXQgKyAnIGhoOm1tIEEnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGltZVN0cmluZyA9IGN1cnJlbnREYXRlLmZvcm1hdChwcmVmcy5kYXRlRm9ybWF0ICsgJyBISDptbScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGltZVN0cmluZztcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9fZm9ybWF0RGF0ZShkYXRlOiBEYXRlLCBmb3JtYXQ6IHN0cmluZywgdGltZVpvbmU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5wYXJzZUZvcm1hdFRvSW50bE9wdGlvbnMoZm9ybWF0KTtcclxuICAgIG9wdGlvbnMudGltZVpvbmUgPSB0aW1lWm9uZTtcclxuXHJcbiAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgnZW4tVVMnLCBvcHRpb25zKTtcclxuICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXJzZUZvcm1hdFRvSW50bE9wdGlvbnMoZm9ybWF0OiBzdHJpbmcpOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyB7XHJcbiAgICBjb25zdCBjYWNoZUtleSA9IGZvcm1hdDtcclxuICAgIGlmICh0aGlzLmZvcm1hdENhY2hlLmhhcyhjYWNoZUtleSkpIHtcclxuICAgICAgcmV0dXJuIHsgLi4udGhpcy5mb3JtYXRDYWNoZS5nZXQoY2FjaGVLZXkpISB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9wdGlvbnM6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zID0ge307XHJcblxyXG4gICAgLy8gUGFyc2UgbW9tZW50LmpzIHN0eWxlIGZvcm1hdCBzdHJpbmdzXHJcbiAgICAvLyBIYW5kbGUgeWVhclxyXG4gICAgaWYgKGZvcm1hdC5pbmNsdWRlcygnWVlZWScpKSB7XHJcbiAgICAgIG9wdGlvbnMueWVhciA9ICdudW1lcmljJztcclxuICAgIH0gZWxzZSBpZiAoZm9ybWF0LmluY2x1ZGVzKCdZWScpKSB7XHJcbiAgICAgIG9wdGlvbnMueWVhciA9ICcyLWRpZ2l0JztcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgbW9udGhcclxuICAgIGlmIChmb3JtYXQuaW5jbHVkZXMoJ01NTU0nKSkge1xyXG4gICAgICBvcHRpb25zLm1vbnRoID0gJ2xvbmcnO1xyXG4gICAgfSBlbHNlIGlmIChmb3JtYXQuaW5jbHVkZXMoJ01NTScpKSB7XHJcbiAgICAgIG9wdGlvbnMubW9udGggPSAnc2hvcnQnO1xyXG4gICAgfSBlbHNlIGlmIChmb3JtYXQuaW5jbHVkZXMoJ01NJykpIHtcclxuICAgICAgb3B0aW9ucy5tb250aCA9ICcyLWRpZ2l0JztcclxuICAgIH0gZWxzZSBpZiAoZm9ybWF0LmluY2x1ZGVzKCdNJykpIHtcclxuICAgICAgb3B0aW9ucy5tb250aCA9ICdudW1lcmljJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgZGF5XHJcbiAgICBpZiAoZm9ybWF0LmluY2x1ZGVzKCdERCcpKSB7XHJcbiAgICAgIG9wdGlvbnMuZGF5ID0gJzItZGlnaXQnO1xyXG4gICAgfSBlbHNlIGlmIChmb3JtYXQuaW5jbHVkZXMoJ0QnKSkge1xyXG4gICAgICBvcHRpb25zLmRheSA9ICdudW1lcmljJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgd2Vla2RheVxyXG4gICAgaWYgKGZvcm1hdC5pbmNsdWRlcygnZGRkZCcpKSB7XHJcbiAgICAgIG9wdGlvbnMud2Vla2RheSA9ICdsb25nJztcclxuICAgIH0gZWxzZSBpZiAoZm9ybWF0LmluY2x1ZGVzKCdkZGQnKSkge1xyXG4gICAgICBvcHRpb25zLndlZWtkYXkgPSAnc2hvcnQnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBob3VyXHJcbiAgICBpZiAoZm9ybWF0LmluY2x1ZGVzKCdISCcpIHx8IGZvcm1hdC5pbmNsdWRlcygnSCcpKSB7XHJcbiAgICAgIG9wdGlvbnMuaG91ciA9IGZvcm1hdC5pbmNsdWRlcygnSEgnKSA/ICcyLWRpZ2l0JyA6ICdudW1lcmljJztcclxuICAgICAgb3B0aW9ucy5ob3VyMTIgPSBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAoZm9ybWF0LmluY2x1ZGVzKCdoaCcpIHx8IGZvcm1hdC5pbmNsdWRlcygnaCcpKSB7XHJcbiAgICAgIG9wdGlvbnMuaG91ciA9IGZvcm1hdC5pbmNsdWRlcygnaGgnKSA/ICcyLWRpZ2l0JyA6ICdudW1lcmljJztcclxuICAgICAgb3B0aW9ucy5ob3VyMTIgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBtaW51dGVcclxuICAgIGlmIChmb3JtYXQuaW5jbHVkZXMoJ21tJykpIHtcclxuICAgICAgb3B0aW9ucy5taW51dGUgPSAnMi1kaWdpdCc7XHJcbiAgICB9IGVsc2UgaWYgKGZvcm1hdC5pbmNsdWRlcygnbScpKSB7XHJcbiAgICAgIG9wdGlvbnMubWludXRlID0gJ251bWVyaWMnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBzZWNvbmRcclxuICAgIGlmIChmb3JtYXQuaW5jbHVkZXMoJ3NzJykpIHtcclxuICAgICAgb3B0aW9ucy5zZWNvbmQgPSAnMi1kaWdpdCc7XHJcbiAgICB9IGVsc2UgaWYgKGZvcm1hdC5pbmNsdWRlcygncycpKSB7XHJcbiAgICAgIG9wdGlvbnMuc2Vjb25kID0gJ251bWVyaWMnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBBTS9QTSAob3ZlcnJpZGVzIGhvdXIxMiBpZiBleHBsaWNpdGx5IHNldClcclxuICAgIGlmIChmb3JtYXQuaW5jbHVkZXMoJ0EnKSB8fCBmb3JtYXQuaW5jbHVkZXMoJ2EnKSkge1xyXG4gICAgICBvcHRpb25zLmhvdXIxMiA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5mb3JtYXRDYWNoZS5zZXQoY2FjaGVLZXksIHsgLi4ub3B0aW9ucyB9KTtcclxuICAgIHJldHVybiBvcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb252ZXJ0QW5ndWxhclRvTW9tZW50Rm9ybWF0KGFuZ3VsYXJGb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAvLyBDb252ZXJ0IEFuZ3VsYXIgRGF0ZVBpcGUgZm9ybWF0IHRvIG1vbWVudC5qcyBmb3JtYXRcclxuICAgIHJldHVybiBhbmd1bGFyRm9ybWF0XHJcbiAgICAgIC5yZXBsYWNlKC9kZC9nLCAnREQnKSAgLy8gRGF5IG9mIG1vbnRoOiBkZCAtPiBERFxyXG4gICAgICAucmVwbGFjZSgveXl5eS9nLCAnWVlZWScpICAvLyBZZWFyOiB5eXl5IC0+IFlZWVlcclxuICAgICAgLnJlcGxhY2UoL3l5L2csICdZWScpICAvLyBZZWFyOiB5eSAtPiBZWVxyXG4gICAgICAucmVwbGFjZSgvTU0vZywgJ01NJykgIC8vIE1vbnRoOiBNTSAtPiBNTSAoc2FtZSlcclxuICAgICAgLnJlcGxhY2UoL00vZywgJ00nKSAgLy8gTW9udGg6IE0gLT4gTSAoc2FtZSlcclxuICAgICAgLnJlcGxhY2UoL0hIL2csICdISCcpICAvLyBIb3VyIDI0OiBISCAtPiBISCAoc2FtZSlcclxuICAgICAgLnJlcGxhY2UoL0gvZywgJ0gnKSAgLy8gSG91ciAyNDogSCAtPiBIIChzYW1lKVxyXG4gICAgICAucmVwbGFjZSgvaC9nLCAnaCcpICAvLyBIb3VyIDEyOiBoIC0+IGggKHNhbWUpXHJcbiAgICAgIC5yZXBsYWNlKC9tbS9nLCAnbW0nKSAgLy8gTWludXRlOiBtbSAtPiBtbSAoc2FtZSlcclxuICAgICAgLnJlcGxhY2UoL20vZywgJ20nKSAgLy8gTWludXRlOiBtIC0+IG0gKHNhbWUpXHJcbiAgICAgIC5yZXBsYWNlKC9zcy9nLCAnc3MnKSAgLy8gU2Vjb25kOiBzcyAtPiBzcyAoc2FtZSlcclxuICAgICAgLnJlcGxhY2UoL3MvZywgJ3MnKSAgLy8gU2Vjb25kOiBzIC0+IHMgKHNhbWUpXHJcbiAgICAgIC5yZXBsYWNlKC9hL2csICdhJyk7IC8vIEFNL1BNOiBhIC0+IGEgKHNhbWUpXHJcbiAgfVxyXG59Il19