css-to-tailwind-react 0.1.2 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cssParser.d.ts +16 -1
- package/dist/cssParser.js +161 -33
- package/dist/index.d.ts +3 -1
- package/dist/index.js +11 -2
- package/dist/jsxDescendantTransformer.d.ts +16 -0
- package/dist/jsxDescendantTransformer.js +335 -0
- package/dist/transformer.js +59 -21
- package/dist/utils/conflictResolver.d.ts +39 -0
- package/dist/utils/conflictResolver.js +140 -0
- package/dist/utils/descendantSelectorResolver.d.ts +20 -0
- package/dist/utils/descendantSelectorResolver.js +186 -0
- package/dist/utils/propertyMapper.d.ts +7 -0
- package/dist/utils/propertyMapper.js +277 -0
- package/dist/utils/specificityCalculator.d.ts +25 -0
- package/dist/utils/specificityCalculator.js +150 -0
- package/package.json +1 -1
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.transformDescendantSelectors = transformDescendantSelectors;
|
|
40
|
+
exports.groupDescendantRulesByParent = groupDescendantRulesByParent;
|
|
41
|
+
const parser_1 = require("@babel/parser");
|
|
42
|
+
const traverse_1 = __importDefault(require("@babel/traverse"));
|
|
43
|
+
const generator_1 = __importDefault(require("@babel/generator"));
|
|
44
|
+
const t = __importStar(require("@babel/types"));
|
|
45
|
+
const conflictResolver_1 = require("./utils/conflictResolver");
|
|
46
|
+
const logger_1 = require("./utils/logger");
|
|
47
|
+
function isReactComponent(name) {
|
|
48
|
+
return name.length > 0 && name[0] === name[0].toUpperCase();
|
|
49
|
+
}
|
|
50
|
+
function getJSXElementName(node) {
|
|
51
|
+
if (t.isJSXIdentifier(node.name)) {
|
|
52
|
+
return node.name.name;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
function parseClassNameValue(attr) {
|
|
57
|
+
const classes = [];
|
|
58
|
+
if (!attr.value) {
|
|
59
|
+
return classes;
|
|
60
|
+
}
|
|
61
|
+
if (t.isStringLiteral(attr.value)) {
|
|
62
|
+
return attr.value.value.split(/\s+/).filter(Boolean);
|
|
63
|
+
}
|
|
64
|
+
if (t.isJSXExpressionContainer(attr.value)) {
|
|
65
|
+
const expr = attr.value.expression;
|
|
66
|
+
if (t.isStringLiteral(expr)) {
|
|
67
|
+
return expr.value.split(/\s+/).filter(Boolean);
|
|
68
|
+
}
|
|
69
|
+
if (t.isTemplateLiteral(expr) && expr.quasis.length > 0 && expr.expressions.length === 0) {
|
|
70
|
+
return expr.quasis[0].value.raw.split(/\s+/).filter(Boolean);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return classes;
|
|
74
|
+
}
|
|
75
|
+
function elementMatchesSelector(node, selector) {
|
|
76
|
+
const elementName = getJSXElementName(node);
|
|
77
|
+
if (!elementName) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
if (isReactComponent(elementName)) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (selector.type === 'element') {
|
|
84
|
+
return elementName.toLowerCase() === selector.name.toLowerCase();
|
|
85
|
+
}
|
|
86
|
+
if (selector.type === 'class') {
|
|
87
|
+
const classNameAttr = node.attributes?.find(attr => t.isJSXAttribute(attr) &&
|
|
88
|
+
t.isJSXIdentifier(attr.name) &&
|
|
89
|
+
attr.name.name === 'className');
|
|
90
|
+
if (!classNameAttr || !t.isJSXAttribute(classNameAttr)) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
const classes = parseClassNameValue(classNameAttr);
|
|
94
|
+
return classes.includes(selector.name);
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
function mergeClassesIntoAttribute(node, newClasses) {
|
|
99
|
+
if (newClasses.length === 0) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
const classNameAttr = node.attributes?.find(attr => t.isJSXAttribute(attr) &&
|
|
103
|
+
t.isJSXIdentifier(attr.name) &&
|
|
104
|
+
attr.name.name === 'className');
|
|
105
|
+
if (!classNameAttr) {
|
|
106
|
+
const newAttr = t.jsxAttribute(t.jsxIdentifier('className'), t.stringLiteral(newClasses.join(' ')));
|
|
107
|
+
if (!node.attributes) {
|
|
108
|
+
node.attributes = [];
|
|
109
|
+
}
|
|
110
|
+
node.attributes.push(newAttr);
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
if (!t.isJSXAttribute(classNameAttr)) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
const existingClasses = parseClassNameValue(classNameAttr);
|
|
117
|
+
const allClasses = new Set([...existingClasses, ...newClasses]);
|
|
118
|
+
const mergedClasses = Array.from(allClasses);
|
|
119
|
+
if (t.isStringLiteral(classNameAttr.value)) {
|
|
120
|
+
classNameAttr.value.value = mergedClasses.join(' ');
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
if (t.isJSXExpressionContainer(classNameAttr.value)) {
|
|
124
|
+
const expr = classNameAttr.value.expression;
|
|
125
|
+
if (t.isStringLiteral(expr)) {
|
|
126
|
+
expr.value = mergedClasses.join(' ');
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
if (t.isTemplateLiteral(expr) && expr.quasis.length > 0 && expr.expressions.length === 0) {
|
|
130
|
+
expr.quasis[0].value.raw = mergedClasses.join(' ');
|
|
131
|
+
expr.quasis[0].value.cooked = mergedClasses.join(' ');
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
classNameAttr.value = t.stringLiteral(mergedClasses.join(' '));
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
function wrapInFragment(code) {
|
|
139
|
+
return `<>${code}</>`;
|
|
140
|
+
}
|
|
141
|
+
function unwrapFragment(code) {
|
|
142
|
+
return code.replace(/^<>\n?/, '').replace(/\n?<\/>$/, '');
|
|
143
|
+
}
|
|
144
|
+
function needsFragmentWrapping(code) {
|
|
145
|
+
const trimmed = code.trim();
|
|
146
|
+
if (trimmed.startsWith('<>') || trimmed.startsWith('<Fragment')) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
const firstChar = trimmed.search(/<[a-zA-Z]/);
|
|
150
|
+
if (firstChar === -1)
|
|
151
|
+
return false;
|
|
152
|
+
let depth = 0;
|
|
153
|
+
let inString = false;
|
|
154
|
+
let stringChar = '';
|
|
155
|
+
for (let i = firstChar; i < trimmed.length; i++) {
|
|
156
|
+
const char = trimmed[i];
|
|
157
|
+
if (inString) {
|
|
158
|
+
if (char === stringChar && trimmed[i - 1] !== '\\') {
|
|
159
|
+
inString = false;
|
|
160
|
+
}
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (char === '"' || char === "'" || char === '`') {
|
|
164
|
+
inString = true;
|
|
165
|
+
stringChar = char;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (trimmed.slice(i, i + 2) === '</') {
|
|
169
|
+
depth--;
|
|
170
|
+
i++;
|
|
171
|
+
}
|
|
172
|
+
else if (char === '<' && trimmed[i + 1]?.match(/[a-zA-Z]/)) {
|
|
173
|
+
depth++;
|
|
174
|
+
}
|
|
175
|
+
if (depth === 0 && i > firstChar) {
|
|
176
|
+
const remaining = trimmed.slice(i + 1).trim();
|
|
177
|
+
if (remaining.startsWith('<') && !remaining.startsWith('</')) {
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
function transformDescendantSelectors(code, rules) {
|
|
185
|
+
const descendantRules = [];
|
|
186
|
+
for (const rule of rules) {
|
|
187
|
+
if (rule.isDescendant && rule.parentSelector && rule.targetSelector) {
|
|
188
|
+
if (rule.convertedClasses.length > 0) {
|
|
189
|
+
descendantRules.push({
|
|
190
|
+
parentSelector: rule.parentSelector,
|
|
191
|
+
targetSelector: rule.targetSelector,
|
|
192
|
+
utilities: rule.utilities,
|
|
193
|
+
selector: rule.selector
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (descendantRules.length === 0) {
|
|
199
|
+
return {
|
|
200
|
+
code,
|
|
201
|
+
hasChanges: false,
|
|
202
|
+
transformations: 0,
|
|
203
|
+
warnings: []
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
let hasChanges = false;
|
|
207
|
+
let transformations = 0;
|
|
208
|
+
const warnings = [];
|
|
209
|
+
const needsWrapping = needsFragmentWrapping(code);
|
|
210
|
+
const codeToParse = needsWrapping ? wrapInFragment(code) : code;
|
|
211
|
+
try {
|
|
212
|
+
const ast = (0, parser_1.parse)(codeToParse, {
|
|
213
|
+
sourceType: 'module',
|
|
214
|
+
allowImportExportEverywhere: true,
|
|
215
|
+
allowReturnOutsideFunction: true,
|
|
216
|
+
plugins: [
|
|
217
|
+
'jsx',
|
|
218
|
+
'typescript',
|
|
219
|
+
'decorators-legacy',
|
|
220
|
+
'classProperties',
|
|
221
|
+
'optionalChaining',
|
|
222
|
+
'nullishCoalescingOperator',
|
|
223
|
+
'dynamicImport'
|
|
224
|
+
]
|
|
225
|
+
});
|
|
226
|
+
(0, traverse_1.default)(ast, {
|
|
227
|
+
JSXOpeningElement(path) {
|
|
228
|
+
const node = path.node;
|
|
229
|
+
for (const rule of descendantRules) {
|
|
230
|
+
if (elementMatchesSelector(node, rule.parentSelector)) {
|
|
231
|
+
const parentPath = path.parentPath;
|
|
232
|
+
if (!parentPath)
|
|
233
|
+
continue;
|
|
234
|
+
const appliedClasses = applyToDescendants(parentPath, rule);
|
|
235
|
+
if (appliedClasses > 0) {
|
|
236
|
+
hasChanges = true;
|
|
237
|
+
transformations += appliedClasses;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
const output = (0, generator_1.default)(ast, {
|
|
244
|
+
retainLines: true,
|
|
245
|
+
retainFunctionParens: true,
|
|
246
|
+
comments: true
|
|
247
|
+
});
|
|
248
|
+
let outputCode = output.code;
|
|
249
|
+
if (needsWrapping) {
|
|
250
|
+
outputCode = unwrapFragment(outputCode);
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
code: outputCode,
|
|
254
|
+
hasChanges,
|
|
255
|
+
transformations,
|
|
256
|
+
warnings
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
logger_1.logger.error('Failed to transform descendant selectors:', error);
|
|
261
|
+
warnings.push(`Descendant transformation failed: ${error}`);
|
|
262
|
+
return {
|
|
263
|
+
code,
|
|
264
|
+
hasChanges: false,
|
|
265
|
+
transformations: 0,
|
|
266
|
+
warnings
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function applyToDescendants(parentPath, rule) {
|
|
271
|
+
let appliedCount = 0;
|
|
272
|
+
const utilitiesWithMeta = rule.utilities.map(u => ({
|
|
273
|
+
value: u.value,
|
|
274
|
+
variants: u.variants,
|
|
275
|
+
cssProperty: u.cssProperty,
|
|
276
|
+
specificity: u.specificity,
|
|
277
|
+
sourceOrder: u.sourceOrder,
|
|
278
|
+
originalSelector: rule.selector
|
|
279
|
+
}));
|
|
280
|
+
const { resolved } = (0, conflictResolver_1.resolveConflicts)(utilitiesWithMeta, false);
|
|
281
|
+
const newClasses = (0, conflictResolver_1.resolvedUtilitiesToStrings)(resolved);
|
|
282
|
+
const parentNode = parentPath.node;
|
|
283
|
+
if (!parentNode) {
|
|
284
|
+
return appliedCount;
|
|
285
|
+
}
|
|
286
|
+
if (t.isJSXElement(parentNode)) {
|
|
287
|
+
if (parentNode.children) {
|
|
288
|
+
for (const child of parentNode.children) {
|
|
289
|
+
if (t.isJSXElement(child)) {
|
|
290
|
+
appliedCount += applyToJSXElement(child, rule, newClasses);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return appliedCount;
|
|
296
|
+
}
|
|
297
|
+
function applyToJSXElement(element, rule, newClasses) {
|
|
298
|
+
let appliedCount = 0;
|
|
299
|
+
if (elementMatchesSelector(element.openingElement, rule.targetSelector)) {
|
|
300
|
+
if (mergeClassesIntoAttribute(element.openingElement, newClasses)) {
|
|
301
|
+
appliedCount++;
|
|
302
|
+
const elementName = getJSXElementName(element.openingElement);
|
|
303
|
+
logger_1.logger.verbose(`Applied descendant classes to <${elementName}>: ${newClasses.join(' ')}`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (element.children) {
|
|
307
|
+
for (const child of element.children) {
|
|
308
|
+
if (t.isJSXElement(child)) {
|
|
309
|
+
appliedCount += applyToJSXElement(child, rule, newClasses);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return appliedCount;
|
|
314
|
+
}
|
|
315
|
+
function groupDescendantRulesByParent(rules) {
|
|
316
|
+
const grouped = new Map();
|
|
317
|
+
for (const rule of rules) {
|
|
318
|
+
if (rule.isDescendant && rule.parentSelector && rule.targetSelector) {
|
|
319
|
+
const parentKey = rule.parentSelector.type === 'class'
|
|
320
|
+
? `.${rule.parentSelector.name}`
|
|
321
|
+
: rule.parentSelector.name;
|
|
322
|
+
if (!grouped.has(parentKey)) {
|
|
323
|
+
grouped.set(parentKey, []);
|
|
324
|
+
}
|
|
325
|
+
grouped.get(parentKey).push({
|
|
326
|
+
parentSelector: rule.parentSelector,
|
|
327
|
+
targetSelector: rule.targetSelector,
|
|
328
|
+
utilities: rule.utilities,
|
|
329
|
+
selector: rule.selector
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return grouped;
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianN4RGVzY2VuZGFudFRyYW5zZm9ybWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2pzeERlc2NlbmRhbnRUcmFuc2Zvcm1lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdOQSxvRUFxR0M7QUFpRUQsb0VBdUJDO0FBclpELDBDQUFzQztBQUN0QywrREFBdUM7QUFDdkMsaUVBQXdDO0FBQ3hDLGdEQUFrQztBQUdsQywrREFLa0M7QUFDbEMsMkNBQXdDO0FBZ0J4QyxTQUFTLGdCQUFnQixDQUFDLElBQVk7SUFDcEMsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzlELENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLElBQXlCO0lBQ2xELElBQUksQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLElBQW9CO0lBQy9DLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUU3QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxJQUFJ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U0FBUyxDQUFFLENBQUMsSUFBSSxDQUFDO2dCQUMzQixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0JBQ25DLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztnQkFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN6QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDeEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdAYmFiZWwvcGFyc2VyJztcbmltcG9ydCB0cmF2ZXJzZSBmcm9tICdAYmFiZWwvdHJhdmVyc2UnO1xuaW1wb3J0IGdlbmVyYXRlIGZyb20gJ0BiYWJlbC9nZW5lcmF0b3InO1xuaW1wb3J0ICogYXMgdCBmcm9tICdAYmFiZWwvdHlwZXMnO1xuaW1wb3J0IHsgQ1NTUnVsZSwgU2VsZWN0b3JUYXJnZXQsIFV0aWxpdHlXaXRoVmFyaWFudCB9IGZyb20gJy4vY3NzUGFyc2VyJztcbmltcG9ydCB7IGFzc2VtYmxlVXRpbGl0aWVzIH0gZnJvbSAnLi91dGlscy92YXJpYW50QXNzZW1ibGVyJztcbmltcG9ydCB7IFxuICBVdGlsaXR5V2l0aE1ldGEsIFxuICBSZXNvbHZlZFV0aWxpdHksIFxuICByZXNvbHZlQ29uZmxpY3RzLCBcbiAgcmVzb2x2ZWRVdGlsaXRpZXNUb1N0cmluZ3MgXG59IGZyb20gJy4vdXRpbHMvY29uZmxpY3RSZXNvbHZlcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzY2VuZGFudFRyYW5zZm9ybVJlc3VsdCB7XG4gIGNvZGU6IHN0cmluZztcbiAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgdHJhbnNmb3JtYXRpb25zOiBudW1iZXI7XG4gIHdhcm5pbmdzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIERlc2NlbmRhbnRSdWxlIHtcbiAgcGFyZW50U2VsZWN0b3I6IFNlbGVjdG9yVGFyZ2V0O1xuICB0YXJnZXRTZWxlY3RvcjogU2VsZWN0b3JUYXJnZXQ7XG4gIHV0aWxpdGllczogVXRpbGl0eVdpdGhWYXJpYW50W107XG4gIHNlbGVjdG9yOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlzUmVhY3RDb21wb25lbnQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBuYW1lLmxlbmd0aCA+IDAgJiYgbmFtZVswXSA9PT0gbmFtZVswXS50b1VwcGVyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBnZXRKU1hFbGVtZW50TmFtZShub2RlOiB0LkpTWE9wZW5pbmdFbGVtZW50KTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0LmlzSlNYSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgcmV0dXJuIG5vZGUubmFtZS5uYW1lO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNsYXNzTmFtZVZhbHVlKGF0dHI6IHQuSlNYQXR0cmlidXRlKTogc3RyaW5nW10ge1xuICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICBcbiAgaWYgKCFhdHRyLnZhbHVlKSB7XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cbiAgXG4gIGlmICh0LmlzU3RyaW5nTGl0ZXJhbChhdHRyLnZhbHVlKSkge1xuICAgIHJldHVybiBhdHRyLnZhbHVlLnZhbHVlLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG4gIFxuICBpZiAodC5pc0pTWEV4cHJlc3Npb25Db250YWluZXIoYXR0ci52YWx1ZSkpIHtcbiAgICBjb25zdCBleHByID0gYXR0ci52YWx1ZS5leHByZXNzaW9uO1xuICAgIFxuICAgIGlmICh0LmlzU3RyaW5nTGl0ZXJhbChleHByKSkge1xuICAgICAgcmV0dXJuIGV4cHIudmFsdWUuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgfVxuICAgIFxuICAgIGlmICh0LmlzVGVtcGxhdGVMaXRlcmFsKGV4cHIpICYmIGV4cHIucXVhc2lzLmxlbmd0aCA+IDAgJiYgZXhwci5leHByZXNzaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBleHByLnF1YXNpc1swXS52YWx1ZS5yYXcuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gY2xhc3Nlcztcbn1cblxuZnVuY3Rpb24gZWxlbWVudE1hdGNoZXNTZWxlY3RvcihcbiAgbm9kZTogdC5KU1hPcGVuaW5nRWxlbWVudCxcbiAgc2VsZWN0b3I6IFNlbGVjdG9yVGFyZ2V0XG4pOiBib29sZWFuIHtcbiAgY29uc3QgZWxlbWVudE5hbWUgPSBnZXRKU1hFbGVtZW50TmFtZShub2RlKTtcbiAgXG4gIGlmICghZWxlbWVudE5hbWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgXG4gIGlmIChpc1JlYWN0Q29tcG9uZW50KGVsZW1lbnROYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBcbiAgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICdlbGVtZW50Jykge1xuICAgIHJldHVybiBlbGVtZW50TmFtZS50b0xvd2VyQ2FzZSgpID09PSBzZWxlY3Rvci5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgXG4gIGlmIChzZWxlY3Rvci50eXBlID09PSAnY2xhc3MnKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lQXR0ciA9IG5vZGUuYXR0cmlidXRlcz8uZmluZChcbiAgICAgIGF0dHIgPT4gdC5pc0pTWEF0dHJpYnV0ZShhdHRyKSAmJiBcbiAgICAgICAgICAgICAgdC5pc0pTWElkZW50aWZpZXIoYXR0ci5uYW1lKSAmJiBcbiAgICAgICAgICAgICAgYXR0ci5uYW1lLm5hbWUgPT09ICdjbGFzc05hbWUnXG4gICAgKTtcbiAgICBcbiAgICBpZiAoIWNsYXNzTmFtZUF0dHIgfHwgIXQuaXNKU1hBdHRyaWJ1dGUoY2xhc3NOYW1lQXR0cikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgY2xhc3NlcyA9IHBhcnNlQ2xhc3NOYW1lVmFsdWUoY2xhc3NOYW1lQXR0cik7XG4gICAgcmV0dXJuIGNsYXNzZXMuaW5jbHVkZXMoc2VsZWN0b3IubmFtZSk7XG4gIH1cbiAgXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VDbGFzc2VzSW50b0F0dHJpYnV0ZShcbiAgbm9kZTogdC5KU1hPcGVuaW5nRWxlbWVudCxcbiAgbmV3Q2xhc3Nlczogc3RyaW5nW11cbik6IGJvb2xlYW4ge1xuICBpZiAobmV3Q2xhc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgXG4gIGNvbnN0IGNsYXNzTmFtZUF0dHIgPSBub2RlLmF0dHJpYnV0ZXM/LmZpbmQoXG4gICAgYXR0ciA9PiB0LmlzSlNYQXR0cmlidXRlKGF0dHIpICYmIFxuICAgICAgICAgICAgdC5pc0pTWElkZW50aWZpZXIoYXR0ci5uYW1lKSAmJiBcbiAgICAgICAgICAgIGF0dHIubmFtZS5uYW1lID09PSAnY2xhc3NOYW1lJ1xuICApO1xuICBcbiAgaWYgKCFjbGFzc05hbWVBdHRyKSB7XG4gICAgY29uc3QgbmV3QXR0ciA9IHQuanN4QXR0cmlidXRlKFxuICAgICAgdC5qc3hJZGVudGlmaWVyKCdjbGFzc05hbWUnKSxcbiAgICAgIHQuc3RyaW5nTGl0ZXJhbChuZXdDbGFzc2VzLmpvaW4oJyAnKSlcbiAgICApO1xuICAgIFxuICAgIGlmICghbm9kZS5hdHRyaWJ1dGVzKSB7XG4gICAgICBub2RlLmF0dHJpYnV0ZXMgPSBbXTtcbiAgICB9XG4gICAgbm9kZS5hdHRyaWJ1dGVzLnB1c2gobmV3QXR0cik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgXG4gIGlmICghdC5pc0pTWEF0dHJpYnV0ZShjbGFzc05hbWVBdHRyKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBcbiAgY29uc3QgZXhpc3RpbmdDbGFzc2VzID0gcGFyc2VDbGFzc05hbWVWYWx1ZShjbGFzc05hbWVBdHRyKTtcbiAgY29uc3QgYWxsQ2xhc3NlcyA9IG5ldyBTZXQoWy4uLmV4aXN0aW5nQ2xhc3NlcywgLi4ubmV3Q2xhc3Nlc10pO1xuICBjb25zdCBtZXJnZWRDbGFzc2VzID0gQXJyYXkuZnJvbShhbGxDbGFzc2VzKTtcbiAgXG4gIGlmICh0LmlzU3RyaW5nTGl0ZXJhbChjbGFzc05hbWVBdHRyLnZhbHVlKSkge1xuICAgIGNsYXNzTmFtZUF0dHIudmFsdWUudmFsdWUgPSBtZXJnZWRDbGFzc2VzLmpvaW4oJyAnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBcbiAgaWYgKHQuaXNKU1hFeHByZXNzaW9uQ29udGFpbmVyKGNsYXNzTmFtZUF0dHIudmFsdWUpKSB7XG4gICAgY29uc3QgZXhwciA9IGNsYXNzTmFtZUF0dHIudmFsdWUuZXhwcmVzc2lvbjtcbiAgICBcbiAgICBpZiAodC5pc1N0cmluZ0xpdGVyYWwoZXhwcikpIHtcbiAgICAgIGV4cHIudmFsdWUgPSBtZXJnZWRDbGFzc2VzLmpvaW4oJyAnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICBpZiAodC5pc1RlbXBsYXRlTGl0ZXJhbChleHByKSAmJiBleHByLnF1YXNpcy5sZW5ndGggPiAwICYmIGV4cHIuZXhwcmVzc2lvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBleHByLnF1YXNpc1swXS52YWx1ZS5yYXcgPSBtZXJnZWRDbGFzc2VzLmpvaW4oJyAnKTtcbiAgICAgIGV4cHIucXVhc2lzWzBdLnZhbHVlLmNvb2tlZCA9IG1lcmdlZENsYXNzZXMuam9pbignICcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIFxuICBjbGFzc05hbWVBdHRyLnZhbHVlID0gdC5zdHJpbmdMaXRlcmFsKG1lcmdlZENsYXNzZXMuam9pbignICcpKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHdyYXBJbkZyYWdtZW50KGNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgPD4ke2NvZGV9PC8+YDtcbn1cblxuZnVuY3Rpb24gdW53cmFwRnJhZ21lbnQoY29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvZGUucmVwbGFjZSgvXjw+XFxuPy8sICcnKS5yZXBsYWNlKC9cXG4/PFxcLz4kLywgJycpO1xufVxuXG5mdW5jdGlvbiBuZWVkc0ZyYWdtZW50V3JhcHBpbmcoY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRyaW1tZWQgPSBjb2RlLnRyaW0oKTtcbiAgXG4gIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJzw+JykgfHwgdHJpbW1lZC5zdGFydHNXaXRoKCc8RnJhZ21lbnQnKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBcbiAgY29uc3QgZmlyc3RDaGFyID0gdHJpbW1lZC5zZWFyY2goLzxbYS16QS1aXS8pO1xuICBpZiAoZmlyc3RDaGFyID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICBcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IGluU3RyaW5nID0gZmFsc2U7XG4gIGxldCBzdHJpbmdDaGFyID0gJyc7XG4gIFxuICBmb3IgKGxldCBpID0gZmlyc3RDaGFyOyBpIDwgdHJpbW1lZC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoYXIgPSB0cmltbWVkW2ldO1xuICAgIFxuICAgIGlmIChpblN0cmluZykge1xuICAgICAgaWYgKGNoYXIgPT09IHN0cmluZ0NoYXIgJiYgdHJpbW1lZFtpIC0gMV0gIT09ICdcXFxcJykge1xuICAgICAgICBpblN0cmluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIFxuICAgIGlmIChjaGFyID09PSAnXCInIHx8IGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdgJykge1xuICAgICAgaW5TdHJpbmcgPSB0cnVlO1xuICAgICAgc3RyaW5nQ2hhciA9IGNoYXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRyaW1tZWQuc2xpY2UoaSwgaSArIDIpID09PSAnPC8nKSB7XG4gICAgICBkZXB0aC0tO1xuICAgICAgaSsrO1xuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJzwnICYmIHRyaW1tZWRbaSArIDFdPy5tYXRjaCgvW2EtekEtWl0vKSkge1xuICAgICAgZGVwdGgrKztcbiAgICB9XG4gICAgXG4gICAgaWYgKGRlcHRoID09PSAwICYmIGkgPiBmaXJzdENoYXIpIHtcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHRyaW1tZWQuc2xpY2UoaSArIDEpLnRyaW0oKTtcbiAgICAgIGlmIChyZW1haW5pbmcuc3RhcnRzV2l0aCgnPCcpICYmICFyZW1haW5pbmcuc3RhcnRzV2l0aCgnPC8nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybURlc2NlbmRhbnRTZWxlY3RvcnMoXG4gIGNvZGU6IHN0cmluZyxcbiAgcnVsZXM6IENTU1J1bGVbXVxuKTogRGVzY2VuZGFudFRyYW5zZm9ybVJlc3VsdCB7XG4gIGNvbnN0IGRlc2NlbmRhbnRSdWxlczogRGVzY2VuZGFudFJ1bGVbXSA9IFtdO1xuICBcbiAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgaWYgKHJ1bGUuaXNEZXNjZW5kYW50ICYmIHJ1bGUucGFyZW50U2VsZWN0b3IgJiYgcnVsZS50YXJnZXRTZWxlY3Rvcikge1xuICAgICAgaWYgKHJ1bGUuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGRlc2NlbmRhbnRSdWxlcy5wdXNoKHtcbiAgICAgICAgICBwYXJlbnRTZWxlY3RvcjogcnVsZS5wYXJlbnRTZWxlY3RvcixcbiAgICAgICAgICB0YXJnZXRTZWxlY3RvcjogcnVsZS50YXJnZXRTZWxlY3RvcixcbiAgICAgICAgICB1dGlsaXRpZXM6IHJ1bGUudXRpbGl0aWVzLFxuICAgICAgICAgIHNlbGVjdG9yOiBydWxlLnNlbGVjdG9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgaWYgKGRlc2NlbmRhbnRSdWxlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZSxcbiAgICAgIGhhc0NoYW5nZXM6IGZhbHNlLFxuICAgICAgdHJhbnNmb3JtYXRpb25zOiAwLFxuICAgICAgd2FybmluZ3M6IFtdXG4gICAgfTtcbiAgfVxuICBcbiAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcbiAgbGV0IHRyYW5zZm9ybWF0aW9ucyA9IDA7XG4gIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICBcbiAgY29uc3QgbmVlZHNXcmFwcGluZyA9IG5lZWRzRnJhZ21lbnRXcmFwcGluZyhjb2RlKTtcbiAgY29uc3QgY29kZVRvUGFyc2UgPSBuZWVkc1dyYXBwaW5nID8gd3JhcEluRnJhZ21lbnQoY29kZSkgOiBjb2RlO1xuICBcbiAgdHJ5IHtcbiAgICBjb25zdCBhc3QgPSBwYXJzZShjb2RlVG9QYXJzZSwge1xuICAgICAgc291cmNlVHlwZTogJ21vZHVsZScsXG4gICAgICBhbGxvd0ltcG9ydEV4cG9ydEV2ZXJ5d2hlcmU6IHRydWUsXG4gICAgICBhbGxvd1JldHVybk91dHNpZGVGdW5jdGlvbjogdHJ1ZSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgJ2pzeCcsXG4gICAgICAgICd0eXBlc2NyaXB0JyxcbiAgICAgICAgJ2RlY29yYXRvcnMtbGVnYWN5JyxcbiAgICAgICAgJ2NsYXNzUHJvcGVydGllcycsXG4gICAgICAgICdvcHRpb25hbENoYWluaW5nJyxcbiAgICAgICAgJ251bGxpc2hDb2FsZXNjaW5nT3BlcmF0b3InLFxuICAgICAgICAnZHluYW1pY0ltcG9ydCdcbiAgICAgIF1cbiAgICB9KTtcbiAgICBcbiAgICB0cmF2ZXJzZShhc3QsIHtcbiAgICAgIEpTWE9wZW5pbmdFbGVtZW50KHBhdGgpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHBhdGgubm9kZTtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBkZXNjZW5kYW50UnVsZXMpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudE1hdGNoZXNTZWxlY3Rvcihub2RlLCBydWxlLnBhcmVudFNlbGVjdG9yKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGgucGFyZW50UGF0aDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFwYXJlbnRQYXRoKSBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYXBwbGllZENsYXNzZXMgPSBhcHBseVRvRGVzY2VuZGFudHMocGFyZW50UGF0aCwgcnVsZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChhcHBsaWVkQ2xhc3NlcyA+IDApIHtcbiAgICAgICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9ucyArPSBhcHBsaWVkQ2xhc3NlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICBjb25zdCBvdXRwdXQgPSBnZW5lcmF0ZShhc3QsIHtcbiAgICAgIHJldGFpbkxpbmVzOiB0cnVlLFxuICAgICAgcmV0YWluRnVuY3Rpb25QYXJlbnM6IHRydWUsXG4gICAgICBjb21tZW50czogdHJ1ZVxuICAgIH0pO1xuICAgIFxuICAgIGxldCBvdXRwdXRDb2RlID0gb3V0cHV0LmNvZGU7XG4gICAgaWYgKG5lZWRzV3JhcHBpbmcpIHtcbiAgICAgIG91dHB1dENvZGUgPSB1bndyYXBGcmFnbWVudChvdXRwdXRDb2RlKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IG91dHB1dENvZGUsXG4gICAgICBoYXNDaGFuZ2VzLFxuICAgICAgdHJhbnNmb3JtYXRpb25zLFxuICAgICAgd2FybmluZ3NcbiAgICB9O1xuICAgIFxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHRyYW5zZm9ybSBkZXNjZW5kYW50IHNlbGVjdG9yczonLCBlcnJvcik7XG4gICAgd2FybmluZ3MucHVzaChgRGVzY2VuZGFudCB0cmFuc2Zvcm1hdGlvbiBmYWlsZWQ6ICR7ZXJyb3J9YCk7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGUsXG4gICAgICBoYXNDaGFuZ2VzOiBmYWxzZSxcbiAgICAgIHRyYW5zZm9ybWF0aW9uczogMCxcbiAgICAgIHdhcm5pbmdzXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseVRvRGVzY2VuZGFudHMoXG4gIHBhcmVudFBhdGg6IGFueSxcbiAgcnVsZTogRGVzY2VuZGFudFJ1bGVcbik6IG51bWJlciB7XG4gIGxldCBhcHBsaWVkQ291bnQgPSAwO1xuICBjb25zdCB1dGlsaXRpZXNXaXRoTWV0YTogVXRpbGl0eVdpdGhNZXRhW10gPSBydWxlLnV0aWxpdGllcy5tYXAodSA9PiAoe1xuICAgIHZhbHVlOiB1LnZhbHVlLFxuICAgIHZhcmlhbnRzOiB1LnZhcmlhbnRzLFxuICAgIGNzc1Byb3BlcnR5OiB1LmNzc1Byb3BlcnR5LFxuICAgIHNwZWNpZmljaXR5OiB1LnNwZWNpZmljaXR5LFxuICAgIHNvdXJjZU9yZGVyOiB1LnNvdXJjZU9yZGVyLFxuICAgIG9yaWdpbmFsU2VsZWN0b3I6IHJ1bGUuc2VsZWN0b3JcbiAgfSkpO1xuICBcbiAgY29uc3QgeyByZXNvbHZlZCB9ID0gcmVzb2x2ZUNvbmZsaWN0cyh1dGlsaXRpZXNXaXRoTWV0YSwgZmFsc2UpO1xuICBjb25zdCBuZXdDbGFzc2VzID0gcmVzb2x2ZWRVdGlsaXRpZXNUb1N0cmluZ3MocmVzb2x2ZWQpO1xuICBcbiAgY29uc3QgcGFyZW50Tm9kZSA9IHBhcmVudFBhdGgubm9kZTtcbiAgXG4gIGlmICghcGFyZW50Tm9kZSkge1xuICAgIHJldHVybiBhcHBsaWVkQ291bnQ7XG4gIH1cbiAgXG4gIGlmICh0LmlzSlNYRWxlbWVudChwYXJlbnROb2RlKSkge1xuICAgIGlmIChwYXJlbnROb2RlLmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHBhcmVudE5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKHQuaXNKU1hFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICAgIGFwcGxpZWRDb3VudCArPSBhcHBseVRvSlNYRWxlbWVudChjaGlsZCwgcnVsZSwgbmV3Q2xhc3Nlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiBhcHBsaWVkQ291bnQ7XG59XG5cbmZ1bmN0aW9uIGFwcGx5VG9KU1hFbGVtZW50KFxuICBlbGVtZW50OiB0LkpTWEVsZW1lbnQsXG4gIHJ1bGU6IERlc2NlbmRhbnRSdWxlLFxuICBuZXdDbGFzc2VzOiBzdHJpbmdbXVxuKTogbnVtYmVyIHtcbiAgbGV0IGFwcGxpZWRDb3VudCA9IDA7XG4gIFxuICBpZiAoZWxlbWVudE1hdGNoZXNTZWxlY3RvcihlbGVtZW50Lm9wZW5pbmdFbGVtZW50LCBydWxlLnRhcmdldFNlbGVjdG9yKSkge1xuICAgIGlmIChtZXJnZUNsYXNzZXNJbnRvQXR0cmlidXRlKGVsZW1lbnQub3BlbmluZ0VsZW1lbnQsIG5ld0NsYXNzZXMpKSB7XG4gICAgICBhcHBsaWVkQ291bnQrKztcbiAgICAgIFxuICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBnZXRKU1hFbGVtZW50TmFtZShlbGVtZW50Lm9wZW5pbmdFbGVtZW50KTtcbiAgICAgIGxvZ2dlci52ZXJib3NlKGBBcHBsaWVkIGRlc2NlbmRhbnQgY2xhc3NlcyB0byA8JHtlbGVtZW50TmFtZX0+OiAke25ld0NsYXNzZXMuam9pbignICcpfWApO1xuICAgIH1cbiAgfVxuICBcbiAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsZW1lbnQuY2hpbGRyZW4pIHtcbiAgICAgIGlmICh0LmlzSlNYRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgYXBwbGllZENvdW50ICs9IGFwcGx5VG9KU1hFbGVtZW50KGNoaWxkLCBydWxlLCBuZXdDbGFzc2VzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiBhcHBsaWVkQ291bnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncm91cERlc2NlbmRhbnRSdWxlc0J5UGFyZW50KHJ1bGVzOiBDU1NSdWxlW10pOiBNYXA8c3RyaW5nLCBEZXNjZW5kYW50UnVsZVtdPiB7XG4gIGNvbnN0IGdyb3VwZWQgPSBuZXcgTWFwPHN0cmluZywgRGVzY2VuZGFudFJ1bGVbXT4oKTtcbiAgXG4gIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgIGlmIChydWxlLmlzRGVzY2VuZGFudCAmJiBydWxlLnBhcmVudFNlbGVjdG9yICYmIHJ1bGUudGFyZ2V0U2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IHBhcmVudEtleSA9IHJ1bGUucGFyZW50U2VsZWN0b3IudHlwZSA9PT0gJ2NsYXNzJyBcbiAgICAgICAgPyBgLiR7cnVsZS5wYXJlbnRTZWxlY3Rvci5uYW1lfWAgXG4gICAgICAgIDogcnVsZS5wYXJlbnRTZWxlY3Rvci5uYW1lO1xuICAgICAgXG4gICAgICBpZiAoIWdyb3VwZWQuaGFzKHBhcmVudEtleSkpIHtcbiAgICAgICAgZ3JvdXBlZC5zZXQocGFyZW50S2V5LCBbXSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGdyb3VwZWQuZ2V0KHBhcmVudEtleSkhLnB1c2goe1xuICAgICAgICBwYXJlbnRTZWxlY3RvcjogcnVsZS5wYXJlbnRTZWxlY3RvcixcbiAgICAgICAgdGFyZ2V0U2VsZWN0b3I6IHJ1bGUudGFyZ2V0U2VsZWN0b3IsXG4gICAgICAgIHV0aWxpdGllczogcnVsZS51dGlsaXRpZXMsXG4gICAgICAgIHNlbGVjdG9yOiBydWxlLnNlbGVjdG9yXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiBncm91cGVkO1xufSJdfQ==
|