@angular/language-service 11.1.2 → 11.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/ivy/references.js CHANGED
@@ -9,7 +9,7 @@
9
9
  })(function (require, exports) {
10
10
  "use strict";
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.ReferenceBuilder = void 0;
12
+ exports.ReferencesAndRenameBuilder = void 0;
13
13
  var tslib_1 = require("tslib");
14
14
  /**
15
15
  * @license
@@ -26,33 +26,221 @@
26
26
  var template_target_1 = require("@angular/language-service/ivy/template_target");
27
27
  var ts_utils_1 = require("@angular/language-service/ivy/ts_utils");
28
28
  var utils_1 = require("@angular/language-service/ivy/utils");
29
- var ReferenceBuilder = /** @class */ (function () {
30
- function ReferenceBuilder(strategy, tsLS, compiler) {
29
+ function toFilePosition(shimLocation) {
30
+ return { fileName: shimLocation.shimPath, position: shimLocation.positionInShimFile };
31
+ }
32
+ var RequestKind;
33
+ (function (RequestKind) {
34
+ RequestKind[RequestKind["Template"] = 0] = "Template";
35
+ RequestKind[RequestKind["TypeScript"] = 1] = "TypeScript";
36
+ })(RequestKind || (RequestKind = {}));
37
+ var ReferencesAndRenameBuilder = /** @class */ (function () {
38
+ function ReferencesAndRenameBuilder(strategy, tsLS, compiler) {
31
39
  this.strategy = strategy;
32
40
  this.tsLS = tsLS;
33
41
  this.compiler = compiler;
34
42
  this.ttc = this.compiler.getTemplateTypeChecker();
35
43
  }
36
- ReferenceBuilder.prototype.get = function (filePath, position) {
44
+ ReferencesAndRenameBuilder.prototype.getRenameInfo = function (filePath, position) {
45
+ var templateInfo = utils_1.getTemplateInfoAtPosition(filePath, position, this.compiler);
46
+ // We could not get a template at position so we assume the request came from outside the
47
+ // template.
48
+ if (templateInfo === undefined) {
49
+ return this.tsLS.getRenameInfo(filePath, position);
50
+ }
51
+ var allTargetDetails = this.getTargetDetailsAtTemplatePosition(templateInfo, position);
52
+ if (allTargetDetails === null) {
53
+ return { canRename: false, localizedErrorMessage: 'Could not find template node at position.' };
54
+ }
55
+ var templateTarget = allTargetDetails[0].templateTarget;
56
+ var templateTextAndSpan = getRenameTextAndSpanAtPosition(templateTarget, position);
57
+ if (templateTextAndSpan === null) {
58
+ return { canRename: false, localizedErrorMessage: 'Could not determine template node text.' };
59
+ }
60
+ var text = templateTextAndSpan.text, span = templateTextAndSpan.span;
61
+ return {
62
+ canRename: true,
63
+ displayName: text,
64
+ fullDisplayName: text,
65
+ triggerSpan: span,
66
+ };
67
+ };
68
+ ReferencesAndRenameBuilder.prototype.findRenameLocations = function (filePath, position) {
69
+ this.ttc.generateAllTypeCheckBlocks();
70
+ var templateInfo = utils_1.getTemplateInfoAtPosition(filePath, position, this.compiler);
71
+ // We could not get a template at position so we assume the request came from outside the
72
+ // template.
73
+ if (templateInfo === undefined) {
74
+ var requestNode = this.getTsNodeAtPosition(filePath, position);
75
+ if (requestNode === null) {
76
+ return undefined;
77
+ }
78
+ var requestOrigin = { kind: RequestKind.TypeScript, requestNode: requestNode };
79
+ return this.findRenameLocationsAtTypescriptPosition(filePath, position, requestOrigin);
80
+ }
81
+ return this.findRenameLocationsAtTemplatePosition(templateInfo, position);
82
+ };
83
+ ReferencesAndRenameBuilder.prototype.findRenameLocationsAtTemplatePosition = function (templateInfo, position) {
84
+ var e_1, _a, e_2, _b;
85
+ var allTargetDetails = this.getTargetDetailsAtTemplatePosition(templateInfo, position);
86
+ if (allTargetDetails === null) {
87
+ return undefined;
88
+ }
89
+ var allRenameLocations = [];
90
+ try {
91
+ for (var allTargetDetails_1 = tslib_1.__values(allTargetDetails), allTargetDetails_1_1 = allTargetDetails_1.next(); !allTargetDetails_1_1.done; allTargetDetails_1_1 = allTargetDetails_1.next()) {
92
+ var targetDetails = allTargetDetails_1_1.value;
93
+ var requestOrigin = {
94
+ kind: RequestKind.Template,
95
+ requestNode: targetDetails.templateTarget,
96
+ position: position,
97
+ };
98
+ try {
99
+ for (var _c = (e_2 = void 0, tslib_1.__values(targetDetails.typescriptLocations)), _d = _c.next(); !_d.done; _d = _c.next()) {
100
+ var location_1 = _d.value;
101
+ var locations = this.findRenameLocationsAtTypescriptPosition(location_1.fileName, location_1.position, requestOrigin);
102
+ // If we couldn't find rename locations for _any_ result, we should not allow renaming to
103
+ // proceed instead of having a partially complete rename.
104
+ if (locations === undefined) {
105
+ return undefined;
106
+ }
107
+ allRenameLocations.push.apply(allRenameLocations, tslib_1.__spread(locations));
108
+ }
109
+ }
110
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
111
+ finally {
112
+ try {
113
+ if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
114
+ }
115
+ finally { if (e_2) throw e_2.error; }
116
+ }
117
+ }
118
+ }
119
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
120
+ finally {
121
+ try {
122
+ if (allTargetDetails_1_1 && !allTargetDetails_1_1.done && (_a = allTargetDetails_1.return)) _a.call(allTargetDetails_1);
123
+ }
124
+ finally { if (e_1) throw e_1.error; }
125
+ }
126
+ return allRenameLocations.length > 0 ? allRenameLocations : undefined;
127
+ };
128
+ ReferencesAndRenameBuilder.prototype.getTsNodeAtPosition = function (filePath, position) {
129
+ var _a;
130
+ var sf = this.strategy.getProgram().getSourceFile(filePath);
131
+ if (!sf) {
132
+ return null;
133
+ }
134
+ return (_a = ts_utils_1.findTightestNode(sf, position)) !== null && _a !== void 0 ? _a : null;
135
+ };
136
+ ReferencesAndRenameBuilder.prototype.findRenameLocationsAtTypescriptPosition = function (filePath, position, requestOrigin) {
137
+ var e_3, _a;
138
+ var originalNodeText;
139
+ if (requestOrigin.kind === RequestKind.TypeScript) {
140
+ originalNodeText = requestOrigin.requestNode.getText();
141
+ }
142
+ else {
143
+ var templateNodeText = getRenameTextAndSpanAtPosition(requestOrigin.requestNode, requestOrigin.position);
144
+ if (templateNodeText === null) {
145
+ return undefined;
146
+ }
147
+ originalNodeText = templateNodeText.text;
148
+ }
149
+ var locations = this.tsLS.findRenameLocations(filePath, position, /*findInStrings*/ false, /*findInComments*/ false);
150
+ if (locations === undefined) {
151
+ return undefined;
152
+ }
153
+ var entries = new Map();
154
+ try {
155
+ for (var locations_1 = tslib_1.__values(locations), locations_1_1 = locations_1.next(); !locations_1_1.done; locations_1_1 = locations_1.next()) {
156
+ var location_2 = locations_1_1.value;
157
+ // TODO(atscott): Determine if a file is a shim file in a more robust way and make the API
158
+ // available in an appropriate location.
159
+ if (this.ttc.isTrackedTypeCheckFile(file_system_1.absoluteFrom(location_2.fileName))) {
160
+ var entry = this.convertToTemplateDocumentSpan(location_2, this.ttc, originalNodeText);
161
+ // There is no template node whose text matches the original rename request. Bail on
162
+ // renaming completely rather than providing incomplete results.
163
+ if (entry === null) {
164
+ return undefined;
165
+ }
166
+ entries.set(createLocationKey(entry), entry);
167
+ }
168
+ else {
169
+ // Ensure we only allow renaming a TS result with matching text
170
+ var refNode = this.getTsNodeAtPosition(location_2.fileName, location_2.textSpan.start);
171
+ if (refNode === null || refNode.getText() !== originalNodeText) {
172
+ return undefined;
173
+ }
174
+ entries.set(createLocationKey(location_2), location_2);
175
+ }
176
+ }
177
+ }
178
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
179
+ finally {
180
+ try {
181
+ if (locations_1_1 && !locations_1_1.done && (_a = locations_1.return)) _a.call(locations_1);
182
+ }
183
+ finally { if (e_3) throw e_3.error; }
184
+ }
185
+ return Array.from(entries.values());
186
+ };
187
+ ReferencesAndRenameBuilder.prototype.getReferencesAtPosition = function (filePath, position) {
37
188
  this.ttc.generateAllTypeCheckBlocks();
38
189
  var templateInfo = utils_1.getTemplateInfoAtPosition(filePath, position, this.compiler);
39
- return templateInfo !== undefined ?
40
- this.getReferencesAtTemplatePosition(templateInfo, position) :
41
- this.getReferencesAtTypescriptPosition(filePath, position);
190
+ if (templateInfo === undefined) {
191
+ return this.getReferencesAtTypescriptPosition(filePath, position);
192
+ }
193
+ return this.getReferencesAtTemplatePosition(templateInfo, position);
194
+ };
195
+ ReferencesAndRenameBuilder.prototype.getReferencesAtTemplatePosition = function (templateInfo, position) {
196
+ var e_4, _a, e_5, _b;
197
+ var allTargetDetails = this.getTargetDetailsAtTemplatePosition(templateInfo, position);
198
+ if (allTargetDetails === null) {
199
+ return undefined;
200
+ }
201
+ var allReferences = [];
202
+ try {
203
+ for (var allTargetDetails_2 = tslib_1.__values(allTargetDetails), allTargetDetails_2_1 = allTargetDetails_2.next(); !allTargetDetails_2_1.done; allTargetDetails_2_1 = allTargetDetails_2.next()) {
204
+ var targetDetails = allTargetDetails_2_1.value;
205
+ try {
206
+ for (var _c = (e_5 = void 0, tslib_1.__values(targetDetails.typescriptLocations)), _d = _c.next(); !_d.done; _d = _c.next()) {
207
+ var location_3 = _d.value;
208
+ var refs = this.getReferencesAtTypescriptPosition(location_3.fileName, location_3.position);
209
+ if (refs !== undefined) {
210
+ allReferences.push.apply(allReferences, tslib_1.__spread(refs));
211
+ }
212
+ }
213
+ }
214
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
215
+ finally {
216
+ try {
217
+ if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
218
+ }
219
+ finally { if (e_5) throw e_5.error; }
220
+ }
221
+ }
222
+ }
223
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
224
+ finally {
225
+ try {
226
+ if (allTargetDetails_2_1 && !allTargetDetails_2_1.done && (_a = allTargetDetails_2.return)) _a.call(allTargetDetails_2);
227
+ }
228
+ finally { if (e_4) throw e_4.error; }
229
+ }
230
+ return allReferences.length > 0 ? allReferences : undefined;
42
231
  };
43
- ReferenceBuilder.prototype.getReferencesAtTemplatePosition = function (_a, position) {
44
- var e_1, _b;
45
- var _c, _d, _e, _f, _g, _h, _j, _k;
232
+ ReferencesAndRenameBuilder.prototype.getTargetDetailsAtTemplatePosition = function (_a, position) {
233
+ var e_6, _b;
46
234
  var template = _a.template, component = _a.component;
47
235
  // Find the AST node in the template at the position.
48
236
  var positionDetails = template_target_1.getTargetAtPosition(template, position);
49
237
  if (positionDetails === null) {
50
- return undefined;
238
+ return null;
51
239
  }
52
240
  var nodes = positionDetails.context.kind === template_target_1.TargetNodeKind.TwoWayBindingContext ?
53
241
  positionDetails.context.nodes :
54
242
  [positionDetails.context.node];
55
- var references = [];
243
+ var details = [];
56
244
  try {
57
245
  for (var nodes_1 = tslib_1.__values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
58
246
  var node = nodes_1_1.value;
@@ -61,6 +249,7 @@
61
249
  if (symbol === null) {
62
250
  continue;
63
251
  }
252
+ var templateTarget = node;
64
253
  switch (symbol.kind) {
65
254
  case api_1.SymbolKind.Directive:
66
255
  case api_1.SymbolKind.Template:
@@ -69,7 +258,7 @@
69
258
  break;
70
259
  case api_1.SymbolKind.Element: {
71
260
  var matches = utils_1.getDirectiveMatchesForElementTag(symbol.templateNode, symbol.directives);
72
- references.push.apply(references, tslib_1.__spread((_c = this.getReferencesForDirectives(matches)) !== null && _c !== void 0 ? _c : []));
261
+ details.push({ typescriptLocations: this.getPositionsForDirectives(matches), templateTarget: templateTarget });
73
262
  break;
74
263
  }
75
264
  case api_1.SymbolKind.DomBinding: {
@@ -77,68 +266,78 @@
77
266
  // have a shim location. This means we can't match dom bindings to their lib.dom
78
267
  // reference, but we can still see if they match to a directive.
79
268
  if (!(node instanceof compiler_1.TmplAstTextAttribute) && !(node instanceof compiler_1.TmplAstBoundAttribute)) {
80
- break;
269
+ return null;
81
270
  }
82
271
  var directives = utils_1.getDirectiveMatchesForAttribute(node.name, symbol.host.templateNode, symbol.host.directives);
83
- references.push.apply(references, tslib_1.__spread((_d = this.getReferencesForDirectives(directives)) !== null && _d !== void 0 ? _d : []));
272
+ details.push({
273
+ typescriptLocations: this.getPositionsForDirectives(directives),
274
+ templateTarget: templateTarget,
275
+ });
84
276
  break;
85
277
  }
86
278
  case api_1.SymbolKind.Reference: {
87
- var _l = symbol.referenceVarLocation, shimPath = _l.shimPath, positionInShimFile = _l.positionInShimFile;
88
- references.push.apply(references, tslib_1.__spread((_e = this.getReferencesAtTypescriptPosition(shimPath, positionInShimFile)) !== null && _e !== void 0 ? _e : []));
279
+ details.push({
280
+ typescriptLocations: [toFilePosition(symbol.referenceVarLocation)],
281
+ templateTarget: templateTarget,
282
+ });
89
283
  break;
90
284
  }
91
285
  case api_1.SymbolKind.Variable: {
92
- var _m = symbol.initializerLocation, initializerPosition = _m.positionInShimFile, shimPath = _m.shimPath;
93
- var localVarPosition = symbol.localVarLocation.positionInShimFile;
94
- if ((node instanceof compiler_1.TmplAstVariable)) {
95
- if (node.valueSpan !== undefined && utils_1.isWithin(position, node.valueSpan)) {
286
+ if ((templateTarget instanceof compiler_1.TmplAstVariable)) {
287
+ if (templateTarget.valueSpan !== undefined &&
288
+ utils_1.isWithin(position, templateTarget.valueSpan)) {
96
289
  // In the valueSpan of the variable, we want to get the reference of the initializer.
97
- references.push.apply(references, tslib_1.__spread((_f = this.getReferencesAtTypescriptPosition(shimPath, initializerPosition)) !== null && _f !== void 0 ? _f : []));
290
+ details.push({
291
+ typescriptLocations: [toFilePosition(symbol.initializerLocation)],
292
+ templateTarget: templateTarget,
293
+ });
98
294
  }
99
- else if (utils_1.isWithin(position, node.keySpan)) {
295
+ else if (utils_1.isWithin(position, templateTarget.keySpan)) {
100
296
  // In the keySpan of the variable, we want to get the reference of the local variable.
101
- references.push.apply(references, tslib_1.__spread((_g = this.getReferencesAtTypescriptPosition(shimPath, localVarPosition)) !== null && _g !== void 0 ? _g : []));
297
+ details.push({
298
+ typescriptLocations: [toFilePosition(symbol.localVarLocation)],
299
+ templateTarget: templateTarget,
300
+ });
102
301
  }
103
302
  }
104
303
  else {
105
- // If the templateNode is not the `TmplAstVariable`, it must be a usage of the variable
106
- // somewhere in the template.
107
- references.push.apply(references, tslib_1.__spread((_h = this.getReferencesAtTypescriptPosition(shimPath, localVarPosition)) !== null && _h !== void 0 ? _h : []));
304
+ // If the templateNode is not the `TmplAstVariable`, it must be a usage of the
305
+ // variable somewhere in the template.
306
+ details.push({
307
+ typescriptLocations: [toFilePosition(symbol.localVarLocation)],
308
+ templateTarget: templateTarget,
309
+ });
108
310
  }
109
311
  break;
110
312
  }
111
313
  case api_1.SymbolKind.Input:
112
314
  case api_1.SymbolKind.Output: {
113
- // TODO(atscott): Determine how to handle when the binding maps to several inputs/outputs
114
- var _o = symbol.bindings[0].shimLocation, shimPath = _o.shimPath, positionInShimFile = _o.positionInShimFile;
115
- references.push.apply(references, tslib_1.__spread((_j = this.getReferencesAtTypescriptPosition(shimPath, positionInShimFile)) !== null && _j !== void 0 ? _j : []));
315
+ details.push({
316
+ typescriptLocations: symbol.bindings.map(function (binding) { return toFilePosition(binding.shimLocation); }),
317
+ templateTarget: templateTarget,
318
+ });
116
319
  break;
117
320
  }
118
321
  case api_1.SymbolKind.Pipe:
119
322
  case api_1.SymbolKind.Expression: {
120
- var _p = symbol.shimLocation, shimPath = _p.shimPath, positionInShimFile = _p.positionInShimFile;
121
- references.push.apply(references, tslib_1.__spread((_k = this.getReferencesAtTypescriptPosition(shimPath, positionInShimFile)) !== null && _k !== void 0 ? _k : []));
323
+ details.push({ typescriptLocations: [toFilePosition(symbol.shimLocation)], templateTarget: templateTarget });
122
324
  break;
123
325
  }
124
326
  }
125
327
  }
126
328
  }
127
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
329
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
128
330
  finally {
129
331
  try {
130
332
  if (nodes_1_1 && !nodes_1_1.done && (_b = nodes_1.return)) _b.call(nodes_1);
131
333
  }
132
- finally { if (e_1) throw e_1.error; }
133
- }
134
- if (references.length === 0) {
135
- return undefined;
334
+ finally { if (e_6) throw e_6.error; }
136
335
  }
137
- return references;
336
+ return details.length > 0 ? details : null;
138
337
  };
139
- ReferenceBuilder.prototype.getReferencesForDirectives = function (directives) {
140
- var e_2, _a;
141
- var allDirectiveRefs = [];
338
+ ReferencesAndRenameBuilder.prototype.getPositionsForDirectives = function (directives) {
339
+ var e_7, _a;
340
+ var allDirectives = [];
142
341
  try {
143
342
  for (var _b = tslib_1.__values(directives.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
144
343
  var dir = _c.value;
@@ -147,78 +346,122 @@
147
346
  dirClass.name === undefined) {
148
347
  continue;
149
348
  }
150
- var dirFile = dirClass.getSourceFile().fileName;
151
- var dirPosition = dirClass.name.getStart();
152
- var directiveRefs = this.getReferencesAtTypescriptPosition(dirFile, dirPosition);
153
- if (directiveRefs !== undefined) {
154
- allDirectiveRefs.push.apply(allDirectiveRefs, tslib_1.__spread(directiveRefs));
155
- }
349
+ var fileName = dirClass.getSourceFile().fileName;
350
+ var position = dirClass.name.getStart();
351
+ allDirectives.push({ fileName: fileName, position: position });
156
352
  }
157
353
  }
158
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
354
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
159
355
  finally {
160
356
  try {
161
357
  if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
162
358
  }
163
- finally { if (e_2) throw e_2.error; }
359
+ finally { if (e_7) throw e_7.error; }
164
360
  }
165
- return allDirectiveRefs.length > 0 ? allDirectiveRefs : undefined;
361
+ return allDirectives;
166
362
  };
167
- ReferenceBuilder.prototype.getReferencesAtTypescriptPosition = function (fileName, position) {
168
- var e_3, _a;
363
+ ReferencesAndRenameBuilder.prototype.getReferencesAtTypescriptPosition = function (fileName, position) {
364
+ var e_8, _a;
169
365
  var refs = this.tsLS.getReferencesAtPosition(fileName, position);
170
366
  if (refs === undefined) {
171
367
  return undefined;
172
368
  }
173
- var entries = [];
369
+ var entries = new Map();
174
370
  try {
175
371
  for (var refs_1 = tslib_1.__values(refs), refs_1_1 = refs_1.next(); !refs_1_1.done; refs_1_1 = refs_1.next()) {
176
372
  var ref = refs_1_1.value;
177
373
  if (this.ttc.isTrackedTypeCheckFile(file_system_1.absoluteFrom(ref.fileName))) {
178
- var entry = this.convertToTemplateReferenceEntry(ref, this.ttc);
374
+ var entry = this.convertToTemplateDocumentSpan(ref, this.ttc);
179
375
  if (entry !== null) {
180
- entries.push(entry);
376
+ entries.set(createLocationKey(entry), entry);
181
377
  }
182
378
  }
183
379
  else {
184
- entries.push(ref);
380
+ entries.set(createLocationKey(ref), ref);
185
381
  }
186
382
  }
187
383
  }
188
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
384
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
189
385
  finally {
190
386
  try {
191
387
  if (refs_1_1 && !refs_1_1.done && (_a = refs_1.return)) _a.call(refs_1);
192
388
  }
193
- finally { if (e_3) throw e_3.error; }
389
+ finally { if (e_8) throw e_8.error; }
194
390
  }
195
- return entries;
391
+ return Array.from(entries.values());
196
392
  };
197
- ReferenceBuilder.prototype.convertToTemplateReferenceEntry = function (shimReferenceEntry, templateTypeChecker) {
198
- var sf = this.strategy.getProgram().getSourceFile(shimReferenceEntry.fileName);
393
+ ReferencesAndRenameBuilder.prototype.convertToTemplateDocumentSpan = function (shimDocumentSpan, templateTypeChecker, requiredNodeText) {
394
+ var sf = this.strategy.getProgram().getSourceFile(shimDocumentSpan.fileName);
199
395
  if (sf === undefined) {
200
396
  return null;
201
397
  }
202
- var tcbNode = ts_utils_1.findTightestNode(sf, shimReferenceEntry.textSpan.start);
398
+ var tcbNode = ts_utils_1.findTightestNode(sf, shimDocumentSpan.textSpan.start);
203
399
  if (tcbNode === undefined ||
204
400
  comments_1.hasExpressionIdentifier(sf, tcbNode, comments_1.ExpressionIdentifier.EVENT_PARAMETER)) {
205
- // If the reference result is the $event parameter in the subscribe/addEventListener function
206
- // in the TCB, we want to filter this result out of the references. We really only want to
207
- // return references to the parameter in the template itself.
401
+ // If the reference result is the $event parameter in the subscribe/addEventListener
402
+ // function in the TCB, we want to filter this result out of the references. We really only
403
+ // want to return references to the parameter in the template itself.
208
404
  return null;
209
405
  }
210
406
  // TODO(atscott): Determine how to consistently resolve paths. i.e. with the project
211
407
  // serverHost or LSParseConfigHost in the adapter. We should have a better defined way to
212
408
  // normalize paths.
213
- var mapping = utils_1.getTemplateLocationFromShimLocation(templateTypeChecker, file_system_1.absoluteFrom(shimReferenceEntry.fileName), shimReferenceEntry.textSpan.start);
409
+ var mapping = utils_1.getTemplateLocationFromShimLocation(templateTypeChecker, file_system_1.absoluteFrom(shimDocumentSpan.fileName), shimDocumentSpan.textSpan.start);
214
410
  if (mapping === null) {
215
411
  return null;
216
412
  }
217
413
  var span = mapping.span, templateUrl = mapping.templateUrl;
218
- return tslib_1.__assign(tslib_1.__assign({}, shimReferenceEntry), { fileName: templateUrl, textSpan: utils_1.toTextSpan(span) });
414
+ if (requiredNodeText !== undefined && span.toString() !== requiredNodeText) {
415
+ return null;
416
+ }
417
+ return tslib_1.__assign(tslib_1.__assign({}, shimDocumentSpan), { fileName: templateUrl, textSpan: utils_1.toTextSpan(span) });
219
418
  };
220
- return ReferenceBuilder;
419
+ return ReferencesAndRenameBuilder;
221
420
  }());
222
- exports.ReferenceBuilder = ReferenceBuilder;
421
+ exports.ReferencesAndRenameBuilder = ReferencesAndRenameBuilder;
422
+ function getRenameTextAndSpanAtPosition(node, position) {
423
+ if (node instanceof compiler_1.TmplAstBoundAttribute || node instanceof compiler_1.TmplAstTextAttribute ||
424
+ node instanceof compiler_1.TmplAstBoundEvent) {
425
+ if (node.keySpan === undefined) {
426
+ return null;
427
+ }
428
+ return { text: node.name, span: utils_1.toTextSpan(node.keySpan) };
429
+ }
430
+ else if (node instanceof compiler_1.TmplAstVariable || node instanceof compiler_1.TmplAstReference) {
431
+ if (utils_1.isWithin(position, node.keySpan)) {
432
+ return { text: node.keySpan.toString(), span: utils_1.toTextSpan(node.keySpan) };
433
+ }
434
+ else if (node.valueSpan && utils_1.isWithin(position, node.valueSpan)) {
435
+ return { text: node.valueSpan.toString(), span: utils_1.toTextSpan(node.valueSpan) };
436
+ }
437
+ }
438
+ if (node instanceof compiler_1.BindingPipe) {
439
+ // TODO(atscott): Add support for renaming pipes
440
+ return null;
441
+ }
442
+ if (node instanceof compiler_1.PropertyRead || node instanceof compiler_1.MethodCall || node instanceof compiler_1.PropertyWrite ||
443
+ node instanceof compiler_1.SafePropertyRead || node instanceof compiler_1.SafeMethodCall) {
444
+ return { text: node.name, span: utils_1.toTextSpan(node.nameSpan) };
445
+ }
446
+ else if (node instanceof compiler_1.LiteralPrimitive) {
447
+ var span = utils_1.toTextSpan(node.sourceSpan);
448
+ var text = node.value;
449
+ if (typeof text === 'string') {
450
+ // The span of a string literal includes the quotes but they should be removed for renaming.
451
+ span.start += 1;
452
+ span.length -= 2;
453
+ }
454
+ return { text: text, span: span };
455
+ }
456
+ return null;
457
+ }
458
+ /**
459
+ * Creates a "key" for a rename/reference location by concatenating file name, span start, and span
460
+ * length. This allows us to de-duplicate template results when an item may appear several times
461
+ * in the TCB but map back to the same template location.
462
+ */
463
+ function createLocationKey(ds) {
464
+ return ds.fileName + ds.textSpan.start + ds.textSpan.length;
465
+ }
223
466
  });
224
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2xhbmd1YWdlLXNlcnZpY2UvaXZ5L3JlZmVyZW5jZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztJQUFBOzs7Ozs7T0FNRztJQUNILDhDQUErRjtJQUUvRiwyRUFBaUg7SUFDakgscUVBQTRJO0lBQzVJLG1GQUFxSDtJQUNySCwrQkFBaUM7SUFFakMsaUZBQXNFO0lBQ3RFLG1FQUE0QztJQUM1Qyw2REFBOEw7SUFFOUw7UUFHRSwwQkFDcUIsUUFBcUMsRUFDckMsSUFBd0IsRUFBbUIsUUFBb0I7WUFEL0QsYUFBUSxHQUFSLFFBQVEsQ0FBNkI7WUFDckMsU0FBSSxHQUFKLElBQUksQ0FBb0I7WUFBbUIsYUFBUSxHQUFSLFFBQVEsQ0FBWTtZQUpuRSxRQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBSXlCLENBQUM7UUFFeEYsOEJBQUcsR0FBSCxVQUFJLFFBQWdCLEVBQUUsUUFBZ0I7WUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3RDLElBQU0sWUFBWSxHQUFHLGlDQUF5QixDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xGLE9BQU8sWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsK0JBQStCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVPLDBEQUErQixHQUF2QyxVQUF3QyxFQUFtQyxFQUFFLFFBQWdCOzs7Z0JBQXBELFFBQVEsY0FBQSxFQUFFLFNBQVMsZUFBQTtZQUUxRCxxREFBcUQ7WUFDckQsSUFBTSxlQUFlLEdB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LENBQUMsRUFBRSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4RSxJQUFJLE9BQU8sS0FBSyxTQUFTO2dCQUNyQixrQ0FBdUIsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLCtCQUFvQixDQUFDLGVBQWUsQ0FBQyxFQUFFO2dCQUM5RSw2RkFBNkY7Z0JBQzdGLDBGQUEwRjtnQkFDMUYsNkRBQTZEO2dCQUM3RCxPQUFPLElBQUksQ0FBQzthQUNiO1lBQ0Qsb0ZBQW9GO1lBQ3BGLHlGQUF5RjtZQUN6RixtQkFBbUI7WUFDbkIsSUFBTSxPQUFPLEdBQUcsMkNBQW1DLENBQy9DLG1CQUFtQixFQUFFLDBCQUFZLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEVBQzlELGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFTSxJQUFBLElBQUksR0FBaUIsT0FBTyxLQUF4QixFQUFFLFdBQVcsR0FBSSxPQUFPLFlBQVgsQ0FBWTtZQUNwQyw2Q0FDSyxrQkFBa0IsS0FDckIsUUFBUSxFQUFFLFdBQVcsRUFDckIsUUFBUSxFQUFFLGtCQUFVLENBQUMsSUFBSSxDQUFDLElBQzFCO1FBQ0osQ0FBQztRQUNILHVCQUFDO0lBQUQsQ0FBQyxBQXpMRCxJQXlMQztJQXpMWSw0Q0FBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmltcG9ydCB7VG1wbEFzdEJvdW5kQXR0cmlidXRlLCBUbXBsQXN0VGV4dEF0dHJpYnV0ZSwgVG1wbEFzdFZhcmlhYmxlfSBmcm9tICdAYW5ndWxhci9jb21waWxlcic7XG5pbXBvcnQge05nQ29tcGlsZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvY29yZSc7XG5pbXBvcnQge2Fic29sdXRlRnJvbSwgYWJzb2x1dGVGcm9tU291cmNlRmlsZSwgQWJzb2x1dGVGc1BhdGh9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvZmlsZV9zeXN0ZW0nO1xuaW1wb3J0IHtEaXJlY3RpdmVTeW1ib2wsIFN5bWJvbEtpbmQsIFRlbXBsYXRlVHlwZUNoZWNrZXIsIFR5cGVDaGVja2luZ1Byb2dyYW1TdHJhdGVneX0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXItY2xpL3NyYy9uZ3RzYy90eXBlY2hlY2svYXBpJztcbmltcG9ydCB7RXhwcmVzc2lvbklkZW50aWZpZXIsIGhhc0V4cHJlc3Npb25JZGVudGlmaWVyfSBmcm9tICdAYW5ndWxhci9jb21waWxlci1jbGkvc3JjL25ndHNjL3R5cGVjaGVjay9zcmMvY29tbWVudHMnO1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7Z2V0VGFyZ2V0QXRQb3NpdGlvbiwgVGFyZ2V0Tm9kZUtpbmR9IGZyb20gJy4vdGVtcGxhdGVfdGFyZ2V0JztcbmltcG9ydCB7ZmluZFRpZ2h0ZXN0Tm9kZX0gZnJvbSAnLi90c191dGlscyc7XG5pbXBvcnQge2dldERpcmVjdGl2ZU1hdGNoZXNGb3JBdHRyaWJ1dGUsIGdldERpcmVjdGl2ZU1hdGNoZXNGb3JFbGVtZW50VGFnLCBnZXRUZW1wbGF0ZUluZm9BdFBvc2l0aW9uLCBnZXRUZW1wbGF0ZUxvY2F0aW9uRnJvbVNoaW1Mb2NhdGlvbiwgaXNXaXRoaW4sIFRlbXBsYXRlSW5mbywgdG9UZXh0U3Bhbn0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBSZWZlcmVuY2VCdWlsZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0dGMgPSB0aGlzLmNvbXBpbGVyLmdldFRlbXBsYXRlVHlwZUNoZWNrZXIoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyYXRlZ3k6IFR5cGVDaGVja2luZ1Byb2dyYW1TdHJhdGVneSxcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgdHNMUzogdHMuTGFuZ3VhZ2VTZXJ2aWNlLCBwcml2YXRlIHJlYWRvbmx5IGNvbXBpbGVyOiBOZ0NvbXBpbGVyKSB7fVxuXG4gIGdldChmaWxlUGF0aDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTogdHMuUmVmZXJlbmNlRW50cnlbXXx1bmRlZmluZWQge1xuICAgIHRoaXMudHRjLmdlbmVyYXRlQWxsVHlwZUNoZWNrQmxvY2tzKCk7XG4gICAgY29uc3QgdGVtcGxhdGVJbmZvID0gZ2V0VGVtcGxhdGVJbmZvQXRQb3NpdGlvbihmaWxlUGF0aCwgcG9zaXRpb24sIHRoaXMuY29tcGlsZXIpO1xuICAgIHJldHVybiB0ZW1wbGF0ZUluZm8gIT09IHVuZGVmaW5lZCA/XG4gICAgICAgIHRoaXMuZ2V0UmVmZXJlbmNlc0F0VGVtcGxhdGVQb3NpdGlvbih0ZW1wbGF0ZUluZm8sIHBvc2l0aW9uKSA6XG4gICAgICAgIHRoaXMuZ2V0UmVmZXJlbmNlc0F0VHlwZXNjcmlwdFBvc2l0aW9uKGZpbGVQYXRoLCBwb3NpdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGdldFJlZmVyZW5jZXNBdFRlbXBsYXRlUG9zaXRpb24oe3RlbXBsYXRlLCBjb21wb25lbnR9OiBUZW1wbGF0ZUluZm8sIHBvc2l0aW9uOiBudW1iZXIpOlxuICAgICAgdHMuUmVmZXJlbmNlRW50cnlbXXx1bmRlZmluZWQge1xuICAgIC8vIEZpbmQgdGhlIEFTVCBub2RlIGluIHRoZSB0ZW1wbGF0ZSBhdCB0aGUgcG9zaXRpb24uXG4gICAgY29uc3QgcG9zaXRpb25EZXRhaWxzID0gZ2V0VGFyZ2V0QXRQb3NpdGlvbih0ZW1wbGF0ZSwgcG9zaXRpb24pO1xuICAgIGlmIChwb3NpdGlvbkRldGFpbHMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZXMgPSBwb3NpdGlvbkRldGFpbHMuY29udGV4dC5raW5kID09PSBUYXJnZXROb2RlS2luZC5Ud29XYXlCaW5kaW5nQ29udGV4dCA/XG4gICAgICAgIHBvc2l0aW9uRGV0YWlscy5jb250ZXh0Lm5vZGVzIDpcbiAgICAgICAgW3Bvc2l0aW9uRGV0YWlscy5jb250ZXh0Lm5vZGVdO1xuXG4gICAgY29uc3QgcmVmZXJlbmNlczogdHMuUmVmZXJlbmNlRW50cnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgLy8gR2V0IHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgVENCIGF0IHRoZSB0ZW1wbGF0ZSBwb3NpdGlvbi5cbiAgICAgIGNvbnN0IHN5bWJvbCA9IHRoaXMudHRjLmdldFN5bWJvbE9mTm9kZShub2RlLCBjb21wb25lbnQpO1xuICAgICAgaWYgKHN5bWJvbCA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChzeW1ib2wua2luZCkge1xuICAgICAgICBjYXNlIFN5bWJvbEtpbmQuRGlyZWN0aXZlOlxuICAgICAgICBjYXNlIFN5bWJvbEtpbmQuVGVtcGxhdGU6XG4gICAgICAgICAgLy8gUmVmZXJlbmNlcyB0byBlbGVtZW50cywgdGVtcGxhdGVzLCBhbmQgZGlyZWN0aXZlcyB3aWxsIGJlIHRocm91Z2ggdGVtcGxhdGUgcmVmZXJlbmNlc1xuICAgICAgICAgIC8vICgjcmVmKS4gVGhleSBzaG91bGRuJ3QgYmUgdXNlZCBkaXJlY3RseSBmb3IgYSBMYW5ndWFnZSBTZXJ2aWNlIHJlZmVyZW5jZSByZXF1ZXN0LlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bWJvbEtpbmQuRWxlbWVudDoge1xuICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXREaXJlY3RpdmVNYXRjaGVzRm9yRWxlbWVudFRhZyhzeW1ib2wudGVtcGxhdGVOb2RlLCBzeW1ib2wuZGlyZWN0aXZlcyk7XG4gICAgICAgICAgcmVmZXJlbmNlcy5wdXNoKC4uLnRoaXMuZ2V0UmVmZXJlbmNlc0ZvckRpcmVjdGl2ZXMobWF0Y2hlcykgPz8gW10pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgU3ltYm9sS2luZC5Eb21CaW5kaW5nOiB7XG4gICAgICAgICAgLy8gRG9tIGJpbmRpbmdzIGFyZW4ndCBjdXJyZW50bHkgdHlwZS1jaGVja2VkIChzZWUgYGNoZWNrVHlwZU9mRG9tQmluZGluZ3NgKSBzbyB0aGV5IGRvbid0XG4gICAgICAgICAgLy8gaGF2ZSBhIHNoaW0gbG9jYXRpb24uIFRoaXMgbWVhbnMgd2UgY2FuJ3QgbWF0Y2ggZG9tIGJpbmRpbmdzIHRvIHRoZWlyIGxpYi5kb21cbiAgICAgICAgICAvLyByZWZlcmVuY2UsIGJ1dCB3ZSBjYW4gc3RpbGwgc2VlIGlmIHRoZXkgbWF0Y2ggdG8gYSBkaXJlY3RpdmUuXG4gICAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIFRtcGxBc3RUZXh0QXR0cmlidXRlKSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBUbXBsQXN0Qm91bmRBdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZGlyZWN0aXZlcyA9IGdldERpcmVjdGl2ZU1hdGNoZXNGb3JBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgIG5vZGUubmFtZSwgc3ltYm9sLmhvc3QudGVtcGxhdGVOb2RlLCBzeW1ib2wuaG9zdC5kaXJlY3RpdmVzKTtcbiAgICAgICAgICByZWZlcmVuY2VzLnB1c2goLi4udGhpcy5nZXRSZWZlcmVuY2VzRm9yRGlyZWN0aXZlcyhkaXJlY3RpdmVzKSA/PyBbXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBTeW1ib2xLaW5kLlJlZmVyZW5jZToge1xuICAgICAgICAgIGNvbnN0IHtzaGltUGF0aCwgcG9zaXRpb25JblNoaW1GaWxlfSA9IHN5bWJvbC5yZWZlcmVuY2VWYXJMb2NhdGlvbjtcbiAgICAgICAgICByZWZlcmVuY2VzLnB1c2goXG4gICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UmVmZXJlbmNlc0F0VHlwZXNjcmlwdFBvc2l0aW9uKHNoaW1QYXRoLCBwb3NpdGlvbkluU2hpbUZpbGUpID8/IFtdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFN5bWJvbEtpbmQuVmFyaWFibGU6IHtcbiAgICAgICAgICBjb25zdCB7cG9zaXRpb25JblNoaW1GaWxlOiBpbml0aWFsaXplclBvc2l0aW9uLCBzaGltUGF0aH0gPSBzeW1ib2wuaW5pdGlhbGl6ZXJMb2NhdGlvbjtcbiAgICAgICAgICBjb25zdCBsb2NhbFZhclBvc2l0aW9uID0gc3ltYm9sLmxvY2FsVmFyTG9jYXRpb24ucG9zaXRpb25JblNoaW1GaWxlO1xuXG4gICAgICAgICAgaWYgKChub2RlIGluc3RhbmNlb2YgVG1wbEFzdFZhcmlhYmxlKSkge1xuICAgICAgICAgICAgaWYgKG5vZGUudmFsdWVTcGFuICE9PSB1bmRlZmluZWQgJiYgaXNXaXRoaW4ocG9zaXRpb24sIG5vZGUudmFsdWVTcGFuKSkge1xuICAgICAgICAgICAgICAvLyBJbiB0aGUgdmFsdWVTcGFuIG9mIHRoZSB2YXJpYWJsZSwgd2Ugd2FudCB0byBnZXQgdGhlIHJlZmVyZW5jZSBvZiB0aGUgaW5pdGlhbGl6ZXIuXG4gICAgICAgICAgICAgIHJlZmVyZW5jZXMucHVzaChcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UmVmZXJlbmNlc0F0VHlwZXNjcmlwdFBvc2l0aW9uKHNoaW1QYXRoLCBpbml0aWFsaXplclBvc2l0aW9uKSA/PyBbXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzV2l0aGluKHBvc2l0aW9uLCBub2RlLmtleVNwYW4pKSB7XG4gICAgICAgICAgICAgIC8vIEluIHRoZSBrZXlTcGFuIG9mIHRoZSB2YXJpYWJsZSwgd2Ugd2FudCB0byBnZXQgdGhlIHJlZmVyZW5jZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUuXG4gICAgICAgICAgICAgIHJlZmVyZW5jZXMucHVzaChcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UmVmZXJlbmNlc0F0VHlwZXNjcmlwdFBvc2l0aW9uKHNoaW1QYXRoLCBsb2NhbFZhclBvc2l0aW9uKSA/PyBbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSB0ZW1wbGF0ZU5vZGUgaXMgbm90IHRoZSBgVG1wbEFzdFZhcmlhYmxlYCwgaXQgbXVzdCBiZSBhIHVzYWdlIG9mIHRoZSB2YXJpYWJsZVxuICAgICAgICAgICAgLy8gc29tZXdoZXJlIGluIHRoZSB0ZW1wbGF0ZS5cbiAgICAgICAgICAgIHJlZmVyZW5jZXMucHVzaChcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdldFJlZmVyZW5jZXNBdFR5cGVzY3JpcHRQb3NpdGlvbihzaGltUGF0aCwgbG9jYWxWYXJQb3NpdGlvbikgPz8gW10pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgU3ltYm9sS2luZC5JbnB1dDpcbiAgICAgICAgY2FzZSBTeW1ib2xLaW5kLk91dHB1dDoge1xuICAgICAgICAgIC8vIFRPRE8oYXRzY290dCk6IERldGVybWluZSBob3cgdG8gaGFuZGxlIHdoZW4gdGhlIGJpbmRpbmcgbWFwcyB0byBzZXZlcmFsIGlucHV0cy9vdXRwdXRzXG4gICAgICAgICAgY29uc3Qge3NoaW1QYXRoLCBwb3NpdGlvbkluU2hpbUZpbGV9ID0gc3ltYm9sLmJpbmRpbmdzWzBdLnNoaW1Mb2NhdGlvbjtcbiAgICAgICAgICByZWZlcmVuY2VzLnB1c2goXG4gICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UmVmZXJlbmNlc0F0VHlwZXNjcmlwdFBvc2l0aW9uKHNoaW1QYXRoLCBwb3NpdGlvbkluU2hpbUZpbGUpID8/IFtdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFN5bWJvbEtpbmQuUGlwZTpcbiAgICAgICAgY2FzZSBTeW1ib2xLaW5kLkV4cHJlc3Npb246IHtcbiAgICAgICAgICBjb25zdCB7c2hpbVBhdGgsIHBvc2l0aW9uSW5TaGltRmlsZX0gPSBzeW1ib2wuc2hpbUxvY2F0aW9uO1xuICAgICAgICAgIHJlZmVyZW5jZXMucHVzaChcbiAgICAgICAgICAgICAgLi4udGhpcy5nZXRSZWZlcmVuY2VzQXRUeXBlc2NyaXB0UG9zaXRpb24oc2hpbVBhdGgsIHBvc2l0aW9uSW5TaGltRmlsZSkgPz8gW10pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVmZXJlbmNlc0ZvckRpcmVjdGl2ZXMoZGlyZWN0aXZlczogU2V0PERpcmVjdGl2ZVN5bWJvbD4pOlxuICAgICAgdHMuUmVmZXJlbmNlRW50cnlbXXx1bmRlZmluZWQge1xuICAgIGNvbnN0IGFsbERpcmVjdGl2ZVJlZnM6IHRzLlJlZmVyZW5jZUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRpciBvZiBkaXJlY3RpdmVzLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCBkaXJDbGFzcyA9IGRpci50c1N5bWJvbC52YWx1ZURlY2xhcmF0aW9uO1xuICAgICAgaWYgKGRpckNsYXNzID09PSB1bmRlZmluZWQgfHwgIXRzLmlzQ2xhc3NEZWNsYXJhdGlvbihkaXJDbGFzcykgfHxcbiAgICAgICAgICBkaXJDbGFzcy5uYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpckZpbGUgPSBkaXJDbGFzcy5nZXRTb3VyY2VGaWxlKCkuZmlsZU5hbWU7XG4gICAgICBjb25zdCBkaXJQb3NpdGlvbiA9IGRpckNsYXNzLm5hbWUuZ2V0U3RhcnQoKTtcbiAgICAgIGNvbnN0IGRpcmVjdGl2ZVJlZnMgPSB0aGlzLmdldFJlZmVyZW5jZXNBdFR5cGVzY3JpcHRQb3NpdGlvbihkaXJGaWxlLCBkaXJQb3NpdGlvbik7XG4gICAgICBpZiAoZGlyZWN0aXZlUmVmcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFsbERpcmVjdGl2ZVJlZnMucHVzaCguLi5kaXJlY3RpdmVSZWZzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsRGlyZWN0aXZlUmVmcy5sZW5ndGggPiAwID8gYWxsRGlyZWN0aXZlUmVmcyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVmZXJlbmNlc0F0VHlwZXNjcmlwdFBvc2l0aW9uKGZpbGVOYW1lOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpOlxuICAgICAgdHMuUmVmZXJlbmNlRW50cnlbXXx1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZnMgPSB0aGlzLnRzTFMuZ2V0UmVmZXJlbmNlc0F0UG9zaXRpb24oZmlsZU5hbWUsIHBvc2l0aW9uKTtcbiAgICBpZiAocmVmcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJpZXM6IHRzLlJlZmVyZW5jZUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJlZiBvZiByZWZzKSB7XG4gICAgICBpZiAodGhpcy50dGMuaXNUcmFja2VkVHlwZUNoZWNrRmlsZShhYnNvbHV0ZUZyb20ocmVmLmZpbGVOYW1lKSkpIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmNvbnZlcnRUb1RlbXBsYXRlUmVmZXJlbmNlRW50cnkocmVmLCB0aGlzLnR0Yyk7XG4gICAgICAgIGlmIChlbnRyeSAhPT0gbnVsbCkge1xuICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudHJpZXMucHVzaChyZWYpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZW50cmllcztcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRvVGVtcGxhdGVSZWZlcmVuY2VFbnRyeShcbiAgICAgIHNoaW1SZWZlcmVuY2VFbnRyeTogdHMuUmVmZXJlbmNlRW50cnksXG4gICAgICB0ZW1wbGF0ZVR5cGVDaGVja2VyOiBUZW1wbGF0ZVR5cGVDaGVja2VyKTogdHMuUmVmZXJlbmNlRW50cnl8bnVsbCB7XG4gICAgY29uc3Qgc2YgPSB0aGlzLnN0cmF0ZWd5LmdldFByb2dyYW0oKS5nZXRTb3VyY2VGaWxlKHNoaW1SZWZlcmVuY2VFbnRyeS5maWxlTmFtZSk7XG4gICAgaWYgKHNmID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB0Y2JOb2RlID0gZmluZFRpZ2h0ZXN0Tm9kZShzZiwgc2hpbVJlZmVyZW5jZUVudHJ5LnRleHRTcGFuLnN0YXJ0KTtcbiAgICBpZiAodGNiTm9kZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIGhhc0V4cHJlc3Npb25JZGVudGlmaWVyKHNmLCB0Y2JOb2RlLCBFeHByZXNzaW9uSWRlbnRpZmllci5FVkVOVF9QQVJBTUVURVIpKSB7XG4gICAgICAvLyBJZiB0aGUgcmVmZXJlbmNlIHJlc3VsdCBpcyB0aGUgJGV2ZW50IHBhcmFtZXRlciBpbiB0aGUgc3Vic2NyaWJlL2FkZEV2ZW50TGlzdGVuZXIgZnVuY3Rpb25cbiAgICAgIC8vIGluIHRoZSBUQ0IsIHdlIHdhbnQgdG8gZmlsdGVyIHRoaXMgcmVzdWx0IG91dCBvZiB0aGUgcmVmZXJlbmNlcy4gV2UgcmVhbGx5IG9ubHkgd2FudCB0b1xuICAgICAgLy8gcmV0dXJuIHJlZmVyZW5jZXMgdG8gdGhlIHBhcmFtZXRlciBpbiB0aGUgdGVtcGxhdGUgaXRzZWxmLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFRPRE8oYXRzY290dCk6IERldGVybWluZSBob3cgdG8gY29uc2lzdGVudGx5IHJlc29sdmUgcGF0aHMuIGkuZS4gd2l0aCB0aGUgcHJvamVjdFxuICAgIC8vIHNlcnZlckhvc3Qgb3IgTFNQYXJzZUNvbmZpZ0hvc3QgaW4gdGhlIGFkYXB0ZXIuIFdlIHNob3VsZCBoYXZlIGEgYmV0dGVyIGRlZmluZWQgd2F5IHRvXG4gICAgLy8gbm9ybWFsaXplIHBhdGhzLlxuICAgIGNvbnN0IG1hcHBpbmcgPSBnZXRUZW1wbGF0ZUxvY2F0aW9uRnJvbVNoaW1Mb2NhdGlvbihcbiAgICAgICAgdGVtcGxhdGVUeXBlQ2hlY2tlciwgYWJzb2x1dGVGcm9tKHNoaW1SZWZlcmVuY2VFbnRyeS5maWxlTmFtZSksXG4gICAgICAgIHNoaW1SZWZlcmVuY2VFbnRyeS50ZXh0U3Bhbi5zdGFydCk7XG4gICAgaWYgKG1hcHBpbmcgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHtzcGFuLCB0ZW1wbGF0ZVVybH0gPSBtYXBwaW5nO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zaGltUmVmZXJlbmNlRW50cnksXG4gICAgICBmaWxlTmFtZTogdGVtcGxhdGVVcmwsXG4gICAgICB0ZXh0U3BhbjogdG9UZXh0U3BhbihzcGFuKSxcbiAgICB9O1xuICB9XG59XG4iXX0=
467
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2xhbmd1YWdlLXNlcnZpY2UvaXZ5L3JlZmVyZW5jZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztJQUFBOzs7Ozs7T0FNRztJQUNILDhDQUFxUztJQUVyUywyRUFBaUg7SUFDakgscUVBQTBKO0lBQzFKLG1GQUFxSDtJQUNySCwrQkFBaUM7SUFFakMsaUZBQXNFO0lBQ3RFLG1FQUE0QztJQUM1Qyw2REFBOEw7SUFPOUwsU0FBUyxjQUFjLENBQUMsWUFBMEI7UUFDaEQsT0FBTyxFQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsa0JBQWtCLEVBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQsSUFBSyxXQUdKO0lBSEQsV0FBSyxXQUFXO1FBQ2QscURBQVEsQ0FBQTtRQUNSLHlEQUFVLENBQUE7SUFDWixDQUFDLEVBSEksV0FBVyxLQUFYLFdBQVcsUUFHZjtJQTZCRDtRQUdFLG9DQUNxQixRQUFxQyxFQUNyQyxJQUF3QixFQUFtQixRQUFvQjtZQUQvRCxhQUFRLEdBQVIsUUFBUSxDQUE2QjtZQUNyQyxTQUFJLEdBQUosSUFBSSxDQUFvQjtZQUFtQixhQUFRLEdBQVIsUUFBUSxDQUFZO1lBSm5FLFFBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFJeUIsQ0FBQztRQUV4RixrREFBYSxHQUFiLFVBQWMsUUFBZ0IsRUFBRSxRQUFnQjtZQUU5QyxJQUFNLFlBQVksR0FBRyxpQ0FBeUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRix5RkFBeUY7WUFDekYsWUFBWTtZQUNaLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtnQkFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDcEQ7WUFFRCxJQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDekYsSUFBSSxnQkFBZ0IsS0FBSyxJQUFJLEVBQUU7Z0JBQzdCLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLDJDQUEyQyxFQUFDLENBQUM7YUFDL0Y7WUFDTSxJQUFBLGNBQWMsR0FBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsZUFBdkIsQ0FBd0I7WUFDN0MsSUFBTSxtQkFBbUIsR0FBRyw4QkFBOEIsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDckYsSUFBSSxtQkFBbUIsS0FBSyxJQUFJLEVBQUU7Z0JBQ2hDLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLHlDQUF5QyxFQUFDLENBQUM7YUFDN0Y7WUFDTSxJQUFBLElBQUksR0FBVSxtQkFBbUIsS0FBN0IsRUFBRSxJQUFJLEdBQUksbUJBQW1CLEtBQXZCLENBQXdCO1lBQ3pDLE9BQU87Z0JBQ0wsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsV0FBVyxFQUFFLElBQUk7Z0JBQ2pCLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixXQUFXLEVBQUUsSUFBSTthQUNsQixDQUFDO1FBQ0osQ0FBQztRQUVELHdEQUFtQixHQUFuQixVQUFvQixRQUFnQixFQUFFLFFBQWdCO1lBQ3BELElBQUksQ0FBQyxHQUFHLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUN0QyxJQUFNLFlBQVksR0FBRyxpQ0FBeUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRix5RkFBeUY7WUFDekYsWUFBWTtZQUNaLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtnQkFDOUIsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDakUsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFO29CQUN4QixPQUFPLFNBQVMsQ0FBQztpQkFDbEI7Z0JBQ0QsSUFBTSxhQUFhLEdBQXNCLEVBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxVQUFVLEVBQUUsV0FBVyxhQUFBLEVBQUMsQ0FBQztnQkFDckYsT0FBTyxJQUFJLENBQUMsdUNBQXVDLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQzthQUN4RjtZQUVELE9BQU8sSUFBSSxDQUFDLHFDQUFxQyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBRU8sMEVBQXFDLEdBQTdDLFVBQThDLFlBQTBCLEVBQUUsUUFBZ0I7O1lBRXhGLElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN6RixJQUFJLGdCQUFnQixLQUFLLElBQUksRUFBRTtnQkFDN0IsT0FBTyxTQUFTLENBQUM7YUFDbEI7WUFFRCxJQUFNLGtCQUFrQixHQUF3QixFQUFFLENBQUM7O2dCQUNuRCxLQUE0QixJQUFBLHFCQUFBLGlCQUFBLGdCQUFnQixDQUFBLGtEQUFBLGdGQUFFO29CQUF6QyxJQUFNLGFBQWEsNkJBQUE7b0JBQ3RCLElBQU0sYUFBYSxHQUFvQjt3QkFDckMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxRQUFRO3dCQUMxQixXQUFXLEVBQUUsYUFBYSxDQUFDLGNBQWM7d0JBQ3pDLFFBQVEsVUFBQTtxQkFDVCxDQUFDOzt3QkFFRixLQUF1QixJQUFBLG9CQUFBLGlCQUFBLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQSxDQUFBLGdCQUFBLDRCQUFFOzRCQUFyRCxJQUFNLFVBQVEsV0FBQTs0QkFDakIsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHVDQUF1QyxDQUMxRCxVQUFRLENBQUMsUUFBUSxFQUFFLFVBQVEsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7NEJBQ3pELHlGQUF5Rjs0QkFDekYseURBQXlEOzRCQUN6RCxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7Z0NBQzNCLE9BQU8sU0FBUyxDQUFDOzZCQUNsQjs0QkFDRCxrQkFBa0IsQ0FBQyxJQUFJLE9BQXZCLGtCQUFrQixtQkFBUyxTQUFTLEdBQUU7eUJBQ3ZDOzs7Ozs7Ozs7aUJBQ0Y7Ozs7Ozs7OztZQUNELE9BQU8sa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN4RSxDQUFDO1FBRU8sd0RBQW1CLEdBQTNCLFVBQTRCLFFBQWdCLEVBQUUsUUFBZ0I7O1lBQzVELElBQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ1AsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELGFBQU8sMkJBQWdCLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxtQ0FBSSxJQUFJLENBQUM7UUFDaEQsQ0FBQztRQUVELDRFQUF1QyxHQUF2QyxVQUNJLFFBQWdCLEVBQUUsUUFBZ0IsRUFDbEMsYUFBNEI7O1lBQzlCLElBQUksZ0JBQXdCLENBQUM7WUFDN0IsSUFBSSxhQUFhLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxVQUFVLEVBQUU7Z0JBQ2pELGdCQUFnQixHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDeEQ7aUJBQU07Z0JBQ0wsSUFBTSxnQkFBZ0IsR0FDbEIsOEJBQThCLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3RGLElBQUksZ0JBQWdCLEtBQUssSUFBSSxFQUFFO29CQUM3QixPQUFPLFNBQVMsQ0FBQztpQkFDbEI7Z0JBQ0QsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO2FBQzFDO1lBRUQsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FDM0MsUUFBUSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0UsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO2dCQUMzQixPQUFPLFNBQVMsQ0FBQzthQUNsQjtZQUVELElBQU0sT0FBTyxHQUFtQyxJQUFJLEdBQUcsRUFBRSxDQUFDOztnQkFDMUQsS0FBdUIsSUFBQSxjQUFBLGlCQUFBLFNBQVMsQ0FBQSxvQ0FBQSwyREFBRTtvQkFBN0IsSUFBTSxVQUFRLHNCQUFBO29CQUNqQiwwRkFBMEY7b0JBQzFGLHdDQUF3QztvQkFDeEMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLDBCQUFZLENBQUMsVUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7d0JBQ3BFLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxVQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO3dCQUN2RixvRkFBb0Y7d0JBQ3BGLGdFQUFnRTt3QkFDaEUsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFOzRCQUNsQixPQUFPLFNBQVMsQ0FBQzt5QkFDbEI7d0JBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztxQkFDOUM7eUJBQU07d0JBQ0wsK0RBQStEO3dCQUMvRCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBUSxDQUFDLFFBQVEsRUFBRSxVQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNyRixJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLGdCQUFnQixFQUFFOzRCQUM5RCxPQUFPLFNBQVMsQ0FBQzt5QkFDbEI7d0JBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFRLENBQUMsRUFBRSxVQUFRLENBQUMsQ0FBQztxQkFDcEQ7aUJBQ0Y7Ozs7Ozs7OztZQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsNERBQXVCLEdBQXZCLFVBQXdCLFFBQWdCLEVBQUUsUUFBZ0I7WUFDeEQsSUFBSSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3RDLElBQU0sWUFBWSxHQUFHLGlDQUF5QixDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xGLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtnQkFDOUIsT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ25FO1lBQ0QsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFTyxvRUFBK0IsR0FBdkMsVUFBd0MsWUFBMEIsRUFBRSxRQUFnQjs7WUFFbEYsSUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0NBQWtDLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3pGLElBQUksZ0JBQWdCLEtBQUssSUFBSSxFQUFFO2dCQUM3QixPQUFPLFNBQVMsQ0FBQzthQUNsQjtZQUNELElBQU0sYUFBYSxHQUF3QixFQUFFLENBQUM7O2dCQUM5QyxLQUE0QixJQUFBLHFCQUFBLGlCQUFBLGdCQUFnQixDQUFBLGtEQUFBLGdGQUFFO29CQUF6QyxJQUFNLGFBQWEsNkJBQUE7O3dCQUN0QixLQUF1QixJQUFBLG9CQUFBLGlCQUFBLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQSxDQUFBLGdCQUFBLDRCQUFFOzRCQUFyRCxJQUFNLFVBQVEsV0FBQTs0QkFDakIsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLFVBQVEsQ0FBQyxRQUFRLEVBQUUsVUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUMxRixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7Z0NBQ3RCLGFBQWEsQ0FBQyxJQUFJLE9BQWxCLGFBQWEsbUJBQVMsSUFBSSxHQUFFOzZCQUM3Qjt5QkFDRjs7Ozs7Ozs7O2lCQUNGOzs7Ozs7Ozs7WUFDRCxPQUFPLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM5RCxDQUFDO1FBRU8sdUVBQWtDLEdBQTFDLFVBQTJDLEVBQW1DLEVBQUUsUUFBZ0I7O2dCQUFwRCxRQUFRLGNBQUEsRUFBRSxTQUFTLGVBQUE7WUFFN0QscURBQXFEO1lBQ3JELElBQU0sZUFBZSxHQUFHLHFDQUFtQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNoRSxJQUFJLGVBQWUsS0FBSyxJQUFJLEVBQUU7Z0JBQzVCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFRCxJQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxnQ0FBYyxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQ2hGLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVuQyxJQUFNLE9BQU8sR0FBOEIsRUFBRSxDQUFDOztnQkFFOUMsS0FBbUIsSUFBQSxVQUFBLGlCQUFBLEtBQUssQ0FBQSw0QkFBQSwrQ0FBRTtvQkFBckIsSUFBTSxJQUFJLGtCQUFBO29CQUNiLDhEQUE4RDtvQkFDOUQsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUN6RCxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7d0JBQ25CLFNBQVM7cUJBQ1Y7b0JBRUQsSUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUM1QixRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUU7d0JBQ25CLEtBQUssZ0JBQVUsQ0FBQyxTQUFTLENBQUM7d0JBQzFCLEtBQUssZ0JBQVUsQ0FBQyxRQUFROzRCQUN0Qix3RkFBd0Y7NEJBQ3hGLG9GQUFvRjs0QkFDcEYsTUFBTTt3QkFDUixLQUFLLGdCQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQ3ZCLElBQU0sT0FBTyxHQUFHLHdDQUFnQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzRCQUN6RixPQUFPLENBQUMsSUFBSSxDQUNSLEVBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxFQUFFLGNBQWMsZ0JBQUEsRUFBQyxDQUFDLENBQUM7NEJBQ3BGLE1BQU07eUJBQ1A7d0JBQ0QsS0FBSyxnQkFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzRCQUMxQiwwRkFBMEY7NEJBQzFGLGdGQUFnRjs0QkFDaEYsZ0VBQWdFOzRCQUNoRSxJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksK0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLGdDQUFxQixDQUFDLEVBQUU7Z0NBQ3ZGLE9BQU8sSUFBSSxDQUFDOzZCQUNiOzRCQUNELElBQU0sVUFBVSxHQUFHLHVDQUErQixDQUM5QyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7NEJBQ2pFLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0NBQ1gsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQztnQ0FDL0QsY0FBYyxnQkFBQTs2QkFDZixDQUFDLENBQUM7NEJBQ0gsTUFBTTt5QkFDUDt3QkFDRCxLQUFLLGdCQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7NEJBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0NBQ1gsbUJBQW1CLEVBQUUsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0NBQ2xFLGNBQWMsZ0JBQUE7NkJBQ2YsQ0FBQyxDQUFDOzRCQUNILE1BQU07eUJBQ1A7d0JBQ0QsS0FBSyxnQkFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUN4QixJQUFJLENBQUMsY0FBYyxZQUFZLDBCQUFlLENBQUMsRUFBRTtnQ0FDL0MsSUFBSSxjQUFjLENBQUMsU0FBUyxLQUFLLFNBQVM7b0NBQ3RDLGdCQUFRLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRTtvQ0FDaEQscUZBQXFGO29DQUNyRixPQUFPLENBQUMsSUFBSSxDQUFDO3dDQUNYLG1CQUFtQixFQUFFLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO3dDQUNqRSxjQUFjLGdCQUFBO3FDQUNmLENBQUMsQ0FBQztpQ0FDSjtxQ0FBTSxJQUFJLGdCQUFRLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQ0FDckQsc0ZBQXNGO29DQUN0RixPQUFPLENBQUMsSUFBSSxDQUFDO3dDQUNYLG1CQUFtQixFQUFFLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO3dDQUM5RCxjQUFjLGdCQUFBO3FDQUNmLENBQUMsQ0FBQztpQ0FDSjs2QkFDRjtpQ0FBTTtnQ0FDTCw4RUFBOEU7Z0NBQzlFLHNDQUFzQztnQ0FDdEMsT0FBTyxDQUFDLElBQUksQ0FBQztvQ0FDWCxtQkFBbUIsRUFBRSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQ0FDOUQsY0FBYyxnQkFBQTtpQ0FDZixDQUFDLENBQUM7NkJBQ0o7NEJBQ0QsTUFBTTt5QkFDUDt3QkFDRCxLQUFLLGdCQUFVLENBQUMsS0FBSyxDQUFDO3dCQUN0QixLQUFLLGdCQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0NBQ1gsbUJBQW1CLEVBQ2YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQSxPQUFPLElBQUksT0FBQSxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFwQyxDQUFvQyxDQUFDO2dDQUN4RSxjQUFjLGdCQUFBOzZCQUNmLENBQUMsQ0FBQzs0QkFDSCxNQUFNO3lCQUNQO3dCQUNELEtBQUssZ0JBQVUsQ0FBQyxJQUFJLENBQUM7d0JBQ3JCLEtBQUssZ0JBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQzs0QkFDMUIsT0FBTyxDQUFDLElBQUksQ0FDUixFQUFDLG1CQUFtQixFQUFFLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLGNBQWMsZ0JBQUEsRUFBQyxDQUFDLENBQUM7NEJBQ2xGLE1BQU07eUJBQ1A7cUJBQ0Y7aUJBQ0Y7Ozs7Ozs7OztZQUVELE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzdDLENBQUM7UUFFTyw4REFBeUIsR0FBakMsVUFBa0MsVUFBZ0M7O1lBQ2hFLElBQU0sYUFBYSxHQUFtQixFQUFFLENBQUM7O2dCQUN6QyxLQUFrQixJQUFBLEtBQUEsaUJBQUEsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFBLGdCQUFBLDRCQUFFO29CQUFsQyxJQUFNLEdBQUcsV0FBQTtvQkFDWixJQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO29CQUMvQyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDO3dCQUMxRCxRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTt3QkFDL0IsU0FBUztxQkFDVjtvQkFFTSxJQUFBLFFBQVEsR0FBSSxRQUFRLENBQUMsYUFBYSxFQUFFLFNBQTVCLENBQTZCO29CQUM1QyxJQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUMxQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxVQUFBLEVBQUUsUUFBUSxVQUFBLEVBQUMsQ0FBQyxDQUFDO2lCQUMxQzs7Ozs7Ozs7O1lBRUQsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVPLHNFQUFpQyxHQUF6QyxVQUEwQyxRQUFnQixFQUFFLFFBQWdCOztZQUUxRSxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNuRSxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7Z0JBQ3RCLE9BQU8sU0FBUyxDQUFDO2FBQ2xCO1lBRUQsSUFBTSxPQUFPLEdBQW1DLElBQUksR0FBRyxFQUFFLENBQUM7O2dCQUMxRCxLQUFrQixJQUFBLFNBQUEsaUJBQUEsSUFBSSxDQUFBLDBCQUFBLDRDQUFFO29CQUFuQixJQUFNLEdBQUcsaUJBQUE7b0JBQ1osSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLDBCQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7d0JBQy9ELElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNoRSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7NEJBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7eUJBQzlDO3FCQUNGO3lCQUFNO3dCQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7cUJBQzFDO2lCQUNGOzs7Ozs7Ozs7WUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVPLGtFQUE2QixHQUFyQyxVQUNJLGdCQUFtQixFQUFFLG1CQUF3QyxFQUFFLGdCQUF5QjtZQUUxRixJQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvRSxJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUU7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxJQUFNLE9BQU8sR0FBRywyQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RFLElBQUksT0FBTyxLQUFLLFNBQVM7Z0JBQ3JCLGtDQUF1QixDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsK0JBQW9CLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0JBQzlFLG9GQUFvRjtnQkFDcEYsMkZBQTJGO2dCQUMzRixxRUFBcUU7Z0JBQ3JFLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxvRkFBb0Y7WUFDcEYseUZBQXlGO1lBQ3pGLG1CQUFtQjtZQUNuQixJQUFNLE9BQU8sR0FBRywyQ0FBbUMsQ0FDL0MsbUJBQW1CLEVBQUUsMEJBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFDNUQsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtnQkFDcEIsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUVNLElBQUEsSUFBSSxHQUFpQixPQUFPLEtBQXhCLEVBQUUsV0FBVyxHQUFJLE9BQU8sWUFBWCxDQUFZO1lBQ3BDLElBQUksZ0JBQWdCLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxnQkFBZ0IsRUFBRTtnQkFDMUUsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUVELDZDQUNLLGdCQUFnQixLQUNuQixRQUFRLEVBQUUsV0FBVyxFQUNyQixRQUFRLEVBQUUsa0JBQVUsQ0FBQyxJQUFJLENBQUMsSUFDMUI7UUFDSixDQUFDO1FBQ0gsaUNBQUM7SUFBRCxDQUFDLEFBalZELElBaVZDO0lBalZZLGdFQUEwQjtJQW1WdkMsU0FBUyw4QkFBOEIsQ0FDbkMsSUFBcUIsRUFBRSxRQUFnQjtRQUN6QyxJQUFJLElBQUksWUFBWSxnQ0FBcUIsSUFBSSxJQUFJLFlBQVksK0JBQW9CO1lBQzdFLElBQUksWUFBWSw0QkFBaUIsRUFBRTtZQUNyQyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO2dCQUM5QixPQUFPLElBQUksQ0FBQzthQUNiO1lBQ0QsT0FBTyxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxrQkFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDO1NBQzFEO2FBQU0sSUFBSSxJQUFJLFlBQVksMEJBQWUsSUFBSSxJQUFJLFlBQVksMkJBQWdCLEVBQUU7WUFDOUUsSUFBSSxnQkFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3BDLE9BQU8sRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQzthQUN4RTtpQkFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksZ0JBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUMvRCxPQUFPLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLGtCQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUM7YUFDNUU7U0FDRjtRQUVELElBQUksSUFBSSxZQUFZLHNCQUFXLEVBQUU7WUFDL0IsZ0RBQWdEO1lBQ2hELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFJLElBQUksWUFBWSx1QkFBWSxJQUFJLElBQUksWUFBWSxxQkFBVSxJQUFJLElBQUksWUFBWSx3QkFBYTtZQUMzRixJQUFJLFlBQVksMkJBQWdCLElBQUksSUFBSSxZQUFZLHlCQUFjLEVBQUU7WUFDdEUsT0FBTyxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxrQkFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxDQUFDO1NBQzNEO2FBQU0sSUFBSSxJQUFJLFlBQVksMkJBQWdCLEVBQUU7WUFDM0MsSUFBTSxJQUFJLEdBQUcsa0JBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekMsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN4QixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDNUIsNEZBQTRGO2dCQUM1RixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7YUFDbEI7WUFDRCxPQUFPLEVBQUMsSUFBSSxNQUFBLEVBQUUsSUFBSSxNQUFBLEVBQUMsQ0FBQztTQUNyQjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUdEOzs7O09BSUc7SUFDSCxTQUFTLGlCQUFpQixDQUFDLEVBQW1CO1FBQzVDLE9BQU8sRUFBRSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztJQUM5RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQge0Fic29sdXRlU291cmNlU3BhbiwgQVNULCBCaW5kaW5nUGlwZSwgTGl0ZXJhbFByaW1pdGl2ZSwgTWV0aG9kQ2FsbCwgUGFyc2VTb3VyY2VTcGFuLCBQcm9wZXJ0eVJlYWQsIFByb3BlcnR5V3JpdGUsIFNhZmVNZXRob2RDYWxsLCBTYWZlUHJvcGVydHlSZWFkLCBUbXBsQXN0Qm91bmRBdHRyaWJ1dGUsIFRtcGxBc3RCb3VuZEV2ZW50LCBUbXBsQXN0Tm9kZSwgVG1wbEFzdFJlZmVyZW5jZSwgVG1wbEFzdFRleHRBdHRyaWJ1dGUsIFRtcGxBc3RWYXJpYWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0IHtOZ0NvbXBpbGVyfSBmcm9tICdAYW5ndWxhci9jb21waWxlci1jbGkvc3JjL25ndHNjL2NvcmUnO1xuaW1wb3J0IHthYnNvbHV0ZUZyb20sIGFic29sdXRlRnJvbVNvdXJjZUZpbGUsIEFic29sdXRlRnNQYXRofSBmcm9tICdAYW5ndWxhci9jb21waWxlci1jbGkvc3JjL25ndHNjL2ZpbGVfc3lzdGVtJztcbmltcG9ydCB7RGlyZWN0aXZlU3ltYm9sLCBTaGltTG9jYXRpb24sIFN5bWJvbEtpbmQsIFRlbXBsYXRlVHlwZUNoZWNrZXIsIFR5cGVDaGVja2luZ1Byb2dyYW1TdHJhdGVneX0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXItY2xpL3NyYy9uZ3RzYy90eXBlY2hlY2svYXBpJztcbmltcG9ydCB7RXhwcmVzc2lvbklkZW50aWZpZXIsIGhhc0V4cHJlc3Npb25JZGVudGlmaWVyfSBmcm9tICdAYW5ndWxhci9jb21waWxlci1jbGkvc3JjL25ndHNjL3R5cGVjaGVjay9zcmMvY29tbWVudHMnO1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7Z2V0VGFyZ2V0QXRQb3NpdGlvbiwgVGFyZ2V0Tm9kZUtpbmR9IGZyb20gJy4vdGVtcGxhdGVfdGFyZ2V0JztcbmltcG9ydCB7ZmluZFRpZ2h0ZXN0Tm9kZX0gZnJvbSAnLi90c191dGlscyc7XG5pbXBvcnQge2dldERpcmVjdGl2ZU1hdGNoZXNGb3JBdHRyaWJ1dGUsIGdldERpcmVjdGl2ZU1hdGNoZXNGb3JFbGVtZW50VGFnLCBnZXRUZW1wbGF0ZUluZm9BdFBvc2l0aW9uLCBnZXRUZW1wbGF0ZUxvY2F0aW9uRnJvbVNoaW1Mb2NhdGlvbiwgaXNXaXRoaW4sIFRlbXBsYXRlSW5mbywgdG9UZXh0U3Bhbn0gZnJvbSAnLi91dGlscyc7XG5cbmludGVyZmFjZSBGaWxlUG9zaXRpb24ge1xuICBmaWxlTmFtZTogc3RyaW5nO1xuICBwb3NpdGlvbjogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiB0b0ZpbGVQb3NpdGlvbihzaGltTG9jYXRpb246IFNoaW1Mb2NhdGlvbik6IEZpbGVQb3NpdGlvbiB7XG4gIHJldHVybiB7ZmlsZU5hbWU6IHNoaW1Mb2NhdGlvbi5zaGltUGF0aCwgcG9zaXRpb246IHNoaW1Mb2NhdGlvbi5wb3NpdGlvbkluU2hpbUZpbGV9O1xufVxuXG5lbnVtIFJlcXVlc3RLaW5kIHtcbiAgVGVtcGxhdGUsXG4gIFR5cGVTY3JpcHQsXG59XG5cbmludGVyZmFjZSBUZW1wbGF0ZVJlcXVlc3Qge1xuICBraW5kOiBSZXF1ZXN0S2luZC5UZW1wbGF0ZTtcbiAgcmVxdWVzdE5vZGU6IFRtcGxBc3ROb2RlfEFTVDtcbiAgcG9zaXRpb246IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFR5cGVTY3JpcHRSZXF1ZXN0IHtcbiAga2luZDogUmVxdWVzdEtpbmQuVHlwZVNjcmlwdDtcbiAgcmVxdWVzdE5vZGU6IHRzLk5vZGU7XG59XG5cbnR5cGUgUmVxdWVzdE9yaWdpbiA9IFRlbXBsYXRlUmVxdWVzdHxUeXBlU2NyaXB0UmVxdWVzdDtcblxuaW50ZXJmYWNlIFRlbXBsYXRlTG9jYXRpb25EZXRhaWxzIHtcbiAgLyoqXG4gICAqIEEgdGFyZ2V0IG5vZGUgaW4gYSB0ZW1wbGF0ZS5cbiAgICovXG4gIHRlbXBsYXRlVGFyZ2V0OiBUbXBsQXN0Tm9kZXxBU1Q7XG5cbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgbG9jYXRpb25zIHdoaWNoIHRoZSB0ZW1wbGF0ZSBub2RlIG1hcHMgdG8uIEEgZ2l2ZW4gdGVtcGxhdGUgbm9kZSBtaWdodCBtYXAgdG9cbiAgICogc2V2ZXJhbCBUUyBub2Rlcy4gRm9yIGV4YW1wbGUsIGEgdGVtcGxhdGUgbm9kZSBmb3IgYW4gYXR0cmlidXRlIG1pZ2h0IHJlc29sdmUgdG8gc2V2ZXJhbFxuICAgKiBkaXJlY3RpdmVzIG9yIGEgZGlyZWN0aXZlIGFuZCBvbmUgb2YgaXRzIGlucHV0cy5cbiAgICovXG4gIHR5cGVzY3JpcHRMb2NhdGlvbnM6IEZpbGVQb3NpdGlvbltdO1xufVxuXG5leHBvcnQgY2xhc3MgUmVmZXJlbmNlc0FuZFJlbmFtZUJ1aWxkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHR0YyA9IHRoaXMuY29tcGlsZXIuZ2V0VGVtcGxhdGVUeXBlQ2hlY2tlcigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJhdGVneTogVHlwZUNoZWNraW5nUHJvZ3JhbVN0cmF0ZWd5LFxuICAgICAgcHJpdmF0ZSByZWFkb25seSB0c0xTOiB0cy5MYW5ndWFnZVNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgY29tcGlsZXI6IE5nQ29tcGlsZXIpIHt9XG5cbiAgZ2V0UmVuYW1lSW5mbyhmaWxlUGF0aDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTpcbiAgICAgIE9taXQ8dHMuUmVuYW1lSW5mb1N1Y2Nlc3MsICdraW5kJ3wna2luZE1vZGlmaWVycyc+fHRzLlJlbmFtZUluZm9GYWlsdXJlIHtcbiAgICBjb25zdCB0ZW1wbGF0ZUluZm8gPSBnZXRUZW1wbGF0ZUluZm9BdFBvc2l0aW9uKGZpbGVQYXRoLCBwb3NpdGlvbiwgdGhpcy5jb21waWxlcik7XG4gICAgLy8gV2UgY291bGQgbm90IGdldCBhIHRlbXBsYXRlIGF0IHBvc2l0aW9uIHNvIHdlIGFzc3VtZSB0aGUgcmVxdWVzdCBjYW1lIGZyb20gb3V0c2lkZSB0aGVcbiAgICAvLyB0ZW1wbGF0ZS5cbiAgICBpZiAodGVtcGxhdGVJbmZvID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRzTFMuZ2V0UmVuYW1lSW5mbyhmaWxlUGF0aCwgcG9zaXRpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFRhcmdldERldGFpbHMgPSB0aGlzLmdldFRhcmdldERldGFpbHNBdFRlbXBsYXRlUG9zaXRpb24odGVtcGxhdGVJbmZvLCBwb3NpdGlvbik7XG4gICAgaWYgKGFsbFRhcmdldERldGFpbHMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7Y2FuUmVuYW1lOiBmYWxzZSwgbG9jYWxpemVkRXJyb3JNZXNzYWdlOiAnQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgbm9kZSBhdCBwb3NpdGlvbi4nfTtcbiAgICB9XG4gICAgY29uc3Qge3RlbXBsYXRlVGFyZ2V0fSA9IGFsbFRhcmdldERldGFpbHNbMF07XG4gICAgY29uc3QgdGVtcGxhdGVUZXh0QW5kU3BhbiA9IGdldFJlbmFtZVRleHRBbmRTcGFuQXRQb3NpdGlvbih0ZW1wbGF0ZVRhcmdldCwgcG9zaXRpb24pO1xuICAgIGlmICh0ZW1wbGF0ZVRleHRBbmRTcGFuID09PSBudWxsKSB7XG4gICAgICByZXR1cm4ge2NhblJlbmFtZTogZmFsc2UsIGxvY2FsaXplZEVycm9yTWVzc2FnZTogJ0NvdWxkIG5vdCBkZXRlcm1pbmUgdGVtcGxhdGUgbm9kZSB0ZXh0Lid9O1xuICAgIH1cbiAgICBjb25zdCB7dGV4dCwgc3Bhbn0gPSB0ZW1wbGF0ZVRleHRBbmRTcGFuO1xuICAgIHJldHVybiB7XG4gICAgICBjYW5SZW5hbWU6IHRydWUsXG4gICAgICBkaXNwbGF5TmFtZTogdGV4dCxcbiAgICAgIGZ1bGxEaXNwbGF5TmFtZTogdGV4dCxcbiAgICAgIHRyaWdnZXJTcGFuOiBzcGFuLFxuICAgIH07XG4gIH1cblxuICBmaW5kUmVuYW1lTG9jYXRpb25zKGZpbGVQYXRoOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpOiByZWFkb25seSB0cy5SZW5hbWVMb2NhdGlvbltdfHVuZGVmaW5lZCB7XG4gICAgdGhpcy50dGMuZ2VuZXJhdGVBbGxUeXBlQ2hlY2tCbG9ja3MoKTtcbiAgICBjb25zdCB0ZW1wbGF0ZUluZm8gPSBnZXRUZW1wbGF0ZUluZm9BdFBvc2l0aW9uKGZpbGVQYXRoLCBwb3NpdGlvbiwgdGhpcy5jb21waWxlcik7XG4gICAgLy8gV2UgY291bGQgbm90IGdldCBhIHRlbXBsYXRlIGF0IHBvc2l0aW9uIHNvIHdlIGFzc3VtZSB0aGUgcmVxdWVzdCBjYW1lIGZyb20gb3V0c2lkZSB0aGVcbiAgICAvLyB0ZW1wbGF0ZS5cbiAgICBpZiAodGVtcGxhdGVJbmZvID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3ROb2RlID0gdGhpcy5nZXRUc05vZGVBdFBvc2l0aW9uKGZpbGVQYXRoLCBwb3NpdGlvbik7XG4gICAgICBpZiAocmVxdWVzdE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVlc3RPcmlnaW46IFR5cGVTY3JpcHRSZXF1ZXN0ID0ge2tpbmQ6IFJlcXVlc3RLaW5kLlR5cGVTY3JpcHQsIHJlcXVlc3ROb2RlfTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmRSZW5hbWVMb2NhdGlvbnNBdFR5cGVzY3JpcHRQb3NpdGlvbihmaWxlUGF0aCwgcG9zaXRpb24sIHJlcXVlc3RPcmlnaW4pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZpbmRSZW5hbWVMb2NhdGlvbnNBdFRlbXBsYXRlUG9zaXRpb24odGVtcGxhdGVJbmZvLCBwb3NpdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGZpbmRSZW5hbWVMb2NhdGlvbnNBdFRlbXBsYXRlUG9zaXRpb24odGVtcGxhdGVJbmZvOiBUZW1wbGF0ZUluZm8sIHBvc2l0aW9uOiBudW1iZXIpOlxuICAgICAgcmVhZG9ubHkgdHMuUmVuYW1lTG9jYXRpb25bXXx1bmRlZmluZWQge1xuICAgIGNvbnN0IGFsbFRhcmdldERldGFpbHMgPSB0aGlzLmdldFRhcmdldERldGFpbHNBdFRlbXBsYXRlUG9zaXRpb24odGVtcGxhdGVJbmZvLCBwb3NpdGlvbik7XG4gICAgaWYgKGFsbFRhcmdldERldGFpbHMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUmVuYW1lTG9jYXRpb25zOiB0cy5SZW5hbWVMb2NhdGlvbltdID0gW107XG4gICAgZm9yIChjb25zdCB0YXJnZXREZXRhaWxzIG9mIGFsbFRhcmdldERldGFpbHMpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RPcmlnaW46IFRlbXBsYXRlUmVxdWVzdCA9IHtcbiAgICAgICAga2luZDogUmVxdWVzdEtpbmQuVGVtcGxhdGUsXG4gICAgICAgIHJlcXVlc3ROb2RlOiB0YXJnZXREZXRhaWxzLnRlbXBsYXRlVGFyZ2V0LFxuICAgICAgICBwb3NpdGlvbixcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgbG9jYXRpb24gb2YgdGFyZ2V0RGV0YWlscy50eXBlc2NyaXB0TG9jYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9ucyA9IHRoaXMuZmluZFJlbmFtZUxvY2F0aW9uc0F0VHlwZXNjcmlwdFBvc2l0aW9uKFxuICAgICAgICAgICAgbG9jYXRpb24uZmlsZU5hbWUsIGxvY2F0aW9uLnBvc2l0aW9uLCByZXF1ZXN0T3JpZ2luKTtcbiAgICAgICAgLy8gSWYgd2UgY291bGRuJ3QgZmluZCByZW5hbWUgbG9jYXRpb25zIGZvciBfYW55XyByZXN1bHQsIHdlIHNob3VsZCBub3QgYWxsb3cgcmVuYW1pbmcgdG9cbiAgICAgICAgLy8gcHJvY2VlZCBpbnN0ZWFkIG9mIGhhdmluZyBhIHBhcnRpYWxseSBjb21wbGV0ZSByZW5hbWUuXG4gICAgICAgIGlmIChsb2NhdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYWxsUmVuYW1lTG9jYXRpb25zLnB1c2goLi4ubG9jYXRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFsbFJlbmFtZUxvY2F0aW9ucy5sZW5ndGggPiAwID8gYWxsUmVuYW1lTG9jYXRpb25zIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUc05vZGVBdFBvc2l0aW9uKGZpbGVQYXRoOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpOiB0cy5Ob2RlfG51bGwge1xuICAgIGNvbnN0IHNmID0gdGhpcy5zdHJhdGVneS5nZXRQcm9ncmFtKCkuZ2V0U291cmNlRmlsZShmaWxlUGF0aCk7XG4gICAgaWYgKCFzZikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaW5kVGlnaHRlc3ROb2RlKHNmLCBwb3NpdGlvbikgPz8gbnVsbDtcbiAgfVxuXG4gIGZpbmRSZW5hbWVMb2NhdGlvbnNBdFR5cGVzY3JpcHRQb3NpdGlvbihcbiAgICAgIGZpbGVQYXRoOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIsXG4gICAgICByZXF1ZXN0T3JpZ2luOiBSZXF1ZXN0T3JpZ2luKTogcmVhZG9ubHkgdHMuUmVuYW1lTG9jYXRpb25bXXx1bmRlZmluZWQge1xuICAgIGxldCBvcmlnaW5hbE5vZGVUZXh0OiBzdHJpbmc7XG4gICAgaWYgKHJlcXVlc3RPcmlnaW4ua2luZCA9PT0gUmVxdWVzdEtpbmQuVHlwZVNjcmlwdCkge1xuICAgICAgb3JpZ2luYWxOb2RlVGV4dCA9IHJlcXVlc3RPcmlnaW4ucmVxdWVzdE5vZGUuZ2V0VGV4dCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZU5vZGVUZXh0ID1cbiAgICAgICAgICBnZXRSZW5hbWVUZXh0QW5kU3BhbkF0UG9zaXRpb24ocmVxdWVzdE9yaWdpbi5yZXF1ZXN0Tm9kZSwgcmVxdWVzdE9yaWdpbi5wb3NpdGlvbik7XG4gICAgICBpZiAodGVtcGxhdGVOb2RlVGV4dCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxOb2RlVGV4dCA9IHRlbXBsYXRlTm9kZVRleHQudGV4dDtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NhdGlvbnMgPSB0aGlzLnRzTFMuZmluZFJlbmFtZUxvY2F0aW9ucyhcbiAgICAgICAgZmlsZVBhdGgsIHBvc2l0aW9uLCAvKmZpbmRJblN0cmluZ3MqLyBmYWxzZSwgLypmaW5kSW5Db21tZW50cyovIGZhbHNlKTtcbiAgICBpZiAobG9jYXRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZW50cmllczogTWFwPHN0cmluZywgdHMuUmVuYW1lTG9jYXRpb24+ID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgbG9jYXRpb24gb2YgbG9jYXRpb25zKSB7XG4gICAgICAvLyBUT0RPKGF0c2NvdHQpOiBEZXRlcm1pbmUgaWYgYSBmaWxlIGlzIGEgc2hpbSBmaWxlIGluIGEgbW9yZSByb2J1c3Qgd2F5IGFuZCBtYWtlIHRoZSBBUElcbiAgICAgIC8vIGF2YWlsYWJsZSBpbiBhbiBhcHByb3ByaWF0ZSBsb2NhdGlvbi5cbiAgICAgIGlmICh0aGlzLnR0Yy5pc1RyYWNrZWRUeXBlQ2hlY2tGaWxlKGFic29sdXRlRnJvbShsb2NhdGlvbi5maWxlTmFtZSkpKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jb252ZXJ0VG9UZW1wbGF0ZURvY3VtZW50U3Bhbihsb2NhdGlvbiwgdGhpcy50dGMsIG9yaWdpbmFsTm9kZVRleHQpO1xuICAgICAgICAvLyBUaGVyZSBpcyBubyB0ZW1wbGF0ZSBub2RlIHdob3NlIHRleHQgbWF0Y2hlcyB0aGUgb3JpZ2luYWwgcmVuYW1lIHJlcXVlc3QuIEJhaWwgb25cbiAgICAgICAgLy8gcmVuYW1pbmcgY29tcGxldGVseSByYXRoZXIgdGhhbiBwcm92aWRpbmcgaW5jb21wbGV0ZSByZXN1bHRzLlxuICAgICAgICBpZiAoZW50cnkgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVudHJpZXMuc2V0KGNyZWF0ZUxvY2F0aW9uS2V5KGVudHJ5KSwgZW50cnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRW5zdXJlIHdlIG9ubHkgYWxsb3cgcmVuYW1pbmcgYSBUUyByZXN1bHQgd2l0aCBtYXRjaGluZyB0ZXh0XG4gICAgICAgIGNvbnN0IHJlZk5vZGUgPSB0aGlzLmdldFRzTm9kZUF0UG9zaXRpb24obG9jYXRpb24uZmlsZU5hbWUsIGxvY2F0aW9uLnRleHRTcGFuLnN0YXJ0KTtcbiAgICAgICAgaWYgKHJlZk5vZGUgPT09IG51bGwgfHwgcmVmTm9kZS5nZXRUZXh0KCkgIT09IG9yaWdpbmFsTm9kZVRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVudHJpZXMuc2V0KGNyZWF0ZUxvY2F0aW9uS2V5KGxvY2F0aW9uKSwgbG9jYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbShlbnRyaWVzLnZhbHVlcygpKTtcbiAgfVxuXG4gIGdldFJlZmVyZW5jZXNBdFBvc2l0aW9uKGZpbGVQYXRoOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpOiB0cy5SZWZlcmVuY2VFbnRyeVtdfHVuZGVmaW5lZCB7XG4gICAgdGhpcy50dGMuZ2VuZXJhdGVBbGxUeXBlQ2hlY2tCbG9ja3MoKTtcbiAgICBjb25zdCB0ZW1wbGF0ZUluZm8gPSBnZXRUZW1wbGF0ZUluZm9BdFBvc2l0aW9uKGZpbGVQYXRoLCBwb3NpdGlvbiwgdGhpcy5jb21waWxlcik7XG4gICAgaWYgKHRlbXBsYXRlSW5mbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRSZWZlcmVuY2VzQXRUeXBlc2NyaXB0UG9zaXRpb24oZmlsZVBhdGgsIHBvc2l0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVmZXJlbmNlc0F0VGVtcGxhdGVQb3NpdGlvbih0ZW1wbGF0ZUluZm8sIHBvc2l0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVmZXJlbmNlc0F0VGVtcGxhdGVQb3NpdGlvbih0ZW1wbGF0ZUluZm86IFRlbXBsYXRlSW5mbywgcG9zaXRpb246IG51bWJlcik6XG4gICAgICB0cy5SZWZlcmVuY2VFbnRyeVtdfHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYWxsVGFyZ2V0RGV0YWlscyA9IHRoaXMuZ2V0VGFyZ2V0RGV0YWlsc0F0VGVtcGxhdGVQb3NpdGlvbih0ZW1wbGF0ZUluZm8sIHBvc2l0aW9uKTtcbiAgICBpZiAoYWxsVGFyZ2V0RGV0YWlscyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgYWxsUmVmZXJlbmNlczogdHMuUmVmZXJlbmNlRW50cnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdGFyZ2V0RGV0YWlscyBvZiBhbGxUYXJnZXREZXRhaWxzKSB7XG4gICAgICBmb3IgKGNvbnN0IGxvY2F0aW9uIG9mIHRhcmdldERldGFpbHMudHlwZXNjcmlwdExvY2F0aW9ucykge1xuICAgICAgICBjb25zdCByZWZzID0gdGhpcy5nZXRSZWZlcmVuY2VzQXRUeXBlc2NyaXB0UG9zaXRpb24obG9jYXRpb24uZmlsZU5hbWUsIGxvY2F0aW9uLnBvc2l0aW9uKTtcbiAgICAgICAgaWYgKHJlZnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFsbFJlZmVyZW5jZXMucHVzaCguLi5yZWZzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWxsUmVmZXJlbmNlcy5sZW5ndGggPiAwID8gYWxsUmVmZXJlbmNlcyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFyZ2V0RGV0YWlsc0F0VGVtcGxhdGVQb3NpdGlvbih7dGVtcGxhdGUsIGNvbXBvbmVudH06IFRlbXBsYXRlSW5mbywgcG9zaXRpb246IG51bWJlcik6XG4gICAgICBUZW1wbGF0ZUxvY2F0aW9uRGV0YWlsc1tdfG51bGwge1xuICAgIC8vIEZpbmQgdGhlIEFTVCBub2RlIGluIHRoZSB0ZW1wbGF0ZSBhdCB0aGUgcG9zaXRpb24uXG4gICAgY29uc3QgcG9zaXRpb25EZXRhaWxzID0gZ2V0VGFyZ2V0QXRQb3NpdGlvbih0ZW1wbGF0ZSwgcG9zaXRpb24pO1xuICAgIGlmIChwb3NpdGlvbkRldGFpbHMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gcG9zaXRpb25EZXRhaWxzLmNvbnRleHQua2luZCA9PT0gVGFyZ2V0Tm9kZUtpbmQuVHdvV2F5QmluZGluZ0NvbnRleHQgP1xuICAgICAgICBwb3NpdGlvbkRldGFpbHMuY29udGV4dC5ub2RlcyA6XG4gICAgICAgIFtwb3NpdGlvbkRldGFpbHMuY29udGV4dC5ub2RlXTtcblxuICAgIGNvbnN0IGRldGFpbHM6IFRlbXBsYXRlTG9jYXRpb25EZXRhaWxzW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgLy8gR2V0IHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgVENCIGF0IHRoZSB0ZW1wbGF0ZSBwb3NpdGlvbi5cbiAgICAgIGNvbnN0IHN5bWJvbCA9IHRoaXMudHRjLmdldFN5bWJvbE9mTm9kZShub2RlLCBjb21wb25lbnQpO1xuICAgICAgaWYgKHN5bWJvbCA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGVtcGxhdGVUYXJnZXQgPSBub2RlO1xuICAgICAgc3dpdGNoIChzeW1ib2wua2luZCkge1xuICAgICAgICBjYXNlIFN5bWJvbEtpbmQuRGlyZWN0aXZlOlxuICAgICAgICBjYXNlIFN5bWJvbEtpbmQuVGVtcGxhdGU6XG4gICAgICAgICAgLy8gUmVmZXJlbmNlcyB0byBlbGVtZW50cywgdGVtcGxhdGVzLCBhbmQgZGlyZWN0aXZlcyB3aWxsIGJlIHRocm91Z2ggdGVtcGxhdGUgcmVmZXJlbmNlc1xuICAgICAgICAgIC8vICgjcmVmKS4gVGhleSBzaG91bGRuJ3QgYmUgdXNlZCBkaXJlY3RseSBmb3IgYSBMYW5ndWFnZSBTZXJ2aWNlIHJlZmVyZW5jZSByZXF1ZXN0LlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bWJvbEtpbmQuRWxlbWVudDoge1xuICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXREaXJlY3RpdmVNYXRjaGVzRm9yRWxlbWVudFRhZyhzeW1ib2wudGVtcGxhdGVOb2RlLCBzeW1ib2wuZGlyZWN0aXZlcyk7XG4gICAgICAgICAgZGV0YWlscy5wdXNoKFxuICAgICAgICAgICAgICB7dHlwZXNjcmlwdExvY2F0aW9uczogdGhpcy5nZXRQb3NpdGlvbnNGb3JEaXJlY3RpdmVzKG1hdGNoZXMpLCB0ZW1wbGF0ZVRhcmdldH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgU3ltYm9sS2luZC5Eb21CaW5kaW5nOiB7XG4gICAgICAgICAgLy8gRG9tIGJpbmRpbmdzIGFyZW4ndCBjdXJyZW50bHkgdHlwZS1jaGVja2VkIChzZWUgYGNoZWNrVHlwZU9mRG9tQmluZGluZ3NgKSBzbyB0aGV5IGRvbid0XG4gICAgICAgICAgLy8gaGF2ZSBhIHNoaW0gbG9jYXRpb24uIFRoaXMgbWVhbnMgd2UgY2FuJ3QgbWF0Y2ggZG9tIGJpbmRpbmdzIHRvIHRoZWlyIGxpYi5kb21cbiAgICAgICAgICAvLyByZWZlcmVuY2UsIGJ1dCB3ZSBjYW4gc3RpbGwgc2VlIGlmIHRoZXkgbWF0Y2ggdG8gYSBkaXJlY3RpdmUuXG4gICAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIFRtcGxBc3RUZXh0QXR0cmlidXRlKSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBUbXBsQXN0Qm91bmRBdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZGlyZWN0aXZlcyA9IGdldERpcmVjdGl2ZU1hdGNoZXNGb3JBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgIG5vZGUubmFtZSwgc3ltYm9sLmhvc3QudGVtcGxhdGVOb2RlLCBzeW1ib2wuaG9zdC5kaXJlY3RpdmVzKTtcbiAgICAgICAgICBkZXRhaWxzLnB1c2goe1xuICAgICAgICAgICAgdHlwZXNjcmlwdExvY2F0aW9uczogdGhpcy5nZXRQb3NpdGlvbnNGb3JEaXJlY3RpdmVzKGRpcmVjdGl2ZXMpLFxuICAgICAgICAgICAgdGVtcGxhdGVUYXJnZXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBTeW1ib2xLaW5kLlJlZmVyZW5jZToge1xuICAgICAgICAgIGRldGFpbHMucHVzaCh7XG4gICAgICAgICAgICB0eXBlc2NyaXB0TG9jYXRpb25zOiBbdG9GaWxlUG9zaXRpb24oc3ltYm9sLnJlZmVyZW5jZVZhckxvY2F0aW9uKV0sXG4gICAgICAgICAgICB0ZW1wbGF0ZVRhcmdldCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFN5bWJvbEtpbmQuVmFyaWFibGU6IHtcbiAgICAgICAgICBpZiAoKHRlbXBsYXRlVGFyZ2V0IGluc3RhbmNlb2YgVG1wbEFzdFZhcmlhYmxlKSkge1xuICAgICAgICAgICAgaWYgKHRlbXBsYXRlVGFyZ2V0LnZhbHVlU3BhbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgaXNXaXRoaW4ocG9zaXRpb24sIHRlbXBsYXRlVGFyZ2V0LnZhbHVlU3BhbikpIHtcbiAgICAgICAgICAgICAgLy8gSW4gdGhlIHZhbHVlU3BhbiBvZiB0aGUgdmFyaWFibGUsIHdlIHdhbnQgdG8gZ2V0IHRoZSByZWZlcmVuY2Ugb2YgdGhlIGluaXRpYWxpemVyLlxuICAgICAgICAgICAgICBkZXRhaWxzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGVzY3JpcHRMb2NhdGlvbnM6IFt0b0ZpbGVQb3NpdGlvbihzeW1ib2wuaW5pdGlhbGl6ZXJMb2NhdGlvbildLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVGFyZ2V0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaXRoaW4ocG9zaXRpb24sIHRlbXBsYXRlVGFyZ2V0LmtleVNwYW4pKSB7XG4gICAgICAgICAgICAgIC8vIEluIHRoZSBrZXlTcGFuIG9mIHRoZSB2YXJpYWJsZSwgd2Ugd2FudCB0byBnZXQgdGhlIHJlZmVyZW5jZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUuXG4gICAgICAgICAgICAgIGRldGFpbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZXNjcmlwdExvY2F0aW9uczogW3RvRmlsZVBvc2l0aW9uKHN5bWJvbC5sb2NhbFZhckxvY2F0aW9uKV0sXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVUYXJnZXQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgdGVtcGxhdGVOb2RlIGlzIG5vdCB0aGUgYFRtcGxBc3RWYXJpYWJsZWAsIGl0IG11c3QgYmUgYSB1c2FnZSBvZiB0aGVcbiAgICAgICAgICAgIC8vIHZhcmlhYmxlIHNvbWV3aGVyZSBpbiB0aGUgdGVtcGxhdGUuXG4gICAgICAgICAgICBkZXRhaWxzLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlc2NyaXB0TG9jYXRpb25zOiBbdG9GaWxlUG9zaXRpb24oc3ltYm9sLmxvY2FsVmFyTG9jYXRpb24pXSxcbiAgICAgICAgICAgICAgdGVtcGxhdGVUYXJnZXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBTeW1ib2xLaW5kLklucHV0OlxuICAgICAgICBjYXNlIFN5bWJvbEtpbmQuT3V0cHV0OiB7XG4gICAgICAgICAgZGV0YWlscy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGVzY3JpcHRMb2NhdGlvbnM6XG4gICAgICAgICAgICAgICAgc3ltYm9sLmJpbmRpbmdzLm1hcChiaW5kaW5nID0+IHRvRmlsZVBvc2l0aW9uKGJpbmRpbmcuc2hpbUxvY2F0aW9uKSksXG4gICAgICAgICAgICB0ZW1wbGF0ZVRhcmdldCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFN5bWJvbEtpbmQuUGlwZTpcbiAgICAgICAgY2FzZSBTeW1ib2xLaW5kLkV4cHJlc3Npb246IHtcbiAgICAgICAgICBkZXRhaWxzLnB1c2goXG4gICAgICAgICAgICAgIHt0eXBlc2NyaXB0TG9jYXRpb25zOiBbdG9GaWxlUG9zaXRpb24oc3ltYm9sLnNoaW1Mb2NhdGlvbildLCB0ZW1wbGF0ZVRhcmdldH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRldGFpbHMubGVuZ3RoID4gMCA/IGRldGFpbHMgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQb3NpdGlvbnNGb3JEaXJlY3RpdmVzKGRpcmVjdGl2ZXM6IFNldDxEaXJlY3RpdmVTeW1ib2w+KTogRmlsZVBvc2l0aW9uW10ge1xuICAgIGNvbnN0IGFsbERpcmVjdGl2ZXM6IEZpbGVQb3NpdGlvbltdID0gW107XG4gICAgZm9yIChjb25zdCBkaXIgb2YgZGlyZWN0aXZlcy52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgZGlyQ2xhc3MgPSBkaXIudHNTeW1ib2wudmFsdWVEZWNsYXJhdGlvbjtcbiAgICAgIGlmIChkaXJDbGFzcyA9PT0gdW5kZWZpbmVkIHx8ICF0cy5pc0NsYXNzRGVjbGFyYXRpb24oZGlyQ2xhc3MpIHx8XG4gICAgICAgICAgZGlyQ2xhc3MubmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7ZmlsZU5hbWV9ID0gZGlyQ2xhc3MuZ2V0U291cmNlRmlsZSgpO1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBkaXJDbGFzcy5uYW1lLmdldFN0YXJ0KCk7XG4gICAgICBhbGxEaXJlY3RpdmVzLnB1c2goe2ZpbGVOYW1lLCBwb3NpdGlvbn0pO1xuICAgIH1cblxuICAgIHJldHVybiBhbGxEaXJlY3RpdmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWZlcmVuY2VzQXRUeXBlc2NyaXB0UG9zaXRpb24oZmlsZU5hbWU6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6XG4gICAgICB0cy5SZWZlcmVuY2VFbnRyeVtdfHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVmcyA9IHRoaXMudHNMUy5nZXRSZWZlcmVuY2VzQXRQb3NpdGlvbihmaWxlTmFtZSwgcG9zaXRpb24pO1xuICAgIGlmIChyZWZzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZW50cmllczogTWFwPHN0cmluZywgdHMuUmVmZXJlbmNlRW50cnk+ID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgcmVmIG9mIHJlZnMpIHtcbiAgICAgIGlmICh0aGlzLnR0Yy5pc1RyYWNrZWRUeXBlQ2hlY2tGaWxlKGFic29sdXRlRnJvbShyZWYuZmlsZU5hbWUpKSkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuY29udmVydFRvVGVtcGxhdGVEb2N1bWVudFNwYW4ocmVmLCB0aGlzLnR0Yyk7XG4gICAgICAgIGlmIChlbnRyeSAhPT0gbnVsbCkge1xuICAgICAgICAgIGVudHJpZXMuc2V0KGNyZWF0ZUxvY2F0aW9uS2V5KGVudHJ5KSwgZW50cnkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyaWVzLnNldChjcmVhdGVMb2NhdGlvbktleShyZWYpLCByZWYpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbShlbnRyaWVzLnZhbHVlcygpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRvVGVtcGxhdGVEb2N1bWVudFNwYW48VCBleHRlbmRzIHRzLkRvY3VtZW50U3Bhbj4oXG4gICAgICBzaGltRG9jdW1lbnRTcGFuOiBULCB0ZW1wbGF0ZVR5cGVDaGVja2VyOiBUZW1wbGF0ZVR5cGVDaGVja2VyLCByZXF1aXJlZE5vZGVUZXh0Pzogc3RyaW5nKTogVFxuICAgICAgfG51bGwge1xuICAgIGNvbnN0IHNmID0gdGhpcy5zdHJhdGVneS5nZXRQcm9ncmFtKCkuZ2V0U291cmNlRmlsZShzaGltRG9jdW1lbnRTcGFuLmZpbGVOYW1lKTtcbiAgICBpZiAoc2YgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHRjYk5vZGUgPSBmaW5kVGlnaHRlc3ROb2RlKHNmLCBzaGltRG9jdW1lbnRTcGFuLnRleHRTcGFuLnN0YXJ0KTtcbiAgICBpZiAodGNiTm9kZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIGhhc0V4cHJlc3Npb25JZGVudGlmaWVyKHNmLCB0Y2JOb2RlLCBFeHByZXNzaW9uSWRlbnRpZmllci5FVkVOVF9QQVJBTUVURVIpKSB7XG4gICAgICAvLyBJZiB0aGUgcmVmZXJlbmNlIHJlc3VsdCBpcyB0aGUgJGV2ZW50IHBhcmFtZXRlciBpbiB0aGUgc3Vic2NyaWJlL2FkZEV2ZW50TGlzdGVuZXJcbiAgICAgIC8vIGZ1bmN0aW9uIGluIHRoZSBUQ0IsIHdlIHdhbnQgdG8gZmlsdGVyIHRoaXMgcmVzdWx0IG91dCBvZiB0aGUgcmVmZXJlbmNlcy4gV2UgcmVhbGx5IG9ubHlcbiAgICAgIC8vIHdhbnQgdG8gcmV0dXJuIHJlZmVyZW5jZXMgdG8gdGhlIHBhcmFtZXRlciBpbiB0aGUgdGVtcGxhdGUgaXRzZWxmLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFRPRE8oYXRzY290dCk6IERldGVybWluZSBob3cgdG8gY29uc2lzdGVudGx5IHJlc29sdmUgcGF0aHMuIGkuZS4gd2l0aCB0aGUgcHJvamVjdFxuICAgIC8vIHNlcnZlckhvc3Qgb3IgTFNQYXJzZUNvbmZpZ0hvc3QgaW4gdGhlIGFkYXB0ZXIuIFdlIHNob3VsZCBoYXZlIGEgYmV0dGVyIGRlZmluZWQgd2F5IHRvXG4gICAgLy8gbm9ybWFsaXplIHBhdGhzLlxuICAgIGNvbnN0IG1hcHBpbmcgPSBnZXRUZW1wbGF0ZUxvY2F0aW9uRnJvbVNoaW1Mb2NhdGlvbihcbiAgICAgICAgdGVtcGxhdGVUeXBlQ2hlY2tlciwgYWJzb2x1dGVGcm9tKHNoaW1Eb2N1bWVudFNwYW4uZmlsZU5hbWUpLFxuICAgICAgICBzaGltRG9jdW1lbnRTcGFuLnRleHRTcGFuLnN0YXJ0KTtcbiAgICBpZiAobWFwcGluZyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qge3NwYW4sIHRlbXBsYXRlVXJsfSA9IG1hcHBpbmc7XG4gICAgaWYgKHJlcXVpcmVkTm9kZVRleHQgIT09IHVuZGVmaW5lZCAmJiBzcGFuLnRvU3RyaW5nKCkgIT09IHJlcXVpcmVkTm9kZVRleHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zaGltRG9jdW1lbnRTcGFuLFxuICAgICAgZmlsZU5hbWU6IHRlbXBsYXRlVXJsLFxuICAgICAgdGV4dFNwYW46IHRvVGV4dFNwYW4oc3BhbiksXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZW5hbWVUZXh0QW5kU3BhbkF0UG9zaXRpb24oXG4gICAgbm9kZTogVG1wbEFzdE5vZGV8QVNULCBwb3NpdGlvbjogbnVtYmVyKToge3RleHQ6IHN0cmluZywgc3BhbjogdHMuVGV4dFNwYW59fG51bGwge1xuICBpZiAobm9kZSBpbnN0YW5jZW9mIFRtcGxBc3RCb3VuZEF0dHJpYnV0ZSB8fCBub2RlIGluc3RhbmNlb2YgVG1wbEFzdFRleHRBdHRyaWJ1dGUgfHxcbiAgICAgIG5vZGUgaW5zdGFuY2VvZiBUbXBsQXN0Qm91bmRFdmVudCkge1xuICAgIGlmIChub2RlLmtleVNwYW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7dGV4dDogbm9kZS5uYW1lLCBzcGFuOiB0b1RleHRTcGFuKG5vZGUua2V5U3Bhbil9O1xuICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBUbXBsQXN0VmFyaWFibGUgfHwgbm9kZSBpbnN0YW5jZW9mIFRtcGxBc3RSZWZlcmVuY2UpIHtcbiAgICBpZiAoaXNXaXRoaW4ocG9zaXRpb24sIG5vZGUua2V5U3BhbikpIHtcbiAgICAgIHJldHVybiB7dGV4dDogbm9kZS5rZXlTcGFuLnRvU3RyaW5nKCksIHNwYW46IHRvVGV4dFNwYW4obm9kZS5rZXlTcGFuKX07XG4gICAgfSBlbHNlIGlmIChub2RlLnZhbHVlU3BhbiAmJiBpc1dpdGhpbihwb3NpdGlvbiwgbm9kZS52YWx1ZVNwYW4pKSB7XG4gICAgICByZXR1cm4ge3RleHQ6IG5vZGUudmFsdWVTcGFuLnRvU3RyaW5nKCksIHNwYW46IHRvVGV4dFNwYW4obm9kZS52YWx1ZVNwYW4pfTtcbiAgICB9XG4gIH1cblxuICBpZiAobm9kZSBpbnN0YW5jZW9mIEJpbmRpbmdQaXBlKSB7XG4gICAgLy8gVE9ETyhhdHNjb3R0KTogQWRkIHN1cHBvcnQgZm9yIHJlbmFtaW5nIHBpcGVzXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKG5vZGUgaW5zdGFuY2VvZiBQcm9wZXJ0eVJlYWQgfHwgbm9kZSBpbnN0YW5jZW9mIE1ldGhvZENhbGwgfHwgbm9kZSBpbnN0YW5jZW9mIFByb3BlcnR5V3JpdGUgfHxcbiAgICAgIG5vZGUgaW5zdGFuY2VvZiBTYWZlUHJvcGVydHlSZWFkIHx8IG5vZGUgaW5zdGFuY2VvZiBTYWZlTWV0aG9kQ2FsbCkge1xuICAgIHJldHVybiB7dGV4dDogbm9kZS5uYW1lLCBzcGFuOiB0b1RleHRTcGFuKG5vZGUubmFtZVNwYW4pfTtcbiAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgTGl0ZXJhbFByaW1pdGl2ZSkge1xuICAgIGNvbnN0IHNwYW4gPSB0b1RleHRTcGFuKG5vZGUuc291cmNlU3Bhbik7XG4gICAgY29uc3QgdGV4dCA9IG5vZGUudmFsdWU7XG4gICAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhlIHNwYW4gb2YgYSBzdHJpbmcgbGl0ZXJhbCBpbmNsdWRlcyB0aGUgcXVvdGVzIGJ1dCB0aGV5IHNob3VsZCBiZSByZW1vdmVkIGZvciByZW5hbWluZy5cbiAgICAgIHNwYW4uc3RhcnQgKz0gMTtcbiAgICAgIHNwYW4ubGVuZ3RoIC09IDI7XG4gICAgfVxuICAgIHJldHVybiB7dGV4dCwgc3Bhbn07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgYSBcImtleVwiIGZvciBhIHJlbmFtZS9yZWZlcmVuY2UgbG9jYXRpb24gYnkgY29uY2F0ZW5hdGluZyBmaWxlIG5hbWUsIHNwYW4gc3RhcnQsIGFuZCBzcGFuXG4gKiBsZW5ndGguIFRoaXMgYWxsb3dzIHVzIHRvIGRlLWR1cGxpY2F0ZSB0ZW1wbGF0ZSByZXN1bHRzIHdoZW4gYW4gaXRlbSBtYXkgYXBwZWFyIHNldmVyYWwgdGltZXNcbiAqIGluIHRoZSBUQ0IgYnV0IG1hcCBiYWNrIHRvIHRoZSBzYW1lIHRlbXBsYXRlIGxvY2F0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVMb2NhdGlvbktleShkczogdHMuRG9jdW1lbnRTcGFuKSB7XG4gIHJldHVybiBkcy5maWxlTmFtZSArIGRzLnRleHRTcGFuLnN0YXJ0ICsgZHMudGV4dFNwYW4ubGVuZ3RoO1xufSJdfQ==