css-to-tailwind-react 0.3.0 → 0.3.2

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.
@@ -6,18 +6,22 @@ class TailwindMapper {
6
6
  constructor(config) {
7
7
  this.config = config;
8
8
  this.spacingScale = this.buildSpacingScale();
9
+ this.maxWidthScale = this.buildMaxWidthScale();
10
+ this.fontSizeScale = this.buildFontSizeScale();
11
+ this.lineHeightScale = this.buildLineHeightScale();
12
+ this.letterSpacingScale = this.buildLetterSpacingScale();
13
+ this.zIndexScale = this.buildZIndexScale();
14
+ this.opacityScale = this.buildOpacityScale();
9
15
  }
10
16
  buildSpacingScale() {
11
17
  const scale = new Map();
12
18
  const spacing = this.config.theme?.spacing || {};
13
19
  Object.entries(spacing).forEach(([key, value]) => {
14
- // Convert rem to pixels for comparison (assuming 1rem = 16px)
15
20
  const remMatch = value.match(/([\d.]+)rem/);
16
21
  if (remMatch) {
17
22
  const pixels = parseFloat(remMatch[1]) * 16;
18
23
  scale.set(Math.round(pixels), key);
19
24
  }
20
- // Also handle pixel values
21
25
  const pxMatch = value.match(/([\d.]+)px/);
22
26
  if (pxMatch) {
23
27
  scale.set(Math.round(parseFloat(pxMatch[1])), key);
@@ -25,12 +29,114 @@ class TailwindMapper {
25
29
  });
26
30
  return scale;
27
31
  }
32
+ buildMaxWidthScale() {
33
+ const scale = new Map();
34
+ const maxWidth = this.config.theme?.maxWidth || {};
35
+ Object.entries(maxWidth).forEach(([key, value]) => {
36
+ if (typeof value === 'string') {
37
+ scale.set(value, key);
38
+ }
39
+ });
40
+ scale.set('100%', 'full');
41
+ scale.set('min-content', 'min');
42
+ scale.set('max-content', 'max');
43
+ scale.set('fit-content', 'fit');
44
+ return scale;
45
+ }
46
+ buildFontSizeScale() {
47
+ const scale = new Map();
48
+ const fontSize = this.config.theme?.fontSize || {};
49
+ Object.entries(fontSize).forEach(([key, value]) => {
50
+ if (typeof value === 'string') {
51
+ const remMatch = value.match(/([\d.]+)rem/);
52
+ if (remMatch) {
53
+ scale.set(Math.round(parseFloat(remMatch[1]) * 16), key);
54
+ }
55
+ const pxMatch = value.match(/([\d.]+)px/);
56
+ if (pxMatch) {
57
+ scale.set(Math.round(parseFloat(pxMatch[1])), key);
58
+ }
59
+ }
60
+ else if (Array.isArray(value) && typeof value[0] === 'string') {
61
+ const remMatch = value[0].match(/([\d.]+)rem/);
62
+ if (remMatch) {
63
+ scale.set(Math.round(parseFloat(remMatch[1]) * 16), key);
64
+ }
65
+ const pxMatch = value[0].match(/([\d.]+)px/);
66
+ if (pxMatch) {
67
+ scale.set(Math.round(parseFloat(pxMatch[1])), key);
68
+ }
69
+ }
70
+ });
71
+ return scale;
72
+ }
73
+ buildLineHeightScale() {
74
+ const scale = new Map();
75
+ const lineHeight = this.config.theme?.lineHeight || {};
76
+ Object.entries(lineHeight).forEach(([key, value]) => {
77
+ if (typeof value === 'string') {
78
+ scale.set(value, key);
79
+ }
80
+ });
81
+ scale.set('1', 'none');
82
+ scale.set('1.25', 'tight');
83
+ scale.set('1.375', 'snug');
84
+ scale.set('1.5', 'normal');
85
+ scale.set('1.625', 'relaxed');
86
+ scale.set('2', 'loose');
87
+ return scale;
88
+ }
89
+ buildLetterSpacingScale() {
90
+ const scale = new Map();
91
+ const letterSpacing = this.config.theme?.letterSpacing || {};
92
+ Object.entries(letterSpacing).forEach(([key, value]) => {
93
+ if (typeof value === 'string') {
94
+ scale.set(value, key);
95
+ }
96
+ });
97
+ return scale;
98
+ }
99
+ buildZIndexScale() {
100
+ const scale = new Map();
101
+ const zIndex = this.config.theme?.zIndex || {};
102
+ Object.entries(zIndex).forEach(([key, value]) => {
103
+ if (typeof value === 'string') {
104
+ const num = parseInt(value, 10);
105
+ if (!isNaN(num)) {
106
+ scale.set(num, key);
107
+ }
108
+ }
109
+ });
110
+ scale.set(0, '0');
111
+ scale.set(10, '10');
112
+ scale.set(20, '20');
113
+ scale.set(30, '30');
114
+ scale.set(40, '40');
115
+ scale.set(50, '50');
116
+ return scale;
117
+ }
118
+ buildOpacityScale() {
119
+ const scale = new Map();
120
+ const opacity = this.config.theme?.opacity || {};
121
+ Object.entries(opacity).forEach(([key, value]) => {
122
+ if (typeof value === 'string' || typeof value === 'number') {
123
+ const num = typeof value === 'string' ? parseFloat(value) : value;
124
+ if (!isNaN(num)) {
125
+ scale.set(Math.round(num * 100), key);
126
+ }
127
+ }
128
+ });
129
+ for (let i = 0; i <= 100; i += 5) {
130
+ if (!scale.has(i)) {
131
+ scale.set(i, String(i));
132
+ }
133
+ }
134
+ return scale;
135
+ }
28
136
  pxToSpacing(px) {
29
- // Try exact match first
30
137
  if (this.spacingScale.has(px)) {
31
138
  return this.spacingScale.get(px);
32
139
  }
33
- // Find closest match
34
140
  let closestKey = null;
35
141
  let closestDiff = Infinity;
36
142
  this.spacingScale.forEach((_, key) => {
@@ -40,7 +146,6 @@ class TailwindMapper {
40
146
  closestDiff = diff;
41
147
  }
42
148
  });
43
- // Only accept if within reasonable tolerance (20%)
44
149
  if (closestKey !== null && closestDiff / px < 0.2) {
45
150
  return this.spacingScale.get(closestKey) || null;
46
151
  }
@@ -51,79 +156,382 @@ class TailwindMapper {
51
156
  if (pxMatch) {
52
157
  return parseFloat(pxMatch[1]);
53
158
  }
54
- // Handle rem values
55
159
  const remMatch = value.match(/^([\d.]+)rem$/);
56
160
  if (remMatch) {
57
161
  return parseFloat(remMatch[1]) * 16;
58
162
  }
59
163
  return null;
60
164
  }
165
+ parseSpacingValue(value) {
166
+ const px = this.extractPx(value);
167
+ const spacingKey = px !== null ? this.pxToSpacing(px) : null;
168
+ return {
169
+ value,
170
+ px,
171
+ spacingKey
172
+ };
173
+ }
174
+ buildSpacingUtility(prefix, parsed) {
175
+ if (parsed.spacingKey) {
176
+ return `${prefix}-${parsed.spacingKey}`;
177
+ }
178
+ return `${prefix}-[${parsed.value}]`;
179
+ }
180
+ tokenizeValue(value) {
181
+ const tokens = [];
182
+ let current = '';
183
+ let parenDepth = 0;
184
+ let inFunction = false;
185
+ for (let i = 0; i < value.length; i++) {
186
+ const char = value[i];
187
+ if (char === '(') {
188
+ parenDepth++;
189
+ inFunction = true;
190
+ current += char;
191
+ }
192
+ else if (char === ')') {
193
+ parenDepth--;
194
+ current += char;
195
+ if (parenDepth === 0) {
196
+ inFunction = false;
197
+ }
198
+ }
199
+ else if (char === ' ' && parenDepth === 0) {
200
+ if (current.trim()) {
201
+ tokens.push(current.trim());
202
+ }
203
+ current = '';
204
+ }
205
+ else {
206
+ current += char;
207
+ }
208
+ }
209
+ if (current.trim()) {
210
+ tokens.push(current.trim());
211
+ }
212
+ return tokens;
213
+ }
61
214
  convertProperty(property, value) {
62
215
  const normalizedProp = property.toLowerCase().trim();
63
216
  const normalizedValue = value.toLowerCase().trim();
64
217
  logger_1.logger.verbose(`Converting: ${normalizedProp}: ${normalizedValue}`);
65
- // Display properties
218
+ if (normalizedProp.startsWith('--')) {
219
+ return { className: null, skipped: true, reason: `CSS variable declaration: ${property}` };
220
+ }
66
221
  if (normalizedProp === 'display') {
67
222
  return this.convertDisplay(normalizedValue);
68
223
  }
69
- // Position properties
70
224
  if (normalizedProp === 'position') {
71
225
  return { className: normalizedValue, skipped: false };
72
226
  }
73
- // Margin properties
74
227
  if (normalizedProp.startsWith('margin')) {
75
228
  return this.convertMargin(normalizedProp, normalizedValue);
76
229
  }
77
- // Padding properties
78
230
  if (normalizedProp.startsWith('padding')) {
79
231
  return this.convertPadding(normalizedProp, normalizedValue);
80
232
  }
81
- // Font properties
233
+ if (normalizedProp === 'max-width' || normalizedProp === 'min-width') {
234
+ return this.convertDimensionConstraint(normalizedProp, normalizedValue);
235
+ }
236
+ if (normalizedProp === 'max-height' || normalizedProp === 'min-height') {
237
+ return this.convertDimensionConstraint(normalizedProp, normalizedValue);
238
+ }
239
+ if (normalizedProp === 'width') {
240
+ return this.convertWidth(normalizedValue);
241
+ }
242
+ if (normalizedProp === 'height') {
243
+ return this.convertHeight(normalizedValue);
244
+ }
82
245
  if (normalizedProp === 'font-weight') {
83
246
  return this.convertFontWeight(normalizedValue);
84
247
  }
85
248
  if (normalizedProp === 'font-size') {
86
249
  return this.convertFontSize(normalizedValue);
87
250
  }
88
- // Text properties
89
251
  if (normalizedProp === 'text-align') {
90
252
  return { className: `text-${normalizedValue}`, skipped: false };
91
253
  }
92
- // Flexbox properties
254
+ if (normalizedProp === 'text-decoration') {
255
+ return this.convertTextDecoration(normalizedValue);
256
+ }
257
+ if (normalizedProp === 'text-transform') {
258
+ return this.convertTextTransform(normalizedValue);
259
+ }
260
+ if (normalizedProp === 'letter-spacing') {
261
+ return this.convertLetterSpacing(normalizedValue);
262
+ }
263
+ if (normalizedProp === 'line-height') {
264
+ return this.convertLineHeight(normalizedValue);
265
+ }
93
266
  if (normalizedProp.startsWith('flex') ||
94
267
  normalizedProp.startsWith('justify') ||
95
268
  normalizedProp.startsWith('align')) {
96
269
  return this.convertFlexbox(normalizedProp, normalizedValue);
97
270
  }
98
- // Gap properties
99
271
  if (normalizedProp === 'gap') {
100
272
  return this.convertGap(normalizedValue);
101
273
  }
102
- // Width and Height
103
- if (normalizedProp === 'width') {
104
- return this.convertWidth(normalizedValue);
105
- }
106
- if (normalizedProp === 'height') {
107
- return this.convertHeight(normalizedValue);
108
- }
109
- // Colors
110
274
  if (normalizedProp === 'background-color') {
111
275
  return this.convertBackgroundColor(normalizedValue);
112
276
  }
277
+ if (normalizedProp === 'background') {
278
+ const result = this.convertBackgroundShorthand(normalizedValue);
279
+ if (result.classes.length > 0) {
280
+ return { className: result.classes[0], skipped: false };
281
+ }
282
+ return { className: null, skipped: true, reason: result.warnings[0] || `Could not convert background: ${normalizedValue}` };
283
+ }
113
284
  if (normalizedProp === 'color') {
114
285
  return this.convertTextColor(normalizedValue);
115
286
  }
116
- // Border radius
117
287
  if (normalizedProp === 'border-radius') {
118
288
  return this.convertBorderRadius(normalizedValue);
119
289
  }
120
- // Unsupported properties
290
+ if (normalizedProp.startsWith('border')) {
291
+ return this.convertBorder(normalizedProp, normalizedValue);
292
+ }
293
+ if (normalizedProp === 'aspect-ratio') {
294
+ return this.convertAspectRatio(normalizedValue);
295
+ }
296
+ if (normalizedProp === 'overflow' || normalizedProp === 'overflow-x' || normalizedProp === 'overflow-y') {
297
+ return this.convertOverflow(normalizedProp, normalizedValue);
298
+ }
299
+ if (normalizedProp === 'object-fit') {
300
+ return this.convertObjectFit(normalizedValue);
301
+ }
302
+ if (normalizedProp === 'object-position') {
303
+ return this.convertObjectPosition(normalizedValue);
304
+ }
305
+ if (normalizedProp === 'opacity') {
306
+ return this.convertOpacity(normalizedValue);
307
+ }
308
+ if (normalizedProp === 'word-break') {
309
+ return this.convertWordBreak(normalizedValue);
310
+ }
311
+ if (normalizedProp === 'z-index') {
312
+ return this.convertZIndex(normalizedValue);
313
+ }
121
314
  return {
122
315
  className: null,
123
316
  skipped: true,
124
317
  reason: `Unsupported property: ${property}`
125
318
  };
126
319
  }
320
+ convertPropertyWithMultiple(property, value) {
321
+ const normalizedProp = property.toLowerCase().trim();
322
+ const normalizedValue = value.toLowerCase().trim();
323
+ if (normalizedProp === 'margin' || normalizedProp === 'padding') {
324
+ return this.convertSpacingShorthand(normalizedProp, normalizedValue);
325
+ }
326
+ if (normalizedProp === 'border') {
327
+ return this.convertBorderShorthand(normalizedValue);
328
+ }
329
+ if (normalizedProp.startsWith('border-') &&
330
+ ['border-top', 'border-right', 'border-bottom', 'border-left'].includes(normalizedProp)) {
331
+ return this.convertDirectionalBorderShorthand(normalizedProp, normalizedValue);
332
+ }
333
+ if (normalizedProp === 'flex') {
334
+ return this.convertFlexShorthand(normalizedValue);
335
+ }
336
+ if (normalizedProp === 'background') {
337
+ return this.convertBackgroundShorthand(normalizedValue);
338
+ }
339
+ const result = this.convertProperty(property, value);
340
+ return {
341
+ classes: result.className ? [result.className] : [],
342
+ warnings: result.reason ? [result.reason] : [],
343
+ cssProperties: result.className ? [property] : []
344
+ };
345
+ }
346
+ convertBackgroundShorthand(value) {
347
+ const classes = [];
348
+ const warnings = [];
349
+ const cssProperties = [];
350
+ if (value === 'transparent') {
351
+ classes.push('bg-transparent');
352
+ cssProperties.push('background-color');
353
+ return { classes, warnings, cssProperties };
354
+ }
355
+ if (value === 'none') {
356
+ classes.push('bg-none');
357
+ cssProperties.push('background-image');
358
+ return { classes, warnings, cssProperties };
359
+ }
360
+ const colorValue = this.extractColorFromBackground(value);
361
+ if (colorValue) {
362
+ if (colorValue.startsWith('#')) {
363
+ classes.push(`bg-[${colorValue}]`);
364
+ }
365
+ else if (colorValue.startsWith('rgb')) {
366
+ classes.push(`bg-[${colorValue}]`);
367
+ }
368
+ else if (colorValue.startsWith('hsl')) {
369
+ classes.push(`bg-[${colorValue}]`);
370
+ }
371
+ else {
372
+ const colorMap = {
373
+ 'white': 'bg-white',
374
+ 'black': 'bg-black',
375
+ 'red': 'bg-red-500',
376
+ 'blue': 'bg-blue-500',
377
+ 'green': 'bg-green-500',
378
+ 'gray': 'bg-gray-500',
379
+ 'transparent': 'bg-transparent'
380
+ };
381
+ if (colorMap[colorValue]) {
382
+ classes.push(colorMap[colorValue]);
383
+ }
384
+ else {
385
+ classes.push(`bg-${colorValue}`);
386
+ }
387
+ }
388
+ cssProperties.push('background-color');
389
+ }
390
+ else {
391
+ warnings.push(`Cannot extract color from background shorthand: ${value}`);
392
+ }
393
+ return { classes, warnings, cssProperties };
394
+ }
395
+ extractColorFromBackground(value) {
396
+ const tokens = this.tokenizeValue(value);
397
+ for (const token of tokens) {
398
+ if (token.startsWith('#')) {
399
+ return token;
400
+ }
401
+ if (token.startsWith('rgb') || token.startsWith('hsl')) {
402
+ return token;
403
+ }
404
+ if (token.startsWith('url(') || token === 'none') {
405
+ continue;
406
+ }
407
+ if (/^(linear-gradient|radial-gradient|conic-gradient|repeating-linear-gradient|repeating-radial-gradient|repeating-conic-gradient)\(/i.test(token)) {
408
+ continue;
409
+ }
410
+ if (/^(repeat|no-repeat|repeat-x|repeat-y|space|round)$/i.test(token)) {
411
+ continue;
412
+ }
413
+ if (/^(scroll|fixed|local)$/i.test(token)) {
414
+ continue;
415
+ }
416
+ if (/^(center|top|bottom|left|right|\d+%|\d+px)/i.test(token)) {
417
+ continue;
418
+ }
419
+ if (/^(cover|contain)$/i.test(token)) {
420
+ continue;
421
+ }
422
+ if (/^(border-box|padding-box|content-box)$/i.test(token)) {
423
+ continue;
424
+ }
425
+ if (/^(clip|border|padding|content)$/i.test(token)) {
426
+ continue;
427
+ }
428
+ if (/^\d/.test(token) && !token.includes('gradient')) {
429
+ continue;
430
+ }
431
+ if (/^(transparent|white|black|red|blue|green|yellow|orange|purple|pink|gray|grey|brown|cyan|magenta|olive|lime|aqua|navy|teal|maroon|silver|fuchsia)$/i.test(token)) {
432
+ return token;
433
+ }
434
+ if (/^(aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|blanchedalmond|blueviolet|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|gainsboro|ghostwhite|gold|goldenrod|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|limegreen|linen|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|oldlace|olivedrab|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|plum|powderblue|rebeccapurple|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|thistle|tomato|turquoise|violet|wheat|whitesmoke|yellowgreen)$/i.test(token)) {
435
+ return token;
436
+ }
437
+ }
438
+ return null;
439
+ }
440
+ convertSpacingShorthand(prop, value) {
441
+ const tokens = this.tokenizeValue(value);
442
+ const classes = [];
443
+ const warnings = [];
444
+ const cssProperties = [];
445
+ const prefix = prop === 'margin' ? 'm' : 'p';
446
+ const propPrefix = prop === 'margin' ? 'margin' : 'padding';
447
+ if (tokens.length === 0) {
448
+ return { classes, warnings: ['Empty spacing value'], cssProperties };
449
+ }
450
+ const parsedTokens = tokens.map(t => this.parseSpacingValue(t));
451
+ if (tokens.length === 1) {
452
+ const parsed = parsedTokens[0];
453
+ if (parsed.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[0])) {
454
+ classes.push(this.buildSpacingUtility(prefix, parsed));
455
+ cssProperties.push(prop);
456
+ }
457
+ else {
458
+ warnings.push(`Invalid ${prop} value: ${tokens[0]}`);
459
+ }
460
+ }
461
+ else if (tokens.length === 2) {
462
+ const [vertical, horizontal] = parsedTokens;
463
+ if (vertical.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[0])) {
464
+ classes.push(this.buildSpacingUtility(`${prefix}y`, vertical));
465
+ cssProperties.push(`${propPrefix}-y`);
466
+ }
467
+ else {
468
+ warnings.push(`Invalid ${prop} vertical value: ${tokens[0]}`);
469
+ }
470
+ if (horizontal.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[1])) {
471
+ classes.push(this.buildSpacingUtility(`${prefix}x`, horizontal));
472
+ cssProperties.push(`${propPrefix}-x`);
473
+ }
474
+ else {
475
+ warnings.push(`Invalid ${prop} horizontal value: ${tokens[1]}`);
476
+ }
477
+ }
478
+ else if (tokens.length === 3) {
479
+ const [top, horizontal, bottom] = parsedTokens;
480
+ if (top.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[0])) {
481
+ classes.push(this.buildSpacingUtility(`${prefix}t`, top));
482
+ cssProperties.push(`${propPrefix}-top`);
483
+ }
484
+ else {
485
+ warnings.push(`Invalid ${prop}-top value: ${tokens[0]}`);
486
+ }
487
+ if (horizontal.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[1])) {
488
+ classes.push(this.buildSpacingUtility(`${prefix}x`, horizontal));
489
+ cssProperties.push(`${propPrefix}-x`);
490
+ }
491
+ else {
492
+ warnings.push(`Invalid ${prop} horizontal value: ${tokens[1]}`);
493
+ }
494
+ if (bottom.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[2])) {
495
+ classes.push(this.buildSpacingUtility(`${prefix}b`, bottom));
496
+ cssProperties.push(`${propPrefix}-bottom`);
497
+ }
498
+ else {
499
+ warnings.push(`Invalid ${prop}-bottom value: ${tokens[2]}`);
500
+ }
501
+ }
502
+ else if (tokens.length >= 4) {
503
+ const [top, right, bottom, left] = parsedTokens;
504
+ if (top.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[0])) {
505
+ classes.push(this.buildSpacingUtility(`${prefix}t`, top));
506
+ cssProperties.push(`${propPrefix}-top`);
507
+ }
508
+ else {
509
+ warnings.push(`Invalid ${prop}-top value: ${tokens[0]}`);
510
+ }
511
+ if (right.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[1])) {
512
+ classes.push(this.buildSpacingUtility(`${prefix}r`, right));
513
+ cssProperties.push(`${propPrefix}-right`);
514
+ }
515
+ else {
516
+ warnings.push(`Invalid ${prop}-right value: ${tokens[1]}`);
517
+ }
518
+ if (bottom.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[2])) {
519
+ classes.push(this.buildSpacingUtility(`${prefix}b`, bottom));
520
+ cssProperties.push(`${propPrefix}-bottom`);
521
+ }
522
+ else {
523
+ warnings.push(`Invalid ${prop}-bottom value: ${tokens[2]}`);
524
+ }
525
+ if (left.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[3])) {
526
+ classes.push(this.buildSpacingUtility(`${prefix}l`, left));
527
+ cssProperties.push(`${propPrefix}-left`);
528
+ }
529
+ else {
530
+ warnings.push(`Invalid ${prop}-left value: ${tokens[3]}`);
531
+ }
532
+ }
533
+ return { classes, warnings, cssProperties };
534
+ }
127
535
  convertDisplay(value) {
128
536
  const displayMap = {
129
537
  'flex': 'flex',
@@ -131,10 +539,14 @@ class TailwindMapper {
131
539
  'inline': 'inline',
132
540
  'inline-block': 'inline-block',
133
541
  'grid': 'grid',
542
+ 'inline-flex': 'inline-flex',
543
+ 'inline-grid': 'inline-grid',
134
544
  'none': 'hidden',
135
545
  'contents': 'contents',
136
546
  'table': 'table',
137
- 'table-cell': 'table-cell'
547
+ 'table-cell': 'table-cell',
548
+ 'table-row': 'table-row',
549
+ 'flow-root': 'flow-root'
138
550
  };
139
551
  if (displayMap[value]) {
140
552
  return { className: displayMap[value], skipped: false };
@@ -142,7 +554,6 @@ class TailwindMapper {
142
554
  return { className: null, skipped: true, reason: `Unknown display value: ${value}` };
143
555
  }
144
556
  convertMargin(prop, value) {
145
- const px = this.extractPx(value);
146
557
  const sideMap = {
147
558
  'margin': 'm',
148
559
  'margin-top': 'mt',
@@ -153,8 +564,14 @@ class TailwindMapper {
153
564
  'margin-y': 'my'
154
565
  };
155
566
  const prefix = sideMap[prop] || 'm';
567
+ const isNegative = value.startsWith('-');
568
+ const absoluteValue = isNegative ? value.slice(1) : value;
569
+ const px = this.extractPx(absoluteValue);
570
+ if (value === 'auto') {
571
+ return { className: `${prefix}-auto`, skipped: false };
572
+ }
156
573
  if (px === null) {
157
- if (/^-?\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
574
+ if (/^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
158
575
  return { className: `${prefix}-[${value}]`, skipped: false };
159
576
  }
160
577
  return { className: null, skipped: true, reason: `Non-pixel margin value: ${value}` };
@@ -163,7 +580,7 @@ class TailwindMapper {
163
580
  if (!spacing) {
164
581
  return { className: `${prefix}-[${value}]`, skipped: false };
165
582
  }
166
- return { className: `${prefix}-${spacing}`, skipped: false };
583
+ return { className: isNegative ? `-${prefix}-${spacing}` : `${prefix}-${spacing}`, skipped: false };
167
584
  }
168
585
  convertPadding(prop, value) {
169
586
  const px = this.extractPx(value);
@@ -178,7 +595,7 @@ class TailwindMapper {
178
595
  };
179
596
  const prefix = sideMap[prop] || 'p';
180
597
  if (px === null) {
181
- if (/^-?\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
598
+ if (/^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
182
599
  return { className: `${prefix}-[${value}]`, skipped: false };
183
600
  }
184
601
  return { className: null, skipped: true, reason: `Non-pixel padding value: ${value}` };
@@ -189,6 +606,56 @@ class TailwindMapper {
189
606
  }
190
607
  return { className: `${prefix}-${spacing}`, skipped: false };
191
608
  }
609
+ convertDimensionConstraint(prop, value) {
610
+ const prefixMap = {
611
+ 'max-width': 'max-w',
612
+ 'min-width': 'min-w',
613
+ 'max-height': 'max-h',
614
+ 'min-height': 'min-h'
615
+ };
616
+ const prefix = prefixMap[prop];
617
+ if (value === '100%') {
618
+ return { className: `${prefix}-full`, skipped: false };
619
+ }
620
+ if (value === '0' || value === '0px') {
621
+ return { className: `${prefix}-0`, skipped: false };
622
+ }
623
+ if (value === 'none') {
624
+ return { className: `${prefix}-none`, skipped: false };
625
+ }
626
+ if (prop === 'max-width') {
627
+ if (value === 'min-content') {
628
+ return { className: 'max-w-min', skipped: false };
629
+ }
630
+ if (value === 'max-content') {
631
+ return { className: 'max-w-max', skipped: false };
632
+ }
633
+ if (value === 'fit-content') {
634
+ return { className: 'max-w-fit', skipped: false };
635
+ }
636
+ const maxWProseSizes = {
637
+ '65ch': 'prose',
638
+ '80ch': 'prose-lg'
639
+ };
640
+ if (maxWProseSizes[value]) {
641
+ return { className: `max-w-${maxWProseSizes[value]}`, skipped: false };
642
+ }
643
+ if (this.maxWidthScale.has(value)) {
644
+ return { className: `max-w-${this.maxWidthScale.get(value)}`, skipped: false };
645
+ }
646
+ }
647
+ const px = this.extractPx(value);
648
+ if (px !== null) {
649
+ const spacing = this.pxToSpacing(px);
650
+ if (spacing) {
651
+ return { className: `${prefix}-${spacing}`, skipped: false };
652
+ }
653
+ }
654
+ if (/^\d+(\.\d+)?(px|rem|em|%|ch|vw|vh)?$/.test(value)) {
655
+ return { className: `${prefix}-[${value}]`, skipped: false };
656
+ }
657
+ return { className: null, skipped: true, reason: `Complex ${prop} value: ${value}` };
658
+ }
192
659
  convertFontWeight(value) {
193
660
  const weightMap = {
194
661
  '100': 'font-thin',
@@ -211,33 +678,86 @@ class TailwindMapper {
211
678
  convertFontSize(value) {
212
679
  const px = this.extractPx(value);
213
680
  if (px !== null) {
214
- // Map common font sizes
215
- const sizeMap = {
216
- 12: 'text-xs',
217
- 14: 'text-sm',
218
- 16: 'text-base',
219
- 18: 'text-lg',
220
- 20: 'text-xl',
221
- 24: 'text-2xl',
222
- 30: 'text-3xl',
223
- 36: 'text-4xl',
224
- 48: 'text-5xl'
225
- };
226
- const closest = Object.keys(sizeMap)
227
- .map(Number)
228
- .reduce((prev, curr) => Math.abs(curr - px) < Math.abs(prev - px) ? curr : prev);
229
- if (Math.abs(closest - px) / px < 0.15) {
230
- return { className: sizeMap[closest], skipped: false };
681
+ if (this.fontSizeScale.has(px)) {
682
+ return { className: `text-${this.fontSizeScale.get(px)}`, skipped: false };
231
683
  }
232
684
  return { className: `text-[${value}]`, skipped: false };
233
685
  }
234
- if (/^\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
686
+ if (/^\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
235
687
  return { className: `text-[${value}]`, skipped: false };
236
688
  }
237
689
  return { className: null, skipped: true, reason: `Non-standard font-size: ${value}` };
238
690
  }
691
+ convertTextDecoration(value) {
692
+ const decorationMap = {
693
+ 'underline': 'underline',
694
+ 'line-through': 'line-through',
695
+ 'none': 'no-underline',
696
+ 'no-underline': 'no-underline'
697
+ };
698
+ if (decorationMap[value]) {
699
+ return { className: decorationMap[value], skipped: false };
700
+ }
701
+ logger_1.logger.warn(`Unsupported text-decoration value: ${value}`);
702
+ return { className: null, skipped: true, reason: `Unsupported text-decoration: ${value}` };
703
+ }
704
+ convertTextTransform(value) {
705
+ const transformMap = {
706
+ 'uppercase': 'uppercase',
707
+ 'lowercase': 'lowercase',
708
+ 'capitalize': 'capitalize',
709
+ 'none': 'normal-case',
710
+ 'initial': 'normal-case'
711
+ };
712
+ if (transformMap[value]) {
713
+ return { className: transformMap[value], skipped: false };
714
+ }
715
+ return { className: null, skipped: true, reason: `Unknown text-transform: ${value}` };
716
+ }
717
+ convertLetterSpacing(value) {
718
+ if (this.letterSpacingScale.has(value)) {
719
+ return { className: `tracking-${this.letterSpacingScale.get(value)}`, skipped: false };
720
+ }
721
+ const knownMappings = {
722
+ '-0.025em': 'tight',
723
+ '-0.05em': 'tighter',
724
+ '0.025em': 'wide',
725
+ '0.05em': 'wider',
726
+ '0.1em': 'widest',
727
+ '0em': 'normal'
728
+ };
729
+ if (knownMappings[value]) {
730
+ return { className: `tracking-${knownMappings[value]}`, skipped: false };
731
+ }
732
+ if (/^-?\d+(\.\d+)?(em|px|rem)?$/.test(value)) {
733
+ return { className: `tracking-[${value}]`, skipped: false };
734
+ }
735
+ return { className: null, skipped: true, reason: `Unknown letter-spacing: ${value}` };
736
+ }
737
+ convertLineHeight(value) {
738
+ if (this.lineHeightScale.has(value)) {
739
+ return { className: `leading-${this.lineHeightScale.get(value)}`, skipped: false };
740
+ }
741
+ const knownMappings = {
742
+ '1': 'none',
743
+ '1.25': 'tight',
744
+ '1.375': 'snug',
745
+ '1.5': 'normal',
746
+ '1.625': 'relaxed',
747
+ '2': 'loose'
748
+ };
749
+ if (knownMappings[value]) {
750
+ return { className: `leading-${knownMappings[value]}`, skipped: false };
751
+ }
752
+ if (/^\d+(\.\d+)?$/.test(value)) {
753
+ return { className: `leading-[${value}]`, skipped: false };
754
+ }
755
+ if (/^\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
756
+ return { className: `leading-[${value}]`, skipped: false };
757
+ }
758
+ return { className: null, skipped: true, reason: `Unknown line-height: ${value}` };
759
+ }
239
760
  convertFlexbox(prop, value) {
240
- // Flex direction
241
761
  if (prop === 'flex-direction') {
242
762
  const dirMap = {
243
763
  'row': 'flex-row',
@@ -247,7 +767,6 @@ class TailwindMapper {
247
767
  };
248
768
  return { className: dirMap[value] || null, skipped: !dirMap[value] };
249
769
  }
250
- // Flex wrap
251
770
  if (prop === 'flex-wrap') {
252
771
  const wrapMap = {
253
772
  'wrap': 'flex-wrap',
@@ -256,7 +775,6 @@ class TailwindMapper {
256
775
  };
257
776
  return { className: wrapMap[value] || null, skipped: !wrapMap[value] };
258
777
  }
259
- // Justify content
260
778
  if (prop === 'justify-content') {
261
779
  const justifyMap = {
262
780
  'flex-start': 'justify-start',
@@ -268,7 +786,6 @@ class TailwindMapper {
268
786
  };
269
787
  return { className: justifyMap[value] || null, skipped: !justifyMap[value] };
270
788
  }
271
- // Align items
272
789
  if (prop === 'align-items') {
273
790
  const alignMap = {
274
791
  'flex-start': 'items-start',
@@ -279,21 +796,138 @@ class TailwindMapper {
279
796
  };
280
797
  return { className: alignMap[value] || null, skipped: !alignMap[value] };
281
798
  }
799
+ if (prop === 'align-content') {
800
+ const alignMap = {
801
+ 'flex-start': 'content-start',
802
+ 'flex-end': 'content-end',
803
+ 'center': 'content-center',
804
+ 'space-between': 'content-between',
805
+ 'space-around': 'content-around',
806
+ 'stretch': 'content-stretch'
807
+ };
808
+ return { className: alignMap[value] || null, skipped: !alignMap[value] };
809
+ }
810
+ if (prop === 'align-self') {
811
+ const alignSelfMap = {
812
+ 'auto': 'self-auto',
813
+ 'flex-start': 'self-start',
814
+ 'flex-end': 'self-end',
815
+ 'center': 'self-center',
816
+ 'stretch': 'self-stretch',
817
+ 'baseline': 'self-baseline'
818
+ };
819
+ return { className: alignSelfMap[value] || null, skipped: !alignSelfMap[value] };
820
+ }
821
+ if (prop === 'flex-grow') {
822
+ if (value === '0') {
823
+ return { className: 'grow-0', skipped: false };
824
+ }
825
+ if (value === '1') {
826
+ return { className: 'grow', skipped: false };
827
+ }
828
+ return { className: `grow-[${value}]`, skipped: false };
829
+ }
830
+ if (prop === 'flex-shrink') {
831
+ if (value === '0') {
832
+ return { className: 'shrink-0', skipped: false };
833
+ }
834
+ if (value === '1') {
835
+ return { className: 'shrink', skipped: false };
836
+ }
837
+ return { className: `shrink-[${value}]`, skipped: false };
838
+ }
839
+ if (prop === 'flex-basis') {
840
+ if (value === 'auto') {
841
+ return { className: 'basis-auto', skipped: false };
842
+ }
843
+ if (value === '0' || value === '0px') {
844
+ return { className: 'basis-0', skipped: false };
845
+ }
846
+ const px = this.extractPx(value);
847
+ if (px !== null) {
848
+ const spacing = this.pxToSpacing(px);
849
+ if (spacing) {
850
+ return { className: `basis-${spacing}`, skipped: false };
851
+ }
852
+ }
853
+ if (/^\d+(\.\d+)?(px|rem|em|%|vw|vh)?$/.test(value)) {
854
+ return { className: `basis-[${value}]`, skipped: false };
855
+ }
856
+ }
282
857
  return { className: null, skipped: true, reason: `Unsupported flexbox property: ${prop}` };
283
858
  }
859
+ convertFlexShorthand(value) {
860
+ const classes = [];
861
+ const warnings = [];
862
+ const cssProperties = [];
863
+ if (value === '1') {
864
+ classes.push('flex-1');
865
+ cssProperties.push('flex');
866
+ return { classes, warnings, cssProperties };
867
+ }
868
+ if (value === 'auto') {
869
+ classes.push('flex-auto');
870
+ cssProperties.push('flex');
871
+ return { classes, warnings, cssProperties };
872
+ }
873
+ if (value === 'none') {
874
+ classes.push('flex-none');
875
+ cssProperties.push('flex');
876
+ return { classes, warnings, cssProperties };
877
+ }
878
+ if (value === 'initial') {
879
+ classes.push('flex-initial');
880
+ cssProperties.push('flex');
881
+ return { classes, warnings, cssProperties };
882
+ }
883
+ const tokens = this.tokenizeValue(value);
884
+ if (tokens.length === 3) {
885
+ const [grow, shrink, basis] = tokens;
886
+ if (grow === '1' && shrink === '1' && basis === '0%') {
887
+ classes.push('flex-1');
888
+ cssProperties.push('flex');
889
+ }
890
+ else if (grow === '1' && shrink === '1' && basis === 'auto') {
891
+ classes.push('flex-auto');
892
+ cssProperties.push('flex');
893
+ }
894
+ else if (grow === '0' && shrink === '1' && basis === 'auto') {
895
+ classes.push('flex-initial');
896
+ cssProperties.push('flex');
897
+ }
898
+ else if (grow === '0' && shrink === '0' && basis === 'auto') {
899
+ classes.push('flex-none');
900
+ cssProperties.push('flex');
901
+ }
902
+ else {
903
+ classes.push(`flex-[${value}]`);
904
+ cssProperties.push('flex');
905
+ }
906
+ return { classes, warnings, cssProperties };
907
+ }
908
+ if (tokens.length === 1 || tokens.length === 2) {
909
+ classes.push(`flex-[${value}]`);
910
+ cssProperties.push('flex');
911
+ return { classes, warnings, cssProperties };
912
+ }
913
+ warnings.push(`Complex flex shorthand: ${value}`);
914
+ return { classes, warnings, cssProperties };
915
+ }
284
916
  convertGap(value) {
285
917
  const px = this.extractPx(value);
286
918
  if (px === null) {
919
+ if (/^\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
920
+ return { className: `gap-[${value}]`, skipped: false };
921
+ }
287
922
  return { className: null, skipped: true, reason: `Non-pixel gap value: ${value}` };
288
923
  }
289
924
  const spacing = this.pxToSpacing(px);
290
925
  if (!spacing) {
291
- return { className: null, skipped: true, reason: `No matching spacing for: ${value}` };
926
+ return { className: `gap-[${value}]`, skipped: false };
292
927
  }
293
928
  return { className: `gap-${spacing}`, skipped: false };
294
929
  }
295
930
  convertWidth(value) {
296
- // Handle percentage values
297
931
  if (value === '100%') {
298
932
  return { className: 'w-full', skipped: false };
299
933
  }
@@ -312,27 +946,53 @@ class TailwindMapper {
312
946
  if (value === '75%') {
313
947
  return { className: 'w-3/4', skipped: false };
314
948
  }
315
- // Handle pixel values
949
+ if (value === 'auto') {
950
+ return { className: 'w-auto', skipped: false };
951
+ }
952
+ if (value === 'fit-content') {
953
+ return { className: 'w-fit', skipped: false };
954
+ }
955
+ if (value === 'min-content') {
956
+ return { className: 'w-min', skipped: false };
957
+ }
958
+ if (value === 'max-content') {
959
+ return { className: 'w-max', skipped: false };
960
+ }
316
961
  const px = this.extractPx(value);
317
962
  if (px !== null) {
318
963
  const spacing = this.pxToSpacing(px);
319
964
  if (spacing) {
320
965
  return { className: `w-${spacing}`, skipped: false };
321
966
  }
322
- // Try arbitrary values for larger sizes
967
+ return { className: `w-[${value}]`, skipped: false };
968
+ }
969
+ if (/^\d+(\.\d+)?(px|rem|em|%|vw)?$/.test(value)) {
323
970
  return { className: `w-[${value}]`, skipped: false };
324
971
  }
325
972
  return { className: null, skipped: true, reason: `Complex width value: ${value}` };
326
973
  }
327
974
  convertHeight(value) {
328
- // Handle percentage values
329
975
  if (value === '100%') {
330
976
  return { className: 'h-full', skipped: false };
331
977
  }
332
978
  if (value === '50%') {
333
979
  return { className: 'h-1/2', skipped: false };
334
980
  }
335
- // Handle pixel values
981
+ if (value === 'auto') {
982
+ return { className: 'h-auto', skipped: false };
983
+ }
984
+ if (value === 'fit-content') {
985
+ return { className: 'h-fit', skipped: false };
986
+ }
987
+ if (value === 'min-content') {
988
+ return { className: 'h-min', skipped: false };
989
+ }
990
+ if (value === 'max-content') {
991
+ return { className: 'h-max', skipped: false };
992
+ }
993
+ if (value === '100vh') {
994
+ return { className: 'h-screen', skipped: false };
995
+ }
336
996
  const px = this.extractPx(value);
337
997
  if (px !== null) {
338
998
  const spacing = this.pxToSpacing(px);
@@ -341,10 +1001,12 @@ class TailwindMapper {
341
1001
  }
342
1002
  return { className: `h-[${value}]`, skipped: false };
343
1003
  }
1004
+ if (/^\d+(\.\d+)?(px|rem|em|%|vh)?$/.test(value)) {
1005
+ return { className: `h-[${value}]`, skipped: false };
1006
+ }
344
1007
  return { className: null, skipped: true, reason: `Complex height value: ${value}` };
345
1008
  }
346
1009
  convertBackgroundColor(value) {
347
- // Handle named colors and hex
348
1010
  const colorMap = {
349
1011
  'transparent': 'bg-transparent',
350
1012
  'white': 'bg-white',
@@ -357,11 +1019,9 @@ class TailwindMapper {
357
1019
  if (colorMap[value]) {
358
1020
  return { className: colorMap[value], skipped: false };
359
1021
  }
360
- // Handle hex colors - use arbitrary values
361
1022
  if (value.startsWith('#')) {
362
1023
  return { className: `bg-[${value}]`, skipped: false };
363
1024
  }
364
- // Handle rgb/rgba
365
1025
  if (value.startsWith('rgb')) {
366
1026
  return { className: `bg-[${value}]`, skipped: false };
367
1027
  }
@@ -391,13 +1051,14 @@ class TailwindMapper {
391
1051
  convertBorderRadius(value) {
392
1052
  const px = this.extractPx(value);
393
1053
  if (px === null) {
394
- // Handle named values
395
1054
  if (value === '50%') {
396
1055
  return { className: 'rounded-full', skipped: false };
397
1056
  }
1057
+ if (/^\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
1058
+ return { className: `rounded-[${value}]`, skipped: false };
1059
+ }
398
1060
  return { className: null, skipped: true, reason: `Complex border-radius: ${value}` };
399
1061
  }
400
- // Map to Tailwind radius scale
401
1062
  const radiusMap = {
402
1063
  0: 'rounded-none',
403
1064
  2: 'rounded-sm',
@@ -414,25 +1075,374 @@ class TailwindMapper {
414
1075
  if (Math.abs(closest - px) / (px || 1) < 0.2) {
415
1076
  return { className: radiusMap[closest], skipped: false };
416
1077
  }
417
- // Use arbitrary value
418
1078
  return { className: `rounded-[${value}]`, skipped: false };
419
1079
  }
1080
+ convertBorder(prop, value) {
1081
+ if (prop === 'border-width') {
1082
+ const widthMap = {
1083
+ '0': 'border-0',
1084
+ '1px': 'border',
1085
+ '2px': 'border-2',
1086
+ '4px': 'border-4',
1087
+ '8px': 'border-8'
1088
+ };
1089
+ if (widthMap[value]) {
1090
+ return { className: widthMap[value], skipped: false };
1091
+ }
1092
+ if (/^\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
1093
+ return { className: `border-[${value}]`, skipped: false };
1094
+ }
1095
+ return { className: null, skipped: true, reason: `Unknown border-width: ${value}` };
1096
+ }
1097
+ if (prop === 'border-style') {
1098
+ const styleMap = {
1099
+ 'solid': '',
1100
+ 'dashed': 'border-dashed',
1101
+ 'dotted': 'border-dotted',
1102
+ 'double': 'border-double',
1103
+ 'hidden': 'border-hidden',
1104
+ 'none': 'border-none'
1105
+ };
1106
+ if (value === 'solid') {
1107
+ return { className: null, skipped: false };
1108
+ }
1109
+ if (styleMap[value]) {
1110
+ return { className: styleMap[value], skipped: false };
1111
+ }
1112
+ return { className: null, skipped: true, reason: `Unknown border-style: ${value}` };
1113
+ }
1114
+ if (prop === 'border-color') {
1115
+ if (value.startsWith('#')) {
1116
+ return { className: `border-[${value}]`, skipped: false };
1117
+ }
1118
+ if (value.startsWith('rgb')) {
1119
+ return { className: `border-[${value}]`, skipped: false };
1120
+ }
1121
+ const colorMap = {
1122
+ 'transparent': 'border-transparent',
1123
+ 'white': 'border-white',
1124
+ 'black': 'border-black',
1125
+ 'red': 'border-red-500',
1126
+ 'blue': 'border-blue-500',
1127
+ 'green': 'border-green-500',
1128
+ 'gray': 'border-gray-500'
1129
+ };
1130
+ if (colorMap[value]) {
1131
+ return { className: colorMap[value], skipped: false };
1132
+ }
1133
+ return { className: `border-${value}`, skipped: false };
1134
+ }
1135
+ if (prop === 'border-top-width' || prop === 'border-right-width' ||
1136
+ prop === 'border-bottom-width' || prop === 'border-left-width') {
1137
+ const sideMap = {
1138
+ 'border-top-width': 'border-t',
1139
+ 'border-right-width': 'border-r',
1140
+ 'border-bottom-width': 'border-b',
1141
+ 'border-left-width': 'border-l'
1142
+ };
1143
+ const prefix = sideMap[prop];
1144
+ const widthMap = {
1145
+ '0': `${prefix}-0`,
1146
+ '1px': prefix,
1147
+ '2px': `${prefix}-2`,
1148
+ '4px': `${prefix}-4`,
1149
+ '8px': `${prefix}-8`
1150
+ };
1151
+ if (widthMap[value]) {
1152
+ return { className: widthMap[value], skipped: false };
1153
+ }
1154
+ if (/^\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
1155
+ return { className: `${prefix}-[${value}]`, skipped: false };
1156
+ }
1157
+ return { className: null, skipped: true, reason: `Unknown ${prop}: ${value}` };
1158
+ }
1159
+ return { className: null, skipped: true, reason: `Unknown border property: ${prop}` };
1160
+ }
1161
+ convertBorderShorthand(value) {
1162
+ const classes = [];
1163
+ const warnings = [];
1164
+ const cssProperties = [];
1165
+ const tokens = this.tokenizeValue(value);
1166
+ let width = null;
1167
+ let style = null;
1168
+ let color = null;
1169
+ for (const token of tokens) {
1170
+ if (/^\d+(\.\d+)?(px|rem|em|thin|medium|thick)?$/.test(token) ||
1171
+ token === 'thin' || token === 'medium' || token === 'thick') {
1172
+ width = token;
1173
+ }
1174
+ else if (['solid', 'dashed', 'dotted', 'double', 'hidden', 'none', 'groove', 'ridge', 'inset', 'outset'].includes(token)) {
1175
+ style = token;
1176
+ }
1177
+ else {
1178
+ color = token;
1179
+ }
1180
+ }
1181
+ if (width) {
1182
+ const widthMap = {
1183
+ '0': 'border-0',
1184
+ '1px': 'border',
1185
+ '2px': 'border-2',
1186
+ '4px': 'border-4',
1187
+ '8px': 'border-8',
1188
+ 'thin': 'border',
1189
+ 'medium': 'border-2',
1190
+ 'thick': 'border-4'
1191
+ };
1192
+ if (widthMap[width]) {
1193
+ classes.push(widthMap[width]);
1194
+ }
1195
+ else {
1196
+ classes.push(`border-[${width}]`);
1197
+ }
1198
+ cssProperties.push('border-width');
1199
+ }
1200
+ if (style && style !== 'solid') {
1201
+ const styleMap = {
1202
+ 'dashed': 'border-dashed',
1203
+ 'dotted': 'border-dotted',
1204
+ 'double': 'border-double',
1205
+ 'hidden': 'border-hidden',
1206
+ 'none': 'border-none'
1207
+ };
1208
+ if (styleMap[style]) {
1209
+ classes.push(styleMap[style]);
1210
+ cssProperties.push('border-style');
1211
+ }
1212
+ else {
1213
+ warnings.push(`Unsupported border-style: ${style}`);
1214
+ }
1215
+ }
1216
+ if (color) {
1217
+ if (color.startsWith('#')) {
1218
+ classes.push(`border-[${color}]`);
1219
+ }
1220
+ else if (color.startsWith('rgb')) {
1221
+ classes.push(`border-[${color}]`);
1222
+ }
1223
+ else {
1224
+ const colorMap = {
1225
+ 'transparent': 'border-transparent',
1226
+ 'white': 'border-white',
1227
+ 'black': 'border-black'
1228
+ };
1229
+ if (colorMap[color]) {
1230
+ classes.push(colorMap[color]);
1231
+ }
1232
+ else {
1233
+ classes.push(`border-${color}`);
1234
+ }
1235
+ }
1236
+ cssProperties.push('border-color');
1237
+ }
1238
+ return { classes, warnings, cssProperties };
1239
+ }
1240
+ convertDirectionalBorderShorthand(prop, value) {
1241
+ const classes = [];
1242
+ const warnings = [];
1243
+ const cssProperties = [];
1244
+ const sideMap = {
1245
+ 'border-top': { prefix: 'border-t', widthProp: 'border-top-width', colorProp: 'border-top-color' },
1246
+ 'border-right': { prefix: 'border-r', widthProp: 'border-right-width', colorProp: 'border-right-color' },
1247
+ 'border-bottom': { prefix: 'border-b', widthProp: 'border-bottom-width', colorProp: 'border-bottom-color' },
1248
+ 'border-left': { prefix: 'border-l', widthProp: 'border-left-width', colorProp: 'border-left-color' }
1249
+ };
1250
+ const side = sideMap[prop];
1251
+ if (!side) {
1252
+ return { classes, warnings: [`Unknown directional border: ${prop}`], cssProperties };
1253
+ }
1254
+ const tokens = this.tokenizeValue(value);
1255
+ let width = null;
1256
+ let style = null;
1257
+ let color = null;
1258
+ for (const token of tokens) {
1259
+ if (/^\d+(\.\d+)?(px|rem|em|thin|medium|thick)?$/.test(token) ||
1260
+ token === 'thin' || token === 'medium' || token === 'thick') {
1261
+ width = token;
1262
+ }
1263
+ else if (['solid', 'dashed', 'dotted', 'double', 'hidden', 'none'].includes(token)) {
1264
+ style = token;
1265
+ }
1266
+ else {
1267
+ color = token;
1268
+ }
1269
+ }
1270
+ if (width) {
1271
+ const widthMap = {
1272
+ '0': `${side.prefix}-0`,
1273
+ '1px': side.prefix,
1274
+ '2px': `${side.prefix}-2`,
1275
+ '4px': `${side.prefix}-4`,
1276
+ '8px': `${side.prefix}-8`
1277
+ };
1278
+ if (widthMap[width]) {
1279
+ classes.push(widthMap[width]);
1280
+ }
1281
+ else {
1282
+ classes.push(`${side.prefix}-[${width}]`);
1283
+ }
1284
+ cssProperties.push(side.widthProp);
1285
+ }
1286
+ if (style && style !== 'solid') {
1287
+ warnings.push(`Border style '${style}' for ${prop} applies to all borders`);
1288
+ }
1289
+ if (color) {
1290
+ if (color.startsWith('#')) {
1291
+ classes.push(`${side.prefix}-[${color}]`);
1292
+ }
1293
+ else if (color.startsWith('rgb')) {
1294
+ classes.push(`${side.prefix}-[${color}]`);
1295
+ }
1296
+ else {
1297
+ classes.push(`${side.prefix}-${color}`);
1298
+ }
1299
+ cssProperties.push(side.colorProp);
1300
+ }
1301
+ return { classes, warnings, cssProperties };
1302
+ }
1303
+ convertAspectRatio(value) {
1304
+ const ratioMap = {
1305
+ '1/1': 'aspect-square',
1306
+ '16/9': 'aspect-video',
1307
+ '4/3': 'aspect-[4/3]',
1308
+ '3/4': 'aspect-[3/4]',
1309
+ '2/3': 'aspect-[2/3]',
1310
+ '3/2': 'aspect-[3/2]',
1311
+ '1/2': 'aspect-[1/2]',
1312
+ '2/1': 'aspect-[2/1]',
1313
+ 'auto': 'aspect-auto'
1314
+ };
1315
+ if (ratioMap[value]) {
1316
+ return { className: ratioMap[value], skipped: false };
1317
+ }
1318
+ if (/^\d+(\.\d+)?$/.test(value)) {
1319
+ return { className: `aspect-[${value}]`, skipped: false };
1320
+ }
1321
+ if (/^\d+\/\d+$/.test(value)) {
1322
+ return { className: `aspect-[${value}]`, skipped: false };
1323
+ }
1324
+ return { className: null, skipped: true, reason: `Unknown aspect-ratio: ${value}` };
1325
+ }
1326
+ convertOverflow(prop, value) {
1327
+ const prefixMap = {
1328
+ 'overflow': 'overflow',
1329
+ 'overflow-x': 'overflow-x',
1330
+ 'overflow-y': 'overflow-y'
1331
+ };
1332
+ const prefix = prefixMap[prop];
1333
+ const valueMap = {
1334
+ 'auto': `${prefix}-auto`,
1335
+ 'hidden': `${prefix}-hidden`,
1336
+ 'visible': `${prefix}-visible`,
1337
+ 'scroll': `${prefix}-scroll`,
1338
+ 'clip': `${prefix}-clip`
1339
+ };
1340
+ if (valueMap[value]) {
1341
+ return { className: valueMap[value], skipped: false };
1342
+ }
1343
+ return { className: null, skipped: true, reason: `Unknown overflow value: ${value}` };
1344
+ }
1345
+ convertObjectFit(value) {
1346
+ const fitMap = {
1347
+ 'contain': 'object-contain',
1348
+ 'cover': 'object-cover',
1349
+ 'fill': 'object-fill',
1350
+ 'none': 'object-none',
1351
+ 'scale-down': 'object-scale-down'
1352
+ };
1353
+ if (fitMap[value]) {
1354
+ return { className: fitMap[value], skipped: false };
1355
+ }
1356
+ return { className: null, skipped: true, reason: `Unknown object-fit: ${value}` };
1357
+ }
1358
+ convertObjectPosition(value) {
1359
+ const positionMap = {
1360
+ 'center': 'object-center',
1361
+ 'top': 'object-top',
1362
+ 'bottom': 'object-bottom',
1363
+ 'left': 'object-left',
1364
+ 'right': 'object-right',
1365
+ 'center center': 'object-center',
1366
+ 'center top': 'object-top',
1367
+ 'center bottom': 'object-bottom',
1368
+ 'left center': 'object-left',
1369
+ 'right center': 'object-right',
1370
+ 'left top': 'object-left-top',
1371
+ 'right top': 'object-right-top',
1372
+ 'left bottom': 'object-left-bottom',
1373
+ 'right bottom': 'object-right-bottom'
1374
+ };
1375
+ if (positionMap[value]) {
1376
+ return { className: positionMap[value], skipped: false };
1377
+ }
1378
+ if (/^\d+(\.\d+)?(%|px|rem|em)?(\s+\d+(\.\d+)?(%|px|rem|em)?)?$/.test(value)) {
1379
+ return { className: `object-[${value}]`, skipped: false };
1380
+ }
1381
+ return { className: null, skipped: true, reason: `Unknown object-position: ${value}` };
1382
+ }
1383
+ convertOpacity(value) {
1384
+ const numValue = parseFloat(value);
1385
+ if (isNaN(numValue)) {
1386
+ return { className: null, skipped: true, reason: `Invalid opacity value: ${value}` };
1387
+ }
1388
+ const percentValue = Math.round(numValue * 100);
1389
+ if (this.opacityScale.has(percentValue)) {
1390
+ return { className: `opacity-${this.opacityScale.get(percentValue)}`, skipped: false };
1391
+ }
1392
+ return { className: `opacity-[${value}]`, skipped: false };
1393
+ }
1394
+ convertWordBreak(value) {
1395
+ const breakMap = {
1396
+ 'normal': 'break-normal',
1397
+ 'break-all': 'break-all',
1398
+ 'break-word': 'break-words',
1399
+ 'keep-all': 'break-keep'
1400
+ };
1401
+ if (breakMap[value]) {
1402
+ return { className: breakMap[value], skipped: false };
1403
+ }
1404
+ return { className: null, skipped: true, reason: `Unknown word-break: ${value}` };
1405
+ }
1406
+ convertZIndex(value) {
1407
+ const numValue = parseInt(value, 10);
1408
+ if (isNaN(numValue)) {
1409
+ if (value === 'auto') {
1410
+ return { className: 'z-auto', skipped: false };
1411
+ }
1412
+ return { className: null, skipped: true, reason: `Invalid z-index value: ${value}` };
1413
+ }
1414
+ if (this.zIndexScale.has(numValue)) {
1415
+ return { className: `z-${this.zIndexScale.get(numValue)}`, skipped: false };
1416
+ }
1417
+ return { className: `z-[${value}]`, skipped: false };
1418
+ }
420
1419
  convertMultiple(properties) {
421
1420
  const classes = [];
422
1421
  const warnings = [];
423
1422
  properties.forEach(({ property, value }) => {
424
- const result = this.convertProperty(property, value);
425
- if (result.skipped) {
426
- warnings.push(result.reason || `Skipped: ${property}: ${value}`);
427
- logger_1.logger.verbose(`Skipped: ${property}: ${value} - ${result.reason}`);
1423
+ const multiResult = this.convertPropertyWithMultiple(property, value);
1424
+ classes.push(...multiResult.classes);
1425
+ warnings.push(...multiResult.warnings);
1426
+ if (multiResult.classes.length === 0 && multiResult.warnings.length === 0) {
1427
+ const result = this.convertProperty(property, value);
1428
+ if (result.skipped) {
1429
+ warnings.push(result.reason || `Skipped: ${property}: ${value}`);
1430
+ logger_1.logger.verbose(`Skipped: ${property}: ${value} - ${result.reason}`);
1431
+ }
1432
+ else if (result.className) {
1433
+ classes.push(result.className);
1434
+ logger_1.logger.verbose(`Converted: ${property}: ${value} → ${result.className}`);
1435
+ }
428
1436
  }
429
- else if (result.className) {
430
- classes.push(result.className);
431
- logger_1.logger.verbose(`Converted: ${property}: ${value} → ${result.className}`);
1437
+ else {
1438
+ if (multiResult.classes.length > 0) {
1439
+ logger_1.logger.verbose(`Converted: ${property}: ${value} → ${multiResult.classes.join(', ')}`);
1440
+ }
1441
+ multiResult.warnings.forEach(w => logger_1.logger.verbose(`Warning: ${w}`));
432
1442
  }
433
1443
  });
434
1444
  return { classes, warnings };
435
1445
  }
436
1446
  }
437
1447
  exports.TailwindMapper = TailwindMapper;
438
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbHdpbmRNYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGFpbHdpbmRNYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkNBQXdDO0FBYXhDLE1BQWEsY0FBYztJQUl6QixZQUFZLE1BQXNCO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBRWpELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUMvQyw4REFBOEQ7WUFDOUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM1QyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzVDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBRUQsMkJBQTJCO1lBQzNCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDMUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFD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LE9BQU8sQ0FBQyxZQUFZLFFBQVEsS0FBSyxLQUFLLE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDdEUsQ0FBQztpQkFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQy9CLGVBQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxRQUFRLEtBQUssS0FBSyxNQUFNLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBMWdCRCx3Q0EwZ0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGFpbHdpbmRDb25maWcgfSBmcm9tICcuL3V0aWxzL2NvbmZpZyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUHJvcGVydHkge1xuICBwcm9wZXJ0eTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnNpb25SZXN1bHQge1xuICBjbGFzc05hbWU6IHN0cmluZyB8IG51bGw7XG4gIHNraXBwZWQ6IGJvb2xlYW47XG4gIHJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRhaWx3aW5kTWFwcGVyIHtcbiAgcHJpdmF0ZSBjb25maWc6IFRhaWx3aW5kQ29uZmlnO1xuICBwcml2YXRlIHNwYWNpbmdTY2FsZTogTWFwPG51bWJlciwgc3RyaW5nPjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFRhaWx3aW5kQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5zcGFjaW5nU2NhbGUgPSB0aGlzLmJ1aWxkU3BhY2luZ1NjYWxlKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3BhY2luZ1NjYWxlKCk6IE1hcDxudW1iZXIsIHN0cmluZz4ge1xuICAgIGNvbnN0IHNjYWxlID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5jb25maWcudGhlbWU/LnNwYWNpbmcgfHwge307XG5cbiAgICBPYmplY3QuZW50cmllcyhzcGFjaW5nKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIC8vIENvbnZlcnQgcmVtIHRvIHBpeGVscyBmb3IgY29tcGFyaXNvbiAoYXNzdW1pbmcgMXJlbSA9IDE2cHgpXG4gICAgICBjb25zdCByZW1NYXRjaCA9IHZhbHVlLm1hdGNoKC8oW1xcZC5dKylyZW0vKTtcbiAgICAgIGlmIChyZW1NYXRjaCkge1xuICAgICAgICBjb25zdCBwaXhlbHMgPSBwYXJzZUZsb2F0KHJlbU1hdGNoWzFdKSAqIDE2O1xuICAgICAgICBzY2FsZS5zZXQoTWF0aC5yb3VuZChwaXhlbHMpLCBrZXkpO1xuICAgICAgfVxuXG4gICAgICAvLyBBbHNvIGhhbmRsZSBwaXhlbCB2YWx1ZXNcbiAgICAgIGNvbnN0IHB4TWF0Y2ggPSB2YWx1ZS5tYXRjaCgvKFtcXGQuXSspcHgvKTtcbiAgICAgIGlmIChweE1hdGNoKSB7XG4gICAgICAgIHNjYWxlLnNldChNYXRoLnJvdW5kKHBhcnNlRmxvYXQocHhNYXRjaFsxXSkpLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBweFRvU3BhY2luZyhweDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVHJ5IGV4YWN0IG1hdGNoIGZpcnN0XG4gICAgaWYgKHRoaXMuc3BhY2luZ1NjYWxlLmhhcyhweCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwYWNpbmdTY2FsZS5nZXQocHgpITtcbiAgICB9XG5cbiAgICAvLyBGaW5kIGNsb3Nlc3QgbWF0Y2hcbiAgICBsZXQgY2xvc2VzdEtleTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNsb3Nlc3REaWZmOiBudW1iZXIgPSBJbmZpbml0eTtcbiAgICBcbiAgICB0aGlzLnNwYWNpbmdTY2FsZS5mb3JFYWNoKChfLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLmFicyhrZXkgLSBweCk7XG4gICAgICBpZiAoZGlmZiA8IGNsb3Nlc3REaWZmKSB7XG4gICAgICAgIGNsb3Nlc3RLZXkgPSBrZXk7XG4gICAgICAgIGNsb3Nlc3REaWZmID0gZGlmZjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE9ubHkgYWNjZXB0IGlmIHdpdGhpbiByZWFzb25hYmxlIHRvbGVyYW5jZSAoMjAlKVxuICAgIGlmIChjbG9zZXN0S2V5ICE9PSBudWxsICYmIGNsb3Nlc3REaWZmIC8gcHggPCAwLjIpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwYWNpbmdTY2FsZS5nZXQoY2xvc2VzdEtleSkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFB4KHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBweE1hdGNoID0gdmFsdWUubWF0Y2goL14oW1xcZC5dKylweCQvKTtcbiAgICBpZiAocHhNYXRjaCkge1xuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocHhNYXRjaFsxXSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHJlbSB2YWx1ZXNcbiAgICBjb25zdCByZW1NYXRjaCA9IHZhbHVlLm1hdGNoKC9eKFtcXGQuXSspcmVtJC8pO1xuICAgIGlmIChyZW1NYXRjaCkge1xuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmVtTWF0Y2hbMV0pICogMTY7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb252ZXJ0UHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQcm9wID0gcHJvcGVydHkudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICBsb2dnZXIudmVyYm9zZShgQ29udmVydGluZzogJHtub3JtYWxpemVkUHJvcH06ICR7bm9ybWFsaXplZFZhbHVlfWApO1xuXG4gICAgLy8gRGlzcGxheSBwcm9wZXJ0aWVzXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnZGlzcGxheScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREaXNwbGF5KG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gUG9zaXRpb24gcHJvcGVydGllc1xuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ3Bvc2l0aW9uJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBub3JtYWxpemVkVmFsdWUsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gTWFyZ2luIHByb3BlcnRpZXNcbiAgICBpZiAobm9ybWFsaXplZFByb3Auc3RhcnRzV2l0aCgnbWFyZ2luJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRNYXJnaW4obm9ybWFsaXplZFByb3AsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gUGFkZGluZyBwcm9wZXJ0aWVzXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ3BhZGRpbmcnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFBhZGRpbmcobm9ybWFsaXplZFByb3AsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gRm9udCBwcm9wZXJ0aWVzXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnZm9udC13ZWlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Rm9udFdlaWdodChub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2ZvbnQtc2l6ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRGb250U2l6ZShub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFRleHQgcHJvcGVydGllc1xuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ3RleHQtYWxpZ24nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB0ZXh0LSR7bm9ybWFsaXplZFZhbHVlfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gRmxleGJveCBwcm9wZXJ0aWVzXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ2ZsZXgnKSB8fCBcbiAgICAgICAgbm9ybWFsaXplZFByb3Auc3RhcnRzV2l0aCgnanVzdGlmeScpIHx8IFxuICAgICAgICBub3JtYWxpemVkUHJvcC5zdGFydHNXaXRoKCdhbGlnbicpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RmxleGJveChub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBHYXAgcHJvcGVydGllc1xuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2dhcCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRHYXAobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBXaWR0aCBhbmQgSGVpZ2h0XG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnd2lkdGgnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0V2lkdGgobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdoZWlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0SGVpZ2h0KG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQ29sb3JzXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnYmFja2dyb3VuZC1jb2xvcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRCYWNrZ3JvdW5kQ29sb3Iobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdjb2xvcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUZXh0Q29sb3Iobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBCb3JkZXIgcmFkaXVzXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnYm9yZGVyLXJhZGl1cycpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRCb3JkZXJSYWRpdXMobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBVbnN1cHBvcnRlZCBwcm9wZXJ0aWVzXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzTmFtZTogbnVsbCxcbiAgICAgIHNraXBwZWQ6IHRydWUsXG4gICAgICByZWFzb246IGBVbnN1cHBvcnRlZCBwcm9wZXJ0eTogJHtwcm9wZXJ0eX1gXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERpc3BsYXkodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IGRpc3BsYXlNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnZmxleCc6ICdmbGV4JyxcbiAgICAgICdibG9jayc6ICdibG9jaycsXG4gICAgICAnaW5saW5lJzogJ2lubGluZScsXG4gICAgICAnaW5saW5lLWJsb2NrJzogJ2lubGluZS1ibG9jaycsXG4gICAgICAnZ3JpZCc6ICdncmlkJyxcbiAgICAgICdub25lJzogJ2hpZGRlbicsXG4gICAgICAnY29udGVudHMnOiAnY29udGVudHMnLFxuICAgICAgJ3RhYmxlJzogJ3RhYmxlJyxcbiAgICAgICd0YWJsZS1jZWxsJzogJ3RhYmxlLWNlbGwnXG4gICAgfTtcblxuICAgIGlmIChkaXNwbGF5TWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBkaXNwbGF5TWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVua25vd24gZGlzcGxheSB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRNYXJnaW4ocHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgXG4gICAgY29uc3Qgc2lkZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdtYXJnaW4nOiAnbScsXG4gICAgICAnbWFyZ2luLXRvcCc6ICdtdCcsXG4gICAgICAnbWFyZ2luLXJpZ2h0JzogJ21yJyxcbiAgICAgICdtYXJnaW4tYm90dG9tJzogJ21iJyxcbiAgICAgICdtYXJnaW4tbGVmdCc6ICdtbCcsXG4gICAgICAnbWFyZ2luLXgnOiAnbXgnLFxuICAgICAgJ21hcmdpbi15JzogJ215J1xuICAgIH07XG4gICAgY29uc3QgcHJlZml4ID0gc2lkZU1hcFtwcm9wXSB8fCAnbSc7XG4gICAgXG4gICAgaWYgKHB4ID09PSBudWxsKSB7XG4gICAgICBpZiAoL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBOb24tcGl4ZWwgbWFyZ2luIHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgaWYgKCFzcGFjaW5nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LSR7c3BhY2luZ31gLCBza2lwcGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UGFkZGluZyhwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBweCA9IHRoaXMuZXh0cmFjdFB4KHZhbHVlKTtcbiAgICBcbiAgICBjb25zdCBzaWRlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3BhZGRpbmcnOiAncCcsXG4gICAgICAncGFkZGluZy10b3AnOiAncHQnLFxuICAgICAgJ3BhZGRpbmctcmlnaHQnOiAncHInLFxuICAgICAgJ3BhZGRpbmctYm90dG9tJzogJ3BiJyxcbiAgICAgICdwYWRkaW5nLWxlZnQnOiAncGwnLFxuICAgICAgJ3BhZGRpbmcteCc6ICdweCcsXG4gICAgICAncGFkZGluZy15JzogJ3B5J1xuICAgIH07XG4gICAgY29uc3QgcHJlZml4ID0gc2lkZU1hcFtwcm9wXSB8fCAncCc7XG4gICAgXG4gICAgaWYgKHB4ID09PSBudWxsKSB7XG4gICAgICBpZiAoL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBOb24tcGl4ZWwgcGFkZGluZyB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMucHhUb1NwYWNpbmcocHgpO1xuICAgIGlmICghc3BhY2luZykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS0ke3NwYWNpbmd9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEZvbnRXZWlnaHQodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHdlaWdodE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICcxMDAnOiAnZm9udC10aGluJyxcbiAgICAgICcyMDAnOiAnZm9udC1leHRyYWxpZ2h0JyxcbiAgICAgICczMDAnOiAnZm9udC1saWdodCcsXG4gICAgICAnNDAwJzogJ2ZvbnQtbm9ybWFsJyxcbiAgICAgICc1MDAnOiAnZm9udC1tZWRpdW0nLFxuICAgICAgJzYwMCc6ICdmb250LXNlbWlib2xkJyxcbiAgICAgICc3MDAnOiAnZm9udC1ib2xkJyxcbiAgICAgICc4MDAnOiAnZm9udC1leHRyYWJvbGQnLFxuICAgICAgJzkwMCc6ICdmb250LWJsYWNrJyxcbiAgICAgICdub3JtYWwnOiAnZm9udC1ub3JtYWwnLFxuICAgICAgJ2JvbGQnOiAnZm9udC1ib2xkJ1xuICAgIH07XG5cbiAgICBpZiAod2VpZ2h0TWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiB3ZWlnaHRNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biBmb250LXdlaWdodDogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGb250U2l6ZSh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgaWYgKHB4ICE9PSBudWxsKSB7XG4gICAgICAvLyBNYXAgY29tbW9uIGZvbnQgc2l6ZXNcbiAgICAgIGNvbnN0IHNpemVNYXA6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gICAgICAgIDEyOiAndGV4dC14cycsXG4gICAgICAgIDE0OiAndGV4dC1zbScsXG4gICAgICAgIDE2OiAndGV4dC1iYXNlJyxcbiAgICAgICAgMTg6ICd0ZXh0LWxnJyxcbiAgICAgICAgMjA6ICd0ZXh0LXhsJyxcbiAgICAgICAgMjQ6ICd0ZXh0LTJ4bCcsXG4gICAgICAgIDMwOiAndGV4dC0zeGwnLFxuICAgICAgICAzNjogJ3RleHQtNHhsJyxcbiAgICAgICAgNDg6ICd0ZXh0LTV4bCdcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNsb3Nlc3QgPSBPYmplY3Qua2V5cyhzaXplTWFwKVxuICAgICAgICAubWFwKE51bWJlcilcbiAgICAgICAgLnJlZHVjZSgocHJldiwgY3VycikgPT4gXG4gICAgICAgICAgTWF0aC5hYnMoY3VyciAtIHB4KSA8IE1hdGguYWJzKHByZXYgLSBweCkgPyBjdXJyIDogcHJldlxuICAgICAgICApO1xuXG4gICAgICBpZiAoTWF0aC5hYnMoY2xvc2VzdCAtIHB4KSAvIHB4IDwgMC4xNSkge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IHNpemVNYXBbY2xvc2VzdF0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRleHQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtKT8kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdGV4dC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYE5vbi1zdGFuZGFyZCBmb250LXNpemU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RmxleGJveChwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICAvLyBGbGV4IGRpcmVjdGlvblxuICAgIGlmIChwcm9wID09PSAnZmxleC1kaXJlY3Rpb24nKSB7XG4gICAgICBjb25zdCBkaXJNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdyb3cnOiAnZmxleC1yb3cnLFxuICAgICAgICAncm93LXJldmVyc2UnOiAnZmxleC1yb3ctcmV2ZXJzZScsXG4gICAgICAgICdjb2x1bW4nOiAnZmxleC1jb2wnLFxuICAgICAgICAnY29sdW1uLXJldmVyc2UnOiAnZmxleC1jb2wtcmV2ZXJzZSdcbiAgICAgIH07XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGRpck1hcFt2YWx1ZV0gfHwgbnVsbCwgc2tpcHBlZDogIWRpck1hcFt2YWx1ZV0gfTtcbiAgICB9XG5cbiAgICAvLyBGbGV4IHdyYXBcbiAgICBpZiAocHJvcCA9PT0gJ2ZsZXgtd3JhcCcpIHtcbiAgICAgIGNvbnN0IHdyYXBNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICd3cmFwJzogJ2ZsZXgtd3JhcCcsXG4gICAgICAgICdub3dyYXAnOiAnZmxleC1ub3dyYXAnLFxuICAgICAgICAnd3JhcC1yZXZlcnNlJzogJ2ZsZXgtd3JhcC1yZXZlcnNlJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogd3JhcE1hcFt2YWx1ZV0gfHwgbnVsbCwgc2tpcHBlZDogIXdyYXBNYXBbdmFsdWVdIH07XG4gICAgfVxuXG4gICAgLy8gSnVzdGlmeSBjb250ZW50XG4gICAgaWYgKHByb3AgPT09ICdqdXN0aWZ5LWNvbnRlbnQnKSB7XG4gICAgICBjb25zdCBqdXN0aWZ5TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnZmxleC1zdGFydCc6ICdqdXN0aWZ5LXN0YXJ0JyxcbiAgICAgICAgJ2ZsZXgtZW5kJzogJ2p1c3RpZnktZW5kJyxcbiAgICAgICAgJ2NlbnRlcic6ICdqdXN0aWZ5LWNlbnRlcicsXG4gICAgICAgICdzcGFjZS1iZXR3ZWVuJzogJ2p1c3RpZnktYmV0d2VlbicsXG4gICAgICAgICdzcGFjZS1hcm91bmQnOiAnanVzdGlmeS1hcm91bmQnLFxuICAgICAgICAnc3BhY2UtZXZlbmx5JzogJ2p1c3RpZnktZXZlbmx5J1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZToganVzdGlmeU1hcFt2YWx1ZV0gfHwgbnVsbCwgc2tpcHBlZDogIWp1c3RpZnlNYXBbdmFsdWVdIH07XG4gICAgfVxuXG4gICAgLy8gQWxpZ24gaXRlbXNcbiAgICBpZiAocHJvcCA9PT0gJ2FsaWduLWl0ZW1zJykge1xuICAgICAgY29uc3QgYWxpZ25NYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdmbGV4LXN0YXJ0JzogJ2l0ZW1zLXN0YXJ0JyxcbiAgICAgICAgJ2ZsZXgtZW5kJzogJ2l0ZW1zLWVuZCcsXG4gICAgICAgICdjZW50ZXInOiAnaXRlbXMtY2VudGVyJyxcbiAgICAgICAgJ2Jhc2VsaW5lJzogJ2l0ZW1zLWJhc2VsaW5lJyxcbiAgICAgICAgJ3N0cmV0Y2gnOiAnaXRlbXMtc3RyZXRjaCdcbiAgICAgIH07XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGFsaWduTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhYWxpZ25NYXBbdmFsdWVdIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbnN1cHBvcnRlZCBmbGV4Ym94IHByb3BlcnR5OiAke3Byb3B9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0R2FwKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBweCA9IHRoaXMuZXh0cmFjdFB4KHZhbHVlKTtcbiAgICBpZiAocHggPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgTm9uLXBpeGVsIGdhcCB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMucHhUb1NwYWNpbmcocHgpO1xuICAgIGlmICghc3BhY2luZykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBObyBtYXRjaGluZyBzcGFjaW5nIGZvcjogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgZ2FwLSR7c3BhY2luZ31gLCBza2lwcGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0V2lkdGgodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIC8vIEhhbmRsZSBwZXJjZW50YWdlIHZhbHVlc1xuICAgIGlmICh2YWx1ZSA9PT0gJzEwMCUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LWZ1bGwnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICc1MCUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LTEvMicsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzMzLjMzMyUnIHx8IHZhbHVlID09PSAnMzMuMzMlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy0xLzMnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICc2Ni42NjYlJyB8fCB2YWx1ZSA9PT0gJzY2LjY3JScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctMi8zJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnMjUlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy0xLzQnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICc3NSUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LTMvNCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHBpeGVsIHZhbHVlc1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIGlmIChweCAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc3BhY2luZyA9IHRoaXMucHhUb1NwYWNpbmcocHgpO1xuICAgICAgaWYgKHNwYWNpbmcpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdy0ke3NwYWNpbmd9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIC8vIFRyeSBhcmJpdHJhcnkgdmFsdWVzIGZvciBsYXJnZXIgc2l6ZXNcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHctWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4IHdpZHRoIHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEhlaWdodCh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgLy8gSGFuZGxlIHBlcmNlbnRhZ2UgdmFsdWVzXG4gICAgaWYgKHZhbHVlID09PSAnMTAwJScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ2gtZnVsbCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzUwJScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ2gtMS8yJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcGl4ZWwgdmFsdWVzXG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgaWYgKHB4ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgICBpZiAoc3BhY2luZykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBoLSR7c3BhY2luZ31gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgaC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggaGVpZ2h0IHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgLy8gSGFuZGxlIG5hbWVkIGNvbG9ycyBhbmQgaGV4XG4gICAgY29uc3QgY29sb3JNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAndHJhbnNwYXJlbnQnOiAnYmctdHJhbnNwYXJlbnQnLFxuICAgICAgJ3doaXRlJzogJ2JnLXdoaXRlJyxcbiAgICAgICdibGFjayc6ICdiZy1ibGFjaycsXG4gICAgICAncmVkJzogJ2JnLXJlZC01MDAnLFxuICAgICAgJ2JsdWUnOiAnYmctYmx1ZS01MDAnLFxuICAgICAgJ2dyZWVuJzogJ2JnLWdyZWVuLTUwMCcsXG4gICAgICAnZ3JheSc6ICdiZy1ncmF5LTUwMCdcbiAgICB9O1xuXG4gICAgaWYgKGNvbG9yTWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBjb2xvck1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGhleCBjb2xvcnMgLSB1c2UgYXJiaXRyYXJ5IHZhbHVlc1xuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGJnLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSByZ2IvcmdiYVxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdyZ2InKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgYmctWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4IGJhY2tncm91bmQtY29sb3I6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VGV4dENvbG9yKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBjb2xvck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICd0cmFuc3BhcmVudCc6ICd0ZXh0LXRyYW5zcGFyZW50JyxcbiAgICAgICd3aGl0ZSc6ICd0ZXh0LXdoaXRlJyxcbiAgICAgICdibGFjayc6ICd0ZXh0LWJsYWNrJyxcbiAgICAgICdyZWQnOiAndGV4dC1yZWQtNTAwJyxcbiAgICAgICdibHVlJzogJ3RleHQtYmx1ZS01MDAnLFxuICAgICAgJ2dyZWVuJzogJ3RleHQtZ3JlZW4tNTAwJyxcbiAgICAgICdncmF5JzogJ3RleHQtZ3JheS01MDAnXG4gICAgfTtcblxuICAgIGlmIChjb2xvck1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogY29sb3JNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRleHQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ3JnYicpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB0ZXh0LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgQ29tcGxleCBjb2xvcjogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRCb3JkZXJSYWRpdXModmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIFxuICAgIGlmIChweCA9PT0gbnVsbCkge1xuICAgICAgLy8gSGFuZGxlIG5hbWVkIHZhbHVlc1xuICAgICAgaWYgKHZhbHVlID09PSAnNTAlJykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdyb3VuZGVkLWZ1bGwnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4IGJvcmRlci1yYWRpdXM6ICR7dmFsdWV9YCB9O1xuICAgIH1cblxuICAgIC8vIE1hcCB0byBUYWlsd2luZCByYWRpdXMgc2NhbGVcbiAgICBjb25zdCByYWRpdXNNYXA6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gICAgICAwOiAncm91bmRlZC1ub25lJyxcbiAgICAgIDI6ICdyb3VuZGVkLXNtJyxcbiAgICAgIDQ6ICdyb3VuZGVkJyxcbiAgICAgIDY6ICdyb3VuZGVkLW1kJyxcbiAgICAgIDg6ICdyb3VuZGVkLWxnJyxcbiAgICAgIDEyOiAncm91bmRlZC14bCcsXG4gICAgICAxNjogJ3JvdW5kZWQtMnhsJyxcbiAgICAgIDI0OiAncm91bmRlZC0zeGwnXG4gICAgfTtcblxuICAgIGNvbnN0IGNsb3Nlc3QgPSBPYmplY3Qua2V5cyhyYWRpdXNNYXApXG4gICAgICAubWFwKE51bWJlcilcbiAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IFxuICAgICAgICBNYXRoLmFicyhjdXJyIC0gcHgpIDwgTWF0aC5hYnMocHJldiAtIHB4KSA/IGN1cnIgOiBwcmV2XG4gICAgICApO1xuXG4gICAgaWYgKE1hdGguYWJzKGNsb3Nlc3QgLSBweCkgLyAocHggfHwgMSkgPCAwLjIpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogcmFkaXVzTWFwW2Nsb3Nlc3RdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIFVzZSBhcmJpdHJhcnkgdmFsdWVcbiAgICByZXR1cm4geyBjbGFzc05hbWU6IGByb3VuZGVkLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgY29udmVydE11bHRpcGxlKHByb3BlcnRpZXM6IENTU1Byb3BlcnR5W10pOiB7IGNsYXNzZXM6IHN0cmluZ1tdOyB3YXJuaW5nczogc3RyaW5nW10gfSB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgIHByb3BlcnRpZXMuZm9yRWFjaCgoeyBwcm9wZXJ0eSwgdmFsdWUgfSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb252ZXJ0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTtcbiAgICAgIFxuICAgICAgaWYgKHJlc3VsdC5za2lwcGVkKSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2gocmVzdWx0LnJlYXNvbiB8fCBgU2tpcHBlZDogJHtwcm9wZXJ0eX06ICR7dmFsdWV9YCk7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGBTa2lwcGVkOiAke3Byb3BlcnR5fTogJHt2YWx1ZX0gLSAke3Jlc3VsdC5yZWFzb259YCk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5jbGFzc05hbWUpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHJlc3VsdC5jbGFzc05hbWUpO1xuICAgICAgICBsb2dnZXIudmVyYm9zZShgQ29udmVydGVkOiAke3Byb3BlcnR5fTogJHt2YWx1ZX0g4oaSICR7cmVzdWx0LmNsYXNzTmFtZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzIH07XG4gIH1cbn1cbiJdfQ==
1448
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbHdpbmRNYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGFpbHdpbmRNYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkNBQXdDO0FBeUJ4QyxNQUFhLGNBQWM7SUFVekIsWUFBWSxNQUFzQjtRQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBRWpELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUMvQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzVDLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxNQUFN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Q0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQy9CLGVBQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxRQUFRLEtBQUssS0FBSyxNQUFNLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRSxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ25DLGVBQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxRQUFRLEtBQUssS0FBSyxNQUFNLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekYsQ0FBQztnQkFDRCxXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckUsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUE3cERELHdDQTZwREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUYWlsd2luZENvbmZpZyB9IGZyb20gJy4vdXRpbHMvY29uZmlnJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vdXRpbHMvbG9nZ2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBDU1NQcm9wZXJ0eSB7XG4gIHByb3BlcnR5OiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2lvblJlc3VsdCB7XG4gIGNsYXNzTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgc2tpcHBlZDogYm9vbGVhbjtcbiAgcmVhc29uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpQ29udmVyc2lvblJlc3VsdCB7XG4gIGNsYXNzZXM6IHN0cmluZ1tdO1xuICB3YXJuaW5nczogc3RyaW5nW107XG4gIGNzc1Byb3BlcnRpZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUGFyc2VkU3BhY2luZ1ZhbHVlIHtcbiAgdmFsdWU6IHN0cmluZztcbiAgcHg6IG51bWJlciB8IG51bGw7XG4gIHNwYWNpbmdLZXk6IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBUYWlsd2luZE1hcHBlciB7XG4gIHByaXZhdGUgY29uZmlnOiBUYWlsd2luZENvbmZpZztcbiAgcHJpdmF0ZSBzcGFjaW5nU2NhbGU6IE1hcDxudW1iZXIsIHN0cmluZz47XG4gIHByaXZhdGUgbWF4V2lkdGhTY2FsZTogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcHJpdmF0ZSBmb250U2l6ZVNjYWxlOiBNYXA8bnVtYmVyLCBzdHJpbmc+O1xuICBwcml2YXRlIGxpbmVIZWlnaHRTY2FsZTogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcHJpdmF0ZSBsZXR0ZXJTcGFjaW5nU2NhbGU6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHByaXZhdGUgekluZGV4U2NhbGU6IE1hcDxudW1iZXIsIHN0cmluZz47XG4gIHByaXZhdGUgb3BhY2l0eVNjYWxlOiBNYXA8bnVtYmVyLCBzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogVGFpbHdpbmRDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnNwYWNpbmdTY2FsZSA9IHRoaXMuYnVpbGRTcGFjaW5nU2NhbGUoKTtcbiAgICB0aGlzLm1heFdpZHRoU2NhbGUgPSB0aGlzLmJ1aWxkTWF4V2lkdGhTY2FsZSgpO1xuICAgIHRoaXMuZm9udFNpemVTY2FsZSA9IHRoaXMuYnVpbGRGb250U2l6ZVNjYWxlKCk7XG4gICAgdGhpcy5saW5lSGVpZ2h0U2NhbGUgPSB0aGlzLmJ1aWxkTGluZUhlaWdodFNjYWxlKCk7XG4gICAgdGhpcy5sZXR0ZXJTcGFjaW5nU2NhbGUgPSB0aGlzLmJ1aWxkTGV0dGVyU3BhY2luZ1NjYWxlKCk7XG4gICAgdGhpcy56SW5kZXhTY2FsZSA9IHRoaXMuYnVpbGRaSW5kZXhTY2FsZSgpO1xuICAgIHRoaXMub3BhY2l0eVNjYWxlID0gdGhpcy5idWlsZE9wYWNpdHlTY2FsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNwYWNpbmdTY2FsZSgpOiBNYXA8bnVtYmVyLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2FsZSA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMuY29uZmlnLnRoZW1lPy5zcGFjaW5nIHx8IHt9O1xuXG4gICAgT2JqZWN0LmVudHJpZXMoc3BhY2luZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBjb25zdCByZW1NYXRjaCA9IHZhbHVlLm1hdGNoKC8oW1xcZC5dKylyZW0vKTtcbiAgICAgIGlmIChyZW1NYXRjaCkge1xuICAgICAgICBjb25zdCBwaXhlbHMgPSBwYXJzZUZsb2F0KHJlbU1hdGNoWzFdKSAqIDE2O1xuICAgICAgICBzY2FsZS5zZXQoTWF0aC5yb3VuZChwaXhlbHMpLCBrZXkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBweE1hdGNoID0gdmFsdWUubWF0Y2goLyhbXFxkLl0rKXB4Lyk7XG4gICAgICBpZiAocHhNYXRjaCkge1xuICAgICAgICBzY2FsZS5zZXQoTWF0aC5yb3VuZChwYXJzZUZsb2F0KHB4TWF0Y2hbMV0pKSwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRNYXhXaWR0aFNjYWxlKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHNjYWxlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBjb25zdCBtYXhXaWR0aCA9IHRoaXMuY29uZmlnLnRoZW1lPy5tYXhXaWR0aCB8fCB7fTtcblxuICAgIE9iamVjdC5lbnRyaWVzKG1heFdpZHRoKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNjYWxlLnNldCh2YWx1ZSwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNjYWxlLnNldCgnMTAwJScsICdmdWxsJyk7XG4gICAgc2NhbGUuc2V0KCdtaW4tY29udGVudCcsICdtaW4nKTtcbiAgICBzY2FsZS5zZXQoJ21heC1jb250ZW50JywgJ21heCcpO1xuICAgIHNjYWxlLnNldCgnZml0LWNvbnRlbnQnLCAnZml0Jyk7XG5cbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9udFNpemVTY2FsZSgpOiBNYXA8bnVtYmVyLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2FsZSA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgZm9udFNpemUgPSB0aGlzLmNvbmZpZy50aGVtZT8uZm9udFNpemUgfHwge307XG5cbiAgICBPYmplY3QuZW50cmllcyhmb250U2l6ZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCByZW1NYXRjaCA9IHZhbHVlLm1hdGNoKC8oW1xcZC5dKylyZW0vKTtcbiAgICAgICAgaWYgKHJlbU1hdGNoKSB7XG4gICAgICAgICAgc2NhbGUuc2V0KE1hdGgucm91bmQocGFyc2VGbG9hdChyZW1NYXRjaFsxXSkgKiAxNiksIGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHhNYXRjaCA9IHZhbHVlLm1hdGNoKC8oW1xcZC5dKylweC8pO1xuICAgICAgICBpZiAocHhNYXRjaCkge1xuICAgICAgICAgIHNjYWxlLnNldChNYXRoLnJvdW5kKHBhcnNlRmxvYXQocHhNYXRjaFsxXSkpLCBrZXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHR5cGVvZiB2YWx1ZVswXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgcmVtTWF0Y2ggPSB2YWx1ZVswXS5tYXRjaCgvKFtcXGQuXSspcmVtLyk7XG4gICAgICAgIGlmIChyZW1NYXRjaCkge1xuICAgICAgICAgIHNjYWxlLnNldChNYXRoLnJvdW5kKHBhcnNlRmxvYXQocmVtTWF0Y2hbMV0pICogMTYpLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHB4TWF0Y2ggPSB2YWx1ZVswXS5tYXRjaCgvKFtcXGQuXSspcHgvKTtcbiAgICAgICAgaWYgKHB4TWF0Y2gpIHtcbiAgICAgICAgICBzY2FsZS5zZXQoTWF0aC5yb3VuZChwYXJzZUZsb2F0KHB4TWF0Y2hbMV0pKSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExpbmVIZWlnaHRTY2FsZSgpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2FsZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgbGluZUhlaWdodCA9IHRoaXMuY29uZmlnLnRoZW1lPy5saW5lSGVpZ2h0IHx8IHt9O1xuXG4gICAgT2JqZWN0LmVudHJpZXMobGluZUhlaWdodCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzY2FsZS5zZXQodmFsdWUsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzY2FsZS5zZXQoJzEnLCAnbm9uZScpO1xuICAgIHNjYWxlLnNldCgnMS4yNScsICd0aWdodCcpO1xuICAgIHNjYWxlLnNldCgnMS4zNzUnLCAnc251ZycpO1xuICAgIHNjYWxlLnNldCgnMS41JywgJ25vcm1hbCcpO1xuICAgIHNjYWxlLnNldCgnMS42MjUnLCAncmVsYXhlZCcpO1xuICAgIHNjYWxlLnNldCgnMicsICdsb29zZScpO1xuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExldHRlclNwYWNpbmdTY2FsZSgpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2FsZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgbGV0dGVyU3BhY2luZyA9IHRoaXMuY29uZmlnLnRoZW1lPy5sZXR0ZXJTcGFjaW5nIHx8IHt9O1xuXG4gICAgT2JqZWN0LmVudHJpZXMobGV0dGVyU3BhY2luZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzY2FsZS5zZXQodmFsdWUsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkWkluZGV4U2NhbGUoKTogTWFwPG51bWJlciwgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2NhbGUgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICAgIGNvbnN0IHpJbmRleCA9IHRoaXMuY29uZmlnLnRoZW1lPy56SW5kZXggfHwge307XG5cbiAgICBPYmplY3QuZW50cmllcyh6SW5kZXgpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgbnVtID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICAgICAgaWYgKCFpc05hTihudW0pKSB7XG4gICAgICAgICAgc2NhbGUuc2V0KG51bSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2NhbGUuc2V0KDAsICcwJyk7XG4gICAgc2NhbGUuc2V0KDEwLCAnMTAnKTtcbiAgICBzY2FsZS5zZXQoMjAsICcyMCcpO1xuICAgIHNjYWxlLnNldCgzMCwgJzMwJyk7XG4gICAgc2NhbGUuc2V0KDQwLCAnNDAnKTtcbiAgICBzY2FsZS5zZXQoNTAsICc1MCcpO1xuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZE9wYWNpdHlTY2FsZSgpOiBNYXA8bnVtYmVyLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2FsZSA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgY29uc3Qgb3BhY2l0eSA9IHRoaXMuY29uZmlnLnRoZW1lPy5vcGFjaXR5IHx8IHt9O1xuXG4gICAgT2JqZWN0LmVudHJpZXMob3BhY2l0eSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBwYXJzZUZsb2F0KHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICBpZiAoIWlzTmFOKG51bSkpIHtcbiAgICAgICAgICBzY2FsZS5zZXQoTWF0aC5yb3VuZChudW0gKiAxMDApLCBrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAxMDA7IGkgKz0gNSkge1xuICAgICAgaWYgKCFzY2FsZS5oYXMoaSkpIHtcbiAgICAgICAgc2NhbGUuc2V0KGksIFN0cmluZyhpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBweFRvU3BhY2luZyhweDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuc3BhY2luZ1NjYWxlLmhhcyhweCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwYWNpbmdTY2FsZS5nZXQocHgpITtcbiAgICB9XG5cbiAgICBsZXQgY2xvc2VzdEtleTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNsb3Nlc3REaWZmOiBudW1iZXIgPSBJbmZpbml0eTtcbiAgICBcbiAgICB0aGlzLnNwYWNpbmdTY2FsZS5mb3JFYWNoKChfLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLmFicyhrZXkgLSBweCk7XG4gICAgICBpZiAoZGlmZiA8IGNsb3Nlc3REaWZmKSB7XG4gICAgICAgIGNsb3Nlc3RLZXkgPSBrZXk7XG4gICAgICAgIGNsb3Nlc3REaWZmID0gZGlmZjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChjbG9zZXN0S2V5ICE9PSBudWxsICYmIGNsb3Nlc3REaWZmIC8gcHggPCAwLjIpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwYWNpbmdTY2FsZS5nZXQoY2xvc2VzdEtleSkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFB4KHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBweE1hdGNoID0gdmFsdWUubWF0Y2goL14oW1xcZC5dKylweCQvKTtcbiAgICBpZiAocHhNYXRjaCkge1xuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocHhNYXRjaFsxXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVtTWF0Y2ggPSB2YWx1ZS5tYXRjaCgvXihbXFxkLl0rKXJlbSQvKTtcbiAgICBpZiAocmVtTWF0Y2gpIHtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHJlbU1hdGNoWzFdKSAqIDE2O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVNwYWNpbmdWYWx1ZSh2YWx1ZTogc3RyaW5nKTogUGFyc2VkU3BhY2luZ1ZhbHVlIHtcbiAgICBjb25zdCBweCA9IHRoaXMuZXh0cmFjdFB4KHZhbHVlKTtcbiAgICBjb25zdCBzcGFjaW5nS2V5ID0gcHggIT09IG51bGwgPyB0aGlzLnB4VG9TcGFjaW5nKHB4KSA6IG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWUsXG4gICAgICBweCxcbiAgICAgIHNwYWNpbmdLZXlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNwYWNpbmdVdGlsaXR5KHByZWZpeDogc3RyaW5nLCBwYXJzZWQ6IFBhcnNlZFNwYWNpbmdWYWx1ZSk6IHN0cmluZyB7XG4gICAgaWYgKHBhcnNlZC5zcGFjaW5nS2V5KSB7XG4gICAgICByZXR1cm4gYCR7cHJlZml4fS0ke3BhcnNlZC5zcGFjaW5nS2V5fWA7XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9LVske3BhcnNlZC52YWx1ZX1dYDtcbiAgfVxuXG4gIHByaXZhdGUgdG9rZW5pemVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9ICcnO1xuICAgIGxldCBwYXJlbkRlcHRoID0gMDtcbiAgICBsZXQgaW5GdW5jdGlvbiA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hhciA9IHZhbHVlW2ldO1xuXG4gICAgICBpZiAoY2hhciA9PT0gJygnKSB7XG4gICAgICAgIHBhcmVuRGVwdGgrKztcbiAgICAgICAgaW5GdW5jdGlvbiA9IHRydWU7XG4gICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJyknKSB7XG4gICAgICAgIHBhcmVuRGVwdGgtLTtcbiAgICAgICAgY3VycmVudCArPSBjaGFyO1xuICAgICAgICBpZiAocGFyZW5EZXB0aCA9PT0gMCkge1xuICAgICAgICAgIGluRnVuY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnICcgJiYgcGFyZW5EZXB0aCA9PT0gMCkge1xuICAgICAgICBpZiAoY3VycmVudC50cmltKCkpIHtcbiAgICAgICAgICB0b2tlbnMucHVzaChjdXJyZW50LnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudCArPSBjaGFyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJyZW50LnRyaW0oKSkge1xuICAgICAgdG9rZW5zLnB1c2goY3VycmVudC50cmltKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICBjb252ZXJ0UHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQcm9wID0gcHJvcGVydHkudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICBsb2dnZXIudmVyYm9zZShgQ29udmVydGluZzogJHtub3JtYWxpemVkUHJvcH06ICR7bm9ybWFsaXplZFZhbHVlfWApO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgQ1NTIHZhcmlhYmxlIGRlY2xhcmF0aW9uOiAke3Byb3BlcnR5fWAgfTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdkaXNwbGF5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydERpc3BsYXkobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdwb3NpdGlvbicpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbm9ybWFsaXplZFZhbHVlLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcC5zdGFydHNXaXRoKCdtYXJnaW4nKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydE1hcmdpbihub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3Auc3RhcnRzV2l0aCgncGFkZGluZycpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0UGFkZGluZyhub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdtYXgtd2lkdGgnIHx8IG5vcm1hbGl6ZWRQcm9wID09PSAnbWluLXdpZHRoJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydERpbWVuc2lvbkNvbnN0cmFpbnQobm9ybWFsaXplZFByb3AsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnbWF4LWhlaWdodCcgfHwgbm9ybWFsaXplZFByb3AgPT09ICdtaW4taGVpZ2h0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydERpbWVuc2lvbkNvbnN0cmFpbnQobm9ybWFsaXplZFByb3AsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnd2lkdGgnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0V2lkdGgobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdoZWlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0SGVpZ2h0KG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnZm9udC13ZWlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Rm9udFdlaWdodChub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2ZvbnQtc2l6ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRGb250U2l6ZShub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ3RleHQtYWxpZ24nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB0ZXh0LSR7bm9ybWFsaXplZFZhbHVlfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAndGV4dC1kZWNvcmF0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFRleHREZWNvcmF0aW9uKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAndGV4dC10cmFuc2Zvcm0nKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VGV4dFRyYW5zZm9ybShub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2xldHRlci1zcGFjaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydExldHRlclNwYWNpbmcobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdsaW5lLWhlaWdodCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRMaW5lSGVpZ2h0KG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ2ZsZXgnKSB8fCBcbiAgICAgICAgbm9ybWFsaXplZFByb3Auc3RhcnRzV2l0aCgnanVzdGlmeScpIHx8IFxuICAgICAgICBub3JtYWxpemVkUHJvcC5zdGFydHNXaXRoKCdhbGlnbicpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RmxleGJveChub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdnYXAnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0R2FwKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnYmFja2dyb3VuZC1jb2xvcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRCYWNrZ3JvdW5kQ29sb3Iobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdiYWNrZ3JvdW5kJykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb252ZXJ0QmFja2dyb3VuZFNob3J0aGFuZChub3JtYWxpemVkVmFsdWUpO1xuICAgICAgaWYgKHJlc3VsdC5jbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiByZXN1bHQuY2xhc3Nlc1swXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiByZXN1bHQud2FybmluZ3NbMF0gfHwgYENvdWxkIG5vdCBjb252ZXJ0IGJhY2tncm91bmQ6ICR7bm9ybWFsaXplZFZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdjb2xvcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUZXh0Q29sb3Iobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdib3JkZXItcmFkaXVzJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEJvcmRlclJhZGl1cyhub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcC5zdGFydHNXaXRoKCdib3JkZXInKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEJvcmRlcihub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdhc3BlY3QtcmF0aW8nKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0QXNwZWN0UmF0aW8obm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdvdmVyZmxvdycgfHwgbm9ybWFsaXplZFByb3AgPT09ICdvdmVyZmxvdy14JyB8fCBub3JtYWxpemVkUHJvcCA9PT0gJ292ZXJmbG93LXknKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0T3ZlcmZsb3cobm9ybWFsaXplZFByb3AsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnb2JqZWN0LWZpdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRPYmplY3RGaXQobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdvYmplY3QtcG9zaXRpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0T2JqZWN0UG9zaXRpb24obm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdvcGFjaXR5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydE9wYWNpdHkobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICd3b3JkLWJyZWFrJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFdvcmRCcmVhayhub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ3otaW5kZXgnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0WkluZGV4KG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzTmFtZTogbnVsbCxcbiAgICAgIHNraXBwZWQ6IHRydWUsXG4gICAgICByZWFzb246IGBVbnN1cHBvcnRlZCBwcm9wZXJ0eTogJHtwcm9wZXJ0eX1gXG4gICAgfTtcbiAgfVxuXG4gIGNvbnZlcnRQcm9wZXJ0eVdpdGhNdWx0aXBsZShwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogTXVsdGlDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBub3JtYWxpemVkUHJvcCA9IHByb3BlcnR5LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnbWFyZ2luJyB8fCBub3JtYWxpemVkUHJvcCA9PT0gJ3BhZGRpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0U3BhY2luZ1Nob3J0aGFuZChub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdib3JkZXInKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Qm9yZGVyU2hvcnRoYW5kKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ2JvcmRlci0nKSAmJiBcbiAgICAgICAgWydib3JkZXItdG9wJywgJ2JvcmRlci1yaWdodCcsICdib3JkZXItYm90dG9tJywgJ2JvcmRlci1sZWZ0J10uaW5jbHVkZXMobm9ybWFsaXplZFByb3ApKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RGlyZWN0aW9uYWxCb3JkZXJTaG9ydGhhbmQobm9ybWFsaXplZFByb3AsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnZmxleCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRGbGV4U2hvcnRoYW5kKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnYmFja2dyb3VuZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRCYWNrZ3JvdW5kU2hvcnRoYW5kKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb252ZXJ0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTtcbiAgICByZXR1cm4ge1xuICAgICAgY2xhc3NlczogcmVzdWx0LmNsYXNzTmFtZSA/IFtyZXN1bHQuY2xhc3NOYW1lXSA6IFtdLFxuICAgICAgd2FybmluZ3M6IHJlc3VsdC5yZWFzb24gPyBbcmVzdWx0LnJlYXNvbl0gOiBbXSxcbiAgICAgIGNzc1Byb3BlcnRpZXM6IHJlc3VsdC5jbGFzc05hbWUgPyBbcHJvcGVydHldIDogW11cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0QmFja2dyb3VuZFNob3J0aGFuZCh2YWx1ZTogc3RyaW5nKTogTXVsdGlDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAodmFsdWUgPT09ICd0cmFuc3BhcmVudCcpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnYmctdHJhbnNwYXJlbnQnKTtcbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnYmFja2dyb3VuZC1jb2xvcicpO1xuICAgICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MsIGNzc1Byb3BlcnRpZXMgfTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICdub25lJykge1xuICAgICAgY2xhc3Nlcy5wdXNoKCdiZy1ub25lJyk7XG4gICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goJ2JhY2tncm91bmQtaW1hZ2UnKTtcbiAgICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gICAgfVxuXG4gICAgY29uc3QgY29sb3JWYWx1ZSA9IHRoaXMuZXh0cmFjdENvbG9yRnJvbUJhY2tncm91bmQodmFsdWUpO1xuICAgIFxuICAgIGlmIChjb2xvclZhbHVlKSB7XG4gICAgICBpZiAoY29sb3JWYWx1ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGBiZy1bJHtjb2xvclZhbHVlfV1gKTtcbiAgICAgIH0gZWxzZSBpZiAoY29sb3JWYWx1ZS5zdGFydHNXaXRoKCdyZ2InKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2goYGJnLVske2NvbG9yVmFsdWV9XWApO1xuICAgICAgfSBlbHNlIGlmIChjb2xvclZhbHVlLnN0YXJ0c1dpdGgoJ2hzbCcpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChgYmctWyR7Y29sb3JWYWx1ZX1dYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb2xvck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAnd2hpdGUnOiAnYmctd2hpdGUnLFxuICAgICAgICAgICdibGFjayc6ICdiZy1ibGFjaycsXG4gICAgICAgICAgJ3JlZCc6ICdiZy1yZWQtNTAwJyxcbiAgICAgICAgICAnYmx1ZSc6ICdiZy1ibHVlLTUwMCcsXG4gICAgICAgICAgJ2dyZWVuJzogJ2JnLWdyZWVuLTUwMCcsXG4gICAgICAgICAgJ2dyYXknOiAnYmctZ3JheS01MDAnLFxuICAgICAgICAgICd0cmFuc3BhcmVudCc6ICdiZy10cmFuc3BhcmVudCdcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGlmIChjb2xvck1hcFtjb2xvclZhbHVlXSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaChjb2xvck1hcFtjb2xvclZhbHVlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKGBiZy0ke2NvbG9yVmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnYmFja2dyb3VuZC1jb2xvcicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKGBDYW5ub3QgZXh0cmFjdCBjb2xvciBmcm9tIGJhY2tncm91bmQgc2hvcnRoYW5kOiAke3ZhbHVlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RDb2xvckZyb21CYWNrZ3JvdW5kKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2VuaXplVmFsdWUodmFsdWUpO1xuICAgIFxuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICBpZiAodG9rZW4uc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJ3JnYicpIHx8IHRva2VuLnN0YXJ0c1dpdGgoJ2hzbCcpKSB7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJ3VybCgnKSB8fCB0b2tlbiA9PT0gJ25vbmUnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoL14obGluZWFyLWdyYWRpZW50fHJhZGlhbC1ncmFkaWVudHxjb25pYy1ncmFkaWVudHxyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50fHJlcGVhdGluZy1yYWRpYWwtZ3JhZGllbnR8cmVwZWF0aW5nLWNvbmljLWdyYWRpZW50KVxcKC9pLnRlc3QodG9rZW4pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoL14ocmVwZWF0fG5vLXJlcGVhdHxyZXBlYXQteHxyZXBlYXQteXxzcGFjZXxyb3VuZCkkL2kudGVzdCh0b2tlbikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICgvXihzY3JvbGx8Zml4ZWR8bG9jYWwpJC9pLnRlc3QodG9rZW4pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoL14oY2VudGVyfHRvcHxib3R0b218bGVmdHxyaWdodHxcXGQrJXxcXGQrcHgpL2kudGVzdCh0b2tlbikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICgvXihjb3Zlcnxjb250YWluKSQvaS50ZXN0KHRva2VuKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKC9eKGJvcmRlci1ib3h8cGFkZGluZy1ib3h8Y29udGVudC1ib3gpJC9pLnRlc3QodG9rZW4pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoL14oY2xpcHxib3JkZXJ8cGFkZGluZ3xjb250ZW50KSQvaS50ZXN0KHRva2VuKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKC9eXFxkLy50ZXN0KHRva2VuKSAmJiAhdG9rZW4uaW5jbHVkZXMoJ2dyYWRpZW50JykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICgvXih0cmFuc3BhcmVudHx3aGl0ZXxibGFja3xyZWR8Ymx1ZXxncmVlbnx5ZWxsb3d8b3JhbmdlfHB1cnBsZXxwaW5rfGdyYXl8Z3JleXxicm93bnxjeWFufG1hZ2VudGF8b2xpdmV8bGltZXxhcXVhfG5hdnl8dGVhbHxtYXJvb258c2lsdmVyfGZ1Y2hzaWEpJC9pLnRlc3QodG9rZW4pKSB7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKC9eKGFsaWNlYmx1ZXxhbnRpcXVld2hpdGV8YXF1YXxhcXVhbWFyaW5lfGF6dXJlfGJlaWdlfGJpc3F1ZXxibGFuY2hlZGFsbW9uZHxibHVldmlvbGV0fGJ1cmx5d29vZHxjYWRldGJsdWV8Y2hhcnRyZXVzZXxjaG9jb2xhdGV8Y29yYWx8Y29ybmZsb3dlcmJsdWV8Y29ybnNpbGt8Y3JpbXNvbnxkYXJrYmx1ZXxkYXJrY3lhbnxkYXJrZ29sZGVucm9kfGRhcmtncmF5fGRhcmtncmVlbnxkYXJrZ3JleXxkYXJra2hha2l8ZGFya21hZ2VudGF8ZGFya29saXZlZ3JlZW58ZGFya29yYW5nZXxkYXJrb3JjaGlkfGRhcmtyZWR8ZGFya3NhbG1vbnxkYXJrc2VhZ3JlZW58ZGFya3NsYXRlYmx1ZXxkYXJrc2xhdGVncmF5fGRhcmtzbGF0ZWdyZXl8ZGFya3R1cnF1b2lzZXxkYXJrdmlvbGV0fGRlZXBwaW5rfGRlZXBza3libHVlfGRpbWdyYXl8ZGltZ3JleXxkb2RnZXJibHVlfGZpcmVicmlja3xmbG9yYWx3aGl0ZXxmb3Jlc3RncmVlbnxnYWluc2Jvcm98Z2hvc3R3aGl0ZXxnb2xkfGdvbGRlbnJvZHxncmVlbnllbGxvd3xncmV5fGhvbmV5ZGV3fGhvdHBpbmt8aW5kaWFucmVkfGluZGlnb3xpdm9yeXxraGFraXxsYXZlbmRlcnxsYXZlbmRlcmJsdXNofGxhd25ncmVlbnxsZW1vbmNoaWZmb258bGlnaHRibHVlfGxpZ2h0Y29yYWx8bGlnaHRjeWFufGxpZ2h0Z29sZGVucm9keWVsbG93fGxpZ2h0Z3JheXxsaWdodGdyZWVufGxpZ2h0Z3JleXxsaWdodHBpbmt8bGlnaHRzYWxtb258bGlnaHRzZWFncmVlbnxsaWdodHNreWJsdWV8bGlnaHRzbGF0ZWdyYXl8bGlnaHRzbGF0ZWdyZXl8bGlnaHRzdGVlbGJsdWV8bGlnaHR5ZWxsb3d8bGltZWdyZWVufGxpbmVufG1lZGl1bWFxdWFtYXJpbmV8bWVkaXVtYmx1ZXxtZWRpdW1vcmNoaWR8bWVkaXVtcHVycGxlfG1lZGl1bXNlYWdyZWVufG1lZGl1bXNsYXRlYmx1ZXxtZWRpdW1zcHJpbmdncmVlbnxtZWRpdW10dXJxdW9pc2V8bWVkaXVtdmlvbGV0cmVkfG1pZG5pZ2h0Ymx1ZXxtaW50Y3JlYW18bWlzdHlyb3NlfG1vY2Nhc2lufG5hdmFqb3doaXRlfG9sZGxhY2V8b2xpdmVkcmFifG9yYW5nZXJlZHxvcmNoaWR8cGFsZWdvbGRlbnJvZHxwYWxlZ3JlZW58cGFsZXR1cnF1b2lzZXxwYWxldmlvbGV0cmVkfHBhcGF5YXdoaXB8cGVhY2hwdWZmfHBlcnV8cGx1bXxwb3dkZXJibHVlfHJlYmVjY2FwdXJwbGV8cm9zeWJyb3dufHJveWFsYmx1ZXxzYWRkbGVicm93bnxzYWxtb258c2FuZHlicm93bnxzZWFncmVlbnxzZWFzaGVsbHxzaWVubmF8c2t5Ymx1ZXxzbGF0ZWJsdWV8c2xhdGVncmF5fHNsYXRlZ3JleXxzbm93fHNwcmluZ2dyZWVufHN0ZWVsYmx1ZXx0YW58dGhpc3RsZXx0b21hdG98dHVycXVvaXNlfHZpb2xldHx3aGVhdHx3aGl0ZXNtb2tlfHllbGxvd2dyZWVuKSQvaS50ZXN0KHRva2VuKSkge1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0U3BhY2luZ1Nob3J0aGFuZChwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBNdWx0aUNvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHRva2VucyA9IHRoaXMudG9rZW5pemVWYWx1ZSh2YWx1ZSk7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHByZWZpeCA9IHByb3AgPT09ICdtYXJnaW4nID8gJ20nIDogJ3AnO1xuICAgIGNvbnN0IHByb3BQcmVmaXggPSBwcm9wID09PSAnbWFyZ2luJyA/ICdtYXJnaW4nIDogJ3BhZGRpbmcnO1xuXG4gICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzOiBbJ0VtcHR5IHNwYWNpbmcgdmFsdWUnXSwgY3NzUHJvcGVydGllcyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZFRva2VucyA9IHRva2Vucy5tYXAodCA9PiB0aGlzLnBhcnNlU3BhY2luZ1ZhbHVlKHQpKTtcblxuICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZWRUb2tlbnNbMF07XG4gICAgICBpZiAocGFyc2VkLnB4ICE9PSBudWxsIHx8IC9eLT9cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCh0aGlzLmJ1aWxkU3BhY2luZ1V0aWxpdHkocHJlZml4LCBwYXJzZWQpKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKHByb3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChgSW52YWxpZCAke3Byb3B9IHZhbHVlOiAke3Rva2Vuc1swXX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRva2Vucy5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IFt2ZXJ0aWNhbCwgaG9yaXpvbnRhbF0gPSBwYXJzZWRUb2tlbnM7XG4gICAgICBcbiAgICAgIGlmICh2ZXJ0aWNhbC5weCAhPT0gbnVsbCB8fCAvXi0/XFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCUpPyQvLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2godGhpcy5idWlsZFNwYWNpbmdVdGlsaXR5KGAke3ByZWZpeH15YCwgdmVydGljYWwpKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKGAke3Byb3BQcmVmaXh9LXlgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goYEludmFsaWQgJHtwcm9wfSB2ZXJ0aWNhbCB2YWx1ZTogJHt0b2tlbnNbMF19YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChob3Jpem9udGFsLnB4ICE9PSBudWxsIHx8IC9eLT9cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh0b2tlbnNbMV0pKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCh0aGlzLmJ1aWxkU3BhY2luZ1V0aWxpdHkoYCR7cHJlZml4fXhgLCBob3Jpem9udGFsKSk7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaChgJHtwcm9wUHJlZml4fS14YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKGBJbnZhbGlkICR7cHJvcH0gaG9yaXpvbnRhbCB2YWx1ZTogJHt0b2tlbnNbMV19YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0b2tlbnMubGVuZ3RoID09PSAzKSB7XG4gICAgICBjb25zdCBbdG9wLCBob3Jpem9udGFsLCBib3R0b21dID0gcGFyc2VkVG9rZW5zO1xuXG4gICAgICBpZiAodG9wLnB4ICE9PSBudWxsIHx8IC9eLT9cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCh0aGlzLmJ1aWxkU3BhY2luZ1V0aWxpdHkoYCR7cHJlZml4fXRgLCB0b3ApKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKGAke3Byb3BQcmVmaXh9LXRvcGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChgSW52YWxpZCAke3Byb3B9LXRvcCB2YWx1ZTogJHt0b2tlbnNbMF19YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChob3Jpem9udGFsLnB4ICE9PSBudWxsIHx8IC9eLT9cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh0b2tlbnNbMV0pKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCh0aGlzLmJ1aWxkU3BhY2luZ1V0aWxpdHkoYCR7cHJlZml4fXhgLCBob3Jpem9udGFsKSk7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaChgJHtwcm9wUHJlZml4fS14YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKGBJbnZhbGlkICR7cHJvcH0gaG9yaXpvbnRhbCB2YWx1ZTogJHt0b2tlbnNbMV19YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChib3R0b20ucHggIT09IG51bGwgfHwgL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHRva2Vuc1syXSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuYnVpbGRTcGFjaW5nVXRpbGl0eShgJHtwcmVmaXh9YmAsIGJvdHRvbSkpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goYCR7cHJvcFByZWZpeH0tYm90dG9tYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKGBJbnZhbGlkICR7cHJvcH0tYm90dG9tIHZhbHVlOiAke3Rva2Vuc1syXX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRva2Vucy5sZW5ndGggPj0gNCkge1xuICAgICAgY29uc3QgW3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdF0gPSBwYXJzZWRUb2tlbnM7XG5cbiAgICAgIGlmICh0b3AucHggIT09IG51bGwgfHwgL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuYnVpbGRTcGFjaW5nVXRpbGl0eShgJHtwcmVmaXh9dGAsIHRvcCkpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goYCR7cHJvcFByZWZpeH0tdG9wYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKGBJbnZhbGlkICR7cHJvcH0tdG9wIHZhbHVlOiAke3Rva2Vuc1swXX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJpZ2h0LnB4ICE9PSBudWxsIHx8IC9eLT9cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh0b2tlbnNbMV0pKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCh0aGlzLmJ1aWxkU3BhY2luZ1V0aWxpdHkoYCR7cHJlZml4fXJgLCByaWdodCkpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goYCR7cHJvcFByZWZpeH0tcmlnaHRgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goYEludmFsaWQgJHtwcm9wfS1yaWdodCB2YWx1ZTogJHt0b2tlbnNbMV19YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChib3R0b20ucHggIT09IG51bGwgfHwgL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHRva2Vuc1syXSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuYnVpbGRTcGFjaW5nVXRpbGl0eShgJHtwcmVmaXh9YmAsIGJvdHRvbSkpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goYCR7cHJvcFByZWZpeH0tYm90dG9tYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKGBJbnZhbGlkICR7cHJvcH0tYm90dG9tIHZhbHVlOiAke3Rva2Vuc1syXX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxlZnQucHggIT09IG51bGwgfHwgL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHRva2Vuc1szXSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuYnVpbGRTcGFjaW5nVXRpbGl0eShgJHtwcmVmaXh9bGAsIGxlZnQpKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKGAke3Byb3BQcmVmaXh9LWxlZnRgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goYEludmFsaWQgJHtwcm9wfS1sZWZ0IHZhbHVlOiAke3Rva2Vuc1szXX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc2VzLCB3YXJuaW5ncywgY3NzUHJvcGVydGllcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGlzcGxheSh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgZGlzcGxheU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdmbGV4JzogJ2ZsZXgnLFxuICAgICAgJ2Jsb2NrJzogJ2Jsb2NrJyxcbiAgICAgICdpbmxpbmUnOiAnaW5saW5lJyxcbiAgICAgICdpbmxpbmUtYmxvY2snOiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICdncmlkJzogJ2dyaWQnLFxuICAgICAgJ2lubGluZS1mbGV4JzogJ2lubGluZS1mbGV4JyxcbiAgICAgICdpbmxpbmUtZ3JpZCc6ICdpbmxpbmUtZ3JpZCcsXG4gICAgICAnbm9uZSc6ICdoaWRkZW4nLFxuICAgICAgJ2NvbnRlbnRzJzogJ2NvbnRlbnRzJyxcbiAgICAgICd0YWJsZSc6ICd0YWJsZScsXG4gICAgICAndGFibGUtY2VsbCc6ICd0YWJsZS1jZWxsJyxcbiAgICAgICd0YWJsZS1yb3cnOiAndGFibGUtcm93JyxcbiAgICAgICdmbG93LXJvb3QnOiAnZmxvdy1yb290J1xuICAgIH07XG5cbiAgICBpZiAoZGlzcGxheU1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogZGlzcGxheU1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGRpc3BsYXkgdmFsdWU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0TWFyZ2luKHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHNpZGVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnbWFyZ2luJzogJ20nLFxuICAgICAgJ21hcmdpbi10b3AnOiAnbXQnLFxuICAgICAgJ21hcmdpbi1yaWdodCc6ICdtcicsXG4gICAgICAnbWFyZ2luLWJvdHRvbSc6ICdtYicsXG4gICAgICAnbWFyZ2luLWxlZnQnOiAnbWwnLFxuICAgICAgJ21hcmdpbi14JzogJ214JyxcbiAgICAgICdtYXJnaW4teSc6ICdteSdcbiAgICB9O1xuICAgIGNvbnN0IHByZWZpeCA9IHNpZGVNYXBbcHJvcF0gfHwgJ20nO1xuICAgIFxuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB2YWx1ZS5zdGFydHNXaXRoKCctJyk7XG4gICAgY29uc3QgYWJzb2x1dGVWYWx1ZSA9IGlzTmVnYXRpdmUgPyB2YWx1ZS5zbGljZSgxKSA6IHZhbHVlO1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgoYWJzb2x1dGVWYWx1ZSk7XG4gICAgXG4gICAgaWYgKHZhbHVlID09PSAnYXV0bycpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS1hdXRvYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHB4ID09PSBudWxsKSB7XG4gICAgICBpZiAoL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYE5vbi1waXhlbCBtYXJnaW4gdmFsdWU6ICR7dmFsdWV9YCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNwYWNpbmcgPSB0aGlzLnB4VG9TcGFjaW5nKHB4KTtcbiAgICBpZiAoIXNwYWNpbmcpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IGlzTmVnYXRpdmUgPyBgLSR7cHJlZml4fS0ke3NwYWNpbmd9YCA6IGAke3ByZWZpeH0tJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRQYWRkaW5nKHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIFxuICAgIGNvbnN0IHNpZGVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAncGFkZGluZyc6ICdwJyxcbiAgICAgICdwYWRkaW5nLXRvcCc6ICdwdCcsXG4gICAgICAncGFkZGluZy1yaWdodCc6ICdwcicsXG4gICAgICAncGFkZGluZy1ib3R0b20nOiAncGInLFxuICAgICAgJ3BhZGRpbmctbGVmdCc6ICdwbCcsXG4gICAgICAncGFkZGluZy14JzogJ3B4JyxcbiAgICAgICdwYWRkaW5nLXknOiAncHknXG4gICAgfTtcbiAgICBjb25zdCBwcmVmaXggPSBzaWRlTWFwW3Byb3BdIHx8ICdwJztcbiAgICBcbiAgICBpZiAocHggPT09IG51bGwpIHtcbiAgICAgIGlmICgvXi0/XFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCUpPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgTm9uLXBpeGVsIHBhZGRpbmcgdmFsdWU6ICR7dmFsdWV9YCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNwYWNpbmcgPSB0aGlzLnB4VG9TcGFjaW5nKHB4KTtcbiAgICBpZiAoIXNwYWNpbmcpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREaW1lbnNpb25Db25zdHJhaW50KHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHByZWZpeE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdtYXgtd2lkdGgnOiAnbWF4LXcnLFxuICAgICAgJ21pbi13aWR0aCc6ICdtaW4tdycsXG4gICAgICAnbWF4LWhlaWdodCc6ICdtYXgtaCcsXG4gICAgICAnbWluLWhlaWdodCc6ICdtaW4taCdcbiAgICB9O1xuICAgIGNvbnN0IHByZWZpeCA9IHByZWZpeE1hcFtwcm9wXTtcblxuICAgIGlmICh2YWx1ZSA9PT0gJzEwMCUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tZnVsbGAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzAnIHx8IHZhbHVlID09PSAnMHB4Jykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LTBgLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdub25lJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LW5vbmVgLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wID09PSAnbWF4LXdpZHRoJykge1xuICAgICAgaWYgKHZhbHVlID09PSAnbWluLWNvbnRlbnQnKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ21heC13LW1pbicsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT09ICdtYXgtY29udGVudCcpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnbWF4LXctbWF4Jywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PT0gJ2ZpdC1jb250ZW50Jykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdtYXgtdy1maXQnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXhXUHJvc2VTaXplczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJzY1Y2gnOiAncHJvc2UnLFxuICAgICAgICAnODBjaCc6ICdwcm9zZS1sZydcbiAgICAgIH07XG4gICAgICBpZiAobWF4V1Byb3NlU2l6ZXNbdmFsdWVdKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYG1heC13LSR7bWF4V1Byb3NlU2l6ZXNbdmFsdWVdfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1heFdpZHRoU2NhbGUuaGFzKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBtYXgtdy0ke3RoaXMubWF4V2lkdGhTY2FsZS5nZXQodmFsdWUpfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgaWYgKHB4ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgICBpZiAoc3BhY2luZykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCV8Y2h8dnd8dmgpPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4ICR7cHJvcH0gdmFsdWU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Rm9udFdlaWdodCh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3Qgd2VpZ2h0TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJzEwMCc6ICdmb250LXRoaW4nLFxuICAgICAgJzIwMCc6ICdmb250LWV4dHJhbGlnaHQnLFxuICAgICAgJzMwMCc6ICdmb250LWxpZ2h0JyxcbiAgICAgICc0MDAnOiAnZm9udC1ub3JtYWwnLFxuICAgICAgJzUwMCc6ICdmb250LW1lZGl1bScsXG4gICAgICAnNjAwJzogJ2ZvbnQtc2VtaWJvbGQnLFxuICAgICAgJzcwMCc6ICdmb250LWJvbGQnLFxuICAgICAgJzgwMCc6ICdmb250LWV4dHJhYm9sZCcsXG4gICAgICAnOTAwJzogJ2ZvbnQtYmxhY2snLFxuICAgICAgJ25vcm1hbCc6ICdmb250LW5vcm1hbCcsXG4gICAgICAnYm9sZCc6ICdmb250LWJvbGQnXG4gICAgfTtcblxuICAgIGlmICh3ZWlnaHRNYXBbdmFsdWVdKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IHdlaWdodE1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGZvbnQtd2VpZ2h0OiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEZvbnRTaXplKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBweCA9IHRoaXMuZXh0cmFjdFB4KHZhbHVlKTtcbiAgICBpZiAocHggIT09IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLmZvbnRTaXplU2NhbGUuaGFzKHB4KSkge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB0ZXh0LSR7dGhpcy5mb250U2l6ZVNjYWxlLmdldChweCl9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdGV4dC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoL15cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRleHQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBOb24tc3RhbmRhcmQgZm9udC1zaXplOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRleHREZWNvcmF0aW9uKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBkZWNvcmF0aW9uTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3VuZGVybGluZSc6ICd1bmRlcmxpbmUnLFxuICAgICAgJ2xpbmUtdGhyb3VnaCc6ICdsaW5lLXRocm91Z2gnLFxuICAgICAgJ25vbmUnOiAnbm8tdW5kZXJsaW5lJyxcbiAgICAgICduby11bmRlcmxpbmUnOiAnbm8tdW5kZXJsaW5lJ1xuICAgIH07XG5cbiAgICBpZiAoZGVjb3JhdGlvbk1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogZGVjb3JhdGlvbk1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oYFVuc3VwcG9ydGVkIHRleHQtZGVjb3JhdGlvbiB2YWx1ZTogJHt2YWx1ZX1gKTtcbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVuc3VwcG9ydGVkIHRleHQtZGVjb3JhdGlvbjogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRUZXh0VHJhbnNmb3JtKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCB0cmFuc2Zvcm1NYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAndXBwZXJjYXNlJzogJ3VwcGVyY2FzZScsXG4gICAgICAnbG93ZXJjYXNlJzogJ2xvd2VyY2FzZScsXG4gICAgICAnY2FwaXRhbGl6ZSc6ICdjYXBpdGFsaXplJyxcbiAgICAgICdub25lJzogJ25vcm1hbC1jYXNlJyxcbiAgICAgICdpbml0aWFsJzogJ25vcm1hbC1jYXNlJ1xuICAgIH07XG5cbiAgICBpZiAodHJhbnNmb3JtTWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiB0cmFuc2Zvcm1NYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biB0ZXh0LXRyYW5zZm9ybTogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRMZXR0ZXJTcGFjaW5nKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBpZiAodGhpcy5sZXR0ZXJTcGFjaW5nU2NhbGUuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdHJhY2tpbmctJHt0aGlzLmxldHRlclNwYWNpbmdTY2FsZS5nZXQodmFsdWUpfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgY29uc3Qga25vd25NYXBwaW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICctMC4wMjVlbSc6ICd0aWdodCcsXG4gICAgICAnLTAuMDVlbSc6ICd0aWdodGVyJyxcbiAgICAgICcwLjAyNWVtJzogJ3dpZGUnLFxuICAgICAgJzAuMDVlbSc6ICd3aWRlcicsXG4gICAgICAnMC4xZW0nOiAnd2lkZXN0JyxcbiAgICAgICcwZW0nOiAnbm9ybWFsJ1xuICAgIH07XG5cbiAgICBpZiAoa25vd25NYXBwaW5nc1t2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRyYWNraW5nLSR7a25vd25NYXBwaW5nc1t2YWx1ZV19YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoL14tP1xcZCsoXFwuXFxkKyk/KGVtfHB4fHJlbSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRyYWNraW5nLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biBsZXR0ZXItc3BhY2luZzogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRMaW5lSGVpZ2h0KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBpZiAodGhpcy5saW5lSGVpZ2h0U2NhbGUuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgbGVhZGluZy0ke3RoaXMubGluZUhlaWdodFNjYWxlLmdldCh2YWx1ZSl9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCBrbm93bk1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJzEnOiAnbm9uZScsXG4gICAgICAnMS4yNSc6ICd0aWdodCcsXG4gICAgICAnMS4zNzUnOiAnc251ZycsXG4gICAgICAnMS41JzogJ25vcm1hbCcsXG4gICAgICAnMS42MjUnOiAncmVsYXhlZCcsXG4gICAgICAnMic6ICdsb29zZSdcbiAgICB9O1xuXG4gICAgaWYgKGtub3duTWFwcGluZ3NbdmFsdWVdKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBsZWFkaW5nLSR7a25vd25NYXBwaW5nc1t2YWx1ZV19YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoL15cXGQrKFxcLlxcZCspPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBsZWFkaW5nLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGxlYWRpbmctWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGxpbmUtaGVpZ2h0OiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEZsZXhib3gocHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgaWYgKHByb3AgPT09ICdmbGV4LWRpcmVjdGlvbicpIHtcbiAgICAgIGNvbnN0IGRpck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ3Jvdyc6ICdmbGV4LXJvdycsXG4gICAgICAgICdyb3ctcmV2ZXJzZSc6ICdmbGV4LXJvdy1yZXZlcnNlJyxcbiAgICAgICAgJ2NvbHVtbic6ICdmbGV4LWNvbCcsXG4gICAgICAgICdjb2x1bW4tcmV2ZXJzZSc6ICdmbGV4LWNvbC1yZXZlcnNlJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogZGlyTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhZGlyTWFwW3ZhbHVlXSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wID09PSAnZmxleC13cmFwJykge1xuICAgICAgY29uc3Qgd3JhcE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ3dyYXAnOiAnZmxleC13cmFwJyxcbiAgICAgICAgJ25vd3JhcCc6ICdmbGV4LW5vd3JhcCcsXG4gICAgICAgICd3cmFwLXJldmVyc2UnOiAnZmxleC13cmFwLXJldmVyc2UnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiB3cmFwTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhd3JhcE1hcFt2YWx1ZV0gfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcCA9PT0gJ2p1c3RpZnktY29udGVudCcpIHtcbiAgICAgIGNvbnN0IGp1c3RpZnlNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdmbGV4LXN0YXJ0JzogJ2p1c3RpZnktc3RhcnQnLFxuICAgICAgICAnZmxleC1lbmQnOiAnanVzdGlmeS1lbmQnLFxuICAgICAgICAnY2VudGVyJzogJ2p1c3RpZnktY2VudGVyJyxcbiAgICAgICAgJ3NwYWNlLWJldHdlZW4nOiAnanVzdGlmeS1iZXR3ZWVuJyxcbiAgICAgICAgJ3NwYWNlLWFyb3VuZCc6ICdqdXN0aWZ5LWFyb3VuZCcsXG4gICAgICAgICdzcGFjZS1ldmVubHknOiAnanVzdGlmeS1ldmVubHknXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBqdXN0aWZ5TWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhanVzdGlmeU1hcFt2YWx1ZV0gfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcCA9PT0gJ2FsaWduLWl0ZW1zJykge1xuICAgICAgY29uc3QgYWxpZ25NYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdmbGV4LXN0YXJ0JzogJ2l0ZW1zLXN0YXJ0JyxcbiAgICAgICAgJ2ZsZXgtZW5kJzogJ2l0ZW1zLWVuZCcsXG4gICAgICAgICdjZW50ZXInOiAnaXRlbXMtY2VudGVyJyxcbiAgICAgICAgJ2Jhc2VsaW5lJzogJ2l0ZW1zLWJhc2VsaW5lJyxcbiAgICAgICAgJ3N0cmV0Y2gnOiAnaXRlbXMtc3RyZXRjaCdcbiAgICAgIH07XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGFsaWduTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhYWxpZ25NYXBbdmFsdWVdIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICdhbGlnbi1jb250ZW50Jykge1xuICAgICAgY29uc3QgYWxpZ25NYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdmbGV4LXN0YXJ0JzogJ2NvbnRlbnQtc3RhcnQnLFxuICAgICAgICAnZmxleC1lbmQnOiAnY29udGVudC1lbmQnLFxuICAgICAgICAnY2VudGVyJzogJ2NvbnRlbnQtY2VudGVyJyxcbiAgICAgICAgJ3NwYWNlLWJldHdlZW4nOiAnY29udGVudC1iZXR3ZWVuJyxcbiAgICAgICAgJ3NwYWNlLWFyb3VuZCc6ICdjb250ZW50LWFyb3VuZCcsXG4gICAgICAgICdzdHJldGNoJzogJ2NvbnRlbnQtc3RyZXRjaCdcbiAgICAgIH07XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGFsaWduTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhYWxpZ25NYXBbdmFsdWVdIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICdhbGlnbi1zZWxmJykge1xuICAgICAgY29uc3QgYWxpZ25TZWxmTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnYXV0byc6ICdzZWxmLWF1dG8nLFxuICAgICAgICAnZmxleC1zdGFydCc6ICdzZWxmLXN0YXJ0JyxcbiAgICAgICAgJ2ZsZXgtZW5kJzogJ3NlbGYtZW5kJyxcbiAgICAgICAgJ2NlbnRlcic6ICdzZWxmLWNlbnRlcicsXG4gICAgICAgICdzdHJldGNoJzogJ3NlbGYtc3RyZXRjaCcsXG4gICAgICAgICdiYXNlbGluZSc6ICdzZWxmLWJhc2VsaW5lJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYWxpZ25TZWxmTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhYWxpZ25TZWxmTWFwW3ZhbHVlXSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wID09PSAnZmxleC1ncm93Jykge1xuICAgICAgaWYgKHZhbHVlID09PSAnMCcpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnZ3Jvdy0wJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PT0gJzEnKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ2dyb3cnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgZ3Jvdy1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcCA9PT0gJ2ZsZXgtc2hyaW5rJykge1xuICAgICAgaWYgKHZhbHVlID09PSAnMCcpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnc2hyaW5rLTAnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09PSAnMScpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnc2hyaW5rJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHNocmluay1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcCA9PT0gJ2ZsZXgtYmFzaXMnKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdiYXNpcy1hdXRvJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PT0gJzAnIHx8IHZhbHVlID09PSAnMHB4Jykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdiYXNpcy0wJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgICAgaWYgKHB4ICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHNwYWNpbmcgPSB0aGlzLnB4VG9TcGFjaW5nKHB4KTtcbiAgICAgICAgaWYgKHNwYWNpbmcpIHtcbiAgICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBiYXNpcy0ke3NwYWNpbmd9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCV8dnd8dmgpPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGJhc2lzLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5zdXBwb3J0ZWQgZmxleGJveCBwcm9wZXJ0eTogJHtwcm9wfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEZsZXhTaG9ydGhhbmQodmFsdWU6IHN0cmluZyk6IE11bHRpQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKHZhbHVlID09PSAnMScpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnZmxleC0xJyk7XG4gICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goJ2ZsZXgnKTtcbiAgICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJ2F1dG8nKSB7XG4gICAgICBjbGFzc2VzLnB1c2goJ2ZsZXgtYXV0bycpO1xuICAgICAgY3NzUHJvcGVydGllcy5wdXNoKCdmbGV4Jyk7XG4gICAgICByZXR1cm4geyBjbGFzc2VzLCB3YXJuaW5ncywgY3NzUHJvcGVydGllcyB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdub25lJykge1xuICAgICAgY2xhc3Nlcy5wdXNoKCdmbGV4LW5vbmUnKTtcbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnZmxleCcpO1xuICAgICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MsIGNzc1Byb3BlcnRpZXMgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnZmxleC1pbml0aWFsJyk7XG4gICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goJ2ZsZXgnKTtcbiAgICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy50b2tlbml6ZVZhbHVlKHZhbHVlKTtcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMykge1xuICAgICAgY29uc3QgW2dyb3csIHNocmluaywgYmFzaXNdID0gdG9rZW5zO1xuICAgICAgXG4gICAgICBpZiAoZ3JvdyA9PT0gJzEnICYmIHNocmluayA9PT0gJzEnICYmIGJhc2lzID09PSAnMCUnKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgnZmxleC0xJyk7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnZmxleCcpO1xuICAgICAgfSBlbHNlIGlmIChncm93ID09PSAnMScgJiYgc2hyaW5rID09PSAnMScgJiYgYmFzaXMgPT09ICdhdXRvJykge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2ZsZXgtYXV0bycpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goJ2ZsZXgnKTtcbiAgICAgIH0gZWxzZSBpZiAoZ3JvdyA9PT0gJzAnICYmIHNocmluayA9PT0gJzEnICYmIGJhc2lzID09PSAnYXV0bycpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdmbGV4LWluaXRpYWwnKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKCdmbGV4Jyk7XG4gICAgICB9IGVsc2UgaWYgKGdyb3cgPT09ICcwJyAmJiBzaHJpbmsgPT09ICcwJyAmJiBiYXNpcyA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgnZmxleC1ub25lJyk7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnZmxleCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGBmbGV4LVske3ZhbHVlfV1gKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKCdmbGV4Jyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gICAgfVxuXG4gICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDEgfHwgdG9rZW5zLmxlbmd0aCA9PT0gMikge1xuICAgICAgY2xhc3Nlcy5wdXNoKGBmbGV4LVske3ZhbHVlfV1gKTtcbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnZmxleCcpO1xuICAgICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MsIGNzc1Byb3BlcnRpZXMgfTtcbiAgICB9XG5cbiAgICB3YXJuaW5ncy5wdXNoKGBDb21wbGV4IGZsZXggc2hvcnRoYW5kOiAke3ZhbHVlfWApO1xuICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRHYXAodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIGlmIChweCA9PT0gbnVsbCkge1xuICAgICAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCUpPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGdhcC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgTm9uLXBpeGVsIGdhcCB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMucHhUb1NwYWNpbmcocHgpO1xuICAgIGlmICghc3BhY2luZykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgZ2FwLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGdhcC0ke3NwYWNpbmd9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFdpZHRoKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBpZiAodmFsdWUgPT09ICcxMDAlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy1mdWxsJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnNTAlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy0xLzInLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICczMy4zMzMlJyB8fCB2YWx1ZSA9PT0gJzMzLjMzJScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctMS8zJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnNjYuNjY2JScgfHwgdmFsdWUgPT09ICc2Ni42NyUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LTIvMycsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzI1JScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctMS80Jywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnNzUlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy0zLzQnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy1hdXRvJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnZml0LWNvbnRlbnQnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LWZpdCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJ21pbi1jb250ZW50Jykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy1taW4nLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdtYXgtY29udGVudCcpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctbWF4Jywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCBweCA9IHRoaXMuZXh0cmFjdFB4KHZhbHVlKTtcbiAgICBpZiAocHggIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHNwYWNpbmcgPSB0aGlzLnB4VG9TcGFjaW5nKHB4KTtcbiAgICAgIGlmIChzcGFjaW5nKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHctJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB3LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlfHZ3KT8kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdy1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggd2lkdGggdmFsdWU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SGVpZ2h0KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBpZiAodmFsdWUgPT09ICcxMDAlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnaC1mdWxsJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnNTAlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnaC0xLzInLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnaC1hdXRvJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnZml0LWNvbnRlbnQnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdoLWZpdCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJ21pbi1jb250ZW50Jykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnaC1taW4nLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdtYXgtY29udGVudCcpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ2gtbWF4Jywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnMTAwdmgnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdoLXNjcmVlbicsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgaWYgKHB4ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgICBpZiAoc3BhY2luZykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBoLSR7c3BhY2luZ31gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgaC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoL15cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JXx2aCk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGgtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4IGhlaWdodCB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRCYWNrZ3JvdW5kQ29sb3IodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IGNvbG9yTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3RyYW5zcGFyZW50JzogJ2JnLXRyYW5zcGFyZW50JyxcbiAgICAgICd3aGl0ZSc6ICdiZy13aGl0ZScsXG4gICAgICAnYmxhY2snOiAnYmctYmxhY2snLFxuICAgICAgJ3JlZCc6ICdiZy1yZWQtNTAwJyxcbiAgICAgICdibHVlJzogJ2JnLWJsdWUtNTAwJyxcbiAgICAgICdncmVlbic6ICdiZy1ncmVlbi01MDAnLFxuICAgICAgJ2dyYXknOiAnYmctZ3JheS01MDAnXG4gICAgfTtcblxuICAgIGlmIChjb2xvck1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogY29sb3JNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGJnLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdyZ2InKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgYmctWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4IGJhY2tncm91bmQtY29sb3I6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VGV4dENvbG9yKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBjb2xvck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICd0cmFuc3BhcmVudCc6ICd0ZXh0LXRyYW5zcGFyZW50JyxcbiAgICAgICd3aGl0ZSc6ICd0ZXh0LXdoaXRlJyxcbiAgICAgICdibGFjayc6ICd0ZXh0LWJsYWNrJyxcbiAgICAgICdyZWQnOiAndGV4dC1yZWQtNTAwJyxcbiAgICAgICdibHVlJzogJ3RleHQtYmx1ZS01MDAnLFxuICAgICAgJ2dyZWVuJzogJ3RleHQtZ3JlZW4tNTAwJyxcbiAgICAgICdncmF5JzogJ3RleHQtZ3JheS01MDAnXG4gICAgfTtcblxuICAgIGlmIChjb2xvck1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogY29sb3JNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRleHQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ3JnYicpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB0ZXh0LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgQ29tcGxleCBjb2xvcjogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRCb3JkZXJSYWRpdXModmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIFxuICAgIGlmIChweCA9PT0gbnVsbCkge1xuICAgICAgaWYgKHZhbHVlID09PSAnNTAlJykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdyb3VuZGVkLWZ1bGwnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCUpPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHJvdW5kZWQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggYm9yZGVyLXJhZGl1czogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmFkaXVzTWFwOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICAgICAgMDogJ3JvdW5kZWQtbm9uZScsXG4gICAgICAyOiAncm91bmRlZC1zbScsXG4gICAgICA0OiAncm91bmRlZCcsXG4gICAgICA2OiAncm91bmRlZC1tZCcsXG4gICAgICA4OiAncm91bmRlZC1sZycsXG4gICAgICAxMjogJ3JvdW5kZWQteGwnLFxuICAgICAgMTY6ICdyb3VuZGVkLTJ4bCcsXG4gICAgICAyNDogJ3JvdW5kZWQtM3hsJ1xuICAgIH07XG5cbiAgICBjb25zdCBjbG9zZXN0ID0gT2JqZWN0LmtleXMocmFkaXVzTWFwKVxuICAgICAgLm1hcChOdW1iZXIpXG4gICAgICAucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBcbiAgICAgICAgTWF0aC5hYnMoY3VyciAtIHB4KSA8IE1hdGguYWJzKHByZXYgLSBweCkgPyBjdXJyIDogcHJldlxuICAgICAgKTtcblxuICAgIGlmIChNYXRoLmFicyhjbG9zZXN0IC0gcHgpIC8gKHB4IHx8IDEpIDwgMC4yKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IHJhZGl1c01hcFtjbG9zZXN0XSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IGByb3VuZGVkLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Qm9yZGVyKHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGlmIChwcm9wID09PSAnYm9yZGVyLXdpZHRoJykge1xuICAgICAgY29uc3Qgd2lkdGhNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICcwJzogJ2JvcmRlci0wJyxcbiAgICAgICAgJzFweCc6ICdib3JkZXInLFxuICAgICAgICAnMnB4JzogJ2JvcmRlci0yJyxcbiAgICAgICAgJzRweCc6ICdib3JkZXItNCcsXG4gICAgICAgICc4cHgnOiAnYm9yZGVyLTgnXG4gICAgICB9O1xuXG4gICAgICBpZiAod2lkdGhNYXBbdmFsdWVdKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogd2lkdGhNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoL15cXGQrKFxcLlxcZCspPyhweHxyZW18ZW0pPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGJvcmRlci1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGJvcmRlci13aWR0aDogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICdib3JkZXItc3R5bGUnKSB7XG4gICAgICBjb25zdCBzdHlsZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ3NvbGlkJzogJycsXG4gICAgICAgICdkYXNoZWQnOiAnYm9yZGVyLWRhc2hlZCcsXG4gICAgICAgICdkb3R0ZWQnOiAnYm9yZGVyLWRvdHRlZCcsXG4gICAgICAgICdkb3VibGUnOiAnYm9yZGVyLWRvdWJsZScsXG4gICAgICAgICdoaWRkZW4nOiAnYm9yZGVyLWhpZGRlbicsXG4gICAgICAgICdub25lJzogJ2JvcmRlci1ub25lJ1xuICAgICAgfTtcblxuICAgICAgaWYgKHZhbHVlID09PSAnc29saWQnKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0eWxlTWFwW3ZhbHVlXSkge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IHN0eWxlTWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGJvcmRlci1zdHlsZTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICdib3JkZXItY29sb3InKSB7XG4gICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGJvcmRlci1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdyZ2InKSkge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBib3JkZXItWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbG9yTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAndHJhbnNwYXJlbnQnOiAnYm9yZGVyLXRyYW5zcGFyZW50JyxcbiAgICAgICAgJ3doaXRlJzogJ2JvcmRlci13aGl0ZScsXG4gICAgICAgICdibGFjayc6ICdib3JkZXItYmxhY2snLFxuICAgICAgICAncmVkJzogJ2JvcmRlci1yZWQtNTAwJyxcbiAgICAgICAgJ2JsdWUnOiAnYm9yZGVyLWJsdWUtNTAwJyxcbiAgICAgICAgJ2dyZWVuJzogJ2JvcmRlci1ncmVlbi01MDAnLFxuICAgICAgICAnZ3JheSc6ICdib3JkZXItZ3JheS01MDAnXG4gICAgICB9O1xuXG4gICAgICBpZiAoY29sb3JNYXBbdmFsdWVdKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogY29sb3JNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBib3JkZXItJHt2YWx1ZX1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wID09PSAnYm9yZGVyLXRvcC13aWR0aCcgfHwgcHJvcCA9PT0gJ2JvcmRlci1yaWdodC13aWR0aCcgfHwgXG4gICAgICAgIHByb3AgPT09ICdib3JkZXItYm90dG9tLXdpZHRoJyB8fCBwcm9wID09PSAnYm9yZGVyLWxlZnQtd2lkdGgnKSB7XG4gICAgICBjb25zdCBzaWRlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnYm9yZGVyLXRvcC13aWR0aCc6ICdib3JkZXItdCcsXG4gICAgICAgICdib3JkZXItcmlnaHQtd2lkdGgnOiAnYm9yZGVyLXInLFxuICAgICAgICAnYm9yZGVyLWJvdHRvbS13aWR0aCc6ICdib3JkZXItYicsXG4gICAgICAgICdib3JkZXItbGVmdC13aWR0aCc6ICdib3JkZXItbCdcbiAgICAgIH07XG4gICAgICBjb25zdCBwcmVmaXggPSBzaWRlTWFwW3Byb3BdO1xuXG4gICAgICBjb25zdCB3aWR0aE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJzAnOiBgJHtwcmVmaXh9LTBgLFxuICAgICAgICAnMXB4JzogcHJlZml4LFxuICAgICAgICAnMnB4JzogYCR7cHJlZml4fS0yYCxcbiAgICAgICAgJzRweCc6IGAke3ByZWZpeH0tNGAsXG4gICAgICAgICc4cHgnOiBgJHtwcmVmaXh9LThgXG4gICAgICB9O1xuXG4gICAgICBpZiAod2lkdGhNYXBbdmFsdWVdKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogd2lkdGhNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoL15cXGQrKFxcLlxcZCspPyhweHxyZW18ZW0pPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duICR7cHJvcH06ICR7dmFsdWV9YCB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biBib3JkZXIgcHJvcGVydHk6ICR7cHJvcH1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRCb3JkZXJTaG9ydGhhbmQodmFsdWU6IHN0cmluZyk6IE11bHRpQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy50b2tlbml6ZVZhbHVlKHZhbHVlKTtcblxuICAgIGxldCB3aWR0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHN0eWxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY29sb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXx0aGlufG1lZGl1bXx0aGljayk/JC8udGVzdCh0b2tlbikgfHwgXG4gICAgICAgICAgdG9rZW4gPT09ICd0aGluJyB8fCB0b2tlbiA9PT0gJ21lZGl1bScgfHwgdG9rZW4gPT09ICd0aGljaycpIHtcbiAgICAgICAgd2lkdGggPSB0b2tlbjtcbiAgICAgIH0gZWxzZSBpZiAoWydzb2xpZCcsICdkYXNoZWQnLCAnZG90dGVkJywgJ2RvdWJsZScsICdoaWRkZW4nLCAnbm9uZScsICdncm9vdmUnLCAncmlkZ2UnLCAnaW5zZXQnLCAnb3V0c2V0J10uaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgIHN0eWxlID0gdG9rZW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xvciA9IHRva2VuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3aWR0aCkge1xuICAgICAgY29uc3Qgd2lkdGhNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICcwJzogJ2JvcmRlci0wJyxcbiAgICAgICAgJzFweCc6ICdib3JkZXInLFxuICAgICAgICAnMnB4JzogJ2JvcmRlci0yJyxcbiAgICAgICAgJzRweCc6ICdib3JkZXItNCcsXG4gICAgICAgICc4cHgnOiAnYm9yZGVyLTgnLFxuICAgICAgICAndGhpbic6ICdib3JkZXInLFxuICAgICAgICAnbWVkaXVtJzogJ2JvcmRlci0yJyxcbiAgICAgICAgJ3RoaWNrJzogJ2JvcmRlci00J1xuICAgICAgfTtcblxuICAgICAgaWYgKHdpZHRoTWFwW3dpZHRoXSkge1xuICAgICAgICBjbGFzc2VzLnB1c2god2lkdGhNYXBbd2lkdGhdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChgYm9yZGVyLVske3dpZHRofV1gKTtcbiAgICAgIH1cbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnYm9yZGVyLXdpZHRoJyk7XG4gICAgfVxuXG4gICAgaWYgKHN0eWxlICYmIHN0eWxlICE9PSAnc29saWQnKSB7XG4gICAgICBjb25zdCBzdHlsZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ2Rhc2hlZCc6ICdib3JkZXItZGFzaGVkJyxcbiAgICAgICAgJ2RvdHRlZCc6ICdib3JkZXItZG90dGVkJyxcbiAgICAgICAgJ2RvdWJsZSc6ICdib3JkZXItZG91YmxlJyxcbiAgICAgICAgJ2hpZGRlbic6ICdib3JkZXItaGlkZGVuJyxcbiAgICAgICAgJ25vbmUnOiAnYm9yZGVyLW5vbmUnXG4gICAgICB9O1xuXG4gICAgICBpZiAoc3R5bGVNYXBbc3R5bGVdKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChzdHlsZU1hcFtzdHlsZV0pO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goJ2JvcmRlci1zdHlsZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChgVW5zdXBwb3J0ZWQgYm9yZGVyLXN0eWxlOiAke3N0eWxlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2xvcikge1xuICAgICAgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2goYGJvcmRlci1bJHtjb2xvcn1dYCk7XG4gICAgICB9IGVsc2UgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoJ3JnYicpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChgYm9yZGVyLVske2NvbG9yfV1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbG9yTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICd0cmFuc3BhcmVudCc6ICdib3JkZXItdHJhbnNwYXJlbnQnLFxuICAgICAgICAgICd3aGl0ZSc6ICdib3JkZXItd2hpdGUnLFxuICAgICAgICAgICdibGFjayc6ICdib3JkZXItYmxhY2snXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGNvbG9yTWFwW2NvbG9yXSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaChjb2xvck1hcFtjb2xvcl0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsYXNzZXMucHVzaChgYm9yZGVyLSR7Y29sb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnYm9yZGVyLWNvbG9yJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MsIGNzc1Byb3BlcnRpZXMgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERpcmVjdGlvbmFsQm9yZGVyU2hvcnRoYW5kKHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IE11bHRpQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3Qgc2lkZU1hcDogUmVjb3JkPHN0cmluZywgeyBwcmVmaXg6IHN0cmluZzsgd2lkdGhQcm9wOiBzdHJpbmc7IGNvbG9yUHJvcDogc3RyaW5nIH0+ID0ge1xuICAgICAgJ2JvcmRlci10b3AnOiB7IHByZWZpeDogJ2JvcmRlci10Jywgd2lkdGhQcm9wOiAnYm9yZGVyLXRvcC13aWR0aCcsIGNvbG9yUHJvcDogJ2JvcmRlci10b3AtY29sb3InIH0sXG4gICAgICAnYm9yZGVyLXJpZ2h0JzogeyBwcmVmaXg6ICdib3JkZXItcicsIHdpZHRoUHJvcDogJ2JvcmRlci1yaWdodC13aWR0aCcsIGNvbG9yUHJvcDogJ2JvcmRlci1yaWdodC1jb2xvcicgfSxcbiAgICAgICdib3JkZXItYm90dG9tJzogeyBwcmVmaXg6ICdib3JkZXItYicsIHdpZHRoUHJvcDogJ2JvcmRlci1ib3R0b20td2lkdGgnLCBjb2xvclByb3A6ICdib3JkZXItYm90dG9tLWNvbG9yJyB9LFxuICAgICAgJ2JvcmRlci1sZWZ0JzogeyBwcmVmaXg6ICdib3JkZXItbCcsIHdpZHRoUHJvcDogJ2JvcmRlci1sZWZ0LXdpZHRoJywgY29sb3JQcm9wOiAnYm9yZGVyLWxlZnQtY29sb3InIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgc2lkZSA9IHNpZGVNYXBbcHJvcF07XG4gICAgaWYgKCFzaWRlKSB7XG4gICAgICByZXR1cm4geyBjbGFzc2VzLCB3YXJuaW5nczogW2BVbmtub3duIGRpcmVjdGlvbmFsIGJvcmRlcjogJHtwcm9wfWBdLCBjc3NQcm9wZXJ0aWVzIH07XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy50b2tlbml6ZVZhbHVlKHZhbHVlKTtcblxuICAgIGxldCB3aWR0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHN0eWxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY29sb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXx0aGlufG1lZGl1bXx0aGljayk/JC8udGVzdCh0b2tlbikgfHwgXG4gICAgICAgICAgdG9rZW4gPT09ICd0aGluJyB8fCB0b2tlbiA9PT0gJ21lZGl1bScgfHwgdG9rZW4gPT09ICd0aGljaycpIHtcbiAgICAgICAgd2lkdGggPSB0b2tlbjtcbiAgICAgIH0gZWxzZSBpZiAoWydzb2xpZCcsICdkYXNoZWQnLCAnZG90dGVkJywgJ2RvdWJsZScsICdoaWRkZW4nLCAnbm9uZSddLmluY2x1ZGVzKHRva2VuKSkge1xuICAgICAgICBzdHlsZSA9IHRva2VuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sb3IgPSB0b2tlbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod2lkdGgpIHtcbiAgICAgIGNvbnN0IHdpZHRoTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnMCc6IGAke3NpZGUucHJlZml4fS0wYCxcbiAgICAgICAgJzFweCc6IHNpZGUucHJlZml4LFxuICAgICAgICAnMnB4JzogYCR7c2lkZS5wcmVmaXh9LTJgLFxuICAgICAgICAnNHB4JzogYCR7c2lkZS5wcmVmaXh9LTRgLFxuICAgICAgICAnOHB4JzogYCR7c2lkZS5wcmVmaXh9LThgXG4gICAgICB9O1xuXG4gICAgICBpZiAod2lkdGhNYXBbd2lkdGhdKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCh3aWR0aE1hcFt3aWR0aF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGAke3NpZGUucHJlZml4fS1bJHt3aWR0aH1dYCk7XG4gICAgICB9XG4gICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goc2lkZS53aWR0aFByb3ApO1xuICAgIH1cblxuICAgIGlmIChzdHlsZSAmJiBzdHlsZSAhPT0gJ3NvbGlkJykge1xuICAgICAgd2FybmluZ3MucHVzaChgQm9yZGVyIHN0eWxlICcke3N0eWxlfScgZm9yICR7cHJvcH0gYXBwbGllcyB0byBhbGwgYm9yZGVyc2ApO1xuICAgIH1cblxuICAgIGlmIChjb2xvcikge1xuICAgICAgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2goYCR7c2lkZS5wcmVmaXh9LVske2NvbG9yfV1gKTtcbiAgICAgIH0gZWxzZSBpZiAoY29sb3Iuc3RhcnRzV2l0aCgncmdiJykpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGAke3NpZGUucHJlZml4fS1bJHtjb2xvcn1dYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc2VzLnB1c2goYCR7c2lkZS5wcmVmaXh9LSR7Y29sb3J9YCk7XG4gICAgICB9XG4gICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goc2lkZS5jb2xvclByb3ApO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRBc3BlY3RSYXRpbyh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcmF0aW9NYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnMS8xJzogJ2FzcGVjdC1zcXVhcmUnLFxuICAgICAgJzE2LzknOiAnYXNwZWN0LXZpZGVvJyxcbiAgICAgICc0LzMnOiAnYXNwZWN0LVs0LzNdJyxcbiAgICAgICczLzQnOiAnYXNwZWN0LVszLzRdJyxcbiAgICAgICcyLzMnOiAnYXNwZWN0LVsyLzNdJyxcbiAgICAgICczLzInOiAnYXNwZWN0LVszLzJdJyxcbiAgICAgICcxLzInOiAnYXNwZWN0LVsxLzJdJyxcbiAgICAgICcyLzEnOiAnYXNwZWN0LVsyLzFdJyxcbiAgICAgICdhdXRvJzogJ2FzcGVjdC1hdXRvJ1xuICAgIH07XG5cbiAgICBpZiAocmF0aW9NYXBbdmFsdWVdKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IHJhdGlvTWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoL15cXGQrKFxcLlxcZCspPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBhc3BlY3QtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKC9eXFxkK1xcL1xcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgYXNwZWN0LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biBhc3BlY3QtcmF0aW86ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0T3ZlcmZsb3cocHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcHJlZml4TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ292ZXJmbG93JzogJ292ZXJmbG93JyxcbiAgICAgICdvdmVyZmxvdy14JzogJ292ZXJmbG93LXgnLFxuICAgICAgJ292ZXJmbG93LXknOiAnb3ZlcmZsb3cteSdcbiAgICB9O1xuXG4gICAgY29uc3QgcHJlZml4ID0gcHJlZml4TWFwW3Byb3BdO1xuXG4gICAgY29uc3QgdmFsdWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnYXV0byc6IGAke3ByZWZpeH0tYXV0b2AsXG4gICAgICAnaGlkZGVuJzogYCR7cHJlZml4fS1oaWRkZW5gLFxuICAgICAgJ3Zpc2libGUnOiBgJHtwcmVmaXh9LXZpc2libGVgLFxuICAgICAgJ3Njcm9sbCc6IGAke3ByZWZpeH0tc2Nyb2xsYCxcbiAgICAgICdjbGlwJzogYCR7cHJlZml4fS1jbGlwYFxuICAgIH07XG5cbiAgICBpZiAodmFsdWVNYXBbdmFsdWVdKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IHZhbHVlTWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVua25vd24gb3ZlcmZsb3cgdmFsdWU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0T2JqZWN0Rml0KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBmaXRNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY29udGFpbic6ICdvYmplY3QtY29udGFpbicsXG4gICAgICAnY292ZXInOiAnb2JqZWN0LWNvdmVyJyxcbiAgICAgICdmaWxsJzogJ29iamVjdC1maWxsJyxcbiAgICAgICdub25lJzogJ29iamVjdC1ub25lJyxcbiAgICAgICdzY2FsZS1kb3duJzogJ29iamVjdC1zY2FsZS1kb3duJ1xuICAgIH07XG5cbiAgICBpZiAoZml0TWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBmaXRNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biBvYmplY3QtZml0OiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydE9iamVjdFBvc2l0aW9uKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBwb3NpdGlvbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjZW50ZXInOiAnb2JqZWN0LWNlbnRlcicsXG4gICAgICAndG9wJzogJ29iamVjdC10b3AnLFxuICAgICAgJ2JvdHRvbSc6ICdvYmplY3QtYm90dG9tJyxcbiAgICAgICdsZWZ0JzogJ29iamVjdC1sZWZ0JyxcbiAgICAgICdyaWdodCc6ICdvYmplY3QtcmlnaHQnLFxuICAgICAgJ2NlbnRlciBjZW50ZXInOiAnb2JqZWN0LWNlbnRlcicsXG4gICAgICAnY2VudGVyIHRvcCc6ICdvYmplY3QtdG9wJyxcbiAgICAgICdjZW50ZXIgYm90dG9tJzogJ29iamVjdC1ib3R0b20nLFxuICAgICAgJ2xlZnQgY2VudGVyJzogJ29iamVjdC1sZWZ0JyxcbiAgICAgICdyaWdodCBjZW50ZXInOiAnb2JqZWN0LXJpZ2h0JyxcbiAgICAgICdsZWZ0IHRvcCc6ICdvYmplY3QtbGVmdC10b3AnLFxuICAgICAgJ3JpZ2h0IHRvcCc6ICdvYmplY3QtcmlnaHQtdG9wJyxcbiAgICAgICdsZWZ0IGJvdHRvbSc6ICdvYmplY3QtbGVmdC1ib3R0b20nLFxuICAgICAgJ3JpZ2h0IGJvdHRvbSc6ICdvYmplY3QtcmlnaHQtYm90dG9tJ1xuICAgIH07XG5cbiAgICBpZiAocG9zaXRpb25NYXBbdmFsdWVdKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IHBvc2l0aW9uTWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoL15cXGQrKFxcLlxcZCspPyglfHB4fHJlbXxlbSk/KFxccytcXGQrKFxcLlxcZCspPyglfHB4fHJlbXxlbSk/KT8kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgb2JqZWN0LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biBvYmplY3QtcG9zaXRpb246ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0T3BhY2l0eSh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgbnVtVmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICBpZiAoaXNOYU4obnVtVmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYEludmFsaWQgb3BhY2l0eSB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGVyY2VudFZhbHVlID0gTWF0aC5yb3VuZChudW1WYWx1ZSAqIDEwMCk7XG5cbiAgICBpZiAodGhpcy5vcGFjaXR5U2NhbGUuaGFzKHBlcmNlbnRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYG9wYWNpdHktJHt0aGlzLm9wYWNpdHlTY2FsZS5nZXQocGVyY2VudFZhbHVlKX1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogYG9wYWNpdHktWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRXb3JkQnJlYWsodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IGJyZWFrTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ25vcm1hbCc6ICdicmVhay1ub3JtYWwnLFxuICAgICAgJ2JyZWFrLWFsbCc6ICdicmVhay1hbGwnLFxuICAgICAgJ2JyZWFrLXdvcmQnOiAnYnJlYWstd29yZHMnLFxuICAgICAgJ2tlZXAtYWxsJzogJ2JyZWFrLWtlZXAnXG4gICAgfTtcblxuICAgIGlmIChicmVha01hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYnJlYWtNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biB3b3JkLWJyZWFrOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFpJbmRleCh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgbnVtVmFsdWUgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIGlmIChpc05hTihudW1WYWx1ZSkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3otYXV0bycsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYEludmFsaWQgei1pbmRleCB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuekluZGV4U2NhbGUuaGFzKG51bVZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgei0ke3RoaXMuekluZGV4U2NhbGUuZ2V0KG51bVZhbHVlKX1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHotWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBjb252ZXJ0TXVsdGlwbGUocHJvcGVydGllczogQ1NTUHJvcGVydHlbXSk6IHsgY2xhc3Nlczogc3RyaW5nW107IHdhcm5pbmdzOiBzdHJpbmdbXSB9IHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcHJvcGVydGllcy5mb3JFYWNoKCh7IHByb3BlcnR5LCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCBtdWx0aVJlc3VsdCA9IHRoaXMuY29udmVydFByb3BlcnR5V2l0aE11bHRpcGxlKHByb3BlcnR5LCB2YWx1ZSk7XG4gICAgICBcbiAgICAgIGNsYXNzZXMucHVzaCguLi5tdWx0aVJlc3VsdC5jbGFzc2VzKTtcbiAgICAgIHdhcm5pbmdzLnB1c2goLi4ubXVsdGlSZXN1bHQud2FybmluZ3MpO1xuXG4gICAgICBpZiAobXVsdGlSZXN1bHQuY2xhc3Nlcy5sZW5ndGggPT09IDAgJiYgbXVsdGlSZXN1bHQud2FybmluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29udmVydFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAocmVzdWx0LnNraXBwZWQpIHtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKHJlc3VsdC5yZWFzb24gfHwgYFNraXBwZWQ6ICR7cHJvcGVydHl9OiAke3ZhbHVlfWApO1xuICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBTa2lwcGVkOiAke3Byb3BlcnR5fTogJHt2YWx1ZX0gLSAke3Jlc3VsdC5yZWFzb259YCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmNsYXNzTmFtZSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaChyZXN1bHQuY2xhc3NOYW1lKTtcbiAgICAgICAgICBsb2dnZXIudmVyYm9zZShgQ29udmVydGVkOiAke3Byb3BlcnR5fTogJHt2YWx1ZX0g4oaSICR7cmVzdWx0LmNsYXNzTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG11bHRpUmVzdWx0LmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBDb252ZXJ0ZWQ6ICR7cHJvcGVydHl9OiAke3ZhbHVlfSDihpIgJHttdWx0aVJlc3VsdC5jbGFzc2VzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbXVsdGlSZXN1bHQud2FybmluZ3MuZm9yRWFjaCh3ID0+IGxvZ2dlci52ZXJib3NlKGBXYXJuaW5nOiAke3d9YCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MgfTtcbiAgfVxufVxuIl19