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.
@@ -1,7 +1,15 @@
1
1
  import { TailwindMapper, CSSProperty } from './tailwindMapper';
2
+ import { Specificity } from './utils/specificityCalculator';
2
3
  export interface UtilityWithVariant {
3
4
  value: string;
4
5
  variants: string[];
6
+ cssProperty: string;
7
+ specificity: Specificity;
8
+ sourceOrder: number;
9
+ }
10
+ export interface SelectorTarget {
11
+ type: 'class' | 'element';
12
+ name: string;
5
13
  }
6
14
  export interface CSSRule {
7
15
  selector: string;
@@ -13,6 +21,9 @@ export interface CSSRule {
13
21
  fullyConverted: boolean;
14
22
  partialConversion: boolean;
15
23
  reason?: string;
24
+ isDescendant: boolean;
25
+ parentSelector?: SelectorTarget;
26
+ targetSelector?: SelectorTarget;
16
27
  }
17
28
  export interface CSSParseResult {
18
29
  css: string;
@@ -27,9 +38,13 @@ export interface CSSUsageMap {
27
38
  export declare class CSSParser {
28
39
  private mapper;
29
40
  private breakpoints;
41
+ private sourceOrderCounter;
30
42
  constructor(mapper: TailwindMapper, screens?: Record<string, string | [string, string]>);
43
+ private resetSourceOrder;
44
+ private getNextSourceOrder;
31
45
  private convertDeclarations;
32
- private processRuleWithVariants;
46
+ private processSimpleRule;
47
+ private processDescendantRule;
33
48
  parse(css: string, filePath: string): Promise<CSSParseResult>;
34
49
  parseInternalStyle(html: string): {
35
50
  styles: Array<{
package/dist/cssParser.js CHANGED
@@ -9,15 +9,24 @@ const postcss_safe_parser_1 = __importDefault(require("postcss-safe-parser"));
9
9
  const logger_1 = require("./utils/logger");
10
10
  const breakpointResolver_1 = require("./utils/breakpointResolver");
11
11
  const pseudoSelectorResolver_1 = require("./utils/pseudoSelectorResolver");
12
+ const descendantSelectorResolver_1 = require("./utils/descendantSelectorResolver");
12
13
  const variantAssembler_1 = require("./utils/variantAssembler");
14
+ const specificityCalculator_1 = require("./utils/specificityCalculator");
13
15
  class CSSParser {
14
16
  constructor(mapper, screens) {
17
+ this.sourceOrderCounter = 0;
15
18
  this.mapper = mapper;
16
19
  this.breakpoints = screens
17
20
  ? (0, breakpointResolver_1.resolveBreakpointsFromConfig)(screens)
18
21
  : (0, breakpointResolver_1.getBreakpoints)();
19
22
  }
20
- convertDeclarations(declarations) {
23
+ resetSourceOrder() {
24
+ this.sourceOrderCounter = 0;
25
+ }
26
+ getNextSourceOrder() {
27
+ return ++this.sourceOrderCounter;
28
+ }
29
+ convertDeclarations(declarations, specificity, sourceOrder) {
21
30
  const conversionResults = [];
22
31
  const conversionWarnings = [];
23
32
  declarations.forEach(decl => {
@@ -35,11 +44,14 @@ class CSSParser {
35
44
  .filter(r => r.converted && r.className)
36
45
  .map(r => ({
37
46
  value: r.className,
38
- variants: []
47
+ variants: [],
48
+ cssProperty: r.declaration.property,
49
+ specificity,
50
+ sourceOrder
39
51
  }));
40
52
  return { utilities, conversionResults, conversionWarnings };
41
53
  }
42
- processRuleWithVariants(rule, additionalVariants = []) {
54
+ processSimpleRule(rule, additionalVariants = []) {
43
55
  const selector = rule.selector;
44
56
  const parsedSelectors = (0, pseudoSelectorResolver_1.parseMultipleSelectors)(selector);
45
57
  const validSelectors = parsedSelectors.filter(s => !s.isComplex && s.baseClass);
@@ -62,18 +74,24 @@ class CSSParser {
62
74
  if (declarations.length === 0) {
63
75
  return null;
64
76
  }
65
- const { utilities, conversionResults, conversionWarnings } = this.convertDeclarations(declarations);
66
- const utilitiesWithVariants = utilities.map(u => ({
67
- value: u.value,
68
- variants: (0, variantAssembler_1.normalizeVariantOrder)([...u.variants, ...additionalVariants])
69
- }));
70
77
  const cssRules = [];
71
78
  const allConversionResults = [];
79
+ const allConversionWarnings = [];
72
80
  for (const parsed of validSelectors) {
81
+ const sourceOrder = this.getNextSourceOrder();
82
+ const specificity = (0, specificityCalculator_1.calculateSelectorSpecificity)(selector);
83
+ const pseudoCount = (parsed.pseudos || []).length;
84
+ const specificityWithPseudo = {
85
+ inline: specificity.inline,
86
+ id: specificity.id,
87
+ class: specificity.class + pseudoCount,
88
+ element: specificity.element
89
+ };
90
+ const { utilities, conversionResults, conversionWarnings } = this.convertDeclarations(declarations, specificityWithPseudo, sourceOrder);
73
91
  const pseudoVariants = parsed.pseudos || [];
74
92
  const allVariants = (0, variantAssembler_1.normalizeVariantOrder)([...pseudoVariants, ...additionalVariants]);
75
93
  const utilitiesForSelector = utilities.map(u => ({
76
- value: u.value,
94
+ ...u,
77
95
  variants: allVariants
78
96
  }));
79
97
  const convertedClasses = (0, variantAssembler_1.assembleUtilities)(utilitiesForSelector);
@@ -88,14 +106,67 @@ class CSSParser {
88
106
  skipped: !someDeclarationsConverted,
89
107
  fullyConverted: allDeclarationsConverted,
90
108
  partialConversion: someDeclarationsConverted && !allDeclarationsConverted,
91
- reason: !someDeclarationsConverted ? 'No convertible declarations' : undefined
109
+ reason: !someDeclarationsConverted ? 'No convertible declarations' : undefined,
110
+ isDescendant: false
92
111
  };
93
112
  cssRules.push(cssRule);
94
113
  allConversionResults.push(conversionResults);
114
+ allConversionWarnings.push(...conversionWarnings);
95
115
  }
96
- return { cssRules, conversionResults: allConversionResults, conversionWarnings };
116
+ return { cssRules, conversionResults: allConversionResults, conversionWarnings: allConversionWarnings };
117
+ }
118
+ processDescendantRule(rule, additionalVariants = []) {
119
+ const selector = rule.selector;
120
+ const parsed = (0, descendantSelectorResolver_1.parseDescendantSelector)(selector);
121
+ if (parsed.isComplex || !parsed.parent) {
122
+ return null;
123
+ }
124
+ const declarations = [];
125
+ rule.walkDecls((decl) => {
126
+ if (decl.prop.startsWith('--')) {
127
+ return;
128
+ }
129
+ if (decl.value.includes('calc(')) {
130
+ return;
131
+ }
132
+ declarations.push({
133
+ property: decl.prop,
134
+ value: decl.value
135
+ });
136
+ });
137
+ if (declarations.length === 0) {
138
+ return null;
139
+ }
140
+ const sourceOrder = this.getNextSourceOrder();
141
+ const specificity = (0, specificityCalculator_1.calculateDescendantSpecificity)(parsed.parent.type, parsed.parent.name, parsed.target.type, parsed.target.name);
142
+ const { utilities, conversionResults, conversionWarnings } = this.convertDeclarations(declarations, specificity, sourceOrder);
143
+ const utilitiesWithVariants = utilities.map(u => ({
144
+ ...u,
145
+ variants: (0, variantAssembler_1.normalizeVariantOrder)([...u.variants, ...additionalVariants])
146
+ }));
147
+ const convertedClasses = (0, variantAssembler_1.assembleUtilities)(utilitiesWithVariants);
148
+ const allDeclarationsConverted = conversionResults.every(r => r.converted);
149
+ const someDeclarationsConverted = convertedClasses.length > 0;
150
+ const className = parsed.parent.type === 'class' ? parsed.parent.name : '';
151
+ const targetName = parsed.target.type === 'class' ? `.${parsed.target.name}` : parsed.target.name;
152
+ const cssRule = {
153
+ selector: selector,
154
+ className,
155
+ declarations,
156
+ convertedClasses,
157
+ utilities: utilitiesWithVariants,
158
+ skipped: !someDeclarationsConverted,
159
+ fullyConverted: allDeclarationsConverted,
160
+ partialConversion: someDeclarationsConverted && !allDeclarationsConverted,
161
+ reason: !someDeclarationsConverted ? 'No convertible declarations' : undefined,
162
+ isDescendant: true,
163
+ parentSelector: parsed.parent,
164
+ targetSelector: parsed.target
165
+ };
166
+ return { cssRule, conversionResults, conversionWarnings };
97
167
  }
98
168
  async parse(css, filePath) {
169
+ this.resetSourceOrder();
99
170
  const rules = [];
100
171
  const warnings = [];
101
172
  let hasChanges = false;
@@ -119,21 +190,46 @@ class CSSParser {
119
190
  nestedRules.push(rule);
120
191
  });
121
192
  for (const rule of nestedRules) {
122
- const result = this.processRuleWithVariants(rule, [responsiveVariant]);
123
- if (result) {
124
- rules.push(...result.cssRules);
125
- warnings.push(...result.conversionWarnings);
126
- const anyConverted = result.cssRules.some(r => r.convertedClasses.length > 0);
193
+ const descendantResult = this.processDescendantRule(rule, [responsiveVariant]);
194
+ if (descendantResult) {
195
+ rules.push(descendantResult.cssRule);
196
+ warnings.push(...descendantResult.conversionWarnings);
197
+ if (descendantResult.cssRule.convertedClasses.length > 0) {
198
+ hasChanges = true;
199
+ if (descendantResult.cssRule.fullyConverted) {
200
+ rule.remove();
201
+ logger_1.logger.verbose(`Removed descendant rule ${rule.selector} in @media → ${responsiveVariant}`);
202
+ }
203
+ else {
204
+ for (const cr of descendantResult.conversionResults) {
205
+ if (cr.converted) {
206
+ rule.walkDecls((decl) => {
207
+ if (decl.prop === cr.declaration.property && decl.value === cr.declaration.value) {
208
+ decl.remove();
209
+ }
210
+ });
211
+ }
212
+ }
213
+ logger_1.logger.verbose(`Partial conversion of descendant rule in @media → ${responsiveVariant}`);
214
+ }
215
+ }
216
+ continue;
217
+ }
218
+ const simpleResult = this.processSimpleRule(rule, [responsiveVariant]);
219
+ if (simpleResult) {
220
+ rules.push(...simpleResult.cssRules);
221
+ warnings.push(...simpleResult.conversionWarnings);
222
+ const anyConverted = simpleResult.cssRules.some(r => r.convertedClasses.length > 0);
127
223
  if (anyConverted) {
128
224
  hasChanges = true;
129
- const allFullyConverted = result.cssRules.every(r => r.fullyConverted);
225
+ const allFullyConverted = simpleResult.cssRules.every(r => r.fullyConverted);
130
226
  if (allFullyConverted) {
131
227
  rule.remove();
132
- const classNames = result.cssRules.map(r => r.className).join(', .');
228
+ const classNames = simpleResult.cssRules.map(r => r.className).join(', .');
133
229
  logger_1.logger.verbose(`Removed rule .${classNames} in @media (min-width) → ${responsiveVariant}`);
134
230
  }
135
231
  else {
136
- for (const cr of result.conversionResults.flat()) {
232
+ for (const cr of simpleResult.conversionResults.flat()) {
137
233
  if (cr.converted) {
138
234
  rule.walkDecls((decl) => {
139
235
  if (decl.prop === cr.declaration.property && decl.value === cr.declaration.value) {
@@ -159,30 +255,62 @@ class CSSParser {
159
255
  if (rule.parent && rule.parent.type === 'atrule') {
160
256
  return;
161
257
  }
162
- const result = this.processRuleWithVariants(rule);
163
- if (!result) {
164
- const parsedSelectors = (0, pseudoSelectorResolver_1.parseMultipleSelectors)(rule.selector);
165
- const allComplex = parsedSelectors.every(s => s.isComplex);
166
- if (allComplex) {
167
- const reasons = parsedSelectors.map(s => s.reason).filter(Boolean);
168
- warnings.push(...reasons);
258
+ const descendantResult = this.processDescendantRule(rule);
259
+ if (descendantResult) {
260
+ rules.push(descendantResult.cssRule);
261
+ warnings.push(...descendantResult.conversionWarnings);
262
+ if (descendantResult.cssRule.convertedClasses.length > 0) {
263
+ hasChanges = true;
264
+ if (descendantResult.cssRule.fullyConverted) {
265
+ rule.remove();
266
+ logger_1.logger.verbose(`Removed descendant rule ${rule.selector}`);
267
+ }
268
+ else {
269
+ for (const cr of descendantResult.conversionResults) {
270
+ if (cr.converted) {
271
+ rule.walkDecls((decl) => {
272
+ if (decl.prop === cr.declaration.property && decl.value === cr.declaration.value) {
273
+ decl.remove();
274
+ }
275
+ });
276
+ }
277
+ }
278
+ logger_1.logger.verbose(`Partial conversion of descendant rule`);
279
+ }
280
+ }
281
+ return;
282
+ }
283
+ const simpleResult = this.processSimpleRule(rule);
284
+ if (!simpleResult) {
285
+ const parsed = (0, descendantSelectorResolver_1.parseDescendantSelector)(rule.selector);
286
+ if (parsed.isComplex) {
287
+ warnings.push(parsed.reason || `Skipped complex selector: ${rule.selector}`);
169
288
  logger_1.logger.verbose(`Skipping complex selector: ${rule.selector}`);
170
289
  }
290
+ else {
291
+ const parsedSelectors = (0, pseudoSelectorResolver_1.parseMultipleSelectors)(rule.selector);
292
+ const allComplex = parsedSelectors.every(s => s.isComplex);
293
+ if (allComplex) {
294
+ const reasons = parsedSelectors.map(s => s.reason).filter(Boolean);
295
+ warnings.push(...reasons);
296
+ logger_1.logger.verbose(`Skipping complex selector: ${rule.selector}`);
297
+ }
298
+ }
171
299
  return;
172
300
  }
173
- rules.push(...result.cssRules);
174
- warnings.push(...result.conversionWarnings);
175
- const anyConverted = result.cssRules.some(r => r.convertedClasses.length > 0);
301
+ rules.push(...simpleResult.cssRules);
302
+ warnings.push(...simpleResult.conversionWarnings);
303
+ const anyConverted = simpleResult.cssRules.some(r => r.convertedClasses.length > 0);
176
304
  if (anyConverted) {
177
305
  hasChanges = true;
178
- const allFullyConverted = result.cssRules.every(r => r.fullyConverted);
306
+ const allFullyConverted = simpleResult.cssRules.every(r => r.fullyConverted);
179
307
  if (allFullyConverted) {
180
308
  rule.remove();
181
- const classNames = result.cssRules.map(r => r.className).join(', .');
309
+ const classNames = simpleResult.cssRules.map(r => r.className).join(', .');
182
310
  logger_1.logger.verbose(`Removed rule .${classNames} (all declarations converted)`);
183
311
  }
184
312
  else {
185
- for (const cr of result.conversionResults.flat()) {
313
+ for (const cr of simpleResult.conversionResults.flat()) {
186
314
  if (cr.converted) {
187
315
  rule.walkDecls((decl) => {
188
316
  if (decl.prop === cr.declaration.property && decl.value === cr.declaration.value) {
@@ -282,4 +410,4 @@ class CSSParser {
282
410
  }
283
411
  }
284
412
  exports.CSSParser = CSSParser;
285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Nzc1BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBbUU7QUFDbkUsOEVBQTZDO0FBRTdDLDJDQUF3QztBQUN4QyxtRUFLb0M7QUFDcEMsMkVBSXdDO0FBQ3hDLCtEQU1rQztBQStCbEMsTUFBYSxTQUFTO0lBSXBCLFlBQVksTUFBc0IsRUFBRSxPQUFtRDtRQUNyRixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU87WUFDeEIsQ0FBQyxDQUFDLElBQUEsaURBQTRCLEVBQUMsT0FBTyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxJQUFBLG1DQUFjLEdBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sbUJBQW1CLENBQUMsWUFBMkI7UUFLckQsTUFBTSxpQkFBaUIsR0FJbEIsRUFBRSxDQUFDO1FBQ1IsTUFBTSxrQkFBa0IsR0FBYSxFQUFFLENBQUM7UUFFeEMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RSxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssSUFBSTtnQkFDdkQsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2FBQzVCLENBQUMsQ0FBQztZQUNILElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3BDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekMs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LENBQUMsbUNBQW1DLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDL0QsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsSUFBSSxFQUFFLFlBQVk7WUFDbEIsS0FBSyxFQUFFLFFBQVE7WUFDZixVQUFVO1lBQ1YsUUFBUSxFQUFFLFdBQVc7U0FDdEIsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUFZO1FBQzdCLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztRQUU3QixNQUFNLFdBQVcsR0FBRyxtQ0FBbUMsQ0FBQztRQUN4RCxJQUFJLEtBQUssQ0FBQztRQUVWLE9BQU8sQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLDRDQUE0QyxDQUFDO1FBQ2xFLE9BQU8sQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQTNWRCw4QkEyVkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcG9zdGNzcywgeyBSb290LCBSdWxlLCBEZWNsYXJhdGlvbiwgQXRSdWxlIH0gZnJvbSAncG9zdGNzcyc7XG5pbXBvcnQgc2FmZVBhcnNlciBmcm9tICdwb3N0Y3NzLXNhZmUtcGFyc2VyJztcbmltcG9ydCB7IFRhaWx3aW5kTWFwcGVyLCBDU1NQcm9wZXJ0eSB9IGZyb20gJy4vdGFpbHdpbmRNYXBwZXInO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IHsgXG4gIEJyZWFrcG9pbnQsIFxuICBnZXRCcmVha3BvaW50cywgXG4gIHJlc29sdmVCcmVha3BvaW50c0Zyb21Db25maWcsXG4gIHByb2Nlc3NNZWRpYVF1ZXJ5IFxufSBmcm9tICcuL3V0aWxzL2JyZWFrcG9pbnRSZXNvbHZlcic7XG5pbXBvcnQge1xuICBwcm9jZXNzUHNldWRvU2VsZWN0b3IsXG4gIHBhcnNlTXVsdGlwbGVTZWxlY3RvcnMsXG4gIFBhcnNlZFNlbGVjdG9yXG59IGZyb20gJy4vdXRpbHMvcHNldWRvU2VsZWN0b3JSZXNvbHZlcic7XG5pbXBvcnQge1xuICBhc3NlbWJsZVV0aWxpdHksXG4gIGFzc2VtYmxlVXRpbGl0aWVzLFxuICBNZXJnZWRVdGlsaXR5LFxuICBtZXJnZVV0aWxpdGllcyxcbiAgbm9ybWFsaXplVmFyaWFudE9yZGVyXG59IGZyb20gJy4vdXRpbHMvdmFyaWFudEFzc2VtYmxlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXRpbGl0eVdpdGhWYXJpYW50IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgdmFyaWFudHM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENTU1J1bGUge1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuICBjbGFzc05hbWU6IHN0cmluZztcbiAgZGVjbGFyYXRpb25zOiBDU1NQcm9wZXJ0eVtdO1xuICBjb252ZXJ0ZWRDbGFzc2VzOiBzdHJpbmdbXTtcbiAgdXRpbGl0aWVzOiBVdGlsaXR5V2l0aFZhcmlhbnRbXTtcbiAgc2tpcHBlZDogYm9vbGVhbjtcbiAgZnVsbHlDb252ZXJ0ZWQ6IGJvb2xlYW47XG4gIHBhcnRpYWxDb252ZXJzaW9uOiBib29sZWFuO1xuICByZWFzb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUGFyc2VSZXN1bHQge1xuICBjc3M6IHN0cmluZztcbiAgcnVsZXM6IENTU1J1bGVbXTtcbiAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgY2FuRGVsZXRlOiBib29sZWFuO1xuICB3YXJuaW5nczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTVXNhZ2VNYXAge1xuICBbY2xhc3NOYW1lOiBzdHJpbmddOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIENTU1BhcnNlciB7XG4gIHByaXZhdGUgbWFwcGVyOiBUYWlsd2luZE1hcHBlcjtcbiAgcHJpdmF0ZSBicmVha3BvaW50czogQnJlYWtwb2ludFtdO1xuXG4gIGNvbnN0cnVjdG9yKG1hcHBlcjogVGFpbHdpbmRNYXBwZXIsIHNjcmVlbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBbc3RyaW5nLCBzdHJpbmddPikge1xuICAgIHRoaXMubWFwcGVyID0gbWFwcGVyO1xuICAgIHRoaXMuYnJlYWtwb2ludHMgPSBzY3JlZW5zIFxuICAgICAgPyByZXNvbHZlQnJlYWtwb2ludHNGcm9tQ29uZmlnKHNjcmVlbnMpIFxuICAgICAgOiBnZXRCcmVha3BvaW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9uczogQ1NTUHJvcGVydHlbXSk6IHtcbiAgICB1dGlsaXRpZXM6IFV0aWxpdHlXaXRoVmFyaWFudFtdO1xuICAgIGNvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7IGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTsgY29udmVydGVkOiBib29sZWFuOyBjbGFzc05hbWU6IHN0cmluZyB8IG51bGwgfT47XG4gICAgY29udmVyc2lvbldhcm5pbmdzOiBzdHJpbmdbXTtcbiAgfSB7XG4gICAgY29uc3QgY29udmVyc2lvblJlc3VsdHM6IEFycmF5PHtcbiAgICAgIGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTtcbiAgICAgIGNvbnZlcnRlZDogYm9vbGVhbjtcbiAgICAgIGNsYXNzTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICB9PiA9IFtdO1xuICAgIGNvbnN0IGNvbnZlcnNpb25XYXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgIGRlY2xhcmF0aW9ucy5mb3JFYWNoKGRlY2wgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5tYXBwZXIuY29udmVydFByb3BlcnR5KGRlY2wucHJvcGVydHksIGRlY2wudmFsdWUpO1xuICAgICAgY29udmVyc2lvblJlc3VsdHMucHVzaCh7XG4gICAgICAgIGRlY2xhcmF0aW9uOiBkZWNsLFxuICAgICAgICBjb252ZXJ0ZWQ6ICFyZXN1bHQuc2tpcHBlZCAmJiByZXN1bHQuY2xhc3NOYW1lICE9PSBudWxsLFxuICAgICAgICBjbGFzc05hbWU6IHJlc3VsdC5jbGFzc05hbWVcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdC5za2lwcGVkICYmIHJlc3VsdC5yZWFzb24pIHtcbiAgICAgICAgY29udmVyc2lvbldhcm5pbmdzLnB1c2gocmVzdWx0LnJlYXNvbik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB1dGlsaXRpZXM6IFV0aWxpdHlXaXRoVmFyaWFudFtdID0gY29udmVyc2lvblJlc3VsdHNcbiAgICAgIC5maWx0ZXIociA9PiByLmNvbnZlcnRlZCAmJiByLmNsYXNzTmFtZSlcbiAgICAgIC5tYXAociA9PiAoe1xuICAgICAgICB2YWx1ZTogci5jbGFzc05hbWUhLFxuICAgICAgICB2YXJpYW50czogW11cbiAgICAgIH0pKTtcblxuICAgIHJldHVybiB7IHV0aWxpdGllcywgY29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5ncyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzUnVsZVdpdGhWYXJpYW50cyhcbiAgICBydWxlOiBSdWxlLFxuICAgIGFkZGl0aW9uYWxWYXJpYW50czogc3RyaW5nW10gPSBbXVxuICApOiB7IGNzc1J1bGVzOiBDU1NSdWxlW107IGNvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7IGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTsgY29udmVydGVkOiBib29sZWFuOyBjbGFzc05hbWU6IHN0cmluZyB8IG51bGwgfT5bXTsgY29udmVyc2lvbldhcm5pbmdzOiBzdHJpbmdbXSB9IHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yO1xuICAgIGNvbnN0IHBhcnNlZFNlbGVjdG9ycyA9IHBhcnNlTXVsdGlwbGVTZWxlY3RvcnMoc2VsZWN0b3IpO1xuICAgIFxuICAgIGNvbnN0IHZhbGlkU2VsZWN0b3JzID0gcGFyc2VkU2VsZWN0b3JzLmZpbHRlcihzID0+ICFzLmlzQ29tcGxleCAmJiBzLmJhc2VDbGFzcyk7XG4gICAgXG4gICAgaWYgKHZhbGlkU2VsZWN0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjbGFyYXRpb25zOiBDU1NQcm9wZXJ0eVtdID0gW107XG5cbiAgICBydWxlLndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgaWYgKGRlY2wucHJvcC5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlY2wudmFsdWUuaW5jbHVkZXMoJ2NhbGMoJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkZWNsYXJhdGlvbnMucHVzaCh7XG4gICAgICAgIHByb3BlcnR5OiBkZWNsLnByb3AsXG4gICAgICAgIHZhbHVlOiBkZWNsLnZhbHVlXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7IHV0aWxpdGllcywgY29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5ncyB9ID0gdGhpcy5jb252ZXJ0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucyk7XG4gICAgXG4gICAgY29uc3QgdXRpbGl0aWVzV2l0aFZhcmlhbnRzID0gdXRpbGl0aWVzLm1hcCh1ID0+ICh7XG4gICAgICB2YWx1ZTogdS52YWx1ZSxcbiAgICAgIHZhcmlhbnRzOiBub3JtYWxpemVWYXJpYW50T3JkZXIoWy4uLnUudmFyaWFudHMsIC4uLmFkZGl0aW9uYWxWYXJpYW50c10pXG4gICAgfSkpO1xuXG4gICAgY29uc3QgY3NzUnVsZXM6IENTU1J1bGVbXSA9IFtdO1xuICAgIGNvbnN0IGFsbENvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7IGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTsgY29udmVydGVkOiBib29sZWFuOyBjbGFzc05hbWU6IHN0cmluZyB8IG51bGwgfT5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBwYXJzZWQgb2YgdmFsaWRTZWxlY3RvcnMpIHtcbiAgICAgIGNvbnN0IHBzZXVkb1ZhcmlhbnRzID0gcGFyc2VkLnBzZXVkb3MgfHwgW107XG4gICAgICBjb25zdCBhbGxWYXJpYW50cyA9IG5vcm1hbGl6ZVZhcmlhbnRPcmRlcihbLi4ucHNldWRvVmFyaWFudHMsIC4uLmFkZGl0aW9uYWxWYXJpYW50c10pO1xuICAgICAgXG4gICAgICBjb25zdCB1dGlsaXRpZXNGb3JTZWxlY3RvciA9IHV0aWxpdGllcy5tYXAodSA9PiAoe1xuICAgICAgICB2YWx1ZTogdS52YWx1ZSxcbiAgICAgICAgdmFyaWFudHM6IGFsbFZhcmlhbnRzXG4gICAgICB9KSk7XG5cbiAgICAgIGNvbnN0IGNvbnZlcnRlZENsYXNzZXMgPSBhc3NlbWJsZVV0aWxpdGllcyh1dGlsaXRpZXNGb3JTZWxlY3Rvcik7XG5cbiAgICAgIGNvbnN0IGFsbERlY2xhcmF0aW9uc0NvbnZlcnRlZCA9IGNvbnZlcnNpb25SZXN1bHRzLmV2ZXJ5KHIgPT4gci5jb252ZXJ0ZWQpO1xuICAgICAgY29uc3Qgc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCA9IGNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMDtcblxuICAgICAgY29uc3QgY3NzUnVsZTogQ1NTUnVsZSA9IHtcbiAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICBjbGFzc05hbWU6IHBhcnNlZC5iYXNlQ2xhc3MsXG4gICAgICAgIGRlY2xhcmF0aW9ucyxcbiAgICAgICAgY29udmVydGVkQ2xhc3NlcyxcbiAgICAgICAgdXRpbGl0aWVzOiB1dGlsaXRpZXNGb3JTZWxlY3RvcixcbiAgICAgICAgc2tpcHBlZDogIXNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICAgIGZ1bGx5Q29udmVydGVkOiBhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICAgIHBhcnRpYWxDb252ZXJzaW9uOiBzb21lRGVjbGFyYXRpb25zQ29udmVydGVkICYmICFhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICAgIHJlYXNvbjogIXNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgPyAnTm8gY29udmVydGlibGUgZGVjbGFyYXRpb25zJyA6IHVuZGVmaW5lZFxuICAgICAgfTtcblxuICAgICAgY3NzUnVsZXMucHVzaChjc3NSdWxlKTtcbiAgICAgIGFsbENvbnZlcnNpb25SZXN1bHRzLnB1c2goY29udmVyc2lvblJlc3VsdHMpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNzc1J1bGVzLCBjb252ZXJzaW9uUmVzdWx0czogYWxsQ29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5ncyB9O1xuICB9XG5cbiAgYXN5bmMgcGFyc2UoY3NzOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENTU1BhcnNlUmVzdWx0PiB7XG4gICAgY29uc3QgcnVsZXM6IENTU1J1bGVbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm9vdCA9IGF3YWl0IHBvc3Rjc3MoKS5wcm9jZXNzKGNzcywge1xuICAgICAgICBwYXJzZXI6IHNhZmVQYXJzZXIsXG4gICAgICAgIGZyb206IGZpbGVQYXRoXG4gICAgICB9KS50aGVuKHJlc3VsdCA9PiByZXN1bHQucm9vdCk7XG5cbiAgICAgIHJvb3Qud2Fsa0F0UnVsZXMoKGF0UnVsZSkgPT4ge1xuICAgICAgICBpZiAoYXRSdWxlLm5hbWUgIT09ICdtZWRpYScpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZWRpYVJlc3VsdCA9IHByb2Nlc3NNZWRpYVF1ZXJ5KGF0UnVsZS5wYXJhbXMsIHRoaXMuYnJlYWtwb2ludHMpO1xuXG4gICAgICAgIGlmIChtZWRpYVJlc3VsdC5za2lwcGVkKSB7XG4gICAgICAgICAgd2FybmluZ3MucHVzaChtZWRpYVJlc3VsdC5yZWFzb24gfHwgYFNraXBwZWQgbWVkaWEgcXVlcnk6ICR7YXRSdWxlLnBhcmFtc31gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zaXZlVmFyaWFudCA9IG1lZGlhUmVzdWx0LmJyZWFrcG9pbnQhO1xuXG4gICAgICAgIGNvbnN0IG5lc3RlZFJ1bGVzOiBSdWxlW10gPSBbXTtcbiAgICAgICAgYXRSdWxlLndhbGtSdWxlcygocnVsZSkgPT4ge1xuICAgICAgICAgIG5lc3RlZFJ1bGVzLnB1c2gocnVsZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBuZXN0ZWRSdWxlcykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucHJvY2Vzc1J1bGVXaXRoVmFyaWFudHMocnVsZSwgW3Jlc3BvbnNpdmVWYXJpYW50XSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcnVsZXMucHVzaCguLi5yZXN1bHQuY3NzUnVsZXMpO1xuICAgICAgICAgICAgd2FybmluZ3MucHVzaCguLi5yZXN1bHQuY29udmVyc2lvbldhcm5pbmdzKTtcblxuICAgICAgICAgICAgY29uc3QgYW55Q29udmVydGVkID0gcmVzdWx0LmNzc1J1bGVzLnNvbWUociA9PiByLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICBpZiAoYW55Q29udmVydGVkKSB7XG4gICAgICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGFsbEZ1bGx5Q29udmVydGVkID0gcmVzdWx0LmNzc1J1bGVzLmV2ZXJ5KHIgPT4gci5mdWxseUNvbnZlcnRlZCk7XG4gICAgICAgICAgICAgIGlmIChhbGxGdWxseUNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgIHJ1bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IHJlc3VsdC5jc3NSdWxlcy5tYXAociA9PiByLmNsYXNzTmFtZSkuam9pbignLCAuJyk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlbW92ZWQgcnVsZSAuJHtjbGFzc05hbWVzfSBpbiBAbWVkaWEgKG1pbi13aWR0aCkg4oaSICR7cmVzcG9uc2l2ZVZhcmlhbnR9YCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjciBvZiByZXN1bHQuY29udmVyc2lvblJlc3VsdHMuZmxhdCgpKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY3IuY29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGUud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2wucHJvcCA9PT0gY3IuZGVjbGFyYXRpb24ucHJvcGVydHkgJiYgZGVjbC52YWx1ZSA9PT0gY3IuZGVjbGFyYXRpb24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFBhcnRpYWwgY29udmVyc2lvbiBpbiBAbWVkaWEg4oaSICR7cmVzcG9uc2l2ZVZhcmlhbnR9YCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2FybmluZ3MucHVzaChgU2tpcHBlZCBydWxlIGluIEBtZWRpYTogJHtydWxlLnNlbGVjdG9yfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdFJ1bGUubm9kZXMgJiYgYXRSdWxlLm5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGF0UnVsZS5yZW1vdmUoKTtcbiAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVtb3ZlZCBlbXB0eSBAbWVkaWEgcnVsZWApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcm9vdC53YWxrUnVsZXMoKHJ1bGUpID0+IHtcbiAgICAgICAgaWYgKHJ1bGUucGFyZW50ICYmIHJ1bGUucGFyZW50LnR5cGUgPT09ICdhdHJ1bGUnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9jZXNzUnVsZVdpdGhWYXJpYW50cyhydWxlKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkU2VsZWN0b3JzID0gcGFyc2VNdWx0aXBsZVNlbGVjdG9ycyhydWxlLnNlbGVjdG9yKTtcbiAgICAgICAgICBjb25zdCBhbGxDb21wbGV4ID0gcGFyc2VkU2VsZWN0b3JzLmV2ZXJ5KHMgPT4gcy5pc0NvbXBsZXgpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChhbGxDb21wbGV4KSB7XG4gICAgICAgICAgICBjb25zdCByZWFzb25zID0gcGFyc2VkU2VsZWN0b3JzLm1hcChzID0+IHMucmVhc29uKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKC4uLnJlYXNvbnMgYXMgc3RyaW5nW10pO1xuICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFNraXBwaW5nIGNvbXBsZXggc2VsZWN0b3I6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcnVsZXMucHVzaCguLi5yZXN1bHQuY3NzUnVsZXMpO1xuICAgICAgICB3YXJuaW5ncy5wdXNoKC4uLnJlc3VsdC5jb252ZXJzaW9uV2FybmluZ3MpO1xuXG4gICAgICAgIGNvbnN0IGFueUNvbnZlcnRlZCA9IHJlc3VsdC5jc3NSdWxlcy5zb21lKHIgPT4gci5jb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDApO1xuICAgICAgICBpZiAoYW55Q29udmVydGVkKSB7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICBjb25zdCBhbGxGdWxseUNvbnZlcnRlZCA9IHJlc3VsdC5jc3NSdWxlcy5ldmVyeShyID0+IHIuZnVsbHlDb252ZXJ0ZWQpO1xuICAgICAgICAgIGlmIChhbGxGdWxseUNvbnZlcnRlZCkge1xuICAgICAgICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSByZXN1bHQuY3NzUnVsZXMubWFwKHIgPT4gci5jbGFzc05hbWUpLmpvaW4oJywgLicpO1xuICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlbW92ZWQgcnVsZSAuJHtjbGFzc05hbWVzfSAoYWxsIGRlY2xhcmF0aW9ucyBjb252ZXJ0ZWQpYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3Igb2YgcmVzdWx0LmNvbnZlcnNpb25SZXN1bHRzLmZsYXQoKSkge1xuICAgICAgICAgICAgICBpZiAoY3IuY29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgcnVsZS53YWxrRGVjbHMoKGRlY2wpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChkZWNsLnByb3AgPT09IGNyLmRlY2xhcmF0aW9uLnByb3BlcnR5ICYmIGRlY2wudmFsdWUgPT09IGNyLmRlY2xhcmF0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY2wucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBQYXJ0aWFsIGNvbnZlcnNpb24gb2YgcnVsZWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJvb3Qud2Fsa0F0UnVsZXMoKGF0UnVsZSkgPT4ge1xuICAgICAgICBpZiAoYXRSdWxlLm5vZGVzICYmIGF0UnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhdFJ1bGUucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjYW5EZWxldGUgPSByb290Lm5vZGVzLmxlbmd0aCA9PT0gMDtcbiAgICAgIGNvbnN0IG5ld0NzcyA9IHJvb3QudG9TdHJpbmcoKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3NzOiBuZXdDc3MsXG4gICAgICAgIHJ1bGVzLFxuICAgICAgICBoYXNDaGFuZ2VzLFxuICAgICAgICBjYW5EZWxldGUsXG4gICAgICAgIHdhcm5pbmdzXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIENTUyAke2ZpbGVQYXRofTpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENTUyBwYXJzaW5nIGZhaWxlZDogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICBwYXJzZUludGVybmFsU3R5bGUoaHRtbDogc3RyaW5nKTogeyBcbiAgICBzdHlsZXM6IEFycmF5PHsgY29udGVudDogc3RyaW5nOyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PjtcbiAgICB3YXJuaW5nczogc3RyaW5nW107XG4gIH0ge1xuICAgIGNvbnN0IHN0eWxlczogQXJyYXk8eyBjb250ZW50OiBzdHJpbmc7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0+ID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCBzdHlsZVJlZ2V4ID0gLzxzdHlsZVtePl0qPihbXFxzXFxTXSo/KTxcXC9zdHlsZT4vZ2k7XG4gICAgbGV0IG1hdGNoO1xuXG4gICAgd2hpbGUgKChtYXRjaCA9IHN0eWxlUmVnZXguZXhlYyhodG1sKSkgIT09IG51bGwpIHtcbiAgICAgIHN0eWxlcy5wdXNoKHtcbiAgICAgICAgY29udGVudDogbWF0Y2hbMV0udHJpbSgpLFxuICAgICAgICBzdGFydDogbWF0Y2guaW5kZXgsXG4gICAgICAgIGVuZDogbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHN0eWxlcywgd2FybmluZ3MgfTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlSW50ZXJuYWxDU1MoaHRtbDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgaHRtbDogc3RyaW5nO1xuICAgIHJ1bGVzOiBDU1NSdWxlW107XG4gICAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgICB3YXJuaW5nczogc3RyaW5nW107XG4gIH0+IHtcbiAgICBjb25zdCBhbGxSdWxlczogQ1NTUnVsZVtdID0gW107XG4gICAgY29uc3QgYWxsV2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG1vZGlmaWVkSHRtbCA9IGh0bWw7XG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHsgc3R5bGVzIH0gPSB0aGlzLnBhcnNlSW50ZXJuYWxTdHlsZShodG1sKTtcblxuICAgIGZvciAobGV0IGkgPSBzdHlsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gc3R5bGVzW2ldO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBhcnNlKHN0eWxlLmNvbnRlbnQsIGZpbGVQYXRoKTtcbiAgICAgICAgXG4gICAgICAgIGFsbFJ1bGVzLnB1c2goLi4ucmVzdWx0LnJ1bGVzKTtcbiAgICAgICAgYWxsV2FybmluZ3MucHVzaCguLi5yZXN1bHQud2FybmluZ3MpO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaGFzQ2hhbmdlcykge1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHJlc3VsdC5jYW5EZWxldGUgfHwgcmVzdWx0LmNzcy50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICBtb2RpZmllZEh0bWwgPSBtb2RpZmllZEh0bWwuc2xpY2UoMCwgc3R5bGUuc3RhcnQpICsgbW9kaWZpZWRIdG1sLnNsaWNlKHN0eWxlLmVuZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IG1vZGlmaWVkSHRtbC5zbGljZSgwLCBzdHlsZS5zdGFydCk7XG4gICAgICAgICAgICBjb25zdCBhZnRlciA9IG1vZGlmaWVkSHRtbC5zbGljZShzdHlsZS5lbmQpO1xuICAgICAgICAgICAgY29uc3QgdGFnU3RhcnQgPSBodG1sLnNsaWNlKHN0eWxlLnN0YXJ0KS5tYXRjaCgvPHN0eWxlW14+XSo+Lyk/LlswXSB8fCAnPHN0eWxlPic7XG4gICAgICAgICAgICBjb25zdCB0YWdFbmQgPSAnPC9zdHlsZT4nO1xuICAgICAgICAgICAgbW9kaWZpZWRIdG1sID0gYmVmb3JlICsgdGFnU3RhcnQgKyAnXFxuJyArIHJlc3VsdC5jc3MgKyAnXFxuJyArIHRhZ0VuZCArIGFmdGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBpbnRlcm5hbCBzdHlsZSBibG9jazogJHtlcnJvcn1gKTtcbiAgICAgICAgYWxsV2FybmluZ3MucHVzaChgRmFpbGVkIHRvIHBhcnNlIGludGVybmFsIHN0eWxlOiAke2Vycm9yfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBodG1sOiBtb2RpZmllZEh0bWwsXG4gICAgICBydWxlczogYWxsUnVsZXMsXG4gICAgICBoYXNDaGFuZ2VzLFxuICAgICAgd2FybmluZ3M6IGFsbFdhcm5pbmdzXG4gICAgfTtcbiAgfVxuXG4gIGV4dHJhY3RJbXBvcnRQYXRocyhjb2RlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICBjb25zdCBpbXBvcnRSZWdleCA9IC9pbXBvcnRcXHMrWydcIl0oW14nXCJdK1xcLmNzcylbJ1wiXTs/L2c7XG4gICAgbGV0IG1hdGNoO1xuICAgIFxuICAgIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1aXJlUmVnZXggPSAvcmVxdWlyZVxccypcXChcXHMqWydcIl0oW14nXCJdK1xcLmNzcylbJ1wiXVxccypcXCkvZztcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVxdWlyZVJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgICBpbXBvcnRzLnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBpbXBvcnRzO1xuICB9XG59Il19
413
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Nzc1BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBbUU7QUFDbkUsOEVBQTZDO0FBRTdDLDJDQUF3QztBQUN4QyxtRUFLb0M7QUFDcEMsMkVBSXdDO0FBQ3hDLG1GQU00QztBQUM1QywrREFNa0M7QUFDbEMseUVBS3VDO0FBMkN2QyxNQUFhLFNBQVM7SUFLcEIsWUFBWSxNQUFzQixFQUFFLE9BQW1EO1FBRi9FLHVCQUFrQixHQUFXLENBQUMsQ0FBQztRQUdyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU87WUFDeEIsQ0FBQyxDQUFDLElBQUEsaURBQTRCLEVBQUMsT0FBTyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxJQUFBLG1DQUFjLEdBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ25DLENBQUM7SUFFTyxtQkFBbUIsQ0FDekIsWUFBMkIsRUFDM0IsV0FBd0IsRUFDeEIsV0FBbUI7UUFNbkIsTUFBTSxpQkFBaUIsR0FJbEIsRUFBRSxDQUFDO1FBQ1IsTUFBTSxrQkFBa0IsR0FBYSxFQUFFLENBQUM7UUFFeEMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RSxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixTQUFTLEVBQUUsQ0FBQyxNQUFNLENB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RCw4QkFpZ0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBvc3Rjc3MsIHsgUm9vdCwgUnVsZSwgRGVjbGFyYXRpb24sIEF0UnVsZSB9IGZyb20gJ3Bvc3Rjc3MnO1xuaW1wb3J0IHNhZmVQYXJzZXIgZnJvbSAncG9zdGNzcy1zYWZlLXBhcnNlcic7XG5pbXBvcnQgeyBUYWlsd2luZE1hcHBlciwgQ1NTUHJvcGVydHkgfSBmcm9tICcuL3RhaWx3aW5kTWFwcGVyJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IFxuICBCcmVha3BvaW50LCBcbiAgZ2V0QnJlYWtwb2ludHMsIFxuICByZXNvbHZlQnJlYWtwb2ludHNGcm9tQ29uZmlnLFxuICBwcm9jZXNzTWVkaWFRdWVyeSBcbn0gZnJvbSAnLi91dGlscy9icmVha3BvaW50UmVzb2x2ZXInO1xuaW1wb3J0IHtcbiAgcHJvY2Vzc1BzZXVkb1NlbGVjdG9yLFxuICBwYXJzZU11bHRpcGxlU2VsZWN0b3JzLFxuICBQYXJzZWRTZWxlY3RvclxufSBmcm9tICcuL3V0aWxzL3BzZXVkb1NlbGVjdG9yUmVzb2x2ZXInO1xuaW1wb3J0IHtcbiAgcGFyc2VEZXNjZW5kYW50U2VsZWN0b3IsXG4gIHByb2Nlc3NEZXNjZW5kYW50U2VsZWN0b3IsXG4gIERlc2NlbmRhbnRTZWxlY3RvcixcbiAgU2VsZWN0b3JQYXJ0LFxuICBpc0h0bWxFbGVtZW50XG59IGZyb20gJy4vdXRpbHMvZGVzY2VuZGFudFNlbGVjdG9yUmVzb2x2ZXInO1xuaW1wb3J0IHtcbiAgYXNzZW1ibGVVdGlsaXR5LFxuICBhc3NlbWJsZVV0aWxpdGllcyxcbiAgTWVyZ2VkVXRpbGl0eSxcbiAgbWVyZ2VVdGlsaXRpZXMsXG4gIG5vcm1hbGl6ZVZhcmlhbnRPcmRlclxufSBmcm9tICcuL3V0aWxzL3ZhcmlhbnRBc3NlbWJsZXInO1xuaW1wb3J0IHtcbiAgU3BlY2lmaWNpdHksXG4gIGNhbGN1bGF0ZVNlbGVjdG9yU3BlY2lmaWNpdHksXG4gIGNhbGN1bGF0ZURlc2NlbmRhbnRTcGVjaWZpY2l0eSxcbiAgWkVST19TUEVDSUZJQ0lUWVxufSBmcm9tICcuL3V0aWxzL3NwZWNpZmljaXR5Q2FsY3VsYXRvcic7XG5pbXBvcnQgeyBnZXRQcm9wZXJ0eUZvclV0aWxpdHkgfSBmcm9tICcuL3V0aWxzL3Byb3BlcnR5TWFwcGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBVdGlsaXR5V2l0aFZhcmlhbnQge1xuICB2YWx1ZTogc3RyaW5nO1xuICB2YXJpYW50czogc3RyaW5nW107XG4gIGNzc1Byb3BlcnR5OiBzdHJpbmc7XG4gIHNwZWNpZmljaXR5OiBTcGVjaWZpY2l0eTtcbiAgc291cmNlT3JkZXI6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RvclRhcmdldCB7XG4gIHR5cGU6ICdjbGFzcycgfCAnZWxlbWVudCc7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDU1NSdWxlIHtcbiAgc2VsZWN0b3I6IHN0cmluZztcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIGRlY2xhcmF0aW9uczogQ1NTUHJvcGVydHlbXTtcbiAgY29udmVydGVkQ2xhc3Nlczogc3RyaW5nW107XG4gIHV0aWxpdGllczogVXRpbGl0eVdpdGhWYXJpYW50W107XG4gIHNraXBwZWQ6IGJvb2xlYW47XG4gIGZ1bGx5Q29udmVydGVkOiBib29sZWFuO1xuICBwYXJ0aWFsQ29udmVyc2lvbjogYm9vbGVhbjtcbiAgcmVhc29uPzogc3RyaW5nO1xuICBpc0Rlc2NlbmRhbnQ6IGJvb2xlYW47XG4gIHBhcmVudFNlbGVjdG9yPzogU2VsZWN0b3JUYXJnZXQ7XG4gIHRhcmdldFNlbGVjdG9yPzogU2VsZWN0b3JUYXJnZXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUGFyc2VSZXN1bHQge1xuICBjc3M6IHN0cmluZztcbiAgcnVsZXM6IENTU1J1bGVbXTtcbiAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgY2FuRGVsZXRlOiBib29sZWFuO1xuICB3YXJuaW5nczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTVXNhZ2VNYXAge1xuICBbY2xhc3NOYW1lOiBzdHJpbmddOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIENTU1BhcnNlciB7XG4gIHByaXZhdGUgbWFwcGVyOiBUYWlsd2luZE1hcHBlcjtcbiAgcHJpdmF0ZSBicmVha3BvaW50czogQnJlYWtwb2ludFtdO1xuICBwcml2YXRlIHNvdXJjZU9yZGVyQ291bnRlcjogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3RvcihtYXBwZXI6IFRhaWx3aW5kTWFwcGVyLCBzY3JlZW5zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgW3N0cmluZywgc3RyaW5nXT4pIHtcbiAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjtcbiAgICB0aGlzLmJyZWFrcG9pbnRzID0gc2NyZWVucyBcbiAgICAgID8gcmVzb2x2ZUJyZWFrcG9pbnRzRnJvbUNvbmZpZyhzY3JlZW5zKSBcbiAgICAgIDogZ2V0QnJlYWtwb2ludHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRTb3VyY2VPcmRlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNvdXJjZU9yZGVyQ291bnRlciA9IDA7XG4gIH1cblxuICBwcml2YXRlIGdldE5leHRTb3VyY2VPcmRlcigpOiBudW1iZXIge1xuICAgIHJldHVybiArK3RoaXMuc291cmNlT3JkZXJDb3VudGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGVjbGFyYXRpb25zKFxuICAgIGRlY2xhcmF0aW9uczogQ1NTUHJvcGVydHlbXSxcbiAgICBzcGVjaWZpY2l0eTogU3BlY2lmaWNpdHksXG4gICAgc291cmNlT3JkZXI6IG51bWJlclxuICApOiB7XG4gICAgdXRpbGl0aWVzOiBVdGlsaXR5V2l0aFZhcmlhbnRbXTtcbiAgICBjb252ZXJzaW9uUmVzdWx0czogQXJyYXk8eyBkZWNsYXJhdGlvbjogQ1NTUHJvcGVydHk7IGNvbnZlcnRlZDogYm9vbGVhbjsgY2xhc3NOYW1lOiBzdHJpbmcgfCBudWxsIH0+O1xuICAgIGNvbnZlcnNpb25XYXJuaW5nczogc3RyaW5nW107XG4gIH0ge1xuICAgIGNvbnN0IGNvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7XG4gICAgICBkZWNsYXJhdGlvbjogQ1NTUHJvcGVydHk7XG4gICAgICBjb252ZXJ0ZWQ6IGJvb2xlYW47XG4gICAgICBjbGFzc05hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgfT4gPSBbXTtcbiAgICBjb25zdCBjb252ZXJzaW9uV2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICBkZWNsYXJhdGlvbnMuZm9yRWFjaChkZWNsID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubWFwcGVyLmNvbnZlcnRQcm9wZXJ0eShkZWNsLnByb3BlcnR5LCBkZWNsLnZhbHVlKTtcbiAgICAgIGNvbnZlcnNpb25SZXN1bHRzLnB1c2goe1xuICAgICAgICBkZWNsYXJhdGlvbjogZGVjbCxcbiAgICAgICAgY29udmVydGVkOiAhcmVzdWx0LnNraXBwZWQgJiYgcmVzdWx0LmNsYXNzTmFtZSAhPT0gbnVsbCxcbiAgICAgICAgY2xhc3NOYW1lOiByZXN1bHQuY2xhc3NOYW1lXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXN1bHQuc2tpcHBlZCAmJiByZXN1bHQucmVhc29uKSB7XG4gICAgICAgIGNvbnZlcnNpb25XYXJuaW5ncy5wdXNoKHJlc3VsdC5yZWFzb24pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgdXRpbGl0aWVzOiBVdGlsaXR5V2l0aFZhcmlhbnRbXSA9IGNvbnZlcnNpb25SZXN1bHRzXG4gICAgICAuZmlsdGVyKHIgPT4gci5jb252ZXJ0ZWQgJiYgci5jbGFzc05hbWUpXG4gICAgICAubWFwKHIgPT4gKHtcbiAgICAgICAgdmFsdWU6IHIuY2xhc3NOYW1lISxcbiAgICAgICAgdmFyaWFudHM6IFtdLFxuICAgICAgICBjc3NQcm9wZXJ0eTogci5kZWNsYXJhdGlvbi5wcm9wZXJ0eSxcbiAgICAgICAgc3BlY2lmaWNpdHksXG4gICAgICAgIHNvdXJjZU9yZGVyXG4gICAgICB9KSk7XG5cbiAgICByZXR1cm4geyB1dGlsaXRpZXMsIGNvbnZlcnNpb25SZXN1bHRzLCBjb252ZXJzaW9uV2FybmluZ3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1NpbXBsZVJ1bGUoXG4gICAgcnVsZTogUnVsZSxcbiAgICBhZGRpdGlvbmFsVmFyaWFudHM6IHN0cmluZ1tdID0gW11cbiAgKTogeyBjc3NSdWxlczogQ1NTUnVsZVtdOyBjb252ZXJzaW9uUmVzdWx0czogQXJyYXk8eyBkZWNsYXJhdGlvbjogQ1NTUHJvcGVydHk7IGNvbnZlcnRlZDogYm9vbGVhbjsgY2xhc3NOYW1lOiBzdHJpbmcgfCBudWxsIH0+W107IGNvbnZlcnNpb25XYXJuaW5nczogc3RyaW5nW10gfSB8IG51bGwge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gcnVsZS5zZWxlY3RvcjtcbiAgICBjb25zdCBwYXJzZWRTZWxlY3RvcnMgPSBwYXJzZU11bHRpcGxlU2VsZWN0b3JzKHNlbGVjdG9yKTtcbiAgICBcbiAgICBjb25zdCB2YWxpZFNlbGVjdG9ycyA9IHBhcnNlZFNlbGVjdG9ycy5maWx0ZXIocyA9PiAhcy5pc0NvbXBsZXggJiYgcy5iYXNlQ2xhc3MpO1xuICAgIFxuICAgIGlmICh2YWxpZFNlbGVjdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY2xhcmF0aW9uczogQ1NTUHJvcGVydHlbXSA9IFtdO1xuXG4gICAgcnVsZS53YWxrRGVjbHMoKGRlY2wpID0+IHtcbiAgICAgIGlmIChkZWNsLnByb3Auc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWNsLnZhbHVlLmluY2x1ZGVzKCdjYWxjKCcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZGVjbGFyYXRpb25zLnB1c2goe1xuICAgICAgICBwcm9wZXJ0eTogZGVjbC5wcm9wLFxuICAgICAgICB2YWx1ZTogZGVjbC52YWx1ZVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY3NzUnVsZXM6IENTU1J1bGVbXSA9IFtdO1xuICAgIGNvbnN0IGFsbENvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7IGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTsgY29udmVydGVkOiBib29sZWFuOyBjbGFzc05hbWU6IHN0cmluZyB8IG51bGwgfT5bXSA9IFtdO1xuICAgIGNvbnN0IGFsbENvbnZlcnNpb25XYXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcGFyc2VkIG9mIHZhbGlkU2VsZWN0b3JzKSB7XG4gICAgICBjb25zdCBzb3VyY2VPcmRlciA9IHRoaXMuZ2V0TmV4dFNvdXJjZU9yZGVyKCk7XG4gICAgICBjb25zdCBzcGVjaWZpY2l0eSA9IGNhbGN1bGF0ZVNlbGVjdG9yU3BlY2lmaWNpdHkoc2VsZWN0b3IpO1xuICAgICAgY29uc3QgcHNldWRvQ291bnQgPSAocGFyc2VkLnBzZXVkb3MgfHwgW10pLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNwZWNpZmljaXR5V2l0aFBzZXVkbyA9IHtcbiAgICAgICAgaW5saW5lOiBzcGVjaWZpY2l0eS5pbmxpbmUsXG4gICAgICAgIGlkOiBzcGVjaWZpY2l0eS5pZCxcbiAgICAgICAgY2xhc3M6IHNwZWNpZmljaXR5LmNsYXNzICsgcHNldWRvQ291bnQsXG4gICAgICAgIGVsZW1lbnQ6IHNwZWNpZmljaXR5LmVsZW1lbnRcbiAgICAgIH07XG4gICAgICBcbiAgICAgIGNvbnN0IHsgdXRpbGl0aWVzLCBjb252ZXJzaW9uUmVzdWx0cywgY29udmVyc2lvbldhcm5pbmdzIH0gPSB0aGlzLmNvbnZlcnREZWNsYXJhdGlvbnMoXG4gICAgICAgIGRlY2xhcmF0aW9ucyxcbiAgICAgICAgc3BlY2lmaWNpdHlXaXRoUHNldWRvLFxuICAgICAgICBzb3VyY2VPcmRlclxuICAgICAgKTtcbiAgICAgIFxuICAgICAgY29uc3QgcHNldWRvVmFyaWFudHMgPSBwYXJzZWQucHNldWRvcyB8fCBbXTtcbiAgICAgIGNvbnN0IGFsbFZhcmlhbnRzID0gbm9ybWFsaXplVmFyaWFudE9yZGVyKFsuLi5wc2V1ZG9WYXJpYW50cywgLi4uYWRkaXRpb25hbFZhcmlhbnRzXSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHV0aWxpdGllc0ZvclNlbGVjdG9yID0gdXRpbGl0aWVzLm1hcCh1ID0+ICh7XG4gICAgICAgIC4uLnUsXG4gICAgICAgIHZhcmlhbnRzOiBhbGxWYXJpYW50c1xuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCBjb252ZXJ0ZWRDbGFzc2VzID0gYXNzZW1ibGVVdGlsaXRpZXModXRpbGl0aWVzRm9yU2VsZWN0b3IpO1xuXG4gICAgICBjb25zdCBhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgPSBjb252ZXJzaW9uUmVzdWx0cy5ldmVyeShyID0+IHIuY29udmVydGVkKTtcbiAgICAgIGNvbnN0IHNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgPSBjb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDA7XG5cbiAgICAgIGNvbnN0IGNzc1J1bGU6IENTU1J1bGUgPSB7XG4gICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgY2xhc3NOYW1lOiBwYXJzZWQuYmFzZUNsYXNzLFxuICAgICAgICBkZWNsYXJhdGlvbnMsXG4gICAgICAgIGNvbnZlcnRlZENsYXNzZXMsXG4gICAgICAgIHV0aWxpdGllczogdXRpbGl0aWVzRm9yU2VsZWN0b3IsXG4gICAgICAgIHNraXBwZWQ6ICFzb21lRGVjbGFyYXRpb25zQ29udmVydGVkLFxuICAgICAgICBmdWxseUNvbnZlcnRlZDogYWxsRGVjbGFyYXRpb25zQ29udmVydGVkLFxuICAgICAgICBwYXJ0aWFsQ29udmVyc2lvbjogc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCAmJiAhYWxsRGVjbGFyYXRpb25zQ29udmVydGVkLFxuICAgICAgICByZWFzb246ICFzb21lRGVjbGFyYXRpb25zQ29udmVydGVkID8gJ05vIGNvbnZlcnRpYmxlIGRlY2xhcmF0aW9ucycgOiB1bmRlZmluZWQsXG4gICAgICAgIGlzRGVzY2VuZGFudDogZmFsc2VcbiAgICAgIH07XG5cbiAgICAgIGNzc1J1bGVzLnB1c2goY3NzUnVsZSk7XG4gICAgICBhbGxDb252ZXJzaW9uUmVzdWx0cy5wdXNoKGNvbnZlcnNpb25SZXN1bHRzKTtcbiAgICAgIGFsbENvbnZlcnNpb25XYXJuaW5ncy5wdXNoKC4uLmNvbnZlcnNpb25XYXJuaW5ncyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY3NzUnVsZXMsIGNvbnZlcnNpb25SZXN1bHRzOiBhbGxDb252ZXJzaW9uUmVzdWx0cywgY29udmVyc2lvbldhcm5pbmdzOiBhbGxDb252ZXJzaW9uV2FybmluZ3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0Rlc2NlbmRhbnRSdWxlKFxuICAgIHJ1bGU6IFJ1bGUsXG4gICAgYWRkaXRpb25hbFZhcmlhbnRzOiBzdHJpbmdbXSA9IFtdXG4gICk6IHsgY3NzUnVsZTogQ1NTUnVsZTsgY29udmVyc2lvblJlc3VsdHM6IEFycmF5PHsgZGVjbGFyYXRpb246IENTU1Byb3BlcnR5OyBjb252ZXJ0ZWQ6IGJvb2xlYW47IGNsYXNzTmFtZTogc3RyaW5nIHwgbnVsbCB9PjsgY29udmVyc2lvbldhcm5pbmdzOiBzdHJpbmdbXSB9IHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yO1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRGVzY2VuZGFudFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICBcbiAgICBpZiAocGFyc2VkLmlzQ29tcGxleCB8fCAhcGFyc2VkLnBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjbGFyYXRpb25zOiBDU1NQcm9wZXJ0eVtdID0gW107XG5cbiAgICBydWxlLndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgaWYgKGRlY2wucHJvcC5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlY2wudmFsdWUuaW5jbHVkZXMoJ2NhbGMoJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkZWNsYXJhdGlvbnMucHVzaCh7XG4gICAgICAgIHByb3BlcnR5OiBkZWNsLnByb3AsXG4gICAgICAgIHZhbHVlOiBkZWNsLnZhbHVlXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VPcmRlciA9IHRoaXMuZ2V0TmV4dFNvdXJjZU9yZGVyKCk7XG4gICAgY29uc3Qgc3BlY2lmaWNpdHkgPSBjYWxjdWxhdGVEZXNjZW5kYW50U3BlY2lmaWNpdHkoXG4gICAgICBwYXJzZWQucGFyZW50LnR5cGUsXG4gICAgICBwYXJzZWQucGFyZW50Lm5hbWUsXG4gICAgICBwYXJzZWQudGFyZ2V0LnR5cGUsXG4gICAgICBwYXJzZWQudGFyZ2V0Lm5hbWVcbiAgICApO1xuXG4gICAgY29uc3QgeyB1dGlsaXRpZXMsIGNvbnZlcnNpb25SZXN1bHRzLCBjb252ZXJzaW9uV2FybmluZ3MgfSA9IHRoaXMuY29udmVydERlY2xhcmF0aW9ucyhcbiAgICAgIGRlY2xhcmF0aW9ucyxcbiAgICAgIHNwZWNpZmljaXR5LFxuICAgICAgc291cmNlT3JkZXJcbiAgICApO1xuICAgIFxuICAgIGNvbnN0IHV0aWxpdGllc1dpdGhWYXJpYW50cyA9IHV0aWxpdGllcy5tYXAodSA9PiAoe1xuICAgICAgLi4udSxcbiAgICAgIHZhcmlhbnRzOiBub3JtYWxpemVWYXJpYW50T3JkZXIoWy4uLnUudmFyaWFudHMsIC4uLmFkZGl0aW9uYWxWYXJpYW50c10pXG4gICAgfSkpO1xuXG4gICAgY29uc3QgY29udmVydGVkQ2xhc3NlcyA9IGFzc2VtYmxlVXRpbGl0aWVzKHV0aWxpdGllc1dpdGhWYXJpYW50cyk7XG5cbiAgICBjb25zdCBhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgPSBjb252ZXJzaW9uUmVzdWx0cy5ldmVyeShyID0+IHIuY29udmVydGVkKTtcbiAgICBjb25zdCBzb21lRGVjbGFyYXRpb25zQ29udmVydGVkID0gY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwO1xuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gcGFyc2VkLnBhcmVudC50eXBlID09PSAnY2xhc3MnID8gcGFyc2VkLnBhcmVudC5uYW1lIDogJyc7XG4gICAgY29uc3QgdGFyZ2V0TmFtZSA9IHBhcnNlZC50YXJnZXQudHlwZSA9PT0gJ2NsYXNzJyA/IGAuJHtwYXJzZWQudGFyZ2V0Lm5hbWV9YCA6IHBhcnNlZC50YXJnZXQubmFtZTtcblxuICAgIGNvbnN0IGNzc1J1bGU6IENTU1J1bGUgPSB7XG4gICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBkZWNsYXJhdGlvbnMsXG4gICAgICBjb252ZXJ0ZWRDbGFzc2VzLFxuICAgICAgdXRpbGl0aWVzOiB1dGlsaXRpZXNXaXRoVmFyaWFudHMsXG4gICAgICBza2lwcGVkOiAhc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCxcbiAgICAgIGZ1bGx5Q29udmVydGVkOiBhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICBwYXJ0aWFsQ29udmVyc2lvbjogc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCAmJiAhYWxsRGVjbGFyYXRpb25zQ29udmVydGVkLFxuICAgICAgcmVhc29uOiAhc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCA/ICdObyBjb252ZXJ0aWJsZSBkZWNsYXJhdGlvbnMnIDogdW5kZWZpbmVkLFxuICAgICAgaXNEZXNjZW5kYW50OiB0cnVlLFxuICAgICAgcGFyZW50U2VsZWN0b3I6IHBhcnNlZC5wYXJlbnQsXG4gICAgICB0YXJnZXRTZWxlY3RvcjogcGFyc2VkLnRhcmdldFxuICAgIH07XG5cbiAgICByZXR1cm4geyBjc3NSdWxlLCBjb252ZXJzaW9uUmVzdWx0cywgY29udmVyc2lvbldhcm5pbmdzIH07XG4gIH1cblxuICBhc3luYyBwYXJzZShjc3M6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Q1NTUGFyc2VSZXN1bHQ+IHtcbiAgICB0aGlzLnJlc2V0U291cmNlT3JkZXIoKTtcbiAgICBjb25zdCBydWxlczogQ1NTUnVsZVtdID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb290ID0gYXdhaXQgcG9zdGNzcygpLnByb2Nlc3MoY3NzLCB7XG4gICAgICAgIHBhcnNlcjogc2FmZVBhcnNlcixcbiAgICAgICAgZnJvbTogZmlsZVBhdGhcbiAgICAgIH0pLnRoZW4ocmVzdWx0ID0+IHJlc3VsdC5yb290KTtcblxuICAgICAgcm9vdC53YWxrQXRSdWxlcygoYXRSdWxlKSA9PiB7XG4gICAgICAgIGlmIChhdFJ1bGUubmFtZSAhPT0gJ21lZGlhJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1lZGlhUmVzdWx0ID0gcHJvY2Vzc01lZGlhUXVlcnkoYXRSdWxlLnBhcmFtcywgdGhpcy5icmVha3BvaW50cyk7XG5cbiAgICAgICAgaWYgKG1lZGlhUmVzdWx0LnNraXBwZWQpIHtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKG1lZGlhUmVzdWx0LnJlYXNvbiB8fCBgU2tpcHBlZCBtZWRpYSBxdWVyeTogJHthdFJ1bGUucGFyYW1zfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNpdmVWYXJpYW50ID0gbWVkaWFSZXN1bHQuYnJlYWtwb2ludCE7XG5cbiAgICAgICAgY29uc3QgbmVzdGVkUnVsZXM6IFJ1bGVbXSA9IFtdO1xuICAgICAgICBhdFJ1bGUud2Fsa1J1bGVzKChydWxlKSA9PiB7XG4gICAgICAgICAgbmVzdGVkUnVsZXMucHVzaChydWxlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIG5lc3RlZFJ1bGVzKSB7XG4gICAgICAgICAgY29uc3QgZGVzY2VuZGFudFJlc3VsdCA9IHRoaXMucHJvY2Vzc0Rlc2NlbmRhbnRSdWxlKHJ1bGUsIFtyZXNwb25zaXZlVmFyaWFudF0pO1xuICAgICAgICAgIGlmIChkZXNjZW5kYW50UmVzdWx0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKGRlc2NlbmRhbnRSZXN1bHQuY3NzUnVsZSk7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKC4uLmRlc2NlbmRhbnRSZXN1bHQuY29udmVyc2lvbldhcm5pbmdzKTtcblxuICAgICAgICAgICAgaWYgKGRlc2NlbmRhbnRSZXN1bHQuY3NzUnVsZS5jb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgaWYgKGRlc2NlbmRhbnRSZXN1bHQuY3NzUnVsZS5mdWxseUNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgIHJ1bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlbW92ZWQgZGVzY2VuZGFudCBydWxlICR7cnVsZS5zZWxlY3Rvcn0gaW4gQG1lZGlhIOKGkiAke3Jlc3BvbnNpdmVWYXJpYW50fWApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3Igb2YgZGVzY2VuZGFudFJlc3VsdC5jb252ZXJzaW9uUmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgaWYgKGNyLmNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICBydWxlLndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNsLnByb3AgPT09IGNyLmRlY2xhcmF0aW9uLnByb3BlcnR5ICYmIGRlY2wudmFsdWUgPT09IGNyLmRlY2xhcmF0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNsLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBQYXJ0aWFsIGNvbnZlcnNpb24gb2YgZGVzY2VuZGFudCBydWxlIGluIEBtZWRpYSDihpIgJHtyZXNwb25zaXZlVmFyaWFudH1gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2ltcGxlUmVzdWx0ID0gdGhpcy5wcm9jZXNzU2ltcGxlUnVsZShydWxlLCBbcmVzcG9uc2l2ZVZhcmlhbnRdKTtcbiAgICAgICAgICBpZiAoc2ltcGxlUmVzdWx0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKC4uLnNpbXBsZVJlc3VsdC5jc3NSdWxlcyk7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKC4uLnNpbXBsZVJlc3VsdC5jb252ZXJzaW9uV2FybmluZ3MpO1xuXG4gICAgICAgICAgICBjb25zdCBhbnlDb252ZXJ0ZWQgPSBzaW1wbGVSZXN1bHQuY3NzUnVsZXMuc29tZShyID0+IHIuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwKTtcbiAgICAgICAgICAgIGlmIChhbnlDb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgY29uc3QgYWxsRnVsbHlDb252ZXJ0ZWQgPSBzaW1wbGVSZXN1bHQuY3NzUnVsZXMuZXZlcnkociA9PiByLmZ1bGx5Q29udmVydGVkKTtcbiAgICAgICAgICAgICAgaWYgKGFsbEZ1bGx5Q29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGFzc05hbWVzID0gc2ltcGxlUmVzdWx0LmNzc1J1bGVzLm1hcChyID0+IHIuY2xhc3NOYW1lKS5qb2luKCcsIC4nKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVtb3ZlZCBydWxlIC4ke2NsYXNzTmFtZXN9IGluIEBtZWRpYSAobWluLXdpZHRoKSDihpIgJHtyZXNwb25zaXZlVmFyaWFudH1gKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNyIG9mIHNpbXBsZVJlc3VsdC5jb252ZXJzaW9uUmVzdWx0cy5mbGF0KCkpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChjci5jb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVsZS53YWxrRGVjbHMoKGRlY2wpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjbC5wcm9wID09PSBjci5kZWNsYXJhdGlvbi5wcm9wZXJ0eSAmJiBkZWNsLnZhbHVlID09PSBjci5kZWNsYXJhdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjbC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUGFydGlhbCBjb252ZXJzaW9uIGluIEBtZWRpYSDihpIgJHtyZXNwb25zaXZlVmFyaWFudH1gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKGBTa2lwcGVkIHJ1bGUgaW4gQG1lZGlhOiAke3J1bGUuc2VsZWN0b3J9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF0UnVsZS5ub2RlcyAmJiBhdFJ1bGUubm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYXRSdWxlLnJlbW92ZSgpO1xuICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBSZW1vdmVkIGVtcHR5IEBtZWRpYSBydWxlYCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByb290LndhbGtSdWxlcygocnVsZSkgPT4ge1xuICAgICAgICBpZiAocnVsZS5wYXJlbnQgJiYgcnVsZS5wYXJlbnQudHlwZSA9PT0gJ2F0cnVsZScpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXNjZW5kYW50UmVzdWx0ID0gdGhpcy5wcm9jZXNzRGVzY2VuZGFudFJ1bGUocnVsZSk7XG4gICAgICAgIGlmIChkZXNjZW5kYW50UmVzdWx0KSB7XG4gICAgICAgICAgcnVsZXMucHVzaChkZXNjZW5kYW50UmVzdWx0LmNzc1J1bGUpO1xuICAgICAgICAgIHdhcm5pbmdzLnB1c2goLi4uZGVzY2VuZGFudFJlc3VsdC5jb252ZXJzaW9uV2FybmluZ3MpO1xuXG4gICAgICAgICAgaWYgKGRlc2NlbmRhbnRSZXN1bHQuY3NzUnVsZS5jb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAoZGVzY2VuZGFudFJlc3VsdC5jc3NSdWxlLmZ1bGx5Q29udmVydGVkKSB7XG4gICAgICAgICAgICAgIHJ1bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBSZW1vdmVkIGRlc2NlbmRhbnQgcnVsZSAke3J1bGUuc2VsZWN0b3J9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNyIG9mIGRlc2NlbmRhbnRSZXN1bHQuY29udmVyc2lvblJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3IuY29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgICBydWxlLndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVjbC5wcm9wID09PSBjci5kZWNsYXJhdGlvbi5wcm9wZXJ0eSAmJiBkZWNsLnZhbHVlID09PSBjci5kZWNsYXJhdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGRlY2wucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUGFydGlhbCBjb252ZXJzaW9uIG9mIGRlc2NlbmRhbnQgcnVsZWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaW1wbGVSZXN1bHQgPSB0aGlzLnByb2Nlc3NTaW1wbGVSdWxlKHJ1bGUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFzaW1wbGVSZXN1bHQpIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZURlc2NlbmRhbnRTZWxlY3RvcihydWxlLnNlbGVjdG9yKTtcbiAgICAgICAgICBpZiAocGFyc2VkLmlzQ29tcGxleCkge1xuICAgICAgICAgICAgd2FybmluZ3MucHVzaChwYXJzZWQucmVhc29uIHx8IGBTa2lwcGVkIGNvbXBsZXggc2VsZWN0b3I6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBTa2lwcGluZyBjb21wbGV4IHNlbGVjdG9yOiAke3J1bGUuc2VsZWN0b3J9YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFNlbGVjdG9ycyA9IHBhcnNlTXVsdGlwbGVTZWxlY3RvcnMocnVsZS5zZWxlY3Rvcik7XG4gICAgICAgICAgICBjb25zdCBhbGxDb21wbGV4ID0gcGFyc2VkU2VsZWN0b3JzLmV2ZXJ5KHMgPT4gcy5pc0NvbXBsZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoYWxsQ29tcGxleCkge1xuICAgICAgICAgICAgICBjb25zdCByZWFzb25zID0gcGFyc2VkU2VsZWN0b3JzLm1hcChzID0+IHMucmVhc29uKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goLi4ucmVhc29ucyBhcyBzdHJpbmdbXSk7XG4gICAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBTa2lwcGluZyBjb21wbGV4IHNlbGVjdG9yOiAke3J1bGUuc2VsZWN0b3J9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bGVzLnB1c2goLi4uc2ltcGxlUmVzdWx0LmNzc1J1bGVzKTtcbiAgICAgICAgd2FybmluZ3MucHVzaCguLi5zaW1wbGVSZXN1bHQuY29udmVyc2lvbldhcm5pbmdzKTtcblxuICAgICAgICBjb25zdCBhbnlDb252ZXJ0ZWQgPSBzaW1wbGVSZXN1bHQuY3NzUnVsZXMuc29tZShyID0+IHIuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwKTtcbiAgICAgICAgaWYgKGFueUNvbnZlcnRlZCkge1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgY29uc3QgYWxsRnVsbHlDb252ZXJ0ZWQgPSBzaW1wbGVSZXN1bHQuY3NzUnVsZXMuZXZlcnkociA9PiByLmZ1bGx5Q29udmVydGVkKTtcbiAgICAgICAgICBpZiAoYWxsRnVsbHlDb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgIHJ1bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICBjb25zdCBjbGFzc05hbWVzID0gc2ltcGxlUmVzdWx0LmNzc1J1bGVzLm1hcChyID0+IHIuY2xhc3NOYW1lKS5qb2luKCcsIC4nKTtcbiAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBSZW1vdmVkIHJ1bGUgLiR7Y2xhc3NOYW1lc30gKGFsbCBkZWNsYXJhdGlvbnMgY29udmVydGVkKWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNyIG9mIHNpbXBsZVJlc3VsdC5jb252ZXJzaW9uUmVzdWx0cy5mbGF0KCkpIHtcbiAgICAgICAgICAgICAgaWYgKGNyLmNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgIHJ1bGUud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoZGVjbC5wcm9wID09PSBjci5kZWNsYXJhdGlvbi5wcm9wZXJ0eSAmJiBkZWNsLnZhbHVlID09PSBjci5kZWNsYXJhdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWNsLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUGFydGlhbCBjb252ZXJzaW9uIG9mIHJ1bGVgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByb290LndhbGtBdFJ1bGVzKChhdFJ1bGUpID0+IHtcbiAgICAgICAgaWYgKGF0UnVsZS5ub2RlcyAmJiBhdFJ1bGUubm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYXRSdWxlLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY2FuRGVsZXRlID0gcm9vdC5ub2Rlcy5sZW5ndGggPT09IDA7XG4gICAgICBjb25zdCBuZXdDc3MgPSByb290LnRvU3RyaW5nKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNzczogbmV3Q3NzLFxuICAgICAgICBydWxlcyxcbiAgICAgICAgaGFzQ2hhbmdlcyxcbiAgICAgICAgY2FuRGVsZXRlLFxuICAgICAgICB3YXJuaW5nc1xuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBDU1MgJHtmaWxlUGF0aH06YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDU1MgcGFyc2luZyBmYWlsZWQ6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VJbnRlcm5hbFN0eWxlKGh0bWw6IHN0cmluZyk6IHsgXG4gICAgc3R5bGVzOiBBcnJheTx7IGNvbnRlbnQ6IHN0cmluZzsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfT47XG4gICAgd2FybmluZ3M6IHN0cmluZ1tdO1xuICB9IHtcbiAgICBjb25zdCBzdHlsZXM6IEFycmF5PHsgY29udGVudDogc3RyaW5nOyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3Qgc3R5bGVSZWdleCA9IC88c3R5bGVbXj5dKj4oW1xcc1xcU10qPyk8XFwvc3R5bGU+L2dpO1xuICAgIGxldCBtYXRjaDtcblxuICAgIHdoaWxlICgobWF0Y2ggPSBzdHlsZVJlZ2V4LmV4ZWMoaHRtbCkpICE9PSBudWxsKSB7XG4gICAgICBzdHlsZXMucHVzaCh7XG4gICAgICAgIGNvbnRlbnQ6IG1hdGNoWzFdLnRyaW0oKSxcbiAgICAgICAgc3RhcnQ6IG1hdGNoLmluZGV4LFxuICAgICAgICBlbmQ6IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdHlsZXMsIHdhcm5pbmdzIH07XG4gIH1cblxuICBhc3luYyBwYXJzZUludGVybmFsQ1NTKGh0bWw6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8e1xuICAgIGh0bWw6IHN0cmluZztcbiAgICBydWxlczogQ1NTUnVsZVtdO1xuICAgIGhhc0NoYW5nZXM6IGJvb2xlYW47XG4gICAgd2FybmluZ3M6IHN0cmluZ1tdO1xuICB9PiB7XG4gICAgY29uc3QgYWxsUnVsZXM6IENTU1J1bGVbXSA9IFtdO1xuICAgIGNvbnN0IGFsbFdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBtb2RpZmllZEh0bWwgPSBodG1sO1xuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICBjb25zdCB7IHN0eWxlcyB9ID0gdGhpcy5wYXJzZUludGVybmFsU3R5bGUoaHRtbCk7XG5cbiAgICBmb3IgKGxldCBpID0gc3R5bGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IHN0eWxlc1tpXTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wYXJzZShzdHlsZS5jb250ZW50LCBmaWxlUGF0aCk7XG4gICAgICAgIFxuICAgICAgICBhbGxSdWxlcy5wdXNoKC4uLnJlc3VsdC5ydWxlcyk7XG4gICAgICAgIGFsbFdhcm5pbmdzLnB1c2goLi4ucmVzdWx0Lndhcm5pbmdzKTtcblxuICAgICAgICBpZiAocmVzdWx0Lmhhc0NoYW5nZXMpIHtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChyZXN1bHQuY2FuRGVsZXRlIHx8IHJlc3VsdC5jc3MudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgbW9kaWZpZWRIdG1sID0gbW9kaWZpZWRIdG1sLnNsaWNlKDAsIHN0eWxlLnN0YXJ0KSArIG1vZGlmaWVkSHRtbC5zbGljZShzdHlsZS5lbmQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBiZWZvcmUgPSBtb2RpZmllZEh0bWwuc2xpY2UoMCwgc3R5bGUuc3RhcnQpO1xuICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSBtb2RpZmllZEh0bWwuc2xpY2Uoc3R5bGUuZW5kKTtcbiAgICAgICAgICAgIGNvbnN0IHRhZ1N0YXJ0ID0gaHRtbC5zbGljZShzdHlsZS5zdGFydCkubWF0Y2goLzxzdHlsZVtePl0qPi8pPy5bMF0gfHwgJzxzdHlsZT4nO1xuICAgICAgICAgICAgY29uc3QgdGFnRW5kID0gJzwvc3R5bGU+JztcbiAgICAgICAgICAgIG1vZGlmaWVkSHRtbCA9IGJlZm9yZSArIHRhZ1N0YXJ0ICsgJ1xcbicgKyByZXN1bHQuY3NzICsgJ1xcbicgKyB0YWdFbmQgKyBhZnRlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gcGFyc2UgaW50ZXJuYWwgc3R5bGUgYmxvY2s6ICR7ZXJyb3J9YCk7XG4gICAgICAgIGFsbFdhcm5pbmdzLnB1c2goYEZhaWxlZCB0byBwYXJzZSBpbnRlcm5hbCBzdHlsZTogJHtlcnJvcn1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaHRtbDogbW9kaWZpZWRIdG1sLFxuICAgICAgcnVsZXM6IGFsbFJ1bGVzLFxuICAgICAgaGFzQ2hhbmdlcyxcbiAgICAgIHdhcm5pbmdzOiBhbGxXYXJuaW5nc1xuICAgIH07XG4gIH1cblxuICBleHRyYWN0SW1wb3J0UGF0aHMoY29kZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW107XG4gICAgXG4gICAgY29uc3QgaW1wb3J0UmVnZXggPSAvaW1wb3J0XFxzK1snXCJdKFteJ1wiXStcXC5jc3MpWydcIl07Py9nO1xuICAgIGxldCBtYXRjaDtcbiAgICBcbiAgICB3aGlsZSAoKG1hdGNoID0gaW1wb3J0UmVnZXguZXhlYyhjb2RlKSkgIT09IG51bGwpIHtcbiAgICAgIGltcG9ydHMucHVzaChtYXRjaFsxXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWlyZVJlZ2V4ID0gL3JlcXVpcmVcXHMqXFwoXFxzKlsnXCJdKFteJ1wiXStcXC5jc3MpWydcIl1cXHMqXFwpL2c7XG4gICAgd2hpbGUgKChtYXRjaCA9IHJlcXVpcmVSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW1wb3J0cztcbiAgfVxufSJdfQ==
package/dist/index.d.ts CHANGED
@@ -2,10 +2,12 @@ export { scanProject, ScannedFile } from './scanner';
2
2
  export { transformFiles, TransformOptions, TransformResults } from './transformer';
3
3
  export { TailwindMapper, CSSProperty, ConversionResult } from './tailwindMapper';
4
4
  export { JSXParser, JSXTransformation, JSXParseResult } from './jsxParser';
5
- export { CSSParser, CSSRule, CSSParseResult, UtilityWithVariant } from './cssParser';
5
+ export { CSSParser, CSSRule, CSSParseResult, UtilityWithVariant, SelectorTarget } from './cssParser';
6
6
  export { FileWriter, FileWriteOptions } from './fileWriter';
7
7
  export { loadTailwindConfig, TailwindConfig } from './utils/config';
8
8
  export { logger } from './utils/logger';
9
9
  export { Breakpoint, MediaQueryInfo, getDefaultBreakpoints, resolveBreakpointsFromConfig, parseMediaQuery, findBreakpointForMinWidth, processMediaQuery, prefixWithBreakpoint } from './utils/breakpointResolver';
10
10
  export { ParsedSelector, PSEUDO_TO_VARIANT, SUPPORTED_PSEUDOS, parseSelector, mapPseudoToVariant, processPseudoSelector, parseMultipleSelectors } from './utils/pseudoSelectorResolver';
11
11
  export { VARIANT_ORDER, isResponsiveVariant, isPseudoVariant, sortVariants, deduplicateVariants, normalizeVariantOrder, assembleUtility, assembleUtilities, mergeUtilities, MergedUtility } from './utils/variantAssembler';
12
+ export { DescendantSelector, SelectorPart, SelectorType, parseDescendantSelector, isDescendantSelector, isSimpleSelector, processDescendantSelector, isHtmlElement } from './utils/descendantSelectorResolver';
13
+ export { transformDescendantSelectors, DescendantTransformResult, groupDescendantRulesByParent } from './jsxDescendantTransformer';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mergeUtilities = exports.assembleUtilities = exports.assembleUtility = exports.normalizeVariantOrder = exports.deduplicateVariants = exports.sortVariants = exports.isPseudoVariant = exports.isResponsiveVariant = exports.VARIANT_ORDER = exports.parseMultipleSelectors = exports.processPseudoSelector = exports.mapPseudoToVariant = exports.parseSelector = exports.SUPPORTED_PSEUDOS = exports.PSEUDO_TO_VARIANT = exports.prefixWithBreakpoint = exports.processMediaQuery = exports.findBreakpointForMinWidth = exports.parseMediaQuery = exports.resolveBreakpointsFromConfig = exports.getDefaultBreakpoints = exports.logger = exports.loadTailwindConfig = exports.FileWriter = exports.CSSParser = exports.JSXParser = exports.TailwindMapper = exports.transformFiles = exports.scanProject = void 0;
3
+ exports.groupDescendantRulesByParent = exports.transformDescendantSelectors = exports.isHtmlElement = exports.processDescendantSelector = exports.isSimpleSelector = exports.isDescendantSelector = exports.parseDescendantSelector = exports.mergeUtilities = exports.assembleUtilities = exports.assembleUtility = exports.normalizeVariantOrder = exports.deduplicateVariants = exports.sortVariants = exports.isPseudoVariant = exports.isResponsiveVariant = exports.VARIANT_ORDER = exports.parseMultipleSelectors = exports.processPseudoSelector = exports.mapPseudoToVariant = exports.parseSelector = exports.SUPPORTED_PSEUDOS = exports.PSEUDO_TO_VARIANT = exports.prefixWithBreakpoint = exports.processMediaQuery = exports.findBreakpointForMinWidth = exports.parseMediaQuery = exports.resolveBreakpointsFromConfig = exports.getDefaultBreakpoints = exports.logger = exports.loadTailwindConfig = exports.FileWriter = exports.CSSParser = exports.JSXParser = exports.TailwindMapper = exports.transformFiles = exports.scanProject = void 0;
4
4
  // Export public API
5
5
  var scanner_1 = require("./scanner");
6
6
  Object.defineProperty(exports, "scanProject", { enumerable: true, get: function () { return scanner_1.scanProject; } });
@@ -42,4 +42,13 @@ Object.defineProperty(exports, "normalizeVariantOrder", { enumerable: true, get:
42
42
  Object.defineProperty(exports, "assembleUtility", { enumerable: true, get: function () { return variantAssembler_1.assembleUtility; } });
43
43
  Object.defineProperty(exports, "assembleUtilities", { enumerable: true, get: function () { return variantAssembler_1.assembleUtilities; } });
44
44
  Object.defineProperty(exports, "mergeUtilities", { enumerable: true, get: function () { return variantAssembler_1.mergeUtilities; } });
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0JBQW9CO0FBQ3BCLHFDQUFxRDtBQUE1QyxzR0FBQSxXQUFXLE9BQUE7QUFDcEIsNkNBQW1GO0FBQTFFLDZHQUFBLGNBQWMsT0FBQTtBQUN2QixtREFBaUY7QUFBeEUsZ0hBQUEsY0FBYyxPQUFBO0FBQ3ZCLHlDQUEyRTtBQUFsRSxzR0FBQSxTQUFTLE9BQUE7QUFDbEIseUNBQXFGO0FBQTVFLHNHQUFBLFNBQVMsT0FBQTtBQUNsQiwyQ0FBNEQ7QUFBbkQsd0dBQUEsVUFBVSxPQUFBO0FBQ25CLHlDQUFvRTtBQUEzRCw0R0FBQSxrQkFBa0IsT0FBQTtBQUMzQix5Q0FBd0M7QUFBL0IsZ0dBQUEsTUFBTSxPQUFBO0FBQ2YsaUVBU29DO0FBTmxDLDJIQUFBLHFCQUFxQixPQUFBO0FBQ3JCLGtJQUFBLDRCQUE0QixPQUFBO0FBQzVCLHFIQUFBLGVBQWUsT0FBQTtBQUNmLCtIQUFBLHlCQUF5QixPQUFBO0FBQ3pCLHVIQUFBLGlCQUFpQixPQUFBO0FBQ2pCLDBIQUFBLG9CQUFvQixPQUFBO0FBRXRCLHlFQVF3QztBQU50QywySEFBQSxpQkFBaUIsT0FBQTtBQUNqQiwySEFBQSxpQkFBaUIsT0FBQTtBQUNqQix1SEFBQSxhQUFhLE9BQUE7QUFDYiw0SEFBQSxrQkFBa0IsT0FBQTtBQUNsQiwrSEFBQSxxQkFBcUIsT0FBQTtBQUNyQixnSUFBQSxzQkFBc0IsT0FBQTtBQUV4Qiw2REFXa0M7QUFWaEMsaUhBQUEsYUFBYSxPQUFBO0FBQ2IsdUhBQUEsbUJBQW1CLE9BQUE7QUFDbkIsbUhBQUEsZUFBZSxPQUFBO0FBQ2YsZ0hBQUEsWUFBWSxPQUFBO0FBQ1osdUhBQUEsbUJBQW1CLE9BQUE7QUFDbkIseUhBQUEscUJBQXFCLE9BQUE7QUFDckIsbUhBQUEsZUFBZSxPQUFBO0FBQ2YscUhBQUEsaUJBQWlCLE9BQUE7QUFDakIsa0hBQUEsY0FBYyxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gRXhwb3J0IHB1YmxpYyBBUElcbmV4cG9ydCB7IHNjYW5Qcm9qZWN0LCBTY2FubmVkRmlsZSB9IGZyb20gJy4vc2Nhbm5lcic7XG5leHBvcnQgeyB0cmFuc2Zvcm1GaWxlcywgVHJhbnNmb3JtT3B0aW9ucywgVHJhbnNmb3JtUmVzdWx0cyB9IGZyb20gJy4vdHJhbnNmb3JtZXInO1xuZXhwb3J0IHsgVGFpbHdpbmRNYXBwZXIsIENTU1Byb3BlcnR5LCBDb252ZXJzaW9uUmVzdWx0IH0gZnJvbSAnLi90YWlsd2luZE1hcHBlcic7XG5leHBvcnQgeyBKU1hQYXJzZXIsIEpTWFRyYW5zZm9ybWF0aW9uLCBKU1hQYXJzZVJlc3VsdCB9IGZyb20gJy4vanN4UGFyc2VyJztcbmV4cG9ydCB7IENTU1BhcnNlciwgQ1NTUnVsZSwgQ1NTUGFyc2VSZXN1bHQsIFV0aWxpdHlXaXRoVmFyaWFudCB9IGZyb20gJy4vY3NzUGFyc2VyJztcbmV4cG9ydCB7IEZpbGVXcml0ZXIsIEZpbGVXcml0ZU9wdGlvbnMgfSBmcm9tICcuL2ZpbGVXcml0ZXInO1xuZXhwb3J0IHsgbG9hZFRhaWx3aW5kQ29uZmlnLCBUYWlsd2luZENvbmZpZyB9IGZyb20gJy4vdXRpbHMvY29uZmlnJztcbmV4cG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vdXRpbHMvbG9nZ2VyJztcbmV4cG9ydCB7XG4gIEJyZWFrcG9pbnQsXG4gIE1lZGlhUXVlcnlJbmZvLFxuICBnZXREZWZhdWx0QnJlYWtwb2ludHMsXG4gIHJlc29sdmVCcmVha3BvaW50c0Zyb21Db25maWcsXG4gIHBhcnNlTWVkaWFRdWVyeSxcbiAgZmluZEJyZWFrcG9pbnRGb3JNaW5XaWR0aCxcbiAgcHJvY2Vzc01lZGlhUXVlcnksXG4gIHByZWZpeFdpdGhCcmVha3BvaW50XG59IGZyb20gJy4vdXRpbHMvYnJlYWtwb2ludFJlc29sdmVyJztcbmV4cG9ydCB7XG4gIFBhcnNlZFNlbGVjdG9yLFxuICBQU0VVRE9fVE9fVkFSSUFOVCxcbiAgU1VQUE9SVEVEX1BTRVVET1MsXG4gIHBhcnNlU2VsZWN0b3IsXG4gIG1hcFBzZXVkb1RvVmFyaWFudCxcbiAgcHJvY2Vzc1BzZXVkb1NlbGVjdG9yLFxuICBwYXJzZU11bHRpcGxlU2VsZWN0b3JzXG59IGZyb20gJy4vdXRpbHMvcHNldWRvU2VsZWN0b3JSZXNvbHZlcic7XG5leHBvcnQge1xuICBWQVJJQU5UX09SREVSLFxuICBpc1Jlc3BvbnNpdmVWYXJpYW50LFxuICBpc1BzZXVkb1ZhcmlhbnQsXG4gIHNvcnRWYXJpYW50cyxcbiAgZGVkdXBsaWNhdGVWYXJpYW50cyxcbiAgbm9ybWFsaXplVmFyaWFudE9yZGVyLFxuICBhc3NlbWJsZVV0aWxpdHksXG4gIGFzc2VtYmxlVXRpbGl0aWVzLFxuICBtZXJnZVV0aWxpdGllcyxcbiAgTWVyZ2VkVXRpbGl0eVxufSBmcm9tICcuL3V0aWxzL3ZhcmlhbnRBc3NlbWJsZXInO1xuIl19
45
+ var descendantSelectorResolver_1 = require("./utils/descendantSelectorResolver");
46
+ Object.defineProperty(exports, "parseDescendantSelector", { enumerable: true, get: function () { return descendantSelectorResolver_1.parseDescendantSelector; } });
47
+ Object.defineProperty(exports, "isDescendantSelector", { enumerable: true, get: function () { return descendantSelectorResolver_1.isDescendantSelector; } });
48
+ Object.defineProperty(exports, "isSimpleSelector", { enumerable: true, get: function () { return descendantSelectorResolver_1.isSimpleSelector; } });
49
+ Object.defineProperty(exports, "processDescendantSelector", { enumerable: true, get: function () { return descendantSelectorResolver_1.processDescendantSelector; } });
50
+ Object.defineProperty(exports, "isHtmlElement", { enumerable: true, get: function () { return descendantSelectorResolver_1.isHtmlElement; } });
51
+ var jsxDescendantTransformer_1 = require("./jsxDescendantTransformer");
52
+ Object.defineProperty(exports, "transformDescendantSelectors", { enumerable: true, get: function () { return jsxDescendantTransformer_1.transformDescendantSelectors; } });
53
+ Object.defineProperty(exports, "groupDescendantRulesByParent", { enumerable: true, get: function () { return jsxDescendantTransformer_1.groupDescendantRulesByParent; } });
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0JBQW9CO0FBQ3BCLHFDQUFxRDtBQUE1QyxzR0FBQSxXQUFXLE9BQUE7QUFDcEIsNkNBQW1GO0FBQTFFLDZHQUFBLGNBQWMsT0FBQTtBQUN2QixtREFBaUY7QUFBeEUsZ0hBQUEsY0FBYyxPQUFBO0FBQ3ZCLHlDQUEyRTtBQUFsRSxzR0FBQSxTQUFTLE9BQUE7QUFDbEIseUNBQXFHO0FBQTVGLHNHQUFBLFNBQVMsT0FBQTtBQUNsQiwyQ0FBNEQ7QUFBbkQsd0dBQUEsVUFBVSxPQUFBO0FBQ25CLHlDQUFvRTtBQUEzRCw0R0FBQSxrQkFBa0IsT0FBQTtBQUMzQix5Q0FBd0M7QUFBL0IsZ0dBQUEsTUFBTSxPQUFBO0FBQ2YsaUVBU29DO0FBTmxDLDJIQUFBLHFCQUFxQixPQUFBO0FBQ3JCLGtJQUFBLDRCQUE0QixPQUFBO0FBQzVCLHFIQUFBLGVBQWUsT0FBQTtBQUNmLCtIQUFBLHlCQUF5QixPQUFBO0FBQ3pCLHVIQUFBLGlCQUFpQixPQUFBO0FBQ2pCLDBIQUFBLG9CQUFvQixPQUFBO0FBRXRCLHlFQVF3QztBQU50QywySEFBQSxpQkFBaUIsT0FBQTtBQUNqQiwySEFBQSxpQkFBaUIsT0FBQTtBQUNqQix1SEFBQSxhQUFhLE9BQUE7QUFDYiw0SEFBQSxrQkFBa0IsT0FBQTtBQUNsQiwrSEFBQSxxQkFBcUIsT0FBQTtBQUNyQixnSUFBQSxzQkFBc0IsT0FBQTtBQUV4Qiw2REFXa0M7QUFWaEMsaUhBQUEsYUFBYSxPQUFBO0FBQ2IsdUhBQUEsbUJBQW1CLE9BQUE7QUFDbkIsbUhBQUEsZUFBZSxPQUFBO0FBQ2YsZ0hBQUEsWUFBWSxPQUFBO0FBQ1osdUhBQUEsbUJBQW1CLE9BQUE7QUFDbkIseUhBQUEscUJBQXFCLE9BQUE7QUFDckIsbUhBQUEsZUFBZSxPQUFBO0FBQ2YscUhBQUEsaUJBQWlCLE9BQUE7QUFDakIsa0hBQUEsY0FBYyxPQUFBO0FBR2hCLGlGQVM0QztBQUwxQyxxSUFBQSx1QkFBdUIsT0FBQTtBQUN2QixrSUFBQSxvQkFBb0IsT0FBQTtBQUNwQiw4SEFBQSxnQkFBZ0IsT0FBQTtBQUNoQix1SUFBQSx5QkFBeUIsT0FBQTtBQUN6QiwySEFBQSxhQUFhLE9BQUE7QUFFZix1RUFJb0M7QUFIbEMsd0lBQUEsNEJBQTRCLE9BQUE7QUFFNUIsd0lBQUEsNEJBQTRCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBFeHBvcnQgcHVibGljIEFQSVxuZXhwb3J0IHsgc2NhblByb2plY3QsIFNjYW5uZWRGaWxlIH0gZnJvbSAnLi9zY2FubmVyJztcbmV4cG9ydCB7IHRyYW5zZm9ybUZpbGVzLCBUcmFuc2Zvcm1PcHRpb25zLCBUcmFuc2Zvcm1SZXN1bHRzIH0gZnJvbSAnLi90cmFuc2Zvcm1lcic7XG5leHBvcnQgeyBUYWlsd2luZE1hcHBlciwgQ1NTUHJvcGVydHksIENvbnZlcnNpb25SZXN1bHQgfSBmcm9tICcuL3RhaWx3aW5kTWFwcGVyJztcbmV4cG9ydCB7IEpTWFBhcnNlciwgSlNYVHJhbnNmb3JtYXRpb24sIEpTWFBhcnNlUmVzdWx0IH0gZnJvbSAnLi9qc3hQYXJzZXInO1xuZXhwb3J0IHsgQ1NTUGFyc2VyLCBDU1NSdWxlLCBDU1NQYXJzZVJlc3VsdCwgVXRpbGl0eVdpdGhWYXJpYW50LCBTZWxlY3RvclRhcmdldCB9IGZyb20gJy4vY3NzUGFyc2VyJztcbmV4cG9ydCB7IEZpbGVXcml0ZXIsIEZpbGVXcml0ZU9wdGlvbnMgfSBmcm9tICcuL2ZpbGVXcml0ZXInO1xuZXhwb3J0IHsgbG9hZFRhaWx3aW5kQ29uZmlnLCBUYWlsd2luZENvbmZpZyB9IGZyb20gJy4vdXRpbHMvY29uZmlnJztcbmV4cG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vdXRpbHMvbG9nZ2VyJztcbmV4cG9ydCB7XG4gIEJyZWFrcG9pbnQsXG4gIE1lZGlhUXVlcnlJbmZvLFxuICBnZXREZWZhdWx0QnJlYWtwb2ludHMsXG4gIHJlc29sdmVCcmVha3BvaW50c0Zyb21Db25maWcsXG4gIHBhcnNlTWVkaWFRdWVyeSxcbiAgZmluZEJyZWFrcG9pbnRGb3JNaW5XaWR0aCxcbiAgcHJvY2Vzc01lZGlhUXVlcnksXG4gIHByZWZpeFdpdGhCcmVha3BvaW50XG59IGZyb20gJy4vdXRpbHMvYnJlYWtwb2ludFJlc29sdmVyJztcbmV4cG9ydCB7XG4gIFBhcnNlZFNlbGVjdG9yLFxuICBQU0VVRE9fVE9fVkFSSUFOVCxcbiAgU1VQUE9SVEVEX1BTRVVET1MsXG4gIHBhcnNlU2VsZWN0b3IsXG4gIG1hcFBzZXVkb1RvVmFyaWFudCxcbiAgcHJvY2Vzc1BzZXVkb1NlbGVjdG9yLFxuICBwYXJzZU11bHRpcGxlU2VsZWN0b3JzXG59IGZyb20gJy4vdXRpbHMvcHNldWRvU2VsZWN0b3JSZXNvbHZlcic7XG5leHBvcnQge1xuICBWQVJJQU5UX09SREVSLFxuICBpc1Jlc3BvbnNpdmVWYXJpYW50LFxuICBpc1BzZXVkb1ZhcmlhbnQsXG4gIHNvcnRWYXJpYW50cyxcbiAgZGVkdXBsaWNhdGVWYXJpYW50cyxcbiAgbm9ybWFsaXplVmFyaWFudE9yZGVyLFxuICBhc3NlbWJsZVV0aWxpdHksXG4gIGFzc2VtYmxlVXRpbGl0aWVzLFxuICBtZXJnZVV0aWxpdGllcyxcbiAgTWVyZ2VkVXRpbGl0eVxufSBmcm9tICcuL3V0aWxzL3ZhcmlhbnRBc3NlbWJsZXInO1xuZXhwb3J0IHtcbiAgRGVzY2VuZGFudFNlbGVjdG9yLFxuICBTZWxlY3RvclBhcnQsXG4gIFNlbGVjdG9yVHlwZSxcbiAgcGFyc2VEZXNjZW5kYW50U2VsZWN0b3IsXG4gIGlzRGVzY2VuZGFudFNlbGVjdG9yLFxuICBpc1NpbXBsZVNlbGVjdG9yLFxuICBwcm9jZXNzRGVzY2VuZGFudFNlbGVjdG9yLFxuICBpc0h0bWxFbGVtZW50XG59IGZyb20gJy4vdXRpbHMvZGVzY2VuZGFudFNlbGVjdG9yUmVzb2x2ZXInO1xuZXhwb3J0IHtcbiAgdHJhbnNmb3JtRGVzY2VuZGFudFNlbGVjdG9ycyxcbiAgRGVzY2VuZGFudFRyYW5zZm9ybVJlc3VsdCxcbiAgZ3JvdXBEZXNjZW5kYW50UnVsZXNCeVBhcmVudFxufSBmcm9tICcuL2pzeERlc2NlbmRhbnRUcmFuc2Zvcm1lcic7XG4iXX0=
@@ -0,0 +1,16 @@
1
+ import { CSSRule, SelectorTarget, UtilityWithVariant } from './cssParser';
2
+ export interface DescendantTransformResult {
3
+ code: string;
4
+ hasChanges: boolean;
5
+ transformations: number;
6
+ warnings: string[];
7
+ }
8
+ interface DescendantRule {
9
+ parentSelector: SelectorTarget;
10
+ targetSelector: SelectorTarget;
11
+ utilities: UtilityWithVariant[];
12
+ selector: string;
13
+ }
14
+ export declare function transformDescendantSelectors(code: string, rules: CSSRule[]): DescendantTransformResult;
15
+ export declare function groupDescendantRulesByParent(rules: CSSRule[]): Map<string, DescendantRule[]>;
16
+ export {};