postcss 6.0.22 → 7.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of postcss might be problematic. Click here for more details.
- package/CHANGELOG.md +18 -0
- package/README-cn.md +54 -51
- package/README.md +60 -52
- package/docs/architecture.md +2 -2
- package/docs/guidelines/plugin.md +28 -28
- package/docs/guidelines/runner.md +21 -21
- package/docs/source-maps.md +11 -11
- package/docs/syntax.md +23 -23
- package/gulpfile.js +78 -74
- package/lib/at-rule.js +14 -14
- package/lib/comment.js +4 -4
- package/lib/container.js +773 -801
- package/lib/css-syntax-error.js +197 -180
- package/lib/declaration.js +15 -14
- package/lib/input.js +149 -143
- package/lib/lazy-result.js +364 -337
- package/lib/list.js +69 -70
- package/lib/map-generator.js +270 -275
- package/lib/node.js +558 -570
- package/lib/parse.js +20 -21
- package/lib/parser.js +476 -479
- package/lib/postcss.d.ts +1246 -1246
- package/lib/postcss.js +61 -57
- package/lib/previous-map.js +117 -122
- package/lib/processor.js +96 -75
- package/lib/result.js +70 -64
- package/lib/root.js +91 -90
- package/lib/rule.js +12 -12
- package/lib/stringifier.js +295 -295
- package/lib/stringify.js +5 -4
- package/lib/terminal-highlight.js +50 -50
- package/lib/tokenize.js +259 -259
- package/lib/vendor.js +27 -27
- package/lib/warn-once.js +6 -4
- package/lib/warning.js +30 -26
- package/package.json +4 -3
- package/CONTRIBUTING.md +0 -78
package/lib/container.js
CHANGED
@@ -25,11 +25,11 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen
|
|
25
25
|
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
26
26
|
|
27
27
|
function cleanSource(nodes) {
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
return nodes.map(function (i) {
|
29
|
+
if (i.nodes) i.nodes = cleanSource(i.nodes);
|
30
|
+
delete i.source;
|
31
|
+
return i;
|
32
|
+
});
|
33
33
|
}
|
34
34
|
|
35
35
|
/**
|
@@ -44,864 +44,836 @@ function cleanSource(nodes) {
|
|
44
44
|
*/
|
45
45
|
|
46
46
|
var Container = function (_Node) {
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
47
|
+
_inherits(Container, _Node);
|
48
|
+
|
49
|
+
function Container() {
|
50
|
+
_classCallCheck(this, Container);
|
51
|
+
|
52
|
+
return _possibleConstructorReturn(this, _Node.apply(this, arguments));
|
53
|
+
}
|
54
|
+
|
55
|
+
Container.prototype.push = function push(child) {
|
56
|
+
child.parent = this;
|
57
|
+
this.nodes.push(child);
|
58
|
+
return this;
|
59
|
+
};
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Iterates through the container’s immediate children,
|
63
|
+
* calling `callback` for each child.
|
64
|
+
*
|
65
|
+
* Returning `false` in the callback will break iteration.
|
66
|
+
*
|
67
|
+
* This method only iterates through the container’s immediate children.
|
68
|
+
* If you need to recursively iterate through all the container’s descendant
|
69
|
+
* nodes, use {@link Container#walk}.
|
70
|
+
*
|
71
|
+
* Unlike the for `{}`-cycle or `Array#forEach` this iterator is safe
|
72
|
+
* if you are mutating the array of child nodes during iteration.
|
73
|
+
* PostCSS will adjust the current index to match the mutations.
|
74
|
+
*
|
75
|
+
* @param {childIterator} callback Iterator receives each node and index.
|
76
|
+
*
|
77
|
+
* @return {false|undefined} Returns `false` if iteration was broke.
|
78
|
+
*
|
79
|
+
* @example
|
80
|
+
* const root = postcss.parse('a { color: black; z-index: 1 }')
|
81
|
+
* const rule = root.first
|
82
|
+
*
|
83
|
+
* for (const decl of rule.nodes) {
|
84
|
+
* decl.cloneBefore({ prop: '-webkit-' + decl.prop })
|
85
|
+
* // Cycle will be infinite, because cloneBefore moves the current node
|
86
|
+
* // to the next index
|
87
|
+
* }
|
88
|
+
*
|
89
|
+
* rule.each(decl => {
|
90
|
+
* decl.cloneBefore({ prop: '-webkit-' + decl.prop })
|
91
|
+
* // Will be executed only for color and z-index
|
92
|
+
* })
|
93
|
+
*/
|
94
|
+
|
95
|
+
|
96
|
+
Container.prototype.each = function each(callback) {
|
97
|
+
if (!this.lastEach) this.lastEach = 0;
|
98
|
+
if (!this.indexes) this.indexes = {};
|
99
|
+
|
100
|
+
this.lastEach += 1;
|
101
|
+
var id = this.lastEach;
|
102
|
+
this.indexes[id] = 0;
|
103
|
+
|
104
|
+
if (!this.nodes) return undefined;
|
105
|
+
|
106
|
+
var index = void 0,
|
107
|
+
result = void 0;
|
108
|
+
while (this.indexes[id] < this.nodes.length) {
|
109
|
+
index = this.indexes[id];
|
110
|
+
result = callback(this.nodes[index], index);
|
111
|
+
if (result === false) break;
|
112
|
+
|
113
|
+
this.indexes[id] += 1;
|
53
114
|
}
|
54
115
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
* // Will be executed only for color and z-index
|
92
|
-
* });
|
93
|
-
*/
|
94
|
-
|
95
|
-
|
96
|
-
Container.prototype.each = function each(callback) {
|
97
|
-
if (!this.lastEach) this.lastEach = 0;
|
98
|
-
if (!this.indexes) this.indexes = {};
|
99
|
-
|
100
|
-
this.lastEach += 1;
|
101
|
-
var id = this.lastEach;
|
102
|
-
this.indexes[id] = 0;
|
103
|
-
|
104
|
-
if (!this.nodes) return undefined;
|
105
|
-
|
106
|
-
var index = void 0,
|
107
|
-
result = void 0;
|
108
|
-
while (this.indexes[id] < this.nodes.length) {
|
109
|
-
index = this.indexes[id];
|
110
|
-
result = callback(this.nodes[index], index);
|
111
|
-
if (result === false) break;
|
112
|
-
|
113
|
-
this.indexes[id] += 1;
|
116
|
+
delete this.indexes[id];
|
117
|
+
|
118
|
+
return result;
|
119
|
+
};
|
120
|
+
|
121
|
+
/**
|
122
|
+
* Traverses the container’s descendant nodes, calling callback
|
123
|
+
* for each node.
|
124
|
+
*
|
125
|
+
* Like container.each(), this method is safe to use
|
126
|
+
* if you are mutating arrays during iteration.
|
127
|
+
*
|
128
|
+
* If you only need to iterate through the container’s immediate children,
|
129
|
+
* use {@link Container#each}.
|
130
|
+
*
|
131
|
+
* @param {childIterator} callback Iterator receives each node and index.
|
132
|
+
*
|
133
|
+
* @return {false|undefined} Returns `false` if iteration was broke.
|
134
|
+
*
|
135
|
+
* @example
|
136
|
+
* root.walk(node => {
|
137
|
+
* // Traverses all descendant nodes.
|
138
|
+
* })
|
139
|
+
*/
|
140
|
+
|
141
|
+
|
142
|
+
Container.prototype.walk = function walk(callback) {
|
143
|
+
return this.each(function (child, i) {
|
144
|
+
var result = void 0;
|
145
|
+
try {
|
146
|
+
result = callback(child, i);
|
147
|
+
} catch (e) {
|
148
|
+
e.postcssNode = child;
|
149
|
+
if (e.stack && child.source && /\n\s{4}at /.test(e.stack)) {
|
150
|
+
var s = child.source;
|
151
|
+
e.stack = e.stack.replace(/\n\s{4}at /, '$&' + s.input.from + ':' + s.start.line + ':' + s.start.column + '$&');
|
114
152
|
}
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
*
|
162
|
-
* @param {string|RegExp} [prop] - string or regular expression
|
163
|
-
* to filter declarations by property name
|
164
|
-
* @param {childIterator} callback - iterator receives each node and index
|
165
|
-
*
|
166
|
-
* @return {false|undefined} returns `false` if iteration was broke
|
167
|
-
*
|
168
|
-
* @example
|
169
|
-
* root.walkDecls(decl => {
|
170
|
-
* checkPropertySupport(decl.prop);
|
171
|
-
* });
|
172
|
-
*
|
173
|
-
* root.walkDecls('border-radius', decl => {
|
174
|
-
* decl.remove();
|
175
|
-
* });
|
176
|
-
*
|
177
|
-
* root.walkDecls(/^background/, decl => {
|
178
|
-
* decl.value = takeFirstColorFromGradient(decl.value);
|
179
|
-
* });
|
180
|
-
*/
|
181
|
-
|
182
|
-
|
183
|
-
Container.prototype.walkDecls = function walkDecls(prop, callback) {
|
184
|
-
if (!callback) {
|
185
|
-
callback = prop;
|
186
|
-
return this.walk(function (child, i) {
|
187
|
-
if (child.type === 'decl') {
|
188
|
-
return callback(child, i);
|
189
|
-
}
|
190
|
-
});
|
191
|
-
} else if (prop instanceof RegExp) {
|
192
|
-
return this.walk(function (child, i) {
|
193
|
-
if (child.type === 'decl' && prop.test(child.prop)) {
|
194
|
-
return callback(child, i);
|
195
|
-
}
|
196
|
-
});
|
197
|
-
} else {
|
198
|
-
return this.walk(function (child, i) {
|
199
|
-
if (child.type === 'decl' && child.prop === prop) {
|
200
|
-
return callback(child, i);
|
201
|
-
}
|
202
|
-
});
|
203
|
-
}
|
204
|
-
};
|
205
|
-
|
206
|
-
/**
|
207
|
-
* Traverses the container’s descendant nodes, calling callback
|
208
|
-
* for each rule node.
|
209
|
-
*
|
210
|
-
* If you pass a filter, iteration will only happen over rules
|
211
|
-
* with matching selectors.
|
212
|
-
*
|
213
|
-
* Like {@link Container#each}, this method is safe
|
214
|
-
* to use if you are mutating arrays during iteration.
|
215
|
-
*
|
216
|
-
* @param {string|RegExp} [selector] - string or regular expression
|
217
|
-
* to filter rules by selector
|
218
|
-
* @param {childIterator} callback - iterator receives each node and index
|
219
|
-
*
|
220
|
-
* @return {false|undefined} returns `false` if iteration was broke
|
221
|
-
*
|
222
|
-
* @example
|
223
|
-
* const selectors = [];
|
224
|
-
* root.walkRules(rule => {
|
225
|
-
* selectors.push(rule.selector);
|
226
|
-
* });
|
227
|
-
* console.log(`Your CSS uses ${selectors.length} selectors`);
|
228
|
-
*/
|
229
|
-
|
230
|
-
|
231
|
-
Container.prototype.walkRules = function walkRules(selector, callback) {
|
232
|
-
if (!callback) {
|
233
|
-
callback = selector;
|
234
|
-
|
235
|
-
return this.walk(function (child, i) {
|
236
|
-
if (child.type === 'rule') {
|
237
|
-
return callback(child, i);
|
238
|
-
}
|
239
|
-
});
|
240
|
-
} else if (selector instanceof RegExp) {
|
241
|
-
return this.walk(function (child, i) {
|
242
|
-
if (child.type === 'rule' && selector.test(child.selector)) {
|
243
|
-
return callback(child, i);
|
244
|
-
}
|
245
|
-
});
|
246
|
-
} else {
|
247
|
-
return this.walk(function (child, i) {
|
248
|
-
if (child.type === 'rule' && child.selector === selector) {
|
249
|
-
return callback(child, i);
|
250
|
-
}
|
251
|
-
});
|
153
|
+
throw e;
|
154
|
+
}
|
155
|
+
if (result !== false && child.walk) {
|
156
|
+
result = child.walk(callback);
|
157
|
+
}
|
158
|
+
return result;
|
159
|
+
});
|
160
|
+
};
|
161
|
+
|
162
|
+
/**
|
163
|
+
* Traverses the container’s descendant nodes, calling callback
|
164
|
+
* for each declaration node.
|
165
|
+
*
|
166
|
+
* If you pass a filter, iteration will only happen over declarations
|
167
|
+
* with matching properties.
|
168
|
+
*
|
169
|
+
* Like {@link Container#each}, this method is safe
|
170
|
+
* to use if you are mutating arrays during iteration.
|
171
|
+
*
|
172
|
+
* @param {string|RegExp} [prop] String or regular expression
|
173
|
+
* to filter declarations by property name.
|
174
|
+
* @param {childIterator} callback Iterator receives each node and index.
|
175
|
+
*
|
176
|
+
* @return {false|undefined} Returns `false` if iteration was broke.
|
177
|
+
*
|
178
|
+
* @example
|
179
|
+
* root.walkDecls(decl => {
|
180
|
+
* checkPropertySupport(decl.prop)
|
181
|
+
* })
|
182
|
+
*
|
183
|
+
* root.walkDecls('border-radius', decl => {
|
184
|
+
* decl.remove()
|
185
|
+
* })
|
186
|
+
*
|
187
|
+
* root.walkDecls(/^background/, decl => {
|
188
|
+
* decl.value = takeFirstColorFromGradient(decl.value)
|
189
|
+
* })
|
190
|
+
*/
|
191
|
+
|
192
|
+
|
193
|
+
Container.prototype.walkDecls = function walkDecls(prop, callback) {
|
194
|
+
if (!callback) {
|
195
|
+
callback = prop;
|
196
|
+
return this.walk(function (child, i) {
|
197
|
+
if (child.type === 'decl') {
|
198
|
+
return callback(child, i);
|
252
199
|
}
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
*
|
259
|
-
* If you pass a filter, iteration will only happen over at-rules
|
260
|
-
* that have matching names.
|
261
|
-
*
|
262
|
-
* Like {@link Container#each}, this method is safe
|
263
|
-
* to use if you are mutating arrays during iteration.
|
264
|
-
*
|
265
|
-
* @param {string|RegExp} [name] - string or regular expression
|
266
|
-
* to filter at-rules by name
|
267
|
-
* @param {childIterator} callback - iterator receives each node and index
|
268
|
-
*
|
269
|
-
* @return {false|undefined} returns `false` if iteration was broke
|
270
|
-
*
|
271
|
-
* @example
|
272
|
-
* root.walkAtRules(rule => {
|
273
|
-
* if ( isOld(rule.name) ) rule.remove();
|
274
|
-
* });
|
275
|
-
*
|
276
|
-
* let first = false;
|
277
|
-
* root.walkAtRules('charset', rule => {
|
278
|
-
* if ( !first ) {
|
279
|
-
* first = true;
|
280
|
-
* } else {
|
281
|
-
* rule.remove();
|
282
|
-
* }
|
283
|
-
* });
|
284
|
-
*/
|
285
|
-
|
286
|
-
|
287
|
-
Container.prototype.walkAtRules = function walkAtRules(name, callback) {
|
288
|
-
if (!callback) {
|
289
|
-
callback = name;
|
290
|
-
return this.walk(function (child, i) {
|
291
|
-
if (child.type === 'atrule') {
|
292
|
-
return callback(child, i);
|
293
|
-
}
|
294
|
-
});
|
295
|
-
} else if (name instanceof RegExp) {
|
296
|
-
return this.walk(function (child, i) {
|
297
|
-
if (child.type === 'atrule' && name.test(child.name)) {
|
298
|
-
return callback(child, i);
|
299
|
-
}
|
300
|
-
});
|
301
|
-
} else {
|
302
|
-
return this.walk(function (child, i) {
|
303
|
-
if (child.type === 'atrule' && child.name === name) {
|
304
|
-
return callback(child, i);
|
305
|
-
}
|
306
|
-
});
|
200
|
+
});
|
201
|
+
} else if (prop instanceof RegExp) {
|
202
|
+
return this.walk(function (child, i) {
|
203
|
+
if (child.type === 'decl' && prop.test(child.prop)) {
|
204
|
+
return callback(child, i);
|
307
205
|
}
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
*
|
314
|
-
* Like {@link Container#each}, this method is safe
|
315
|
-
* to use if you are mutating arrays during iteration.
|
316
|
-
*
|
317
|
-
* @param {childIterator} callback - iterator receives each node and index
|
318
|
-
*
|
319
|
-
* @return {false|undefined} returns `false` if iteration was broke
|
320
|
-
*
|
321
|
-
* @example
|
322
|
-
* root.walkComments(comment => {
|
323
|
-
* comment.remove();
|
324
|
-
* });
|
325
|
-
*/
|
326
|
-
|
327
|
-
|
328
|
-
Container.prototype.walkComments = function walkComments(callback) {
|
329
|
-
return this.walk(function (child, i) {
|
330
|
-
if (child.type === 'comment') {
|
331
|
-
return callback(child, i);
|
332
|
-
}
|
333
|
-
});
|
334
|
-
};
|
335
|
-
|
336
|
-
/**
|
337
|
-
* Inserts new nodes to the end of the container.
|
338
|
-
*
|
339
|
-
* @param {...(Node|object|string|Node[])} children - new nodes
|
340
|
-
*
|
341
|
-
* @return {Node} this node for methods chain
|
342
|
-
*
|
343
|
-
* @example
|
344
|
-
* const decl1 = postcss.decl({ prop: 'color', value: 'black' });
|
345
|
-
* const decl2 = postcss.decl({ prop: 'background-color', value: 'white' });
|
346
|
-
* rule.append(decl1, decl2);
|
347
|
-
*
|
348
|
-
* root.append({ name: 'charset', params: '"UTF-8"' }); // at-rule
|
349
|
-
* root.append({ selector: 'a' }); // rule
|
350
|
-
* rule.append({ prop: 'color', value: 'black' }); // declaration
|
351
|
-
* rule.append({ text: 'Comment' }) // comment
|
352
|
-
*
|
353
|
-
* root.append('a {}');
|
354
|
-
* root.first.append('color: black; z-index: 1');
|
355
|
-
*/
|
356
|
-
|
357
|
-
|
358
|
-
Container.prototype.append = function append() {
|
359
|
-
for (var _len = arguments.length, children = Array(_len), _key = 0; _key < _len; _key++) {
|
360
|
-
children[_key] = arguments[_key];
|
206
|
+
});
|
207
|
+
} else {
|
208
|
+
return this.walk(function (child, i) {
|
209
|
+
if (child.type === 'decl' && child.prop === prop) {
|
210
|
+
return callback(child, i);
|
361
211
|
}
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
212
|
+
});
|
213
|
+
}
|
214
|
+
};
|
215
|
+
|
216
|
+
/**
|
217
|
+
* Traverses the container’s descendant nodes, calling callback
|
218
|
+
* for each rule node.
|
219
|
+
*
|
220
|
+
* If you pass a filter, iteration will only happen over rules
|
221
|
+
* with matching selectors.
|
222
|
+
*
|
223
|
+
* Like {@link Container#each}, this method is safe
|
224
|
+
* to use if you are mutating arrays during iteration.
|
225
|
+
*
|
226
|
+
* @param {string|RegExp} [selector] String or regular expression
|
227
|
+
* to filter rules by selector.
|
228
|
+
* @param {childIterator} callback Iterator receives each node and index.
|
229
|
+
*
|
230
|
+
* @return {false|undefined} returns `false` if iteration was broke.
|
231
|
+
*
|
232
|
+
* @example
|
233
|
+
* const selectors = []
|
234
|
+
* root.walkRules(rule => {
|
235
|
+
* selectors.push(rule.selector)
|
236
|
+
* })
|
237
|
+
* console.log(`Your CSS uses ${ selectors.length } selectors`)
|
238
|
+
*/
|
239
|
+
|
240
|
+
|
241
|
+
Container.prototype.walkRules = function walkRules(selector, callback) {
|
242
|
+
if (!callback) {
|
243
|
+
callback = selector;
|
244
|
+
|
245
|
+
return this.walk(function (child, i) {
|
246
|
+
if (child.type === 'rule') {
|
247
|
+
return callback(child, i);
|
393
248
|
}
|
394
|
-
|
395
|
-
}
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
*
|
400
|
-
* @param {...(Node|object|string|Node[])} children - new nodes
|
401
|
-
*
|
402
|
-
* @return {Node} this node for methods chain
|
403
|
-
*
|
404
|
-
* @example
|
405
|
-
* const decl1 = postcss.decl({ prop: 'color', value: 'black' });
|
406
|
-
* const decl2 = postcss.decl({ prop: 'background-color', value: 'white' });
|
407
|
-
* rule.prepend(decl1, decl2);
|
408
|
-
*
|
409
|
-
* root.append({ name: 'charset', params: '"UTF-8"' }); // at-rule
|
410
|
-
* root.append({ selector: 'a' }); // rule
|
411
|
-
* rule.append({ prop: 'color', value: 'black' }); // declaration
|
412
|
-
* rule.append({ text: 'Comment' }) // comment
|
413
|
-
*
|
414
|
-
* root.append('a {}');
|
415
|
-
* root.first.append('color: black; z-index: 1');
|
416
|
-
*/
|
417
|
-
|
418
|
-
|
419
|
-
Container.prototype.prepend = function prepend() {
|
420
|
-
for (var _len2 = arguments.length, children = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
421
|
-
children[_key2] = arguments[_key2];
|
249
|
+
});
|
250
|
+
} else if (selector instanceof RegExp) {
|
251
|
+
return this.walk(function (child, i) {
|
252
|
+
if (child.type === 'rule' && selector.test(child.selector)) {
|
253
|
+
return callback(child, i);
|
422
254
|
}
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
if (_isArray3) {
|
429
|
-
if (_i3 >= _iterator3.length) break;
|
430
|
-
_ref3 = _iterator3[_i3++];
|
431
|
-
} else {
|
432
|
-
_i3 = _iterator3.next();
|
433
|
-
if (_i3.done) break;
|
434
|
-
_ref3 = _i3.value;
|
435
|
-
}
|
436
|
-
|
437
|
-
var child = _ref3;
|
438
|
-
|
439
|
-
var nodes = this.normalize(child, this.first, 'prepend').reverse();
|
440
|
-
for (var _iterator4 = nodes, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {
|
441
|
-
var _ref4;
|
442
|
-
|
443
|
-
if (_isArray4) {
|
444
|
-
if (_i4 >= _iterator4.length) break;
|
445
|
-
_ref4 = _iterator4[_i4++];
|
446
|
-
} else {
|
447
|
-
_i4 = _iterator4.next();
|
448
|
-
if (_i4.done) break;
|
449
|
-
_ref4 = _i4.value;
|
450
|
-
}
|
451
|
-
|
452
|
-
var node = _ref4;
|
453
|
-
this.nodes.unshift(node);
|
454
|
-
}for (var id in this.indexes) {
|
455
|
-
this.indexes[id] = this.indexes[id] + nodes.length;
|
456
|
-
}
|
255
|
+
});
|
256
|
+
} else {
|
257
|
+
return this.walk(function (child, i) {
|
258
|
+
if (child.type === 'rule' && child.selector === selector) {
|
259
|
+
return callback(child, i);
|
457
260
|
}
|
458
|
-
|
459
|
-
}
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
261
|
+
});
|
262
|
+
}
|
263
|
+
};
|
264
|
+
|
265
|
+
/**
|
266
|
+
* Traverses the container’s descendant nodes, calling callback
|
267
|
+
* for each at-rule node.
|
268
|
+
*
|
269
|
+
* If you pass a filter, iteration will only happen over at-rules
|
270
|
+
* that have matching names.
|
271
|
+
*
|
272
|
+
* Like {@link Container#each}, this method is safe
|
273
|
+
* to use if you are mutating arrays during iteration.
|
274
|
+
*
|
275
|
+
* @param {string|RegExp} [name] String or regular expression
|
276
|
+
* to filter at-rules by name.
|
277
|
+
* @param {childIterator} callback Iterator receives each node and index.
|
278
|
+
*
|
279
|
+
* @return {false|undefined} Returns `false` if iteration was broke.
|
280
|
+
*
|
281
|
+
* @example
|
282
|
+
* root.walkAtRules(rule => {
|
283
|
+
* if (isOld(rule.name)) rule.remove()
|
284
|
+
* })
|
285
|
+
*
|
286
|
+
* let first = false
|
287
|
+
* root.walkAtRules('charset', rule => {
|
288
|
+
* if (!first) {
|
289
|
+
* first = true
|
290
|
+
* } else {
|
291
|
+
* rule.remove()
|
292
|
+
* }
|
293
|
+
* })
|
294
|
+
*/
|
295
|
+
|
296
|
+
|
297
|
+
Container.prototype.walkAtRules = function walkAtRules(name, callback) {
|
298
|
+
if (!callback) {
|
299
|
+
callback = name;
|
300
|
+
return this.walk(function (child, i) {
|
301
|
+
if (child.type === 'atrule') {
|
302
|
+
return callback(child, i);
|
479
303
|
}
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
* @param {Node|number} exist - child or child’s index.
|
486
|
-
* @param {Node|object|string|Node[]} add - new node
|
487
|
-
*
|
488
|
-
* @return {Node} this node for methods chain
|
489
|
-
*
|
490
|
-
* @example
|
491
|
-
* rule.insertBefore(decl, decl.clone({ prop: '-webkit-' + decl.prop }));
|
492
|
-
*/
|
493
|
-
|
494
|
-
|
495
|
-
Container.prototype.insertBefore = function insertBefore(exist, add) {
|
496
|
-
exist = this.index(exist);
|
497
|
-
|
498
|
-
var type = exist === 0 ? 'prepend' : false;
|
499
|
-
var nodes = this.normalize(add, this.nodes[exist], type).reverse();
|
500
|
-
for (var _iterator6 = nodes, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {
|
501
|
-
var _ref6;
|
502
|
-
|
503
|
-
if (_isArray6) {
|
504
|
-
if (_i6 >= _iterator6.length) break;
|
505
|
-
_ref6 = _iterator6[_i6++];
|
506
|
-
} else {
|
507
|
-
_i6 = _iterator6.next();
|
508
|
-
if (_i6.done) break;
|
509
|
-
_ref6 = _i6.value;
|
510
|
-
}
|
511
|
-
|
512
|
-
var node = _ref6;
|
513
|
-
this.nodes.splice(exist, 0, node);
|
514
|
-
}var index = void 0;
|
515
|
-
for (var id in this.indexes) {
|
516
|
-
index = this.indexes[id];
|
517
|
-
if (exist <= index) {
|
518
|
-
this.indexes[id] = index + nodes.length;
|
519
|
-
}
|
304
|
+
});
|
305
|
+
} else if (name instanceof RegExp) {
|
306
|
+
return this.walk(function (child, i) {
|
307
|
+
if (child.type === 'atrule' && name.test(child.name)) {
|
308
|
+
return callback(child, i);
|
520
309
|
}
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
* Insert new node after old node within the container.
|
527
|
-
*
|
528
|
-
* @param {Node|number} exist - child or child’s index
|
529
|
-
* @param {Node|object|string|Node[]} add - new node
|
530
|
-
*
|
531
|
-
* @return {Node} this node for methods chain
|
532
|
-
*/
|
533
|
-
|
534
|
-
|
535
|
-
Container.prototype.insertAfter = function insertAfter(exist, add) {
|
536
|
-
exist = this.index(exist);
|
537
|
-
|
538
|
-
var nodes = this.normalize(add, this.nodes[exist]).reverse();
|
539
|
-
for (var _iterator7 = nodes, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {
|
540
|
-
var _ref7;
|
541
|
-
|
542
|
-
if (_isArray7) {
|
543
|
-
if (_i7 >= _iterator7.length) break;
|
544
|
-
_ref7 = _iterator7[_i7++];
|
545
|
-
} else {
|
546
|
-
_i7 = _iterator7.next();
|
547
|
-
if (_i7.done) break;
|
548
|
-
_ref7 = _i7.value;
|
549
|
-
}
|
550
|
-
|
551
|
-
var node = _ref7;
|
552
|
-
this.nodes.splice(exist + 1, 0, node);
|
553
|
-
}var index = void 0;
|
554
|
-
for (var id in this.indexes) {
|
555
|
-
index = this.indexes[id];
|
556
|
-
if (exist < index) {
|
557
|
-
this.indexes[id] = index + nodes.length;
|
558
|
-
}
|
310
|
+
});
|
311
|
+
} else {
|
312
|
+
return this.walk(function (child, i) {
|
313
|
+
if (child.type === 'atrule' && child.name === name) {
|
314
|
+
return callback(child, i);
|
559
315
|
}
|
316
|
+
});
|
317
|
+
}
|
318
|
+
};
|
319
|
+
|
320
|
+
/**
|
321
|
+
* Traverses the container’s descendant nodes, calling callback
|
322
|
+
* for each comment node.
|
323
|
+
*
|
324
|
+
* Like {@link Container#each}, this method is safe
|
325
|
+
* to use if you are mutating arrays during iteration.
|
326
|
+
*
|
327
|
+
* @param {childIterator} callback Iterator receives each node and index.
|
328
|
+
*
|
329
|
+
* @return {false|undefined} Returns `false` if iteration was broke.
|
330
|
+
*
|
331
|
+
* @example
|
332
|
+
* root.walkComments(comment => {
|
333
|
+
* comment.remove()
|
334
|
+
* })
|
335
|
+
*/
|
336
|
+
|
337
|
+
|
338
|
+
Container.prototype.walkComments = function walkComments(callback) {
|
339
|
+
return this.walk(function (child, i) {
|
340
|
+
if (child.type === 'comment') {
|
341
|
+
return callback(child, i);
|
342
|
+
}
|
343
|
+
});
|
344
|
+
};
|
345
|
+
|
346
|
+
/**
|
347
|
+
* Inserts new nodes to the end of the container.
|
348
|
+
*
|
349
|
+
* @param {...(Node|object|string|Node[])} children New nodes.
|
350
|
+
*
|
351
|
+
* @return {Node} This node for methods chain.
|
352
|
+
*
|
353
|
+
* @example
|
354
|
+
* const decl1 = postcss.decl({ prop: 'color', value: 'black' })
|
355
|
+
* const decl2 = postcss.decl({ prop: 'background-color', value: 'white' })
|
356
|
+
* rule.append(decl1, decl2)
|
357
|
+
*
|
358
|
+
* root.append({ name: 'charset', params: '"UTF-8"' }) // at-rule
|
359
|
+
* root.append({ selector: 'a' }) // rule
|
360
|
+
* rule.append({ prop: 'color', value: 'black' }) // declaration
|
361
|
+
* rule.append({ text: 'Comment' }) // comment
|
362
|
+
*
|
363
|
+
* root.append('a {}')
|
364
|
+
* root.first.append('color: black; z-index: 1')
|
365
|
+
*/
|
366
|
+
|
367
|
+
|
368
|
+
Container.prototype.append = function append() {
|
369
|
+
for (var _len = arguments.length, children = Array(_len), _key = 0; _key < _len; _key++) {
|
370
|
+
children[_key] = arguments[_key];
|
371
|
+
}
|
560
372
|
|
561
|
-
|
562
|
-
|
373
|
+
for (var _iterator = children, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
|
374
|
+
var _ref;
|
563
375
|
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
* @example
|
573
|
-
* rule.nodes.length //=> 5
|
574
|
-
* rule.removeChild(decl);
|
575
|
-
* rule.nodes.length //=> 4
|
576
|
-
* decl.parent //=> undefined
|
577
|
-
*/
|
376
|
+
if (_isArray) {
|
377
|
+
if (_i >= _iterator.length) break;
|
378
|
+
_ref = _iterator[_i++];
|
379
|
+
} else {
|
380
|
+
_i = _iterator.next();
|
381
|
+
if (_i.done) break;
|
382
|
+
_ref = _i.value;
|
383
|
+
}
|
578
384
|
|
385
|
+
var child = _ref;
|
579
386
|
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
this.nodes.splice(child, 1);
|
387
|
+
var nodes = this.normalize(child, this.last);
|
388
|
+
for (var _iterator2 = nodes, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
|
389
|
+
var _ref2;
|
584
390
|
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
391
|
+
if (_isArray2) {
|
392
|
+
if (_i2 >= _iterator2.length) break;
|
393
|
+
_ref2 = _iterator2[_i2++];
|
394
|
+
} else {
|
395
|
+
_i2 = _iterator2.next();
|
396
|
+
if (_i2.done) break;
|
397
|
+
_ref2 = _i2.value;
|
591
398
|
}
|
592
399
|
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
400
|
+
var node = _ref2;
|
401
|
+
this.nodes.push(node);
|
402
|
+
}
|
403
|
+
}
|
404
|
+
return this;
|
405
|
+
};
|
406
|
+
|
407
|
+
/**
|
408
|
+
* Inserts new nodes to the start of the container.
|
409
|
+
*
|
410
|
+
* @param {...(Node|object|string|Node[])} children New nodes.
|
411
|
+
*
|
412
|
+
* @return {Node} This node for methods chain.
|
413
|
+
*
|
414
|
+
* @example
|
415
|
+
* const decl1 = postcss.decl({ prop: 'color', value: 'black' })
|
416
|
+
* const decl2 = postcss.decl({ prop: 'background-color', value: 'white' })
|
417
|
+
* rule.prepend(decl1, decl2)
|
418
|
+
*
|
419
|
+
* root.append({ name: 'charset', params: '"UTF-8"' }) // at-rule
|
420
|
+
* root.append({ selector: 'a' }) // rule
|
421
|
+
* rule.append({ prop: 'color', value: 'black' }) // declaration
|
422
|
+
* rule.append({ text: 'Comment' }) // comment
|
423
|
+
*
|
424
|
+
* root.append('a {}')
|
425
|
+
* root.first.append('color: black; z-index: 1')
|
426
|
+
*/
|
427
|
+
|
428
|
+
|
429
|
+
Container.prototype.prepend = function prepend() {
|
430
|
+
for (var _len2 = arguments.length, children = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
431
|
+
children[_key2] = arguments[_key2];
|
432
|
+
}
|
611
433
|
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
} else {
|
616
|
-
_i8 = _iterator8.next();
|
617
|
-
if (_i8.done) break;
|
618
|
-
_ref8 = _i8.value;
|
619
|
-
}
|
434
|
+
children = children.reverse();
|
435
|
+
for (var _iterator3 = children, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
|
436
|
+
var _ref3;
|
620
437
|
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
438
|
+
if (_isArray3) {
|
439
|
+
if (_i3 >= _iterator3.length) break;
|
440
|
+
_ref3 = _iterator3[_i3++];
|
441
|
+
} else {
|
442
|
+
_i3 = _iterator3.next();
|
443
|
+
if (_i3.done) break;
|
444
|
+
_ref3 = _i3.value;
|
445
|
+
}
|
626
446
|
|
627
|
-
|
628
|
-
* Passes all declaration values within the container that match pattern
|
629
|
-
* through callback, replacing those values with the returned result
|
630
|
-
* of callback.
|
631
|
-
*
|
632
|
-
* This method is useful if you are using a custom unit or function
|
633
|
-
* and need to iterate through all values.
|
634
|
-
*
|
635
|
-
* @param {string|RegExp} pattern - replace pattern
|
636
|
-
* @param {object} opts - options to speed up the search
|
637
|
-
* @param {string|string[]} opts.props - an array of property names
|
638
|
-
* @param {string} opts.fast - string that’s used
|
639
|
-
* to narrow down values and speed up
|
640
|
-
the regexp search
|
641
|
-
* @param {function|string} callback - string to replace pattern
|
642
|
-
* or callback that returns a new
|
643
|
-
* value.
|
644
|
-
* The callback will receive
|
645
|
-
* the same arguments as those
|
646
|
-
* passed to a function parameter
|
647
|
-
* of `String#replace`.
|
648
|
-
*
|
649
|
-
* @return {Node} this node for methods chain
|
650
|
-
*
|
651
|
-
* @example
|
652
|
-
* root.replaceValues(/\d+rem/, { fast: 'rem' }, string => {
|
653
|
-
* return 15 * parseInt(string) + 'px';
|
654
|
-
* });
|
655
|
-
*/
|
447
|
+
var child = _ref3;
|
656
448
|
|
449
|
+
var nodes = this.normalize(child, this.first, 'prepend').reverse();
|
450
|
+
for (var _iterator4 = nodes, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {
|
451
|
+
var _ref4;
|
657
452
|
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
453
|
+
if (_isArray4) {
|
454
|
+
if (_i4 >= _iterator4.length) break;
|
455
|
+
_ref4 = _iterator4[_i4++];
|
456
|
+
} else {
|
457
|
+
_i4 = _iterator4.next();
|
458
|
+
if (_i4.done) break;
|
459
|
+
_ref4 = _i4.value;
|
662
460
|
}
|
663
461
|
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
462
|
+
var node = _ref4;
|
463
|
+
this.nodes.unshift(node);
|
464
|
+
}for (var id in this.indexes) {
|
465
|
+
this.indexes[id] = this.indexes[id] + nodes.length;
|
466
|
+
}
|
467
|
+
}
|
468
|
+
return this;
|
469
|
+
};
|
470
|
+
|
471
|
+
Container.prototype.cleanRaws = function cleanRaws(keepBetween) {
|
472
|
+
_Node.prototype.cleanRaws.call(this, keepBetween);
|
473
|
+
if (this.nodes) {
|
474
|
+
for (var _iterator5 = this.nodes, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {
|
475
|
+
var _ref5;
|
476
|
+
|
477
|
+
if (_isArray5) {
|
478
|
+
if (_i5 >= _iterator5.length) break;
|
479
|
+
_ref5 = _iterator5[_i5++];
|
480
|
+
} else {
|
481
|
+
_i5 = _iterator5.next();
|
482
|
+
if (_i5.done) break;
|
483
|
+
_ref5 = _i5.value;
|
484
|
+
}
|
686
485
|
|
687
|
-
|
688
|
-
|
689
|
-
|
486
|
+
var node = _ref5;
|
487
|
+
node.cleanRaws(keepBetween);
|
488
|
+
}
|
489
|
+
}
|
490
|
+
};
|
491
|
+
|
492
|
+
/**
|
493
|
+
* Insert new node before old node within the container.
|
494
|
+
*
|
495
|
+
* @param {Node|number} exist Child or child’s index.
|
496
|
+
* @param {Node|object|string|Node[]} add New node.
|
497
|
+
*
|
498
|
+
* @return {Node} This node for methods chain.
|
499
|
+
*
|
500
|
+
* @example
|
501
|
+
* rule.insertBefore(decl, decl.clone({ prop: '-webkit-' + decl.prop }))
|
502
|
+
*/
|
503
|
+
|
504
|
+
|
505
|
+
Container.prototype.insertBefore = function insertBefore(exist, add) {
|
506
|
+
exist = this.index(exist);
|
507
|
+
|
508
|
+
var type = exist === 0 ? 'prepend' : false;
|
509
|
+
var nodes = this.normalize(add, this.nodes[exist], type).reverse();
|
510
|
+
for (var _iterator6 = nodes, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {
|
511
|
+
var _ref6;
|
512
|
+
|
513
|
+
if (_isArray6) {
|
514
|
+
if (_i6 >= _iterator6.length) break;
|
515
|
+
_ref6 = _iterator6[_i6++];
|
516
|
+
} else {
|
517
|
+
_i6 = _iterator6.next();
|
518
|
+
if (_i6.done) break;
|
519
|
+
_ref6 = _i6.value;
|
520
|
+
}
|
521
|
+
|
522
|
+
var node = _ref6;
|
523
|
+
this.nodes.splice(exist, 0, node);
|
524
|
+
}var index = void 0;
|
525
|
+
for (var id in this.indexes) {
|
526
|
+
index = this.indexes[id];
|
527
|
+
if (exist <= index) {
|
528
|
+
this.indexes[id] = index + nodes.length;
|
529
|
+
}
|
530
|
+
}
|
690
531
|
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
532
|
+
return this;
|
533
|
+
};
|
534
|
+
|
535
|
+
/**
|
536
|
+
* Insert new node after old node within the container.
|
537
|
+
*
|
538
|
+
* @param {Node|number} exist Child or child’s index.
|
539
|
+
* @param {Node|object|string|Node[]} add New node.
|
540
|
+
*
|
541
|
+
* @return {Node} This node for methods chain.
|
542
|
+
*/
|
543
|
+
|
544
|
+
|
545
|
+
Container.prototype.insertAfter = function insertAfter(exist, add) {
|
546
|
+
exist = this.index(exist);
|
547
|
+
|
548
|
+
var nodes = this.normalize(add, this.nodes[exist]).reverse();
|
549
|
+
for (var _iterator7 = nodes, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {
|
550
|
+
var _ref7;
|
551
|
+
|
552
|
+
if (_isArray7) {
|
553
|
+
if (_i7 >= _iterator7.length) break;
|
554
|
+
_ref7 = _iterator7[_i7++];
|
555
|
+
} else {
|
556
|
+
_i7 = _iterator7.next();
|
557
|
+
if (_i7.done) break;
|
558
|
+
_ref7 = _i7.value;
|
559
|
+
}
|
560
|
+
|
561
|
+
var node = _ref7;
|
562
|
+
this.nodes.splice(exist + 1, 0, node);
|
563
|
+
}var index = void 0;
|
564
|
+
for (var id in this.indexes) {
|
565
|
+
index = this.indexes[id];
|
566
|
+
if (exist < index) {
|
567
|
+
this.indexes[id] = index + nodes.length;
|
568
|
+
}
|
569
|
+
}
|
702
570
|
|
571
|
+
return this;
|
572
|
+
};
|
573
|
+
|
574
|
+
/**
|
575
|
+
* Removes node from the container and cleans the parent properties
|
576
|
+
* from the node and its children.
|
577
|
+
*
|
578
|
+
* @param {Node|number} child Child or child’s index.
|
579
|
+
*
|
580
|
+
* @return {Node} This node for methods chain
|
581
|
+
*
|
582
|
+
* @example
|
583
|
+
* rule.nodes.length //=> 5
|
584
|
+
* rule.removeChild(decl)
|
585
|
+
* rule.nodes.length //=> 4
|
586
|
+
* decl.parent //=> undefined
|
587
|
+
*/
|
588
|
+
|
589
|
+
|
590
|
+
Container.prototype.removeChild = function removeChild(child) {
|
591
|
+
child = this.index(child);
|
592
|
+
this.nodes[child].parent = undefined;
|
593
|
+
this.nodes.splice(child, 1);
|
594
|
+
|
595
|
+
var index = void 0;
|
596
|
+
for (var id in this.indexes) {
|
597
|
+
index = this.indexes[id];
|
598
|
+
if (index >= child) {
|
599
|
+
this.indexes[id] = index - 1;
|
600
|
+
}
|
601
|
+
}
|
703
602
|
|
704
|
-
|
705
|
-
|
706
|
-
|
603
|
+
return this;
|
604
|
+
};
|
605
|
+
|
606
|
+
/**
|
607
|
+
* Removes all children from the container
|
608
|
+
* and cleans their parent properties.
|
609
|
+
*
|
610
|
+
* @return {Node} This node for methods chain.
|
611
|
+
*
|
612
|
+
* @example
|
613
|
+
* rule.removeAll()
|
614
|
+
* rule.nodes.length //=> 0
|
615
|
+
*/
|
616
|
+
|
617
|
+
|
618
|
+
Container.prototype.removeAll = function removeAll() {
|
619
|
+
for (var _iterator8 = this.nodes, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {
|
620
|
+
var _ref8;
|
621
|
+
|
622
|
+
if (_isArray8) {
|
623
|
+
if (_i8 >= _iterator8.length) break;
|
624
|
+
_ref8 = _iterator8[_i8++];
|
625
|
+
} else {
|
626
|
+
_i8 = _iterator8.next();
|
627
|
+
if (_i8.done) break;
|
628
|
+
_ref8 = _i8.value;
|
629
|
+
}
|
630
|
+
|
631
|
+
var node = _ref8;
|
632
|
+
node.parent = undefined;
|
633
|
+
}this.nodes = [];
|
634
|
+
return this;
|
635
|
+
};
|
636
|
+
|
637
|
+
/**
|
638
|
+
* Passes all declaration values within the container that match pattern
|
639
|
+
* through callback, replacing those values with the returned result
|
640
|
+
* of callback.
|
641
|
+
*
|
642
|
+
* This method is useful if you are using a custom unit or function
|
643
|
+
* and need to iterate through all values.
|
644
|
+
*
|
645
|
+
* @param {string|RegExp} pattern Replace pattern.
|
646
|
+
* @param {object} opts Options to speed up the search.
|
647
|
+
* @param {string|string[]} opts.props An array of property names.
|
648
|
+
* @param {string} opts.fast String that’s used to narrow down
|
649
|
+
* values and speed up the regexp search.
|
650
|
+
* @param {function|string} callback String to replace pattern or callback
|
651
|
+
* that returns a new value. The callback
|
652
|
+
* will receive the same arguments
|
653
|
+
* as those passed to a function parameter
|
654
|
+
* of `String#replace`.
|
655
|
+
*
|
656
|
+
* @return {Node} This node for methods chain.
|
657
|
+
*
|
658
|
+
* @example
|
659
|
+
* root.replaceValues(/\d+rem/, { fast: 'rem' }, string => {
|
660
|
+
* return 15 * parseInt(string) + 'px'
|
661
|
+
* })
|
662
|
+
*/
|
663
|
+
|
664
|
+
|
665
|
+
Container.prototype.replaceValues = function replaceValues(pattern, opts, callback) {
|
666
|
+
if (!callback) {
|
667
|
+
callback = opts;
|
668
|
+
opts = {};
|
669
|
+
}
|
707
670
|
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
* @param {Node} child - child of the current container.
|
712
|
-
*
|
713
|
-
* @return {number} child index
|
714
|
-
*
|
715
|
-
* @example
|
716
|
-
* rule.index( rule.nodes[2] ) //=> 2
|
717
|
-
*/
|
671
|
+
this.walkDecls(function (decl) {
|
672
|
+
if (opts.props && opts.props.indexOf(decl.prop) === -1) return;
|
673
|
+
if (opts.fast && decl.value.indexOf(opts.fast) === -1) return;
|
718
674
|
|
675
|
+
decl.value = decl.value.replace(pattern, callback);
|
676
|
+
});
|
719
677
|
|
720
|
-
|
721
|
-
|
722
|
-
|
678
|
+
return this;
|
679
|
+
};
|
680
|
+
|
681
|
+
/**
|
682
|
+
* Returns `true` if callback returns `true`
|
683
|
+
* for all of the container’s children.
|
684
|
+
*
|
685
|
+
* @param {childCondition} condition Iterator returns true or false.
|
686
|
+
*
|
687
|
+
* @return {boolean} Is every child pass condition.
|
688
|
+
*
|
689
|
+
* @example
|
690
|
+
* const noPrefixes = rule.every(i => i.prop[0] !== '-')
|
691
|
+
*/
|
692
|
+
|
693
|
+
|
694
|
+
Container.prototype.every = function every(condition) {
|
695
|
+
return this.nodes.every(condition);
|
696
|
+
};
|
697
|
+
|
698
|
+
/**
|
699
|
+
* Returns `true` if callback returns `true` for (at least) one
|
700
|
+
* of the container’s children.
|
701
|
+
*
|
702
|
+
* @param {childCondition} condition Iterator returns true or false.
|
703
|
+
*
|
704
|
+
* @return {boolean} Is some child pass condition.
|
705
|
+
*
|
706
|
+
* @example
|
707
|
+
* const hasPrefix = rule.some(i => i.prop[0] === '-')
|
708
|
+
*/
|
709
|
+
|
710
|
+
|
711
|
+
Container.prototype.some = function some(condition) {
|
712
|
+
return this.nodes.some(condition);
|
713
|
+
};
|
714
|
+
|
715
|
+
/**
|
716
|
+
* Returns a `child`’s index within the {@link Container#nodes} array.
|
717
|
+
*
|
718
|
+
* @param {Node} child Child of the current container.
|
719
|
+
*
|
720
|
+
* @return {number} Child index.
|
721
|
+
*
|
722
|
+
* @example
|
723
|
+
* rule.index( rule.nodes[2] ) //=> 2
|
724
|
+
*/
|
725
|
+
|
726
|
+
|
727
|
+
Container.prototype.index = function index(child) {
|
728
|
+
if (typeof child === 'number') {
|
729
|
+
return child;
|
730
|
+
} else {
|
731
|
+
return this.nodes.indexOf(child);
|
732
|
+
}
|
733
|
+
};
|
734
|
+
|
735
|
+
/**
|
736
|
+
* The container’s first child.
|
737
|
+
*
|
738
|
+
* @type {Node}
|
739
|
+
*
|
740
|
+
* @example
|
741
|
+
* rule.first === rules.nodes[0]
|
742
|
+
*/
|
743
|
+
|
744
|
+
|
745
|
+
Container.prototype.normalize = function normalize(nodes, sample) {
|
746
|
+
var _this2 = this;
|
747
|
+
|
748
|
+
if (typeof nodes === 'string') {
|
749
|
+
var parse = require('./parse');
|
750
|
+
nodes = cleanSource(parse(nodes).nodes);
|
751
|
+
} else if (Array.isArray(nodes)) {
|
752
|
+
nodes = nodes.slice(0);
|
753
|
+
for (var _iterator9 = nodes, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {
|
754
|
+
var _ref9;
|
755
|
+
|
756
|
+
if (_isArray9) {
|
757
|
+
if (_i9 >= _iterator9.length) break;
|
758
|
+
_ref9 = _iterator9[_i9++];
|
723
759
|
} else {
|
724
|
-
|
760
|
+
_i9 = _iterator9.next();
|
761
|
+
if (_i9.done) break;
|
762
|
+
_ref9 = _i9.value;
|
725
763
|
}
|
726
|
-
};
|
727
764
|
|
728
|
-
|
729
|
-
* The container’s first child.
|
730
|
-
*
|
731
|
-
* @type {Node}
|
732
|
-
*
|
733
|
-
* @example
|
734
|
-
* rule.first == rules.nodes[0];
|
735
|
-
*/
|
765
|
+
var i = _ref9;
|
736
766
|
|
767
|
+
if (i.parent) i.parent.removeChild(i, 'ignore');
|
768
|
+
}
|
769
|
+
} else if (nodes.type === 'root') {
|
770
|
+
nodes = nodes.nodes.slice(0);
|
771
|
+
for (var _iterator10 = nodes, _isArray10 = Array.isArray(_iterator10), _i11 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) {
|
772
|
+
var _ref10;
|
737
773
|
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
if (typeof nodes === 'string') {
|
742
|
-
var parse = require('./parse');
|
743
|
-
nodes = cleanSource(parse(nodes).nodes);
|
744
|
-
} else if (Array.isArray(nodes)) {
|
745
|
-
nodes = nodes.slice(0);
|
746
|
-
for (var _iterator9 = nodes, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {
|
747
|
-
var _ref9;
|
748
|
-
|
749
|
-
if (_isArray9) {
|
750
|
-
if (_i9 >= _iterator9.length) break;
|
751
|
-
_ref9 = _iterator9[_i9++];
|
752
|
-
} else {
|
753
|
-
_i9 = _iterator9.next();
|
754
|
-
if (_i9.done) break;
|
755
|
-
_ref9 = _i9.value;
|
756
|
-
}
|
757
|
-
|
758
|
-
var i = _ref9;
|
759
|
-
|
760
|
-
if (i.parent) i.parent.removeChild(i, 'ignore');
|
761
|
-
}
|
762
|
-
} else if (nodes.type === 'root') {
|
763
|
-
nodes = nodes.nodes.slice(0);
|
764
|
-
for (var _iterator10 = nodes, _isArray10 = Array.isArray(_iterator10), _i11 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) {
|
765
|
-
var _ref10;
|
766
|
-
|
767
|
-
if (_isArray10) {
|
768
|
-
if (_i11 >= _iterator10.length) break;
|
769
|
-
_ref10 = _iterator10[_i11++];
|
770
|
-
} else {
|
771
|
-
_i11 = _iterator10.next();
|
772
|
-
if (_i11.done) break;
|
773
|
-
_ref10 = _i11.value;
|
774
|
-
}
|
775
|
-
|
776
|
-
var _i10 = _ref10;
|
777
|
-
|
778
|
-
if (_i10.parent) _i10.parent.removeChild(_i10, 'ignore');
|
779
|
-
}
|
780
|
-
} else if (nodes.type) {
|
781
|
-
nodes = [nodes];
|
782
|
-
} else if (nodes.prop) {
|
783
|
-
if (typeof nodes.value === 'undefined') {
|
784
|
-
throw new Error('Value field is missed in node creation');
|
785
|
-
} else if (typeof nodes.value !== 'string') {
|
786
|
-
nodes.value = String(nodes.value);
|
787
|
-
}
|
788
|
-
nodes = [new _declaration2.default(nodes)];
|
789
|
-
} else if (nodes.selector) {
|
790
|
-
var Rule = require('./rule');
|
791
|
-
nodes = [new Rule(nodes)];
|
792
|
-
} else if (nodes.name) {
|
793
|
-
var AtRule = require('./at-rule');
|
794
|
-
nodes = [new AtRule(nodes)];
|
795
|
-
} else if (nodes.text) {
|
796
|
-
nodes = [new _comment2.default(nodes)];
|
774
|
+
if (_isArray10) {
|
775
|
+
if (_i11 >= _iterator10.length) break;
|
776
|
+
_ref10 = _iterator10[_i11++];
|
797
777
|
} else {
|
798
|
-
|
778
|
+
_i11 = _iterator10.next();
|
779
|
+
if (_i11.done) break;
|
780
|
+
_ref10 = _i11.value;
|
799
781
|
}
|
800
782
|
|
801
|
-
var
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
825
|
-
var AtRule = require('./at-rule');
|
826
|
-
fix = new AtRule();
|
827
|
-
} else if (node.type === 'rule') {
|
828
|
-
var Rule = require('./rule');
|
829
|
-
fix = new Rule();
|
830
|
-
} else if (node.type === 'decl') {
|
831
|
-
fix = new _declaration2.default();
|
832
|
-
} else if (node.type === 'comment') {
|
833
|
-
fix = new _comment2.default();
|
834
|
-
}
|
783
|
+
var _i10 = _ref10;
|
784
|
+
|
785
|
+
if (_i10.parent) _i10.parent.removeChild(_i10, 'ignore');
|
786
|
+
}
|
787
|
+
} else if (nodes.type) {
|
788
|
+
nodes = [nodes];
|
789
|
+
} else if (nodes.prop) {
|
790
|
+
if (typeof nodes.value === 'undefined') {
|
791
|
+
throw new Error('Value field is missed in node creation');
|
792
|
+
} else if (typeof nodes.value !== 'string') {
|
793
|
+
nodes.value = String(nodes.value);
|
794
|
+
}
|
795
|
+
nodes = [new _declaration2.default(nodes)];
|
796
|
+
} else if (nodes.selector) {
|
797
|
+
var Rule = require('./rule');
|
798
|
+
nodes = [new Rule(nodes)];
|
799
|
+
} else if (nodes.name) {
|
800
|
+
var AtRule = require('./at-rule');
|
801
|
+
nodes = [new AtRule(nodes)];
|
802
|
+
} else if (nodes.text) {
|
803
|
+
nodes = [new _comment2.default(nodes)];
|
804
|
+
} else {
|
805
|
+
throw new Error('Unknown node type in node creation');
|
806
|
+
}
|
835
807
|
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
} else if (i === 'parent' && parent) {
|
842
|
-
fix.parent = parent;
|
843
|
-
} else if (node.hasOwnProperty(i)) {
|
844
|
-
fix[i] = node[i];
|
845
|
-
}
|
808
|
+
var processed = nodes.map(function (i) {
|
809
|
+
if (i.parent) i.parent.removeChild(i);
|
810
|
+
if (typeof i.raws.before === 'undefined') {
|
811
|
+
if (sample && typeof sample.raws.before !== 'undefined') {
|
812
|
+
i.raws.before = sample.raws.before.replace(/[^\s]/g, '');
|
846
813
|
}
|
814
|
+
}
|
815
|
+
i.parent = _this2;
|
816
|
+
return i;
|
817
|
+
});
|
847
818
|
|
848
|
-
|
849
|
-
|
819
|
+
return processed;
|
820
|
+
};
|
821
|
+
|
822
|
+
/**
|
823
|
+
* @memberof Container#
|
824
|
+
* @member {Node[]} nodes An array containing the container’s children.
|
825
|
+
*
|
826
|
+
* @example
|
827
|
+
* const root = postcss.parse('a { color: black }')
|
828
|
+
* root.nodes.length //=> 1
|
829
|
+
* root.nodes[0].selector //=> 'a'
|
830
|
+
* root.nodes[0].nodes[0].prop //=> 'color'
|
831
|
+
*/
|
832
|
+
|
833
|
+
|
834
|
+
_createClass(Container, [{
|
835
|
+
key: 'first',
|
836
|
+
get: function get() {
|
837
|
+
if (!this.nodes) return undefined;
|
838
|
+
return this.nodes[0];
|
839
|
+
}
|
850
840
|
|
851
841
|
/**
|
852
|
-
*
|
853
|
-
*
|
842
|
+
* The container’s last child.
|
843
|
+
*
|
844
|
+
* @type {Node}
|
854
845
|
*
|
855
846
|
* @example
|
856
|
-
*
|
857
|
-
* root.nodes.length //=> 1
|
858
|
-
* root.nodes[0].selector //=> 'a'
|
859
|
-
* root.nodes[0].nodes[0].prop //=> 'color'
|
847
|
+
* rule.last === rule.nodes[rule.nodes.length - 1]
|
860
848
|
*/
|
861
849
|
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
/**
|
870
|
-
* The container’s last child.
|
871
|
-
*
|
872
|
-
* @type {Node}
|
873
|
-
*
|
874
|
-
* @example
|
875
|
-
* rule.last == rule.nodes[rule.nodes.length - 1];
|
876
|
-
*/
|
877
|
-
|
878
|
-
}, {
|
879
|
-
key: 'last',
|
880
|
-
get: function get() {
|
881
|
-
if (!this.nodes) return undefined;
|
882
|
-
return this.nodes[this.nodes.length - 1];
|
883
|
-
}
|
884
|
-
}]);
|
850
|
+
}, {
|
851
|
+
key: 'last',
|
852
|
+
get: function get() {
|
853
|
+
if (!this.nodes) return undefined;
|
854
|
+
return this.nodes[this.nodes.length - 1];
|
855
|
+
}
|
856
|
+
}]);
|
885
857
|
|
886
|
-
|
858
|
+
return Container;
|
887
859
|
}(_node2.default);
|
888
860
|
|
889
861
|
exports.default = Container;
|
890
862
|
|
891
863
|
/**
|
892
864
|
* @callback childCondition
|
893
|
-
* @param {Node} node
|
894
|
-
* @param {number} index
|
895
|
-
* @param {Node[]} nodes
|
865
|
+
* @param {Node} node Container child.
|
866
|
+
* @param {number} index Child index.
|
867
|
+
* @param {Node[]} nodes All container children.
|
896
868
|
* @return {boolean}
|
897
869
|
*/
|
898
870
|
|
899
871
|
/**
|
900
872
|
* @callback childIterator
|
901
|
-
* @param {Node} node
|
902
|
-
* @param {number} index
|
903
|
-
* @return {false|undefined}
|
873
|
+
* @param {Node} node Container child.
|
874
|
+
* @param {number} index Child index.
|
875
|
+
* @return {false|undefined} Returning `false` will break iteration.
|
904
876
|
*/
|
905
877
|
|
906
878
|
module.exports = exports['default'];
|
907
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRhaW5lci5lczYiXSwibmFtZXMiOlsiY2xlYW5Tb3VyY2UiLCJub2RlcyIsIm1hcCIsImkiLCJzb3VyY2UiLCJDb250YWluZXIiLCJwdXNoIiwiY2hpbGQiLCJwYXJlbnQiLCJlYWNoIiwiY2FsbGJhY2siLCJsYXN0RWFjaCIsImluZGV4ZXMiLCJpZCIsInVuZGVmaW5lZCIsImluZGV4IiwicmVzdWx0IiwibGVuZ3RoIiwid2FsayIsIndhbGtEZWNscyIsInByb3AiLCJ0eXBlIiwiUmVnRXhwIiwidGVzdCIsIndhbGtSdWxlcyIsInNlbGVjdG9yIiwid2Fsa0F0UnVsZXMiLCJuYW1lIiwid2Fsa0NvbW1lbnRzIiwiYXBwZW5kIiwiY2hpbGRyZW4iLCJub3JtYWxpemUiLCJsYXN0Iiwibm9kZSIsInByZXBlbmQiLCJyZXZlcnNlIiwiZmlyc3QiLCJ1bnNoaWZ0IiwiY2xlYW5SYXdzIiwia2VlcEJldHdlZW4iLCJpbnNlcnRCZWZvcmUiLCJleGlzdCIsImFkZCIsInNwbGljZSIsImluc2VydEFmdGVyIiwicmVtb3ZlQ2hpbGQiLCJyZW1vdmVBbGwiLCJyZXBsYWNlVmFsdWVzIiwicGF0dGVybiIsIm9wdHMiLCJwcm9wcyIsImluZGV4T2YiLCJkZWNsIiwiZmFzdCIsInZhbHVlIiwicmVwbGFjZSIsImV2ZXJ5IiwiY29uZGl0aW9uIiwic29tZSIsInNhbXBsZSIsInBhcnNlIiwicmVxdWlyZSIsIkFycmF5IiwiaXNBcnJheSIsInNsaWNlIiwiRXJyb3IiLCJTdHJpbmciLCJEZWNsYXJhdGlvbiIsIlJ1bGUiLCJBdFJ1bGUiLCJ0ZXh0IiwiQ29tbWVudCIsInByb2Nlc3NlZCIsImJlZm9yZSIsInJlYnVpbGQiLCJyYXdzIiwiZml4IiwiUm9vdCIsImoiLCJoYXNPd25Qcm9wZXJ0eSIsIk5vZGUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7O0FBRUEsU0FBU0EsV0FBVCxDQUFxQkMsS0FBckIsRUFBNEI7QUFD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Zjs7Ozs7Ozs7QUFRQSIsImZpbGUiOiJjb250YWluZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGVjbGFyYXRpb24gZnJvbSAnLi9kZWNsYXJhdGlvbic7XG5pbXBvcnQgQ29tbWVudCAgICAgZnJvbSAnLi9jb21tZW50JztcbmltcG9ydCBOb2RlICAgICAgICBmcm9tICcuL25vZGUnO1xuXG5mdW5jdGlvbiBjbGVhblNvdXJjZShub2Rlcykge1xuICAgIHJldHVybiBub2Rlcy5tYXAoIGkgPT4ge1xuICAgICAgICBpZiAoIGkubm9kZXMgKSBpLm5vZGVzID0gY2xlYW5Tb3VyY2UoaS5ub2Rlcyk7XG4gICAgICAgIGRlbGV0ZSBpLnNvdXJjZTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogVGhlIHtAbGluayBSb290fSwge0BsaW5rIEF0UnVsZX0sIGFuZCB7QGxpbmsgUnVsZX0gY29udGFpbmVyIG5vZGVzXG4gKiBpbmhlcml0IHNvbWUgY29tbW9uIG1ldGhvZHMgdG8gaGVscCB3b3JrIHdpdGggdGhlaXIgY2hpbGRyZW4uXG4gKlxuICogTm90ZSB0aGF0IGFsbCBjb250YWluZXJzIGNhbiBzdG9yZSBhbnkgY29udGVudC4gSWYgeW91IHdyaXRlIGEgcnVsZSBpbnNpZGVcbiAqIGEgcnVsZSwgUG9zdENTUyB3aWxsIHBhcnNlIGl0LlxuICpcbiAqIEBleHRlbmRzIE5vZGVcbiAqIEBhYnN0cmFjdFxuICovXG5jbGFzcyBDb250YWluZXIgZXh0ZW5kcyBOb2RlIHtcblxuICAgIHB1c2goY2hpbGQpIHtcbiAgICAgICAgY2hpbGQucGFyZW50ID0gdGhpcztcbiAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKGNoaWxkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgdGhyb3VnaCB0aGUgY29udGFpbmVy4oCZcyBpbW1lZGlhdGUgY2hpbGRyZW4sXG4gICAgICogY2FsbGluZyBgY2FsbGJhY2tgIGZvciBlYWNoIGNoaWxkLlxuICAgICAqXG4gICAgICogUmV0dXJuaW5nIGBmYWxzZWAgaW4gdGhlIGNhbGxiYWNrIHdpbGwgYnJlYWsgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgb25seSBpdGVyYXRlcyB0aHJvdWdoIHRoZSBjb250YWluZXLigJlzIGltbWVkaWF0ZSBjaGlsZHJlbi5cbiAgICAgKiBJZiB5b3UgbmVlZCB0byByZWN1cnNpdmVseSBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBjb250YWluZXLigJlzIGRlc2NlbmRhbnRcbiAgICAgKiBub2RlcywgdXNlIHtAbGluayBDb250YWluZXIjd2Fsa30uXG4gICAgICpcbiAgICAgKiBVbmxpa2UgdGhlIGZvciBge31gLWN5Y2xlIG9yIGBBcnJheSNmb3JFYWNoYCB0aGlzIGl0ZXJhdG9yIGlzIHNhZmVcbiAgICAgKiBpZiB5b3UgYXJlIG11dGF0aW5nIHRoZSBhcnJheSBvZiBjaGlsZCBub2RlcyBkdXJpbmcgaXRlcmF0aW9uLlxuICAgICAqIFBvc3RDU1Mgd2lsbCBhZGp1c3QgdGhlIGN1cnJlbnQgaW5kZXggdG8gbWF0Y2ggdGhlIG11dGF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Y2hpbGRJdGVyYXRvcn0gY2FsbGJhY2sgLSBpdGVyYXRvciByZWNlaXZlcyBlYWNoIG5vZGUgYW5kIGluZGV4XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtmYWxzZXx1bmRlZmluZWR9IHJldHVybnMgYGZhbHNlYCBpZiBpdGVyYXRpb24gd2FzIGJyb2tlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHJvb3QgPSBwb3N0Y3NzLnBhcnNlKCdhIHsgY29sb3I6IGJsYWNrOyB6LWluZGV4OiAxIH0nKTtcbiAgICAgKiBjb25zdCBydWxlID0gcm9vdC5maXJzdDtcbiAgICAgKlxuICAgICAqIGZvciAoIGxldCBkZWNsIG9mIHJ1bGUubm9kZXMgKSB7XG4gICAgICogICAgIGRlY2wuY2xvbmVCZWZvcmUoeyBwcm9wOiAnLXdlYmtpdC0nICsgZGVjbC5wcm9wIH0pO1xuICAgICAqICAgICAvLyBDeWNsZSB3aWxsIGJlIGluZmluaXRlLCBiZWNhdXNlIGNsb25lQmVmb3JlIG1vdmVzIHRoZSBjdXJyZW50IG5vZGVcbiAgICAgKiAgICAgLy8gdG8gdGhlIG5leHQgaW5kZXhcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBydWxlLmVhY2goZGVjbCA9PiB7XG4gICAgICogICAgIGRlY2wuY2xvbmVCZWZvcmUoeyBwcm9wOiAnLXdlYmtpdC0nICsgZGVjbC5wcm9wIH0pO1xuICAgICAqICAgICAvLyBXaWxsIGJlIGV4ZWN1dGVkIG9ubHkgZm9yIGNvbG9yIGFuZCB6LWluZGV4XG4gICAgICogfSk7XG4gICAgICovXG4gICAgZWFjaChjYWxsYmFjaykge1xuICAgICAgICBpZiAoICF0aGlzLmxhc3RFYWNoICkgdGhpcy5sYXN0RWFjaCA9IDA7XG4gICAgICAgIGlmICggIXRoaXMuaW5kZXhlcyApIHRoaXMuaW5kZXhlcyA9IHsgfTtcblxuICAgICAgICB0aGlzLmxhc3RFYWNoICs9IDE7XG4gICAgICAgIGxldCBpZCA9IHRoaXMubGFzdEVhY2g7XG4gICAgICAgIHRoaXMuaW5kZXhlc1tpZF0gPSAwO1xuXG4gICAgICAgIGlmICggIXRoaXMubm9kZXMgKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBpbmRleCwgcmVzdWx0O1xuICAgICAgICB3aGlsZSAoIHRoaXMuaW5kZXhlc1tpZF0gPCB0aGlzLm5vZGVzLmxlbmd0aCApIHtcbiAgICAgICAgICAgIGluZGV4ICA9IHRoaXMuaW5kZXhlc1tpZF07XG4gICAgICAgICAgICByZXN1bHQgPSBjYWxsYmFjayh0aGlzLm5vZGVzW2luZGV4XSwgaW5kZXgpO1xuICAgICAgICAgICAgaWYgKCByZXN1bHQgPT09IGZhbHNlICkgYnJlYWs7XG5cbiAgICAgICAgICAgIHRoaXMuaW5kZXhlc1tpZF0gKz0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLmluZGV4ZXNbaWRdO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhdmVyc2VzIHRoZSBjb250YWluZXLigJlzIGRlc2NlbmRhbnQgbm9kZXMsIGNhbGxpbmcgY2FsbGJhY2tcbiAgICAgKiBmb3IgZWFjaCBub2RlLlxuICAgICAqXG4gICAgICogTGlrZSBjb250YWluZXIuZWFjaCgpLCB0aGlzIG1ldGhvZCBpcyBzYWZlIHRvIHVzZVxuICAgICAqIGlmIHlvdSBhcmUgbXV0YXRpbmcgYXJyYXlzIGR1cmluZyBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugb25seSBuZWVkIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgY29udGFpbmVy4oCZcyBpbW1lZGlhdGUgY2hpbGRyZW4sXG4gICAgICogdXNlIHtAbGluayBDb250YWluZXIjZWFjaH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2NoaWxkSXRlcmF0b3J9IGNhbGxiYWNrIC0gaXRlcmF0b3IgcmVjZWl2ZXMgZWFjaCBub2RlIGFuZCBpbmRleFxuICAgICAqXG4gICAgICogQHJldHVybiB7ZmFsc2V8dW5kZWZpbmVkfSByZXR1cm5zIGBmYWxzZWAgaWYgaXRlcmF0aW9uIHdhcyBicm9rZVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiByb290LndhbGsobm9kZSA9PiB7XG4gICAgICogICAvLyBUcmF2ZXJzZXMgYWxsIGRlc2NlbmRhbnQgbm9kZXMuXG4gICAgICogfSk7XG4gICAgICovXG4gICAgd2FsayhjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5lYWNoKCAoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBjYWxsYmFjayhjaGlsZCwgaSk7XG4gICAgICAgICAgICBpZiAoIHJlc3VsdCAhPT0gZmFsc2UgJiYgY2hpbGQud2FsayApIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjaGlsZC53YWxrKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYXZlcnNlcyB0aGUgY29udGFpbmVy4oCZcyBkZXNjZW5kYW50IG5vZGVzLCBjYWxsaW5nIGNhbGxiYWNrXG4gICAgICogZm9yIGVhY2ggZGVjbGFyYXRpb24gbm9kZS5cbiAgICAgKlxuICAgICAqIElmIHlvdSBwYXNzIGEgZmlsdGVyLCBpdGVyYXRpb24gd2lsbCBvbmx5IGhhcHBlbiBvdmVyIGRlY2xhcmF0aW9uc1xuICAgICAqIHdpdGggbWF0Y2hpbmcgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIExpa2Uge0BsaW5rIENvbnRhaW5lciNlYWNofSwgdGhpcyBtZXRob2QgaXMgc2FmZVxuICAgICAqIHRvIHVzZSBpZiB5b3UgYXJlIG11dGF0aW5nIGFycmF5cyBkdXJpbmcgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8UmVnRXhwfSBbcHJvcF0gICAtIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZmlsdGVyIGRlY2xhcmF0aW9ucyBieSBwcm9wZXJ0eSBuYW1lXG4gICAgICogQHBhcmFtIHtjaGlsZEl0ZXJhdG9yfSBjYWxsYmFjayAtIGl0ZXJhdG9yIHJlY2VpdmVzIGVhY2ggbm9kZSBhbmQgaW5kZXhcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2ZhbHNlfHVuZGVmaW5lZH0gcmV0dXJucyBgZmFsc2VgIGlmIGl0ZXJhdGlvbiB3YXMgYnJva2VcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogcm9vdC53YWxrRGVjbHMoZGVjbCA9PiB7XG4gICAgICogICBjaGVja1Byb3BlcnR5U3VwcG9ydChkZWNsLnByb3ApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogcm9vdC53YWxrRGVjbHMoJ2JvcmRlci1yYWRpdXMnLCBkZWNsID0+IHtcbiAgICAgKiAgIGRlY2wucmVtb3ZlKCk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiByb290LndhbGtEZWNscygvXmJhY2tncm91bmQvLCBkZWNsID0+IHtcbiAgICAgKiAgIGRlY2wudmFsdWUgPSB0YWtlRmlyc3RDb2xvckZyb21HcmFkaWVudChkZWNsLnZhbHVlKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB3YWxrRGVjbHMocHJvcCwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCAhY2FsbGJhY2sgKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IHByb3A7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53YWxrKCAoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIGNoaWxkLnR5cGUgPT09ICdkZWNsJyApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGNoaWxkLCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICggcHJvcCBpbnN0YW5jZW9mIFJlZ0V4cCApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndhbGsoIChjaGlsZCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICggY2hpbGQudHlwZSA9PT0gJ2RlY2wnICYmIHByb3AudGVzdChjaGlsZC5wcm9wKSApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGNoaWxkLCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndhbGsoIChjaGlsZCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICggY2hpbGQudHlwZSA9PT0gJ2RlY2wnICYmIGNoaWxkLnByb3AgPT09IHByb3AgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhjaGlsZCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmF2ZXJzZXMgdGhlIGNvbnRhaW5lcuKAmXMgZGVzY2VuZGFudCBub2RlcywgY2FsbGluZyBjYWxsYmFja1xuICAgICAqIGZvciBlYWNoIHJ1bGUgbm9kZS5cbiAgICAgKlxuICAgICAqIElmIHlvdSBwYXNzIGEgZmlsdGVyLCBpdGVyYXRpb24gd2lsbCBvbmx5IGhhcHBlbiBvdmVyIHJ1bGVzXG4gICAgICogd2l0aCBtYXRjaGluZyBzZWxlY3RvcnMuXG4gICAgICpcbiAgICAgKiBMaWtlIHtAbGluayBDb250YWluZXIjZWFjaH0sIHRoaXMgbWV0aG9kIGlzIHNhZmVcbiAgICAgKiB0byB1c2UgaWYgeW91IGFyZSBtdXRhdGluZyBhcnJheXMgZHVyaW5nIGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0gW3NlbGVjdG9yXSAtIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBmaWx0ZXIgcnVsZXMgYnkgc2VsZWN0b3JcbiAgICAgKiBAcGFyYW0ge2NoaWxkSXRlcmF0b3J9IGNhbGxiYWNrICAgLSBpdGVyYXRvciByZWNlaXZlcyBlYWNoIG5vZGUgYW5kIGluZGV4XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtmYWxzZXx1bmRlZmluZWR9IHJldHVybnMgYGZhbHNlYCBpZiBpdGVyYXRpb24gd2FzIGJyb2tlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHNlbGVjdG9ycyA9IFtdO1xuICAgICAqIHJvb3Qud2Fsa1J1bGVzKHJ1bGUgPT4ge1xuICAgICAqICAgc2VsZWN0b3JzLnB1c2gocnVsZS5zZWxlY3Rvcik7XG4gICAgICogfSk7XG4gICAgICogY29uc29sZS5sb2coYFlvdXIgQ1NTIHVzZXMgJHtzZWxlY3RvcnMubGVuZ3RofSBzZWxlY3RvcnNgKTtcbiAgICAgKi9cbiAgICB3YWxrUnVsZXMoc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICggIWNhbGxiYWNrICkge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxlY3RvcjtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FsayggKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCBjaGlsZC50eXBlID09PSAncnVsZScgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhjaGlsZCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIHNlbGVjdG9yIGluc3RhbmNlb2YgUmVnRXhwICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FsayggKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCBjaGlsZC50eXBlID09PSAncnVsZScgJiYgc2VsZWN0b3IudGVzdChjaGlsZC5zZWxlY3RvcikgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhjaGlsZCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53YWxrKCAoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIGNoaWxkLnR5cGUgPT09ICdydWxlJyAmJiBjaGlsZC5zZWxlY3RvciA9PT0gc2VsZWN0b3IgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhjaGlsZCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmF2ZXJzZXMgdGhlIGNvbnRhaW5lcuKAmXMgZGVzY2VuZGFudCBub2RlcywgY2FsbGluZyBjYWxsYmFja1xuICAgICAqIGZvciBlYWNoIGF0LXJ1bGUgbm9kZS5cbiAgICAgKlxuICAgICAqIElmIHlvdSBwYXNzIGEgZmlsdGVyLCBpdGVyYXRpb24gd2lsbCBvbmx5IGhhcHBlbiBvdmVyIGF0LXJ1bGVzXG4gICAgICogdGhhdCBoYXZlIG1hdGNoaW5nIG5hbWVzLlxuICAgICAqXG4gICAgICogTGlrZSB7QGxpbmsgQ29udGFpbmVyI2VhY2h9LCB0aGlzIG1ldGhvZCBpcyBzYWZlXG4gICAgICogdG8gdXNlIGlmIHlvdSBhcmUgbXV0YXRpbmcgYXJyYXlzIGR1cmluZyBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IFtuYW1lXSAgIC0gc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBmaWx0ZXIgYXQtcnVsZXMgYnkgbmFtZVxuICAgICAqIEBwYXJhbSB7Y2hpbGRJdGVyYXRvcn0gY2FsbGJhY2sgLSBpdGVyYXRvciByZWNlaXZlcyBlYWNoIG5vZGUgYW5kIGluZGV4XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtmYWxzZXx1bmRlZmluZWR9IHJldHVybnMgYGZhbHNlYCBpZiBpdGVyYXRpb24gd2FzIGJyb2tlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHJvb3Qud2Fsa0F0UnVsZXMocnVsZSA9PiB7XG4gICAgICogICBpZiAoIGlzT2xkKHJ1bGUubmFtZSkgKSBydWxlLnJlbW92ZSgpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogbGV0IGZpcnN0ID0gZmFsc2U7XG4gICAgICogcm9vdC53YWxrQXRSdWxlcygnY2hhcnNldCcsIHJ1bGUgPT4ge1xuICAgICAqICAgaWYgKCAhZmlyc3QgKSB7XG4gICAgICogICAgIGZpcnN0ID0gdHJ1ZTtcbiAgICAgKiAgIH0gZWxzZSB7XG4gICAgICogICAgIHJ1bGUucmVtb3ZlKCk7XG4gICAgICogICB9XG4gICAgICogfSk7XG4gICAgICovXG4gICAgd2Fsa0F0UnVsZXMobmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCAhY2FsbGJhY2sgKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IG5hbWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53YWxrKCAoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIGNoaWxkLnR5cGUgPT09ICdhdHJ1bGUnICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soY2hpbGQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCBuYW1lIGluc3RhbmNlb2YgUmVnRXhwICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FsayggKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCBjaGlsZC50eXBlID09PSAnYXRydWxlJyAmJiBuYW1lLnRlc3QoY2hpbGQubmFtZSkgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhjaGlsZCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53YWxrKCAoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIGNoaWxkLnR5cGUgPT09ICdhdHJ1bGUnICYmIGNoaWxkLm5hbWUgPT09IG5hbWUgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhjaGlsZCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmF2ZXJzZXMgdGhlIGNvbnRhaW5lcuKAmXMgZGVzY2VuZGFudCBub2RlcywgY2FsbGluZyBjYWxsYmFja1xuICAgICAqIGZvciBlYWNoIGNvbW1lbnQgbm9kZS5cbiAgICAgKlxuICAgICAqIExpa2Uge0BsaW5rIENvbnRhaW5lciNlYWNofSwgdGhpcyBtZXRob2QgaXMgc2FmZVxuICAgICAqIHRvIHVzZSBpZiB5b3UgYXJlIG11dGF0aW5nIGFycmF5cyBkdXJpbmcgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtjaGlsZEl0ZXJhdG9yfSBjYWxsYmFjayAtIGl0ZXJhdG9yIHJlY2VpdmVzIGVhY2ggbm9kZSBhbmQgaW5kZXhcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2ZhbHNlfHVuZGVmaW5lZH0gcmV0dXJucyBgZmFsc2VgIGlmIGl0ZXJhdGlvbiB3YXMgYnJva2VcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogcm9vdC53YWxrQ29tbWVudHMoY29tbWVudCA9PiB7XG4gICAgICogICBjb21tZW50LnJlbW92ZSgpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHdhbGtDb21tZW50cyhjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy53YWxrKCAoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgIGlmICggY2hpbGQudHlwZSA9PT0gJ2NvbW1lbnQnICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhjaGlsZCwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydHMgbmV3IG5vZGVzIHRvIHRoZSBlbmQgb2YgdGhlIGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Li4uKE5vZGV8b2JqZWN0fHN0cmluZ3xOb2RlW10pfSBjaGlsZHJlbiAtIG5ldyBub2Rlc1xuICAgICAqXG4gICAgICogQHJldHVybiB7Tm9kZX0gdGhpcyBub2RlIGZvciBtZXRob2RzIGNoYWluXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGRlY2wxID0gcG9zdGNzcy5kZWNsKHsgcHJvcDogJ2NvbG9yJywgdmFsdWU6ICdibGFjaycgfSk7XG4gICAgICogY29uc3QgZGVjbDIgPSBwb3N0Y3NzLmRlY2woeyBwcm9wOiAnYmFja2dyb3VuZC1jb2xvcicsIHZhbHVlOiAnd2hpdGUnIH0pO1xuICAgICAqIHJ1bGUuYXBwZW5kKGRlY2wxLCBkZWNsMik7XG4gICAgICpcbiAgICAgKiByb290LmFwcGVuZCh7IG5hbWU6ICdjaGFyc2V0JywgcGFyYW1zOiAnXCJVVEYtOFwiJyB9KTsgIC8vIGF0LXJ1bGVcbiAgICAgKiByb290LmFwcGVuZCh7IHNlbGVjdG9yOiAnYScgfSk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBydWxlXG4gICAgICogcnVsZS5hcHBlbmQoeyBwcm9wOiAnY29sb3InLCB2YWx1ZTogJ2JsYWNrJyB9KTsgICAgICAgLy8gZGVjbGFyYXRpb25cbiAgICAgKiBydWxlLmFwcGVuZCh7IHRleHQ6ICdDb21tZW50JyB9KSAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tZW50XG4gICAgICpcbiAgICAgKiByb290LmFwcGVuZCgnYSB7fScpO1xuICAgICAqIHJvb3QuZmlyc3QuYXBwZW5kKCdjb2xvcjogYmxhY2s7IHotaW5kZXg6IDEnKTtcbiAgICAgKi9cbiAgICBhcHBlbmQoLi4uY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yICggbGV0IGNoaWxkIG9mIGNoaWxkcmVuICkge1xuICAgICAgICAgICAgbGV0IG5vZGVzID0gdGhpcy5ub3JtYWxpemUoY2hpbGQsIHRoaXMubGFzdCk7XG4gICAgICAgICAgICBmb3IgKCBsZXQgbm9kZSBvZiBub2RlcyApIHRoaXMubm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIG5ldyBub2RlcyB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Li4uKE5vZGV8b2JqZWN0fHN0cmluZ3xOb2RlW10pfSBjaGlsZHJlbiAtIG5ldyBub2Rlc1xuICAgICAqXG4gICAgICogQHJldHVybiB7Tm9kZX0gdGhpcyBub2RlIGZvciBtZXRob2RzIGNoYWluXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGRlY2wxID0gcG9zdGNzcy5kZWNsKHsgcHJvcDogJ2NvbG9yJywgdmFsdWU6ICdibGFjaycgfSk7XG4gICAgICogY29uc3QgZGVjbDIgPSBwb3N0Y3NzLmRlY2woeyBwcm9wOiAnYmFja2dyb3VuZC1jb2xvcicsIHZhbHVlOiAnd2hpdGUnIH0pO1xuICAgICAqIHJ1bGUucHJlcGVuZChkZWNsMSwgZGVjbDIpO1xuICAgICAqXG4gICAgICogcm9vdC5hcHBlbmQoeyBuYW1lOiAnY2hhcnNldCcsIHBhcmFtczogJ1wiVVRGLThcIicgfSk7ICAvLyBhdC1ydWxlXG4gICAgICogcm9vdC5hcHBlbmQoeyBzZWxlY3RvcjogJ2EnIH0pOyAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVsZVxuICAgICAqIHJ1bGUuYXBwZW5kKHsgcHJvcDogJ2NvbG9yJywgdmFsdWU6ICdibGFjaycgfSk7ICAgICAgIC8vIGRlY2xhcmF0aW9uXG4gICAgICogcnVsZS5hcHBlbmQoeyB0ZXh0OiAnQ29tbWVudCcgfSkgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWVudFxuICAgICAqXG4gICAgICogcm9vdC5hcHBlbmQoJ2Ege30nKTtcbiAgICAgKiByb290LmZpcnN0LmFwcGVuZCgnY29sb3I6IGJsYWNrOyB6LWluZGV4OiAxJyk7XG4gICAgICovXG4gICAgcHJlcGVuZCguLi5jaGlsZHJlbikge1xuICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLnJldmVyc2UoKTtcbiAgICAgICAgZm9yICggbGV0IGNoaWxkIG9mIGNoaWxkcmVuICkge1xuICAgICAgICAgICAgbGV0IG5vZGVzID0gdGhpcy5ub3JtYWxpemUoY2hpbGQsIHRoaXMuZmlyc3QsICdwcmVwZW5kJykucmV2ZXJzZSgpO1xuICAgICAgICAgICAgZm9yICggbGV0IG5vZGUgb2Ygbm9kZXMgKSB0aGlzLm5vZGVzLnVuc2hpZnQobm9kZSk7XG4gICAgICAgICAgICBmb3IgKCBsZXQgaWQgaW4gdGhpcy5pbmRleGVzICkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhlc1tpZF0gPSB0aGlzLmluZGV4ZXNbaWRdICsgbm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGNsZWFuUmF3cyhrZWVwQmV0d2Vlbikge1xuICAgICAgICBzdXBlci5jbGVhblJhd3Moa2VlcEJldHdlZW4pO1xuICAgICAgICBpZiAoIHRoaXMubm9kZXMgKSB7XG4gICAgICAgICAgICBmb3IgKCBsZXQgbm9kZSBvZiB0aGlzLm5vZGVzICkgbm9kZS5jbGVhblJhd3Moa2VlcEJldHdlZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0IG5ldyBub2RlIGJlZm9yZSBvbGQgbm9kZSB3aXRoaW4gdGhlIGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Tm9kZXxudW1iZXJ9IGV4aXN0ICAgICAgICAgICAgIC0gY2hpbGQgb3IgY2hpbGTigJlzIGluZGV4LlxuICAgICAqIEBwYXJhbSB7Tm9kZXxvYmplY3R8c3RyaW5nfE5vZGVbXX0gYWRkIC0gbmV3IG5vZGVcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge05vZGV9IHRoaXMgbm9kZSBmb3IgbWV0aG9kcyBjaGFpblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBydWxlLmluc2VydEJlZm9yZShkZWNsLCBkZWNsLmNsb25lKHsgcHJvcDogJy13ZWJraXQtJyArIGRlY2wucHJvcCB9KSk7XG4gICAgICovXG4gICAgaW5zZXJ0QmVmb3JlKGV4aXN0LCBhZGQpIHtcbiAgICAgICAgZXhpc3QgPSB0aGlzLmluZGV4KGV4aXN0KTtcblxuICAgICAgICBsZXQgdHlwZSAgPSBleGlzdCA9PT0gMCA/ICdwcmVwZW5kJyA6IGZhbHNlO1xuICAgICAgICBsZXQgbm9kZXMgPSB0aGlzLm5vcm1hbGl6ZShhZGQsIHRoaXMubm9kZXNbZXhpc3RdLCB0eXBlKS5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAoIGxldCBub2RlIG9mIG5vZGVzICkgdGhpcy5ub2Rlcy5zcGxpY2UoZXhpc3QsIDAsIG5vZGUpO1xuXG4gICAgICAgIGxldCBpbmRleDtcbiAgICAgICAgZm9yICggbGV0IGlkIGluIHRoaXMuaW5kZXhlcyApIHtcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5pbmRleGVzW2lkXTtcbiAgICAgICAgICAgIGlmICggZXhpc3QgPD0gaW5kZXggKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleGVzW2lkXSA9IGluZGV4ICsgbm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0IG5ldyBub2RlIGFmdGVyIG9sZCBub2RlIHdpdGhpbiB0aGUgY29udGFpbmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOb2RlfG51bWJlcn0gZXhpc3QgICAgICAgICAgICAgLSBjaGlsZCBvciBjaGlsZOKAmXMgaW5kZXhcbiAgICAgKiBAcGFyYW0ge05vZGV8b2JqZWN0fHN0cmluZ3xOb2RlW119IGFkZCAtIG5ldyBub2RlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtOb2RlfSB0aGlzIG5vZGUgZm9yIG1ldGhvZHMgY2hhaW5cbiAgICAgKi9cbiAgICBpbnNlcnRBZnRlcihleGlzdCwgYWRkKSB7XG4gICAgICAgIGV4aXN0ID0gdGhpcy5pbmRleChleGlzdCk7XG5cbiAgICAgICAgbGV0IG5vZGVzID0gdGhpcy5ub3JtYWxpemUoYWRkLCB0aGlzLm5vZGVzW2V4aXN0XSkucmV2ZXJzZSgpO1xuICAgICAgICBmb3IgKCBsZXQgbm9kZSBvZiBub2RlcyApIHRoaXMubm9kZXMuc3BsaWNlKGV4aXN0ICsgMSwgMCwgbm9kZSk7XG5cbiAgICAgICAgbGV0IGluZGV4O1xuICAgICAgICBmb3IgKCBsZXQgaWQgaW4gdGhpcy5pbmRleGVzICkge1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmluZGV4ZXNbaWRdO1xuICAgICAgICAgICAgaWYgKCBleGlzdCA8IGluZGV4ICkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhlc1tpZF0gPSBpbmRleCArIG5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgbm9kZSBmcm9tIHRoZSBjb250YWluZXIgYW5kIGNsZWFucyB0aGUgcGFyZW50IHByb3BlcnRpZXNcbiAgICAgKiBmcm9tIHRoZSBub2RlIGFuZCBpdHMgY2hpbGRyZW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge05vZGV8bnVtYmVyfSBjaGlsZCAtIGNoaWxkIG9yIGNoaWxk4oCZcyBpbmRleFxuICAgICAqXG4gICAgICogQHJldHVybiB7Tm9kZX0gdGhpcyBub2RlIGZvciBtZXRob2RzIGNoYWluXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHJ1bGUubm9kZXMubGVuZ3RoICAvLz0+IDVcbiAgICAgKiBydWxlLnJlbW92ZUNoaWxkKGRlY2wpO1xuICAgICAqIHJ1bGUubm9kZXMubGVuZ3RoICAvLz0+IDRcbiAgICAgKiBkZWNsLnBhcmVudCAgICAgICAgLy89PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICByZW1vdmVDaGlsZChjaGlsZCkge1xuICAgICAgICBjaGlsZCA9IHRoaXMuaW5kZXgoY2hpbGQpO1xuICAgICAgICB0aGlzLm5vZGVzW2NoaWxkXS5wYXJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubm9kZXMuc3BsaWNlKGNoaWxkLCAxKTtcblxuICAgICAgICBsZXQgaW5kZXg7XG4gICAgICAgIGZvciAoIGxldCBpZCBpbiB0aGlzLmluZGV4ZXMgKSB7XG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuaW5kZXhlc1tpZF07XG4gICAgICAgICAgICBpZiAoIGluZGV4ID49IGNoaWxkICkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhlc1tpZF0gPSBpbmRleCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBjaGlsZHJlbiBmcm9tIHRoZSBjb250YWluZXJcbiAgICAgKiBhbmQgY2xlYW5zIHRoZWlyIHBhcmVudCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Tm9kZX0gdGhpcyBub2RlIGZvciBtZXRob2RzIGNoYWluXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHJ1bGUucmVtb3ZlQWxsKCk7XG4gICAgICogcnVsZS5ub2Rlcy5sZW5ndGggLy89PiAwXG4gICAgICovXG4gICAgcmVtb3ZlQWxsKCkge1xuICAgICAgICBmb3IgKCBsZXQgbm9kZSBvZiB0aGlzLm5vZGVzICkgbm9kZS5wYXJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubm9kZXMgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFzc2VzIGFsbCBkZWNsYXJhdGlvbiB2YWx1ZXMgd2l0aGluIHRoZSBjb250YWluZXIgdGhhdCBtYXRjaCBwYXR0ZXJuXG4gICAgICogdGhyb3VnaCBjYWxsYmFjaywgcmVwbGFjaW5nIHRob3NlIHZhbHVlcyB3aXRoIHRoZSByZXR1cm5lZCByZXN1bHRcbiAgICAgKiBvZiBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIHVzaW5nIGEgY3VzdG9tIHVuaXQgb3IgZnVuY3Rpb25cbiAgICAgKiBhbmQgbmVlZCB0byBpdGVyYXRlIHRocm91Z2ggYWxsIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0gcGF0dGVybiAgICAgIC0gcmVwbGFjZSBwYXR0ZXJuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHMgICAgICAgICAgICAgICAgLSBvcHRpb25zIHRvIHNwZWVkIHVwIHRoZSBzZWFyY2hcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gb3B0cy5wcm9wcyAtIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuZmFzdCAgICAgICAgICAgLSBzdHJpbmcgdGhhdOKAmXMgdXNlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gbmFycm93IGRvd24gdmFsdWVzIGFuZCBzcGVlZCB1cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlZ2V4cCBzZWFyY2hcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufHN0cmluZ30gY2FsbGJhY2sgICAtIHN0cmluZyB0byByZXBsYWNlIHBhdHRlcm5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxiYWNrIHRoYXQgcmV0dXJucyBhIG5ld1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgY2FsbGJhY2sgd2lsbCByZWNlaXZlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBhcmd1bWVudHMgYXMgdGhvc2VcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCB0byBhIGZ1bmN0aW9uIHBhcmFtZXRlclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYFN0cmluZyNyZXBsYWNlYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge05vZGV9IHRoaXMgbm9kZSBmb3IgbWV0aG9kcyBjaGFpblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiByb290LnJlcGxhY2VWYWx1ZXMoL1xcZCtyZW0vLCB7IGZhc3Q6ICdyZW0nIH0sIHN0cmluZyA9PiB7XG4gICAgICogICByZXR1cm4gMTUgKiBwYXJzZUludChzdHJpbmcpICsgJ3B4JztcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICByZXBsYWNlVmFsdWVzKHBhdHRlcm4sIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICggIWNhbGxiYWNrICkge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgICAgICAgb3B0cyA9IHsgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud2Fsa0RlY2xzKCBkZWNsID0+IHtcbiAgICAgICAgICAgIGlmICggb3B0cy5wcm9wcyAmJiBvcHRzLnByb3BzLmluZGV4T2YoZGVjbC5wcm9wKSA9PT0gLTEgKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIG9wdHMuZmFzdCAgJiYgZGVjbC52YWx1ZS5pbmRleE9mKG9wdHMuZmFzdCkgPT09IC0xICkgcmV0dXJuO1xuXG4gICAgICAgICAgICBkZWNsLnZhbHVlID0gZGVjbC52YWx1ZS5yZXBsYWNlKHBhdHRlcm4sIGNhbGxiYWNrKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWBcbiAgICAgKiBmb3IgYWxsIG9mIHRoZSBjb250YWluZXLigJlzIGNoaWxkcmVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtjaGlsZENvbmRpdGlvbn0gY29uZGl0aW9uIC0gaXRlcmF0b3IgcmV0dXJucyB0cnVlIG9yIGZhbHNlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gaXMgZXZlcnkgY2hpbGQgcGFzcyBjb25kaXRpb25cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgbm9QcmVmaXhlcyA9IHJ1bGUuZXZlcnkoaSA9PiBpLnByb3BbMF0gIT09ICctJyk7XG4gICAgICovXG4gICAgZXZlcnkoY29uZGl0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzLmV2ZXJ5KGNvbmRpdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIChhdCBsZWFzdCkgb25lXG4gICAgICogb2YgdGhlIGNvbnRhaW5lcuKAmXMgY2hpbGRyZW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2NoaWxkQ29uZGl0aW9ufSBjb25kaXRpb24gLSBpdGVyYXRvciByZXR1cm5zIHRydWUgb3IgZmFsc2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBpcyBzb21lIGNoaWxkIHBhc3MgY29uZGl0aW9uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGhhc1ByZWZpeCA9IHJ1bGUuc29tZShpID0+IGkucHJvcFswXSA9PT0gJy0nKTtcbiAgICAgKi9cbiAgICBzb21lKGNvbmRpdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlcy5zb21lKGNvbmRpdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGBjaGlsZGDigJlzIGluZGV4IHdpdGhpbiB0aGUge0BsaW5rIENvbnRhaW5lciNub2Rlc30gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge05vZGV9IGNoaWxkIC0gY2hpbGQgb2YgdGhlIGN1cnJlbnQgY29udGFpbmVyLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBjaGlsZCBpbmRleFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBydWxlLmluZGV4KCBydWxlLm5vZGVzWzJdICkgLy89PiAyXG4gICAgICovXG4gICAgaW5kZXgoY2hpbGQpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgY2hpbGQgPT09ICdudW1iZXInICkge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZXMuaW5kZXhPZihjaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGFpbmVy4oCZcyBmaXJzdCBjaGlsZC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtOb2RlfVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBydWxlLmZpcnN0ID09IHJ1bGVzLm5vZGVzWzBdO1xuICAgICAqL1xuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgaWYgKCAhdGhpcy5ub2RlcyApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzWzBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjb250YWluZXLigJlzIGxhc3QgY2hpbGQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7Tm9kZX1cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogcnVsZS5sYXN0ID09IHJ1bGUubm9kZXNbcnVsZS5ub2Rlcy5sZW5ndGggLSAxXTtcbiAgICAgKi9cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgaWYgKCAhdGhpcy5ub2RlcyApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzW3RoaXMubm9kZXMubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgbm9ybWFsaXplKG5vZGVzLCBzYW1wbGUpIHtcbiAgICAgICAgaWYgKCB0eXBlb2Ygbm9kZXMgPT09ICdzdHJpbmcnICkge1xuICAgICAgICAgICAgbGV0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpO1xuICAgICAgICAgICAgbm9kZXMgPSBjbGVhblNvdXJjZShwYXJzZShub2Rlcykubm9kZXMpO1xuICAgICAgICB9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KG5vZGVzKSApIHtcbiAgICAgICAgICAgIG5vZGVzID0gbm9kZXMuc2xpY2UoMCk7XG4gICAgICAgICAgICBmb3IgKCBsZXQgaSBvZiBub2RlcyApIHtcbiAgICAgICAgICAgICAgICBpZiAoIGkucGFyZW50ICkgaS5wYXJlbnQucmVtb3ZlQ2hpbGQoaSwgJ2lnbm9yZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCBub2Rlcy50eXBlID09PSAncm9vdCcgKSB7XG4gICAgICAgICAgICBub2RlcyA9IG5vZGVzLm5vZGVzLnNsaWNlKDApO1xuICAgICAgICAgICAgZm9yICggbGV0IGkgb2Ygbm9kZXMgKSB7XG4gICAgICAgICAgICAgICAgaWYgKCBpLnBhcmVudCApIGkucGFyZW50LnJlbW92ZUNoaWxkKGksICdpZ25vcmUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICggbm9kZXMudHlwZSApIHtcbiAgICAgICAgICAgIG5vZGVzID0gW25vZGVzXTtcbiAgICAgICAgfSBlbHNlIGlmICggbm9kZXMucHJvcCApIHtcbiAgICAgICAgICAgIGlmICggdHlwZW9mIG5vZGVzLnZhbHVlID09PSAndW5kZWZpbmVkJyApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIGZpZWxkIGlzIG1pc3NlZCBpbiBub2RlIGNyZWF0aW9uJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2Ygbm9kZXMudmFsdWUgIT09ICdzdHJpbmcnICkge1xuICAgICAgICAgICAgICAgIG5vZGVzLnZhbHVlID0gU3RyaW5nKG5vZGVzLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVzID0gW25ldyBEZWNsYXJhdGlvbihub2RlcyldO1xuICAgICAgICB9IGVsc2UgaWYgKCBub2Rlcy5zZWxlY3RvciApIHtcbiAgICAgICAgICAgIGxldCBSdWxlID0gcmVxdWlyZSgnLi9ydWxlJyk7XG4gICAgICAgICAgICBub2RlcyA9IFtuZXcgUnVsZShub2RlcyldO1xuICAgICAgICB9IGVsc2UgaWYgKCBub2Rlcy5uYW1lICkge1xuICAgICAgICAgICAgbGV0IEF0UnVsZSA9IHJlcXVpcmUoJy4vYXQtcnVsZScpO1xuICAgICAgICAgICAgbm9kZXMgPSBbbmV3IEF0UnVsZShub2RlcyldO1xuICAgICAgICB9IGVsc2UgaWYgKCBub2Rlcy50ZXh0ICkge1xuICAgICAgICAgICAgbm9kZXMgPSBbbmV3IENvbW1lbnQobm9kZXMpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBub2RlIHR5cGUgaW4gbm9kZSBjcmVhdGlvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByb2Nlc3NlZCA9IG5vZGVzLm1hcCggaSA9PiB7XG4gICAgICAgICAgICBpZiAoIHR5cGVvZiBpLmJlZm9yZSAhPT0gJ2Z1bmN0aW9uJyApIGkgPSB0aGlzLnJlYnVpbGQoaSk7XG5cbiAgICAgICAgICAgIGlmICggaS5wYXJlbnQgKSBpLnBhcmVudC5yZW1vdmVDaGlsZChpKTtcbiAgICAgICAgICAgIGlmICggdHlwZW9mIGkucmF3cy5iZWZvcmUgPT09ICd1bmRlZmluZWQnICkge1xuICAgICAgICAgICAgICAgIGlmICggc2FtcGxlICYmIHR5cGVvZiBzYW1wbGUucmF3cy5iZWZvcmUgIT09ICd1bmRlZmluZWQnICkge1xuICAgICAgICAgICAgICAgICAgICBpLnJhd3MuYmVmb3JlID0gc2FtcGxlLnJhd3MuYmVmb3JlLnJlcGxhY2UoL1teXFxzXS9nLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaS5wYXJlbnQgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwcm9jZXNzZWQ7XG4gICAgfVxuXG4gICAgcmVidWlsZChub2RlLCBwYXJlbnQpIHtcbiAgICAgICAgbGV0IGZpeDtcbiAgICAgICAgaWYgKCBub2RlLnR5cGUgPT09ICdyb290JyApIHtcbiAgICAgICAgICAgIGxldCBSb290ID0gcmVxdWlyZSgnLi9yb290Jyk7XG4gICAgICAgICAgICBmaXggPSBuZXcgUm9vdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKCBub2RlLnR5cGUgPT09ICdhdHJ1bGUnICkge1xuICAgICAgICAgICAgbGV0IEF0UnVsZSA9IHJlcXVpcmUoJy4vYXQtcnVsZScpO1xuICAgICAgICAgICAgZml4ID0gbmV3IEF0UnVsZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCBub2RlLnR5cGUgPT09ICdydWxlJyApIHtcbiAgICAgICAgICAgIGxldCBSdWxlID0gcmVxdWlyZSgnLi9ydWxlJyk7XG4gICAgICAgICAgICBmaXggPSBuZXcgUnVsZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCBub2RlLnR5cGUgPT09ICdkZWNsJyApIHtcbiAgICAgICAgICAgIGZpeCA9IG5ldyBEZWNsYXJhdGlvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKCBub2RlLnR5cGUgPT09ICdjb21tZW50JyApIHtcbiAgICAgICAgICAgIGZpeCA9IG5ldyBDb21tZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKCBsZXQgaSBpbiBub2RlICkge1xuICAgICAgICAgICAgaWYgKCBpID09PSAnbm9kZXMnICkge1xuICAgICAgICAgICAgICAgIGZpeC5ub2RlcyA9IG5vZGUubm9kZXMubWFwKCBqID0+IHRoaXMucmVidWlsZChqLCBmaXgpICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCBpID09PSAncGFyZW50JyAmJiBwYXJlbnQgKSB7XG4gICAgICAgICAgICAgICAgZml4LnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIG5vZGUuaGFzT3duUHJvcGVydHkoaSkgKSB7XG4gICAgICAgICAgICAgICAgZml4W2ldID0gbm9kZVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIENvbnRhaW5lciNcbiAgICAgKiBAbWVtYmVyIHtOb2RlW119IG5vZGVzIC0gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29udGFpbmVy4oCZcyBjaGlsZHJlblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCByb290ID0gcG9zdGNzcy5wYXJzZSgnYSB7IGNvbG9yOiBibGFjayB9Jyk7XG4gICAgICogcm9vdC5ub2Rlcy5sZW5ndGggICAgICAgICAgIC8vPT4gMVxuICAgICAqIHJvb3Qubm9kZXNbMF0uc2VsZWN0b3IgICAgICAvLz0+ICdhJ1xuICAgICAqIHJvb3Qubm9kZXNbMF0ubm9kZXNbMF0ucHJvcCAvLz0+ICdjb2xvcidcbiAgICAgKi9cblxufVxuXG5leHBvcnQgZGVmYXVsdCBDb250YWluZXI7XG5cblxuLyoqXG4gKiBAY2FsbGJhY2sgY2hpbGRDb25kaXRpb25cbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAgICAtIGNvbnRhaW5lciBjaGlsZFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gY2hpbGQgaW5kZXhcbiAqIEBwYXJhbSB7Tm9kZVtdfSBub2RlcyAtIGFsbCBjb250YWluZXIgY2hpbGRyZW5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgY2hpbGRJdGVyYXRvclxuICogQHBhcmFtIHtOb2RlfSBub2RlICAgIC0gY29udGFpbmVyIGNoaWxkXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBjaGlsZCBpbmRleFxuICogQHJldHVybiB7ZmFsc2V8dW5kZWZpbmVkfSByZXR1cm5pbmcgYGZhbHNlYCB3aWxsIGJyZWFrIGl0ZXJhdGlvblxuICovXG4iXX0=
|
879
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRhaW5lci5lczYiXSwibmFtZXMiOlsiY2xlYW5Tb3VyY2UiLCJub2RlcyIsIm1hcCIsImkiLCJzb3VyY2UiLCJDb250YWluZXIiLCJwdXNoIiwiY2hpbGQiLCJwYXJlbnQiLCJlYWNoIiwiY2FsbGJhY2siLCJsYXN0RWFjaCIsImluZGV4ZXMiLCJpZCIsInVuZGVmaW5lZCIsImluZGV4IiwicmVzdWx0IiwibGVuZ3RoIiwid2FsayIsImUiLCJwb3N0Y3NzTm9kZSIsInN0YWNrIiwidGVzdCIsInMiLCJyZXBsYWNlIiwiaW5wdXQiLCJmcm9tIiwic3RhcnQiLCJsaW5lIiwiY29sdW1uIiwid2Fsa0RlY2xzIiwicHJvcCIsInR5cGUiLCJSZWdFeHAiLCJ3YWxrUnVsZXMiLCJzZWxlY3RvciIsIndhbGtBdFJ1bGVzIiwibmFtZSIsIndhbGtDb21tZW50cyIsImFwcGVuZCIsImNoaWxkcmVuIiwibm9ybWFsaXplIiwibGFzdCIsIm5vZGUiLCJwcmVwZW5kIiwicmV2ZXJzZSIsImZpcnN0IiwidW5zaGlmdCIsImNsZWFuUmF3cyIsImtlZXBCZXR3ZWVuIiwiaW5zZXJ0QmVmb3JlIiwiZXhpc3QiLCJhZGQiLCJzcGxpY2UiLCJpbnNlcnRBZnRlciIsInJlbW92ZUNoaWxkIiwicmVtb3ZlQWxsIiwicmVwbGFjZVZhbHVlcyIsInBhdHRlcm4iLCJvcHRzIiwicHJvcHMiLCJpbmRleE9mIiwiZGVjbCIsImZhc3QiLCJ2YWx1ZSIsImV2ZXJ5IiwiY29uZGl0aW9uIiwic29tZSIsInNhbXBsZSIsInBhcnNlIiwicmVxdWlyZSIsIkFycmF5IiwiaXNBcnJheSIsInNsaWNlIiwiRXJyb3IiLCJTdHJpbmciLCJEZWNsYXJhdGlvbiIsIlJ1bGUiLCJBdFJ1bGUiLCJ0ZXh0IiwiQ29tbWVudCIsInByb2Nlc3NlZCIsInJhd3MiLCJiZWZvcmUiLCJOb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7OztBQUVBLFNBQVNBLFdBQVQsQ0FBc0JDLEtBQXRCLEVBQTZCO0FBQzNCLFNBQU9BLE1BQU1DLEdBQU4sQ0FBVSxhQUFLO0FBQ3BCLFFBQUlDLEVBQUVGLEtBQU4sRUFBYUUsRUFBRUYsS0FBRixHQUFVRCxZQUFZRyxFQUFFRixLQUFkLENBQVY7QUFDYixXQUFPRSxFQUFFQyxNQUFUO0FBQ0EsV0FBT0QsQ0FBUDtBQUNELEdBSk0sQ0FBUDtBQUtEOztBQUVEOzs7Ozs7Ozs7OztJQVVNRSxTOzs7Ozs7Ozs7c0JBQ0pDLEksaUJBQU1DLEssRUFBTztBQUNYQSxVQUFNQyxNQUFOLEdBQWUsSUFBZjtBQUNBLFNBQUtQLEtBQUwsQ0FBV0ssSUFBWCxDQUFnQkMsS0FBaEI7QUFDQSxXQUFPLElBQVA7QUFDRCxHOztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQkFpQ0FFLEksaUJBQU1DLFEsRUFBVTtBQUNkLFFBQUksQ0FBQyxLQUFLQyxRQUFWLEVBQW9CLEtBQUtBLFFBQUwsR0FBZ0IsQ0FBaEI7QUFDcEIsUUFBSSxDQUFDLEtBQUtDLE9BQVYsRUFBbUIsS0FBS0EsT0FBTCxHQUFlLEVBQWY7O0FBRW5CLFNBQUtELFFBQUwsSUFBaUIsQ0FBakI7QUFDQSxRQUFJRSxLQUFLLEtBQUtGLFFBQWQ7QUFDQSxTQUFLQyxPQUFMLENBQWFDLEVBQWIsSUFBbUIsQ0FBbkI7O0FBRUEsUUFBSSxDQUFDLEtBQUtaLEtBQVYsRUFBaUIsT0FBT2EsU0FBUDs7QUFFakIsUUFBSUMsY0FBSjtBQUFBLFFBQVdDLGVBQVg7QUFDQSxXQUFPLEtBQUtKLE9BQUwsQ0FBYUMsRUFBYixJQUFtQixLQUFLWixLQUFMLENBQVdnQixNQUFyQyxFQUE2QztBQUMzQ0YsY0FBUSxLQUFLSCxPQUFMLENBQWFDLEVBQWIsQ0FBUjtBQUNBRyxlQUFTTixTQUFTLEtBQUtULEtBQUwsQ0FBV2MsS0FBWCxDQUFULEVBQTRCQSxLQUE1QixDQUFUO0FBQ0EsVUFBSUMsV0FBVyxLQUFmLEVBQXNCOztBQUV0QixXQUFLSixPQUFMLENBQWFDLEVBQWIsS0FBb0IsQ0FBcEI7QUFDRDs7QUFFRCxXQUFPLEtBQUtELE9BQUwsQ0FBYUMsRUFBYixDQUFQOztBQUVBLFdBQU9HLE1BQVA7QUFDRCxHOztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7c0JBbUJBRSxJLGlCQUFNUixRLEVBQVU7QUFDZCxXQUFPLEtBQUtELElBQUwsQ0FBVSxVQUFDRixLQUFELEVBQVFKLENBQVIsRUFBYztBQUM3QixVQUFJYSxlQUFKO0FBQ0EsVUFBSTtBQUNGQSxpQkFBU04sU0FBU0gsS0FBVCxFQUFnQkosQ0FBaEIsQ0FBVDtBQUNELE9BRkQsQ0FFRSxPQUFPZ0IsQ0FBUCxFQUFVO0FBQ1ZBLFVBQUVDLFdBQUYsR0FBZ0JiLEtBQWhCO0FBQ0EsWUFBSVksRUFBRUUsS0FBRixJQUFXZCxNQUFNSCxNQUFqQixJQUEyQixhQUFha0IsSUFBYixDQUFrQkgsRUFBRUUsS0FBcEIsQ0FBL0IsRUFBMkQ7QUFDekQsY0FBSUUsSUFBSWhCLE1BQU1ILE1BQWQ7QUFDQWUsWUFBRUUsS0FBRixHQUFVRixFQUFFRSxLQUFGLENBQVFHLE9BQVIsQ0FBZ0IsWUFBaEIsU0FDRkQsRUFBRUUsS0FBRixDQUFRQyxJQUROLFNBQ2dCSCxFQUFFSSxLQUFGLENBQVFDLElBRHhCLFNBQ2tDTCxFQUFFSSxLQUFGLENBQVFFLE1BRDFDLFFBQVY7QUFFRDtBQUNELGNBQU1WLENBQU47QUFDRDtBQUNELFVBQUlILFdBQVcsS0FBWCxJQUFvQlQsTUFBTVcsSUFBOUIsRUFBb0M7QUFDbENGLGlCQUFTVCxNQUFNVyxJQUFOLENBQVdSLFFBQVgsQ0FBVDtBQUNEO0FBQ0QsYUFBT00sTUFBUDtBQUNELEtBakJNLENBQVA7QUFrQkQsRzs7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQkE2QkFjLFMsc0JBQVdDLEksRUFBTXJCLFEsRUFBVTtBQUN6QixRQUFJLENBQUNBLFFBQUwsRUFBZTtBQUNiQSxpQkFBV3FCLElBQVg7QUFDQSxhQUFPLEtBQUtiLElBQUwsQ0FBVSxVQUFDWCxLQUFELEVBQVFKLENBQVIsRUFBYztBQUM3QixZQUFJSSxNQUFNeUIsSUFBTixLQUFlLE1BQW5CLEVBQTJCO0FBQ3pCLGlCQUFPdEIsU0FBU0gsS0FBVCxFQUFnQkosQ0FBaEIsQ0FBUDtBQUNEO0FBQ0YsT0FKTSxDQUFQO0FBS0QsS0FQRCxNQU9PLElBQUk0QixnQkFBZ0JFLE1BQXBCLEVBQTRCO0FBQ2pDLGFBQU8sS0FBS2YsSUFBTCxDQUFVLFVBQUNYLEtBQUQsRUFBUUosQ0FBUixFQUFjO0FBQzdCLFlBQUlJLE1BQU15QixJQUFOLEtBQWUsTUFBZixJQUF5QkQsS0FBS1QsSUFBTCxDQUFVZixNQUFNd0IsSUFBaEIsQ0FBN0IsRUFBb0Q7QUFDbEQsaUJBQU9yQixTQUFTSCxLQUFULEVBQWdCSixDQUFoQixDQUFQO0FBQ0Q7QUFDRixPQUpNLENBQVA7QUFLRCxLQU5NLE1BTUE7QUFDTCxhQUFPLEtBQUtlLElBQUwsQ0FBVSxVQUFDWCxLQUFELEVBQVFKLENBQVIsRUFBYztBQUM3QixZQUFJSSxNQUFNeUIsSUFBTixLQUFlLE1BQWYsSUFBeUJ6QixNQUFNd0IsSUFBTixLQUFlQSxJQUE1QyxFQUFrRDtBQUNoRCxpQkFBT3JCLFNBQVNILEtBQVQsRUFBZ0JKLENBQWhCLENBQVA7QUFDRDtBQUNGLE9BSk0sQ0FBUDtBQUtEO0FBQ0YsRzs7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQkF1QkErQixTLHNCQUFXQyxRLEVBQVV6QixRLEVBQVU7QUFDN0IsUUFBSSxDQUFDQSxRQUFMLEVBQWU7QUFDYkEsaUJBQVd5QixRQUFYOztBQUVBLGFBQU8sS0FBS2pCLElBQUwsQ0FBVSxVQUFDWCxLQUFELEVBQVFKLENBQVIsRUFBYztBQUM3QixZQUFJSSxNQUFNeUIsSUFBTixLQUFlLE1BQW5CLEVBQTJCO0FBQ3pCLGlCQUFPdEIsU0FBU0gsS0FBVCxFQUFnQkosQ0FBaEIsQ0FBUDtBQUNEO0FBQ0YsT0FKTSxDQUFQO0FBS0QsS0FSRCxNQVFPLElBQUlnQyxvQkFBb0JGLE1BQXhCLEVBQWdDO0FBQ3JDLGFBQU8sS0FBS2YsSUFBTCxDQUFVLFVBQUNYLEtBQUQsRUFBUUosQ0FBUixFQUFjO0FBQzdCLFlBQUlJLE1BQU15QixJQUFOLEtBQWUsTUFBZixJQUF5QkcsU0FBU2IsSUFBVCxDQUFjZixNQUFNNEIsUUFBcEIsQ0FBN0IsRUFBNEQ7QUFDMUQsaUJBQU96QixTQUFTSCxLQUFULEVBQWdCSixDQUFoQixDQUFQO0FBQ0Q7QUFDRixPQUpNLENBQVA7QUFLRCxLQU5NLE1BTUE7QUFDTCxhQUFPLEtBQUtlLElBQUwsQ0FBVSxVQUFDWCxLQUFELEVBQVFKLENBQVIsRUFBYztBQUM3QixZQUFJSSxNQUFNeUIsSUFBTixLQUFlLE1BQWYsSUFBeUJ6QixNQUFNNEIsUUFBTixLQUFtQkEsUUFBaEQsRUFBMEQ7QUFDeEQsaUJBQU96QixTQUFTSCxLQUFULEVBQWdCSixDQUFoQixDQUFQO0FBQ0Q7QUFDRixPQUpNLENBQVA7QUFLRDtBQUNGLEc7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQThCQWlDLFcsd0JBQWFDLEksRUFBTTNCLFEsRUFBVTtBQUMzQixRQUFJLENBQUNBLFFBQUwsRUFBZTtBQUNiQSxpQkFBVzJCLElBQVg7QUFDQSxhQUFPLEtBQUtuQixJQUFMLENBQVUsVUFBQ1gsS0FBRCxFQUFRSixDQUFSLEVBQWM7QUFDN0IsWUFBSUksTUFBTXlCLElBQU4sS0FBZSxRQUFuQixFQUE2QjtBQUMzQixpQkFBT3RCLFNBQVNILEtBQVQsRUFBZ0JKLENBQWhCLENBQVA7QUFDRDtBQUNGLE9BSk0sQ0FBUDtBQUtELEtBUEQsTUFPTyxJQUFJa0MsZ0JBQWdCSixNQUFwQixFQUE0QjtBQUNqQyxhQUFPLEtBQUtmLElBQUwsQ0FBVSxVQUFDWCxLQUFELEVBQVFKLENBQVIsRUFBYztBQUM3QixZQUFJSSxNQUFNeUIsSUFBTixLQUFlLFFBQWYsSUFBMkJLLEtBQUtmLElBQUwsQ0FBVWYsTUFBTThCLElBQWhCLENBQS9CLEVBQXNEO0FBQ3BELGlCQUFPM0IsU0FBU0gsS0FBVCxFQUFnQkosQ0FBaEIsQ0FBUDtBQUNEO0FBQ0YsT0FKTSxDQUFQO0FBS0QsS0FOTSxNQU1BO0FBQ0wsYUFBTyxLQUFLZSxJQUFMLENBQVUsVUFBQ1gsS0FBRCxFQUFRSixDQUFSLEVBQWM7QUFDN0IsWUFBSUksTUFBTXlCLElBQU4sS0FBZSxRQUFmLElBQTJCekIsTUFBTThCLElBQU4sS0FBZUEsSUFBOUMsRUFBb0Q7QUFDbEQsaUJBQU8zQixTQUFTSCxLQUFULEVBQWdCSixDQUFoQixDQUFQO0FBQ0Q7QUFDRixPQUpNLENBQVA7QUFLRDtBQUNGLEc7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQkFnQkFtQyxZLHlCQUFjNUIsUSxFQUFVO0FBQ3RCLFdBQU8sS0FBS1EsSUFBTCxDQUFVLFVBQUNYLEtBQUQsRUFBUUosQ0FBUixFQUFjO0FBQzdCLFVBQUlJLE1BQU15QixJQUFOLEtBQWUsU0FBbkIsRUFBOEI7QUFDNUIsZUFBT3RCLFNBQVNILEtBQVQsRUFBZ0JKLENBQWhCLENBQVA7QUFDRDtBQUNGLEtBSk0sQ0FBUDtBQUtELEc7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7c0JBb0JBb0MsTSxxQkFBcUI7QUFBQSxzQ0FBVkMsUUFBVTtBQUFWQSxjQUFVO0FBQUE7O0FBQ25CLHlCQUFrQkEsUUFBbEIsa0hBQTRCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxVQUFuQmpDLEtBQW1COztBQUMxQixVQUFJTixRQUFRLEtBQUt3QyxTQUFMLENBQWVsQyxLQUFmLEVBQXNCLEtBQUttQyxJQUEzQixDQUFaO0FBQ0EsNEJBQWlCekMsS0FBakI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFlBQVMwQyxJQUFUO0FBQXdCLGFBQUsxQyxLQUFMLENBQVdLLElBQVgsQ0FBZ0JxQyxJQUFoQjtBQUF4QjtBQUNEO0FBQ0QsV0FBTyxJQUFQO0FBQ0QsRzs7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQkFvQkFDLE8sc0JBQXNCO0FBQUEsdUNBQVZKLFFBQVU7QUFBVkEsY0FBVTtBQUFBOztBQUNwQkEsZUFBV0EsU0FBU0ssT0FBVCxFQUFYO0FBQ0EsMEJBQWtCTCxRQUFsQix5SEFBNEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFVBQW5CakMsS0FBbUI7O0FBQzFCLFVBQUlOLFFBQVEsS0FBS3dDLFNBQUwsQ0FBZWxDLEtBQWYsRUFBc0IsS0FBS3VDLEtBQTNCLEVBQWtDLFNBQWxDLEVBQTZDRCxPQUE3QyxFQUFaO0FBQ0EsNEJBQWlCNUMsS0FBakI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFlBQVMwQyxJQUFUO0FBQXdCLGFBQUsxQyxLQUFMLENBQVc4QyxPQUFYLENBQW1CSixJQUFuQjtBQUF4QixPQUNBLEtBQUssSUFBSTlCLEVBQVQsSUFBZSxLQUFLRCxPQUFwQixFQUE2QjtBQUMzQixhQUFLQSxPQUFMLENBQWFDLEVBQWIsSUFBbUIsS0FBS0QsT0FBTCxDQUFhQyxFQUFiLElBQW1CWixNQUFNZ0IsTUFBNUM7QUFDRDtBQUNGO0FBQ0QsV0FBTyxJQUFQO0FBQ0QsRzs7c0JBRUQrQixTLHNCQUFXQyxXLEVBQWE7QUFDdEIsb0JBQU1ELFNBQU4sWUFBZ0JDLFdBQWhCO0FBQ0EsUUFBSSxLQUFLaEQsS0FBVCxFQUFnQjtBQUNkLDRCQUFpQixLQUFLQSxLQUF0QjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBUzBDLElBQVQ7QUFBNkJBLGFBQUtLLFNBQUwsQ0FBZUMsV0FBZjtBQUE3QjtBQUNEO0FBQ0YsRzs7QUFFRDs7Ozs7Ozs7Ozs7OztzQkFXQUMsWSx5QkFBY0MsSyxFQUFPQyxHLEVBQUs7QUFDeEJELFlBQVEsS0FBS3BDLEtBQUwsQ0FBV29DLEtBQVgsQ0FBUjs7QUFFQSxRQUFJbkIsT0FBT21CLFVBQVUsQ0FBVixHQUFjLFNBQWQsR0FBMEIsS0FBckM7QUFDQSxRQUFJbEQsUUFBUSxLQUFLd0MsU0FBTCxDQUFlVyxHQUFmLEVBQW9CLEtBQUtuRCxLQUFMLENBQVdrRCxLQUFYLENBQXBCLEVBQXVDbkIsSUFBdkMsRUFBNkNhLE9BQTdDLEVBQVo7QUFDQSwwQkFBaUI1QyxLQUFqQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsVUFBUzBDLElBQVQ7QUFBd0IsV0FBSzFDLEtBQUwsQ0FBV29ELE1BQVgsQ0FBa0JGLEtBQWxCLEVBQXlCLENBQXpCLEVBQTRCUixJQUE1QjtBQUF4QixLQUVBLElBQUk1QixjQUFKO0FBQ0EsU0FBSyxJQUFJRixFQUFULElBQWUsS0FBS0QsT0FBcEIsRUFBNkI7QUFDM0JHLGNBQVEsS0FBS0gsT0FBTCxDQUFhQyxFQUFiLENBQVI7QUFDQSxVQUFJc0MsU0FBU3BDLEtBQWIsRUFBb0I7QUFDbEIsYUFBS0gsT0FBTCxDQUFhQyxFQUFiLElBQW1CRSxRQUFRZCxNQUFNZ0IsTUFBakM7QUFDRDtBQUNGOztBQUVELFdBQU8sSUFBUDtBQUNELEc7O0FBRUQ7Ozs7Ozs7Ozs7c0JBUUFxQyxXLHdCQUFhSCxLLEVBQU9DLEcsRUFBSztBQUN2QkQsWUFBUSxLQUFLcEMsS0FBTCxDQUFXb0MsS0FBWCxDQUFSOztBQUVBLFFBQUlsRCxRQUFRLEtBQUt3QyxTQUFMLENBQWVXLEdBQWYsRUFBb0IsS0FBS25ELEtBQUwsQ0FBV2tELEtBQVgsQ0FBcEIsRUFBdUNOLE9BQXZDLEVBQVo7QUFDQSwwQkFBaUI1QyxLQUFqQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsVUFBUzBDLElBQVQ7QUFBd0IsV0FBSzFDLEtBQUwsQ0FBV29ELE1BQVgsQ0FBa0JGLFFBQVEsQ0FBMUIsRUFBNkIsQ0FBN0IsRUFBZ0NSLElBQWhDO0FBQXhCLEtBRUEsSUFBSTVCLGNBQUo7QUFDQSxTQUFLLElBQUlGLEVBQVQsSUFBZSxLQUFLRCxPQUFwQixFQUE2QjtBQUMzQkcsY0FBUSxLQUFLSCxPQUFMLENBQWFDLEVBQWIsQ0FBUjtBQUNBLFVBQUlzQyxRQUFRcEMsS0FBWixFQUFtQjtBQUNqQixhQUFLSCxPQUFMLENBQWFDLEVBQWIsSUFBbUJFLFFBQVFkLE1BQU1nQixNQUFqQztBQUNEO0FBQ0Y7O0FBRUQsV0FBTyxJQUFQO0FBQ0QsRzs7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztzQkFjQXNDLFcsd0JBQWFoRCxLLEVBQU87QUFDbEJBLFlBQVEsS0FBS1EsS0FBTCxDQUFXUixLQUFYLENBQVI7QUFDQSxTQUFLTixLQUFMLENBQVdNLEtBQVgsRUFBa0JDLE1BQWxCLEdBQTJCTSxTQUEzQjtBQUNBLFNBQUtiLEtBQUwsQ0FBV29ELE1BQVgsQ0FBa0I5QyxLQUFsQixFQUF5QixDQUF6Qjs7QUFFQSxRQUFJUSxjQUFKO0FBQ0EsU0FBSyxJQUFJRixFQUFULElBQWUsS0FBS0QsT0FBcEIsRUFBNkI7QUFDM0JHLGNBQVEsS0FBS0gsT0FBTCxDQUFhQyxFQUFiLENBQVI7QUFDQSxVQUFJRSxTQUFTUixLQUFiLEVBQW9CO0FBQ2xCLGFBQUtLLE9BQUwsQ0FBYUMsRUFBYixJQUFtQkUsUUFBUSxDQUEzQjtBQUNEO0FBQ0Y7O0FBRUQsV0FBTyxJQUFQO0FBQ0QsRzs7QUFFRDs7Ozs7Ozs7Ozs7O3NCQVVBeUMsUyx3QkFBYTtBQUNYLDBCQUFpQixLQUFLdkQsS0FBdEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFVBQVMwQyxJQUFUO0FBQTZCQSxXQUFLbkMsTUFBTCxHQUFjTSxTQUFkO0FBQTdCLEtBQ0EsS0FBS2IsS0FBTCxHQUFhLEVBQWI7QUFDQSxXQUFPLElBQVA7QUFDRCxHOztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQTBCQXdELGEsMEJBQWVDLE8sRUFBU0MsSSxFQUFNakQsUSxFQUFVO0FBQ3RDLFFBQUksQ0FBQ0EsUUFBTCxFQUFlO0FBQ2JBLGlCQUFXaUQsSUFBWDtBQUNBQSxhQUFPLEVBQVA7QUFDRDs7QUFFRCxTQUFLN0IsU0FBTCxDQUFlLGdCQUFRO0FBQ3JCLFVBQUk2QixLQUFLQyxLQUFMLElBQWNELEtBQUtDLEtBQUwsQ0FBV0MsT0FBWCxDQUFtQkMsS0FBSy9CLElBQXhCLE1BQWtDLENBQUMsQ0FBckQsRUFBd0Q7QUFDeEQsVUFBSTRCLEtBQUtJLElBQUwsSUFBYUQsS0FBS0UsS0FBTCxDQUFXSCxPQUFYLENBQW1CRixLQUFLSSxJQUF4QixNQUFrQyxDQUFDLENBQXBELEVBQXVEOztBQUV2REQsV0FBS0UsS0FBTCxHQUFhRixLQUFLRSxLQUFMLENBQVd4QyxPQUFYLENBQW1Ca0MsT0FBbkIsRUFBNEJoRCxRQUE1QixDQUFiO0FBQ0QsS0FMRDs7QUFPQSxXQUFPLElBQVA7QUFDRCxHOztBQUVEOzs7Ozs7Ozs7Ozs7O3NCQVdBdUQsSyxrQkFBT0MsUyxFQUFXO0FBQ2hCLFdBQU8sS0FBS2pFLEtBQUwsQ0FBV2dFLEtBQVgsQ0FBaUJDLFNBQWpCLENBQVA7QUFDRCxHOztBQUVEOzs7Ozs7Ozs7Ozs7O3NCQVdBQyxJLGlCQUFNRCxTLEVBQVc7QUFDZixXQUFPLEtBQUtqRSxLQUFMLENBQVdrRSxJQUFYLENBQWdCRCxTQUFoQixDQUFQO0FBQ0QsRzs7QUFFRDs7Ozs7Ozs7Ozs7O3NCQVVBbkQsSyxrQkFBT1IsSyxFQUFPO0FBQ1osUUFBSSxPQUFPQSxLQUFQLEtBQWlCLFFBQXJCLEVBQStCO0FBQzdCLGFBQU9BLEtBQVA7QUFDRCxLQUZELE1BRU87QUFDTCxhQUFPLEtBQUtOLEtBQUwsQ0FBVzRELE9BQVgsQ0FBbUJ0RCxLQUFuQixDQUFQO0FBQ0Q7QUFDRixHOztBQUVEOzs7Ozs7Ozs7O3NCQTBCQWtDLFMsc0JBQVd4QyxLLEVBQU9tRSxNLEVBQVE7QUFBQTs7QUFDeEIsUUFBSSxPQUFPbkUsS0FBUCxLQUFpQixRQUFyQixFQUErQjtBQUM3QixVQUFJb0UsUUFBUUMsUUFBUSxTQUFSLENBQVo7QUFDQXJFLGNBQVFELFlBQVlxRSxNQUFNcEUsS0FBTixFQUFhQSxLQUF6QixDQUFSO0FBQ0QsS0FIRCxNQUdPLElBQUlzRSxNQUFNQyxPQUFOLENBQWN2RSxLQUFkLENBQUosRUFBMEI7QUFDL0JBLGNBQVFBLE1BQU13RSxLQUFOLENBQVksQ0FBWixDQUFSO0FBQ0EsNEJBQWN4RSxLQUFkLHlIQUFxQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBWkUsQ0FBWTs7QUFDbkIsWUFBSUEsRUFBRUssTUFBTixFQUFjTCxFQUFFSyxNQUFGLENBQVMrQyxXQUFULENBQXFCcEQsQ0FBckIsRUFBd0IsUUFBeEI7QUFDZjtBQUNGLEtBTE0sTUFLQSxJQUFJRixNQUFNK0IsSUFBTixLQUFlLE1BQW5CLEVBQTJCO0FBQ2hDL0IsY0FBUUEsTUFBTUEsS0FBTixDQUFZd0UsS0FBWixDQUFrQixDQUFsQixDQUFSO0FBQ0EsNkJBQWN4RSxLQUFkLGdJQUFxQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBWkUsSUFBWTs7QUFDbkIsWUFBSUEsS0FBRUssTUFBTixFQUFjTCxLQUFFSyxNQUFGLENBQVMrQyxXQUFULENBQXFCcEQsSUFBckIsRUFBd0IsUUFBeEI7QUFDZjtBQUNGLEtBTE0sTUFLQSxJQUFJRixNQUFNK0IsSUFBVixFQUFnQjtBQUNyQi9CLGNBQVEsQ0FBQ0EsS0FBRCxDQUFSO0FBQ0QsS0FGTSxNQUVBLElBQUlBLE1BQU04QixJQUFWLEVBQWdCO0FBQ3JCLFVBQUksT0FBTzlCLE1BQU0rRCxLQUFiLEtBQXVCLFdBQTNCLEVBQXdDO0FBQ3RDLGNBQU0sSUFBSVUsS0FBSixDQUFVLHdDQUFWLENBQU47QUFDRCxPQUZELE1BRU8sSUFBSSxPQUFPekUsTUFBTStELEtBQWIsS0FBdUIsUUFBM0IsRUFBcUM7QUFDMUMvRCxjQUFNK0QsS0FBTixHQUFjVyxPQUFPMUUsTUFBTStELEtBQWIsQ0FBZDtBQUNEO0FBQ0QvRCxjQUFRLENBQUMsSUFBSTJFLHFCQUFKLENBQWdCM0UsS0FBaEIsQ0FBRCxDQUFSO0FBQ0QsS0FQTSxNQU9BLElBQUlBLE1BQU1rQyxRQUFWLEVBQW9CO0FBQ3pCLFVBQUkwQyxPQUFPUCxRQUFRLFFBQVIsQ0FBWDtBQUNBckUsY0FBUSxDQUFDLElBQUk0RSxJQUFKLENBQVM1RSxLQUFULENBQUQsQ0FBUjtBQUNELEtBSE0sTUFHQSxJQUFJQSxNQUFNb0MsSUFBVixFQUFnQjtBQUNyQixVQUFJeUMsU0FBU1IsUUFBUSxXQUFSLENBQWI7QUFDQXJFLGNBQVEsQ0FBQyxJQUFJNkUsTUFBSixDQUFXN0UsS0FBWCxDQUFELENBQVI7QUFDRCxLQUhNLE1BR0EsSUFBSUEsTUFBTThFLElBQVYsRUFBZ0I7QUFDckI5RSxjQUFRLENBQUMsSUFBSStFLGlCQUFKLENBQVkvRSxLQUFaLENBQUQsQ0FBUjtBQUNELEtBRk0sTUFFQTtBQUNMLFlBQU0sSUFBSXlFLEtBQUosQ0FBVSxvQ0FBVixDQUFOO0FBQ0Q7O0FBRUQsUUFBSU8sWUFBWWhGLE1BQU1DLEdBQU4sQ0FBVSxhQUFLO0FBQzdCLFVBQUlDLEVBQUVLLE1BQU4sRUFBY0wsRUFBRUssTUFBRixDQUFTK0MsV0FBVCxDQUFxQnBELENBQXJCO0FBQ2QsVUFBSSxPQUFPQSxFQUFFK0UsSUFBRixDQUFPQyxNQUFkLEtBQXlCLFdBQTdCLEVBQTBDO0FBQ3hDLFlBQUlmLFVBQVUsT0FBT0EsT0FBT2MsSUFBUCxDQUFZQyxNQUFuQixLQUE4QixXQUE1QyxFQUF5RDtBQUN2RGhGLFlBQUUrRSxJQUFGLENBQU9DLE1BQVAsR0FBZ0JmLE9BQU9jLElBQVAsQ0FBWUMsTUFBWixDQUFtQjNELE9BQW5CLENBQTJCLFFBQTNCLEVBQXFDLEVBQXJDLENBQWhCO0FBQ0Q7QUFDRjtBQUNEckIsUUFBRUssTUFBRixHQUFXLE1BQVg7QUFDQSxhQUFPTCxDQUFQO0FBQ0QsS0FUZSxDQUFoQjs7QUFXQSxXQUFPOEUsU0FBUDtBQUNELEc7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7O3dCQW5FYTtBQUNYLFVBQUksQ0FBQyxLQUFLaEYsS0FBVixFQUFpQixPQUFPYSxTQUFQO0FBQ2pCLGFBQU8sS0FBS2IsS0FBTCxDQUFXLENBQVgsQ0FBUDtBQUNEOztBQUVEOzs7Ozs7Ozs7Ozt3QkFRWTtBQUNWLFVBQUksQ0FBQyxLQUFLQSxLQUFWLEVBQWlCLE9BQU9hLFNBQVA7QUFDakIsYUFBTyxLQUFLYixLQUFMLENBQVcsS0FBS0EsS0FBTCxDQUFXZ0IsTUFBWCxHQUFvQixDQUEvQixDQUFQO0FBQ0Q7Ozs7RUFqakJxQm1FLGM7O2tCQWduQlQvRSxTOztBQUVmOzs7Ozs7OztBQVFBIiwiZmlsZSI6ImNvbnRhaW5lci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEZWNsYXJhdGlvbiBmcm9tICcuL2RlY2xhcmF0aW9uJ1xuaW1wb3J0IENvbW1lbnQgZnJvbSAnLi9jb21tZW50J1xuaW1wb3J0IE5vZGUgZnJvbSAnLi9ub2RlJ1xuXG5mdW5jdGlvbiBjbGVhblNvdXJjZSAobm9kZXMpIHtcbiAgcmV0dXJuIG5vZGVzLm1hcChpID0+IHtcbiAgICBpZiAoaS5ub2RlcykgaS5ub2RlcyA9IGNsZWFuU291cmNlKGkubm9kZXMpXG4gICAgZGVsZXRlIGkuc291cmNlXG4gICAgcmV0dXJuIGlcbiAgfSlcbn1cblxuLyoqXG4gKiBUaGUge0BsaW5rIFJvb3R9LCB7QGxpbmsgQXRSdWxlfSwgYW5kIHtAbGluayBSdWxlfSBjb250YWluZXIgbm9kZXNcbiAqIGluaGVyaXQgc29tZSBjb21tb24gbWV0aG9kcyB0byBoZWxwIHdvcmsgd2l0aCB0aGVpciBjaGlsZHJlbi5cbiAqXG4gKiBOb3RlIHRoYXQgYWxsIGNvbnRhaW5lcnMgY2FuIHN0b3JlIGFueSBjb250ZW50LiBJZiB5b3Ugd3JpdGUgYSBydWxlIGluc2lkZVxuICogYSBydWxlLCBQb3N0Q1NTIHdpbGwgcGFyc2UgaXQuXG4gKlxuICogQGV4dGVuZHMgTm9kZVxuICogQGFic3RyYWN0XG4gKi9cbmNsYXNzIENvbnRhaW5lciBleHRlbmRzIE5vZGUge1xuICBwdXNoIChjaGlsZCkge1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXNcbiAgICB0aGlzLm5vZGVzLnB1c2goY2hpbGQpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoZSBjb250YWluZXLigJlzIGltbWVkaWF0ZSBjaGlsZHJlbixcbiAgICogY2FsbGluZyBgY2FsbGJhY2tgIGZvciBlYWNoIGNoaWxkLlxuICAgKlxuICAgKiBSZXR1cm5pbmcgYGZhbHNlYCBpbiB0aGUgY2FsbGJhY2sgd2lsbCBicmVhayBpdGVyYXRpb24uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIG9ubHkgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgY29udGFpbmVy4oCZcyBpbW1lZGlhdGUgY2hpbGRyZW4uXG4gICAqIElmIHlvdSBuZWVkIHRvIHJlY3Vyc2l2ZWx5IGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIGNvbnRhaW5lcuKAmXMgZGVzY2VuZGFudFxuICAgKiBub2RlcywgdXNlIHtAbGluayBDb250YWluZXIjd2Fsa30uXG4gICAqXG4gICAqIFVubGlrZSB0aGUgZm9yIGB7fWAtY3ljbGUgb3IgYEFycmF5I2ZvckVhY2hgIHRoaXMgaXRlcmF0b3IgaXMgc2FmZVxuICAgKiBpZiB5b3UgYXJlIG11dGF0aW5nIHRoZSBhcnJheSBvZiBjaGlsZCBub2RlcyBkdXJpbmcgaXRlcmF0aW9uLlxuICAgKiBQb3N0Q1NTIHdpbGwgYWRqdXN0IHRoZSBjdXJyZW50IGluZGV4IHRvIG1hdGNoIHRoZSBtdXRhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Y2hpbGRJdGVyYXRvcn0gY2FsbGJhY2sgSXRlcmF0b3IgcmVjZWl2ZXMgZWFjaCBub2RlIGFuZCBpbmRleC5cbiAgICpcbiAgICogQHJldHVybiB7ZmFsc2V8dW5kZWZpbmVkfSBSZXR1cm5zIGBmYWxzZWAgaWYgaXRlcmF0aW9uIHdhcyBicm9rZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3Qgcm9vdCA9IHBvc3Rjc3MucGFyc2UoJ2EgeyBjb2xvcjogYmxhY2s7IHotaW5kZXg6IDEgfScpXG4gICAqIGNvbnN0IHJ1bGUgPSByb290LmZpcnN0XG4gICAqXG4gICAqIGZvciAoY29uc3QgZGVjbCBvZiBydWxlLm5vZGVzKSB7XG4gICAqICAgZGVjbC5jbG9uZUJlZm9yZSh7IHByb3A6ICctd2Via2l0LScgKyBkZWNsLnByb3AgfSlcbiAgICogICAvLyBDeWNsZSB3aWxsIGJlIGluZmluaXRlLCBiZWNhdXNlIGNsb25lQmVmb3JlIG1vdmVzIHRoZSBjdXJyZW50IG5vZGVcbiAgICogICAvLyB0byB0aGUgbmV4dCBpbmRleFxuICAgKiB9XG4gICAqXG4gICAqIHJ1bGUuZWFjaChkZWNsID0+IHtcbiAgICogICBkZWNsLmNsb25lQmVmb3JlKHsgcHJvcDogJy13ZWJraXQtJyArIGRlY2wucHJvcCB9KVxuICAgKiAgIC8vIFdpbGwgYmUgZXhlY3V0ZWQgb25seSBmb3IgY29sb3IgYW5kIHotaW5kZXhcbiAgICogfSlcbiAgICovXG4gIGVhY2ggKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmxhc3RFYWNoKSB0aGlzLmxhc3RFYWNoID0gMFxuICAgIGlmICghdGhpcy5pbmRleGVzKSB0aGlzLmluZGV4ZXMgPSB7IH1cblxuICAgIHRoaXMubGFzdEVhY2ggKz0gMVxuICAgIGxldCBpZCA9IHRoaXMubGFzdEVhY2hcbiAgICB0aGlzLmluZGV4ZXNbaWRdID0gMFxuXG4gICAgaWYgKCF0aGlzLm5vZGVzKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBsZXQgaW5kZXgsIHJlc3VsdFxuICAgIHdoaWxlICh0aGlzLmluZGV4ZXNbaWRdIDwgdGhpcy5ub2Rlcy5sZW5ndGgpIHtcbiAgICAgIGluZGV4ID0gdGhpcy5pbmRleGVzW2lkXVxuICAgICAgcmVzdWx0ID0gY2FsbGJhY2sodGhpcy5ub2Rlc1tpbmRleF0sIGluZGV4KVxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIGJyZWFrXG5cbiAgICAgIHRoaXMuaW5kZXhlc1tpZF0gKz0gMVxuICAgIH1cblxuICAgIGRlbGV0ZSB0aGlzLmluZGV4ZXNbaWRdXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogVHJhdmVyc2VzIHRoZSBjb250YWluZXLigJlzIGRlc2NlbmRhbnQgbm9kZXMsIGNhbGxpbmcgY2FsbGJhY2tcbiAgICogZm9yIGVhY2ggbm9kZS5cbiAgICpcbiAgICogTGlrZSBjb250YWluZXIuZWFjaCgpLCB0aGlzIG1ldGhvZCBpcyBzYWZlIHRvIHVzZVxuICAgKiBpZiB5b3UgYXJlIG11dGF0aW5nIGFycmF5cyBkdXJpbmcgaXRlcmF0aW9uLlxuICAgKlxuICAgKiBJZiB5b3Ugb25seSBuZWVkIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgY29udGFpbmVy4oCZcyBpbW1lZGlhdGUgY2hpbGRyZW4sXG4gICAqIHVzZSB7QGxpbmsgQ29udGFpbmVyI2VhY2h9LlxuICAgKlxuICAgKiBAcGFyYW0ge2NoaWxkSXRlcmF0b3J9IGNhbGxiYWNrIEl0ZXJhdG9yIHJlY2VpdmVzIGVhY2ggbm9kZSBhbmQgaW5kZXguXG4gICAqXG4gICAqIEByZXR1cm4ge2ZhbHNlfHVuZGVmaW5lZH0gUmV0dXJucyBgZmFsc2VgIGlmIGl0ZXJhdGlvbiB3YXMgYnJva2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHJvb3Qud2Fsayhub2RlID0+IHtcbiAgICogICAvLyBUcmF2ZXJzZXMgYWxsIGRlc2NlbmRhbnQgbm9kZXMuXG4gICAqIH0pXG4gICAqL1xuICB3YWxrIChjYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLmVhY2goKGNoaWxkLCBpKSA9PiB7XG4gICAgICBsZXQgcmVzdWx0XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBjYWxsYmFjayhjaGlsZCwgaSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZS5wb3N0Y3NzTm9kZSA9IGNoaWxkXG4gICAgICAgIGlmIChlLnN0YWNrICYmIGNoaWxkLnNvdXJjZSAmJiAvXFxuXFxzezR9YXQgLy50ZXN0KGUuc3RhY2spKSB7XG4gICAgICAgICAgbGV0IHMgPSBjaGlsZC5zb3VyY2VcbiAgICAgICAgICBlLnN0YWNrID0gZS5zdGFjay5yZXBsYWNlKC9cXG5cXHN7NH1hdCAvLFxuICAgICAgICAgICAgYCQmJHsgcy5pbnB1dC5mcm9tIH06JHsgcy5zdGFydC5saW5lIH06JHsgcy5zdGFydC5jb2x1bW4gfSQmYClcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSAmJiBjaGlsZC53YWxrKSB7XG4gICAgICAgIHJlc3VsdCA9IGNoaWxkLndhbGsoY2FsbGJhY2spXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmF2ZXJzZXMgdGhlIGNvbnRhaW5lcuKAmXMgZGVzY2VuZGFudCBub2RlcywgY2FsbGluZyBjYWxsYmFja1xuICAgKiBmb3IgZWFjaCBkZWNsYXJhdGlvbiBub2RlLlxuICAgKlxuICAgKiBJZiB5b3UgcGFzcyBhIGZpbHRlciwgaXRlcmF0aW9uIHdpbGwgb25seSBoYXBwZW4gb3ZlciBkZWNsYXJhdGlvbnNcbiAgICogd2l0aCBtYXRjaGluZyBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBMaWtlIHtAbGluayBDb250YWluZXIjZWFjaH0sIHRoaXMgbWV0aG9kIGlzIHNhZmVcbiAgICogdG8gdXNlIGlmIHlvdSBhcmUgbXV0YXRpbmcgYXJyYXlzIGR1cmluZyBpdGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0gW3Byb3BdICAgU3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGZpbHRlciBkZWNsYXJhdGlvbnMgYnkgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtjaGlsZEl0ZXJhdG9yfSBjYWxsYmFjayBJdGVyYXRvciByZWNlaXZlcyBlYWNoIG5vZGUgYW5kIGluZGV4LlxuICAgKlxuICAgKiBAcmV0dXJuIHtmYWxzZXx1bmRlZmluZWR9IFJldHVybnMgYGZhbHNlYCBpZiBpdGVyYXRpb24gd2FzIGJyb2tlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiByb290LndhbGtEZWNscyhkZWNsID0+IHtcbiAgICogICBjaGVja1Byb3BlcnR5U3VwcG9ydChkZWNsLnByb3ApXG4gICAqIH0pXG4gICAqXG4gICAqIHJvb3Qud2Fsa0RlY2xzKCdib3JkZXItcmFkaXVzJywgZGVjbCA9PiB7XG4gICAqICAgZGVjbC5yZW1vdmUoKVxuICAgKiB9KVxuICAgKlxuICAgKiByb290LndhbGtEZWNscygvXmJhY2tncm91bmQvLCBkZWNsID0+IHtcbiAgICogICBkZWNsLnZhbHVlID0gdGFrZUZpcnN0Q29sb3JGcm9tR3JhZGllbnQoZGVjbC52YWx1ZSlcbiAgICogfSlcbiAgICovXG4gIHdhbGtEZWNscyAocHJvcCwgY2FsbGJhY2spIHtcbiAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayA9IHByb3BcbiAgICAgIHJldHVybiB0aGlzLndhbGsoKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgIGlmIChjaGlsZC50eXBlID09PSAnZGVjbCcpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soY2hpbGQsIGkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChwcm9wIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICByZXR1cm4gdGhpcy53YWxrKChjaGlsZCwgaSkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ2RlY2wnICYmIHByb3AudGVzdChjaGlsZC5wcm9wKSkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhjaGlsZCwgaSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMud2FsaygoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdkZWNsJyAmJiBjaGlsZC5wcm9wID09PSBwcm9wKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGNoaWxkLCBpKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmF2ZXJzZXMgdGhlIGNvbnRhaW5lcuKAmXMgZGVzY2VuZGFudCBub2RlcywgY2FsbGluZyBjYWxsYmFja1xuICAgKiBmb3IgZWFjaCBydWxlIG5vZGUuXG4gICAqXG4gICAqIElmIHlvdSBwYXNzIGEgZmlsdGVyLCBpdGVyYXRpb24gd2lsbCBvbmx5IGhhcHBlbiBvdmVyIHJ1bGVzXG4gICAqIHdpdGggbWF0Y2hpbmcgc2VsZWN0b3JzLlxuICAgKlxuICAgKiBMaWtlIHtAbGluayBDb250YWluZXIjZWFjaH0sIHRoaXMgbWV0aG9kIGlzIHNhZmVcbiAgICogdG8gdXNlIGlmIHlvdSBhcmUgbXV0YXRpbmcgYXJyYXlzIGR1cmluZyBpdGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0gW3NlbGVjdG9yXSBTdHJpbmcgb3IgcmVndWxhciBleHByZXNzaW9uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBmaWx0ZXIgcnVsZXMgYnkgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSB7Y2hpbGRJdGVyYXRvcn0gY2FsbGJhY2sgICBJdGVyYXRvciByZWNlaXZlcyBlYWNoIG5vZGUgYW5kIGluZGV4LlxuICAgKlxuICAgKiBAcmV0dXJuIHtmYWxzZXx1bmRlZmluZWR9IHJldHVybnMgYGZhbHNlYCBpZiBpdGVyYXRpb24gd2FzIGJyb2tlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBzZWxlY3RvcnMgPSBbXVxuICAgKiByb290LndhbGtSdWxlcyhydWxlID0+IHtcbiAgICogICBzZWxlY3RvcnMucHVzaChydWxlLnNlbGVjdG9yKVxuICAgKiB9KVxuICAgKiBjb25zb2xlLmxvZyhgWW91ciBDU1MgdXNlcyAkeyBzZWxlY3RvcnMubGVuZ3RoIH0gc2VsZWN0b3JzYClcbiAgICovXG4gIHdhbGtSdWxlcyAoc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sgPSBzZWxlY3RvclxuXG4gICAgICByZXR1cm4gdGhpcy53YWxrKChjaGlsZCwgaSkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ3J1bGUnKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGNoaWxkLCBpKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHJldHVybiB0aGlzLndhbGsoKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgIGlmIChjaGlsZC50eXBlID09PSAncnVsZScgJiYgc2VsZWN0b3IudGVzdChjaGlsZC5zZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soY2hpbGQsIGkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLndhbGsoKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgIGlmIChjaGlsZC50eXBlID09PSAncnVsZScgJiYgY2hpbGQuc2VsZWN0b3IgPT09IHNlbGVjdG9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGNoaWxkLCBpKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmF2ZXJzZXMgdGhlIGNvbnRhaW5lcuKAmXMgZGVzY2VuZGFudCBub2RlcywgY2FsbGluZyBjYWxsYmFja1xuICAgKiBmb3IgZWFjaCBhdC1ydWxlIG5vZGUuXG4gICAqXG4gICAqIElmIHlvdSBwYXNzIGEgZmlsdGVyLCBpdGVyYXRpb24gd2lsbCBvbmx5IGhhcHBlbiBvdmVyIGF0LXJ1bGVzXG4gICAqIHRoYXQgaGF2ZSBtYXRjaGluZyBuYW1lcy5cbiAgICpcbiAgICogTGlrZSB7QGxpbmsgQ29udGFpbmVyI2VhY2h9LCB0aGlzIG1ldGhvZCBpcyBzYWZlXG4gICAqIHRvIHVzZSBpZiB5b3UgYXJlIG11dGF0aW5nIGFycmF5cyBkdXJpbmcgaXRlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IFtuYW1lXSAgIFN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb25cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBmaWx0ZXIgYXQtcnVsZXMgYnkgbmFtZS5cbiAgICogQHBhcmFtIHtjaGlsZEl0ZXJhdG9yfSBjYWxsYmFjayBJdGVyYXRvciByZWNlaXZlcyBlYWNoIG5vZGUgYW5kIGluZGV4LlxuICAgKlxuICAgKiBAcmV0dXJuIHtmYWxzZXx1bmRlZmluZWR9IFJldHVybnMgYGZhbHNlYCBpZiBpdGVyYXRpb24gd2FzIGJyb2tlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiByb290LndhbGtBdFJ1bGVzKHJ1bGUgPT4ge1xuICAgKiAgIGlmIChpc09sZChydWxlLm5hbWUpKSBydWxlLnJlbW92ZSgpXG4gICAqIH0pXG4gICAqXG4gICAqIGxldCBmaXJzdCA9IGZhbHNlXG4gICAqIHJvb3Qud2Fsa0F0UnVsZXMoJ2NoYXJzZXQnLCBydWxlID0+IHtcbiAgICogICBpZiAoIWZpcnN0KSB7XG4gICAqICAgICBmaXJzdCA9IHRydWVcbiAgICogICB9IGVsc2Uge1xuICAgKiAgICAgcnVsZS5yZW1vdmUoKVxuICAgKiAgIH1cbiAgICogfSlcbiAgICovXG4gIHdhbGtBdFJ1bGVzIChuYW1lLCBjYWxsYmFjaykge1xuICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrID0gbmFtZVxuICAgICAgcmV0dXJuIHRoaXMud2FsaygoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdhdHJ1bGUnKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGNoaWxkLCBpKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAobmFtZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgcmV0dXJuIHRoaXMud2FsaygoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdhdHJ1bGUnICYmIG5hbWUudGVzdChjaGlsZC5uYW1lKSkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhjaGlsZCwgaSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMud2FsaygoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdhdHJ1bGUnICYmIGNoaWxkLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soY2hpbGQsIGkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYXZlcnNlcyB0aGUgY29udGFpbmVy4oCZcyBkZXNjZW5kYW50IG5vZGVzLCBjYWxsaW5nIGNhbGxiYWNrXG4gICAqIGZvciBlYWNoIGNvbW1lbnQgbm9kZS5cbiAgICpcbiAgICogTGlrZSB7QGxpbmsgQ29udGFpbmVyI2VhY2h9LCB0aGlzIG1ldGhvZCBpcyBzYWZlXG4gICAqIHRvIHVzZSBpZiB5b3UgYXJlIG11dGF0aW5nIGFycmF5cyBkdXJpbmcgaXRlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge2NoaWxkSXRlcmF0b3J9IGNhbGxiYWNrIEl0ZXJhdG9yIHJlY2VpdmVzIGVhY2ggbm9kZSBhbmQgaW5kZXguXG4gICAqXG4gICAqIEByZXR1cm4ge2ZhbHNlfHVuZGVmaW5lZH0gUmV0dXJucyBgZmFsc2VgIGlmIGl0ZXJhdGlvbiB3YXMgYnJva2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHJvb3Qud2Fsa0NvbW1lbnRzKGNvbW1lbnQgPT4ge1xuICAgKiAgIGNvbW1lbnQucmVtb3ZlKClcbiAgICogfSlcbiAgICovXG4gIHdhbGtDb21tZW50cyAoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy53YWxrKChjaGlsZCwgaSkgPT4ge1xuICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdjb21tZW50Jykge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soY2hpbGQsIGkpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIG5ldyBub2RlcyB0byB0aGUgZW5kIG9mIHRoZSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uKE5vZGV8b2JqZWN0fHN0cmluZ3xOb2RlW10pfSBjaGlsZHJlbiBOZXcgbm9kZXMuXG4gICAqXG4gICAqIEByZXR1cm4ge05vZGV9IFRoaXMgbm9kZSBmb3IgbWV0aG9kcyBjaGFpbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgZGVjbDEgPSBwb3N0Y3NzLmRlY2woeyBwcm9wOiAnY29sb3InLCB2YWx1ZTogJ2JsYWNrJyB9KVxuICAgKiBjb25zdCBkZWNsMiA9IHBvc3Rjc3MuZGVjbCh7IHByb3A6ICdiYWNrZ3JvdW5kLWNvbG9yJywgdmFsdWU6ICd3aGl0ZScgfSlcbiAgICogcnVsZS5hcHBlbmQoZGVjbDEsIGRlY2wyKVxuICAgKlxuICAgKiByb290LmFwcGVuZCh7IG5hbWU6ICdjaGFyc2V0JywgcGFyYW1zOiAnXCJVVEYtOFwiJyB9KSAgLy8gYXQtcnVsZVxuICAgKiByb290LmFwcGVuZCh7IHNlbGVjdG9yOiAnYScgfSkgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bGVcbiAgICogcnVsZS5hcHBlbmQoeyBwcm9wOiAnY29sb3InLCB2YWx1ZTogJ2JsYWNrJyB9KSAgICAgICAvLyBkZWNsYXJhdGlvblxuICAgKiBydWxlLmFwcGVuZCh7IHRleHQ6ICdDb21tZW50JyB9KSAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1lbnRcbiAgICpcbiAgICogcm9vdC5hcHBlbmQoJ2Ege30nKVxuICAgKiByb290LmZpcnN0LmFwcGVuZCgnY29sb3I6IGJsYWNrOyB6LWluZGV4OiAxJylcbiAgICovXG4gIGFwcGVuZCAoLi4uY2hpbGRyZW4pIHtcbiAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgbGV0IG5vZGVzID0gdGhpcy5ub3JtYWxpemUoY2hpbGQsIHRoaXMubGFzdClcbiAgICAgIGZvciAobGV0IG5vZGUgb2Ygbm9kZXMpIHRoaXMubm9kZXMucHVzaChub2RlKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgbmV3IG5vZGVzIHRvIHRoZSBzdGFydCBvZiB0aGUgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLihOb2RlfG9iamVjdHxzdHJpbmd8Tm9kZVtdKX0gY2hpbGRyZW4gTmV3IG5vZGVzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtOb2RlfSBUaGlzIG5vZGUgZm9yIG1ldGhvZHMgY2hhaW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGRlY2wxID0gcG9zdGNzcy5kZWNsKHsgcHJvcDogJ2NvbG9yJywgdmFsdWU6ICdibGFjaycgfSlcbiAgICogY29uc3QgZGVjbDIgPSBwb3N0Y3NzLmRlY2woeyBwcm9wOiAnYmFja2dyb3VuZC1jb2xvcicsIHZhbHVlOiAnd2hpdGUnIH0pXG4gICAqIHJ1bGUucHJlcGVuZChkZWNsMSwgZGVjbDIpXG4gICAqXG4gICAqIHJvb3QuYXBwZW5kKHsgbmFtZTogJ2NoYXJzZXQnLCBwYXJhbXM6ICdcIlVURi04XCInIH0pICAvLyBhdC1ydWxlXG4gICAqIHJvb3QuYXBwZW5kKHsgc2VsZWN0b3I6ICdhJyB9KSAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVsZVxuICAgKiBydWxlLmFwcGVuZCh7IHByb3A6ICdjb2xvcicsIHZhbHVlOiAnYmxhY2snIH0pICAgICAgIC8vIGRlY2xhcmF0aW9uXG4gICAqIHJ1bGUuYXBwZW5kKHsgdGV4dDogJ0NvbW1lbnQnIH0pICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWVudFxuICAgKlxuICAgKiByb290LmFwcGVuZCgnYSB7fScpXG4gICAqIHJvb3QuZmlyc3QuYXBwZW5kKCdjb2xvcjogYmxhY2s7IHotaW5kZXg6IDEnKVxuICAgKi9cbiAgcHJlcGVuZCAoLi4uY2hpbGRyZW4pIHtcbiAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLnJldmVyc2UoKVxuICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICBsZXQgbm9kZXMgPSB0aGlzLm5vcm1hbGl6ZShjaGlsZCwgdGhpcy5maXJzdCwgJ3ByZXBlbmQnKS5yZXZlcnNlKClcbiAgICAgIGZvciAobGV0IG5vZGUgb2Ygbm9kZXMpIHRoaXMubm9kZXMudW5zaGlmdChub2RlKVxuICAgICAgZm9yIChsZXQgaWQgaW4gdGhpcy5pbmRleGVzKSB7XG4gICAgICAgIHRoaXMuaW5kZXhlc1tpZF0gPSB0aGlzLmluZGV4ZXNbaWRdICsgbm9kZXMubGVuZ3RoXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBjbGVhblJhd3MgKGtlZXBCZXR3ZWVuKSB7XG4gICAgc3VwZXIuY2xlYW5SYXdzKGtlZXBCZXR3ZWVuKVxuICAgIGlmICh0aGlzLm5vZGVzKSB7XG4gICAgICBmb3IgKGxldCBub2RlIG9mIHRoaXMubm9kZXMpIG5vZGUuY2xlYW5SYXdzKGtlZXBCZXR3ZWVuKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgbmV3IG5vZGUgYmVmb3JlIG9sZCBub2RlIHdpdGhpbiB0aGUgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8bnVtYmVyfSBleGlzdCAgICAgICAgICAgICBDaGlsZCBvciBjaGlsZOKAmXMgaW5kZXguXG4gICAqIEBwYXJhbSB7Tm9kZXxvYmplY3R8c3RyaW5nfE5vZGVbXX0gYWRkIE5ldyBub2RlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtOb2RlfSBUaGlzIG5vZGUgZm9yIG1ldGhvZHMgY2hhaW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHJ1bGUuaW5zZXJ0QmVmb3JlKGRlY2wsIGRlY2wuY2xvbmUoeyBwcm9wOiAnLXdlYmtpdC0nICsgZGVjbC5wcm9wIH0pKVxuICAgKi9cbiAgaW5zZXJ0QmVmb3JlIChleGlzdCwgYWRkKSB7XG4gICAgZXhpc3QgPSB0aGlzLmluZGV4KGV4aXN0KVxuXG4gICAgbGV0IHR5cGUgPSBleGlzdCA9PT0gMCA/ICdwcmVwZW5kJyA6IGZhbHNlXG4gICAgbGV0IG5vZGVzID0gdGhpcy5ub3JtYWxpemUoYWRkLCB0aGlzLm5vZGVzW2V4aXN0XSwgdHlwZSkucmV2ZXJzZSgpXG4gICAgZm9yIChsZXQgbm9kZSBvZiBub2RlcykgdGhpcy5ub2Rlcy5zcGxpY2UoZXhpc3QsIDAsIG5vZGUpXG5cbiAgICBsZXQgaW5kZXhcbiAgICBmb3IgKGxldCBpZCBpbiB0aGlzLmluZGV4ZXMpIHtcbiAgICAgIGluZGV4ID0gdGhpcy5pbmRleGVzW2lkXVxuICAgICAgaWYgKGV4aXN0IDw9IGluZGV4KSB7XG4gICAgICAgIHRoaXMuaW5kZXhlc1tpZF0gPSBpbmRleCArIG5vZGVzLmxlbmd0aFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IG5ldyBub2RlIGFmdGVyIG9sZCBub2RlIHdpdGhpbiB0aGUgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8bnVtYmVyfSBleGlzdCAgICAgICAgICAgICBDaGlsZCBvciBjaGlsZOKAmXMgaW5kZXguXG4gICAqIEBwYXJhbSB7Tm9kZXxvYmplY3R8c3RyaW5nfE5vZGVbXX0gYWRkIE5ldyBub2RlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtOb2RlfSBUaGlzIG5vZGUgZm9yIG1ldGhvZHMgY2hhaW4uXG4gICAqL1xuICBpbnNlcnRBZnRlciAoZXhpc3QsIGFkZCkge1xuICAgIGV4aXN0ID0gdGhpcy5pbmRleChleGlzdClcblxuICAgIGxldCBub2RlcyA9IHRoaXMubm9ybWFsaXplKGFkZCwgdGhpcy5ub2Rlc1tleGlzdF0pLnJldmVyc2UoKVxuICAgIGZvciAobGV0IG5vZGUgb2Ygbm9kZXMpIHRoaXMubm9kZXMuc3BsaWNlKGV4aXN0ICsgMSwgMCwgbm9kZSlcblxuICAgIGxldCBpbmRleFxuICAgIGZvciAobGV0IGlkIGluIHRoaXMuaW5kZXhlcykge1xuICAgICAgaW5kZXggPSB0aGlzLmluZGV4ZXNbaWRdXG4gICAgICBpZiAoZXhpc3QgPCBpbmRleCkge1xuICAgICAgICB0aGlzLmluZGV4ZXNbaWRdID0gaW5kZXggKyBub2Rlcy5sZW5ndGhcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgbm9kZSBmcm9tIHRoZSBjb250YWluZXIgYW5kIGNsZWFucyB0aGUgcGFyZW50IHByb3BlcnRpZXNcbiAgICogZnJvbSB0aGUgbm9kZSBhbmQgaXRzIGNoaWxkcmVuLlxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8bnVtYmVyfSBjaGlsZCBDaGlsZCBvciBjaGlsZOKAmXMgaW5kZXguXG4gICAqXG4gICAqIEByZXR1cm4ge05vZGV9IFRoaXMgbm9kZSBmb3IgbWV0aG9kcyBjaGFpblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBydWxlLm5vZGVzLmxlbmd0aCAgLy89PiA1XG4gICAqIHJ1bGUucmVtb3ZlQ2hpbGQoZGVjbClcbiAgICogcnVsZS5ub2Rlcy5sZW5ndGggIC8vPT4gNFxuICAgKiBkZWNsLnBhcmVudCAgICAgICAgLy89PiB1bmRlZmluZWRcbiAgICovXG4gIHJlbW92ZUNoaWxkIChjaGlsZCkge1xuICAgIGNoaWxkID0gdGhpcy5pbmRleChjaGlsZClcbiAgICB0aGlzLm5vZGVzW2NoaWxkXS5wYXJlbnQgPSB1bmRlZmluZWRcbiAgICB0aGlzLm5vZGVzLnNwbGljZShjaGlsZCwgMSlcblxuICAgIGxldCBpbmRleFxuICAgIGZvciAobGV0IGlkIGluIHRoaXMuaW5kZXhlcykge1xuICAgICAgaW5kZXggPSB0aGlzLmluZGV4ZXNbaWRdXG4gICAgICBpZiAoaW5kZXggPj0gY2hpbGQpIHtcbiAgICAgICAgdGhpcy5pbmRleGVzW2lkXSA9IGluZGV4IC0gMVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgY2hpbGRyZW4gZnJvbSB0aGUgY29udGFpbmVyXG4gICAqIGFuZCBjbGVhbnMgdGhlaXIgcGFyZW50IHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEByZXR1cm4ge05vZGV9IFRoaXMgbm9kZSBmb3IgbWV0aG9kcyBjaGFpbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcnVsZS5yZW1vdmVBbGwoKVxuICAgKiBydWxlLm5vZGVzLmxlbmd0aCAvLz0+IDBcbiAgICovXG4gIHJlbW92ZUFsbCAoKSB7XG4gICAgZm9yIChsZXQgbm9kZSBvZiB0aGlzLm5vZGVzKSBub2RlLnBhcmVudCA9IHVuZGVmaW5lZFxuICAgIHRoaXMubm9kZXMgPSBbXVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogUGFzc2VzIGFsbCBkZWNsYXJhdGlvbiB2YWx1ZXMgd2l0aGluIHRoZSBjb250YWluZXIgdGhhdCBtYXRjaCBwYXR0ZXJuXG4gICAqIHRocm91Z2ggY2FsbGJhY2ssIHJlcGxhY2luZyB0aG9zZSB2YWx1ZXMgd2l0aCB0aGUgcmV0dXJuZWQgcmVzdWx0XG4gICAqIG9mIGNhbGxiYWNrLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgaWYgeW91IGFyZSB1c2luZyBhIGN1c3RvbSB1bml0IG9yIGZ1bmN0aW9uXG4gICAqIGFuZCBuZWVkIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IHBhdHRlcm4gICAgICBSZXBsYWNlIHBhdHRlcm4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICAgICAgICAgICAgICAgIE9wdGlvbnMgdG8gc3BlZWQgdXAgdGhlIHNlYXJjaC5cbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IG9wdHMucHJvcHMgQW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmZhc3QgICAgICAgICAgIFN0cmluZyB0aGF04oCZcyB1c2VkIHRvIG5hcnJvdyBkb3duXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBhbmQgc3BlZWQgdXAgdGhlIHJlZ2V4cCBzZWFyY2guXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb258c3RyaW5nfSBjYWxsYmFjayAgIFN0cmluZyB0byByZXBsYWNlIHBhdHRlcm4gb3IgY2FsbGJhY2tcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCByZXR1cm5zIGEgbmV3IHZhbHVlLiBUaGUgY2FsbGJhY2tcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCByZWNlaXZlIHRoZSBzYW1lIGFyZ3VtZW50c1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyB0aG9zZSBwYXNzZWQgdG8gYSBmdW5jdGlvbiBwYXJhbWV0ZXJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYFN0cmluZyNyZXBsYWNlYC5cbiAgICpcbiAgICogQHJldHVybiB7Tm9kZX0gVGhpcyBub2RlIGZvciBtZXRob2RzIGNoYWluLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiByb290LnJlcGxhY2VWYWx1ZXMoL1xcZCtyZW0vLCB7IGZhc3Q6ICdyZW0nIH0sIHN0cmluZyA9PiB7XG4gICAqICAgcmV0dXJuIDE1ICogcGFyc2VJbnQoc3RyaW5nKSArICdweCdcbiAgICogfSlcbiAgICovXG4gIHJlcGxhY2VWYWx1ZXMgKHBhdHRlcm4sIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzXG4gICAgICBvcHRzID0geyB9XG4gICAgfVxuXG4gICAgdGhpcy53YWxrRGVjbHMoZGVjbCA9PiB7XG4gICAgICBpZiAob3B0cy5wcm9wcyAmJiBvcHRzLnByb3BzLmluZGV4T2YoZGVjbC5wcm9wKSA9PT0gLTEpIHJldHVyblxuICAgICAgaWYgKG9wdHMuZmFzdCAmJiBkZWNsLnZhbHVlLmluZGV4T2Yob3B0cy5mYXN0KSA9PT0gLTEpIHJldHVyblxuXG4gICAgICBkZWNsLnZhbHVlID0gZGVjbC52YWx1ZS5yZXBsYWNlKHBhdHRlcm4sIGNhbGxiYWNrKVxuICAgIH0pXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIGNhbGxiYWNrIHJldHVybnMgYHRydWVgXG4gICAqIGZvciBhbGwgb2YgdGhlIGNvbnRhaW5lcuKAmXMgY2hpbGRyZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7Y2hpbGRDb25kaXRpb259IGNvbmRpdGlvbiBJdGVyYXRvciByZXR1cm5zIHRydWUgb3IgZmFsc2UuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IElzIGV2ZXJ5IGNoaWxkIHBhc3MgY29uZGl0aW9uLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBub1ByZWZpeGVzID0gcnVsZS5ldmVyeShpID0+IGkucHJvcFswXSAhPT0gJy0nKVxuICAgKi9cbiAgZXZlcnkgKGNvbmRpdGlvbikge1xuICAgIHJldHVybiB0aGlzLm5vZGVzLmV2ZXJ5KGNvbmRpdGlvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgKGF0IGxlYXN0KSBvbmVcbiAgICogb2YgdGhlIGNvbnRhaW5lcuKAmXMgY2hpbGRyZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7Y2hpbGRDb25kaXRpb259IGNvbmRpdGlvbiBJdGVyYXRvciByZXR1cm5zIHRydWUgb3IgZmFsc2UuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IElzIHNvbWUgY2hpbGQgcGFzcyBjb25kaXRpb24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGhhc1ByZWZpeCA9IHJ1bGUuc29tZShpID0+IGkucHJvcFswXSA9PT0gJy0nKVxuICAgKi9cbiAgc29tZSAoY29uZGl0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZXMuc29tZShjb25kaXRpb24pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGBjaGlsZGDigJlzIGluZGV4IHdpdGhpbiB0aGUge0BsaW5rIENvbnRhaW5lciNub2Rlc30gYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGQgQ2hpbGQgb2YgdGhlIGN1cnJlbnQgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IENoaWxkIGluZGV4LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBydWxlLmluZGV4KCBydWxlLm5vZGVzWzJdICkgLy89PiAyXG4gICAqL1xuICBpbmRleCAoY2hpbGQpIHtcbiAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGNoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzLmluZGV4T2YoY2hpbGQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXLigJlzIGZpcnN0IGNoaWxkLlxuICAgKlxuICAgKiBAdHlwZSB7Tm9kZX1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcnVsZS5maXJzdCA9PT0gcnVsZXMubm9kZXNbMF1cbiAgICovXG4gIGdldCBmaXJzdCAoKSB7XG4gICAgaWYgKCF0aGlzLm5vZGVzKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMubm9kZXNbMF1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVy4oCZcyBsYXN0IGNoaWxkLlxuICAgKlxuICAgKiBAdHlwZSB7Tm9kZX1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcnVsZS5sYXN0ID09PSBydWxlLm5vZGVzW3J1bGUubm9kZXMubGVuZ3RoIC0gMV1cbiAgICovXG4gIGdldCBsYXN0ICgpIHtcbiAgICBpZiAoIXRoaXMubm9kZXMpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdXG4gIH1cblxuICBub3JtYWxpemUgKG5vZGVzLCBzYW1wbGUpIHtcbiAgICBpZiAodHlwZW9mIG5vZGVzID09PSAnc3RyaW5nJykge1xuICAgICAgbGV0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG4gICAgICBub2RlcyA9IGNsZWFuU291cmNlKHBhcnNlKG5vZGVzKS5ub2RlcylcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobm9kZXMpKSB7XG4gICAgICBub2RlcyA9IG5vZGVzLnNsaWNlKDApXG4gICAgICBmb3IgKGxldCBpIG9mIG5vZGVzKSB7XG4gICAgICAgIGlmIChpLnBhcmVudCkgaS5wYXJlbnQucmVtb3ZlQ2hpbGQoaSwgJ2lnbm9yZScpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2Rlcy50eXBlID09PSAncm9vdCcpIHtcbiAgICAgIG5vZGVzID0gbm9kZXMubm9kZXMuc2xpY2UoMClcbiAgICAgIGZvciAobGV0IGkgb2Ygbm9kZXMpIHtcbiAgICAgICAgaWYgKGkucGFyZW50KSBpLnBhcmVudC5yZW1vdmVDaGlsZChpLCAnaWdub3JlJylcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGVzLnR5cGUpIHtcbiAgICAgIG5vZGVzID0gW25vZGVzXVxuICAgIH0gZWxzZSBpZiAobm9kZXMucHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBub2Rlcy52YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBmaWVsZCBpcyBtaXNzZWQgaW4gbm9kZSBjcmVhdGlvbicpXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBub2Rlcy52YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgbm9kZXMudmFsdWUgPSBTdHJpbmcobm9kZXMudmFsdWUpXG4gICAgICB9XG4gICAgICBub2RlcyA9IFtuZXcgRGVjbGFyYXRpb24obm9kZXMpXVxuICAgIH0gZWxzZSBpZiAobm9kZXMuc2VsZWN0b3IpIHtcbiAgICAgIGxldCBSdWxlID0gcmVxdWlyZSgnLi9ydWxlJylcbiAgICAgIG5vZGVzID0gW25ldyBSdWxlKG5vZGVzKV1cbiAgICB9IGVsc2UgaWYgKG5vZGVzLm5hbWUpIHtcbiAgICAgIGxldCBBdFJ1bGUgPSByZXF1aXJlKCcuL2F0LXJ1bGUnKVxuICAgICAgbm9kZXMgPSBbbmV3IEF0UnVsZShub2RlcyldXG4gICAgfSBlbHNlIGlmIChub2Rlcy50ZXh0KSB7XG4gICAgICBub2RlcyA9IFtuZXcgQ29tbWVudChub2RlcyldXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBub2RlIHR5cGUgaW4gbm9kZSBjcmVhdGlvbicpXG4gICAgfVxuXG4gICAgbGV0IHByb2Nlc3NlZCA9IG5vZGVzLm1hcChpID0+IHtcbiAgICAgIGlmIChpLnBhcmVudCkgaS5wYXJlbnQucmVtb3ZlQ2hpbGQoaSlcbiAgICAgIGlmICh0eXBlb2YgaS5yYXdzLmJlZm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHNhbXBsZSAmJiB0eXBlb2Ygc2FtcGxlLnJhd3MuYmVmb3JlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGkucmF3cy5iZWZvcmUgPSBzYW1wbGUucmF3cy5iZWZvcmUucmVwbGFjZSgvW15cXHNdL2csICcnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpLnBhcmVudCA9IHRoaXNcbiAgICAgIHJldHVybiBpXG4gICAgfSlcblxuICAgIHJldHVybiBwcm9jZXNzZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgQ29udGFpbmVyI1xuICAgKiBAbWVtYmVyIHtOb2RlW119IG5vZGVzIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnRhaW5lcuKAmXMgY2hpbGRyZW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IHJvb3QgPSBwb3N0Y3NzLnBhcnNlKCdhIHsgY29sb3I6IGJsYWNrIH0nKVxuICAgKiByb290Lm5vZGVzLmxlbmd0aCAgICAgICAgICAgLy89PiAxXG4gICAqIHJvb3Qubm9kZXNbMF0uc2VsZWN0b3IgICAgICAvLz0+ICdhJ1xuICAgKiByb290Lm5vZGVzWzBdLm5vZGVzWzBdLnByb3AgLy89PiAnY29sb3InXG4gICAqL1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb250YWluZXJcblxuLyoqXG4gKiBAY2FsbGJhY2sgY2hpbGRDb25kaXRpb25cbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAgICBDb250YWluZXIgY2hpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggQ2hpbGQgaW5kZXguXG4gKiBAcGFyYW0ge05vZGVbXX0gbm9kZXMgQWxsIGNvbnRhaW5lciBjaGlsZHJlbi5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgY2hpbGRJdGVyYXRvclxuICogQHBhcmFtIHtOb2RlfSBub2RlICAgIENvbnRhaW5lciBjaGlsZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBDaGlsZCBpbmRleC5cbiAqIEByZXR1cm4ge2ZhbHNlfHVuZGVmaW5lZH0gUmV0dXJuaW5nIGBmYWxzZWAgd2lsbCBicmVhayBpdGVyYXRpb24uXG4gKi9cbiJdfQ==
|