@libs-ui/utils 0.2.355-9 → 0.2.356-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +633 -2
  2. package/base64.d.ts +25 -0
  3. package/cache.d.ts +73 -0
  4. package/collection.d.ts +12 -0
  5. package/color.d.ts +37 -0
  6. package/communicate-micro.d.ts +34 -1
  7. package/crypto-3rd.d.ts +12 -0
  8. package/crypto.d.ts +17 -0
  9. package/dangerous-object.d.ts +8 -1
  10. package/data.d.ts +5 -3
  11. package/date.d.ts +12 -0
  12. package/dom.d.ts +56 -0
  13. package/download.d.ts +21 -0
  14. package/esm2022/base64.mjs +27 -2
  15. package/esm2022/cache.mjs +74 -1
  16. package/esm2022/collection.mjs +13 -1
  17. package/esm2022/color.mjs +38 -1
  18. package/esm2022/communicate-micro.mjs +37 -5
  19. package/esm2022/crypto-3rd.mjs +13 -1
  20. package/esm2022/crypto.mjs +18 -1
  21. package/esm2022/dangerous-object.mjs +11 -2
  22. package/esm2022/data.mjs +6 -4
  23. package/esm2022/date.mjs +13 -1
  24. package/esm2022/dom.mjs +57 -1
  25. package/esm2022/download.mjs +22 -1
  26. package/esm2022/file.mjs +54 -1
  27. package/esm2022/format-number.mjs +31 -3
  28. package/esm2022/format-text.mjs +73 -2
  29. package/esm2022/function-check-embed-frame.mjs +28 -1
  30. package/esm2022/pattern.mjs +83 -3
  31. package/esm2022/trace.mjs +8 -1
  32. package/esm2022/two-way-signal-object.mjs +14 -1
  33. package/esm2022/uri.mjs +22 -3
  34. package/esm2022/url-search-params.mjs +68 -1
  35. package/esm2022/url.mjs +10 -1
  36. package/esm2022/uuid.mjs +7 -1
  37. package/esm2022/xss-filter.mjs +14 -1
  38. package/fesm2022/libs-ui-utils.mjs +723 -21
  39. package/fesm2022/libs-ui-utils.mjs.map +1 -1
  40. package/file.d.ts +53 -0
  41. package/format-number.d.ts +29 -1
  42. package/format-text.d.ts +71 -0
  43. package/function-check-embed-frame.d.ts +22 -0
  44. package/package.json +2 -2
  45. package/pattern.d.ts +81 -1
  46. package/trace.d.ts +7 -0
  47. package/two-way-signal-object.d.ts +13 -0
  48. package/uri.d.ts +20 -0
  49. package/url-search-params.d.ts +67 -0
  50. package/url.d.ts +9 -0
  51. package/uuid.d.ts +6 -0
  52. package/xss-filter.d.ts +13 -0
@@ -1,5 +1,15 @@
1
1
  import { CHARACTER_DATA_EMPTY } from './constants';
2
2
  import { patternEmoji } from './pattern';
3
+ /**
4
+ * Highlight một từ khóa tìm kiếm bên trong chuỗi văn bản bằng cách bọc vào thẻ `<span>`.
5
+ * Hỗ trợ tìm kiếm không phân biệt dấu (Unicode-insensitive) và không phân biệt hoa/thường.
6
+ *
7
+ * @param value Chuỗi văn bản gốc cần highlight
8
+ * @param search Từ khóa cần tìm và highlight
9
+ * @param ignoreHighlight Nếu `true`, bỏ qua highlight và trả về chuỗi gốc
10
+ * @param classHightLight Class CSS áp dụng cho span highlight (mặc định: 'bg-[#19344a] text-white')
11
+ * @returns Chuỗi HTML đã được inject thẻ `<span>` quanh từ khóa
12
+ */
3
13
  export const highlightByKeyword = (value, search, ignoreHighlight, classHightLight) => {
4
14
  if (!value) {
5
15
  return CHARACTER_DATA_EMPTY;
@@ -40,6 +50,14 @@ const getValueReplace = (search, value) => {
40
50
  }
41
51
  return Array.from(keys);
42
52
  };
53
+ /**
54
+ * Chuẩn hóa chuỗi văn bản theo chuẩn Unicode NFC và áp dụng các tùy chọn format.
55
+ * Thường dùng để so sánh chuỗi nhất quán, không phụ thuộc vào cách gõ có dấu.
56
+ *
57
+ * @param text Chuỗi cần chuẩn hóa
58
+ * @param options Các tùy chọn transform (trim, removeEmoji, removeUnicode...)
59
+ * @returns Chuỗi đã chuẩn hóa
60
+ */
43
61
  export const formatTextCompare = (text, options) => {
44
62
  if (!text) {
45
63
  return text;
@@ -47,12 +65,25 @@ export const formatTextCompare = (text, options) => {
47
65
  text = text.normalize('NFC');
48
66
  return formatByOptions(text, options);
49
67
  };
68
+ /**
69
+ * Định dạng họ tên đầy đủ: viết hoa chữ cái đầu mỗi từ, xóa khoảng trắng thừa và emoji.
70
+ * @param value Chuỗi họ tên cần format
71
+ * @returns Chuỗi đã được chuẩn hóa
72
+ * @example fullNameFormat(' nguyễn văn a ') → 'Nguyễn Văn A'
73
+ */
50
74
  export const fullNameFormat = (value) => {
51
75
  if (!value) {
52
76
  return value;
53
77
  }
54
78
  return capitalize(value, { lowercaseOtherCharacter: true, trim: true, removeMultipleSpace: true, removeEmoji: true });
55
79
  };
80
+ /**
81
+ * Viết hoa chữ cái đầu tiên của mỗi từ trong chuỗi.
82
+ * @param text Chuỗi cần capitalize
83
+ * @param options Tùy chọn xử lý trước (lowercase, trim, removeEmoji...)
84
+ * @returns Chuỗi đã được capitalize theo từng từ
85
+ * @example capitalize('hello world') → 'Hello World'
86
+ */
56
87
  export const capitalize = (text, options) => {
57
88
  if (!text) {
58
89
  return text;
@@ -63,12 +94,26 @@ export const capitalize = (text, options) => {
63
94
  .map((word) => firstLetterToUpperCase(word))
64
95
  .join(' ');
65
96
  };
97
+ /**
98
+ * Viết hoa chữ cái đầu tiên của chuỗi.
99
+ * @param text Chuỗi cần xử lý
100
+ * @param options Tùy chọn format bổ sung
101
+ * @returns Chuỗi với chữ cái đầu tiên được viết hoa
102
+ * @example firstLetterToUpperCase('hello') → 'Hello'
103
+ */
66
104
  export const firstLetterToUpperCase = (text, options) => {
67
105
  if (!text) {
68
106
  return text;
69
107
  }
70
108
  return uppercaseByPosition(text, 0, options);
71
109
  };
110
+ /**
111
+ * Viết hoa một ký tự tại vị trí bất kỳ trong chuỗi.
112
+ * @param text Chuỗi cần xử lý
113
+ * @param position Vị trí ký tự cần viết hoa (0-indexed)
114
+ * @param options Tùy chọn format bổ sung
115
+ * @returns Chuỗi với ký tự tại vị trí được viết hoa
116
+ */
72
117
  export const uppercaseByPosition = (text, position, options) => {
73
118
  if (!text) {
74
119
  return text;
@@ -101,12 +146,25 @@ const formatByOptions = (text, options) => {
101
146
  }
102
147
  return text;
103
148
  };
149
+ /**
150
+ * Escape các ký tự đặc biệt HTML thành HTML entities để tránh XSS.
151
+ * @param str Chuỗi cần escape
152
+ * @returns Chuỗi an toàn (& → &amp;, < → &lt;, > → &gt;, " → &quot;, ' → &#039;)
153
+ * @example escapeHtml('<script>') → '&lt;script&gt;'
154
+ */
104
155
  export const escapeHtml = (str) => {
105
156
  if (!str || typeof str !== 'string') {
106
157
  return str;
107
158
  }
108
159
  return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#039;');
109
160
  };
161
+ /**
162
+ * Giải mã chuỗi HTML entities về dạng ký tự gốc.
163
+ * Sử dụng thẻ textarea để giải mã an toàn, hỗ trợ multi-level encoding.
164
+ * @param str Chuỗi HTML encoded cần giải mã
165
+ * @returns Chuỗi gốc sau khi decode
166
+ * @example decodeEscapeHtml('&lt;b&gt;') → '<b>'
167
+ */
110
168
  export const decodeEscapeHtml = (str) => {
111
169
  const htmlTag = document.createElement('textarea');
112
170
  htmlTag.innerHTML = str;
@@ -121,9 +179,15 @@ export const decodeEscapeHtml = (str) => {
121
179
  }
122
180
  return str;
123
181
  };
182
+ /**
183
+ * Xóa dấu tiếng Việt khỏi chuỗi, chuyển tất cả ký tự có dấu về dạng Latin cơ bản.
184
+ * Hỗ trợ cả chữ thường lẫn hoa.
185
+ * @param str Chuỗi tiếng Việt cần xóa dấu
186
+ * @returns Chuỗi đã xóa dấu (vd: 'Nguyễn Văn An' → 'Nguyen Van An')
187
+ */
124
188
  export const deleteUnicode = (str) => {
125
189
  str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a');
126
- str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ|ễ/g, 'e');
190
+ str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ|ễ/g, 'e');
127
191
  str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i');
128
192
  str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o');
129
193
  str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u');
@@ -140,10 +204,17 @@ export const deleteUnicode = (str) => {
140
204
  str = str.replace(/\u02C6|\u0306|\u031B/g, ''); // ˆ ̆ ̛ Â, Ê, Ă, Ơ, Ư
141
205
  return str.normalize('NFC');
142
206
  };
207
+ /**
208
+ * Xóa tất cả emoji khỏi chuỗi văn bản.
209
+ * Sử dụng pattern regex từ `patternEmoji()` để nhận diện toàn bộ emoji Unicode.
210
+ * @param text Chuỗi cần xóa emoji
211
+ * @returns Chuỗi đã được xóa emoji
212
+ * @example removeEmoji('Hello 😀 World 🎉') → 'Hello World '
213
+ */
143
214
  export const removeEmoji = (text) => {
144
215
  if (!text || !text.trim()) {
145
216
  return text;
146
217
  }
147
218
  return text.replace(patternEmoji(), '');
148
219
  };
149
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LXRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9mb3JtYXQtdGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV6QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEtBQXlCLEVBQUUsTUFBMEIsRUFBRSxlQUF5QixFQUFFLGVBQXdCLEVBQUUsRUFBRTtJQUMvSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFrQixlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWxFLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLGVBQWUsR0FBRyx5QkFBeUIsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVyQyxLQUFLLEdBQUcsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLGVBQWUsYUFBYSxDQUFDLENBQUM7UUFDL0UsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FB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T0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUU3QixHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxxQ0FBcUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLHdDQUF3QztJQUN0RyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLHVCQUF1QjtJQUV2RSxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7SUFDMUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJVGV4dEZvcm1hdE9wdGlvbnMgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IENIQVJBQ1RFUl9EQVRBX0VNUFRZIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgcGF0dGVybkVtb2ppIH0gZnJvbSAnLi9wYXR0ZXJuJztcblxuZXhwb3J0IGNvbnN0IGhpZ2hsaWdodEJ5S2V5d29yZCA9ICh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzZWFyY2g6IHN0cmluZyB8IHVuZGVmaW5lZCwgaWdub3JlSGlnaGxpZ2h0PzogYm9vbGVhbiwgY2xhc3NIaWdodExpZ2h0Pzogc3RyaW5nKSA9PiB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gQ0hBUkFDVEVSX0RBVEFfRU1QVFk7XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAoIXNlYXJjaCB8fCBpZ25vcmVIaWdobGlnaHQpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3Qga2V5c1JlcGxhY2U6IEFycmF5PHN0cmluZz4gPSBnZXRWYWx1ZVJlcGxhY2Uoc2VhcmNoLCB2YWx1ZSk7XG5cbiAgICBpZiAoIWtleXNSZXBsYWNlIHx8ICFrZXlzUmVwbGFjZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKCFjbGFzc0hpZ2h0TGlnaHQpIHtcbiAgICAgIGNsYXNzSGlnaHRMaWdodCA9ICdiZy1bIzE5MzQ0YV0gdGV4dC13aGl0ZSc7XG4gICAgfVxuICAgIGtleXNSZXBsYWNlLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cChrZXksICdnaScpO1xuXG4gICAgICB2YWx1ZSA9IHZhbHVlPy5yZXBsYWNlKHJlZ0V4cCwgYDxzcGFuIGNsYXNzPVwiJHtjbGFzc0hpZ2h0TGlnaHR9XCI+JCY8L3NwYW4+YCk7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5sb2coZXJyb3IpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnNhZmUtZmluYWxseVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufTtcblxuY29uc3QgZ2V0VmFsdWVSZXBsYWNlID0gKHNlYXJjaDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBzZWFyY2hDb252ZXJ0ID0gZGVsZXRlVW5pY29kZShzZWFyY2gpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHZhbHVlQ29udmVydCA9IGRlbGV0ZVVuaWNvZGUodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGtleXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKChpID0gdmFsdWVDb252ZXJ0LmluZGV4T2Yoc2VhcmNoQ29udmVydCwgaSkpID49IDApIHtcbiAgICBjb25zdCBlbmRJbmRleCA9IGkgKyBzZWFyY2gubGVuZ3RoO1xuXG4gICAga2V5cy5hZGQodmFsdWUuc3Vic3RyaW5nKGksIGVuZEluZGV4KSk7XG4gICAgaSArPSArdmFsdWVDb252ZXJ0Lmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKGtleXMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFRleHRDb21wYXJlID0gKHRleHQ6IHN0cmluZywgb3B0aW9ucz86IElUZXh0Rm9ybWF0T3B0aW9ucykgPT4ge1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHRleHQgPSB0ZXh0Lm5vcm1hbGl6ZSgnTkZDJyk7XG5cbiAgcmV0dXJuIGZvcm1hdEJ5T3B0aW9ucyh0ZXh0LCBvcHRpb25zKTtcbn07XG5cbmV4cG9ydCBjb25zdCBmdWxsTmFtZUZvcm1hdCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGNhcGl0YWxpemUodmFsdWUsIHsgbG93ZXJjYXNlT3RoZXJDaGFyYWN0ZXI6IHRydWUsIHRyaW06IHRydWUsIHJlbW92ZU11bHRpcGxlU3BhY2U6IHRydWUsIHJlbW92ZUVtb2ppOiB0cnVlIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhcGl0YWxpemUgPSAodGV4dDogc3RyaW5nLCBvcHRpb25zPzogSVRleHRGb3JtYXRPcHRpb25zKSA9PiB7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIHRleHQgPSBmb3JtYXRCeU9wdGlvbnModGV4dCwgb3B0aW9ucyk7XG4gIHJldHVybiB0ZXh0XG4gICAgLnNwbGl0KCcgJylcbiAgICAubWFwKCh3b3JkKSA9PiBmaXJzdExldHRlclRvVXBwZXJDYXNlKHdvcmQpKVxuICAgIC5qb2luKCcgJyk7XG59O1xuXG5leHBvcnQgY29uc3QgZmlyc3RMZXR0ZXJUb1VwcGVyQ2FzZSA9ICh0ZXh0OiBzdHJpbmcsIG9wdGlvbnM/OiBJVGV4dEZvcm1hdE9wdGlvbnMpID0+IHtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgcmV0dXJuIHVwcGVyY2FzZUJ5UG9zaXRpb24odGV4dCwgMCwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBwZXJjYXNlQnlQb3NpdGlvbiA9ICh0ZXh0OiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIsIG9wdGlvbnM/OiBJVGV4dEZvcm1hdE9wdGlvbnMpID0+IHtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgdGV4dCA9IGZvcm1hdEJ5T3B0aW9ucyh0ZXh0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGAke3RleHQuc3Vic3RyaW5nKDAsIHBvc2l0aW9uKX0ke3RleHQuY2hhckF0KHBvc2l0aW9uKS50b1VwcGVyQ2FzZSgpfSR7dGV4dC5zdWJzdHJpbmcocG9zaXRpb24gKyAxKX1gO1xufTtcblxuY29uc3QgZm9ybWF0QnlPcHRpb25zID0gKHRleHQ6IHN0cmluZywgb3B0aW9ucz86IElUZXh0Rm9ybWF0T3B0aW9ucykgPT4ge1xuICBpZiAoIXRleHQgfHwgIW9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuICBpZiAob3B0aW9ucz8udXBwZXJjYXNlT3RoZXJDaGFyYWN0ZXIpIHtcbiAgICB0ZXh0ID0gdGV4dC50b1VwcGVyQ2FzZSgpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnM/Lmxvd2VyY2FzZU90aGVyQ2hhcmFjdGVyKSB7XG4gICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5yZW1vdmVNdWx0aXBsZVNwYWNlKSB7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFx1MjAwQnxcXHUwMEEwL2csICcnKTtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXHMrL2csICcgJyk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8ucmVtb3ZlRW1vamkpIHtcbiAgICB0ZXh0ID0gcmVtb3ZlRW1vamkodGV4dCk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8ucmVtb3ZlVW5pY29kZSkge1xuICAgIHRleHQgPSBkZWxldGVVbmljb2RlKHRleHQpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnM/LnRyaW0pIHtcbiAgICB0ZXh0ID0gdGV4dC50cmltKCk7XG4gIH1cblxuICByZXR1cm4gdGV4dDtcbn07XG5cbmV4cG9ydCBjb25zdCBlc2NhcGVIdG1sID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKCFzdHIgfHwgdHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7JykucmVwbGFjZSgvXCIvZywgJyZxdW90OycpLnJlcGxhY2UoLycvZywgJyYjMDM5OycpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlY29kZUVzY2FwZUh0bWwgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBodG1sVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcblxuICBodG1sVGFnLmlubmVySFRNTCA9IHN0cjtcbiAgd2hpbGUgKHN0cikge1xuICAgIGlmIChzdHIgPT09IGh0bWxUYWcudmFsdWUpIHtcbiAgICAgIHN0ciA9IGh0bWxUYWcudmFsdWU7XG4gICAgICBodG1sVGFnLnJlbW92ZSgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHN0ciA9IGh0bWxUYWcudmFsdWU7XG4gICAgaHRtbFRhZy5pbm5lckhUTUwgPSBzdHI7XG4gIH1cblxuICByZXR1cm4gc3RyO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVVuaWNvZGUgPSAoc3RyOiBzdHJpbmcpID0+IHtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8OgfMOhfOG6oXzhuqN8w6N8w6J84bqnfOG6pXzhuq184bqpfOG6q3zEg3zhurF84bqvfOG6t3zhurN84bq1L2csICdhJyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/DqHzDqXzhurl84bq7fOG6vXzDqnzhu4F84bq/fOG7h3zhu4N8w6rMg3zhu4UvZywgJ2UnKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8OsfMOtfOG7i3zhu4l8xKkvZywgJ2knKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8OyfMOzfOG7jXzhu498w7V8w7R84buTfOG7kXzhu5l84buVfOG7l3zGoXzhu5184bubfOG7o3zhu5984buhL2csICdvJyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/DuXzDunzhu6V84bunfMWpfMawfOG7q3zhu6l84buxfOG7rXzhu68vZywgJ3UnKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL+G7s3zDvXzhu7V84bu3fOG7uS9nLCAneScpO1xuICBzdHIgPSBzdHIucmVwbGFjZSgvxJEvZywgJ2QnKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8OAfMOBfOG6oHzhuqJ8w4N8w4J84bqmfOG6pHzhuqx84bqofOG6qnzEgnzhurB84bqufOG6tnzhurJ84bq0L2csICdBJyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/DiHzDiXzhurh84bq6fOG6vHzDinzhu4B84bq+fOG7hnzhu4J84buEL2csICdFJyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/DjHzDjXzhu4p84buIfMSoL2csICdJJyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/DknzDk3zhu4x84buOfMOVfMOUfOG7knzhu5B84buYfOG7lHzhu5Z8xqB84bucfOG7mnzhu6J84buefOG7oC9nLCAnTycpO1xuICBzdHIgPSBzdHIucmVwbGFjZSgvw5l8w5p84bukfOG7pnzFqHzGr3zhu6p84buofOG7sHzhu6x84buuL2csICdVJyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/hu7J8w5184bu0fOG7tnzhu7gvZywgJ1knKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8SQL2csICdEJyk7XG5cbiAgc3RyID0gc3RyLnJlcGxhY2UoL1xcdTAzMDB8XFx1MDMwMXxcXHUwMzAzfFxcdTAzMDl8XFx1MDMyMy9nLCAnJyk7IC8vIMyAIMyBIMyDIMyJIMyjICBodXnhu4FuLCBz4bqvYywgbmfDoywgaOG7j2ksIG7hurduZ1xuICBzdHIgPSBzdHIucmVwbGFjZSgvXFx1MDJDNnxcXHUwMzA2fFxcdTAzMUIvZywgJycpOyAvLyDLhiDMhiDMmyAgw4IsIMOKLCDEgiwgxqAsIMavXG5cbiAgcmV0dXJuIHN0ci5ub3JtYWxpemUoJ05GQycpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUVtb2ppID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICBpZiAoIXRleHQgfHwgIXRleHQudHJpbSgpKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICByZXR1cm4gdGV4dC5yZXBsYWNlKHBhdHRlcm5FbW9qaSgpLCAnJyk7XG59O1xuIl19
220
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LXRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9mb3JtYXQtdGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV6Qzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEtBQXlCLEVBQUUsTUFBMEIsRUFBRSxlQUF5QixFQUFFLGVBQXdCLEVBQUUsRUFBRTtJQUMvSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFrQixlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWxFLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLGVBQWUsR0FBRyx5QkFBeUIsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVyQyxLQUFLLEdBQUcsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLGVBQWUsYUFBYSxDQUFDLENBQUM7UUFDL0UsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMs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RyxHQUFHLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2pELEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyQyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFN0IsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMscUNBQXFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyx3Q0FBd0M7SUFDdEcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyx1QkFBdUI7SUFFdkUsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlCLENBQUMsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFO0lBQzFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVRleHRGb3JtYXRPcHRpb25zIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBDSEFSQUNURVJfREFUQV9FTVBUWSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IHBhdHRlcm5FbW9qaSB9IGZyb20gJy4vcGF0dGVybic7XG5cbi8qKlxuICogSGlnaGxpZ2h0IG3hu5l0IHThu6sga2jDs2EgdMOsbSBraeG6v20gYsOqbiB0cm9uZyBjaHXhu5dpIHbEg24gYuG6o24gYuG6sW5nIGPDoWNoIGLhu41jIHbDoG8gdGjhursgYDxzcGFuPmAuXG4gKiBI4buXIHRy4bujIHTDrG0ga2nhur9tIGtow7RuZyBwaMOibiBiaeG7h3QgZOG6pXUgKFVuaWNvZGUtaW5zZW5zaXRpdmUpIHbDoCBraMO0bmcgcGjDom4gYmnhu4d0IGhvYS90aMaw4budbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIENodeG7l2kgdsSDbiBi4bqjbiBn4buRYyBj4bqnbiBoaWdobGlnaHRcbiAqIEBwYXJhbSBzZWFyY2ggVOG7qyBraMOzYSBj4bqnbiB0w6xtIHbDoCBoaWdobGlnaHRcbiAqIEBwYXJhbSBpZ25vcmVIaWdobGlnaHQgTuG6v3UgYHRydWVgLCBi4buPIHF1YSBoaWdobGlnaHQgdsOgIHRy4bqjIHbhu4EgY2h14buXaSBn4buRY1xuICogQHBhcmFtIGNsYXNzSGlnaHRMaWdodCBDbGFzcyBDU1Mgw6FwIGThu6VuZyBjaG8gc3BhbiBoaWdobGlnaHQgKG3hurdjIMSR4buLbmg6ICdiZy1bIzE5MzQ0YV0gdGV4dC13aGl0ZScpXG4gKiBAcmV0dXJucyBDaHXhu5dpIEhUTUwgxJHDoyDEkcaw4bujYyBpbmplY3QgdGjhursgYDxzcGFuPmAgcXVhbmggdOG7qyBraMOzYVxuICovXG5leHBvcnQgY29uc3QgaGlnaGxpZ2h0QnlLZXl3b3JkID0gKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNlYXJjaDogc3RyaW5nIHwgdW5kZWZpbmVkLCBpZ25vcmVIaWdobGlnaHQ/OiBib29sZWFuLCBjbGFzc0hpZ2h0TGlnaHQ/OiBzdHJpbmcpID0+IHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBDSEFSQUNURVJfREFUQV9FTVBUWTtcbiAgfVxuICB0cnkge1xuICAgIGlmICghc2VhcmNoIHx8IGlnbm9yZUhpZ2hsaWdodCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBrZXlzUmVwbGFjZTogQXJyYXk8c3RyaW5nPiA9IGdldFZhbHVlUmVwbGFjZShzZWFyY2gsIHZhbHVlKTtcblxuICAgIGlmICgha2V5c1JlcGxhY2UgfHwgIWtleXNSZXBsYWNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoIWNsYXNzSGlnaHRMaWdodCkge1xuICAgICAgY2xhc3NIaWdodExpZ2h0ID0gJ2JnLVsjMTkzNDRhXSB0ZXh0LXdoaXRlJztcbiAgICB9XG4gICAga2V5c1JlcGxhY2UuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCByZWdFeHAgPSBuZXcgUmVnRXhwKGtleSwgJ2dpJyk7XG5cbiAgICAgIHZhbHVlID0gdmFsdWU/LnJlcGxhY2UocmVnRXhwLCBgPHNwYW4gY2xhc3M9XCIke2NsYXNzSGlnaHRMaWdodH1cIj4kJjwvc3Bhbj5gKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuc2FmZS1maW5hbGx5XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuXG5jb25zdCBnZXRWYWx1ZVJlcGxhY2UgPSAoc2VhcmNoOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IHNlYXJjaENvbnZlcnQgPSBkZWxldGVVbmljb2RlKHNlYXJjaCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgdmFsdWVDb252ZXJ0ID0gZGVsZXRlVW5pY29kZSh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qga2V5czogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIGxldCBpID0gMDtcblxuICB3aGlsZSAoKGkgPSB2YWx1ZUNvbnZlcnQuaW5kZXhPZihzZWFyY2hDb252ZXJ0LCBpKSkgPj0gMCkge1xuICAgIGNvbnN0IGVuZEluZGV4ID0gaSArIHNlYXJjaC5sZW5ndGg7XG5cbiAgICBrZXlzLmFkZCh2YWx1ZS5zdWJzdHJpbmcoaSwgZW5kSW5kZXgpKTtcbiAgICBpICs9ICt2YWx1ZUNvbnZlcnQubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20oa2V5cyk7XG59O1xuXG4vKipcbiAqIENodeG6qW4gaMOzYSBjaHXhu5dpIHbEg24gYuG6o24gdGhlbyBjaHXhuqluIFVuaWNvZGUgTkZDIHbDoCDDoXAgZOG7pW5nIGPDoWMgdMO5eSBjaOG7jW4gZm9ybWF0LlxuICogVGjGsOG7nW5nIGTDuW5nIMSR4buDIHNvIHPDoW5oIGNodeG7l2kgbmjhuqV0IHF1w6FuLCBraMO0bmcgcGjhu6UgdGh14buZYyB2w6BvIGPDoWNoIGfDtSBjw7MgZOG6pXUuXG4gKlxuICogQHBhcmFtIHRleHQgQ2h14buXaSBj4bqnbiBjaHXhuqluIGjDs2FcbiAqIEBwYXJhbSBvcHRpb25zIEPDoWMgdMO5eSBjaOG7jW4gdHJhbnNmb3JtICh0cmltLCByZW1vdmVFbW9qaSwgcmVtb3ZlVW5pY29kZS4uLilcbiAqIEByZXR1cm5zIENodeG7l2kgxJHDoyBjaHXhuqluIGjDs2FcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdFRleHRDb21wYXJlID0gKHRleHQ6IHN0cmluZywgb3B0aW9ucz86IElUZXh0Rm9ybWF0T3B0aW9ucykgPT4ge1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHRleHQgPSB0ZXh0Lm5vcm1hbGl6ZSgnTkZDJyk7XG5cbiAgcmV0dXJuIGZvcm1hdEJ5T3B0aW9ucyh0ZXh0LCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogxJDhu4tuaCBk4bqhbmcgaOG7jSB0w6puIMSR4bqneSDEkeG7pzogdmnhur90IGhvYSBjaOG7ryBjw6FpIMSR4bqndSBt4buXaSB04burLCB4w7NhIGtob+G6o25nIHRy4bqvbmcgdGjhu6thIHbDoCBlbW9qaS5cbiAqIEBwYXJhbSB2YWx1ZSBDaHXhu5dpIGjhu40gdMOqbiBj4bqnbiBmb3JtYXRcbiAqIEByZXR1cm5zIENodeG7l2kgxJHDoyDEkcaw4bujYyBjaHXhuqluIGjDs2FcbiAqIEBleGFtcGxlIGZ1bGxOYW1lRm9ybWF0KCcgIG5ndXnhu4VuIHbEg24gYSAgJykg4oaSICdOZ3V54buFbiBWxINuIEEnXG4gKi9cbmV4cG9ydCBjb25zdCBmdWxsTmFtZUZvcm1hdCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGNhcGl0YWxpemUodmFsdWUsIHsgbG93ZXJjYXNlT3RoZXJDaGFyYWN0ZXI6IHRydWUsIHRyaW06IHRydWUsIHJlbW92ZU11bHRpcGxlU3BhY2U6IHRydWUsIHJlbW92ZUVtb2ppOiB0cnVlIH0pO1xufTtcblxuLyoqXG4gKiBWaeG6v3QgaG9hIGNo4buvIGPDoWkgxJHhuqd1IHRpw6puIGPhu6dhIG3hu5dpIHThu6sgdHJvbmcgY2h14buXaS5cbiAqIEBwYXJhbSB0ZXh0IENodeG7l2kgY+G6p24gY2FwaXRhbGl6ZVxuICogQHBhcmFtIG9wdGlvbnMgVMO5eSBjaOG7jW4geOG7rSBsw70gdHLGsOG7m2MgKGxvd2VyY2FzZSwgdHJpbSwgcmVtb3ZlRW1vamkuLi4pXG4gKiBAcmV0dXJucyBDaHXhu5dpIMSRw6MgxJHGsOG7o2MgY2FwaXRhbGl6ZSB0aGVvIHThu6tuZyB04burXG4gKiBAZXhhbXBsZSBjYXBpdGFsaXplKCdoZWxsbyB3b3JsZCcpIOKGkiAnSGVsbG8gV29ybGQnXG4gKi9cbmV4cG9ydCBjb25zdCBjYXBpdGFsaXplID0gKHRleHQ6IHN0cmluZywgb3B0aW9ucz86IElUZXh0Rm9ybWF0T3B0aW9ucykgPT4ge1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuICB0ZXh0ID0gZm9ybWF0QnlPcHRpb25zKHRleHQsIG9wdGlvbnMpO1xuICByZXR1cm4gdGV4dFxuICAgIC5zcGxpdCgnICcpXG4gICAgLm1hcCgod29yZCkgPT4gZmlyc3RMZXR0ZXJUb1VwcGVyQ2FzZSh3b3JkKSlcbiAgICAuam9pbignICcpO1xufTtcblxuLyoqXG4gKiBWaeG6v3QgaG9hIGNo4buvIGPDoWkgxJHhuqd1IHRpw6puIGPhu6dhIGNodeG7l2kuXG4gKiBAcGFyYW0gdGV4dCBDaHXhu5dpIGPhuqduIHjhu60gbMO9XG4gKiBAcGFyYW0gb3B0aW9ucyBUw7l5IGNo4buNbiBmb3JtYXQgYuG7lSBzdW5nXG4gKiBAcmV0dXJucyBDaHXhu5dpIHbhu5tpIGNo4buvIGPDoWkgxJHhuqd1IHRpw6puIMSRxrDhu6NjIHZp4bq/dCBob2FcbiAqIEBleGFtcGxlIGZpcnN0TGV0dGVyVG9VcHBlckNhc2UoJ2hlbGxvJykg4oaSICdIZWxsbydcbiAqL1xuZXhwb3J0IGNvbnN0IGZpcnN0TGV0dGVyVG9VcHBlckNhc2UgPSAodGV4dDogc3RyaW5nLCBvcHRpb25zPzogSVRleHRGb3JtYXRPcHRpb25zKSA9PiB7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIHJldHVybiB1cHBlcmNhc2VCeVBvc2l0aW9uKHRleHQsIDAsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBWaeG6v3QgaG9hIG3hu5l0IGvDvSB04buxIHThuqFpIHbhu4sgdHLDrSBi4bqldCBr4buzIHRyb25nIGNodeG7l2kuXG4gKiBAcGFyYW0gdGV4dCBDaHXhu5dpIGPhuqduIHjhu60gbMO9XG4gKiBAcGFyYW0gcG9zaXRpb24gVuG7iyB0csOtIGvDvSB04buxIGPhuqduIHZp4bq/dCBob2EgKDAtaW5kZXhlZClcbiAqIEBwYXJhbSBvcHRpb25zIFTDuXkgY2jhu41uIGZvcm1hdCBi4buVIHN1bmdcbiAqIEByZXR1cm5zIENodeG7l2kgduG7m2kga8O9IHThu7EgdOG6oWkgduG7iyB0csOtIMSRxrDhu6NjIHZp4bq/dCBob2FcbiAqL1xuZXhwb3J0IGNvbnN0IHVwcGVyY2FzZUJ5UG9zaXRpb24gPSAodGV4dDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyLCBvcHRpb25zPzogSVRleHRGb3JtYXRPcHRpb25zKSA9PiB7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIHRleHQgPSBmb3JtYXRCeU9wdGlvbnModGV4dCwgb3B0aW9ucyk7XG4gIHJldHVybiBgJHt0ZXh0LnN1YnN0cmluZygwLCBwb3NpdGlvbil9JHt0ZXh0LmNoYXJBdChwb3NpdGlvbikudG9VcHBlckNhc2UoKX0ke3RleHQuc3Vic3RyaW5nKHBvc2l0aW9uICsgMSl9YDtcbn07XG5cbmNvbnN0IGZvcm1hdEJ5T3B0aW9ucyA9ICh0ZXh0OiBzdHJpbmcsIG9wdGlvbnM/OiBJVGV4dEZvcm1hdE9wdGlvbnMpID0+IHtcbiAgaWYgKCF0ZXh0IHx8ICFvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgaWYgKG9wdGlvbnM/LnVwcGVyY2FzZU90aGVyQ2hhcmFjdGVyKSB7XG4gICAgdGV4dCA9IHRleHQudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5sb3dlcmNhc2VPdGhlckNoYXJhY3Rlcikge1xuICAgIHRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8ucmVtb3ZlTXVsdGlwbGVTcGFjZSkge1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcdTIwMEJ8XFx1MDBBMC9nLCAnJyk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnM/LnJlbW92ZUVtb2ppKSB7XG4gICAgdGV4dCA9IHJlbW92ZUVtb2ppKHRleHQpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnM/LnJlbW92ZVVuaWNvZGUpIHtcbiAgICB0ZXh0ID0gZGVsZXRlVW5pY29kZSh0ZXh0KTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy50cmltKSB7XG4gICAgdGV4dCA9IHRleHQudHJpbSgpO1xuICB9XG5cbiAgcmV0dXJuIHRleHQ7XG59O1xuXG4vKipcbiAqIEVzY2FwZSBjw6FjIGvDvSB04buxIMSR4bq3YyBiaeG7h3QgSFRNTCB0aMOgbmggSFRNTCBlbnRpdGllcyDEkeG7gyB0csOhbmggWFNTLlxuICogQHBhcmFtIHN0ciBDaHXhu5dpIGPhuqduIGVzY2FwZVxuICogQHJldHVybnMgQ2h14buXaSBhbiB0b8OgbiAoJiDihpIgJmFtcDssIDwg4oaSICZsdDssID4g4oaSICZndDssIFwiIOKGkiAmcXVvdDssICcg4oaSICYjMDM5OylcbiAqIEBleGFtcGxlIGVzY2FwZUh0bWwoJzxzY3JpcHQ+Jykg4oaSICcmbHQ7c2NyaXB0Jmd0OydcbiAqL1xuZXhwb3J0IGNvbnN0IGVzY2FwZUh0bWwgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXN0ciB8fCB0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICByZXR1cm4gc3RyLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JykucmVwbGFjZSgvJy9nLCAnJiMwMzk7Jyk7XG59O1xuXG4vKipcbiAqIEdp4bqjaSBtw6MgY2h14buXaSBIVE1MIGVudGl0aWVzIHbhu4EgZOG6oW5nIGvDvSB04buxIGfhu5FjLlxuICogU+G7rSBk4bulbmcgdGjhursgdGV4dGFyZWEgxJHhu4MgZ2nhuqNpIG3DoyBhbiB0b8OgbiwgaOG7lyB0cuG7oyBtdWx0aS1sZXZlbCBlbmNvZGluZy5cbiAqIEBwYXJhbSBzdHIgQ2h14buXaSBIVE1MIGVuY29kZWQgY+G6p24gZ2nhuqNpIG3Do1xuICogQHJldHVybnMgQ2h14buXaSBn4buRYyBzYXUga2hpIGRlY29kZVxuICogQGV4YW1wbGUgZGVjb2RlRXNjYXBlSHRtbCgnJmx0O2ImZ3Q7Jykg4oaSICc8Yj4nXG4gKi9cbmV4cG9ydCBjb25zdCBkZWNvZGVFc2NhcGVIdG1sID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgaHRtbFRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG5cbiAgaHRtbFRhZy5pbm5lckhUTUwgPSBzdHI7XG4gIHdoaWxlIChzdHIpIHtcbiAgICBpZiAoc3RyID09PSBodG1sVGFnLnZhbHVlKSB7XG4gICAgICBzdHIgPSBodG1sVGFnLnZhbHVlO1xuICAgICAgaHRtbFRhZy5yZW1vdmUoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzdHIgPSBodG1sVGFnLnZhbHVlO1xuICAgIGh0bWxUYWcuaW5uZXJIVE1MID0gc3RyO1xuICB9XG5cbiAgcmV0dXJuIHN0cjtcbn07XG5cbi8qKlxuICogWMOzYSBk4bqldSB0aeG6v25nIFZp4buHdCBraOG7j2kgY2h14buXaSwgY2h1eeG7g24gdOG6pXQgY+G6oyBrw70gdOG7sSBjw7MgZOG6pXUgduG7gSBk4bqhbmcgTGF0aW4gY8ahIGLhuqNuLlxuICogSOG7lyB0cuG7oyBj4bqjIGNo4buvIHRoxrDhu51uZyBs4bqrbiBob2EuXG4gKiBAcGFyYW0gc3RyIENodeG7l2kgdGnhur9uZyBWaeG7h3QgY+G6p24geMOzYSBk4bqldVxuICogQHJldHVybnMgQ2h14buXaSDEkcOjIHjDs2EgZOG6pXUgKHZkOiAnTmd1eeG7hW4gVsSDbiBBbicg4oaSICdOZ3V5ZW4gVmFuIEFuJylcbiAqL1xuZXhwb3J0IGNvbnN0IGRlbGV0ZVVuaWNvZGUgPSAoc3RyOiBzdHJpbmcpID0+IHtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8OgfMOhfOG6oXzhuqN8w6N8w6J84bqnfOG6pXzhuq184bqpfOG6q3zEg3zhurF84bqvfOG6t3zhurN84bq1L2csICdhJyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/DqHzDqXzhurl84bq7fOG6vXzDqnzhu4F84bq/fOG7h3zhu4N84buFfOG7hS9nLCAnZScpO1xuICBzdHIgPSBzdHIucmVwbGFjZSgvw6x8w6184buLfOG7iXzEqS9nLCAnaScpO1xuICBzdHIgPSBzdHIucmVwbGFjZSgvw7J8w7N84buNfOG7j3zDtXzDtHzhu5N84buRfOG7mXzhu5V84buXfMahfOG7nXzhu5t84bujfOG7n3zhu6EvZywgJ28nKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8O5fMO6fOG7pXzhu6d8xal8xrB84burfOG7qXzhu7F84butfOG7ry9nLCAndScpO1xuICBzdHIgPSBzdHIucmVwbGFjZSgv4buzfMO9fOG7tXzhu7d84bu5L2csICd5Jyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/EkS9nLCAnZCcpO1xuICBzdHIgPSBzdHIucmVwbGFjZSgvw4B8w4F84bqgfOG6onzDg3zDgnzhuqZ84bqkfOG6rHzhuqh84bqqfMSCfOG6sHzhuq584bq2fOG6snzhurQvZywgJ0EnKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8OIfMOJfOG6uHzhurp84bq8fMOKfOG7gHzhur584buGfOG7gnzhu4QvZywgJ0UnKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8OMfMONfOG7inzhu4h8xKgvZywgJ0knKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8OSfMOTfOG7jHzhu458w5V8w5R84buSfOG7kHzhu5h84buUfOG7lnzGoHzhu5x84buafOG7onzhu5584bugL2csICdPJyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/DmXzDmnzhu6R84bumfMWofMavfOG7qnzhu6h84buwfOG7rHzhu64vZywgJ1UnKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL+G7snzDnXzhu7R84bu2fOG7uC9nLCAnWScpO1xuICBzdHIgPSBzdHIucmVwbGFjZSgvxJAvZywgJ0QnKTtcblxuICBzdHIgPSBzdHIucmVwbGFjZSgvXFx1MDMwMHxcXHUwMzAxfFxcdTAzMDN8XFx1MDMwOXxcXHUwMzIzL2csICcnKTsgLy8gzIAgzIEgzIMgzIkgzKMgIGh1eeG7gW4sIHPhuq9jLCBuZ8OjLCBo4buPaSwgbuG6t25nXG4gIHN0ciA9IHN0ci5yZXBsYWNlKC9cXHUwMkM2fFxcdTAzMDZ8XFx1MDMxQi9nLCAnJyk7IC8vIMuGIMyGIMybICDDgiwgw4osIMSCLCDGoCwgxq9cblxuICByZXR1cm4gc3RyLm5vcm1hbGl6ZSgnTkZDJyk7XG59O1xuXG4vKipcbiAqIFjDs2EgdOG6pXQgY+G6oyBlbW9qaSBraOG7j2kgY2h14buXaSB2xINuIGLhuqNuLlxuICogU+G7rSBk4bulbmcgcGF0dGVybiByZWdleCB04burIGBwYXR0ZXJuRW1vamkoKWAgxJHhu4Mgbmjhuq1uIGRp4buHbiB0b8OgbiBi4buZIGVtb2ppIFVuaWNvZGUuXG4gKiBAcGFyYW0gdGV4dCBDaHXhu5dpIGPhuqduIHjDs2EgZW1vamlcbiAqIEByZXR1cm5zIENodeG7l2kgxJHDoyDEkcaw4bujYyB4w7NhIGVtb2ppXG4gKiBAZXhhbXBsZSByZW1vdmVFbW9qaSgnSGVsbG8g8J+YgCBXb3JsZCDwn46JJykg4oaSICdIZWxsbyAgV29ybGQgJ1xuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlRW1vamkgPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gIGlmICghdGV4dCB8fCAhdGV4dC50cmltKCkpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHJldHVybiB0ZXh0LnJlcGxhY2UocGF0dGVybkVtb2ppKCksICcnKTtcbn07XG4iXX0=
@@ -1,11 +1,38 @@
1
1
  //NOTE: Do là function truyền từ bên ngoài vào nên sẽ không có unit test
2
+ /**
3
+ * Hàm kiểm tra mặc định — phát hiện ứng dụng đang chạy trong iframe/embed frame
4
+ * bằng cách so sánh `window.parent` với `window.top`.
5
+ * Có thể bị ghi đè bởi `updateFunctionCheckEmbedFrame` cho môi trường tùy chỉnh.
6
+ */
2
7
  let functionCheck = () => {
3
8
  return window.parent !== window.top;
4
9
  };
10
+ /**
11
+ * Ghi đè hàm kiểm tra embed frame bằng một hàm logic tùy chỉnh.
12
+ * Hữu ích trong môi trường Micro-frontend hoặc khi cần mock cho testing.
13
+ *
14
+ * @param functionCustom Hàm trả về `true` nếu app đang chạy trong iframe/embed frame
15
+ * @example
16
+ * // Micro-frontend: luôn coi là embed
17
+ * updateFunctionCheckEmbedFrame(() => true);
18
+ *
19
+ * // Testing: luôn coi là không embed
20
+ * updateFunctionCheckEmbedFrame(() => false);
21
+ */
5
22
  export const updateFunctionCheckEmbedFrame = (functionCustom) => {
6
23
  functionCheck = functionCustom;
7
24
  };
25
+ /**
26
+ * Kiểm tra ứng dụng hiện tại có đang được nhúng trong iframe/embed frame hay không.
27
+ * Sử dụng hàm logic đang được đăng ký (mặc định hoặc custom).
28
+ *
29
+ * @returns `true` nếu app đang chạy trong iframe/embed, `false` nếu đang chạy standalone
30
+ * @example
31
+ * if (isEmbedFrame()) {
32
+ * // Ẩn header, sidebar vì đã có container bên ngoài quản lý
33
+ * }
34
+ */
8
35
  export const isEmbedFrame = () => {
9
36
  return functionCheck();
10
37
  };
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tY2hlY2stZW1iZWQtZnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9mdW5jdGlvbi1jaGVjay1lbWJlZC1mcmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3RUFBd0U7QUFDeEUsSUFBSSxhQUFhLEdBQUcsR0FBRyxFQUFFO0lBQ3ZCLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQ3RDLENBQUMsQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLENBQUMsY0FBNkIsRUFBRSxFQUFFO0lBQzdFLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFDakMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEdBQVksRUFBRTtJQUN4QyxPQUFPLGFBQWEsRUFBRSxDQUFDO0FBQ3pCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vTk9URTogRG8gbMOgIGZ1bmN0aW9uIHRydXnhu4FuIHThu6sgYsOqbiBuZ2/DoGkgdsOgbyBuw6puIHPhur0ga2jDtG5nIGPDsyB1bml0IHRlc3RcbmxldCBmdW5jdGlvbkNoZWNrID0gKCkgPT4ge1xuICByZXR1cm4gd2luZG93LnBhcmVudCAhPT0gd2luZG93LnRvcDtcbn07XG5leHBvcnQgY29uc3QgdXBkYXRlRnVuY3Rpb25DaGVja0VtYmVkRnJhbWUgPSAoZnVuY3Rpb25DdXN0b206ICgpID0+IGJvb2xlYW4pID0+IHtcbiAgZnVuY3Rpb25DaGVjayA9IGZ1bmN0aW9uQ3VzdG9tO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRW1iZWRGcmFtZSA9ICgpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uQ2hlY2soKTtcbn07XG4iXX0=
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tY2hlY2stZW1iZWQtZnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9mdW5jdGlvbi1jaGVjay1lbWJlZC1mcmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3RUFBd0U7QUFFeEU7Ozs7R0FJRztBQUNILElBQUksYUFBYSxHQUFHLEdBQUcsRUFBRTtJQUN2QixPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLENBQUMsY0FBNkIsRUFBRSxFQUFFO0lBQzdFLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFDakMsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEdBQVksRUFBRTtJQUN4QyxPQUFPLGFBQWEsRUFBRSxDQUFDO0FBQ3pCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vTk9URTogRG8gbMOgIGZ1bmN0aW9uIHRydXnhu4FuIHThu6sgYsOqbiBuZ2/DoGkgdsOgbyBuw6puIHPhur0ga2jDtG5nIGPDsyB1bml0IHRlc3RcblxuLyoqXG4gKiBIw6BtIGtp4buDbSB0cmEgbeG6t2MgxJHhu4tuaCDigJQgcGjDoXQgaGnhu4duIOG7qW5nIGThu6VuZyDEkWFuZyBjaOG6oXkgdHJvbmcgaWZyYW1lL2VtYmVkIGZyYW1lXG4gKiBi4bqxbmcgY8OhY2ggc28gc8OhbmggYHdpbmRvdy5wYXJlbnRgIHbhu5tpIGB3aW5kb3cudG9wYC5cbiAqIEPDsyB0aOG7gyBi4buLIGdoaSDEkcOoIGLhu59pIGB1cGRhdGVGdW5jdGlvbkNoZWNrRW1iZWRGcmFtZWAgY2hvIG3DtGkgdHLGsOG7nW5nIHTDuXkgY2jhu4luaC5cbiAqL1xubGV0IGZ1bmN0aW9uQ2hlY2sgPSAoKSA9PiB7XG4gIHJldHVybiB3aW5kb3cucGFyZW50ICE9PSB3aW5kb3cudG9wO1xufTtcblxuLyoqXG4gKiBHaGkgxJHDqCBow6BtIGtp4buDbSB0cmEgZW1iZWQgZnJhbWUgYuG6sW5nIG3hu5l0IGjDoG0gbG9naWMgdMO5eSBjaOG7iW5oLlxuICogSOG7r3Ugw61jaCB0cm9uZyBtw7RpIHRyxrDhu51uZyBNaWNyby1mcm9udGVuZCBob+G6t2Mga2hpIGPhuqduIG1vY2sgY2hvIHRlc3RpbmcuXG4gKlxuICogQHBhcmFtIGZ1bmN0aW9uQ3VzdG9tIEjDoG0gdHLhuqMgduG7gSBgdHJ1ZWAgbuG6v3UgYXBwIMSRYW5nIGNo4bqheSB0cm9uZyBpZnJhbWUvZW1iZWQgZnJhbWVcbiAqIEBleGFtcGxlXG4gKiAvLyBNaWNyby1mcm9udGVuZDogbHXDtG4gY29pIGzDoCBlbWJlZFxuICogdXBkYXRlRnVuY3Rpb25DaGVja0VtYmVkRnJhbWUoKCkgPT4gdHJ1ZSk7XG4gKlxuICogLy8gVGVzdGluZzogbHXDtG4gY29pIGzDoCBraMO0bmcgZW1iZWRcbiAqIHVwZGF0ZUZ1bmN0aW9uQ2hlY2tFbWJlZEZyYW1lKCgpID0+IGZhbHNlKTtcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUZ1bmN0aW9uQ2hlY2tFbWJlZEZyYW1lID0gKGZ1bmN0aW9uQ3VzdG9tOiAoKSA9PiBib29sZWFuKSA9PiB7XG4gIGZ1bmN0aW9uQ2hlY2sgPSBmdW5jdGlvbkN1c3RvbTtcbn07XG5cbi8qKlxuICogS2nhu4NtIHRyYSDhu6luZyBk4bulbmcgaGnhu4duIHThuqFpIGPDsyDEkWFuZyDEkcaw4bujYyBuaMO6bmcgdHJvbmcgaWZyYW1lL2VtYmVkIGZyYW1lIGhheSBraMO0bmcuXG4gKiBT4butIGThu6VuZyBow6BtIGxvZ2ljIMSRYW5nIMSRxrDhu6NjIMSRxINuZyBrw70gKG3hurdjIMSR4buLbmggaG/hurdjIGN1c3RvbSkuXG4gKlxuICogQHJldHVybnMgYHRydWVgIG7hur91IGFwcCDEkWFuZyBjaOG6oXkgdHJvbmcgaWZyYW1lL2VtYmVkLCBgZmFsc2VgIG7hur91IMSRYW5nIGNo4bqheSBzdGFuZGFsb25lXG4gKiBAZXhhbXBsZVxuICogaWYgKGlzRW1iZWRGcmFtZSgpKSB7XG4gKiAgIC8vIOG6qG4gaGVhZGVyLCBzaWRlYmFyIHbDrCDEkcOjIGPDsyBjb250YWluZXIgYsOqbiBuZ2/DoGkgcXXhuqNuIGzDvVxuICogfVxuICovXG5leHBvcnQgY29uc3QgaXNFbWJlZEZyYW1lID0gKCk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gZnVuY3Rpb25DaGVjaygpO1xufTtcbiJdfQ==
@@ -1,62 +1,142 @@
1
1
  /* eslint-disable no-useless-escape */
2
+ /**
3
+ * Returns regex for email validation
4
+ * @returns {RegExp}
5
+ */
2
6
  export const patternEmail = () => {
3
7
  return /^[A-z0-9]+[A-z0-9\_\.\+\-]*[A-z0-9]@[A-z0-9]+[A-z0-9\_\.\+\-]*[A-z0-9]\.[A-z0-9]+[A-z0-9\_\.\+\-]*[A-z0-9]$/;
4
8
  };
5
- export const patterProtocolUrl = () => {
9
+ /**
10
+ * Returns regex for protocol in URL (http, https, ftp)
11
+ * @returns {RegExp}
12
+ */
13
+ export const patternProtocolUrl = () => {
6
14
  return /(http|https|ftp):/;
7
15
  };
16
+ /**
17
+ * Returns regex for full URL validation
18
+ * @returns {RegExp}
19
+ */
8
20
  export const patternUrl = () => {
9
21
  return /^(http|https|ftp):(\/){2}[^\s]+[.]{1}[^\s]+$/;
10
22
  };
23
+ /**
24
+ * Returns regex for host part of URL
25
+ * @returns {RegExp}
26
+ */
11
27
  export const patternHostUrl = () => {
12
28
  return /^((https|http|ftp):[/]{2}[^/\s]+)/;
13
29
  };
30
+ /**
31
+ * Returns regex for domain validation
32
+ * @returns {RegExp}
33
+ */
14
34
  export const patternDomain = () => {
15
- return /^([a-zA-Z0-9])(([a-z0-9-]{1,61})?[a-z0-9]{1})?(\.[a-z0-9](([a-z0-9-]{1,61})?[a-z0-9]{1})?)?(\.[a-zA-Z]{2,4})+$/;
35
+ return /^([a-zA-Z0-9])(([a-z0-9-]{1,61})?[a-z0-9]{1})?(\.[a-z0-9](([a-z0-9-]{1,61})?[a-z0-9]{1})?)?(\.[a-zA-Z]{2,})+$/;
16
36
  };
37
+ /**
38
+ * Returns regex for Vietnamese mobile phone validation
39
+ * @returns {RegExp}
40
+ */
17
41
  export const patternMobilePhone = () => {
18
42
  return /^(\+?84|0|84)([0-9]{9})$/;
19
43
  };
44
+ /**
45
+ * Returns regex for general phone number validation
46
+ * @returns {RegExp}
47
+ */
20
48
  export const patternPhone = () => {
21
49
  return /^(\+?84|[0-9]|84)([0-9]{2,9})$/;
22
50
  };
51
+ /**
52
+ * Returns regex for digits
53
+ * @returns {RegExp}
54
+ */
23
55
  export const patternNumber = () => {
24
56
  return /\d+/g;
25
57
  };
58
+ /**
59
+ * Returns regex for encoded URI characters
60
+ * @returns {RegExp}
61
+ */
26
62
  export const patternEncodeUri = () => {
27
63
  return /%([0-9A-F]{2})/g;
28
64
  };
65
+ /**
66
+ * Returns regex for standard name (alphanumeric and spaces)
67
+ * @returns {RegExp}
68
+ */
29
69
  export const patternName = () => {
30
70
  return /^\w+[A-Za-z\s\d]+$/;
31
71
  };
72
+ /**
73
+ * Returns regex for UTF-8 name (including Vietnamese characters)
74
+ * @returns {RegExp}
75
+ */
32
76
  export const patternNameUtf8 = () => {
33
77
  return /^[ àáảãạăắằẵặẳâầấậẫẩđèéẻẽẹêềếểễệìíỉĩịòóỏõọôồốổỗộơờớởỡợùúủũụưừứửữựỳýỷỹÀÁẢÃẠĂẮẰẴẶẲÂẦẤẬẪẨĐÈÉẺẼẸÊỀẾỂỄỆÌÍỈĨỊÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢÙÚỦŨỤƯỪỨỬỮỰỲÝỶỸA-Za-z0-9]+$/;
34
78
  };
79
+ /**
80
+ * Returns regex for special characters in name
81
+ * @returns {RegExp}
82
+ */
35
83
  export const patternNameSpecial = () => {
36
84
  return /[~!@#$%^&*()-+=<>,?\/\\:;"']/;
37
85
  };
86
+ /**
87
+ * Returns regex for profile name
88
+ * @returns {RegExp}
89
+ */
38
90
  export const patternNameProfile = () => {
39
91
  return /([\w\W\d\s]+)+/;
40
92
  };
93
+ /**
94
+ * Returns regex for emojis
95
+ * @returns {RegExp}
96
+ */
41
97
  export const patternEmoji = () => {
42
98
  return /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/g;
43
99
  };
100
+ /**
101
+ * Returns regex for matching field replacement markers (e.g. {{field}})
102
+ * @returns {RegExp}
103
+ */
44
104
  export const patternRuleFieldReplace = () => {
45
105
  return /[{]{2}[a-zA-Z_-]+[}]{2}/g;
46
106
  };
107
+ /**
108
+ * Returns regex for extracting field name from replacement markers
109
+ * @returns {RegExp}
110
+ */
47
111
  export const patternGetFieldByRuleFieldReplace = () => {
48
112
  return /[a-zA-Z_-]+/g;
49
113
  };
114
+ /**
115
+ * Returns regex for PEM format validation
116
+ * @returns {RegExp}
117
+ */
50
118
  export const patternPem = () => {
51
119
  return /^(0|1):([0-9]{1,2}):(\{\{path-api\}\}):([a-zA-Z0-9\/]+)$/g;
52
120
  };
121
+ /**
122
+ * Returns regex for tax ID validation
123
+ * @returns {RegExp}
124
+ */
53
125
  export const patternTax = () => {
54
126
  return /^([0-9]){10}(-[0-9]{3})?$/;
55
127
  };
128
+ /**
129
+ * Returns regex for key validation (identical to tax regex)
130
+ * @returns {RegExp}
131
+ */
56
132
  export const patternKey = () => {
57
133
  return /^([0-9]){10}(-[0-9]{3})?$/;
58
134
  };
135
+ /**
136
+ * Returns regex for account validation (must contain @)
137
+ * @returns {RegExp}
138
+ */
59
139
  export const patternAccount = () => {
60
140
  return /^(?=.*@)[a-z0-9@._-]{2,63}$/;
61
141
  };
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0dGVybi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL3BhdHRlcm4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0NBQXNDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxHQUFHLEVBQUU7SUFDL0IsT0FBTyw2R0FBNkcsQ0FBQztBQUN2SCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLEVBQUU7SUFDcEMsT0FBTyxtQkFBbUIsQ0FBQztBQUM3QixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO0lBQzdCLE9BQU8sOENBQThDLENBQUM7QUFDeEQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEdBQUcsRUFBRTtJQUNqQyxPQUFPLG1DQUFtQyxDQUFDO0FBQzdDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7SUFDaEMsT0FBTyxnSEFBZ0gsQ0FBQztBQUMxSCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLEVBQUU7SUFDckMsT0FBTywwQkFBMEIsQ0FBQztBQUNwQyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFO0lBQy9CLE9BQU8sZ0NBQWdDLENBQUM7QUFDMUMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRTtJQUNoQyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUU7SUFDbkMsT0FBTyxpQkFBaUIsQ0FBQztBQUMzQixDQUFDLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsR0FBRyxFQUFFO0lBQzlCLE9BQU8sb0JBQW9CLENBQUM7QUFDOUIsQ0FBQyxDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEdBQUcsRUFBRTtJQUNsQyxPQUFPLHFKQUFxSixDQUFDO0FBQy9KLENBQUMsQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsRUFBRTtJQUNyQyxPQUFPLDhCQUE4QixDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsRUFBRTtJQUNyQyxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUMsQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxHQUFHLEVBQUU7SUFDL0IsT0FBTyxvR0FBb0csQ0FBQztBQUM5RyxDQUFDLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLEVBQUU7SUFDMUMsT0FBTywwQkFBMEIsQ0FBQztBQUNwQyxDQUFDLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxHQUFHLEVBQUU7SUFDcEQsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRTtJQUM3QixPQUFPLDJEQUEyRCxDQUFDO0FBQ3JFLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxHQUFHLEVBQUU7SUFDN0IsT0FBTywyQkFBMkIsQ0FBQztBQUNyQyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO0lBQzdCLE9BQU8sMkJBQTJCLENBQUM7QUFDckMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEdBQUcsRUFBRTtJQUNqQyxPQUFPLDZCQUE2QixDQUFDO0FBQ3ZDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZWxlc3MtZXNjYXBlICovXG5leHBvcnQgY29uc3QgcGF0dGVybkVtYWlsID0gKCkgPT4ge1xuICByZXR1cm4gL15bQS16MC05XStbQS16MC05XFxfXFwuXFwrXFwtXSpbQS16MC05XUBbQS16MC05XStbQS16MC05XFxfXFwuXFwrXFwtXSpbQS16MC05XVxcLltBLXowLTldK1tBLXowLTlcXF9cXC5cXCtcXC1dKltBLXowLTldJC87XG59O1xuXG5leHBvcnQgY29uc3QgcGF0dGVyUHJvdG9jb2xVcmwgPSAoKSA9PiB7XG4gIHJldHVybiAvKGh0dHB8aHR0cHN8ZnRwKTovO1xufTtcblxuZXhwb3J0IGNvbnN0IHBhdHRlcm5VcmwgPSAoKSA9PiB7XG4gIHJldHVybiAvXihodHRwfGh0dHBzfGZ0cCk6KFxcLyl7Mn1bXlxcc10rWy5dezF9W15cXHNdKyQvO1xufTtcblxuZXhwb3J0IGNvbnN0IHBhdHRlcm5Ib3N0VXJsID0gKCkgPT4ge1xuICByZXR1cm4gL14oKGh0dHBzfGh0dHB8ZnRwKTpbL117Mn1bXi9cXHNdKykvO1xufTtcblxuZXhwb3J0IGNvbnN0IHBhdHRlcm5Eb21haW4gPSAoKSA9PiB7XG4gIHJldHVybiAvXihbYS16QS1aMC05XSkoKFthLXowLTktXXsxLDYxfSk/W2EtejAtOV17MX0pPyhcXC5bYS16MC05XSgoW2EtejAtOS1dezEsNjF9KT9bYS16MC05XXsxfSk/KT8oXFwuW2EtekEtWl17Miw0fSkrJC87XG59O1xuXG5leHBvcnQgY29uc3QgcGF0dGVybk1vYmlsZVBob25lID0gKCkgPT4ge1xuICByZXR1cm4gL14oXFwrPzg0fDB8ODQpKFswLTldezl9KSQvO1xufTtcblxuZXhwb3J0IGNvbnN0IHBhdHRlcm5QaG9uZSA9ICgpID0+IHtcbiAgcmV0dXJuIC9eKFxcKz84NHxbMC05XXw4NCkoWzAtOV17Miw5fSkkLztcbn07XG5cbmV4cG9ydCBjb25zdCBwYXR0ZXJuTnVtYmVyID0gKCkgPT4ge1xuICByZXR1cm4gL1xcZCsvZztcbn07XG5leHBvcnQgY29uc3QgcGF0dGVybkVuY29kZVVyaSA9ICgpID0+IHtcbiAgcmV0dXJuIC8lKFswLTlBLUZdezJ9KS9nO1xufTtcbmV4cG9ydCBjb25zdCBwYXR0ZXJuTmFtZSA9ICgpID0+IHtcbiAgcmV0dXJuIC9eXFx3K1tBLVphLXpcXHNcXGRdKyQvO1xufTtcbmV4cG9ydCBjb25zdCBwYXR0ZXJuTmFtZVV0ZjggPSAoKSA9PiB7XG4gIHJldHVybiAvXlsgw6DDoeG6o8Oj4bqhxIPhuq/hurHhurXhurfhurPDouG6p+G6peG6reG6q+G6qcSRw6jDqeG6u+G6veG6ucOq4buB4bq/4buD4buF4buHw6zDreG7icSp4buLw7LDs+G7j8O14buNw7Thu5Phu5Hhu5Xhu5fhu5nGoeG7neG7m+G7n+G7oeG7o8O5w7rhu6fFqeG7pcaw4bur4bup4but4buv4bux4buzw73hu7fhu7nDgMOB4bqiw4PhuqDEguG6ruG6sOG6tOG6tuG6ssOC4bqm4bqk4bqs4bqq4bqoxJDDiMOJ4bq64bq84bq4w4rhu4Dhur7hu4Lhu4Thu4bDjMON4buIxKjhu4rDksOT4buOw5Xhu4zDlOG7kuG7kOG7lOG7luG7mMag4buc4bua4bue4bug4buiw5nDmuG7psWo4bukxq/hu6rhu6jhu6zhu67hu7Dhu7LDneG7tuG7uEEtWmEtejAtOV0rJC87XG59O1xuZXhwb3J0IGNvbnN0IHBhdHRlcm5OYW1lU3BlY2lhbCA9ICgpID0+IHtcbiAgcmV0dXJuIC9bfiFAIyQlXiYqKCktKz08Piw/XFwvXFxcXDo7XCInXS87XG59O1xuZXhwb3J0IGNvbnN0IHBhdHRlcm5OYW1lUHJvZmlsZSA9ICgpID0+IHtcbiAgcmV0dXJuIC8oW1xcd1xcV1xcZFxcc10rKSsvO1xufTtcbmV4cG9ydCBjb25zdCBwYXR0ZXJuRW1vamkgPSAoKSA9PiB7XG4gIHJldHVybiAvKFxcdTAwYTl8XFx1MDBhZXxbXFx1MjAwMC1cXHUzMzAwXXxcXHVkODNjW1xcdWQwMDAtXFx1ZGZmZl18XFx1ZDgzZFtcXHVkMDAwLVxcdWRmZmZdfFxcdWQ4M2VbXFx1ZDAwMC1cXHVkZmZmXSkvZztcbn07XG5leHBvcnQgY29uc3QgcGF0dGVyblJ1bGVGaWVsZFJlcGxhY2UgPSAoKSA9PiB7XG4gIHJldHVybiAvW3tdezJ9W2EtekEtWl8tXStbfV17Mn0vZztcbn07XG5leHBvcnQgY29uc3QgcGF0dGVybkdldEZpZWxkQnlSdWxlRmllbGRSZXBsYWNlID0gKCkgPT4ge1xuICByZXR1cm4gL1thLXpBLVpfLV0rL2c7XG59O1xuXG5leHBvcnQgY29uc3QgcGF0dGVyblBlbSA9ICgpID0+IHtcbiAgcmV0dXJuIC9eKDB8MSk6KFswLTldezEsMn0pOihcXHtcXHtwYXRoLWFwaVxcfVxcfSk6KFthLXpBLVowLTlcXC9dKykkL2c7XG59O1xuXG5leHBvcnQgY29uc3QgcGF0dGVyblRheCA9ICgpID0+IHtcbiAgcmV0dXJuIC9eKFswLTldKXsxMH0oLVswLTldezN9KT8kLztcbn07XG5cbmV4cG9ydCBjb25zdCBwYXR0ZXJuS2V5ID0gKCkgPT4ge1xuICByZXR1cm4gL14oWzAtOV0pezEwfSgtWzAtOV17M30pPyQvO1xufTtcblxuZXhwb3J0IGNvbnN0IHBhdHRlcm5BY2NvdW50ID0gKCkgPT4ge1xuICByZXR1cm4gL14oPz0uKkApW2EtejAtOUAuXy1dezIsNjN9JC87XG59O1xuIl19
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0dGVybi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL3BhdHRlcm4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0NBQXNDO0FBRXRDOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxHQUFHLEVBQUU7SUFDL0IsT0FBTyw2R0FBNkcsQ0FBQztBQUN2SCxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLEVBQUU7SUFDckMsT0FBTyxtQkFBbUIsQ0FBQztBQUM3QixDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO0lBQzdCLE9BQU8sOENBQThDLENBQUM7QUFDeEQsQ0FBQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEdBQUcsRUFBRTtJQUNqQyxPQUFPLG1DQUFtQyxDQUFDO0FBQzdDLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7SUFDaEMsT0FBTywrR0FBK0csQ0FBQztBQUN6SCxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLEVBQUU7SUFDckMsT0FBTywwQkFBMEIsQ0FBQztBQUNwQyxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFO0lBQy9CLE9BQU8sZ0NBQWdDLENBQUM7QUFDMUMsQ0FBQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRTtJQUNoQyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUU7SUFDbkMsT0FBTyxpQkFBaUIsQ0FBQztBQUMzQixDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsR0FBRyxFQUFFO0lBQzlCLE9BQU8sb0JBQW9CLENBQUM7QUFDOUIsQ0FBQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEdBQUcsRUFBRTtJQUNsQyxPQUFPLHFKQUFxSixDQUFDO0FBQy9KLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsRUFBRTtJQUNyQyxPQUFPLDhCQUE4QixDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsRUFBRTtJQUNyQyxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxHQUFHLEVBQUU7SUFDL0IsT0FBTyxvR0FBb0csQ0FBQztBQUM5RyxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLEVBQUU7SUFDMUMsT0FBTywwQkFBMEIsQ0FBQztBQUNwQyxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxHQUFHLEVBQUU7SUFDcEQsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRTtJQUM3QixPQUFPLDJEQUEyRCxDQUFDO0FBQ3JFLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxHQUFHLEVBQUU7SUFDN0IsT0FBTywyQkFBMkIsQ0FBQztBQUNyQyxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO0lBQzdCLE9BQU8sMkJBQTJCLENBQUM7QUFDckMsQ0FBQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEdBQUcsRUFBRTtJQUNqQyxPQUFPLDZCQUE2QixDQUFDO0FBQ3ZDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZWxlc3MtZXNjYXBlICovXG5cbi8qKlxuICogUmV0dXJucyByZWdleCBmb3IgZW1haWwgdmFsaWRhdGlvblxuICogQHJldHVybnMge1JlZ0V4cH1cbiAqL1xuZXhwb3J0IGNvbnN0IHBhdHRlcm5FbWFpbCA9ICgpID0+IHtcbiAgcmV0dXJuIC9eW0EtejAtOV0rW0EtejAtOVxcX1xcLlxcK1xcLV0qW0EtejAtOV1AW0EtejAtOV0rW0EtejAtOVxcX1xcLlxcK1xcLV0qW0EtejAtOV1cXC5bQS16MC05XStbQS16MC05XFxfXFwuXFwrXFwtXSpbQS16MC05XSQvO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHJlZ2V4IGZvciBwcm90b2NvbCBpbiBVUkwgKGh0dHAsIGh0dHBzLCBmdHApXG4gKiBAcmV0dXJucyB7UmVnRXhwfVxuICovXG5leHBvcnQgY29uc3QgcGF0dGVyblByb3RvY29sVXJsID0gKCkgPT4ge1xuICByZXR1cm4gLyhodHRwfGh0dHBzfGZ0cCk6Lztcbn07XG5cbi8qKlxuICogUmV0dXJucyByZWdleCBmb3IgZnVsbCBVUkwgdmFsaWRhdGlvblxuICogQHJldHVybnMge1JlZ0V4cH1cbiAqL1xuZXhwb3J0IGNvbnN0IHBhdHRlcm5VcmwgPSAoKSA9PiB7XG4gIHJldHVybiAvXihodHRwfGh0dHBzfGZ0cCk6KFxcLyl7Mn1bXlxcc10rWy5dezF9W15cXHNdKyQvO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHJlZ2V4IGZvciBob3N0IHBhcnQgb2YgVVJMXG4gKiBAcmV0dXJucyB7UmVnRXhwfVxuICovXG5leHBvcnQgY29uc3QgcGF0dGVybkhvc3RVcmwgPSAoKSA9PiB7XG4gIHJldHVybiAvXigoaHR0cHN8aHR0cHxmdHApOlsvXXsyfVteL1xcc10rKS87XG59O1xuXG4vKipcbiAqIFJldHVybnMgcmVnZXggZm9yIGRvbWFpbiB2YWxpZGF0aW9uXG4gKiBAcmV0dXJucyB7UmVnRXhwfVxuICovXG5leHBvcnQgY29uc3QgcGF0dGVybkRvbWFpbiA9ICgpID0+IHtcbiAgcmV0dXJuIC9eKFthLXpBLVowLTldKSgoW2EtejAtOS1dezEsNjF9KT9bYS16MC05XXsxfSk/KFxcLlthLXowLTldKChbYS16MC05LV17MSw2MX0pP1thLXowLTldezF9KT8pPyhcXC5bYS16QS1aXXsyLH0pKyQvO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHJlZ2V4IGZvciBWaWV0bmFtZXNlIG1vYmlsZSBwaG9uZSB2YWxpZGF0aW9uXG4gKiBAcmV0dXJucyB7UmVnRXhwfVxuICovXG5leHBvcnQgY29uc3QgcGF0dGVybk1vYmlsZVBob25lID0gKCkgPT4ge1xuICByZXR1cm4gL14oXFwrPzg0fDB8ODQpKFswLTldezl9KSQvO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHJlZ2V4IGZvciBnZW5lcmFsIHBob25lIG51bWJlciB2YWxpZGF0aW9uXG4gKiBAcmV0dXJucyB7UmVnRXhwfVxuICovXG5leHBvcnQgY29uc3QgcGF0dGVyblBob25lID0gKCkgPT4ge1xuICByZXR1cm4gL14oXFwrPzg0fFswLTldfDg0KShbMC05XXsyLDl9KSQvO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHJlZ2V4IGZvciBkaWdpdHNcbiAqIEByZXR1cm5zIHtSZWdFeHB9XG4gKi9cbmV4cG9ydCBjb25zdCBwYXR0ZXJuTnVtYmVyID0gKCkgPT4ge1xuICByZXR1cm4gL1xcZCsvZztcbn07XG5cbi8qKlxuICogUmV0dXJucyByZWdleCBmb3IgZW5jb2RlZCBVUkkgY2hhcmFjdGVyc1xuICogQHJldHVybnMge1JlZ0V4cH1cbiAqL1xuZXhwb3J0IGNvbnN0IHBhdHRlcm5FbmNvZGVVcmkgPSAoKSA9PiB7XG4gIHJldHVybiAvJShbMC05QS1GXXsyfSkvZztcbn07XG5cbi8qKlxuICogUmV0dXJucyByZWdleCBmb3Igc3RhbmRhcmQgbmFtZSAoYWxwaGFudW1lcmljIGFuZCBzcGFjZXMpXG4gKiBAcmV0dXJucyB7UmVnRXhwfVxuICovXG5leHBvcnQgY29uc3QgcGF0dGVybk5hbWUgPSAoKSA9PiB7XG4gIHJldHVybiAvXlxcdytbQS1aYS16XFxzXFxkXSskLztcbn07XG5cbi8qKlxuICogUmV0dXJucyByZWdleCBmb3IgVVRGLTggbmFtZSAoaW5jbHVkaW5nIFZpZXRuYW1lc2UgY2hhcmFjdGVycylcbiAqIEByZXR1cm5zIHtSZWdFeHB9XG4gKi9cbmV4cG9ydCBjb25zdCBwYXR0ZXJuTmFtZVV0ZjggPSAoKSA9PiB7XG4gIHJldHVybiAvXlsgw6DDoeG6o8Oj4bqhxIPhuq/hurHhurXhurfhurPDouG6p+G6peG6reG6q+G6qcSRw6jDqeG6u+G6veG6ucOq4buB4bq/4buD4buF4buHw6zDreG7icSp4buLw7LDs+G7j8O14buNw7Thu5Phu5Hhu5Xhu5fhu5nGoeG7neG7m+G7n+G7oeG7o8O5w7rhu6fFqeG7pcaw4bur4bup4but4buv4bux4buzw73hu7fhu7nDgMOB4bqiw4PhuqDEguG6ruG6sOG6tOG6tuG6ssOC4bqm4bqk4bqs4bqq4bqoxJDDiMOJ4bq64bq84bq4w4rhu4Dhur7hu4Lhu4Thu4bDjMON4buIxKjhu4rDksOT4buOw5Xhu4zDlOG7kuG7kOG7lOG7luG7mMag4buc4bua4bue4bug4buiw5nDmuG7psWo4bukxq/hu6rhu6jhu6zhu67hu7Dhu7LDneG7tuG7uEEtWmEtejAtOV0rJC87XG59O1xuXG4vKipcbiAqIFJldHVybnMgcmVnZXggZm9yIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBuYW1lXG4gKiBAcmV0dXJucyB7UmVnRXhwfVxuICovXG5leHBvcnQgY29uc3QgcGF0dGVybk5hbWVTcGVjaWFsID0gKCkgPT4ge1xuICByZXR1cm4gL1t+IUAjJCVeJiooKS0rPTw+LD9cXC9cXFxcOjtcIiddLztcbn07XG5cbi8qKlxuICogUmV0dXJucyByZWdleCBmb3IgcHJvZmlsZSBuYW1lXG4gKiBAcmV0dXJucyB7UmVnRXhwfVxuICovXG5leHBvcnQgY29uc3QgcGF0dGVybk5hbWVQcm9maWxlID0gKCkgPT4ge1xuICByZXR1cm4gLyhbXFx3XFxXXFxkXFxzXSspKy87XG59O1xuXG4vKipcbiAqIFJldHVybnMgcmVnZXggZm9yIGVtb2ppc1xuICogQHJldHVybnMge1JlZ0V4cH1cbiAqL1xuZXhwb3J0IGNvbnN0IHBhdHRlcm5FbW9qaSA9ICgpID0+IHtcbiAgcmV0dXJuIC8oXFx1MDBhOXxcXHUwMGFlfFtcXHUyMDAwLVxcdTMzMDBdfFxcdWQ4M2NbXFx1ZDAwMC1cXHVkZmZmXXxcXHVkODNkW1xcdWQwMDAtXFx1ZGZmZl18XFx1ZDgzZVtcXHVkMDAwLVxcdWRmZmZdKS9nO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHJlZ2V4IGZvciBtYXRjaGluZyBmaWVsZCByZXBsYWNlbWVudCBtYXJrZXJzIChlLmcuIHt7ZmllbGR9fSlcbiAqIEByZXR1cm5zIHtSZWdFeHB9XG4gKi9cbmV4cG9ydCBjb25zdCBwYXR0ZXJuUnVsZUZpZWxkUmVwbGFjZSA9ICgpID0+IHtcbiAgcmV0dXJuIC9be117Mn1bYS16QS1aXy1dK1t9XXsyfS9nO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHJlZ2V4IGZvciBleHRyYWN0aW5nIGZpZWxkIG5hbWUgZnJvbSByZXBsYWNlbWVudCBtYXJrZXJzXG4gKiBAcmV0dXJucyB7UmVnRXhwfVxuICovXG5leHBvcnQgY29uc3QgcGF0dGVybkdldEZpZWxkQnlSdWxlRmllbGRSZXBsYWNlID0gKCkgPT4ge1xuICByZXR1cm4gL1thLXpBLVpfLV0rL2c7XG59O1xuXG4vKipcbiAqIFJldHVybnMgcmVnZXggZm9yIFBFTSBmb3JtYXQgdmFsaWRhdGlvblxuICogQHJldHVybnMge1JlZ0V4cH1cbiAqL1xuZXhwb3J0IGNvbnN0IHBhdHRlcm5QZW0gPSAoKSA9PiB7XG4gIHJldHVybiAvXigwfDEpOihbMC05XXsxLDJ9KTooXFx7XFx7cGF0aC1hcGlcXH1cXH0pOihbYS16QS1aMC05XFwvXSspJC9nO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHJlZ2V4IGZvciB0YXggSUQgdmFsaWRhdGlvblxuICogQHJldHVybnMge1JlZ0V4cH1cbiAqL1xuZXhwb3J0IGNvbnN0IHBhdHRlcm5UYXggPSAoKSA9PiB7XG4gIHJldHVybiAvXihbMC05XSl7MTB9KC1bMC05XXszfSk/JC87XG59O1xuXG4vKipcbiAqIFJldHVybnMgcmVnZXggZm9yIGtleSB2YWxpZGF0aW9uIChpZGVudGljYWwgdG8gdGF4IHJlZ2V4KVxuICogQHJldHVybnMge1JlZ0V4cH1cbiAqL1xuZXhwb3J0IGNvbnN0IHBhdHRlcm5LZXkgPSAoKSA9PiB7XG4gIHJldHVybiAvXihbMC05XSl7MTB9KC1bMC05XXszfSk/JC87XG59O1xuXG4vKipcbiAqIFJldHVybnMgcmVnZXggZm9yIGFjY291bnQgdmFsaWRhdGlvbiAobXVzdCBjb250YWluIEApXG4gKiBAcmV0dXJucyB7UmVnRXhwfVxuICovXG5leHBvcnQgY29uc3QgcGF0dGVybkFjY291bnQgPSAoKSA9PiB7XG4gIHJldHVybiAvXig/PS4qQClbYS16MC05QC5fLV17Miw2M30kLztcbn07XG4iXX0=
package/esm2022/trace.mjs CHANGED
@@ -21,6 +21,13 @@ const ignorePatterns = [
21
21
  /vite/,
22
22
  /node_modules/,
23
23
  ];
24
+ /**
25
+ * Trả về danh sách tên các hàm trong stack trace hiện tại.
26
+ * Đã lọc bỏ các hàm nội bộ của Angular, RxJS, Zone.js và các thư viện hệ thống.
27
+ * Hữu ích cho việc logging hoặc debugging để biết source gọi đến function hiện tại.
28
+ *
29
+ * @returns {string[]} Mảng chứa tên các hàm theo thứ tự từ gốc đến ngọn (ngược callback stack).
30
+ */
24
31
  export const traceStack = () => {
25
32
  const stack = new Error().stack;
26
33
  if (!stack)
@@ -47,4 +54,4 @@ export const traceStack = () => {
47
54
  .filter((fn, idx, arr) => fn !== 'anonymous' && arr.indexOf(fn) === idx)
48
55
  .reverse());
49
56
  };
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy90cmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLGNBQWMsR0FBRztJQUNyQix5QkFBeUI7SUFDekIsNkRBQTZEO0lBQzdELG9CQUFvQjtJQUNwQix3QkFBd0I7SUFFeEIsYUFBYTtJQUNiLGFBQWE7SUFFYixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLDhCQUE4QjtJQUM5QixZQUFZO0lBQ1osVUFBVTtJQUNWLFdBQVc7SUFDWCxrQkFBa0I7SUFFbEIsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWixlQUFlO0lBQ2YsYUFBYTtJQUViLFVBQVU7SUFDVixTQUFTO0lBQ1QsTUFBTTtJQUNOLGNBQWM7Q0FDTixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEdBQWEsRUFBRTtJQUN2QyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQztJQUNoQyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRXRCLE9BQU8sQ0FDTCxLQUFLO1NBQ0YsS0FBSyxDQUFDLElBQUksQ0FBQztTQUNYLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyw4QkFBOEI7U0FDdkMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDMUIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN2RSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNaLGdCQUFnQjtRQUNoQixrQ0FBa0M7UUFDbEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzFDLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEMsU0FBUztRQUNULDZCQUE2QjtRQUM3QixLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWhDLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztRQUNGLGlDQUFpQztTQUNoQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLFdBQVcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQztTQUN2RSxPQUFPLEVBQUUsQ0FDYixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgaWdub3JlUGF0dGVybnMgPSBbXG4gIC8vIFJ4SlMgLyBhc3luYyBpbnRlcm5hbHNcbiAgL15hdFxccytPYmplY3RcXC4obmV4dHxlcnJvcnxjb21wbGV0ZXxzdWJzY3JpYmV8dW5zdWJzY3JpYmUpXFxiLyxcbiAgL15hdFxccytTdWJzY3JpYmVyXFwuLyxcbiAgL15hdFxccytTYWZlU3Vic2NyaWJlclxcLi8sXG5cbiAgLy8gVFMgaGVscGVyc1xuICAvXmF0XFxzK19fXFx3Ky8sXG5cbiAgLy8gWm9uZS5qcyAvIEFuZ3VsYXJcbiAgL1pvbmVBd2FyZVByb21pc2UvLFxuICAvXmF0XFxzK25ld1xccytab25lQXdhcmVQcm9taXNlLyxcbiAgL15hdFxccytab25lLyxcbiAgL3pvbmVcXC5qcy8sXG4gIC9jb3JlXFwubWpzLyxcbiAgL3BsYXRmb3JtLWJyb3dzZXIvLFxuXG4gIC8vIEJyb3dzZXIgLyBET01cbiAgL15hdFxccytIVE1MLyxcbiAgL15hdFxccytQcm9taXNlLyxcbiAgLzxhbm9ueW1vdXM+LyxcblxuICAvLyBCdW5kbGVyXG4gIC93ZWJwYWNrLyxcbiAgL3ZpdGUvLFxuICAvbm9kZV9tb2R1bGVzLyxcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCB0cmFjZVN0YWNrID0gKCk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgaWYgKCFzdGFjaykgcmV0dXJuIFtdO1xuXG4gIHJldHVybiAoXG4gICAgc3RhY2tcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5zbGljZSgyKSAvLyBi4buPIEVycm9yICsgY3VycmVudCBmdW5jdGlvblxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiAhaWdub3JlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGxpbmUpKSlcbiAgICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgICAgLy8gQ2hyb21lIC8gRWRnZVxuICAgICAgICAvLyBhdCBmdW5jdGlvbk5hbWUgKGZpbGU6bGluZTpjb2wpXG4gICAgICAgIGxldCBtYXRjaCA9IGxpbmUubWF0Y2goL2F0XFxzKyguKj8pXFxzK1xcKC8pO1xuICAgICAgICBpZiAobWF0Y2g/LlsxXSkgcmV0dXJuIG1hdGNoWzFdO1xuXG4gICAgICAgIC8vIFNhZmFyaVxuICAgICAgICAvLyBmdW5jdGlvbk5hbWVAZmlsZTpsaW5lOmNvbFxuICAgICAgICBtYXRjaCA9IGxpbmUubWF0Y2goL14oLio/KUAvKTtcbiAgICAgICAgaWYgKG1hdGNoPy5bMV0pIHJldHVybiBtYXRjaFsxXTtcblxuICAgICAgICByZXR1cm4gJ2Fub255bW91cyc7XG4gICAgICB9KVxuICAgICAgLy8gbG/huqFpIGR1cGxpY2F0ZSAmIGFub255bW91cyByw6FjXG4gICAgICAuZmlsdGVyKChmbiwgaWR4LCBhcnIpID0+IGZuICE9PSAnYW5vbnltb3VzJyAmJiBhcnIuaW5kZXhPZihmbikgPT09IGlkeClcbiAgICAgIC5yZXZlcnNlKClcbiAgKTtcbn07XG4iXX0=
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy90cmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLGNBQWMsR0FBRztJQUNyQix5QkFBeUI7SUFDekIsNkRBQTZEO0lBQzdELG9CQUFvQjtJQUNwQix3QkFBd0I7SUFFeEIsYUFBYTtJQUNiLGFBQWE7SUFFYixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLDhCQUE4QjtJQUM5QixZQUFZO0lBQ1osVUFBVTtJQUNWLFdBQVc7SUFDWCxrQkFBa0I7SUFFbEIsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWixlQUFlO0lBQ2YsYUFBYTtJQUViLFVBQVU7SUFDVixTQUFTO0lBQ1QsTUFBTTtJQUNOLGNBQWM7Q0FDTixDQUFDO0FBRVg7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEdBQWEsRUFBRTtJQUN2QyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQztJQUNoQyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRXRCLE9BQU8sQ0FDTCxLQUFLO1NBQ0YsS0FBSyxDQUFDLElBQUksQ0FBQztTQUNYLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyw4QkFBOEI7U0FDdkMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDMUIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN2RSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNaLGdCQUFnQjtRQUNoQixrQ0FBa0M7UUFDbEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzFDLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEMsU0FBUztRQUNULDZCQUE2QjtRQUM3QixLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWhDLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztRQUNGLGlDQUFpQztTQUNoQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLFdBQVcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQztTQUN2RSxPQUFPLEVBQUUsQ0FDYixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgaWdub3JlUGF0dGVybnMgPSBbXG4gIC8vIFJ4SlMgLyBhc3luYyBpbnRlcm5hbHNcbiAgL15hdFxccytPYmplY3RcXC4obmV4dHxlcnJvcnxjb21wbGV0ZXxzdWJzY3JpYmV8dW5zdWJzY3JpYmUpXFxiLyxcbiAgL15hdFxccytTdWJzY3JpYmVyXFwuLyxcbiAgL15hdFxccytTYWZlU3Vic2NyaWJlclxcLi8sXG5cbiAgLy8gVFMgaGVscGVyc1xuICAvXmF0XFxzK19fXFx3Ky8sXG5cbiAgLy8gWm9uZS5qcyAvIEFuZ3VsYXJcbiAgL1pvbmVBd2FyZVByb21pc2UvLFxuICAvXmF0XFxzK25ld1xccytab25lQXdhcmVQcm9taXNlLyxcbiAgL15hdFxccytab25lLyxcbiAgL3pvbmVcXC5qcy8sXG4gIC9jb3JlXFwubWpzLyxcbiAgL3BsYXRmb3JtLWJyb3dzZXIvLFxuXG4gIC8vIEJyb3dzZXIgLyBET01cbiAgL15hdFxccytIVE1MLyxcbiAgL15hdFxccytQcm9taXNlLyxcbiAgLzxhbm9ueW1vdXM+LyxcblxuICAvLyBCdW5kbGVyXG4gIC93ZWJwYWNrLyxcbiAgL3ZpdGUvLFxuICAvbm9kZV9tb2R1bGVzLyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogVHLhuqMgduG7gSBkYW5oIHPDoWNoIHTDqm4gY8OhYyBow6BtIHRyb25nIHN0YWNrIHRyYWNlIGhp4buHbiB04bqhaS5cbiAqIMSQw6MgbOG7jWMgYuG7jyBjw6FjIGjDoG0gbuG7mWkgYuG7mSBj4bunYSBBbmd1bGFyLCBSeEpTLCBab25lLmpzIHbDoCBjw6FjIHRoxrAgdmnhu4duIGjhu4cgdGjhu5FuZy5cbiAqIEjhu691IMOtY2ggY2hvIHZp4buHYyBsb2dnaW5nIGhv4bq3YyBkZWJ1Z2dpbmcgxJHhu4MgYmnhur90IHNvdXJjZSBn4buNaSDEkeG6v24gZnVuY3Rpb24gaGnhu4duIHThuqFpLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gTeG6o25nIGNo4bupYSB0w6puIGPDoWMgaMOgbSB0aGVvIHRo4bupIHThu7EgdOG7qyBn4buRYyDEkeG6v24gbmfhu41uIChuZ8aw4bujYyBjYWxsYmFjayBzdGFjaykuXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFjZVN0YWNrID0gKCk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgaWYgKCFzdGFjaykgcmV0dXJuIFtdO1xuXG4gIHJldHVybiAoXG4gICAgc3RhY2tcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5zbGljZSgyKSAvLyBi4buPIEVycm9yICsgY3VycmVudCBmdW5jdGlvblxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiAhaWdub3JlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGxpbmUpKSlcbiAgICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgICAgLy8gQ2hyb21lIC8gRWRnZVxuICAgICAgICAvLyBhdCBmdW5jdGlvbk5hbWUgKGZpbGU6bGluZTpjb2wpXG4gICAgICAgIGxldCBtYXRjaCA9IGxpbmUubWF0Y2goL2F0XFxzKyguKj8pXFxzK1xcKC8pO1xuICAgICAgICBpZiAobWF0Y2g/LlsxXSkgcmV0dXJuIG1hdGNoWzFdO1xuXG4gICAgICAgIC8vIFNhZmFyaVxuICAgICAgICAvLyBmdW5jdGlvbk5hbWVAZmlsZTpsaW5lOmNvbFxuICAgICAgICBtYXRjaCA9IGxpbmUubWF0Y2goL14oLio/KUAvKTtcbiAgICAgICAgaWYgKG1hdGNoPy5bMV0pIHJldHVybiBtYXRjaFsxXTtcblxuICAgICAgICByZXR1cm4gJ2Fub255bW91cyc7XG4gICAgICB9KVxuICAgICAgLy8gbG/huqFpIGR1cGxpY2F0ZSAmIGFub255bW91cyByw6FjXG4gICAgICAuZmlsdGVyKChmbiwgaWR4LCBhcnIpID0+IGZuICE9PSAnYW5vbnltb3VzJyAmJiBhcnIuaW5kZXhPZihmbikgPT09IGlkeClcbiAgICAgIC5yZXZlcnNlKClcbiAgKTtcbn07XG4iXX0=
@@ -58,6 +58,14 @@ export const convertObjectToSignal = (data, cloneDeepIfNotSignal = true, isSigna
58
58
  }
59
59
  return data;
60
60
  };
61
+ /**
62
+ * Chuyển đổi một đối tượng signal (có thể lồng nhau) thành đối tượng plain object/array/map/set.
63
+ * @param data Dữ liệu signal hoặc đối tượng chứa signal cần chuyển đổi.
64
+ * @param isCloneDeep Có thực hiện sao chép sâu dữ liệu trong quá trình chuyển đổi hay không. Mặc định là true.
65
+ * @param seen Dùng nội bộ để tránh lặp vô hạn (WeakMap).
66
+ * @param options Tùy chọn chuyển đổi (ví dụ: convertWhenFirstItemArrayNotIsSignal).
67
+ * @returns Đối tượng plain object đã được "giải nén" mọi signal bên trong.
68
+ */
61
69
  export const convertSignalToObject = (data, isCloneDeep = true, seen = new WeakMap(), options) => {
62
70
  let ignoreCheckSeenHasDataAfterWhile = false;
63
71
  while (isSignal(data) && !seen.has(data)) {
@@ -122,10 +130,15 @@ export const convertSignalToObject = (data, isCloneDeep = true, seen = new WeakM
122
130
  }
123
131
  return result;
124
132
  };
133
+ /**
134
+ * Unwrap một giá trị cho đến khi không còn là signal nữa.
135
+ * @param data Giá trị (có thể là lồng nhiều cấp signal) cần unwrap.
136
+ * @returns Giá trị cuối cùng bên trong signal.
137
+ */
125
138
  export const unwrapSignal = (data) => {
126
139
  while (isSignal(data)) {
127
140
  data = data();
128
141
  }
129
142
  return data;
130
143
  };
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdvLXdheS1zaWduYWwtb2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy11aS91dGlscy9zcmMvdHdvLXdheS1zaWduYWwtb2JqZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFdEM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFVLElBQVMsRUFBRSxvQkFBb0IsR0FBRyxJQUFJLEVBQUUscUJBQXFCLEdBQUcsS0FBSyxFQUFFLHNDQUFzQyxHQUFHLEtBQUssRUFBRSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsRUFBSyxFQUFFO0lBQy9MLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkUsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBTSxDQUFDO0lBQzVELENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLHNDQUFzQyxFQUFFLENBQUM7WUFDNUMs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QVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBTSxDQUFDLENBQUM7UUFDdEksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDMUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzlILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBWSxDQUFDLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDMUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBWSxDQUFDLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCw2Q0FBNkM7SUFDN0MsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sSUFBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBd0IsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM1RCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN2QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRCw2REFBNkQ7WUFDN0QsSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUNwQixTQUFTO1lBQ1gsQ0FBQztZQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUcsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE1BQVcsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFTLEVBQUUsRUFBRTtJQUN4QyxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RCLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBpc1NpZ25hbCwgc2lnbmFsLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNBc3luY09iamVjdCwgaXNNYXAsIGlzUmV0dXJuQXNJc09iamVjdCwgaXNTZXQgfSBmcm9tICcuL2Rhbmdlcm91cy1vYmplY3QnO1xuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnLi9oZWxwZXJzJztcblxuLyoqXG4gKiBDaHV54buDbiDEkeG7lWkgbeG7mXQgxJHhu5FpIHTGsOG7o25nIGhv4bq3YyBnacOhIHRy4buLIHRow6BuaCBzaWduYWxcbiAqIEBwYXJhbSBkYXRhIEThu68gbGnhu4d1IGPhuqduIGNodXnhu4NuIMSR4buVaSB0aMOgbmggc2lnbmFsXG4gKiBAcGFyYW0gY2xvbmVEZWVwSWZOb3RTaWduYWwgQ8OzIHRo4buxYyBoaeG7h24gc2FvIGNow6lwIHPDonUgZOG7ryBsaeG7h3UgdHLGsOG7m2Mga2hpIGNodXnhu4NuIMSR4buVaSBoYXkga2jDtG5nIG7hur91IGRhdGEga2jDtG5nIHBo4bqjaSBzaWduYWwuIE3hurdjIMSR4buLbmggbMOgIHRydWUuXG4gKiDEkOG6t3QgZmFsc2UgbuG6v3UgbXXhu5FuIGdp4buvIG5ndXnDqm4gdGhhbSBjaGnhur91IMSR4bq/biBk4buvIGxp4buHdSBn4buRYy5cbiAqIE7hur91IG114buRbiBzYW8gY2jDqXAgc8OidSDEkeG7kWkgdMaw4bujbmcgc2lnbmFsIHRow6wgxJHhurd0IGNsb25lRGVlcElmTm90U2lnbmFsIGzDoCB0cnVlIHbDoCBhY2NlcHRDb252ZXJ0T2JqZWN0SW5uZXJXcml0YWJsZVNpZ25hbCBsw6AgdHJ1ZS5cbiAqIEBwYXJhbSBpc1NpZ25hbFByaW1pdGl2ZVR5cGUgQ8OzIGNodXnhu4NuIMSR4buVaSBjw6FjIGdpw6EgdHLhu4sgbmd1ecOqbiB0aOG7p3kgKHN0cmluZywgbnVtYmVyLCBib29sZWFuKSB0aMOgbmggc2lnbmFsIGhheSBraMO0bmcuIE3hurdjIMSR4buLbmggbMOgIGZhbHNlLlxuICogxJDhurd0IHRydWUgbuG6v3UgbXXhu5FuIGLhu41jIGPDoWMgZ2nDoSB0cuG7iyBuZ3V5w6puIHRo4buneSB0cm9uZyBzaWduYWwuXG4gKiBAcGFyYW0gYWNjZXB0Q29udmVydE9iamVjdElubmVyV3JpdGFibGVTaWduYWwgQ8OzIHRp4bq/cCB04bulYyB0w6xtIGtp4bq/bSB2w6AgY2h1eeG7g24gxJHhu5VpIGPDoWMgxJHhu5FpIHTGsOG7o25nIGLDqm4gdHJvbmcgc2lnbmFsIGhheSBraMO0bmcuIE3hurdjIMSR4buLbmggbMOgIGZhbHNlLlxuICogxJDhurd0IHRydWUgbuG6v3UgbXXhu5FuIHTDrG0gdsOgIGNodXnhu4NuIMSR4buVaSBjw6FjIMSR4buRaSB0xrDhu6NuZyBiw6puIHRyb25nIHNpZ25hbCBob+G6t2MgY2jDrW5oIG7DsyB0aMOgbmggc2lnbmFsIG3hu5tpLlxuICogQHJldHVybnMgROG7ryBsaeG7h3UgxJHDoyDEkcaw4bujYyBjaHV54buDbiDEkeG7lWkgdGhlbyBraeG7g3UgVFxuICovXG5leHBvcnQgY29uc3QgY29udmVydE9iamVjdFRvU2lnbmFsID0gPFQgPSBhbnk+KGRhdGE6IGFueSwgY2xvbmVEZWVwSWZOb3RTaWduYWwgPSB0cnVlLCBpc1NpZ25hbFByaW1pdGl2ZVR5cGUgPSBmYWxzZSwgYWNjZXB0Q29udmVydE9iamVjdElubmVyV3JpdGFibGVTaWduYWwgPSBmYWxzZSwgc2VlbiA9IG5ldyBXZWFrTWFwKCkpOiBUID0+IHtcbiAgaWYgKChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgJiYgIWlzU2lnbmFsKGRhdGEpKSB7XG4gICAgcmV0dXJuIChpc1NpZ25hbFByaW1pdGl2ZVR5cGUgPyBzaWduYWwoZGF0YSkgOiBkYXRhKSBhcyBUO1xuICB9XG4gIGlmIChzZWVuLmhhcyhkYXRhKSkge1xuICAgIHJldHVybiBzZWVuLmdldChkYXRhKTtcbiAgfVxuXG4gIGlmIChpc1NpZ25hbChkYXRhKSkge1xuICAgIGlmICghYWNjZXB0Q29udmVydE9iamVjdElubmVyV3JpdGFibGVTaWduYWwpIHtcbiAgICAgIHJldHVybiBkYXRhIGFzIFQ7XG4gICAgfVxuICAgIHNlZW4uc2V0KGRhdGEsIGNvbnZlcnRPYmplY3RUb1NpZ25hbChkYXRhKCksIGNsb25lRGVlcElmTm90U2lnbmFsLCBpc1NpZ25hbFByaW1pdGl2ZVR5cGUsIGFjY2VwdENvbnZlcnRPYmplY3RJbm5lcldyaXRhYmxlU2lnbmFsLCBzZWVuKSk7XG4gICAgcmV0dXJuIHNlZW4uZ2V0KGRhdGEpO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkoZGF0YSkpIHtcbiAgICBzZWVuLnNldChkYXRhLCBzaWduYWwoZGF0YS5tYXAoKGl0ZW0pID0+IGNvbnZlcnRPYmplY3RUb1NpZ25hbChpdGVtLCBjbG9uZURlZXBJZk5vdFNpZ25hbCwgaXNTaWduYWxQcmltaXRpdmVUeXBlLCBhY2NlcHRDb252ZXJ0T2JqZWN0SW5uZXJXcml0YWJsZVNpZ25hbCwgc2VlbikpKSBhcyBUKTtcbiAgICByZXR1cm4gc2Vlbi5nZXQoZGF0YSk7XG4gIH1cblxuICBpZiAoaXNNYXAoZGF0YSkpIHtcbiAgICBjb25zdCBtYXBDb3B5ID0gbmV3IE1hcCgpO1xuICAgIEFycmF5LmZyb20oZGF0YS5rZXlzKCkpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgbWFwQ29weS5zZXQoa2V5LCBjb252ZXJ0T2JqZWN0VG9TaWduYWwoZGF0YS5nZXQoa2V5KSwgY2xvbmVEZWVwSWZOb3RTaWduYWwsIGlzU2lnbmFsUHJpbWl0aXZlVHlwZSwgYWNjZXB0Q29udmVydE9iamVjdElubmVyV3JpdGFibGVTaWduYWwpKTtcbiAgICB9KTtcbiAgICBzZWVuLnNldChkYXRhLCBzaWduYWwobWFwQ29weSkgYXMgVCk7XG4gICAgcmV0dXJuIHNlZW4uZ2V0KGRhdGEpO1xuICB9XG5cbiAgLy8gQuG7jyBxdWEgY8OhYyDEkeG7kWkgdMaw4bujbmcgYXN5bmNcbiAgaWYgKGlzQXN5bmNPYmplY3QoZGF0YSkpIHtcbiAgICByZXR1cm4gZGF0YSBhcyBUO1xuICB9XG5cbiAgZGF0YSA9IHNpZ25hbChjbG9uZURlZXBJZk5vdFNpZ25hbCA/IHsgLi4uZGF0YSB9IDogZGF0YSk7XG4gIHNlZW4uc2V0KGRhdGEsIGRhdGEpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGEoKVtrZXldO1xuICAgIC8vIELhu48gcXVhIGPDoWMgxJHhu5FpIHTGsOG7o25nIG5ndXkgaGnhu4NtIHbDoCDEkeG6t2MgYmnhu4d0XG4gICAgaWYgKGlzUmV0dXJuQXNJc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEoKSwga2V5KSkge1xuICAgICAgZGF0YSgpW2tleV0gPSBjb252ZXJ0T2JqZWN0VG9TaWduYWwodmFsdWUsIGNsb25lRGVlcElmTm90U2lnbmFsLCBpc1NpZ25hbFByaW1pdGl2ZVR5cGUsIGFjY2VwdENvbnZlcnRPYmplY3RJbm5lcldyaXRhYmxlU2lnbmFsKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGF0YSBhcyBUO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRTaWduYWxUb09iamVjdCA9IDxUID0gYW55PihkYXRhOiBhbnksIGlzQ2xvbmVEZWVwID0gdHJ1ZSwgc2VlbiA9IG5ldyBXZWFrTWFwKCksIG9wdGlvbnM/OiB7IGNvbnZlcnRXaGVuRmlyc3RJdGVtQXJyYXlOb3RJc1NpZ25hbD86IGJvb2xlYW4gfSk6IFQgPT4ge1xuICBsZXQgaWdub3JlQ2hlY2tTZWVuSGFzRGF0YUFmdGVyV2hpbGUgPSBmYWxzZTtcbiAgd2hpbGUgKGlzU2lnbmFsKGRhdGEpICYmICFzZWVuLmhhcyhkYXRhKSkge1xuICAgIGNvbnN0IGRhdGFDb252ZXJ0ID0gKGRhdGEgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj4pKCk7XG4gICAgaWYgKHR5cGVvZiBkYXRhQ29udmVydCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChkYXRhQ29udmVydCA9PT0gbnVsbCB8fCBpc1JldHVybkFzSXNPYmplY3QoZGF0YUNvbnZlcnQpKSB7XG4gICAgICAgIHJldHVybiBkYXRhQ29udmVydCBhcyBUO1xuICAgICAgfVxuICAgICAgc2Vlbi5zZXQoZGF0YUNvbnZlcnQgYXMgb2JqZWN0LCBkYXRhQ29udmVydCk7XG4gICAgICBkYXRhID0gZGF0YUNvbnZlcnQ7XG4gICAgICBpZ25vcmVDaGVja1NlZW5IYXNEYXRhQWZ0ZXJXaGlsZSA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2Vlbi5zZXQoZGF0YSwgZGF0YUNvbnZlcnQpO1xuICAgIGRhdGEgPSBkYXRhQ29udmVydDtcbiAgfVxuXG4gIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBpc1JldHVybkFzSXNPYmplY3QoZGF0YSkpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGlmICghaWdub3JlQ2hlY2tTZWVuSGFzRGF0YUFmdGVyV2hpbGUgJiYgc2Vlbi5oYXMoZGF0YSkpIHtcbiAgICByZXR1cm4gc2Vlbi5nZXQoZGF0YSk7XG4gIH1cblxuICBpZiAoaXNBcnJheShkYXRhKSkge1xuICAgIGlmICghb3B0aW9ucz8uY29udmVydFdoZW5GaXJzdEl0ZW1BcnJheU5vdElzU2lnbmFsICYmICFpc1NpZ25hbChkYXRhWzBdKSkge1xuICAgICAgcmV0dXJuIGRhdGEgYXMgVDtcbiAgICB9XG4gICAgc2Vlbi5zZXQoZGF0YSwgZGF0YS5tYXAoKGl0ZW06IGFueSkgPT4gY29udmVydFNpZ25hbFRvT2JqZWN0KGlzQ2xvbmVEZWVwID8gY2xvbmVEZWVwKGl0ZW0pIDogaXRlbSwgaXNDbG9uZURlZXAsIHNlZW4sIG9wdGlvbnMpKSBhcyBUKTtcbiAgICByZXR1cm4gc2Vlbi5nZXQoZGF0YSk7XG4gIH1cblxuICBpZiAoaXNNYXAoZGF0YSkpIHtcbiAgICBjb25zdCBtYXBDb3B5ID0gbmV3IE1hcCgpO1xuICAgIEFycmF5LmZyb20oZGF0YS5rZXlzKCkpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgbWFwQ29weS5zZXQoa2V5LCBjb252ZXJ0U2lnbmFsVG9PYmplY3QoaXNDbG9uZURlZXAgPyBjbG9uZURlZXAoZGF0YS5nZXQoa2V5KSkgOiBkYXRhLmdldChrZXkpLCBpc0Nsb25lRGVlcCwgc2Vlbiwgb3B0aW9ucykpO1xuICAgIH0pO1xuICAgIHNlZW4uc2V0KGRhdGEsIG1hcENvcHkgYXMgVCk7XG4gICAgcmV0dXJuIHNlZW4uZ2V0KGRhdGEpO1xuICB9XG5cbiAgaWYgKGlzU2V0KGRhdGEpKSB7XG4gICAgY29uc3Qgc2V0Q29weSA9IG5ldyBTZXQoKTtcbiAgICBBcnJheS5mcm9tKGRhdGEudmFsdWVzKCkpLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICBzZXRDb3B5LmFkZChjb252ZXJ0U2lnbmFsVG9PYmplY3QoaXNDbG9uZURlZXAgPyBjbG9uZURlZXAodmFsdWUpIDogdmFsdWUsIGlzQ2xvbmVEZWVwLCBzZWVuLCBvcHRpb25zKSk7XG4gICAgfSk7XG4gICAgc2Vlbi5zZXQoZGF0YSwgc2V0Q29weSBhcyBUKTtcbiAgICByZXR1cm4gc2Vlbi5nZXQoZGF0YSk7XG4gIH1cblxuICAvLyBC4buPIHF1YSBjw6FjIMSR4buRaSB0xrDhu6NuZyBuZ3V5IGhp4buDbSB2w6AgxJHhurdjIGJp4buHdFxuICBpZiAoaXNSZXR1cm5Bc0lzT2JqZWN0KGRhdGEpKSB7XG4gICAgcmV0dXJuIGRhdGEgYXMgVDtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IGlzQ2xvbmVEZWVwID8ge30gOiBkYXRhO1xuICBzZWVuLnNldChkYXRhLCByZXN1bHQpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRhW2tleV07XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAvLyBC4buPIHF1YSBjw6FjIMSR4buRaSB0xrDhu6NuZyBuZ3V5IGhp4buDbSDEkeG7gyB0csOhbmggbWF4aW11bSBjYWxsIHN0YWNrXG4gICAgICBpZiAoaXNSZXR1cm5Bc0lzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdFtrZXldID0gY29udmVydFNpZ25hbFRvT2JqZWN0KGlzQ2xvbmVEZWVwID8gY2xvbmVEZWVwKHZhbHVlKSA6IHZhbHVlLCBpc0Nsb25lRGVlcCwgc2Vlbiwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCBhcyBUO1xufTtcblxuZXhwb3J0IGNvbnN0IHVud3JhcFNpZ25hbCA9IChkYXRhOiBhbnkpID0+IHtcbiAgd2hpbGUgKGlzU2lnbmFsKGRhdGEpKSB7XG4gICAgZGF0YSA9IGRhdGEoKTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn07XG4iXX0=
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdvLXdheS1zaWduYWwtb2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy11aS91dGlscy9zcmMvdHdvLXdheS1zaWduYWwtb2JqZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFdEM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFVLElBQVMsRUFBRSxvQkFBb0IsR0FBRyxJQUFJLEVBQUUscUJBQXFCLEdBQUcsS0FBSyxFQUFFLHNDQUFzQyxHQUFHLEtBQUssRUFBRSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsRUFBSyxFQUFFO0lBQy9MLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkUsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBTSxDQUFDO0lBQzVELENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLHNDQUFzQyxFQUFFLENBQUM7WUFDNUMs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QyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQU0sQ0FBQyxDQUFDO1FBQ3RJLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNoQixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzFCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM5SCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQVksQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNoQixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzFCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN6RyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQVksQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsNkNBQTZDO0lBQzdDLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM3QixPQUFPLElBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQXdCLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdkIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEQsNkRBQTZEO1lBQzdELElBQUksa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEIsU0FBUztZQUNYLENBQUM7WUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzFHLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFXLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLElBQVMsRUFBRSxFQUFFO0lBQ3hDLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDdEIsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IGlzU2lnbmFsLCBzaWduYWwsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc0FycmF5LCBpc0FzeW5jT2JqZWN0LCBpc01hcCwgaXNSZXR1cm5Bc0lzT2JqZWN0LCBpc1NldCB9IGZyb20gJy4vZGFuZ2Vyb3VzLW9iamVjdCc7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG4vKipcbiAqIENodXnhu4NuIMSR4buVaSBt4buZdCDEkeG7kWkgdMaw4bujbmcgaG/hurdjIGdpw6EgdHLhu4sgdGjDoG5oIHNpZ25hbFxuICogQHBhcmFtIGRhdGEgROG7ryBsaeG7h3UgY+G6p24gY2h1eeG7g24gxJHhu5VpIHRow6BuaCBzaWduYWxcbiAqIEBwYXJhbSBjbG9uZURlZXBJZk5vdFNpZ25hbCBDw7MgdGjhu7FjIGhp4buHbiBzYW8gY2jDqXAgc8OidSBk4buvIGxp4buHdSB0csaw4bubYyBraGkgY2h1eeG7g24gxJHhu5VpIGhheSBraMO0bmcgbuG6v3UgZGF0YSBraMO0bmcgcGjhuqNpIHNpZ25hbC4gTeG6t2MgxJHhu4tuaCBsw6AgdHJ1ZS5cbiAqIMSQ4bq3dCBmYWxzZSBu4bq/dSBtdeG7kW4gZ2nhu68gbmd1ecOqbiB0aGFtIGNoaeG6v3UgxJHhur9uIGThu68gbGnhu4d1IGfhu5FjLlxuICogTuG6v3UgbXXhu5FuIHNhbyBjaMOpcCBzw6J1IMSR4buRaSB0xrDhu6NuZyBzaWduYWwgdGjDrCDEkeG6t3QgY2xvbmVEZWVwSWZOb3RTaWduYWwgbMOgIHRydWUgdsOgIGFjY2VwdENvbnZlcnRPYmplY3RJbm5lcldyaXRhYmxlU2lnbmFsIGzDoCB0cnVlLlxuICogQHBhcmFtIGlzU2lnbmFsUHJpbWl0aXZlVHlwZSBDw7MgY2h1eeG7g24gxJHhu5VpIGPDoWMgZ2nDoSB0cuG7iyBuZ3V5w6puIHRo4buneSAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4pIHRow6BuaCBzaWduYWwgaGF5IGtow7RuZy4gTeG6t2MgxJHhu4tuaCBsw6AgZmFsc2UuXG4gKiDEkOG6t3QgdHJ1ZSBu4bq/dSBtdeG7kW4gYuG7jWMgY8OhYyBnacOhIHRy4buLIG5ndXnDqm4gdGjhu6d5IHRyb25nIHNpZ25hbC5cbiAqIEBwYXJhbSBhY2NlcHRDb252ZXJ0T2JqZWN0SW5uZXJXcml0YWJsZVNpZ25hbCBDw7MgdGnhur9wIHThu6VjIHTDrG0ga2nhur9tIHbDoCBjaHV54buDbiDEkeG7lWkgY8OhYyDEkeG7kWkgdMaw4bujbmcgYsOqbiB0cm9uZyBzaWduYWwgaGF5IGtow7RuZy4gTeG6t2MgxJHhu4tuaCBsw6AgZmFsc2UuXG4gKiDEkOG6t3QgdHJ1ZSBu4bq/dSBtdeG7kW4gdMOsbSB2w6AgY2h1eeG7g24gxJHhu5VpIGPDoWMgxJHhu5FpIHTGsOG7o25nIGLDqm4gdHJvbmcgc2lnbmFsIGhv4bq3YyBjaMOtbmggbsOzIHRow6BuaCBzaWduYWwgbeG7m2kuXG4gKiBAcmV0dXJucyBE4buvIGxp4buHdSDEkcOjIMSRxrDhu6NjIGNodXnhu4NuIMSR4buVaSB0aGVvIGtp4buDdSBUXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0T2JqZWN0VG9TaWduYWwgPSA8VCA9IGFueT4oZGF0YTogYW55LCBjbG9uZURlZXBJZk5vdFNpZ25hbCA9IHRydWUsIGlzU2lnbmFsUHJpbWl0aXZlVHlwZSA9IGZhbHNlLCBhY2NlcHRDb252ZXJ0T2JqZWN0SW5uZXJXcml0YWJsZVNpZ25hbCA9IGZhbHNlLCBzZWVuID0gbmV3IFdlYWtNYXAoKSk6IFQgPT4ge1xuICBpZiAoKGRhdGEgPT09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSAmJiAhaXNTaWduYWwoZGF0YSkpIHtcbiAgICByZXR1cm4gKGlzU2lnbmFsUHJpbWl0aXZlVHlwZSA/IHNpZ25hbChkYXRhKSA6IGRhdGEpIGFzIFQ7XG4gIH1cbiAgaWYgKHNlZW4uaGFzKGRhdGEpKSB7XG4gICAgcmV0dXJuIHNlZW4uZ2V0KGRhdGEpO1xuICB9XG5cbiAgaWYgKGlzU2lnbmFsKGRhdGEpKSB7XG4gICAgaWYgKCFhY2NlcHRDb252ZXJ0T2JqZWN0SW5uZXJXcml0YWJsZVNpZ25hbCkge1xuICAgICAgcmV0dXJuIGRhdGEgYXMgVDtcbiAgICB9XG4gICAgc2Vlbi5zZXQoZGF0YSwgY29udmVydE9iamVjdFRvU2lnbmFsKGRhdGEoKSwgY2xvbmVEZWVwSWZOb3RTaWduYWwsIGlzU2lnbmFsUHJpbWl0aXZlVHlwZSwgYWNjZXB0Q29udmVydE9iamVjdElubmVyV3JpdGFibGVTaWduYWwsIHNlZW4pKTtcbiAgICByZXR1cm4gc2Vlbi5nZXQoZGF0YSk7XG4gIH1cblxuICBpZiAoaXNBcnJheShkYXRhKSkge1xuICAgIHNlZW4uc2V0KGRhdGEsIHNpZ25hbChkYXRhLm1hcCgoaXRlbSkgPT4gY29udmVydE9iamVjdFRvU2lnbmFsKGl0ZW0sIGNsb25lRGVlcElmTm90U2lnbmFsLCBpc1NpZ25hbFByaW1pdGl2ZVR5cGUsIGFjY2VwdENvbnZlcnRPYmplY3RJbm5lcldyaXRhYmxlU2lnbmFsLCBzZWVuKSkpIGFzIFQpO1xuICAgIHJldHVybiBzZWVuLmdldChkYXRhKTtcbiAgfVxuXG4gIGlmIChpc01hcChkYXRhKSkge1xuICAgIGNvbnN0IG1hcENvcHkgPSBuZXcgTWFwKCk7XG4gICAgQXJyYXkuZnJvbShkYXRhLmtleXMoKSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBtYXBDb3B5LnNldChrZXksIGNvbnZlcnRPYmplY3RUb1NpZ25hbChkYXRhLmdldChrZXkpLCBjbG9uZURlZXBJZk5vdFNpZ25hbCwgaXNTaWduYWxQcmltaXRpdmVUeXBlLCBhY2NlcHRDb252ZXJ0T2JqZWN0SW5uZXJXcml0YWJsZVNpZ25hbCkpO1xuICAgIH0pO1xuICAgIHNlZW4uc2V0KGRhdGEsIHNpZ25hbChtYXBDb3B5KSBhcyBUKTtcbiAgICByZXR1cm4gc2Vlbi5nZXQoZGF0YSk7XG4gIH1cblxuICAvLyBC4buPIHF1YSBjw6FjIMSR4buRaSB0xrDhu6NuZyBhc3luY1xuICBpZiAoaXNBc3luY09iamVjdChkYXRhKSkge1xuICAgIHJldHVybiBkYXRhIGFzIFQ7XG4gIH1cblxuICBkYXRhID0gc2lnbmFsKGNsb25lRGVlcElmTm90U2lnbmFsID8geyAuLi5kYXRhIH0gOiBkYXRhKTtcbiAgc2Vlbi5zZXQoZGF0YSwgZGF0YSk7XG4gIGZvciAoY29uc3Qga2V5IGluIGRhdGEoKSkge1xuICAgIGNvbnN0IHZhbHVlID0gZGF0YSgpW2tleV07XG4gICAgLy8gQuG7jyBxdWEgY8OhYyDEkeG7kWkgdMaw4bujbmcgbmd1eSBoaeG7g20gdsOgIMSR4bq3YyBiaeG7h3RcbiAgICBpZiAoaXNSZXR1cm5Bc0lzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSgpLCBrZXkpKSB7XG4gICAgICBkYXRhKClba2V5XSA9IGNvbnZlcnRPYmplY3RUb1NpZ25hbCh2YWx1ZSwgY2xvbmVEZWVwSWZOb3RTaWduYWwsIGlzU2lnbmFsUHJpbWl0aXZlVHlwZSwgYWNjZXB0Q29udmVydE9iamVjdElubmVyV3JpdGFibGVTaWduYWwpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhIGFzIFQ7XG59O1xuXG4vKipcbiAqIENodXnhu4NuIMSR4buVaSBt4buZdCDEkeG7kWkgdMaw4bujbmcgc2lnbmFsIChjw7MgdGjhu4MgbOG7k25nIG5oYXUpIHRow6BuaCDEkeG7kWkgdMaw4bujbmcgcGxhaW4gb2JqZWN0L2FycmF5L21hcC9zZXQuXG4gKiBAcGFyYW0gZGF0YSBE4buvIGxp4buHdSBzaWduYWwgaG/hurdjIMSR4buRaSB0xrDhu6NuZyBjaOG7qWEgc2lnbmFsIGPhuqduIGNodXnhu4NuIMSR4buVaS5cbiAqIEBwYXJhbSBpc0Nsb25lRGVlcCBDw7MgdGjhu7FjIGhp4buHbiBzYW8gY2jDqXAgc8OidSBk4buvIGxp4buHdSB0cm9uZyBxdcOhIHRyw6xuaCBjaHV54buDbiDEkeG7lWkgaGF5IGtow7RuZy4gTeG6t2MgxJHhu4tuaCBsw6AgdHJ1ZS5cbiAqIEBwYXJhbSBzZWVuIETDuW5nIG7hu5lpIGLhu5kgxJHhu4MgdHLDoW5oIGzhurdwIHbDtCBo4bqhbiAoV2Vha01hcCkuXG4gKiBAcGFyYW0gb3B0aW9ucyBUw7l5IGNo4buNbiBjaHV54buDbiDEkeG7lWkgKHbDrSBk4bulOiBjb252ZXJ0V2hlbkZpcnN0SXRlbUFycmF5Tm90SXNTaWduYWwpLlxuICogQHJldHVybnMgxJDhu5FpIHTGsOG7o25nIHBsYWluIG9iamVjdCDEkcOjIMSRxrDhu6NjIFwiZ2nhuqNpIG7DqW5cIiBt4buNaSBzaWduYWwgYsOqbiB0cm9uZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnZlcnRTaWduYWxUb09iamVjdCA9IDxUID0gYW55PihkYXRhOiBhbnksIGlzQ2xvbmVEZWVwID0gdHJ1ZSwgc2VlbiA9IG5ldyBXZWFrTWFwKCksIG9wdGlvbnM/OiB7IGNvbnZlcnRXaGVuRmlyc3RJdGVtQXJyYXlOb3RJc1NpZ25hbD86IGJvb2xlYW4gfSk6IFQgPT4ge1xuICBsZXQgaWdub3JlQ2hlY2tTZWVuSGFzRGF0YUFmdGVyV2hpbGUgPSBmYWxzZTtcbiAgd2hpbGUgKGlzU2lnbmFsKGRhdGEpICYmICFzZWVuLmhhcyhkYXRhKSkge1xuICAgIGNvbnN0IGRhdGFDb252ZXJ0ID0gKGRhdGEgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj4pKCk7XG4gICAgaWYgKHR5cGVvZiBkYXRhQ29udmVydCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChkYXRhQ29udmVydCA9PT0gbnVsbCB8fCBpc1JldHVybkFzSXNPYmplY3QoZGF0YUNvbnZlcnQpKSB7XG4gICAgICAgIHJldHVybiBkYXRhQ29udmVydCBhcyBUO1xuICAgICAgfVxuICAgICAgc2Vlbi5zZXQoZGF0YUNvbnZlcnQgYXMgb2JqZWN0LCBkYXRhQ29udmVydCk7XG4gICAgICBkYXRhID0gZGF0YUNvbnZlcnQ7XG4gICAgICBpZ25vcmVDaGVja1NlZW5IYXNEYXRhQWZ0ZXJXaGlsZSA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2Vlbi5zZXQoZGF0YSwgZGF0YUNvbnZlcnQpO1xuICAgIGRhdGEgPSBkYXRhQ29udmVydDtcbiAgfVxuXG4gIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBpc1JldHVybkFzSXNPYmplY3QoZGF0YSkpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGlmICghaWdub3JlQ2hlY2tTZWVuSGFzRGF0YUFmdGVyV2hpbGUgJiYgc2Vlbi5oYXMoZGF0YSkpIHtcbiAgICByZXR1cm4gc2Vlbi5nZXQoZGF0YSk7XG4gIH1cblxuICBpZiAoaXNBcnJheShkYXRhKSkge1xuICAgIGlmICghb3B0aW9ucz8uY29udmVydFdoZW5GaXJzdEl0ZW1BcnJheU5vdElzU2lnbmFsICYmICFpc1NpZ25hbChkYXRhWzBdKSkge1xuICAgICAgcmV0dXJuIGRhdGEgYXMgVDtcbiAgICB9XG4gICAgc2Vlbi5zZXQoZGF0YSwgZGF0YS5tYXAoKGl0ZW06IGFueSkgPT4gY29udmVydFNpZ25hbFRvT2JqZWN0KGlzQ2xvbmVEZWVwID8gY2xvbmVEZWVwKGl0ZW0pIDogaXRlbSwgaXNDbG9uZURlZXAsIHNlZW4sIG9wdGlvbnMpKSBhcyBUKTtcbiAgICByZXR1cm4gc2Vlbi5nZXQoZGF0YSk7XG4gIH1cblxuICBpZiAoaXNNYXAoZGF0YSkpIHtcbiAgICBjb25zdCBtYXBDb3B5ID0gbmV3IE1hcCgpO1xuICAgIEFycmF5LmZyb20oZGF0YS5rZXlzKCkpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgbWFwQ29weS5zZXQoa2V5LCBjb252ZXJ0U2lnbmFsVG9PYmplY3QoaXNDbG9uZURlZXAgPyBjbG9uZURlZXAoZGF0YS5nZXQoa2V5KSkgOiBkYXRhLmdldChrZXkpLCBpc0Nsb25lRGVlcCwgc2Vlbiwgb3B0aW9ucykpO1xuICAgIH0pO1xuICAgIHNlZW4uc2V0KGRhdGEsIG1hcENvcHkgYXMgVCk7XG4gICAgcmV0dXJuIHNlZW4uZ2V0KGRhdGEpO1xuICB9XG5cbiAgaWYgKGlzU2V0KGRhdGEpKSB7XG4gICAgY29uc3Qgc2V0Q29weSA9IG5ldyBTZXQoKTtcbiAgICBBcnJheS5mcm9tKGRhdGEudmFsdWVzKCkpLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICBzZXRDb3B5LmFkZChjb252ZXJ0U2lnbmFsVG9PYmplY3QoaXNDbG9uZURlZXAgPyBjbG9uZURlZXAodmFsdWUpIDogdmFsdWUsIGlzQ2xvbmVEZWVwLCBzZWVuLCBvcHRpb25zKSk7XG4gICAgfSk7XG4gICAgc2Vlbi5zZXQoZGF0YSwgc2V0Q29weSBhcyBUKTtcbiAgICByZXR1cm4gc2Vlbi5nZXQoZGF0YSk7XG4gIH1cblxuICAvLyBC4buPIHF1YSBjw6FjIMSR4buRaSB0xrDhu6NuZyBuZ3V5IGhp4buDbSB2w6AgxJHhurdjIGJp4buHdFxuICBpZiAoaXNSZXR1cm5Bc0lzT2JqZWN0KGRhdGEpKSB7XG4gICAgcmV0dXJuIGRhdGEgYXMgVDtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IGlzQ2xvbmVEZWVwID8ge30gOiBkYXRhO1xuICBzZWVuLnNldChkYXRhLCByZXN1bHQpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRhW2tleV07XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAvLyBC4buPIHF1YSBjw6FjIMSR4buRaSB0xrDhu6NuZyBuZ3V5IGhp4buDbSDEkeG7gyB0csOhbmggbWF4aW11bSBjYWxsIHN0YWNrXG4gICAgICBpZiAoaXNSZXR1cm5Bc0lzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdFtrZXldID0gY29udmVydFNpZ25hbFRvT2JqZWN0KGlzQ2xvbmVEZWVwID8gY2xvbmVEZWVwKHZhbHVlKSA6IHZhbHVlLCBpc0Nsb25lRGVlcCwgc2Vlbiwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCBhcyBUO1xufTtcblxuLyoqXG4gKiBVbndyYXAgbeG7mXQgZ2nDoSB0cuG7iyBjaG8gxJHhur9uIGtoaSBraMO0bmcgY8OybiBsw6Agc2lnbmFsIG7hu69hLlxuICogQHBhcmFtIGRhdGEgR2nDoSB0cuG7iyAoY8OzIHRo4buDIGzDoCBs4buTbmcgbmhp4buBdSBj4bqlcCBzaWduYWwpIGPhuqduIHVud3JhcC5cbiAqIEByZXR1cm5zIEdpw6EgdHLhu4sgY3Xhu5FpIGPDuW5nIGLDqm4gdHJvbmcgc2lnbmFsLlxuICovXG5leHBvcnQgY29uc3QgdW53cmFwU2lnbmFsID0gKGRhdGE6IGFueSkgPT4ge1xuICB3aGlsZSAoaXNTaWduYWwoZGF0YSkpIHtcbiAgICBkYXRhID0gZGF0YSgpO1xuICB9XG4gIHJldHVybiBkYXRhO1xufTtcbiJdfQ==