fable-editor 1.0.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 (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +175 -0
  3. package/dist/angular/LICENSE +21 -0
  4. package/dist/angular/README.md +175 -0
  5. package/dist/angular/angular/fable-editor.component.d.ts +29 -0
  6. package/dist/angular/angular/fable-editor.module.d.ts +7 -0
  7. package/dist/angular/angular/index.d.ts +2 -0
  8. package/dist/angular/core/config.d.ts +17 -0
  9. package/dist/angular/core/docx-import.d.ts +1 -0
  10. package/dist/angular/core/editor.d.ts +219 -0
  11. package/dist/angular/core/i18n.d.ts +139 -0
  12. package/dist/angular/core/icons.d.ts +2 -0
  13. package/dist/angular/core/index.d.ts +7 -0
  14. package/dist/angular/core/paste-engine.d.ts +6 -0
  15. package/dist/angular/core/types.d.ts +87 -0
  16. package/dist/angular/esm2022/angular/fable-editor.component.mjs +101 -0
  17. package/dist/angular/esm2022/angular/fable-editor.module.mjs +16 -0
  18. package/dist/angular/esm2022/angular/index.mjs +3 -0
  19. package/dist/angular/esm2022/core/config.mjs +122 -0
  20. package/dist/angular/esm2022/core/docx-import.mjs +391 -0
  21. package/dist/angular/esm2022/core/editor.mjs +2700 -0
  22. package/dist/angular/esm2022/core/i18n.mjs +278 -0
  23. package/dist/angular/esm2022/core/icons.mjs +89 -0
  24. package/dist/angular/esm2022/core/index.mjs +6 -0
  25. package/dist/angular/esm2022/core/paste-engine.mjs +482 -0
  26. package/dist/angular/esm2022/core/types.mjs +2 -0
  27. package/dist/angular/esm2022/fable-editor.mjs +5 -0
  28. package/dist/angular/esm2022/index.mjs +2 -0
  29. package/dist/angular/fesm2022/fable-editor.mjs +4176 -0
  30. package/dist/angular/fesm2022/fable-editor.mjs.map +1 -0
  31. package/dist/angular/index.d.ts +1 -0
  32. package/dist/core/config.d.ts +18 -0
  33. package/dist/core/config.d.ts.map +1 -0
  34. package/dist/core/docx-import.d.ts +2 -0
  35. package/dist/core/docx-import.d.ts.map +1 -0
  36. package/dist/core/editor.css +1175 -0
  37. package/dist/core/editor.d.ts +221 -0
  38. package/dist/core/editor.d.ts.map +1 -0
  39. package/dist/core/i18n.d.ts +141 -0
  40. package/dist/core/i18n.d.ts.map +1 -0
  41. package/dist/core/icons.d.ts +3 -0
  42. package/dist/core/icons.d.ts.map +1 -0
  43. package/dist/core/index.cjs +12 -0
  44. package/dist/core/index.d.ts +8 -0
  45. package/dist/core/index.d.ts.map +1 -0
  46. package/dist/core/index.mjs +2789 -0
  47. package/dist/core/paste-engine.d.ts +7 -0
  48. package/dist/core/paste-engine.d.ts.map +1 -0
  49. package/dist/core/types.d.ts +88 -0
  50. package/dist/core/types.d.ts.map +1 -0
  51. package/dist/react/FableEditor.d.ts +13 -0
  52. package/dist/react/FableEditor.d.ts.map +1 -0
  53. package/dist/react/index.cjs +41 -0
  54. package/dist/react/index.d.ts +3 -0
  55. package/dist/react/index.d.ts.map +1 -0
  56. package/dist/react/index.mjs +3471 -0
  57. package/package.json +105 -0
  58. package/style.css +1175 -0
@@ -0,0 +1,482 @@
1
+ const ALLOWED_TAGS = new Set([
2
+ 'p',
3
+ 'div',
4
+ 'span',
5
+ 'br',
6
+ 'hr',
7
+ 'a',
8
+ 'b',
9
+ 'strong',
10
+ 'i',
11
+ 'em',
12
+ 'u',
13
+ 's',
14
+ 'strike',
15
+ 'sub',
16
+ 'sup',
17
+ 'h1',
18
+ 'h2',
19
+ 'h3',
20
+ 'h4',
21
+ 'h5',
22
+ 'h6',
23
+ 'blockquote',
24
+ 'pre',
25
+ 'code',
26
+ 'ul',
27
+ 'ol',
28
+ 'li',
29
+ 'table',
30
+ 'thead',
31
+ 'tbody',
32
+ 'tfoot',
33
+ 'tr',
34
+ 'td',
35
+ 'th',
36
+ 'caption',
37
+ 'colgroup',
38
+ 'col',
39
+ 'img',
40
+ 'figure',
41
+ 'figcaption',
42
+ 'mark'
43
+ ]);
44
+ const ALLOWED_STYLES = new Set([
45
+ 'text-align',
46
+ 'direction',
47
+ 'unicode-bidi',
48
+ 'font-weight',
49
+ 'font-style',
50
+ 'text-decoration',
51
+ 'text-decoration-line',
52
+ 'color',
53
+ 'background-color',
54
+ 'background',
55
+ 'background-image',
56
+ 'background-position',
57
+ 'background-repeat',
58
+ 'background-size',
59
+ 'font-size',
60
+ 'font-family',
61
+ 'line-height',
62
+ 'letter-spacing',
63
+ 'vertical-align',
64
+ 'text-indent',
65
+ 'margin',
66
+ 'margin-top',
67
+ 'margin-bottom',
68
+ 'margin-left',
69
+ 'margin-right',
70
+ 'margin-inline-start',
71
+ 'margin-inline-end',
72
+ 'padding',
73
+ 'padding-top',
74
+ 'padding-bottom',
75
+ 'padding-left',
76
+ 'padding-right',
77
+ 'width',
78
+ 'height',
79
+ 'min-width',
80
+ 'max-width',
81
+ 'min-height',
82
+ 'max-height',
83
+ 'border',
84
+ 'border-top',
85
+ 'border-right',
86
+ 'border-bottom',
87
+ 'border-left',
88
+ 'border-color',
89
+ 'border-style',
90
+ 'border-width',
91
+ 'border-radius',
92
+ 'border-collapse',
93
+ 'border-spacing',
94
+ 'table-layout',
95
+ 'float',
96
+ 'display',
97
+ 'box-sizing',
98
+ 'list-style-type',
99
+ 'white-space'
100
+ ]);
101
+ const ALLOWED_ATTRS = {
102
+ '*': ['dir', 'lang', 'colspan', 'rowspan'],
103
+ a: ['href', 'target', 'rel', 'title'],
104
+ img: ['src', 'alt', 'width', 'height', 'title'],
105
+ col: ['span', 'width'],
106
+ td: ['width', 'valign'],
107
+ th: ['width', 'valign'],
108
+ table: ['width', 'cellpadding', 'cellspacing']
109
+ };
110
+ export function styleMap(el) {
111
+ const map = {};
112
+ const raw = el.getAttribute && el.getAttribute('style');
113
+ if (!raw)
114
+ return map;
115
+ raw.split(';').forEach((p) => {
116
+ const i = p.indexOf(':');
117
+ if (i < 1)
118
+ return;
119
+ map[p.slice(0, i).trim().toLowerCase()] = p.slice(i + 1).trim();
120
+ });
121
+ return map;
122
+ }
123
+ function preClean(html) {
124
+ return html
125
+ .replace(/<!--\[if !supportLists\]-->([\s\S]*?)<!--\[endif\]-->/gi, '$1')
126
+ .replace(/<!--\[if !supportLists\]>([\s\S]*?)<!\[endif\]-->/gi, '$1')
127
+ .replace(/<!\[if !supportLists\]>([\s\S]*?)<!\[endif\]>/gi, '$1')
128
+ .replace(/<!--\[if [\s\S]*?<!\[endif\]-->/gi, '')
129
+ .replace(/<!--[\s\S]*?-->/g, '')
130
+ .replace(/<(script|style|xml|title)[\s\S]*?<\/\1>/gi, '')
131
+ .replace(/<\/?(meta|link)[^>]*>/gi, '')
132
+ .replace(/<\?xml[\s\S]*?\?>/gi, '')
133
+ .replace(/<\/?(o|v|w|m|st1):[^>]*>/gi, '');
134
+ }
135
+ function markerType(mt) {
136
+ if (/^[0-9]+[\.\)،]/.test(mt))
137
+ return { ordered: true };
138
+ if (/^[٠-٩۰-۹]+/.test(mt))
139
+ return { ordered: true, style: 'arabic-indic' };
140
+ if (/^[ivxlc]{2,}[\.\)]/.test(mt))
141
+ return { ordered: true, style: 'lower-roman' };
142
+ if (/^[IVXLC]{2,}[\.\)]/.test(mt))
143
+ return { ordered: true, style: 'upper-roman' };
144
+ if (/^[a-z][\.\)]/.test(mt))
145
+ return { ordered: true, style: 'lower-alpha' };
146
+ if (/^[A-Z][\.\)]/.test(mt))
147
+ return { ordered: true, style: 'upper-alpha' };
148
+ if (/^[ء-ي][\.\)،-]/.test(mt))
149
+ return { ordered: true, style: 'arabic-indic' };
150
+ return { ordered: false };
151
+ }
152
+ function rebuildWordLists(doc) {
153
+ const isListP = (p) => {
154
+ const s = (p.getAttribute('style') || '') + ' ' + (p.className || '');
155
+ return /mso-list\s*:(?!\s*ignore)/i.test(s) || /MsoListParagraph/i.test(s);
156
+ };
157
+ const groups = [];
158
+ let cur = null;
159
+ Array.from(doc.body.querySelectorAll('p')).forEach((p) => {
160
+ if (!isListP(p)) {
161
+ cur = null;
162
+ return;
163
+ }
164
+ const prev = p.previousElementSibling;
165
+ if (cur && prev && cur[cur.length - 1] === prev)
166
+ cur.push(p);
167
+ else {
168
+ cur = [p];
169
+ groups.push(cur);
170
+ }
171
+ });
172
+ groups.forEach((group) => {
173
+ const stack = [];
174
+ const rootAnchor = group[0];
175
+ group.forEach((p) => {
176
+ const style = p.getAttribute('style') || '';
177
+ const level = +(style.match(/level(\d+)/i)?.[1] || 1);
178
+ const marker = Array.from(p.querySelectorAll('span')).find((sp) => /mso-list\s*:\s*ignore/i.test(sp.getAttribute('style') || ''));
179
+ const mt = marker
180
+ ? marker.textContent?.trim() || ''
181
+ : (p.textContent?.trim().match(/^\S{1,4}/) || [''])[0];
182
+ const { ordered, style: listStyle } = markerType(mt);
183
+ if (marker)
184
+ marker.remove();
185
+ while (stack.length && stack[stack.length - 1].level > level)
186
+ stack.pop();
187
+ if (!stack.length || stack[stack.length - 1].level < level) {
188
+ const list = doc.createElement(ordered ? 'ol' : 'ul');
189
+ if (ordered && listStyle)
190
+ list.style.listStyleType = listStyle;
191
+ if (stack.length) {
192
+ const par = stack[stack.length - 1].list;
193
+ (par.lastElementChild || par).appendChild(list);
194
+ }
195
+ else {
196
+ rootAnchor.parentNode.insertBefore(list, rootAnchor);
197
+ }
198
+ stack.push({ list, level });
199
+ }
200
+ const li = doc.createElement('li');
201
+ const keep = styleMap(p);
202
+ const kept = ['text-align', 'direction', 'unicode-bidi', 'color', 'font-size', 'font-family', 'background-color']
203
+ .filter((k) => keep[k])
204
+ .map((k) => k + ':' + keep[k])
205
+ .join(';');
206
+ if (kept)
207
+ li.setAttribute('style', kept);
208
+ if (p.getAttribute('dir'))
209
+ li.setAttribute('dir', p.getAttribute('dir'));
210
+ while (p.firstChild)
211
+ li.appendChild(p.firstChild);
212
+ stack[stack.length - 1].list.appendChild(li);
213
+ p.remove();
214
+ });
215
+ });
216
+ }
217
+ function fixGoogleDocs(doc) {
218
+ doc.querySelectorAll('b[id^="docs-internal-guid"]').forEach((b) => {
219
+ while (b.firstChild)
220
+ b.parentNode.insertBefore(b.firstChild, b);
221
+ b.remove();
222
+ });
223
+ }
224
+ function fixLegacyAttrs(doc) {
225
+ doc.querySelectorAll('table').forEach((tb) => {
226
+ const htmlTb = tb;
227
+ if (!styleMap(htmlTb)['border-collapse'])
228
+ htmlTb.style.borderCollapse = 'collapse';
229
+ });
230
+ doc.querySelectorAll('[align]').forEach((el) => {
231
+ const htmlEl = el;
232
+ const v = htmlEl.getAttribute('align').toLowerCase();
233
+ if (htmlEl.tagName.toLowerCase() === 'table') {
234
+ if (v === 'center') {
235
+ htmlEl.style.marginLeft = htmlEl.style.marginLeft || 'auto';
236
+ htmlEl.style.marginRight = htmlEl.style.marginRight || 'auto';
237
+ }
238
+ else if (v === 'right')
239
+ htmlEl.style.marginLeft = htmlEl.style.marginLeft || 'auto';
240
+ else if (v === 'left')
241
+ htmlEl.style.marginRight = htmlEl.style.marginRight || 'auto';
242
+ }
243
+ else if (['left', 'right', 'center', 'justify'].includes(v)) {
244
+ htmlEl.style.textAlign = htmlEl.style.textAlign || v;
245
+ // Word aligns tables by wrapping them in <div align=...>; text-align
246
+ // does not move a table box, so mirror the alignment onto the table.
247
+ Array.from(htmlEl.children).forEach((ch) => {
248
+ if (ch.tagName.toLowerCase() !== 'table')
249
+ return;
250
+ const tb = ch;
251
+ if (v === 'center') {
252
+ tb.style.marginLeft = tb.style.marginLeft || 'auto';
253
+ tb.style.marginRight = tb.style.marginRight || 'auto';
254
+ }
255
+ else if (v === 'right')
256
+ tb.style.marginLeft = tb.style.marginLeft || 'auto';
257
+ else if (v === 'left')
258
+ tb.style.marginRight = tb.style.marginRight || 'auto';
259
+ });
260
+ }
261
+ htmlEl.removeAttribute('align');
262
+ });
263
+ doc.querySelectorAll('center table').forEach((tb) => {
264
+ const htmlTb = tb;
265
+ htmlTb.style.marginLeft = htmlTb.style.marginLeft || 'auto';
266
+ htmlTb.style.marginRight = htmlTb.style.marginRight || 'auto';
267
+ });
268
+ doc.querySelectorAll('[bgcolor]').forEach((el) => {
269
+ const htmlEl = el;
270
+ htmlEl.style.backgroundColor = htmlEl.style.backgroundColor || htmlEl.getAttribute('bgcolor');
271
+ htmlEl.removeAttribute('bgcolor');
272
+ });
273
+ }
274
+ function sanitize(node, doc) {
275
+ Array.from(node.childNodes).forEach((child) => {
276
+ if (child.nodeType === Node.COMMENT_NODE) {
277
+ child.remove();
278
+ return;
279
+ }
280
+ if (child.nodeType !== Node.ELEMENT_NODE)
281
+ return;
282
+ const el = child;
283
+ const tag = el.tagName.toLowerCase();
284
+ if (!ALLOWED_TAGS.has(tag)) {
285
+ if (tag === 'font') {
286
+ const span = doc.createElement('span');
287
+ if (el.getAttribute('style'))
288
+ span.setAttribute('style', el.getAttribute('style'));
289
+ if (el.getAttribute('color'))
290
+ span.style.color = el.getAttribute('color');
291
+ if (el.getAttribute('face'))
292
+ span.style.fontFamily = el.getAttribute('face');
293
+ const sz = el.getAttribute('size');
294
+ if (sz && !span.style.fontSize) {
295
+ const szMap = {
296
+ '1': '8pt',
297
+ '2': '10pt',
298
+ '3': '12pt',
299
+ '4': '14pt',
300
+ '5': '18pt',
301
+ '6': '24pt',
302
+ '7': '36pt'
303
+ };
304
+ if (szMap[sz])
305
+ span.style.fontSize = szMap[sz];
306
+ }
307
+ while (el.firstChild)
308
+ span.appendChild(el.firstChild);
309
+ el.replaceWith(span);
310
+ sanitize(span, doc);
311
+ return;
312
+ }
313
+ sanitize(el, doc);
314
+ while (el.firstChild)
315
+ el.parentNode.insertBefore(el.firstChild, el);
316
+ el.remove();
317
+ return;
318
+ }
319
+ const allowed = new Set([...(ALLOWED_ATTRS['*'] || []), ...(ALLOWED_ATTRS[tag] || [])]);
320
+ Array.from(el.attributes).forEach((a) => {
321
+ const n = a.name.toLowerCase();
322
+ if (n !== 'style' && !allowed.has(n))
323
+ el.removeAttribute(a.name);
324
+ });
325
+ if (tag === 'a') {
326
+ const href = el.getAttribute('href') || '';
327
+ if (!/^(https?:|mailto:|tel:|#)/i.test(href))
328
+ el.removeAttribute('href');
329
+ }
330
+ if (tag === 'img') {
331
+ const src = el.getAttribute('src') || '';
332
+ if (!/^(https?:|data:image\/|blob:)/i.test(src)) {
333
+ const ph = doc.createElement('span');
334
+ ph.textContent = '[local image — paste it separately]';
335
+ ph.setAttribute('style', 'color:#a33;font-style:italic;font-size:12px');
336
+ el.replaceWith(ph);
337
+ return;
338
+ }
339
+ }
340
+ const styles = styleMap(el);
341
+ const kept = [];
342
+ for (const [k, v] of Object.entries(styles)) {
343
+ if (!ALLOWED_STYLES.has(k))
344
+ continue;
345
+ if (/expression|javascript|url\s*\(\s*['"]?\s*file:/i.test(v))
346
+ continue;
347
+ if (k === 'font-weight' && /^(400|normal)$/i.test(v))
348
+ continue;
349
+ if (k === 'font-style' && /^normal$/i.test(v))
350
+ continue;
351
+ if (k === 'text-decoration' && /^none$/i.test(v))
352
+ continue;
353
+ kept.push(k + ':' + v);
354
+ }
355
+ if (kept.length)
356
+ el.setAttribute('style', kept.join(';'));
357
+ else
358
+ el.removeAttribute('style');
359
+ el.removeAttribute('class');
360
+ sanitize(el, doc);
361
+ if (tag === 'span' && !el.attributes.length) {
362
+ while (el.firstChild)
363
+ el.parentNode.insertBefore(el.firstChild, el);
364
+ el.remove();
365
+ }
366
+ });
367
+ }
368
+ function extractStyleRules(raw) {
369
+ const rules = [];
370
+ const re = /<style[^>]*>([\s\S]*?)<\/style>/gi;
371
+ let m;
372
+ while ((m = re.exec(raw))) {
373
+ let css = m[1].replace(/<!--|-->/g, '').replace(/\/\*[\s\S]*?\*\//g, '');
374
+ css = css.replace(/@media[^{]*\{(?:[^{}]*\{[^{}]*\})*[^{}]*\}/gi, '');
375
+ css = css.replace(/@[\w-]+[^{]*\{[^{}]*\}/g, '');
376
+ let rm;
377
+ const rre = /([^{}]+)\{([^}]*)\}/g;
378
+ while ((rm = rre.exec(css))) {
379
+ const decls = rm[2]
380
+ .split(';')
381
+ .map((d) => {
382
+ const i = d.indexOf(':');
383
+ if (i < 1)
384
+ return null;
385
+ return [d.slice(0, i).trim().toLowerCase(), d.slice(i + 1).trim()];
386
+ })
387
+ .filter((d) => !!d && !!d[1]);
388
+ if (!decls.length)
389
+ continue;
390
+ rm[1]
391
+ .split(',')
392
+ .map((s) => s.trim())
393
+ .filter((s) => s && !s.startsWith('@'))
394
+ .forEach((sel) => rules.push({ sel, decls }));
395
+ }
396
+ }
397
+ return rules;
398
+ }
399
+ function applyStyleRules(doc, rules) {
400
+ if (!rules.length)
401
+ return;
402
+ const addMap = new Map();
403
+ rules.forEach(({ sel, decls }) => {
404
+ let els;
405
+ try {
406
+ els = doc.querySelectorAll(sel);
407
+ }
408
+ catch (e) {
409
+ return;
410
+ }
411
+ els.forEach((el) => {
412
+ let m = addMap.get(el);
413
+ if (!m) {
414
+ m = {};
415
+ addMap.set(el, m);
416
+ }
417
+ decls.forEach(([k, v]) => {
418
+ m[k] = v;
419
+ });
420
+ });
421
+ });
422
+ addMap.forEach((m, el) => {
423
+ const have = styleMap(el);
424
+ const hasDir = el.hasAttribute('dir');
425
+ const hasAlign = el.hasAttribute('align');
426
+ const add = Object.entries(m).filter(([k]) => {
427
+ if (k in have)
428
+ return false;
429
+ if ((k === 'direction' || k === 'unicode-bidi') && hasDir)
430
+ return false;
431
+ if (k === 'text-align' && (hasAlign || hasDir))
432
+ return false;
433
+ if ((k === 'background' || k === 'background-color') && el.hasAttribute('bgcolor'))
434
+ return false;
435
+ return true;
436
+ });
437
+ if (!add.length)
438
+ return;
439
+ const prefix = add.map(([k, v]) => k + ':' + v).join(';');
440
+ const cur = el.getAttribute('style');
441
+ el.setAttribute('style', cur ? prefix + ';' + cur : prefix);
442
+ });
443
+ }
444
+ function normalizeArabicPresentation(s) {
445
+ return s.replace(/[ﭐ-﷿ﹰ-ﻼ]+/g, (m) => m.normalize('NFKC'));
446
+ }
447
+ function normalizeArabicText(doc) {
448
+ const w = doc.createTreeWalker(doc.body, NodeFilter.SHOW_TEXT, null);
449
+ let n;
450
+ while ((n = w.nextNode()))
451
+ if (/[ﭐ-﷿ﹰ-ﻼ]/.test(n.nodeValue || ''))
452
+ n.nodeValue = normalizeArabicPresentation(n.nodeValue || '');
453
+ }
454
+ export function cleanPastedHTML(raw, editorDir = 'ltr') {
455
+ const cssRules = extractStyleRules(raw);
456
+ const doc = new DOMParser().parseFromString(preClean(raw), 'text/html');
457
+ applyStyleRules(doc, cssRules);
458
+ if (/class="?Mso|mso-|urn:schemas-microsoft-com/i.test(doc.body.innerHTML))
459
+ rebuildWordLists(doc);
460
+ fixGoogleDocs(doc);
461
+ fixLegacyAttrs(doc);
462
+ sanitize(doc.body, doc);
463
+ normalizeArabicText(doc);
464
+ const emptyP = (el) => el && el.tagName === 'P' && !el.textContent?.trim() && !el.querySelector('img,table');
465
+ while (emptyP(doc.body.firstElementChild))
466
+ doc.body.firstElementChild.remove();
467
+ while (emptyP(doc.body.lastElementChild))
468
+ doc.body.lastElementChild.remove();
469
+ return doc.body.innerHTML.trim();
470
+ }
471
+ export function normalizeTextPaste(raw) {
472
+ const txt = normalizeArabicPresentation(raw).replace(/\r/g, '');
473
+ const esc = (s) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
474
+ if (/\n/.test(txt)) {
475
+ return txt
476
+ .split(/\n{2,}/)
477
+ .map((par) => `<p dir="auto">${esc(par).replace(/\n/g, '<br>') || '<br>'}</p>`)
478
+ .join('');
479
+ }
480
+ return esc(txt);
481
+ }
482
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzdGUtZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvcmUvcGFzdGUtZW5naW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDO0lBQzNCLEdBQUc7SUFDSCxLQUFLO0lBQ0wsTUFBTTtJQUNOLElBQUk7SUFDSixJQUFJO0lBQ0osR0FBRztJQUNILEdBQUc7SUFDSCxRQUFRO0lBQ1IsR0FBRztJQUNILElBQUk7SUFDSixHQUFHO0lBQ0gsR0FBRztJQUNILFFBQVE7SUFDUixLQUFLO0lBQ0wsS0FBSztJQUNMLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLFlBQVk7SUFDWixLQUFLO0lBQ0wsTUFBTTtJQUNOLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7SUFDSixTQUFTO0lBQ1QsVUFBVTtJQUNWLEtBQUs7SUFDTCxLQUFLO0lBQ0wsUUFBUTtJQUNSLFlBQVk7SUFDWixNQUFNO0NBQ1AsQ0FBQyxDQUFDO0FBRUgsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDN0IsWUFBWTtJQUNaLFdBQVc7SUFDWCxjQUFjO0lBQ2QsYUFBYTtJQUNiLFlBQVk7SUFDWixpQkFBaUI7SUFDakIsc0JBQXNCO0lBQ3RCLE9BQU87SUFDUCxrQkFBa0I7SUFDbEIsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixxQkFBcUI7SUFDckIsbUJBQW1CO0lBQ25CLGlCQUFpQjtJQUNqQixXQUFXO0lBQ1gsYUFBYTtJQUNiLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixRQUFRO0lBQ1IsWUFBWTtJQUNaLGVBQWU7SUFDZixhQUFhO0lBQ2IsY0FB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QyxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBBTExPV0VEX1RBR1MgPSBuZXcgU2V0KFtcbiAgJ3AnLFxuICAnZGl2JyxcbiAgJ3NwYW4nLFxuICAnYnInLFxuICAnaHInLFxuICAnYScsXG4gICdiJyxcbiAgJ3N0cm9uZycsXG4gICdpJyxcbiAgJ2VtJyxcbiAgJ3UnLFxuICAncycsXG4gICdzdHJpa2UnLFxuICAnc3ViJyxcbiAgJ3N1cCcsXG4gICdoMScsXG4gICdoMicsXG4gICdoMycsXG4gICdoNCcsXG4gICdoNScsXG4gICdoNicsXG4gICdibG9ja3F1b3RlJyxcbiAgJ3ByZScsXG4gICdjb2RlJyxcbiAgJ3VsJyxcbiAgJ29sJyxcbiAgJ2xpJyxcbiAgJ3RhYmxlJyxcbiAgJ3RoZWFkJyxcbiAgJ3Rib2R5JyxcbiAgJ3Rmb290JyxcbiAgJ3RyJyxcbiAgJ3RkJyxcbiAgJ3RoJyxcbiAgJ2NhcHRpb24nLFxuICAnY29sZ3JvdXAnLFxuICAnY29sJyxcbiAgJ2ltZycsXG4gICdmaWd1cmUnLFxuICAnZmlnY2FwdGlvbicsXG4gICdtYXJrJ1xuXSk7XG5cbmNvbnN0IEFMTE9XRURfU1RZTEVTID0gbmV3IFNldChbXG4gICd0ZXh0LWFsaWduJyxcbiAgJ2RpcmVjdGlvbicsXG4gICd1bmljb2RlLWJpZGknLFxuICAnZm9udC13ZWlnaHQnLFxuICAnZm9udC1zdHlsZScsXG4gICd0ZXh0LWRlY29yYXRpb24nLFxuICAndGV4dC1kZWNvcmF0aW9uLWxpbmUnLFxuICAnY29sb3InLFxuICAnYmFja2dyb3VuZC1jb2xvcicsXG4gICdiYWNrZ3JvdW5kJyxcbiAgJ2JhY2tncm91bmQtaW1hZ2UnLFxuICAnYmFja2dyb3VuZC1wb3NpdGlvbicsXG4gICdiYWNrZ3JvdW5kLXJlcGVhdCcsXG4gICdiYWNrZ3JvdW5kLXNpemUnLFxuICAnZm9udC1zaXplJyxcbiAgJ2ZvbnQtZmFtaWx5JyxcbiAgJ2xpbmUtaGVpZ2h0JyxcbiAgJ2xldHRlci1zcGFjaW5nJyxcbiAgJ3ZlcnRpY2FsLWFsaWduJyxcbiAgJ3RleHQtaW5kZW50JyxcbiAgJ21hcmdpbicsXG4gICdtYXJnaW4tdG9wJyxcbiAgJ21hcmdpbi1ib3R0b20nLFxuICAnbWFyZ2luLWxlZnQnLFxuICAnbWFyZ2luLXJpZ2h0JyxcbiAgJ21hcmdpbi1pbmxpbmUtc3RhcnQnLFxuICAnbWFyZ2luLWlubGluZS1lbmQnLFxuICAncGFkZGluZycsXG4gICdwYWRkaW5nLXRvcCcsXG4gICdwYWRkaW5nLWJvdHRvbScsXG4gICdwYWRkaW5nLWxlZnQnLFxuICAncGFkZGluZy1yaWdodCcsXG4gICd3aWR0aCcsXG4gICdoZWlnaHQnLFxuICAnbWluLXdpZHRoJyxcbiAgJ21heC13aWR0aCcsXG4gICdtaW4taGVpZ2h0JyxcbiAgJ21heC1oZWlnaHQnLFxuICAnYm9yZGVyJyxcbiAgJ2JvcmRlci10b3AnLFxuICAnYm9yZGVyLXJpZ2h0JyxcbiAgJ2JvcmRlci1ib3R0b20nLFxuICAnYm9yZGVyLWxlZnQnLFxuICAnYm9yZGVyLWNvbG9yJyxcbiAgJ2JvcmRlci1zdHlsZScsXG4gICdib3JkZXItd2lkdGgnLFxuICAnYm9yZGVyLXJhZGl1cycsXG4gICdib3JkZXItY29sbGFwc2UnLFxuICAnYm9yZGVyLXNwYWNpbmcnLFxuICAndGFibGUtbGF5b3V0JyxcbiAgJ2Zsb2F0JyxcbiAgJ2Rpc3BsYXknLFxuICAnYm94LXNpemluZycsXG4gICdsaXN0LXN0eWxlLXR5cGUnLFxuICAnd2hpdGUtc3BhY2UnXG5dKTtcblxuY29uc3QgQUxMT1dFRF9BVFRSUzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge1xuICAnKic6IFsnZGlyJywgJ2xhbmcnLCAnY29sc3BhbicsICdyb3dzcGFuJ10sXG4gIGE6IFsnaHJlZicsICd0YXJnZXQnLCAncmVsJywgJ3RpdGxlJ10sXG4gIGltZzogWydzcmMnLCAnYWx0JywgJ3dpZHRoJywgJ2hlaWdodCcsICd0aXRsZSddLFxuICBjb2w6IFsnc3BhbicsICd3aWR0aCddLFxuICB0ZDogWyd3aWR0aCcsICd2YWxpZ24nXSxcbiAgdGg6IFsnd2lkdGgnLCAndmFsaWduJ10sXG4gIHRhYmxlOiBbJ3dpZHRoJywgJ2NlbGxwYWRkaW5nJywgJ2NlbGxzcGFjaW5nJ11cbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3R5bGVNYXAge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHlsZU1hcChlbDogRWxlbWVudCk6IFN0eWxlTWFwIHtcbiAgY29uc3QgbWFwOiBTdHlsZU1hcCA9IHt9O1xuICBjb25zdCByYXcgPSBlbC5nZXRBdHRyaWJ1dGUgJiYgZWwuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuICBpZiAoIXJhdykgcmV0dXJuIG1hcDtcbiAgcmF3LnNwbGl0KCc7JykuZm9yRWFjaCgocCkgPT4ge1xuICAgIGNvbnN0IGkgPSBwLmluZGV4T2YoJzonKTtcbiAgICBpZiAoaSA8IDEpIHJldHVybjtcbiAgICBtYXBbcC5zbGljZSgwLCBpKS50cmltKCkudG9Mb3dlckNhc2UoKV0gPSBwLnNsaWNlKGkgKyAxKS50cmltKCk7XG4gIH0pO1xuICByZXR1cm4gbWFwO1xufVxuXG5mdW5jdGlvbiBwcmVDbGVhbihodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaHRtbFxuICAgIC5yZXBsYWNlKC88IS0tXFxbaWYgIXN1cHBvcnRMaXN0c1xcXS0tPihbXFxzXFxTXSo/KTwhLS1cXFtlbmRpZlxcXS0tPi9naSwgJyQxJylcbiAgICAucmVwbGFjZSgvPCEtLVxcW2lmICFzdXBwb3J0TGlzdHNcXF0+KFtcXHNcXFNdKj8pPCFcXFtlbmRpZlxcXS0tPi9naSwgJyQxJylcbiAgICAucmVwbGFjZSgvPCFcXFtpZiAhc3VwcG9ydExpc3RzXFxdPihbXFxzXFxTXSo/KTwhXFxbZW5kaWZcXF0+L2dpLCAnJDEnKVxuICAgIC5yZXBsYWNlKC88IS0tXFxbaWYgW1xcc1xcU10qPzwhXFxbZW5kaWZcXF0tLT4vZ2ksICcnKVxuICAgIC5yZXBsYWNlKC88IS0tW1xcc1xcU10qPy0tPi9nLCAnJylcbiAgICAucmVwbGFjZSgvPChzY3JpcHR8c3R5bGV8eG1sfHRpdGxlKVtcXHNcXFNdKj88XFwvXFwxPi9naSwgJycpXG4gICAgLnJlcGxhY2UoLzxcXC8/KG1ldGF8bGluaylbXj5dKj4vZ2ksICcnKVxuICAgIC5yZXBsYWNlKC88XFw/eG1sW1xcc1xcU10qP1xcPz4vZ2ksICcnKVxuICAgIC5yZXBsYWNlKC88XFwvPyhvfHZ8d3xtfHN0MSk6W14+XSo+L2dpLCAnJyk7XG59XG5cbmludGVyZmFjZSBNYXJrZXJJbmZvIHtcbiAgb3JkZXJlZDogYm9vbGVhbjtcbiAgc3R5bGU/OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIG1hcmtlclR5cGUobXQ6IHN0cmluZyk6IE1hcmtlckluZm8ge1xuICBpZiAoL15bMC05XStbXFwuXFwp2IxdLy50ZXN0KG10KSkgcmV0dXJuIHsgb3JkZXJlZDogdHJ1ZSB9O1xuICBpZiAoL15b2aAt2anbsC3buV0rLy50ZXN0KG10KSkgcmV0dXJuIHsgb3JkZXJlZDogdHJ1ZSwgc3R5bGU6ICdhcmFiaWMtaW5kaWMnIH07XG4gIGlmICgvXltpdnhsY117Mix9W1xcLlxcKV0vLnRlc3QobXQpKSByZXR1cm4geyBvcmRlcmVkOiB0cnVlLCBzdHlsZTogJ2xvd2VyLXJvbWFuJyB9O1xuICBpZiAoL15bSVZYTENdezIsfVtcXC5cXCldLy50ZXN0KG10KSkgcmV0dXJuIHsgb3JkZXJlZDogdHJ1ZSwgc3R5bGU6ICd1cHBlci1yb21hbicgfTtcbiAgaWYgKC9eW2Etel1bXFwuXFwpXS8udGVzdChtdCkpIHJldHVybiB7IG9yZGVyZWQ6IHRydWUsIHN0eWxlOiAnbG93ZXItYWxwaGEnIH07XG4gIGlmICgvXltBLVpdW1xcLlxcKV0vLnRlc3QobXQpKSByZXR1cm4geyBvcmRlcmVkOiB0cnVlLCBzdHlsZTogJ3VwcGVyLWFscGhhJyB9O1xuICBpZiAoL15b2KEt2YpdW1xcLlxcKdiMLV0vLnRlc3QobXQpKSByZXR1cm4geyBvcmRlcmVkOiB0cnVlLCBzdHlsZTogJ2FyYWJpYy1pbmRpYycgfTtcbiAgcmV0dXJuIHsgb3JkZXJlZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gcmVidWlsZFdvcmRMaXN0cyhkb2M6IERvY3VtZW50KTogdm9pZCB7XG4gIGNvbnN0IGlzTGlzdFAgPSAocDogRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHMgPSAocC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykgfHwgJycpICsgJyAnICsgKHAuY2xhc3NOYW1lIHx8ICcnKTtcbiAgICByZXR1cm4gL21zby1saXN0XFxzKjooPyFcXHMqaWdub3JlKS9pLnRlc3QocykgfHwgL01zb0xpc3RQYXJhZ3JhcGgvaS50ZXN0KHMpO1xuICB9O1xuICBjb25zdCBncm91cHM6IEhUTUxQYXJhZ3JhcGhFbGVtZW50W11bXSA9IFtdO1xuICBsZXQgY3VyOiBIVE1MUGFyYWdyYXBoRWxlbWVudFtdIHwgbnVsbCA9IG51bGw7XG4gIEFycmF5LmZyb20oZG9jLmJvZHkucXVlcnlTZWxlY3RvckFsbCgncCcpKS5mb3JFYWNoKChwKSA9PiB7XG4gICAgaWYgKCFpc0xpc3RQKHApKSB7XG4gICAgICBjdXIgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcmV2ID0gcC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgIGlmIChjdXIgJiYgcHJldiAmJiBjdXJbY3VyLmxlbmd0aCAtIDFdID09PSBwcmV2KSBjdXIucHVzaChwKTtcbiAgICBlbHNlIHtcbiAgICAgIGN1ciA9IFtwXTtcbiAgICAgIGdyb3Vwcy5wdXNoKGN1cik7XG4gICAgfVxuICB9KTtcbiAgZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgY29uc3Qgc3RhY2s6IHsgbGlzdDogSFRNTE9MaXN0RWxlbWVudCB8IEhUTUxVTGlzdEVsZW1lbnQ7IGxldmVsOiBudW1iZXIgfVtdID0gW107XG4gICAgY29uc3Qgcm9vdEFuY2hvciA9IGdyb3VwWzBdO1xuICAgIGdyb3VwLmZvckVhY2goKHApID0+IHtcbiAgICAgIGNvbnN0IHN0eWxlID0gcC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykgfHwgJyc7XG4gICAgICBjb25zdCBsZXZlbCA9ICsoc3R5bGUubWF0Y2goL2xldmVsKFxcZCspL2kpPy5bMV0gfHwgMSk7XG4gICAgICBjb25zdCBtYXJrZXIgPSBBcnJheS5mcm9tKHAucXVlcnlTZWxlY3RvckFsbCgnc3BhbicpKS5maW5kKChzcCkgPT5cbiAgICAgICAgL21zby1saXN0XFxzKjpcXHMqaWdub3JlL2kudGVzdChzcC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykgfHwgJycpXG4gICAgICApO1xuICAgICAgY29uc3QgbXQgPSBtYXJrZXJcbiAgICAgICAgPyBtYXJrZXIudGV4dENvbnRlbnQ/LnRyaW0oKSB8fCAnJ1xuICAgICAgICA6IChwLnRleHRDb250ZW50Py50cmltKCkubWF0Y2goL15cXFN7MSw0fS8pIHx8IFsnJ10pWzBdO1xuICAgICAgY29uc3QgeyBvcmRlcmVkLCBzdHlsZTogbGlzdFN0eWxlIH0gPSBtYXJrZXJUeXBlKG10KTtcbiAgICAgIGlmIChtYXJrZXIpIG1hcmtlci5yZW1vdmUoKTtcbiAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggJiYgc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0ubGV2ZWwgPiBsZXZlbCkgc3RhY2sucG9wKCk7XG4gICAgICBpZiAoIXN0YWNrLmxlbmd0aCB8fCBzdGFja1tzdGFjay5sZW5ndGggLSAxXS5sZXZlbCA8IGxldmVsKSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBkb2MuY3JlYXRlRWxlbWVudChvcmRlcmVkID8gJ29sJyA6ICd1bCcpO1xuICAgICAgICBpZiAob3JkZXJlZCAmJiBsaXN0U3R5bGUpIGxpc3Quc3R5bGUubGlzdFN0eWxlVHlwZSA9IGxpc3RTdHlsZTtcbiAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHBhciA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdLmxpc3Q7XG4gICAgICAgICAgKHBhci5sYXN0RWxlbWVudENoaWxkIHx8IHBhcikuYXBwZW5kQ2hpbGQobGlzdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcm9vdEFuY2hvci5wYXJlbnROb2RlIS5pbnNlcnRCZWZvcmUobGlzdCwgcm9vdEFuY2hvcik7XG4gICAgICAgIH1cbiAgICAgICAgc3RhY2sucHVzaCh7IGxpc3QsIGxldmVsIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgbGkgPSBkb2MuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICAgIGNvbnN0IGtlZXAgPSBzdHlsZU1hcChwKTtcbiAgICAgIGNvbnN0IGtlcHQgPSBbJ3RleHQtYWxpZ24nLCAnZGlyZWN0aW9uJywgJ3VuaWNvZGUtYmlkaScsICdjb2xvcicsICdmb250LXNpemUnLCAnZm9udC1mYW1pbHknLCAnYmFja2dyb3VuZC1jb2xvciddXG4gICAgICAgIC5maWx0ZXIoKGspID0+IGtlZXBba10pXG4gICAgICAgIC5tYXAoKGspID0+IGsgKyAnOicgKyBrZWVwW2tdKVxuICAgICAgICAuam9pbignOycpO1xuICAgICAgaWYgKGtlcHQpIGxpLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBrZXB0KTtcbiAgICAgIGlmIChwLmdldEF0dHJpYnV0ZSgnZGlyJykpIGxpLnNldEF0dHJpYnV0ZSgnZGlyJywgcC5nZXRBdHRyaWJ1dGUoJ2RpcicpISk7XG4gICAgICB3aGlsZSAocC5maXJzdENoaWxkKSBsaS5hcHBlbmRDaGlsZChwLmZpcnN0Q2hpbGQpO1xuICAgICAgc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0ubGlzdC5hcHBlbmRDaGlsZChsaSk7XG4gICAgICBwLnJlbW92ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZml4R29vZ2xlRG9jcyhkb2M6IERvY3VtZW50KTogdm9pZCB7XG4gIGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdiW2lkXj1cImRvY3MtaW50ZXJuYWwtZ3VpZFwiXScpLmZvckVhY2goKGIpID0+IHtcbiAgICB3aGlsZSAoYi5maXJzdENoaWxkKSBiLnBhcmVudE5vZGUhLmluc2VydEJlZm9yZShiLmZpcnN0Q2hpbGQsIGIpO1xuICAgIGIucmVtb3ZlKCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmaXhMZWdhY3lBdHRycyhkb2M6IERvY3VtZW50KTogdm9pZCB7XG4gIGRvYy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpLmZvckVhY2goKHRiKSA9PiB7XG4gICAgY29uc3QgaHRtbFRiID0gdGIgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFzdHlsZU1hcChodG1sVGIpWydib3JkZXItY29sbGFwc2UnXSkgaHRtbFRiLnN0eWxlLmJvcmRlckNvbGxhcHNlID0gJ2NvbGxhcHNlJztcbiAgfSk7XG4gIGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdbYWxpZ25dJykuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBjb25zdCBodG1sRWwgPSBlbCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCB2ID0gaHRtbEVsLmdldEF0dHJpYnV0ZSgnYWxpZ24nKSEudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoaHRtbEVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RhYmxlJykge1xuICAgICAgaWYgKHYgPT09ICdjZW50ZXInKSB7XG4gICAgICAgIGh0bWxFbC5zdHlsZS5tYXJnaW5MZWZ0ID0gaHRtbEVsLnN0eWxlLm1hcmdpbkxlZnQgfHwgJ2F1dG8nO1xuICAgICAgICBodG1sRWwuc3R5bGUubWFyZ2luUmlnaHQgPSBodG1sRWwuc3R5bGUubWFyZ2luUmlnaHQgfHwgJ2F1dG8nO1xuICAgICAgfSBlbHNlIGlmICh2ID09PSAncmlnaHQnKSBodG1sRWwuc3R5bGUubWFyZ2luTGVmdCA9IGh0bWxFbC5zdHlsZS5tYXJnaW5MZWZ0IHx8ICdhdXRvJztcbiAgICAgIGVsc2UgaWYgKHYgPT09ICdsZWZ0JykgaHRtbEVsLnN0eWxlLm1hcmdpblJpZ2h0ID0gaHRtbEVsLnN0eWxlLm1hcmdpblJpZ2h0IHx8ICdhdXRvJztcbiAgICB9IGVsc2UgaWYgKFsnbGVmdCcsICdyaWdodCcsICdjZW50ZXInLCAnanVzdGlmeSddLmluY2x1ZGVzKHYpKSB7XG4gICAgICBodG1sRWwuc3R5bGUudGV4dEFsaWduID0gaHRtbEVsLnN0eWxlLnRleHRBbGlnbiB8fCB2O1xuICAgICAgLy8gV29yZCBhbGlnbnMgdGFibGVzIGJ5IHdyYXBwaW5nIHRoZW0gaW4gPGRpdiBhbGlnbj0uLi4+OyB0ZXh0LWFsaWduXG4gICAgICAvLyBkb2VzIG5vdCBtb3ZlIGEgdGFibGUgYm94LCBzbyBtaXJyb3IgdGhlIGFsaWdubWVudCBvbnRvIHRoZSB0YWJsZS5cbiAgICAgIEFycmF5LmZyb20oaHRtbEVsLmNoaWxkcmVuKS5mb3JFYWNoKChjaCkgPT4ge1xuICAgICAgICBpZiAoY2gudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAndGFibGUnKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRiID0gY2ggYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh2ID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRiLnN0eWxlLm1hcmdpbkxlZnQgPSB0Yi5zdHlsZS5tYXJnaW5MZWZ0IHx8ICdhdXRvJztcbiAgICAgICAgICB0Yi5zdHlsZS5tYXJnaW5SaWdodCA9IHRiLnN0eWxlLm1hcmdpblJpZ2h0IHx8ICdhdXRvJztcbiAgICAgICAgfSBlbHNlIGlmICh2ID09PSAncmlnaHQnKSB0Yi5zdHlsZS5tYXJnaW5MZWZ0ID0gdGIuc3R5bGUubWFyZ2luTGVmdCB8fCAnYXV0byc7XG4gICAgICAgIGVsc2UgaWYgKHYgPT09ICdsZWZ0JykgdGIuc3R5bGUubWFyZ2luUmlnaHQgPSB0Yi5zdHlsZS5tYXJnaW5SaWdodCB8fCAnYXV0byc7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaHRtbEVsLnJlbW92ZUF0dHJpYnV0ZSgnYWxpZ24nKTtcbiAgfSk7XG4gIGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdjZW50ZXIgdGFibGUnKS5mb3JFYWNoKCh0YikgPT4ge1xuICAgIGNvbnN0IGh0bWxUYiA9IHRiIGFzIEhUTUxFbGVtZW50O1xuICAgIGh0bWxUYi5zdHlsZS5tYXJnaW5MZWZ0ID0gaHRtbFRiLnN0eWxlLm1hcmdpbkxlZnQgfHwgJ2F1dG8nO1xuICAgIGh0bWxUYi5zdHlsZS5tYXJnaW5SaWdodCA9IGh0bWxUYi5zdHlsZS5tYXJnaW5SaWdodCB8fCAnYXV0byc7XG4gIH0pO1xuICBkb2MucXVlcnlTZWxlY3RvckFsbCgnW2JnY29sb3JdJykuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBjb25zdCBodG1sRWwgPSBlbCBhcyBIVE1MRWxlbWVudDtcbiAgICBodG1sRWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gaHRtbEVsLnN0eWxlLmJhY2tncm91bmRDb2xvciB8fCBodG1sRWwuZ2V0QXR0cmlidXRlKCdiZ2NvbG9yJykhO1xuICAgIGh0bWxFbC5yZW1vdmVBdHRyaWJ1dGUoJ2JnY29sb3InKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNhbml0aXplKG5vZGU6IE5vZGUsIGRvYzogRG9jdW1lbnQpOiB2b2lkIHtcbiAgQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgY2hpbGQucmVtb3ZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHJldHVybjtcbiAgICBjb25zdCBlbCA9IGNoaWxkIGFzIEVsZW1lbnQ7XG4gICAgY29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghQUxMT1dFRF9UQUdTLmhhcyh0YWcpKSB7XG4gICAgICBpZiAodGFnID09PSAnZm9udCcpIHtcbiAgICAgICAgY29uc3Qgc3BhbiA9IGRvYy5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIGlmIChlbC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykpIHNwYW4uc2V0QXR0cmlidXRlKCdzdHlsZScsIGVsLmdldEF0dHJpYnV0ZSgnc3R5bGUnKSEpO1xuICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKCdjb2xvcicpKSBzcGFuLnN0eWxlLmNvbG9yID0gZWwuZ2V0QXR0cmlidXRlKCdjb2xvcicpITtcbiAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSgnZmFjZScpKSBzcGFuLnN0eWxlLmZvbnRGYW1pbHkgPSBlbC5nZXRBdHRyaWJ1dGUoJ2ZhY2UnKSE7XG4gICAgICAgIGNvbnN0IHN6ID0gZWwuZ2V0QXR0cmlidXRlKCdzaXplJyk7XG4gICAgICAgIGlmIChzeiAmJiAhc3Bhbi5zdHlsZS5mb250U2l6ZSkge1xuICAgICAgICAgIGNvbnN0IHN6TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgJzEnOiAnOHB0JyxcbiAgICAgICAgICAgICcyJzogJzEwcHQnLFxuICAgICAgICAgICAgJzMnOiAnMTJwdCcsXG4gICAgICAgICAgICAnNCc6ICcxNHB0JyxcbiAgICAgICAgICAgICc1JzogJzE4cHQnLFxuICAgICAgICAgICAgJzYnOiAnMjRwdCcsXG4gICAgICAgICAgICAnNyc6ICczNnB0J1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHN6TWFwW3N6XSkgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IHN6TWFwW3N6XTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoZWwuZmlyc3RDaGlsZCkgc3Bhbi5hcHBlbmRDaGlsZChlbC5maXJzdENoaWxkKTtcbiAgICAgICAgZWwucmVwbGFjZVdpdGgoc3Bhbik7XG4gICAgICAgIHNhbml0aXplKHNwYW4sIGRvYyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNhbml0aXplKGVsLCBkb2MpO1xuICAgICAgd2hpbGUgKGVsLmZpcnN0Q2hpbGQpIGVsLnBhcmVudE5vZGUhLmluc2VydEJlZm9yZShlbC5maXJzdENoaWxkLCBlbCk7XG4gICAgICBlbC5yZW1vdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYWxsb3dlZCA9IG5ldyBTZXQoWy4uLihBTExPV0VEX0FUVFJTWycqJ10gfHwgW10pLCAuLi4oQUxMT1dFRF9BVFRSU1t0YWddIHx8IFtdKV0pO1xuICAgIEFycmF5LmZyb20oZWwuYXR0cmlidXRlcykuZm9yRWFjaCgoYSkgPT4ge1xuICAgICAgY29uc3QgbiA9IGEubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKG4gIT09ICdzdHlsZScgJiYgIWFsbG93ZWQuaGFzKG4pKSBlbC5yZW1vdmVBdHRyaWJ1dGUoYS5uYW1lKTtcbiAgICB9KTtcbiAgICBpZiAodGFnID09PSAnYScpIHtcbiAgICAgIGNvbnN0IGhyZWYgPSBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSB8fCAnJztcbiAgICAgIGlmICghL14oaHR0cHM/OnxtYWlsdG86fHRlbDp8IykvaS50ZXN0KGhyZWYpKSBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICB9XG4gICAgaWYgKHRhZyA9PT0gJ2ltZycpIHtcbiAgICAgIGNvbnN0IHNyYyA9IGVsLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJyc7XG4gICAgICBpZiAoIS9eKGh0dHBzPzp8ZGF0YTppbWFnZVxcL3xibG9iOikvaS50ZXN0KHNyYykpIHtcbiAgICAgICAgY29uc3QgcGggPSBkb2MuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICBwaC50ZXh0Q29udGVudCA9ICdbbG9jYWwgaW1hZ2Ug4oCUIHBhc3RlIGl0IHNlcGFyYXRlbHldJztcbiAgICAgICAgcGguc2V0QXR0cmlidXRlKCdzdHlsZScsICdjb2xvcjojYTMzO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtc2l6ZToxMnB4Jyk7XG4gICAgICAgIGVsLnJlcGxhY2VXaXRoKHBoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzdHlsZXMgPSBzdHlsZU1hcChlbCk7XG4gICAgY29uc3Qga2VwdDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzdHlsZXMpKSB7XG4gICAgICBpZiAoIUFMTE9XRURfU1RZTEVTLmhhcyhrKSkgY29udGludWU7XG4gICAgICBpZiAoL2V4cHJlc3Npb258amF2YXNjcmlwdHx1cmxcXHMqXFwoXFxzKlsnXCJdP1xccypmaWxlOi9pLnRlc3QodikpIGNvbnRpbnVlO1xuICAgICAgaWYgKGsgPT09ICdmb250LXdlaWdodCcgJiYgL14oNDAwfG5vcm1hbCkkL2kudGVzdCh2KSkgY29udGludWU7XG4gICAgICBpZiAoayA9PT0gJ2ZvbnQtc3R5bGUnICYmIC9ebm9ybWFsJC9pLnRlc3QodikpIGNvbnRpbnVlO1xuICAgICAgaWYgKGsgPT09ICd0ZXh0LWRlY29yYXRpb24nICYmIC9ebm9uZSQvaS50ZXN0KHYpKSBjb250aW51ZTtcbiAgICAgIGtlcHQucHVzaChrICsgJzonICsgdik7XG4gICAgfVxuICAgIGlmIChrZXB0Lmxlbmd0aCkgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIGtlcHQuam9pbignOycpKTtcbiAgICBlbHNlIGVsLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7XG4gICAgc2FuaXRpemUoZWwsIGRvYyk7XG4gICAgaWYgKHRhZyA9PT0gJ3NwYW4nICYmICFlbC5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgd2hpbGUgKGVsLmZpcnN0Q2hpbGQpIGVsLnBhcmVudE5vZGUhLmluc2VydEJlZm9yZShlbC5maXJzdENoaWxkLCBlbCk7XG4gICAgICBlbC5yZW1vdmUoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5pbnRlcmZhY2UgU3R5bGVSdWxlIHtcbiAgc2VsOiBzdHJpbmc7XG4gIGRlY2xzOiBbc3RyaW5nLCBzdHJpbmddW107XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdHlsZVJ1bGVzKHJhdzogc3RyaW5nKTogU3R5bGVSdWxlW10ge1xuICBjb25zdCBydWxlczogU3R5bGVSdWxlW10gPSBbXTtcbiAgY29uc3QgcmUgPSAvPHN0eWxlW14+XSo+KFtcXHNcXFNdKj8pPFxcL3N0eWxlPi9naTtcbiAgbGV0IG06IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG4gIHdoaWxlICgobSA9IHJlLmV4ZWMocmF3KSkpIHtcbiAgICBsZXQgY3NzID0gbVsxXS5yZXBsYWNlKC88IS0tfC0tPi9nLCAnJykucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJyk7XG4gICAgY3NzID0gY3NzLnJlcGxhY2UoL0BtZWRpYVtee10qXFx7KD86W157fV0qXFx7W157fV0qXFx9KSpbXnt9XSpcXH0vZ2ksICcnKTtcbiAgICBjc3MgPSBjc3MucmVwbGFjZSgvQFtcXHctXStbXntdKlxce1tee31dKlxcfS9nLCAnJyk7XG4gICAgbGV0IHJtOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgIGNvbnN0IHJyZSA9IC8oW157fV0rKVxceyhbXn1dKilcXH0vZztcbiAgICB3aGlsZSAoKHJtID0gcnJlLmV4ZWMoY3NzKSkpIHtcbiAgICAgIGNvbnN0IGRlY2xzID0gcm1bMl1cbiAgICAgICAgLnNwbGl0KCc7JylcbiAgICAgICAgLm1hcCgoZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGkgPSBkLmluZGV4T2YoJzonKTtcbiAgICAgICAgICBpZiAoaSA8IDEpIHJldHVybiBudWxsO1xuICAgICAgICAgIHJldHVybiBbZC5zbGljZSgwLCBpKS50cmltKCkudG9Mb3dlckNhc2UoKSwgZC5zbGljZShpICsgMSkudHJpbSgpXSBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChkKTogZCBpcyBbc3RyaW5nLCBzdHJpbmddID0+ICEhZCAmJiAhIWRbMV0pO1xuICAgICAgaWYgKCFkZWNscy5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgcm1bMV1cbiAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgLm1hcCgocykgPT4gcy50cmltKCkpXG4gICAgICAgIC5maWx0ZXIoKHMpID0+IHMgJiYgIXMuc3RhcnRzV2l0aCgnQCcpKVxuICAgICAgICAuZm9yRWFjaCgoc2VsKSA9PiBydWxlcy5wdXNoKHsgc2VsLCBkZWNscyB9KSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBydWxlcztcbn1cblxuZnVuY3Rpb24gYXBwbHlTdHlsZVJ1bGVzKGRvYzogRG9jdW1lbnQsIHJ1bGVzOiBTdHlsZVJ1bGVbXSk6IHZvaWQge1xuICBpZiAoIXJ1bGVzLmxlbmd0aCkgcmV0dXJuO1xuICBjb25zdCBhZGRNYXAgPSBuZXcgTWFwPEVsZW1lbnQsIHsgW2s6IHN0cmluZ106IHN0cmluZyB9PigpO1xuICBydWxlcy5mb3JFYWNoKCh7IHNlbCwgZGVjbHMgfSkgPT4ge1xuICAgIGxldCBlbHM6IE5vZGVMaXN0T2Y8RWxlbWVudD47XG4gICAgdHJ5IHtcbiAgICAgIGVscyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHNlbCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGxldCBtID0gYWRkTWFwLmdldChlbCk7XG4gICAgICBpZiAoIW0pIHtcbiAgICAgICAgbSA9IHt9O1xuICAgICAgICBhZGRNYXAuc2V0KGVsLCBtKTtcbiAgICAgIH1cbiAgICAgIGRlY2xzLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBtIVtrXSA9IHY7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG4gIGFkZE1hcC5mb3JFYWNoKChtLCBlbCkgPT4ge1xuICAgIGNvbnN0IGhhdmUgPSBzdHlsZU1hcChlbCk7XG4gICAgY29uc3QgaGFzRGlyID0gZWwuaGFzQXR0cmlidXRlKCdkaXInKTtcbiAgICBjb25zdCBoYXNBbGlnbiA9IGVsLmhhc0F0dHJpYnV0ZSgnYWxpZ24nKTtcbiAgICBjb25zdCBhZGQgPSBPYmplY3QuZW50cmllcyhtKS5maWx0ZXIoKFtrXSkgPT4ge1xuICAgICAgaWYgKGsgaW4gaGF2ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKChrID09PSAnZGlyZWN0aW9uJyB8fCBrID09PSAndW5pY29kZS1iaWRpJykgJiYgaGFzRGlyKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoayA9PT0gJ3RleHQtYWxpZ24nICYmIChoYXNBbGlnbiB8fCBoYXNEaXIpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoKGsgPT09ICdiYWNrZ3JvdW5kJyB8fCBrID09PSAnYmFja2dyb3VuZC1jb2xvcicpICYmIGVsLmhhc0F0dHJpYnV0ZSgnYmdjb2xvcicpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBpZiAoIWFkZC5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBwcmVmaXggPSBhZGQubWFwKChbaywgdl0pID0+IGsgKyAnOicgKyB2KS5qb2luKCc7Jyk7XG4gICAgY29uc3QgY3VyID0gZWwuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBjdXIgPyBwcmVmaXggKyAnOycgKyBjdXIgOiBwcmVmaXgpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXJhYmljUHJlc2VudGF0aW9uKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzLnJlcGxhY2UoL1vvrZAt77e/77mwLe+7vF0rL2csIChtKSA9PiBtLm5vcm1hbGl6ZSgnTkZLQycpKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXJhYmljVGV4dChkb2M6IERvY3VtZW50KTogdm9pZCB7XG4gIGNvbnN0IHcgPSBkb2MuY3JlYXRlVHJlZVdhbGtlcihkb2MuYm9keSwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwpO1xuICBsZXQgbjogTm9kZSB8IG51bGw7XG4gIHdoaWxlICgobiA9IHcubmV4dE5vZGUoKSkpXG4gICAgaWYgKC9b762QLe+3v++5sC3vu7xdLy50ZXN0KG4ubm9kZVZhbHVlIHx8ICcnKSkgbi5ub2RlVmFsdWUgPSBub3JtYWxpemVBcmFiaWNQcmVzZW50YXRpb24obi5ub2RlVmFsdWUgfHwgJycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5QYXN0ZWRIVE1MKHJhdzogc3RyaW5nLCBlZGl0b3JEaXI6ICdsdHInIHwgJ3J0bCcgPSAnbHRyJyk6IHN0cmluZyB7XG4gIGNvbnN0IGNzc1J1bGVzID0gZXh0cmFjdFN0eWxlUnVsZXMocmF3KTtcbiAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhwcmVDbGVhbihyYXcpLCAndGV4dC9odG1sJyk7XG4gIGFwcGx5U3R5bGVSdWxlcyhkb2MsIGNzc1J1bGVzKTtcbiAgaWYgKC9jbGFzcz1cIj9Nc298bXNvLXx1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tL2kudGVzdChkb2MuYm9keS5pbm5lckhUTUwpKSByZWJ1aWxkV29yZExpc3RzKGRvYyk7XG4gIGZpeEdvb2dsZURvY3MoZG9jKTtcbiAgZml4TGVnYWN5QXR0cnMoZG9jKTtcbiAgc2FuaXRpemUoZG9jLmJvZHksIGRvYyk7XG4gIG5vcm1hbGl6ZUFyYWJpY1RleHQoZG9jKTtcbiAgY29uc3QgZW1wdHlQID0gKGVsOiBFbGVtZW50IHwgbnVsbCkgPT4gZWwgJiYgZWwudGFnTmFtZSA9PT0gJ1AnICYmICFlbC50ZXh0Q29udGVudD8udHJpbSgpICYmICFlbC5xdWVyeVNlbGVjdG9yKCdpbWcsdGFibGUnKTtcbiAgd2hpbGUgKGVtcHR5UChkb2MuYm9keS5maXJzdEVsZW1lbnRDaGlsZCkpIGRvYy5ib2R5LmZpcnN0RWxlbWVudENoaWxkIS5yZW1vdmUoKTtcbiAgd2hpbGUgKGVtcHR5UChkb2MuYm9keS5sYXN0RWxlbWVudENoaWxkKSkgZG9jLmJvZHkubGFzdEVsZW1lbnRDaGlsZCEucmVtb3ZlKCk7XG4gIHJldHVybiBkb2MuYm9keS5pbm5lckhUTUwudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVGV4dFBhc3RlKHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHh0ID0gbm9ybWFsaXplQXJhYmljUHJlc2VudGF0aW9uKHJhdykucmVwbGFjZSgvXFxyL2csICcnKTtcbiAgY29uc3QgZXNjID0gKHM6IHN0cmluZykgPT4gcy5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG4gIGlmICgvXFxuLy50ZXN0KHR4dCkpIHtcbiAgICByZXR1cm4gdHh0XG4gICAgICAuc3BsaXQoL1xcbnsyLH0vKVxuICAgICAgLm1hcCgocGFyKSA9PiBgPHAgZGlyPVwiYXV0b1wiPiR7ZXNjKHBhcikucmVwbGFjZSgvXFxuL2csICc8YnI+JykgfHwgJzxicj4nfTwvcD5gKVxuICAgICAgLmpvaW4oJycpO1xuICB9XG4gIHJldHVybiBlc2ModHh0KTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgRWRpdG9yTGFuZ3VhZ2UgPSAnZW4nIHwgJ2FyJztcblxuZXhwb3J0IGludGVyZmFjZSBUb29sYmFyR3JvdXBDb25maWcge1xuICBpdGVtczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudUNvbmZpZyB7XG4gIFtrZXk6IHN0cmluZ106IEFycmF5PHN0cmluZyB8IHsgbGFiZWw6IHN0cmluZzsgYWN0aW9uOiBzdHJpbmc7IHNob3J0Y3V0Pzogc3RyaW5nIH0+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRvckluaXRPcHRpb25zIHtcbiAgdGFyZ2V0OiBIVE1MRWxlbWVudDtcbiAgbGFuZ3VhZ2U/OiBFZGl0b3JMYW5ndWFnZTtcbiAgaGVpZ2h0PzogbnVtYmVyO1xuICBpbml0aWFsQ29udGVudD86IHN0cmluZztcbiAgb25DaGFuZ2U/OiAoY29udGVudDogc3RyaW5nKSA9PiB2b2lkO1xuICBvblJlYWR5PzogKGVkaXRvcjogRmFibGVFZGl0b3JBcGkpID0+IHZvaWQ7XG4gIC8qKiBgdHJ1ZWAvb21pdHRlZCA9IGRlZmF1bHQgbWVudSBzZXQgKGBmaWxlIGVkaXQgdmlldyBpbnNlcnQgZm9ybWF0IHRvb2xzIHRhYmxlIGhlbHBgKS5cbiAgICogIGBmYWxzZWAgPSBoaWRkZW4uIEEgc3RyaW5nIGlzIGEgc3BhY2Utc2VwYXJhdGVkIHN1YnNldC9yZW9yZGVyIG9mIHRob3NlIGtleXMsIGUuZy5cbiAgICogIGAnZmlsZSBlZGl0IHZpZXcgaW5zZXJ0IGZvcm1hdCB0b29scyB0YWJsZSBoZWxwJ2AuIFVua25vd24gdG9rZW5zIGFyZSBpZ25vcmVkIHdpdGggYVxuICAgKiAgY29uc29sZSB3YXJuaW5nOyByZWNvZ25pemVkIHRva2VucyByZW5kZXIgaW4gdGhlIG9yZGVyIGdpdmVuLCBkdXBsaWNhdGVzIGFyZSBkcm9wcGVkLiAqL1xuICBtZW51YmFyPzogYm9vbGVhbiB8IHN0cmluZztcbiAgLyoqIGB0cnVlYC9vbWl0dGVkID0gdGhlIGJ1aWx0LWluIGRlZmF1bHQgdG9vbGJhci4gYGZhbHNlYCA9IGhpZGRlbi4gQSBzdHJpbmcgbGF5cyBvdXRcbiAgICogIHRoZSB0b29sYmFyOiBgfGAgc2VwYXJhdGVzIHZpc3VhbCBncm91cHMsIHNwYWNlcyBzZXBhcmF0ZSBpdGVtcyB3aXRoaW4gYSBncm91cCwgZS5nLlxuICAgKiAgYCd1bmRvIHJlZG8gfCBib2xkIGl0YWxpYydgLiBVbmtub3duIHRva2VucyBhcmUgaWdub3JlZCB3aXRoIGEgY29uc29sZSB3YXJuaW5nLiAqL1xuICB0b29sYmFyPzogYm9vbGVhbiB8IHN0cmluZztcbiAgc3RhdHVzYmFyPzogYm9vbGVhbjtcbiAgcmVhZG9ubHk/OiBib29sZWFuO1xuICAvKiogU3RvcmFnZSBrZXkgc3VmZml4IGZvciB0aGUgYXV0b3NhdmVkIGRyYWZ0OyBkZWZhdWx0cyB0byB0aGUgcGFnZSBwYXRoLiAqL1xuICBkcmFmdEtleT86IHN0cmluZztcbiAgLyoqIE92ZXJyaWRlcyB0aGUgZm9udC1mYW1pbHkgbGlzdCBzaG93biBpbiB0aGUgdG9vbGJhcidzIGZvbnQgZHJvcGRvd24uIEFycmF5IG9mXG4gICAqICBgW2Rpc3BsYXlOYW1lLCBjc3NGb250RmFtaWx5VmFsdWVdYCB0dXBsZXMuIERlZmF1bHRzIHRvIGEgYnVpbHQtaW4gbGlzdC4gKi9cbiAgZm9udEZhbWlseUZvcm1hdHM/OiBbc3RyaW5nLCBzdHJpbmddW107XG4gIC8qKiBDdXN0b20gQ1NTIGZvciB0aGUgZWRpdGFibGUgY29udGVudCBhcmVhLiBCZWNhdXNlIEZhYmxlRWRpdG9yJ3MgZWRpdGFibGUgcmVnaW9uIGlzIGFcbiAgICogIHBsYWluIGBjb250ZW50ZWRpdGFibGVgIGRpdiAobm90IGFuIGlmcmFtZSksIHRoaXMgaXMgTk9UIGFyYml0cmFyeSBnbG9iYWwgQ1NTOiB0aGVcbiAgICogIGxpdGVyYWwgd29yZCBgYm9keWAgaW4geW91ciBDU1MgaXMgcmV3cml0dGVuIHRvIGEgc2VsZWN0b3Igc2NvcGVkIHRvIHRoaXMgZWRpdG9yXG4gICAqICBpbnN0YW5jZSdzIGNvbnRlbnQgZGl2LCBhbmQgZXZlcnkgb3RoZXIgc2VsZWN0b3IgaXMgdXNlZCB2ZXJiYXRpbSAoeW91clxuICAgKiAgcmVzcG9uc2liaWxpdHkgdG8gc2NvcGUpLiBJbnRlbmRlZCBmb3IgdGhlIGNvbW1vbiBwYXR0ZXJuIG9mXG4gICAqICBgYm9keSB7IGZvbnQtZmFtaWx5OiAuLi47IGZvbnQtc2l6ZTogLi4uIH1gIHBsdXMgYEBpbXBvcnRgIGZvbnQgZGVjbGFyYXRpb25zLiAqL1xuICBjb250ZW50U3R5bGU/OiBzdHJpbmc7XG4gIC8qKiBNSU1FIHR5cGVzIGFjY2VwdGVkIGJ5IHRoZSBuYXRpdmUgaW1hZ2UgZmlsZSBwaWNrZXIgKHRoZSBgYWNjZXB0YCBhdHRyaWJ1dGUpLlxuICAgKiAgRGVmYXVsdHMgdG8gYFsnaW1hZ2UvanBlZycsJ2ltYWdlL2pwZycsJ2ltYWdlL3BuZycsJ2ltYWdlL2dpZicsJ2ltYWdlL2JtcCcsJ2ltYWdlL3dlYnAnXWAuICovXG4gIGltYWdlRmlsZVR5cGVzPzogc3RyaW5nW107XG4gIC8qKiBDYWxsZWQgd2hlbiBhIHVzZXIgcGlja3Mgb3IgZHJvcHMgYW4gaW1hZ2UuIFJlc29sdmUgd2l0aCB0aGUgVVJMIHRvXG4gICAqICBpbnNlcnQgKGUuZy4gYWZ0ZXIgdXBsb2FkaW5nIHRvIFMzL0F6dXJlIEJsb2IveW91ciBvd24gc2VydmVyKS4gSWZcbiAgICogIG9taXR0ZWQsIGltYWdlcyBhcmUgaW5saW5lZCBhcyBiYXNlNjQgZGF0YSBVUklzIGluc3RlYWQuIFRoZSBob3N0IHJlc29sdmVzIGEgVVJMXG4gICAqICBhbmQgdGhlIGVuZ2luZSBvd25zIGFsbCBwbGFjZWhvbGRlci9wcm9ncmVzcy9pbnNlcnQgVUksIHNvIHRoZXJlJ3Mgbm8gc2VwYXJhdGVcbiAgICogIFwicGlja2VyXCIgY29uY2VwdCB0byBjb25maWd1cmUuICovXG4gIGltYWdlVXBsb2FkSGFuZGxlcj86IChmaWxlOiBGaWxlKSA9PiBQcm9taXNlPHN0cmluZz47XG4gIC8qKiBDYWxsZWQgd2hlbiBpbWFnZVVwbG9hZEhhbmRsZXIgcmVqZWN0cywgc28gdGhlIGhvc3QgYXBwIGNhbiBzdXJmYWNlIGl0LiAqL1xuICBvbkltYWdlVXBsb2FkRXJyb3I/OiAoZXJyb3I6IHVua25vd24sIGZpbGU6IEZpbGUpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFibGVFZGl0b3JBcGkge1xuICBnZXRDb250ZW50KCk6IHN0cmluZztcbiAgc2V0Q29udGVudChodG1sOiBzdHJpbmcpOiB2b2lkO1xuICBpbnNlcnRDb250ZW50KGh0bWw6IHN0cmluZyk6IHZvaWQ7XG4gIHNldExhbmd1YWdlKGxhbmc6IEVkaXRvckxhbmd1YWdlKTogdm9pZDtcbiAgZm9jdXMoKTogdm9pZDtcbiAgZGVzdHJveSgpOiB2b2lkO1xuICBpbXBvcnRXb3JkRmlsZShmaWxlOiBGaWxlKTogUHJvbWlzZTx2b2lkPjtcbiAgcmVzdG9yZURyYWZ0KCk6IGJvb2xlYW47XG4gIGdldFJldmlzaW9ucygpOiBBcnJheTx7IHRpbWU6IG51bWJlcjsgaHRtbDogc3RyaW5nIH0+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpYWxvZ0J1dHRvbiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHByaW1hcnk/OiBib29sZWFuO1xuICBhY3Rpb246ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW1EZWYge1xuICBsYWJlbDogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xuICBhY3Rpb24/OiAoKSA9PiB2b2lkO1xuICBzaG9ydGN1dD86IHN0cmluZztcbiAgcHJldmlld1N0eWxlPzogc3RyaW5nO1xuICBvbj86IGJvb2xlYW47XG4gIC8qKiBIb3ZlciBmbHlvdXQgc3VibWVudSBpdGVtcy4gKi9cbiAgc3ViPzogQXJyYXk8TWVudUl0ZW1EZWYgfCAnfCc+O1xuICAvKiogSG92ZXIgZmx5b3V0IHdpdGggY3VzdG9tIGNvbnRlbnQgKGUuZy4gdGhlIHRhYmxlIHNpemUgZ3JpZCkuICovXG4gIHN1YkJ1aWxkPzogKGVsOiBIVE1MRWxlbWVudCkgPT4gdm9pZDtcbiAgLyoqIENhbGxlZCB3aXRoIHRydWUvZmFsc2UgYXMgdGhlIHBvaW50ZXIgZW50ZXJzL2xlYXZlcyB0aGUgaXRlbSAoZS5nLiB0byBoaWdobGlnaHQgdGhlIHRhYmxlIHJvdy9jb2x1bW4gYW4gb3BlcmF0aW9uIHdpbGwgdGFyZ2V0KS4gKi9cbiAgaG92ZXI/OiAob246IGJvb2xlYW4pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIFRhYmxlT3BlcmF0aW9uID1cbiAgfCAncm93YWJvdmUnXG4gIHwgJ3Jvd2JlbG93J1xuICB8ICdkZWxyb3cnXG4gIHwgJ2NvbGJlZm9yZSdcbiAgfCAnY29sYWZ0ZXInXG4gIHwgJ2RlbGNvbCdcbiAgfCAnZGVsdGFibGUnO1xuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFibGUtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZhYmxlLWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export * from './angular';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FuZ3VsYXInO1xuIl19