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.
- package/esm2022/lib/ms-time-sheet.component.mjs +498 -224
- package/esm2022/lib/pipes/filter.pipe.mjs +329 -5
- package/esm2022/lib/pipes/timezone-format.pipe.mjs +186 -0
- package/esm2022/lib/services/common.service.mjs +8 -2
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/ms-time-sheet.mjs +1014 -229
- package/fesm2022/ms-time-sheet.mjs.map +1 -1
- package/lib/ms-time-sheet.component.d.ts +39 -20
- package/lib/pipes/filter.pipe.d.ts +14 -0
- package/lib/pipes/timezone-format.pipe.d.ts +22 -0
- package/lib/services/common.service.d.ts +3 -1
- package/package.json +4 -2
- package/public-api.d.ts +1 -0
|
@@ -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
|
-
|
|
7
|
+
const searchTerms = searchText.toLowerCase().trim().split(/\s+/);
|
|
8
8
|
return items.filter(item => {
|
|
9
|
-
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tcy10aW1lLXNoZWV0L3NyYy9saWIvcGlwZXMvZmlsdGVyLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBTXBELE1BQU0sT0FBTyxVQUFVO0lBRXJCLFNBQVMsQ0FBQyxLQUFZLEVBQUUsVUFBa0IsRUFBRSxHQUFZO1FBQ3RELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUVwRSxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpFLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN6QixPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGlCQUFpQixDQUFDLElBQVMsRUFBRSxVQUFrQixFQUFFLEdBQVk7UUFDbkUsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUV4QixvREFBb0Q7UUFDcEQsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzdDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBRUQsa0RBQWtEO1FB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aXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AUGlwZSh7XHJcbiAgbmFtZTogJ2ZpbHRlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsdGVyUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG5cclxuICB0cmFuc2Zvcm0oaXRlbXM6IGFueVtdLCBzZWFyY2hUZXh0OiBzdHJpbmcsIGtleT86IHN0cmluZyk6IGFueVtdIHtcclxuICAgIGlmICghaXRlbXMgfHwgIXNlYXJjaFRleHQgfHwgc2VhcmNoVGV4dC50cmltKCkgPT09ICcnKSByZXR1cm4gaXRlbXM7XHJcblxyXG4gICAgY29uc3Qgc2VhcmNoVGVybXMgPSBzZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihpdGVtID0+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
|