@yuuvis/client-core 0.6.5

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 (153) hide show
  1. package/README.md +111 -0
  2. package/esm2022/index.mjs +65 -0
  3. package/esm2022/lib/client-core.module.mjs +117 -0
  4. package/esm2022/lib/client-core.shared.module.mjs +18 -0
  5. package/esm2022/lib/common/pipes/filesize.pipe.mjs +37 -0
  6. package/esm2022/lib/common/pipes/index.mjs +6 -0
  7. package/esm2022/lib/common/pipes/keys.pipe.mjs +17 -0
  8. package/esm2022/lib/common/pipes/locale-date.pipe.mjs +45 -0
  9. package/esm2022/lib/common/pipes/locale-number.pipe.mjs +115 -0
  10. package/esm2022/lib/common/pipes/safe-html.pipe.mjs +44 -0
  11. package/esm2022/lib/common/services/native-notifications.interface.mjs +2 -0
  12. package/esm2022/lib/common/services/native-notifications.mjs +40 -0
  13. package/esm2022/lib/model/dms-object.interface.mjs +2 -0
  14. package/esm2022/lib/model/dms-object.model.mjs +79 -0
  15. package/esm2022/lib/model/object-flavor.interface.mjs +2 -0
  16. package/esm2022/lib/model/range-value.interface.mjs +2 -0
  17. package/esm2022/lib/model/yuv-error.model.mjs +37 -0
  18. package/esm2022/lib/model/yuv-user.model.mjs +38 -0
  19. package/esm2022/lib/service/audit/audit.interface.mjs +2 -0
  20. package/esm2022/lib/service/audit/audit.service.mjs +135 -0
  21. package/esm2022/lib/service/auth/auth.interceptor.mjs +50 -0
  22. package/esm2022/lib/service/auth/auth.interface.mjs +7 -0
  23. package/esm2022/lib/service/auth/auth.service.mjs +130 -0
  24. package/esm2022/lib/service/auth/oidc.service.mjs +81 -0
  25. package/esm2022/lib/service/backend/api.enum.mjs +11 -0
  26. package/esm2022/lib/service/backend/backend.interface.mjs +2 -0
  27. package/esm2022/lib/service/backend/backend.service.mjs +206 -0
  28. package/esm2022/lib/service/bpm/bpm.interface.mjs +8 -0
  29. package/esm2022/lib/service/bpm/bpm.service.mjs +51 -0
  30. package/esm2022/lib/service/cache/app-cache.service.mjs +51 -0
  31. package/esm2022/lib/service/catalog/catalog.interface.mjs +2 -0
  32. package/esm2022/lib/service/catalog/catalog.service.mjs +13 -0
  33. package/esm2022/lib/service/clipboard/clipboard.interface.mjs +2 -0
  34. package/esm2022/lib/service/clipboard/clipboard.service.mjs +90 -0
  35. package/esm2022/lib/service/config/config.interface.mjs +6 -0
  36. package/esm2022/lib/service/config/config.service.mjs +115 -0
  37. package/esm2022/lib/service/config/core-config.mjs +20 -0
  38. package/esm2022/lib/service/config/core-config.tokens.mjs +9 -0
  39. package/esm2022/lib/service/connection/connection.service.mjs +36 -0
  40. package/esm2022/lib/service/connection/offline.interceptor.mjs +28 -0
  41. package/esm2022/lib/service/core-init/core-init.service.mjs +29 -0
  42. package/esm2022/lib/service/core-init/missing-translation-handler.mjs +10 -0
  43. package/esm2022/lib/service/core-init/translate-json-loader.mjs +117 -0
  44. package/esm2022/lib/service/device/device.interface.mjs +6 -0
  45. package/esm2022/lib/service/device/device.service.mjs +144 -0
  46. package/esm2022/lib/service/dms/dms.service.interface.mjs +2 -0
  47. package/esm2022/lib/service/dms/dms.service.mjs +440 -0
  48. package/esm2022/lib/service/event/event.interface.mjs +2 -0
  49. package/esm2022/lib/service/event/event.service.mjs +38 -0
  50. package/esm2022/lib/service/event/events.mjs +14 -0
  51. package/esm2022/lib/service/idm/idm.interface.mjs +2 -0
  52. package/esm2022/lib/service/idm/idm.service.mjs +34 -0
  53. package/esm2022/lib/service/logger/logger-console.service.mjs +73 -0
  54. package/esm2022/lib/service/logger/logger.interface.mjs +2 -0
  55. package/esm2022/lib/service/logger/logger.mjs +27 -0
  56. package/esm2022/lib/service/notification/notification.service.mjs +131 -0
  57. package/esm2022/lib/service/object-config/object-config.interface.mjs +2 -0
  58. package/esm2022/lib/service/object-config/object-config.service.mjs +229 -0
  59. package/esm2022/lib/service/pending-changes/pending-changes-component.interface.mjs +5 -0
  60. package/esm2022/lib/service/pending-changes/pending-changes-guard.service.mjs +25 -0
  61. package/esm2022/lib/service/pending-changes/pending-changes.service.mjs +123 -0
  62. package/esm2022/lib/service/prediction/prediction.interface.mjs +2 -0
  63. package/esm2022/lib/service/prediction/prediction.service.mjs +60 -0
  64. package/esm2022/lib/service/search/search.service.interface.mjs +39 -0
  65. package/esm2022/lib/service/search/search.service.mjs +178 -0
  66. package/esm2022/lib/service/session-storage/session-storage.service.mjs +50 -0
  67. package/esm2022/lib/service/system/object-form.interface.mjs +2 -0
  68. package/esm2022/lib/service/system/system.enum.mjs +179 -0
  69. package/esm2022/lib/service/system/system.interface.mjs +2 -0
  70. package/esm2022/lib/service/system/system.service.mjs +597 -0
  71. package/esm2022/lib/service/upload/upload.interface.mjs +2 -0
  72. package/esm2022/lib/service/upload/upload.service.mjs +228 -0
  73. package/esm2022/lib/service/user/user.service.mjs +211 -0
  74. package/esm2022/lib/util/utils.helper.enum.mjs +15 -0
  75. package/esm2022/lib/util/utils.mjs +373 -0
  76. package/esm2022/yuuvis-client-core.mjs +5 -0
  77. package/fesm2022/yuuvis-client-core.mjs +4775 -0
  78. package/fesm2022/yuuvis-client-core.mjs.map +1 -0
  79. package/index.d.ts +61 -0
  80. package/lib/client-core.module.d.ts +20 -0
  81. package/lib/client-core.shared.module.d.ts +10 -0
  82. package/lib/common/pipes/filesize.pipe.d.ts +18 -0
  83. package/lib/common/pipes/index.d.ts +5 -0
  84. package/lib/common/pipes/keys.pipe.d.ts +10 -0
  85. package/lib/common/pipes/locale-date.pipe.d.ts +12 -0
  86. package/lib/common/pipes/locale-number.pipe.d.ts +47 -0
  87. package/lib/common/pipes/safe-html.pipe.d.ts +28 -0
  88. package/lib/common/services/native-notifications.d.ts +8 -0
  89. package/lib/common/services/native-notifications.interface.d.ts +5 -0
  90. package/lib/model/dms-object.interface.d.ts +16 -0
  91. package/lib/model/dms-object.model.d.ts +26 -0
  92. package/lib/model/object-flavor.interface.d.ts +30 -0
  93. package/lib/model/range-value.interface.d.ts +9 -0
  94. package/lib/model/yuv-error.model.d.ts +18 -0
  95. package/lib/model/yuv-user.model.d.ts +44 -0
  96. package/lib/service/audit/audit.interface.d.ts +47 -0
  97. package/lib/service/audit/audit.service.d.ts +35 -0
  98. package/lib/service/auth/auth.interceptor.d.ts +12 -0
  99. package/lib/service/auth/auth.interface.d.ts +34 -0
  100. package/lib/service/auth/auth.service.d.ts +50 -0
  101. package/lib/service/auth/oidc.service.d.ts +16 -0
  102. package/lib/service/backend/api.enum.d.ts +7 -0
  103. package/lib/service/backend/backend.interface.d.ts +29 -0
  104. package/lib/service/backend/backend.service.d.ts +118 -0
  105. package/lib/service/bpm/bpm.interface.d.ts +86 -0
  106. package/lib/service/bpm/bpm.service.d.ts +19 -0
  107. package/lib/service/cache/app-cache.service.d.ts +18 -0
  108. package/lib/service/catalog/catalog.interface.d.ts +12 -0
  109. package/lib/service/catalog/catalog.service.d.ts +5 -0
  110. package/lib/service/clipboard/clipboard.interface.d.ts +11 -0
  111. package/lib/service/clipboard/clipboard.service.d.ts +23 -0
  112. package/lib/service/config/config.interface.d.ts +34 -0
  113. package/lib/service/config/config.service.d.ts +45 -0
  114. package/lib/service/config/core-config.d.ts +14 -0
  115. package/lib/service/config/core-config.tokens.d.ts +7 -0
  116. package/lib/service/connection/connection.service.d.ts +25 -0
  117. package/lib/service/connection/offline.interceptor.d.ts +15 -0
  118. package/lib/service/core-init/core-init.service.d.ts +11 -0
  119. package/lib/service/core-init/missing-translation-handler.d.ts +8 -0
  120. package/lib/service/core-init/translate-json-loader.d.ts +20 -0
  121. package/lib/service/device/device.interface.d.ts +15 -0
  122. package/lib/service/device/device.service.d.ts +54 -0
  123. package/lib/service/dms/dms.service.d.ts +153 -0
  124. package/lib/service/dms/dms.service.interface.d.ts +59 -0
  125. package/lib/service/event/event.interface.d.ts +13 -0
  126. package/lib/service/event/event.service.d.ts +23 -0
  127. package/lib/service/event/events.d.ts +12 -0
  128. package/lib/service/idm/idm.interface.d.ts +5 -0
  129. package/lib/service/idm/idm.service.d.ts +9 -0
  130. package/lib/service/logger/logger-console.service.d.ts +20 -0
  131. package/lib/service/logger/logger.d.ts +17 -0
  132. package/lib/service/logger/logger.interface.d.ts +10 -0
  133. package/lib/service/notification/notification.service.d.ts +71 -0
  134. package/lib/service/object-config/object-config.interface.d.ts +62 -0
  135. package/lib/service/object-config/object-config.service.d.ts +38 -0
  136. package/lib/service/pending-changes/pending-changes-component.interface.d.ts +6 -0
  137. package/lib/service/pending-changes/pending-changes-guard.service.d.ts +14 -0
  138. package/lib/service/pending-changes/pending-changes.service.d.ts +57 -0
  139. package/lib/service/prediction/prediction.interface.d.ts +18 -0
  140. package/lib/service/prediction/prediction.service.d.ts +15 -0
  141. package/lib/service/search/search.service.d.ts +46 -0
  142. package/lib/service/search/search.service.interface.d.ts +119 -0
  143. package/lib/service/session-storage/session-storage.service.d.ts +15 -0
  144. package/lib/service/system/object-form.interface.d.ts +46 -0
  145. package/lib/service/system/system.enum.d.ts +141 -0
  146. package/lib/service/system/system.interface.d.ts +146 -0
  147. package/lib/service/system/system.service.d.ts +168 -0
  148. package/lib/service/upload/upload.interface.d.ts +55 -0
  149. package/lib/service/upload/upload.service.d.ts +34 -0
  150. package/lib/service/user/user.service.d.ts +69 -0
  151. package/lib/util/utils.d.ts +118 -0
  152. package/lib/util/utils.helper.enum.d.ts +13 -0
  153. package/package.json +33 -0
@@ -0,0 +1,373 @@
1
+ import { EMPTY as observableEmpty } from 'rxjs';
2
+ import { Sort } from './utils.helper.enum';
3
+ export class Utils {
4
+ static optionsToURLParams(options) {
5
+ if (options) {
6
+ const searchParams = new URLSearchParams();
7
+ Object.keys(options).map((k) => searchParams.append(k, options[k]));
8
+ return `?${searchParams.toString()}`;
9
+ }
10
+ return '';
11
+ }
12
+ /**
13
+ * Get all focusable child elements of a host element.
14
+ * @param host The host/parent element
15
+ * @returns Array of focusable child elements
16
+ */
17
+ static getFocusableChildren(host) {
18
+ return Array.from(host.querySelectorAll('a[href], button, input, textarea, select, details,[tabindex]:not([tabindex="-1"])')).filter((el) => !el.hasAttribute('disabled') && !el.getAttribute('aria-hidden'));
19
+ }
20
+ static hasProperty(o, property) {
21
+ if (typeof o !== 'object' || o === null) {
22
+ return false;
23
+ }
24
+ return Object.hasOwn(o, property);
25
+ }
26
+ static patternToRegExp(pattern) {
27
+ return new RegExp(pattern.replaceAll('*', '.*'));
28
+ }
29
+ /**
30
+ * Utility method for adding parameters to a given URI.
31
+ *
32
+ * @param uri The uri string to attach the parameters to
33
+ * @param params The object containing parameters to be appended
34
+ * @returns the given uri extended by the given parameters + remove empty parameters
35
+ */
36
+ static buildUri(uri, params) {
37
+ const q = Object.keys(params)
38
+ .filter((k) => !Utils.isEmptyOrFalse(params[k]))
39
+ .map((k) => k + '=' + encodeURIComponent(typeof params[k] === 'object' ? JSON.stringify(params[k]) : params[k]))
40
+ .join('&');
41
+ return uri + (q ? '?' + q : '');
42
+ }
43
+ static formatMailTo(value, isEmail) {
44
+ if (isEmail && !!value) {
45
+ if (Array.isArray(value)) {
46
+ return value.join().replace(/,/g, '; ');
47
+ }
48
+ else {
49
+ return value.replace(/,/g, '; ');
50
+ }
51
+ }
52
+ return value;
53
+ }
54
+ /**
55
+ * Creates a unique identifier.
56
+ * @returns A Universally Unique Identifier
57
+ */
58
+ static uuid() {
59
+ return Utils._p8() + Utils._p8(true) + Utils._p8(true) + Utils._p8();
60
+ }
61
+ /**
62
+ * Encode a filename safe for sending chars beyond ASCII-7bit using quoted printable encoding.
63
+ *
64
+ * @param filename The file name
65
+ * @returns The quoted printable filename
66
+ */
67
+ static encodeFileName(filename) {
68
+ const fileName = Utils.encodeToQuotedPrintable(Utils.encodeToUtf8(filename)).replace(/_/g, '=5F');
69
+ return `=?UTF-8?Q?${fileName}?=`;
70
+ }
71
+ /**
72
+ *
73
+ * @param boolean s
74
+ * @return string
75
+ */
76
+ static _p8(s) {
77
+ const p = (Math.random().toString(16) + '000000000').substr(2, 8);
78
+ return s ? `-${p.substr(0, 4)}-${p.substr(4, 4)}` : p;
79
+ }
80
+ /**
81
+ * Converts a javascript text to the utf-8 converted variant.
82
+ * See [unicode]{@link http://thlist.onlinehome.de/thomas_homepage/unicode/UTF-8%20Konvertierung%20mittels%20JavaScript.htm} for reference
83
+ *
84
+ * @param rawinput The input string
85
+ * @returns The utf-8 converted string
86
+ */
87
+ static encodeToUtf8(rawinput) {
88
+ /**
89
+ * Normalize line breaks
90
+ */
91
+ rawinput = rawinput.replace(/\r\n/g, '\n');
92
+ let utfreturn = '';
93
+ for (let n = 0; n < rawinput.length; n++) {
94
+ /**
95
+ * Unicode for current char
96
+ */
97
+ const c = rawinput.charCodeAt(n);
98
+ if (c < 128) {
99
+ /**
100
+ * All chars range 0-127 => 1byte
101
+ */
102
+ utfreturn += String.fromCharCode(c);
103
+ }
104
+ else if (c > 127 && c < 2048) {
105
+ /**
106
+ * All chars range from 127 to 2047 => 2byte
107
+ */
108
+ utfreturn += String.fromCharCode((c >> 6) | 192);
109
+ utfreturn += String.fromCharCode((c & 63) | 128);
110
+ }
111
+ else {
112
+ /**
113
+ * All chars range from 2048 to 66536 => 3byte
114
+ */
115
+ utfreturn += String.fromCharCode((c >> 12) | 224);
116
+ utfreturn += String.fromCharCode(((c >> 6) & 63) | 128);
117
+ utfreturn += String.fromCharCode((c & 63) | 128);
118
+ }
119
+ }
120
+ return utfreturn;
121
+ }
122
+ /**
123
+ * See [quoted-printable]{@link https://github.com/mathiasbynens/quoted-printable/blob/master/quoted-printable.js}
124
+ **/
125
+ static quotedPrintable(symbol) {
126
+ if (symbol > '\xFF') {
127
+ throw RangeError('`encodeToQuotedPrintable` expects extended ASCII input only. Missing prior UTF-8 encoding?');
128
+ }
129
+ const codePoint = symbol.charCodeAt(0);
130
+ const hexadecimal = codePoint.toString(16).toUpperCase();
131
+ return '=' + ('0' + hexadecimal).slice(-2);
132
+ }
133
+ /**
134
+ * Encode symbols that are definitely unsafe (i.e. unsafe in any context). The regular expression describes these unsafe symbols.
135
+ *
136
+ * @param rawinput Input string to be encoded
137
+ * @returns The encoded string
138
+ */
139
+ static encodeToQuotedPrintable(rawinput) {
140
+ const encoded = rawinput.replace(/[\0-\b\n-\x1F=\x7F-\uD7FF\uDC00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF]/g, this.quotedPrintable);
141
+ return encoded;
142
+ }
143
+ /**
144
+ * Sorts An Array of Object by given key
145
+ * See [ng-packagr issues 696]{@link https://github.com/dherges/ng-packagr/issues/696}
146
+ *
147
+ * @param key
148
+ * @param order
149
+ * @param locales
150
+ * @param options
151
+ * @returns (a: any, b: any) => number
152
+ */
153
+ static sortValues(key = '', order = Sort.ASC, locales, options) {
154
+ const f = (a, b) => {
155
+ let comparison;
156
+ const varA = Utils.getProperty(a, key);
157
+ const varB = Utils.getProperty(b, key);
158
+ if (typeof varA === 'number' && typeof varB === 'number') {
159
+ comparison = varA - varB;
160
+ }
161
+ else if (varA instanceof Date && varB instanceof Date) {
162
+ comparison = new Date(varA).getTime() - new Date(varB).getTime();
163
+ }
164
+ else {
165
+ const stringA = varA || varA === 0 ? varA.toString() : '';
166
+ const stringB = varB || varB === 0 ? varB.toString() : '';
167
+ comparison = stringA.localeCompare(stringB, locales, options);
168
+ }
169
+ return order === Sort.DESC ? comparison * -1 : comparison;
170
+ };
171
+ return f;
172
+ }
173
+ /**
174
+ * [ng-packagr issues 696]{@link https://github.com/dherges/ng-packagr/issues/696}
175
+ *
176
+ * @param object
177
+ * @param string key
178
+ * @returns any
179
+ */
180
+ static getProperty(object, key = '') {
181
+ const f = key ? key.split('.').reduce((o, k) => (o || {})[k], object) : object;
182
+ return f;
183
+ }
184
+ /**
185
+ * @param object
186
+ * @param key
187
+ * @param value
188
+ */
189
+ static setProperty(object, key = '', value) {
190
+ const [head, ...rest] = key.split('.');
191
+ !rest.length ? (object[head] = value) : Utils.setProperty(object[head] || (object[head] = {}), value, rest.join('.'));
192
+ }
193
+ /**
194
+ * Use on Observable.catch or Observable.subscribe to return empty value
195
+ * [ng-packagr issues 696]{@link https://github.com/dherges/ng-packagr/issues/696}
196
+ *
197
+ * @param (error) => any callback
198
+ * @returns (error) => Observable<never>
199
+ */
200
+ static empty(callback) {
201
+ const f = () => {
202
+ return observableEmpty;
203
+ };
204
+ return f;
205
+ }
206
+ // /**
207
+ // * Use on Observable.catch with specific skipNotification function !!!
208
+ // * [ng-packagr issues 696]{@link https://github.com/dherges/ng-packagr/issues/696}
209
+ // *
210
+ // * @param skipNotification
211
+ // * @param callback
212
+ // * @param name
213
+ // * @param message
214
+ // */
215
+ // public static catchSkip(skipNotification?: (error: any) => any, callback?: (error: any) => any, name?: string, message?: string) {
216
+ // const f = (error: any) => {
217
+ // const _error = callback && callback(error);
218
+ // const _skipNotification = skipNotification && skipNotification(error);
219
+ // return throwError(() => new YuvError(_error instanceof Error ? _error : error, name, message, _skipNotification));
220
+ // };
221
+ // return f;
222
+ // }
223
+ // /**
224
+ // * Use on Observable.catch !!!
225
+ // * [ng-packagr issues]{@link https://github.com/dherges/ng-packagr/issues/696}
226
+ // *
227
+ // * @param callback
228
+ // * @param name
229
+ // * @param message
230
+ // * @param skipNotification
231
+ // * @return (error) => Observable<never>
232
+ // */
233
+ // public static catch(callback?: (error: any) => any, name?: string, message?: string, skipNotification?: boolean) {
234
+ // const f = (error: any) => {
235
+ // const _error = callback && callback(error);
236
+ // return throwError(() => new YuvError(_error instanceof Error ? _error : error, name, message, skipNotification));
237
+ // };
238
+ // return f;
239
+ // }
240
+ // /**
241
+ // * Use on Observable.subscribe !!!
242
+ // * [ng-packagr issues]{@link https://github.com/dherges/ng-packagr/issues/696}
243
+ // *
244
+ // * @param callback
245
+ // * @param name
246
+ // * @param message
247
+ // * @param skipNotification
248
+ // * @return (error) => void
249
+ // */
250
+ // public static throw(callback?: (error: any) => any, name?: string, message?: string, skipNotification?: boolean) {
251
+ // const f = (error: any) => {
252
+ // const _error = callback && callback(error);
253
+ // throw new YuvError(_error instanceof Error ? _error : error, name, message, skipNotification);
254
+ // };
255
+ // return f;
256
+ // }
257
+ // /**
258
+ // * Use on Observable.subscribe only if you want to skip notification / toast!!!
259
+ // *
260
+ // * @param callback
261
+ // * @param name
262
+ // * @param message
263
+ // * @param skipNotification
264
+ // * @return (error) => void
265
+ // */
266
+ // public static logError(callback?: (error: any) => any, name?: string, message?: string, skipNotification = true) {
267
+ // return Utils.throw(callback, name, message, skipNotification);
268
+ // }
269
+ // /**
270
+ // * Checks if element is visible
271
+ // *
272
+ // * @param elem
273
+ // * @return boolean
274
+ // */
275
+ // public static isVisible(elem: any): boolean {
276
+ // return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
277
+ // }
278
+ static getBaseHref(removeTrailingSlash) {
279
+ const baseEl = document.getElementsByTagName('base')[0];
280
+ const baseHref = baseEl ? baseEl.getAttribute('href') : undefined;
281
+ return baseHref ? (removeTrailingSlash ? baseHref.substr(0, baseHref.length - 1) : baseHref) : '';
282
+ }
283
+ /**
284
+ * Truncate a string (first argument) if it is longer than the given maximum string length (second argument).
285
+ * Return the truncated string with a ... ending or whats provided.
286
+ *
287
+ * @param string str
288
+ * @param number num
289
+ */
290
+ static truncateString(str, num, ending = '...') {
291
+ if (str.length > num) {
292
+ if (num > 3) {
293
+ num -= 3;
294
+ }
295
+ str = `${str.substring(0, num)}${ending}`;
296
+ }
297
+ return str;
298
+ }
299
+ /**
300
+ * Get the TimeZone Offsest as minutes
301
+ */
302
+ static getTimezoneOffset() {
303
+ return new Date().getTimezoneOffset();
304
+ }
305
+ /**
306
+ * Transform to date with yyyy-mm-dd format
307
+ */
308
+ static transformDate(v) {
309
+ return v && new Date(new Date(v).getTime() - new Date(v).getTimezoneOffset() * 60 * 1000).toISOString().slice(0, 10);
310
+ }
311
+ static isEdge() {
312
+ return new RegExp('Edge', 'i').test(navigator.userAgent);
313
+ }
314
+ static isFirefox() {
315
+ return new RegExp('firefox', 'i').test(navigator.userAgent);
316
+ }
317
+ static isSafari() {
318
+ return new RegExp('^((?!chrome|android|crios|fxios).)*safari', 'i').test(navigator.userAgent);
319
+ }
320
+ static isEmpty(obj) {
321
+ if (obj == null || obj === '') {
322
+ return true;
323
+ }
324
+ if (typeof obj === 'number') {
325
+ return isNaN(obj);
326
+ }
327
+ return typeof obj === 'boolean' ? false : !Object.keys(obj).length;
328
+ }
329
+ static isEmptyOrFalse(val) {
330
+ return typeof val === 'boolean' ? !val : Utils.isEmpty(val);
331
+ }
332
+ static escapeHtml(str) {
333
+ str = str ? str : '';
334
+ const entityMap = {
335
+ '&': '&amp;',
336
+ '<': '&lt;',
337
+ '>': '&gt;',
338
+ '"': '&quot;',
339
+ "'": '&#39;',
340
+ '/': '&#x2F;'
341
+ };
342
+ return String(str).replace(/[&<>"'\/]/g, (s) => entityMap[s]);
343
+ }
344
+ static arrayToObject(arr = [], keyProperty, valueProperty) {
345
+ const key = typeof keyProperty === 'string' ? (o) => o[keyProperty] : keyProperty;
346
+ const value = typeof valueProperty === 'string' ? (o) => o[valueProperty] : valueProperty;
347
+ return arr.reduce((acc, cur, i) => {
348
+ acc[key ? key(cur) : i] = value ? value(cur) : cur;
349
+ return acc;
350
+ }, {});
351
+ }
352
+ // public static navigate(newTab: boolean, router: Router, commands: any[], navigationExtras?: NavigationExtras): Promise<any> {
353
+ // if (newTab) {
354
+ // return new Promise(() => Utils.openWindow(router.serializeUrl(router.createUrlTree(commands, navigationExtras))));
355
+ // } else {
356
+ // return router.navigate(commands, navigationExtras);
357
+ // }
358
+ // }
359
+ // public static openWindow(url: string = '', target = '_blank', features?: string): Window | null {
360
+ // return window.open(url.match(new RegExp('^/.+')) ? url.replace(new RegExp('^/'), '') : url, target, features); // relative to host
361
+ // }
362
+ static downloadBlob(content, mimeType, filename) {
363
+ const bom = new Uint8Array([0xef, 0xbb, 0xbf]); // FORM BOM
364
+ const blob = new Blob([bom, content], { type: 'octet/stream' });
365
+ const a = document.createElement('a');
366
+ const url = window.URL.createObjectURL(blob);
367
+ a.setAttribute('href', url);
368
+ a.setAttribute('download', filename);
369
+ a.click();
370
+ URL.revokeObjectURL(url);
371
+ }
372
+ }
373
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtY29yZS9zcmMvbGliL3V0aWwvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssSUFBSSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFtQixJQUFJLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU1RCxNQUFNLE9BQU8sS0FBSztJQUNoQixNQUFNLENBQUMsa0JBQWtCLENBQUMsT0FBNEI7UUFDcEQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE1BQU0sWUFBWSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7WUFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsT0FBTyxJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLG9CQUFvQixDQUFDLElBQWlCO1FBQ2xELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUZBQW1GLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDbEksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQ3hFLENBQUM7SUFDSixDQUFDO0lBRU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFVLEVBQUUsUUFBZ0I7UUFDcEQsSUFBSSxP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QUEwRDtJQUMxRCxNQUFNO0lBQ04sSUFBSTtJQUVKLG9HQUFvRztJQUNwRyx1SUFBdUk7SUFDdkksSUFBSTtJQUVHLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBWSxFQUFFLFFBQWdCLEVBQUUsUUFBZ0I7UUFDekUsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXO1FBQzNELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDaEUsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDVixHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVNUFRZIGFzIG9ic2VydmFibGVFbXB0eSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRm9ybWF0dGVkTWFpbFRvLCBTb3J0IH0gZnJvbSAnLi91dGlscy5oZWxwZXIuZW51bSc7XG5cbmV4cG9ydCBjbGFzcyBVdGlscyB7XG4gIHN0YXRpYyBvcHRpb25zVG9VUkxQYXJhbXMob3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55Pik6IHN0cmluZyB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLm1hcCgoaykgPT4gc2VhcmNoUGFyYW1zLmFwcGVuZChrLCBvcHRpb25zW2tdKSk7XG4gICAgICByZXR1cm4gYD8ke3NlYXJjaFBhcmFtcy50b1N0cmluZygpfWA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGZvY3VzYWJsZSBjaGlsZCBlbGVtZW50cyBvZiBhIGhvc3QgZWxlbWVudC5cbiAgICogQHBhcmFtIGhvc3QgVGhlIGhvc3QvcGFyZW50IGVsZW1lbnRcbiAgICogQHJldHVybnMgQXJyYXkgb2YgZm9jdXNhYmxlIGNoaWxkIGVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEZvY3VzYWJsZUNoaWxkcmVuKGhvc3Q6IEhUTUxFbGVtZW50KTogRWxlbWVudFtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShob3N0LnF1ZXJ5U2VsZWN0b3JBbGwoJ2FbaHJlZl0sIGJ1dHRvbiwgaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIGRldGFpbHMsW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PVwiLTFcIl0pJykpLmZpbHRlcihcbiAgICAgIChlbCkgPT4gIWVsLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSAmJiAhZWwuZ2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaGFzUHJvcGVydHkobzogdW5rbm93biwgcHJvcGVydHk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgbyAhPT0gJ29iamVjdCcgfHwgbyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0Lmhhc093bihvLCBwcm9wZXJ0eSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHBhdHRlcm5Ub1JlZ0V4cChwYXR0ZXJuOiBzdHJpbmcpOiBSZWdFeHAge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4ucmVwbGFjZUFsbCgnKicsICcuKicpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVdGlsaXR5IG1ldGhvZCBmb3IgYWRkaW5nIHBhcmFtZXRlcnMgdG8gYSBnaXZlbiBVUkkuXG4gICAqXG4gICAqIEBwYXJhbSB1cmkgVGhlIHVyaSBzdHJpbmcgdG8gYXR0YWNoIHRoZSBwYXJhbWV0ZXJzIHRvXG4gICAqIEBwYXJhbSBwYXJhbXMgVGhlIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlcnMgdG8gYmUgYXBwZW5kZWRcbiAgICogQHJldHVybnMgdGhlIGdpdmVuIHVyaSBleHRlbmRlZCBieSB0aGUgZ2l2ZW4gcGFyYW1ldGVycyArIHJlbW92ZSBlbXB0eSBwYXJhbWV0ZXJzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJ1aWxkVXJpKHVyaTogc3RyaW5nLCBwYXJhbXM6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgcSA9IE9iamVjdC5rZXlzKHBhcmFtcylcbiAgICAgIC5maWx0ZXIoKGspID0+ICFVdGlscy5pc0VtcHR5T3JGYWxzZShwYXJhbXNba10pKVxuICAgICAgLm1hcCgoaykgPT4gayArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh0eXBlb2YgcGFyYW1zW2tdID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KHBhcmFtc1trXSkgOiBwYXJhbXNba10pKVxuICAgICAgLmpvaW4oJyYnKTtcbiAgICByZXR1cm4gdXJpICsgKHEgPyAnPycgKyBxIDogJycpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmb3JtYXRNYWlsVG8odmFsdWU6IEZvcm1hdHRlZE1haWxUbywgaXNFbWFpbDogYm9vbGVhbik6IEZvcm1hdHRlZE1haWxUbyB7XG4gICAgaWYgKGlzRW1haWwgJiYgISF2YWx1ZSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5qb2luKCkucmVwbGFjZSgvLC9nLCAnOyAnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8sL2csICc7ICcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHVuaXF1ZSBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyBBIFVuaXZlcnNhbGx5IFVuaXF1ZSBJZGVudGlmaWVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHV1aWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gVXRpbHMuX3A4KCkgKyBVdGlscy5fcDgodHJ1ZSkgKyBVdGlscy5fcDgodHJ1ZSkgKyBVdGlscy5fcDgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGUgYSBmaWxlbmFtZSBzYWZlIGZvciBzZW5kaW5nIGNoYXJzIGJleW9uZCBBU0NJSS03Yml0IHVzaW5nIHF1b3RlZCBwcmludGFibGUgZW5jb2RpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgZmlsZSBuYW1lXG4gICAqIEByZXR1cm5zIFRoZSBxdW90ZWQgcHJpbnRhYmxlIGZpbGVuYW1lXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGVuY29kZUZpbGVOYW1lKGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gVXRpbHMuZW5jb2RlVG9RdW90ZWRQcmludGFibGUoVXRpbHMuZW5jb2RlVG9VdGY4KGZpbGVuYW1lKSkucmVwbGFjZSgvXy9nLCAnPTVGJyk7XG4gICAgcmV0dXJuIGA9P1VURi04P1E/JHtmaWxlTmFtZX0/PWA7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGJvb2xlYW4gc1xuICAgKiBAcmV0dXJuIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX3A4KHM/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBjb25zdCBwID0gKE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpICsgJzAwMDAwMDAwMCcpLnN1YnN0cigyLCA4KTtcbiAgICByZXR1cm4gcyA/IGAtJHtwLnN1YnN0cigwLCA0KX0tJHtwLnN1YnN0cig0LCA0KX1gIDogcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGphdmFzY3JpcHQgdGV4dCB0byB0aGUgdXRmLTggY29udmVydGVkIHZhcmlhbnQuXG4gICAqIFNlZSBbdW5pY29kZV17QGxpbmsgaHR0cDovL3RobGlzdC5vbmxpbmVob21lLmRlL3Rob21hc19ob21lcGFnZS91bmljb2RlL1VURi04JTIwS29udmVydGllcnVuZyUyMG1pdHRlbHMlMjBKYXZhU2NyaXB0Lmh0bX0gZm9yIHJlZmVyZW5jZVxuICAgKlxuICAgKiBAcGFyYW0gcmF3aW5wdXQgVGhlIGlucHV0IHN0cmluZ1xuICAgKiBAcmV0dXJucyBUaGUgdXRmLTggY29udmVydGVkIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZW5jb2RlVG9VdGY4KHJhd2lucHV0OiBzdHJpbmcpIHtcbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgbGluZSBicmVha3NcbiAgICAgKi9cbiAgICByYXdpbnB1dCA9IHJhd2lucHV0LnJlcGxhY2UoL1xcclxcbi9nLCAnXFxuJyk7XG4gICAgbGV0IHV0ZnJldHVybiA9ICcnO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgcmF3aW5wdXQubGVuZ3RoOyBuKyspIHtcbiAgICAgIC8qKlxuICAgICAgICogVW5pY29kZSBmb3IgY3VycmVudCBjaGFyXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGMgPSByYXdpbnB1dC5jaGFyQ29kZUF0KG4pO1xuICAgICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbCBjaGFycyByYW5nZSAwLTEyNyA9PiAxYnl0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdXRmcmV0dXJuICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gICAgICB9IGVsc2UgaWYgKGMgPiAxMjcgJiYgYyA8IDIwNDgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbCBjaGFycyByYW5nZSBmcm9tIDEyNyB0byAyMDQ3ID0+IDJieXRlXG4gICAgICAgICAqL1xuICAgICAgICB1dGZyZXR1cm4gKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiA2KSB8IDE5Mik7XG4gICAgICAgIHV0ZnJldHVybiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjICYgNjMpIHwgMTI4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGwgY2hhcnMgcmFuZ2UgZnJvbSAyMDQ4IHRvIDY2NTM2ID0+IDNieXRlXG4gICAgICAgICAqL1xuICAgICAgICB1dGZyZXR1cm4gKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiAxMikgfCAyMjQpO1xuICAgICAgICB1dGZyZXR1cm4gKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgPj4gNikgJiA2MykgfCAxMjgpO1xuICAgICAgICB1dGZyZXR1cm4gKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDYzKSB8IDEyOCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1dGZyZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU2VlIFtxdW90ZWQtcHJpbnRhYmxlXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9xdW90ZWQtcHJpbnRhYmxlL2Jsb2IvbWFzdGVyL3F1b3RlZC1wcmludGFibGUuanN9XG4gICAqKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcXVvdGVkUHJpbnRhYmxlKHN5bWJvbDogc3RyaW5nKSB7XG4gICAgaWYgKHN5bWJvbCA+ICdcXHhGRicpIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoJ2BlbmNvZGVUb1F1b3RlZFByaW50YWJsZWAgZXhwZWN0cyBleHRlbmRlZCBBU0NJSSBpbnB1dCBvbmx5LiBNaXNzaW5nIHByaW9yIFVURi04IGVuY29kaW5nPycpO1xuICAgIH1cbiAgICBjb25zdCBjb2RlUG9pbnQgPSBzeW1ib2wuY2hhckNvZGVBdCgwKTtcbiAgICBjb25zdCBoZXhhZGVjaW1hbCA9IGNvZGVQb2ludC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICByZXR1cm4gJz0nICsgKCcwJyArIGhleGFkZWNpbWFsKS5zbGljZSgtMik7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlIHN5bWJvbHMgdGhhdCBhcmUgZGVmaW5pdGVseSB1bnNhZmUgKGkuZS4gdW5zYWZlIGluIGFueSBjb250ZXh0KS4gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBkZXNjcmliZXMgdGhlc2UgdW5zYWZlIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwYXJhbSByYXdpbnB1dCBJbnB1dCBzdHJpbmcgdG8gYmUgZW5jb2RlZFxuICAgKiBAcmV0dXJucyBUaGUgZW5jb2RlZCBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGVuY29kZVRvUXVvdGVkUHJpbnRhYmxlKHJhd2lucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVuY29kZWQgPSByYXdpbnB1dC5yZXBsYWNlKC9bXFwwLVxcYlxcbi1cXHgxRj1cXHg3Ri1cXHVEN0ZGXFx1REMwMC1cXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdfFtcXHVEODAwLVxcdURCRkZdL2csIHRoaXMucXVvdGVkUHJpbnRhYmxlKTtcbiAgICByZXR1cm4gZW5jb2RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyBBbiBBcnJheSBvZiBPYmplY3QgYnkgZ2l2ZW4ga2V5XG4gICAqIFNlZSBbbmctcGFja2FnciBpc3N1ZXMgNjk2XXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZGhlcmdlcy9uZy1wYWNrYWdyL2lzc3Vlcy82OTZ9XG4gICAqXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHBhcmFtIG9yZGVyXG4gICAqIEBwYXJhbSBsb2NhbGVzXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEByZXR1cm5zIChhOiBhbnksIGI6IGFueSkgPT4gbnVtYmVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNvcnRWYWx1ZXMoa2V5ID0gJycsIG9yZGVyID0gU29ydC5BU0MsIGxvY2FsZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSwgb3B0aW9ucz86IEludGwuQ29sbGF0b3JPcHRpb25zKSB7XG4gICAgY29uc3QgZiA9IChhOiBhbnksIGI6IGFueSkgPT4ge1xuICAgICAgbGV0IGNvbXBhcmlzb246IG51bWJlcjtcbiAgICAgIGNvbnN0IHZhckEgPSBVdGlscy5nZXRQcm9wZXJ0eShhLCBrZXkpO1xuICAgICAgY29uc3QgdmFyQiA9IFV0aWxzLmdldFByb3BlcnR5KGIsIGtleSk7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFyQSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHZhckIgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbXBhcmlzb24gPSB2YXJBIC0gdmFyQjtcbiAgICAgIH0gZWxzZSBpZiAodmFyQSBpbnN0YW5jZW9mIERhdGUgJiYgdmFyQiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgY29tcGFyaXNvbiA9IG5ldyBEYXRlKHZhckEpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHZhckIpLmdldFRpbWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0EgPSB2YXJBIHx8IHZhckEgPT09IDAgPyB2YXJBLnRvU3RyaW5nKCkgOiAnJztcbiAgICAgICAgY29uc3Qgc3RyaW5nQiA9IHZhckIgfHwgdmFyQiA9PT0gMCA/IHZhckIudG9TdHJpbmcoKSA6ICcnO1xuICAgICAgICBjb21wYXJpc29uID0gc3RyaW5nQS5sb2NhbGVDb21wYXJlKHN0cmluZ0IsIGxvY2FsZXMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9yZGVyID09PSBTb3J0LkRFU0MgPyBjb21wYXJpc29uICogLTEgOiBjb21wYXJpc29uO1xuICAgIH07XG4gICAgcmV0dXJuIGY7XG4gIH1cblxuICAvKipcbiAgICogW25nLXBhY2thZ3IgaXNzdWVzIDY5Nl17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2RoZXJnZXMvbmctcGFja2Fnci9pc3N1ZXMvNjk2fVxuICAgKlxuICAgKiBAcGFyYW0gb2JqZWN0XG4gICAqIEBwYXJhbSBzdHJpbmcga2V5XG4gICAqIEByZXR1cm5zIGFueVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRQcm9wZXJ0eShvYmplY3Q6IGFueSwga2V5ID0gJycpOiBhbnkge1xuICAgIGNvbnN0IGYgPSBrZXkgPyBrZXkuc3BsaXQoJy4nKS5yZWR1Y2UoKG8sIGspID0+IChvIHx8IHt9KVtrXSwgb2JqZWN0KSA6IG9iamVjdDtcbiAgICByZXR1cm4gZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb2JqZWN0XG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldFByb3BlcnR5KG9iamVjdDogYW55LCBrZXkgPSAnJywgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgY29uc3QgW2hlYWQsIC4uLnJlc3RdID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgIXJlc3QubGVuZ3RoID8gKG9iamVjdFtoZWFkXSA9IHZhbHVlKSA6IFV0aWxzLnNldFByb3BlcnR5KG9iamVjdFtoZWFkXSB8fCAob2JqZWN0W2hlYWRdID0ge30pLCB2YWx1ZSwgcmVzdC5qb2luKCcuJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSBvbiBPYnNlcnZhYmxlLmNhdGNoIG9yIE9ic2VydmFibGUuc3Vic2NyaWJlIHRvIHJldHVybiBlbXB0eSB2YWx1ZVxuICAgKiBbbmctcGFja2FnciBpc3N1ZXMgNjk2XXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZGhlcmdlcy9uZy1wYWNrYWdyL2lzc3Vlcy82OTZ9XG4gICAqXG4gICAqIEBwYXJhbSAoZXJyb3IpID0+IGFueSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyAoZXJyb3IpID0+IE9ic2VydmFibGU8bmV2ZXI+XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGVtcHR5KGNhbGxiYWNrPzogKGVycm9yOiBhbnkpID0+IGFueSkge1xuICAgIGNvbnN0IGYgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZUVtcHR5O1xuICAgIH07XG4gICAgcmV0dXJuIGY7XG4gIH1cblxuICAvLyAvKipcbiAgLy8gICogVXNlIG9uIE9ic2VydmFibGUuY2F0Y2ggd2l0aCBzcGVjaWZpYyBza2lwTm90aWZpY2F0aW9uIGZ1bmN0aW9uICEhIVxuICAvLyAgKiBbbmctcGFja2FnciBpc3N1ZXMgNjk2XXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZGhlcmdlcy9uZy1wYWNrYWdyL2lzc3Vlcy82OTZ9XG4gIC8vICAqXG4gIC8vICAqIEBwYXJhbSBza2lwTm90aWZpY2F0aW9uXG4gIC8vICAqIEBwYXJhbSBjYWxsYmFja1xuICAvLyAgKiBAcGFyYW0gbmFtZVxuICAvLyAgKiBAcGFyYW0gbWVzc2FnZVxuICAvLyAgKi9cbiAgLy8gcHVibGljIHN0YXRpYyBjYXRjaFNraXAoc2tpcE5vdGlmaWNhdGlvbj86IChlcnJvcjogYW55KSA9PiBhbnksIGNhbGxiYWNrPzogKGVycm9yOiBhbnkpID0+IGFueSwgbmFtZT86IHN0cmluZywgbWVzc2FnZT86IHN0cmluZykge1xuICAvLyAgIGNvbnN0IGYgPSAoZXJyb3I6IGFueSkgPT4ge1xuICAvLyAgICAgY29uc3QgX2Vycm9yID0gY2FsbGJhY2sgJiYgY2FsbGJhY2soZXJyb3IpO1xuICAvLyAgICAgY29uc3QgX3NraXBOb3RpZmljYXRpb24gPSBza2lwTm90aWZpY2F0aW9uICYmIHNraXBOb3RpZmljYXRpb24oZXJyb3IpO1xuICAvLyAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IFl1dkVycm9yKF9lcnJvciBpbnN0YW5jZW9mIEVycm9yID8gX2Vycm9yIDogZXJyb3IsIG5hbWUsIG1lc3NhZ2UsIF9za2lwTm90aWZpY2F0aW9uKSk7XG4gIC8vICAgfTtcbiAgLy8gICByZXR1cm4gZjtcbiAgLy8gfVxuXG4gIC8vIC8qKlxuICAvLyAgKiBVc2Ugb24gT2JzZXJ2YWJsZS5jYXRjaCAhISFcbiAgLy8gICogW25nLXBhY2thZ3IgaXNzdWVzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZGhlcmdlcy9uZy1wYWNrYWdyL2lzc3Vlcy82OTZ9XG4gIC8vICAqXG4gIC8vICAqIEBwYXJhbSBjYWxsYmFja1xuICAvLyAgKiBAcGFyYW0gbmFtZVxuICAvLyAgKiBAcGFyYW0gbWVzc2FnZVxuICAvLyAgKiBAcGFyYW0gc2tpcE5vdGlmaWNhdGlvblxuICAvLyAgKiBAcmV0dXJuIChlcnJvcikgPT4gT2JzZXJ2YWJsZTxuZXZlcj5cbiAgLy8gICovXG4gIC8vIHB1YmxpYyBzdGF0aWMgY2F0Y2goY2FsbGJhY2s/OiAoZXJyb3I6IGFueSkgPT4gYW55LCBuYW1lPzogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nLCBza2lwTm90aWZpY2F0aW9uPzogYm9vbGVhbikge1xuICAvLyAgIGNvbnN0IGYgPSAoZXJyb3I6IGFueSkgPT4ge1xuICAvLyAgICAgY29uc3QgX2Vycm9yID0gY2FsbGJhY2sgJiYgY2FsbGJhY2soZXJyb3IpO1xuICAvLyAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IFl1dkVycm9yKF9lcnJvciBpbnN0YW5jZW9mIEVycm9yID8gX2Vycm9yIDogZXJyb3IsIG5hbWUsIG1lc3NhZ2UsIHNraXBOb3RpZmljYXRpb24pKTtcbiAgLy8gICB9O1xuICAvLyAgIHJldHVybiBmO1xuICAvLyB9XG5cbiAgLy8gLyoqXG4gIC8vICAqIFVzZSBvbiBPYnNlcnZhYmxlLnN1YnNjcmliZSAhISFcbiAgLy8gICogW25nLXBhY2thZ3IgaXNzdWVzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZGhlcmdlcy9uZy1wYWNrYWdyL2lzc3Vlcy82OTZ9XG4gIC8vICAqXG4gIC8vICAqIEBwYXJhbSBjYWxsYmFja1xuICAvLyAgKiBAcGFyYW0gbmFtZVxuICAvLyAgKiBAcGFyYW0gbWVzc2FnZVxuICAvLyAgKiBAcGFyYW0gc2tpcE5vdGlmaWNhdGlvblxuICAvLyAgKiBAcmV0dXJuIChlcnJvcikgPT4gdm9pZFxuICAvLyAgKi9cbiAgLy8gcHVibGljIHN0YXRpYyB0aHJvdyhjYWxsYmFjaz86IChlcnJvcjogYW55KSA9PiBhbnksIG5hbWU/OiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcsIHNraXBOb3RpZmljYXRpb24/OiBib29sZWFuKSB7XG4gIC8vICAgY29uc3QgZiA9IChlcnJvcjogYW55KSA9PiB7XG4gIC8vICAgICBjb25zdCBfZXJyb3IgPSBjYWxsYmFjayAmJiBjYWxsYmFjayhlcnJvcik7XG4gIC8vICAgICB0aHJvdyBuZXcgWXV2RXJyb3IoX2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBfZXJyb3IgOiBlcnJvciwgbmFtZSwgbWVzc2FnZSwgc2tpcE5vdGlmaWNhdGlvbik7XG4gIC8vICAgfTtcbiAgLy8gICByZXR1cm4gZjtcbiAgLy8gfVxuXG4gIC8vIC8qKlxuICAvLyAgKiBVc2Ugb24gT2JzZXJ2YWJsZS5zdWJzY3JpYmUgb25seSBpZiB5b3Ugd2FudCB0byBza2lwIG5vdGlmaWNhdGlvbiAvIHRvYXN0ISEhXG4gIC8vICAqXG4gIC8vICAqIEBwYXJhbSBjYWxsYmFja1xuICAvLyAgKiBAcGFyYW0gbmFtZVxuICAvLyAgKiBAcGFyYW0gbWVzc2FnZVxuICAvLyAgKiBAcGFyYW0gc2tpcE5vdGlmaWNhdGlvblxuICAvLyAgKiBAcmV0dXJuIChlcnJvcikgPT4gdm9pZFxuICAvLyAgKi9cbiAgLy8gcHVibGljIHN0YXRpYyBsb2dFcnJvcihjYWxsYmFjaz86IChlcnJvcjogYW55KSA9PiBhbnksIG5hbWU/OiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcsIHNraXBOb3RpZmljYXRpb24gPSB0cnVlKSB7XG4gIC8vICAgcmV0dXJuIFV0aWxzLnRocm93KGNhbGxiYWNrLCBuYW1lLCBtZXNzYWdlLCBza2lwTm90aWZpY2F0aW9uKTtcbiAgLy8gfVxuXG4gIC8vIC8qKlxuICAvLyAgKiBDaGVja3MgaWYgZWxlbWVudCBpcyB2aXNpYmxlXG4gIC8vICAqXG4gIC8vICAqIEBwYXJhbSBlbGVtXG4gIC8vICAqIEByZXR1cm4gYm9vbGVhblxuICAvLyAgKi9cbiAgLy8gcHVibGljIHN0YXRpYyBpc1Zpc2libGUoZWxlbTogYW55KTogYm9vbGVhbiB7XG4gIC8vICAgcmV0dXJuICEhKGVsZW0ub2Zmc2V0V2lkdGggfHwgZWxlbS5vZmZzZXRIZWlnaHQgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCk7XG4gIC8vIH1cblxuICBwdWJsaWMgc3RhdGljIGdldEJhc2VIcmVmKHJlbW92ZVRyYWlsaW5nU2xhc2g/OiBib29sZWFuKSB7XG4gICAgY29uc3QgYmFzZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2Jhc2UnKVswXTtcbiAgICBjb25zdCBiYXNlSHJlZiA9IGJhc2VFbCA/IGJhc2VFbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYmFzZUhyZWYgPyAocmVtb3ZlVHJhaWxpbmdTbGFzaCA/IGJhc2VIcmVmLnN1YnN0cigwLCBiYXNlSHJlZi5sZW5ndGggLSAxKSA6IGJhc2VIcmVmKSA6ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydW5jYXRlIGEgc3RyaW5nIChmaXJzdCBhcmd1bWVudCkgaWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIGdpdmVuIG1heGltdW0gc3RyaW5nIGxlbmd0aCAoc2Vjb25kIGFyZ3VtZW50KS5cbiAgICogUmV0dXJuIHRoZSB0cnVuY2F0ZWQgc3RyaW5nIHdpdGggYSAuLi4gZW5kaW5nIG9yIHdoYXRzIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gc3RyaW5nIHN0clxuICAgKiBAcGFyYW0gbnVtYmVyIG51bVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0cnVuY2F0ZVN0cmluZyhzdHI6IHN0cmluZywgbnVtOiBudW1iZXIsIGVuZGluZyA9ICcuLi4nKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPiBudW0pIHtcbiAgICAgIGlmIChudW0gPiAzKSB7XG4gICAgICAgIG51bSAtPSAzO1xuICAgICAgfVxuICAgICAgc3RyID0gYCR7c3RyLnN1YnN0cmluZygwLCBudW0pfSR7ZW5kaW5nfWA7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBUaW1lWm9uZSBPZmZzZXN0IGFzIG1pbnV0ZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0VGltZXpvbmVPZmZzZXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSB0byBkYXRlIHdpdGggeXl5eS1tbS1kZCBmb3JtYXRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdHJhbnNmb3JtRGF0ZSh2OiBEYXRlIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdiAmJiBuZXcgRGF0ZShuZXcgRGF0ZSh2KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZSh2KS5nZXRUaW1lem9uZU9mZnNldCgpICogNjAgKiAxMDAwKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNFZGdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKCdFZGdlJywgJ2knKS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0ZpcmVmb3goKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoJ2ZpcmVmb3gnLCAnaScpLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzU2FmYXJpKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKCdeKCg/IWNocm9tZXxhbmRyb2lkfGNyaW9zfGZ4aW9zKS4pKnNhZmFyaScsICdpJykudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNFbXB0eShvYmo6IGFueSkge1xuICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogPT09ICcnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBpc05hTihvYmopO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicgPyBmYWxzZSA6ICFPYmplY3Qua2V5cyhvYmopLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNFbXB0eU9yRmFsc2UodmFsOiBhbnkpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nID8gIXZhbCA6IFV0aWxzLmlzRW1wdHkodmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZXNjYXBlSHRtbChzdHI6IHN0cmluZykge1xuICAgIHN0ciA9IHN0ciA/IHN0ciA6ICcnO1xuICAgIGNvbnN0IGVudGl0eU1hcDogYW55ID0ge1xuICAgICAgJyYnOiAnJmFtcDsnLFxuICAgICAgJzwnOiAnJmx0OycsXG4gICAgICAnPic6ICcmZ3Q7JyxcbiAgICAgICdcIic6ICcmcXVvdDsnLFxuICAgICAgXCInXCI6ICcmIzM5OycsXG4gICAgICAnLyc6ICcmI3gyRjsnXG4gICAgfTtcbiAgICByZXR1cm4gU3RyaW5nKHN0cikucmVwbGFjZSgvWyY8PlwiJ1xcL10vZywgKHMpID0+IGVudGl0eU1hcFtzXSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFycmF5VG9PYmplY3Q8VD4oXG4gICAgYXJyOiBhbnlbXSA9IFtdLFxuICAgIGtleVByb3BlcnR5Pzogc3RyaW5nIHwgKChvOiBhbnkpID0+IHN0cmluZyksXG4gICAgdmFsdWVQcm9wZXJ0eT86IHN0cmluZyB8ICgobzogYW55KSA9PiBhbnkpXG4gICk6IHsgW2tleTogc3RyaW5nXTogVCB9IHtcbiAgICBjb25zdCBrZXkgPSB0eXBlb2Yga2V5UHJvcGVydHkgPT09ICdzdHJpbmcnID8gKG86IGFueSkgPT4gb1trZXlQcm9wZXJ0eV0gOiBrZXlQcm9wZXJ0eTtcbiAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiB2YWx1ZVByb3BlcnR5ID09PSAnc3RyaW5nJyA/IChvOiBhbnkpID0+IG9bdmFsdWVQcm9wZXJ0eV0gOiB2YWx1ZVByb3BlcnR5O1xuICAgIHJldHVybiBhcnIucmVkdWNlKChhY2M6IGFueSwgY3VyLCBpKSA9PiB7XG4gICAgICBhY2Nba2V5ID8ga2V5KGN1cikgOiBpXSA9IHZhbHVlID8gdmFsdWUoY3VyKSA6IGN1cjtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuICB9XG5cbiAgLy8gcHVibGljIHN0YXRpYyBuYXZpZ2F0ZShuZXdUYWI6IGJvb2xlYW4sIHJvdXRlcjogUm91dGVyLCBjb21tYW5kczogYW55W10sIG5hdmlnYXRpb25FeHRyYXM/OiBOYXZpZ2F0aW9uRXh0cmFzKTogUHJvbWlzZTxhbnk+IHtcbiAgLy8gICBpZiAobmV3VGFiKSB7XG4gIC8vICAgICByZXR1cm4gbmV3IFByb21pc2UoKCkgPT4gVXRpbHMub3BlbldpbmRvdyhyb3V0ZXIuc2VyaWFsaXplVXJsKHJvdXRlci5jcmVhdGVVcmxUcmVlKGNvbW1hbmRzLCBuYXZpZ2F0aW9uRXh0cmFzKSkpKTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgcmV0dXJuIHJvdXRlci5uYXZpZ2F0ZShjb21tYW5kcywgbmF2aWdhdGlvbkV4dHJhcyk7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgLy8gcHVibGljIHN0YXRpYyBvcGVuV2luZG93KHVybDogc3RyaW5nID0gJycsIHRhcmdldCA9ICdfYmxhbmsnLCBmZWF0dXJlcz86IHN0cmluZyk6IFdpbmRvdyB8IG51bGwge1xuICAvLyAgIHJldHVybiB3aW5kb3cub3Blbih1cmwubWF0Y2gobmV3IFJlZ0V4cCgnXi8uKycpKSA/IHVybC5yZXBsYWNlKG5ldyBSZWdFeHAoJ14vJyksICcnKSA6IHVybCwgdGFyZ2V0LCBmZWF0dXJlcyk7IC8vIHJlbGF0aXZlIHRvIGhvc3RcbiAgLy8gfVxuXG4gIHB1YmxpYyBzdGF0aWMgZG93bmxvYWRCbG9iKGNvbnRlbnQ6IGFueSwgbWltZVR5cGU6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGJvbSA9IG5ldyBVaW50OEFycmF5KFsweGVmLCAweGJiLCAweGJmXSk7IC8vIEZPUk0gQk9NXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtib20sIGNvbnRlbnRdLCB7IHR5cGU6ICdvY3RldC9zdHJlYW0nIH0pO1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB1cmwpO1xuICAgIGEuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGVuYW1lKTtcbiAgICBhLmNsaWNrKCk7XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXV1dmlzLWNsaWVudC1jb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWNvcmUvc3JjL3l1dXZpcy1jbGllbnQtY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==