@kontur.candy/tools 2.130.0 → 2.132.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.
Files changed (45) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +6 -6
  3. package/distr/Common/CandyApiClient/CandyApiClient.js +52 -2
  4. package/distr/Common/CandyApiClient/FakeCandyApiClient.js +21 -1
  5. package/distr/Common/CandyApiClient/Types/DraftActions/FufSizeTooLargeError.js +11 -0
  6. package/distr/Common/Enums/ButtonSettingsTypeEnum.js +13 -0
  7. package/distr/Common/Errors.js +3 -3
  8. package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithOptionalPolyfill.js +12 -0
  9. package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithPolyfill.js +1 -2
  10. package/distr/Common/HttpClient/FetchImplementation/NativeBrowserFetch.js +1 -2
  11. package/distr/Common/HttpClient/HttpClient.js +14 -2
  12. package/distr/Common/IndentString.js +18 -0
  13. package/distr/Common/IterableUtils.js +23 -1
  14. package/distr/Common/ModelPath/BuildIterationSequence.js +3 -3
  15. package/distr/Common/ModelPath/Map/AbsoluteModelPathMap.js +30 -0
  16. package/distr/Common/ModelPath/Map/Map2.js +103 -0
  17. package/distr/Common/ModelPath/Map/ModelPathMap.js +30 -0
  18. package/distr/Common/ModelPath/ModelPath.js +207 -154
  19. package/distr/Common/ModelPath/ModelPathBuilder.js +11 -7
  20. package/distr/Common/ModelPath/ModelPathHelper.js +13 -0
  21. package/distr/Common/ModelPath/PathMatcher.js +9 -11
  22. package/distr/Common/ModelPath/PathSplitHelper.js +26 -0
  23. package/distr/Common/ModelPath/Set/AbsoluteModelPathSet.js +40 -0
  24. package/distr/Common/ModelPath/Set/AbsoluteResolvedModelPathSet.js +40 -0
  25. package/distr/Common/ModelPath/Set/ModelPathSet.js +40 -0
  26. package/distr/Common/ModelPath/Set/Set2.js +60 -0
  27. package/distr/Common/PathConstants.js +3 -3
  28. package/distr/Common/TypingUtils.js +1 -1
  29. package/distr/Tools/src/BuildTasks/ReadFormSource.js +2 -1
  30. package/distr/Tools/src/CLICommands/BuildForms/BuildFormsOptions.js +7 -7
  31. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/RunFormCompilationViaWebpackDevServer.js +3 -5
  32. package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.js +1 -1
  33. package/distr/Tools/src/FormWebpackConfiguration/CacheAssetsPlugin.js +49 -5
  34. package/distr/Tools/src/FormWebpackConfiguration/createFormWebpackConfiguration.js +5 -4
  35. package/distr/Tools/src/LocalServerFrontEndDist/enhancedClient.js +1 -1
  36. package/distr/Tools/src/LocalServerFrontEndDist/index.js +1 -1
  37. package/distr/Tools/src/LocalServerFrontEndDist/index.js.map +1 -1
  38. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js +1000 -2032
  39. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js.map +1 -1
  40. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js +366 -357
  41. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js.map +1 -1
  42. package/package.json +10 -8
  43. package/distr/Common/ModelPath/AbsoluteModelPathSet.js +0 -62
  44. package/distr/Common/ModelPath/ModelPathMap.js +0 -120
  45. package/distr/Common/ModelPath/ModelPathSet.js +0 -66
@@ -3,10 +3,21 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.PathTokens = exports.ModelPath = exports.AbsoluteModelPath = exports.AbsoluteModelFieldPath = void 0;
6
+ exports.PathTokens = exports.ModelPathImpl = exports.AbsoluteModelFieldPath = void 0;
7
7
  exports.convertToAbsolutModelPath = convertToAbsolutModelPath;
8
8
  exports.convertToLegacyPath = convertToLegacyPath;
9
+ exports.createAbsolute = createAbsolute;
10
+ exports.createAbsoluteFromMask = createAbsoluteFromMask;
11
+ exports.createAbsoluteFromTokens = createAbsoluteFromTokens;
12
+ exports.createAbsoluteResolvedFromTokens = createAbsoluteResolvedFromTokens;
13
+ exports.createFromMask = createFromMask;
14
+ exports.createModelPath = createModelPath;
15
+ exports.createRelativeFromTokens = createRelativeFromTokens;
16
+ exports.createRelativeResolvedModelPath = createRelativeResolvedModelPath;
17
+ exports.emptyAbsoluteModelPath = emptyAbsoluteModelPath;
18
+ exports.emptyModelPath = emptyModelPath;
9
19
  exports.isModelPath = isModelPath;
20
+ exports.joinModelPaths = joinModelPaths;
10
21
 
11
22
  var _IterableUtils = require("../IterableUtils");
12
23
 
@@ -41,7 +52,7 @@ PathTokens.each = EachSymbol;
41
52
  PathTokens.current = CurrentSymbol;
42
53
 
43
54
  function isModelPath(path) {
44
- return typeof path !== "string";
55
+ return typeof path !== "string" && path instanceof ModelPathImpl;
45
56
  }
46
57
 
47
58
  function convertToLegacyPath(path) {
@@ -49,7 +60,122 @@ function convertToLegacyPath(path) {
49
60
  }
50
61
 
51
62
  function convertToAbsolutModelPath(path) {
52
- return isModelPath(path) ? path : AbsoluteModelPath.createAbsoluteFromMask(path, PathTokens.each);
63
+ return isModelPath(path) ? path : createAbsoluteFromMask(path, PathTokens.each);
64
+ }
65
+
66
+ function emptyModelPath() {
67
+ return new ModelPathImpl([], false);
68
+ }
69
+
70
+ function emptyAbsoluteModelPath() {
71
+ return new ModelPathImpl([], true);
72
+ }
73
+
74
+ function createModelPath(path, absolute) {
75
+ const partPartStrings = path.split("/");
76
+ ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
77
+
78
+ if (absolute === "auto") {
79
+ if (path.startsWith("/")) {
80
+ return new ModelPathImpl(partPartStrings.slice(1), true);
81
+ } else {
82
+ return new ModelPathImpl(partPartStrings, false);
83
+ }
84
+ }
85
+
86
+ if (absolute && path.startsWith("/")) {
87
+ return new ModelPathImpl(partPartStrings.slice(1), true);
88
+ }
89
+
90
+ return new ModelPathImpl(partPartStrings, absolute);
91
+ }
92
+
93
+ function createFromMask(path, absolute, multiplicitySymbol) {
94
+ const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
95
+
96
+ if (absolute === "auto") {
97
+ if (path.startsWith("/")) {
98
+ return new ModelPathImpl(partPartStrings.slice(1), true);
99
+ } else {
100
+ return new ModelPathImpl(partPartStrings, false);
101
+ }
102
+ }
103
+
104
+ if (absolute && path.startsWith("/")) {
105
+ return new ModelPathImpl(partPartStrings.slice(1), true);
106
+ }
107
+
108
+ return new ModelPathImpl(partPartStrings, absolute);
109
+ }
110
+
111
+ function createAbsoluteFromMask(path, multiplicitySymbol) {
112
+ const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
113
+
114
+ if (path.startsWith("/")) {
115
+ return new ModelPathImpl(partPartStrings.slice(1), true);
116
+ }
117
+
118
+ return new ModelPathImpl(partPartStrings, true);
119
+ }
120
+
121
+ function ensurePlainPathPartsDoesNotContainMultiplicity(parts) {
122
+ if (parts.some(x => x === "*")) {
123
+ throw new Error("Path must not contain * symbol");
124
+ }
125
+ }
126
+
127
+ function createAbsolute(path) {
128
+ const partPartStrings = path.split("/");
129
+ ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
130
+
131
+ if (path.startsWith("/")) {
132
+ return new ModelPathImpl(partPartStrings.slice(1), true);
133
+ }
134
+
135
+ return new ModelPathImpl(partPartStrings, true);
136
+ }
137
+
138
+ function createRelativeResolvedModelPath(path) {
139
+ const partPartStrings = path.split("/");
140
+ ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
141
+ return new ModelPathImpl(partPartStrings, false);
142
+ }
143
+
144
+ function createAbsoluteFromTokens(tokens) {
145
+ return new ModelPathImpl(tokens, true);
146
+ }
147
+
148
+ function createAbsoluteResolvedFromTokens(tokens) {
149
+ ensurePlainPathPartsDoesNotContainMultiplicity(tokens);
150
+ return new ModelPathImpl(tokens, true);
151
+ }
152
+
153
+ function createRelativeFromTokens(tokens) {
154
+ return new ModelPathImpl(tokens, false);
155
+ }
156
+
157
+ function joinModelPaths(...parts) {
158
+ let absolute = false;
159
+ let resultParts = [];
160
+
161
+ for (const joinItem of parts) {
162
+ if (typeof joinItem === "string") {
163
+ resultParts.push(joinItem);
164
+ } else if (isModelPath(joinItem)) {
165
+ if (joinItem.isAbsolute()) {
166
+ absolute = true;
167
+ resultParts = [...joinItem.getPathPartsAsArray()];
168
+ } else {
169
+ resultParts.push(...joinItem.getPathPartsAsArray());
170
+ }
171
+ } else if (Array.isArray(joinItem)) {
172
+ resultParts.push(...joinItem);
173
+ } else if (PathTokens.isMultiToken(joinItem)) {
174
+ resultParts.push(joinItem);
175
+ }
176
+ }
177
+
178
+ return new ModelPathImpl(resultParts, absolute);
53
179
  }
54
180
 
55
181
  class AbsoluteModelFieldPath {
@@ -66,33 +192,47 @@ class AbsoluteModelFieldPath {
66
192
 
67
193
  static createFromString(pathWithFieldName) {
68
194
  if (pathWithFieldName.endsWith(".$errorCount")) {
69
- return new AbsoluteModelFieldPath(AbsoluteModelPath.createAbsolute(pathWithFieldName.replace(".$errorCount", "")), "$errorCount");
195
+ return new AbsoluteModelFieldPath(createAbsolute(pathWithFieldName.replace(".$errorCount", "")), "$errorCount");
70
196
  }
71
197
 
72
198
  if (pathWithFieldName.endsWith(".$warningCount")) {
73
- return new AbsoluteModelFieldPath(AbsoluteModelPath.createAbsolute(pathWithFieldName.replace(".$warningCount", "")), "$warningCount");
199
+ return new AbsoluteModelFieldPath(createAbsolute(pathWithFieldName.replace(".$warningCount", "")), "$warningCount");
74
200
  }
75
201
 
76
- return new AbsoluteModelFieldPath(AbsoluteModelPath.createAbsolute(pathWithFieldName), "value");
202
+ return new AbsoluteModelFieldPath(createAbsolute(pathWithFieldName), "value");
77
203
  }
78
204
 
79
205
  static createFromMask(pathWithFieldName, multiplicitySymbol) {
80
206
  if (pathWithFieldName.endsWith(".$errorCount")) {
81
- return new AbsoluteModelFieldPath(AbsoluteModelPath.createAbsoluteFromMask(pathWithFieldName.replace(".$errorCount", ""), multiplicitySymbol), "$errorCount");
207
+ return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".$errorCount", ""), multiplicitySymbol), "$errorCount");
82
208
  }
83
209
 
84
210
  if (pathWithFieldName.endsWith(".$warningCount")) {
85
- return new AbsoluteModelFieldPath(AbsoluteModelPath.createAbsoluteFromMask(pathWithFieldName.replace(".$warningCount", ""), multiplicitySymbol), "$warningCount");
211
+ return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".$warningCount", ""), multiplicitySymbol), "$warningCount");
212
+ }
213
+
214
+ if (pathWithFieldName.endsWith(".errorsCount")) {
215
+ return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".errorsCount", ""), multiplicitySymbol), "errorsCount");
216
+ }
217
+
218
+ if (pathWithFieldName.endsWith(".warningsCount")) {
219
+ return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".warningsCount", ""), multiplicitySymbol), "warningsCount");
86
220
  }
87
221
 
88
- return new AbsoluteModelFieldPath(AbsoluteModelPath.createAbsoluteFromMask(pathWithFieldName, multiplicitySymbol), "value");
222
+ return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName, multiplicitySymbol), "value");
89
223
  }
90
224
 
91
225
  }
92
226
 
93
227
  exports.AbsoluteModelFieldPath = AbsoluteModelFieldPath;
94
228
 
95
- class ModelPath {
229
+ function isAllTokensResolved(tokens) {
230
+ // Я что-то немогу сообразить как тут всё строго написать...
231
+ // @ts-expect-error
232
+ return tokens.every(PathTokens.isSimpleToken);
233
+ }
234
+
235
+ class ModelPathImpl {
96
236
  constructor(pathParts, absolute) {
97
237
  this.tokens = void 0;
98
238
  this.absolute = void 0;
@@ -101,79 +241,8 @@ class ModelPath {
101
241
  this.absolute = absolute;
102
242
  }
103
243
 
104
- static empty() {
105
- return new ModelPath([], false);
106
- }
107
-
108
- static builder(forceAbsolute = false) {
109
- return new _ModelPathBuilder.ModelPathBuilder(forceAbsolute);
110
- }
111
-
112
- static createFromString(path, absolute) {
113
- const partPartStrings = path.split("/");
114
- this.ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
115
-
116
- if (absolute === "auto") {
117
- if (path.startsWith("/")) {
118
- return new ModelPath(partPartStrings.slice(1), true);
119
- } else {
120
- return new ModelPath(partPartStrings, false);
121
- }
122
- }
123
-
124
- if (absolute && path.startsWith("/")) {
125
- return new ModelPath(partPartStrings.slice(1), true);
126
- }
127
-
128
- return new ModelPath(partPartStrings, absolute);
129
- }
130
-
131
- static createFromMask(path, absolute, multiplicitySymbol) {
132
- const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
133
-
134
- if (absolute === "auto") {
135
- if (path.startsWith("/")) {
136
- return new ModelPath(partPartStrings.slice(1), true);
137
- } else {
138
- return new ModelPath(partPartStrings, false);
139
- }
140
- }
141
-
142
- if (absolute && path.startsWith("/")) {
143
- return new ModelPath(partPartStrings.slice(1), true);
144
- }
145
-
146
- return new ModelPath(partPartStrings, absolute);
147
- }
148
-
149
- static join(...parts) {
150
- let absolute = false;
151
- let resultParts = [];
152
-
153
- for (const joinItem of parts) {
154
- if (typeof joinItem === "string") {
155
- resultParts.push(joinItem);
156
- } else if (joinItem instanceof ModelPath) {
157
- if (joinItem.isAbsolute()) {
158
- absolute = true;
159
- resultParts = [...joinItem.tokens];
160
- } else {
161
- resultParts.push(...joinItem.tokens);
162
- }
163
- } else if (Array.isArray(joinItem)) {
164
- resultParts.push(...joinItem);
165
- } else if (PathTokens.isMultiToken(joinItem)) {
166
- resultParts.push(joinItem);
167
- }
168
- }
169
-
170
- return new ModelPath(resultParts, absolute);
171
- }
172
-
173
- static ensurePlainPathPartsDoesNotContainMultiplicity(parts) {
174
- if (parts.some(x => x === "*")) {
175
- throw new Error("Path must not contain * symbol");
176
- }
244
+ get resolved() {
245
+ return isAllTokensResolved(this.tokens);
177
246
  }
178
247
 
179
248
  getPathParts() {
@@ -208,10 +277,11 @@ class ModelPath {
208
277
  }
209
278
 
210
279
  joinWith(...path) {
211
- return ModelPath.join(this, ...path);
280
+ return joinModelPaths(this, ...path);
212
281
  }
213
282
 
214
283
  isResolved() {
284
+ return isAllTokensResolved(this.tokens);
215
285
  return this.tokens.every(PathTokens.isSimpleToken);
216
286
  }
217
287
 
@@ -223,7 +293,7 @@ class ModelPath {
223
293
  return instance;
224
294
  }
225
295
  });
226
- return new ModelPath(tokens, this.absolute);
296
+ return new ModelPathImpl(tokens, this.absolute);
227
297
  }
228
298
 
229
299
  isContainIteration() {
@@ -234,6 +304,17 @@ class ModelPath {
234
304
  return this.tokens.some(x => x === PathTokens.current);
235
305
  }
236
306
 
307
+ getLastListPath() {
308
+ if (!this.isContainIteration()) {
309
+ throw new Error("Path must contain iteration");
310
+ } // Проверка выше гарантирует, что будет PathTokens.each
311
+ // @ts-ignore
312
+
313
+
314
+ const lastIterationIndex = this.tokens.lastIndexOf(PathTokens.each);
315
+ return this.tokens.slice(0, lastIterationIndex);
316
+ }
317
+
237
318
  isAbsolute() {
238
319
  return this.absolute;
239
320
  }
@@ -299,13 +380,15 @@ class ModelPath {
299
380
  }
300
381
 
301
382
  isIncludes(modelPath) {
302
- if (this.tokens.length !== modelPath.tokens.length) {
383
+ const targetTokens = modelPath.getPathPartsAsArray();
384
+
385
+ if (this.tokens.length !== targetTokens.length) {
303
386
  return false;
304
387
  }
305
388
 
306
389
  for (let i = 0; i < this.tokens.length; i++) {
307
390
  const leftPart = this.tokens[i];
308
- const rightPart = modelPath.tokens[i];
391
+ const rightPart = targetTokens[i];
309
392
 
310
393
  if (typeof leftPart === "string") {
311
394
  if (typeof rightPart === "string") {
@@ -354,19 +437,19 @@ class ModelPath {
354
437
  throw new Error(`Cannot match non absolute path '${modelPath.toString()}'`);
355
438
  }
356
439
 
357
- return _PathMatcher.PathMatcher.match(this.tokens, modelPath.tokens);
440
+ return _PathMatcher.PathMatcher.match(this.tokens, modelPath.getPathPartsAsArray());
358
441
  }
359
442
 
360
443
  *splitByMultiplicity() {
361
- let lastSimpleParts = ModelPath.builder(this.isAbsolute());
444
+ let lastSimpleParts = new _ModelPathBuilder.ModelPathBuilder(this.isAbsolute());
362
445
 
363
446
  for (const token of this.tokens) {
364
447
  if (PathTokens.isSimpleToken(token)) {
365
448
  lastSimpleParts.append(token);
366
449
  } else {
367
450
  if (!lastSimpleParts.empty) {
368
- yield lastSimpleParts.toPath();
369
- lastSimpleParts = ModelPath.builder();
451
+ yield lastSimpleParts.toResolvedPath();
452
+ lastSimpleParts = new _ModelPathBuilder.ModelPathBuilder(false);
370
453
  }
371
454
 
372
455
  yield token;
@@ -374,7 +457,7 @@ class ModelPath {
374
457
  }
375
458
 
376
459
  if (!lastSimpleParts.empty) {
377
- yield lastSimpleParts.toPath();
460
+ yield lastSimpleParts.toResolvedPath();
378
461
  }
379
462
  }
380
463
 
@@ -401,7 +484,7 @@ class ModelPath {
401
484
  resultTokens.push(pathPart);
402
485
  }
403
486
 
404
- return new ModelPath(resultTokens, this.isAbsolute());
487
+ return new ModelPathImpl(resultTokens, this.absolute);
405
488
  }
406
489
  /**
407
490
  * @summary Спецификаторы множественности Each заменяет на Current
@@ -409,11 +492,25 @@ class ModelPath {
409
492
 
410
493
 
411
494
  toCurrentIteration() {
412
- return new ModelPath(this.tokens.map(x => x === PathTokens.each ? PathTokens.current : x), this.isAbsolute());
495
+ if (this.isResolved()) {
496
+ return this;
497
+ } else {
498
+ // NOTE Тут не получается наложить дискриминатор
499
+ // @ts-expect-error
500
+ const pathParts = this.tokens.map(x => x === PathTokens.each ? PathTokens.current : x);
501
+ return new ModelPathImpl(pathParts, this.absolute);
502
+ }
413
503
  }
414
504
 
415
505
  toEachIteration() {
416
- return new ModelPath(this.tokens.map(x => x === PathTokens.current ? PathTokens.each : x), this.isAbsolute());
506
+ if (this.isResolved()) {
507
+ return this;
508
+ } else {
509
+ // NOTE Тут не получается наложить дискриминатор
510
+ // @ts-expect-error
511
+ const pathParts = this.tokens.map(x => x === PathTokens.current ? PathTokens.each : x);
512
+ return new ModelPathImpl(pathParts, this.absolute);
513
+ }
417
514
  }
418
515
 
419
516
  toAbsolute() {
@@ -421,11 +518,11 @@ class ModelPath {
421
518
  throw new Error(`Path '${this.toLegacyPath()} is not absolute'`);
422
519
  }
423
520
 
424
- return new AbsoluteModelPath(this.tokens);
521
+ return new ModelPathImpl(this.tokens, true);
425
522
  }
426
523
 
427
524
  *getAllParentPaths() {
428
- const result = ModelPath.builder(this.isAbsolute());
525
+ const result = new _ModelPathBuilder.ModelPathBuilder(this.isAbsolute());
429
526
 
430
527
  for (const token of _IterableUtils.IterUtils.skipLast(this.getPathParts(), 1)) {
431
528
  result.append(token);
@@ -437,20 +534,22 @@ class ModelPath {
437
534
  const lastItem = _IterableUtils.IterUtils.last(this.tokens);
438
535
 
439
536
  if (lastItem != undefined && PathTokens.isMultiToken(lastItem)) {
440
- return new ModelPath(this.tokens.slice(0, -1), this.absolute);
537
+ return new ModelPathImpl(this.tokens.slice(0, -1), this.absolute);
441
538
  }
442
539
 
443
540
  return this;
444
541
  }
445
542
 
446
543
  getParentPath() {
447
- const result = ModelPath.builder(this.isAbsolute());
544
+ const result = new _ModelPathBuilder.ModelPathBuilder(this.absolute);
448
545
 
449
546
  for (const token of _IterableUtils.IterUtils.skipLast(this.getPathParts(), 1)) {
450
547
  result.append(token);
451
- }
548
+ } // Тут получается так, что по другому никак
549
+ // @ts-expect-error
452
550
 
453
- return result.toAbsolutePath();
551
+
552
+ return result.toPath();
454
553
  }
455
554
 
456
555
  applyInstancesDirty(instances) {
@@ -459,7 +558,7 @@ class ModelPath {
459
558
  }
460
559
 
461
560
  let instanceCounter = 0;
462
- const result = ModelPath.builder();
561
+ const result = new _ModelPathBuilder.ModelPathBuilder(true);
463
562
 
464
563
  for (const token of this.getPathParts()) {
465
564
  if (PathTokens.isMultiToken(token) && instanceCounter < instances.length) {
@@ -470,9 +569,11 @@ class ModelPath {
470
569
  } else {
471
570
  result.append(token);
472
571
  }
473
- }
572
+ } // Тут получается так, что по другому никак
573
+ // @ts-expect-error
574
+
474
575
 
475
- return result.toAbsolutePath();
576
+ return result.toPath();
476
577
  }
477
578
 
478
579
  pathPartToString(pathPart) {
@@ -493,53 +594,5 @@ class ModelPath {
493
594
 
494
595
  }
495
596
 
496
- exports.ModelPath = ModelPath;
497
-
498
- class AbsoluteModelPath extends ModelPath {
499
- constructor(pathParts) {
500
- super(pathParts, true);
501
- }
502
-
503
- static createAbsoluteFromMask(path, multiplicitySymbol) {
504
- const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
505
-
506
- if (path.startsWith("/")) {
507
- return new AbsoluteModelPath(partPartStrings.slice(1));
508
- }
509
-
510
- return new AbsoluteModelPath(partPartStrings);
511
- }
512
-
513
- static createAbsolute(path) {
514
- const partPartStrings = path.split("/");
515
- this.ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
516
-
517
- if (path.startsWith("/")) {
518
- return new AbsoluteModelPath(partPartStrings.slice(1));
519
- }
520
-
521
- return new AbsoluteModelPath(partPartStrings);
522
- }
523
-
524
- joinWith(path) {
525
- return super.joinWith(path).toAbsolute();
526
- }
527
-
528
- getParentPath() {
529
- const result = ModelPath.builder(true);
530
-
531
- for (const token of _IterableUtils.IterUtils.skipLast(this.getPathParts(), 1)) {
532
- result.append(token);
533
- }
534
-
535
- return result.toAbsolutePath();
536
- }
537
-
538
- applyInstancesDirty(instances) {
539
- return super.applyInstancesDirty(instances).toAbsolute();
540
- }
541
-
542
- }
543
-
544
- exports.AbsoluteModelPath = AbsoluteModelPath;
545
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL0NvbW1vbi9Nb2RlbFBhdGgvTW9kZWxQYXRoLnRzIl0sIm5hbWVzIjpbIkVhY2hTeW1ib2wiLCJTeW1ib2wiLCJmb3IiLCJDdXJyZW50U3ltYm9sIiwiUGF0aFRva2VucyIsImlzTXVsdGlUb2tlbiIsInBhcnQiLCJlYWNoIiwiY3VycmVudCIsImlzU2ltcGxlVG9rZW4iLCJpc0luc3RhbmNlVG9rZW4iLCJ0ZXN0IiwiaXNNb2RlbFBhdGgiLCJwYXRoIiwiY29udmVydFRvTGVnYWN5UGF0aCIsInRvTGVnYWN5UGF0aCIsImNvbnZlcnRUb0Fic29sdXRNb2RlbFBhdGgiLCJBYnNvbHV0ZU1vZGVsUGF0aCIsImNyZWF0ZUFic29sdXRlRnJvbU1hc2siLCJBYnNvbHV0ZU1vZGVsRmllbGRQYXRoIiwiY29uc3RydWN0b3IiLCJmaWVsZE5hbWUiLCJmaWVsZCIsImlzRXF1YWxzIiwibW9kZWxQYXRoIiwiZWFjaEN1cnJlbnRDb2xsaXNpb24iLCJFYWNoQ3VycmVudENvbGxpc2lvbiIsIkFyZVNhbWUiLCJjcmVhdGVGcm9tU3RyaW5nIiwicGF0aFdpdGhGaWVsZE5hbWUiLCJlbmRzV2l0aCIsImNyZWF0ZUFic29sdXRlIiwicmVwbGFjZSIsImNyZWF0ZUZyb21NYXNrIiwibXVsdGlwbGljaXR5U3ltYm9sIiwiTW9kZWxQYXRoIiwicGF0aFBhcnRzIiwiYWJzb2x1dGUiLCJ0b2tlbnMiLCJsZWdhY3lQYXRoIiwiZmlsdGVyIiwieCIsImVtcHR5IiwiYnVpbGRlciIsImZvcmNlQWJzb2x1dGUiLCJNb2RlbFBhdGhCdWlsZGVyIiwicGFydFBhcnRTdHJpbmdzIiwic3BsaXQiLCJlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5Iiwic3RhcnRzV2l0aCIsInNsaWNlIiwibWFwIiwiam9pbiIsInBhcnRzIiwicmVzdWx0UGFydHMiLCJqb2luSXRlbSIsInB1c2giLCJpc0Fic29sdXRlIiwiQXJyYXkiLCJpc0FycmF5Iiwic29tZSIsIkVycm9yIiwiZ2V0UGF0aFBhcnRzIiwiZ2V0UGF0aFBhcnRzQXNBcnJheSIsImdldFNpbXBsZVRva2Vuc1N0cmljdCIsInRva2VuIiwiZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCIsImpvaW5XaXRoIiwiaXNSZXNvbHZlZCIsImV2ZXJ5IiwicmVzb2x2ZUFsbCIsImluc3RhbmNlIiwiaXNDb250YWluSXRlcmF0aW9uIiwiaXNDb250YWluQ3VycmVudEl0ZXJhdGlvbiIsInRvU3RyaW5nIiwibGVuZ3RoIiwicGF0aFBhcnRUb1N0cmluZyIsIkl0ZXJhdG9yIiwiZnJvbSIsIkl0ZXJVdGlscyIsInppcCIsInQxIiwidDIiLCJnZXRIYXNoIiwiaGFzaCIsImN1cnJlbnRTdHIiLCJBcmVEaWZmZXJlbnQiLCJzdHJpbmdJbmRleCIsImNoYXJDb2RlQXQiLCJpc0luY2x1ZGVzIiwiaSIsImxlZnRQYXJ0IiwicmlnaHRQYXJ0IiwiaXNGaW5pdGUiLCJOdW1iZXIiLCJnZXRJdGVyYXRpb25SYW5rIiwiaXNFbXB0eSIsIm1hdGNoRm9yIiwiUGF0aE1hdGNoZXIiLCJtYXRjaCIsInNwbGl0QnlNdWx0aXBsaWNpdHkiLCJsYXN0U2ltcGxlUGFydHMiLCJhcHBlbmQiLCJ0b1BhdGgiLCJub3JtYWxpemUiLCJyZXN1bHRUb2tlbnMiLCJwYXRoUGFydCIsInBvcCIsInRvQ3VycmVudEl0ZXJhdGlvbiIsInRvRWFjaEl0ZXJhdGlvbiIsInRvQWJzb2x1dGUiLCJnZXRBbGxQYXJlbnRQYXRocyIsInJlc3VsdCIsInNraXBMYXN0IiwidHJpbUxhc3RTdGFySWZMYXN0VG9rZW4iLCJsYXN0SXRlbSIsImxhc3QiLCJ1bmRlZmluZWQiLCJnZXRQYXJlbnRQYXRoIiwidG9BYnNvbHV0ZVBhdGgiLCJhcHBseUluc3RhbmNlc0RpcnR5IiwiaW5zdGFuY2VzIiwiaW5zdGFuY2VDb3VudGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEs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OztBQUNELFdBQU8rQyxNQUFNLENBQUNPLGNBQVAsRUFBUDtBQUNIOztBQUVNQyxFQUFBQSxtQkFBbUIsQ0FBQ0MsU0FBRCxFQUFrRDtBQUN4RSxXQUFPLE1BQU1ELG1CQUFOLENBQTBCQyxTQUExQixFQUFxQ1gsVUFBckMsRUFBUDtBQUNIOztBQXBDNEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCaW5kaW5nUGF0aCwgVmlld01vZGVsRmllbGROYW1lIH0gZnJvbSBcIi4uLy4uL0VuZ2luZS9zcmMvRW5naW5lL0NvcmUvQ29yZVR5cGVzXCI7XG5pbXBvcnQgeyBjb3VudCwgSXRlclV0aWxzLCByZXZlcnNlQXJyYXkgfSBmcm9tIFwiLi4vSXRlcmFibGVVdGlsc1wiO1xuaW1wb3J0IHsgZW5zdXJlQW5kR2V0U3RyaW5nLCByZWplY3QgfSBmcm9tIFwiLi4vVHlwaW5nVXRpbHNcIjtcblxuaW1wb3J0IHsgRWFjaEN1cnJlbnRDb2xsaXNpb24gfSBmcm9tIFwiLi9FYWNoQ3VycmVudENvbGxpc2lvblwiO1xuaW1wb3J0IHsgTW9kZWxQYXRoQnVpbGRlciB9IGZyb20gXCIuL01vZGVsUGF0aEJ1aWxkZXJcIjtcbmltcG9ydCB7IFBhdGhNYXRjaGVyLCBQYXRoTWF0Y2hpbmcgfSBmcm9tIFwiLi9QYXRoTWF0Y2hlclwiO1xuaW1wb3J0IHsgSUVxdWF0YWJsZSB9IGZyb20gXCIuL0lFcXVhdGFibGVcIjtcblxuY29uc3QgRWFjaFN5bWJvbCA9IFN5bWJvbC5mb3IoXCJfX0VBQ0hfX1wiKTtcbmNvbnN0IEN1cnJlbnRTeW1ib2wgPSBTeW1ib2wuZm9yKFwiX19DVVJSRU5UX19cIik7XG5cbmV4cG9ydCBjbGFzcyBQYXRoVG9rZW5zIHtcbiAgICBwdWJsaWMgc3RhdGljIGVhY2g6IHR5cGVvZiBFYWNoU3ltYm9sID0gRWFjaFN5bWJvbDtcbiAgICBwdWJsaWMgc3RhdGljIGN1cnJlbnQ6IHR5cGVvZiBDdXJyZW50U3ltYm9sID0gQ3VycmVudFN5bWJvbDtcblxuICAgIHB1YmxpYyBzdGF0aWMgaXNNdWx0aVRva2VuKHBhcnQ6IHVuZGVmaW5lZCB8IFBhdGhUb2tlbik6IHBhcnQgaXMgdHlwZW9mIEVhY2hTeW1ib2wgfCB0eXBlb2YgQ3VycmVudFN5bWJvbCB7XG4gICAgICAgIHJldHVybiBwYXJ0ID09PSBQYXRoVG9rZW5zLmVhY2ggfHwgcGFydCA9PT0gUGF0aFRva2Vucy5jdXJyZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNTaW1wbGVUb2tlbihwYXJ0OiB1bmRlZmluZWQgfCBQYXRoVG9rZW4pOiBwYXJ0IGlzIHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzSW5zdGFuY2VUb2tlbihwYXJ0OiB1bmRlZmluZWQgfCBQYXRoVG9rZW4pOiBwYXJ0IGlzIHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcZCskL2kudGVzdChwYXJ0KTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFNpbXBsZVBhdGhUb2tlbiA9IHN0cmluZztcblxuZXhwb3J0IHR5cGUgUGF0aFRva2VuID0gU2ltcGxlUGF0aFRva2VuIHwgdHlwZW9mIEVhY2hTeW1ib2wgfCB0eXBlb2YgQ3VycmVudFN5bWJvbDtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kZWxQYXRoKHBhdGg6IEJpbmRpbmdQYXRoIHwgTW9kZWxQYXRoKTogcGF0aCBpcyBNb2RlbFBhdGgge1xuICAgIHJldHVybiB0eXBlb2YgcGF0aCAhPT0gXCJzdHJpbmdcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0xlZ2FjeVBhdGgocGF0aDogQmluZGluZ1BhdGggfCBNb2RlbFBhdGgpOiBCaW5kaW5nUGF0aCB7XG4gICAgcmV0dXJuIGlzTW9kZWxQYXRoKHBhdGgpID8gcGF0aC50b0xlZ2FjeVBhdGgoKSA6IHBhdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9BYnNvbHV0TW9kZWxQYXRoKHBhdGg6IEJpbmRpbmdQYXRoIHwgQWJzb2x1dGVNb2RlbFBhdGgpOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIGlzTW9kZWxQYXRoKHBhdGgpID8gcGF0aCA6IEFic29sdXRlTW9kZWxQYXRoLmNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aCwgUGF0aFRva2Vucy5lYWNoKTtcbn1cblxuZXhwb3J0IGNsYXNzIEFic29sdXRlTW9kZWxGaWVsZFBhdGgge1xuICAgIHB1YmxpYyByZWFkb25seSBwYXRoOiBBYnNvbHV0ZU1vZGVsUGF0aDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmllbGQ6IFZpZXdNb2RlbEZpZWxkTmFtZSB8IFwiJGVycm9yQ291bnRcIiB8IFwiJHdhcm5pbmdDb3VudFwiO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGg6IEFic29sdXRlTW9kZWxQYXRoLCBmaWVsZE5hbWU6IFZpZXdNb2RlbEZpZWxkTmFtZSB8IFwiJGVycm9yQ291bnRcIiB8IFwiJHdhcm5pbmdDb3VudFwiKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZE5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRXF1YWxzKFxuICAgICAgICBtb2RlbFBhdGg6IEFic29sdXRlTW9kZWxGaWVsZFBhdGgsXG4gICAgICAgIGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWVcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0aC5pc0VxdWFscyhtb2RlbFBhdGgucGF0aCwgZWFjaEN1cnJlbnRDb2xsaXNpb24pICYmIHRoaXMuZmllbGQgPT09IG1vZGVsUGF0aC5maWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUZyb21TdHJpbmcocGF0aFdpdGhGaWVsZE5hbWU6IHN0cmluZyk6IEFic29sdXRlTW9kZWxGaWVsZFBhdGgge1xuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIuJGVycm9yQ291bnRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgICAgICBBYnNvbHV0ZU1vZGVsUGF0aC5jcmVhdGVBYnNvbHV0ZShwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLiRlcnJvckNvdW50XCIsIFwiXCIpKSxcbiAgICAgICAgICAgICAgICBcIiRlcnJvckNvdW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhXaXRoRmllbGROYW1lLmVuZHNXaXRoKFwiLiR3YXJuaW5nQ291bnRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgICAgICBBYnNvbHV0ZU1vZGVsUGF0aC5jcmVhdGVBYnNvbHV0ZShwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLiR3YXJuaW5nQ291bnRcIiwgXCJcIikpLFxuICAgICAgICAgICAgICAgIFwiJHdhcm5pbmdDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChBYnNvbHV0ZU1vZGVsUGF0aC5jcmVhdGVBYnNvbHV0ZShwYXRoV2l0aEZpZWxkTmFtZSksIFwidmFsdWVcIik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGcm9tTWFzayhwYXRoV2l0aEZpZWxkTmFtZTogc3RyaW5nLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxGaWVsZFBhdGgge1xuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIuJGVycm9yQ291bnRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgICAgICBBYnNvbHV0ZU1vZGVsUGF0aC5jcmVhdGVBYnNvbHV0ZUZyb21NYXNrKFxuICAgICAgICAgICAgICAgICAgICBwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLiRlcnJvckNvdW50XCIsIFwiXCIpLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWNpdHlTeW1ib2xcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIFwiJGVycm9yQ291bnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIuJHdhcm5pbmdDb3VudFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKFxuICAgICAgICAgICAgICAgIEFic29sdXRlTW9kZWxQYXRoLmNyZWF0ZUFic29sdXRlRnJvbU1hc2soXG4gICAgICAgICAgICAgICAgICAgIHBhdGhXaXRoRmllbGROYW1lLnJlcGxhY2UoXCIuJHdhcm5pbmdDb3VudFwiLCBcIlwiKSxcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGljaXR5U3ltYm9sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBcIiR3YXJuaW5nQ291bnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICBBYnNvbHV0ZU1vZGVsUGF0aC5jcmVhdGVBYnNvbHV0ZUZyb21NYXNrKHBhdGhXaXRoRmllbGROYW1lLCBtdWx0aXBsaWNpdHlTeW1ib2wpLFxuICAgICAgICAgICAgXCJ2YWx1ZVwiXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTW9kZWxQYXRoIGltcGxlbWVudHMgSUVxdWF0YWJsZTxNb2RlbFBhdGg+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRva2VuczogcmVhZG9ubHkgUGF0aFRva2VuW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBhYnNvbHV0ZTogYm9vbGVhbjtcbiAgICBwcml2YXRlIGxlZ2FjeVBhdGg6IHVuZGVmaW5lZCB8IHN0cmluZztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoUGFydHM6IHJlYWRvbmx5IFBhdGhUb2tlbltdLCBhYnNvbHV0ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnRva2VucyA9IHBhdGhQYXJ0cy5maWx0ZXIoeCA9PiB4ICE9PSBcIlwiKTtcbiAgICAgICAgdGhpcy5hYnNvbHV0ZSA9IGFic29sdXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW1wdHkoKTogTW9kZWxQYXRoIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgoW10sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGJ1aWxkZXIoZm9yY2VBYnNvbHV0ZTogYm9vbGVhbiA9IGZhbHNlKTogTW9kZWxQYXRoQnVpbGRlciB7XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoQnVpbGRlcihmb3JjZUFic29sdXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUZyb21TdHJpbmcocGF0aDogc3RyaW5nLCBhYnNvbHV0ZTogYm9vbGVhbiB8IFwiYXV0b1wiKTogTW9kZWxQYXRoIHtcbiAgICAgICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIik7XG4gICAgICAgIHRoaXMuZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eShwYXJ0UGFydFN0cmluZ3MpO1xuICAgICAgICBpZiAoYWJzb2x1dGUgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhYnNvbHV0ZSAmJiBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aChwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncywgYWJzb2x1dGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlRnJvbU1hc2socGF0aDogc3RyaW5nLCBhYnNvbHV0ZTogYm9vbGVhbiB8IFwiYXV0b1wiLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IE1vZGVsUGF0aCB7XG4gICAgICAgIGNvbnN0IHBhcnRQYXJ0U3RyaW5ncyA9IHBhdGguc3BsaXQoXCIvXCIpLm1hcCh4ID0+ICh4ID09PSBcIipcIiA/IG11bHRpcGxpY2l0eVN5bWJvbCA6IHgpKTtcbiAgICAgICAgaWYgKGFic29sdXRlID09PSBcImF1dG9cIikge1xuICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aChwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aChwYXJ0UGFydFN0cmluZ3MsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYWJzb2x1dGUgJiYgcGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgocGFydFBhcnRTdHJpbmdzLnNsaWNlKDEpLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aChwYXJ0UGFydFN0cmluZ3MsIGFic29sdXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGpvaW4oLi4ucGFydHM6IEFycmF5PE1vZGVsUGF0aCB8IFBhdGhUb2tlbiB8IFBhdGhUb2tlbltdPik6IE1vZGVsUGF0aCB7XG4gICAgICAgIGxldCBhYnNvbHV0ZSA9IGZhbHNlO1xuICAgICAgICBsZXQgcmVzdWx0UGFydHM6IFBhdGhUb2tlbltdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgam9pbkl0ZW0gb2YgcGFydHMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygam9pbkl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKGpvaW5JdGVtKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoam9pbkl0ZW0gaW5zdGFuY2VvZiBNb2RlbFBhdGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoam9pbkl0ZW0uaXNBYnNvbHV0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFic29sdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0UGFydHMgPSBbLi4uam9pbkl0ZW0udG9rZW5zXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKC4uLmpvaW5JdGVtLnRva2Vucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpvaW5JdGVtKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goLi4uam9pbkl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChQYXRoVG9rZW5zLmlzTXVsdGlUb2tlbihqb2luSXRlbSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKGpvaW5JdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHJlc3VsdFBhcnRzLCBhYnNvbHV0ZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICBpZiAocGFydHMuc29tZSh4ID0+IHggPT09IFwiKlwiKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aCBtdXN0IG5vdCBjb250YWluICogc3ltYm9sXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhdGhQYXJ0cygpOiBJdGVyYWJsZTxQYXRoVG9rZW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXRoUGFydHNBc0FycmF5KCk6IHJlYWRvbmx5IFBhdGhUb2tlbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyAqZ2V0U2ltcGxlVG9rZW5zU3RyaWN0KCk6IEl0ZXJhYmxlPFNpbXBsZVBhdGhUb2tlbj4ge1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRoaXMudG9rZW5zKSB7XG4gICAgICAgICAgICBpZiAoIVBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG11c3Qgbm90IGNvbnRhaW4gc3BlYyB0b2tlbnNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCB0b2tlbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTaW1wbGVUb2tlbnNBc0FycmF5U3RyaWN0KCk6IHJlYWRvbmx5IFNpbXBsZVBhdGhUb2tlbltdIHtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0aGlzLnRva2Vucykge1xuICAgICAgICAgICAgaWYgKCFQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aCBtdXN0IG5vdCBjb250YWluIHNwZWMgdG9rZW5zXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vINCf0YDQvtCy0LXRgNC60LAg0LLRi9GI0LUg0LPQsNGA0LDQtdC90YLQuNGA0YPQtdGCINGH0YLQviDQsdGD0LTRg9GCINGC0L7Qu9GM0LrQviBTaW1wbGVQYXRoVG9rZW4uXG4gICAgICAgIC8vINCS0YHQtSBtYXAg0LggZmlsdGVyINGD0LHRgNCw0L3RiyDQtNC70Y8g0L/RgNC+0LjQt9Cy0L7QtNC40YLQtdC70YzQvdC+0YHRgtC4XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxNb2RlbFBhdGggfCBQYXRoVG9rZW4+KTogTW9kZWxQYXRoIHtcbiAgICAgICAgcmV0dXJuIE1vZGVsUGF0aC5qb2luKHRoaXMsIC4uLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Jlc29sdmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuZXZlcnkoUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzb2x2ZUFsbChpbnN0YW5jZTogc3RyaW5nKTogTW9kZWxQYXRoIHtcbiAgICAgICAgY29uc3QgdG9rZW5zID0gdGhpcy50b2tlbnMubWFwKHRva2VuID0+IHtcbiAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHRva2VucywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29udGFpbkl0ZXJhdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNvbWUoeCA9PiB4ID09PSBQYXRoVG9rZW5zLmVhY2gpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NvbnRhaW5DdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc29tZSh4ID0+IHggPT09IFBhdGhUb2tlbnMuY3VycmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQWJzb2x1dGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFic29sdXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuYWJzb2x1dGUgPyBcIi9cIiA6IFwiXCIpICsgdGhpcy50b2tlbnMubWFwKHggPT4gdGhpcy5wYXRoUGFydFRvU3RyaW5nKHgpKS5qb2luKFwiL1wiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9MZWdhY3lQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZ2FjeVBhdGggPz8gKHRoaXMubGVnYWN5UGF0aCA9IHRoaXMudG9rZW5zLm1hcCh4ID0+IHRoaXMucGF0aFBhcnRUb1N0cmluZyh4KSkuam9pbihcIi9cIikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFscyhcbiAgICAgICAgbW9kZWxQYXRoOiBNb2RlbFBhdGgsXG4gICAgICAgIGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWVcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGVhY2hDdXJyZW50Q29sbGlzaW9uID09PSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVTYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0xlZ2FjeVBhdGgoKSA9PT0gbW9kZWxQYXRoLnRvTGVnYWN5UGF0aCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmlzQWJzb2x1dGUoKSA9PT0gbW9kZWxQYXRoLmlzQWJzb2x1dGUoKSAmJlxuICAgICAgICAgICAgICAgIEl0ZXJhdG9yLmZyb20oSXRlclV0aWxzLnppcCh0aGlzLmdldFBhdGhQYXJ0cygpLCBtb2RlbFBhdGguZ2V0UGF0aFBhcnRzKCkpKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgKFt0MSwgdDJdKSA9PiB0MSA9PT0gdDJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRgdC10LPQtNCwINGG0LXQu9C+0LUg0L/QvtC70L7QttC40YLQtdC70YzQvdC+0LUg0LHQtdC30LfQvdCw0LrQvtCy0L7QtSAzMi3QsdC40YLQvdC+0LUg0YfQuNGB0LvQvlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIYXNoKGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWUpOiBudW1iZXIge1xuICAgICAgICBsZXQgaGFzaCA9IDUzODE7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgcmV2ZXJzZUFycmF5KHRoaXMudG9rZW5zKSkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRTdHI6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFN0ciA9IHRva2VuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZWFjaEN1cnJlbnRDb2xsaXNpb24gPT09IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZURpZmZlcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RyID0gdG9rZW4gPT09IFBhdGhUb2tlbnMuZWFjaCA/IFwiKlwiIDogXCIhXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ciA9IFwiKlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzdHJpbmdJbmRleCA9IGN1cnJlbnRTdHIubGVuZ3RoO1xuICAgICAgICAgICAgd2hpbGUgKHN0cmluZ0luZGV4KSB7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgICAgICAgICBoYXNoID0gKGhhc2ggKiAzMykgXiBjdXJyZW50U3RyLmNoYXJDb2RlQXQoLS1zdHJpbmdJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgICAgdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgICAgIEphdmFTY3JpcHQgZG9lcyBiaXR3aXNlIG9wZXJhdGlvbnMgKGxpa2UgWE9SLCBhYm92ZSkgb24gMzItYml0IHNpZ25lZFxuICAgICAgICAgICAgaW50ZWdlcnMuIFNpbmNlIHdlIHdhbnQgdGhlIHJlc3VsdHMgdG8gYmUgYWx3YXlzIHBvc2l0aXZlLCBjb252ZXJ0IHRoZVxuICAgICAgICAgICAgc2lnbmVkIGludCB0byBhbiB1bnNpZ25lZCBieSBkb2luZyBhbiB1bnNpZ25lZCBiaXRzaGlmdC5cbiAgICAgICovXG4gICAgICAgIHJldHVybiBoYXNoID4+PiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0luY2x1ZGVzKG1vZGVsUGF0aDogTW9kZWxQYXRoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggIT09IG1vZGVsUGF0aC50b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGVmdFBhcnQgPSB0aGlzLnRva2Vuc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0UGFydCA9IG1vZGVsUGF0aC50b2tlbnNbaV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGxlZnRQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByaWdodFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnRQYXJ0ICE9PSByaWdodFBhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0UGFydCA9PT0gUGF0aFRva2Vucy5jdXJyZW50IHx8IGxlZnRQYXJ0ID09PSBQYXRoVG9rZW5zLmVhY2gpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJpZ2h0UGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKE51bWJlcihyaWdodFBhcnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyaWdodFBhcnQgIT09IFBhdGhUb2tlbnMuY3VycmVudCAmJiByaWdodFBhcnQgIT09IFBhdGhUb2tlbnMuZWFjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlcmF0aW9uUmFuaygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gY291bnQoSXRlcmF0b3IuZnJvbSh0aGlzLnRva2VucykuZmlsdGVyKHggPT4geCA9PT0gUGF0aFRva2Vucy5lYWNoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIG1hdGNoRm9yKG1vZGVsUGF0aDogTW9kZWxQYXRoKTogUGF0aE1hdGNoaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQWJzb2x1dGUoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbWF0Y2ggbm9uIGFic29sdXRlIHBhdGggJyR7dGhpcy50b1N0cmluZygpfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1vZGVsUGF0aC5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1hdGNoIG5vbiBhYnNvbHV0ZSBwYXRoICcke21vZGVsUGF0aC50b1N0cmluZygpfSdgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUGF0aE1hdGNoZXIubWF0Y2godGhpcy50b2tlbnMsIG1vZGVsUGF0aC50b2tlbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqc3BsaXRCeU11bHRpcGxpY2l0eSgpOiBJdGVyYWJsZTxNb2RlbFBhdGggfCB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sPiB7XG4gICAgICAgIGxldCBsYXN0U2ltcGxlUGFydHMgPSBNb2RlbFBhdGguYnVpbGRlcih0aGlzLmlzQWJzb2x1dGUoKSk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgbGFzdFNpbXBsZVBhcnRzLmFwcGVuZCh0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghbGFzdFNpbXBsZVBhcnRzLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGxhc3RTaW1wbGVQYXJ0cy50b1BhdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFNpbXBsZVBhcnRzID0gTW9kZWxQYXRoLmJ1aWxkZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeWllbGQgdG9rZW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsYXN0U2ltcGxlUGFydHMuZW1wdHkpIHtcbiAgICAgICAgICAgIHlpZWxkIGxhc3RTaW1wbGVQYXJ0cy50b1BhdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBub3JtYWxpemUoKTogTW9kZWxQYXRoIHtcbiAgICAgICAgY29uc3QgcmVzdWx0VG9rZW5zOiBQYXRoVG9rZW5bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBhdGhQYXJ0IG9mIHRoaXMudG9rZW5zKSB7XG4gICAgICAgICAgICBpZiAocGF0aFBhcnQgPT09IFwiLi5cIikge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0VG9rZW5zLnBvcCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQWJzb2x1dGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIGlzIGludmFsaWQgJyR7dGhpcy50b1N0cmluZygpfSdgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFRva2Vucy5wdXNoKFwiLi5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwYXRoUGFydCA9PT0gXCIuXCIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdFRva2Vucy5wdXNoKHBhdGhQYXJ0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aChyZXN1bHRUb2tlbnMsIHRoaXMuaXNBYnNvbHV0ZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSDQodC/0LXRhtC40YTQuNC60LDRgtC+0YDRiyDQvNC90L7QttC10YHRgtCy0LXQvdC90L7RgdGC0LggRWFjaCDQt9Cw0LzQtdC90Y/QtdGCINC90LAgQ3VycmVudFxuICAgICAqL1xuICAgIHB1YmxpYyB0b0N1cnJlbnRJdGVyYXRpb24oKTogTW9kZWxQYXRoIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgoXG4gICAgICAgICAgICB0aGlzLnRva2Vucy5tYXAoeCA9PiAoeCA9PT0gUGF0aFRva2Vucy5lYWNoID8gUGF0aFRva2Vucy5jdXJyZW50IDogeCkpLFxuICAgICAgICAgICAgdGhpcy5pc0Fic29sdXRlKClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9FYWNoSXRlcmF0aW9uKCk6IE1vZGVsUGF0aCB7XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKFxuICAgICAgICAgICAgdGhpcy50b2tlbnMubWFwKHggPT4gKHggPT09IFBhdGhUb2tlbnMuY3VycmVudCA/IFBhdGhUb2tlbnMuZWFjaCA6IHgpKSxcbiAgICAgICAgICAgIHRoaXMuaXNBYnNvbHV0ZSgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvQWJzb2x1dGUoKTogQWJzb2x1dGVNb2RlbFBhdGgge1xuICAgICAgICBpZiAoIXRoaXMuYWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAnJHt0aGlzLnRvTGVnYWN5UGF0aCgpfSBpcyBub3QgYWJzb2x1dGUnYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsUGF0aCh0aGlzLnRva2Vucyk7XG4gICAgfVxuXG4gICAgcHVibGljICpnZXRBbGxQYXJlbnRQYXRocygpOiBJdGVyYWJsZTxNb2RlbFBhdGg+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gTW9kZWxQYXRoLmJ1aWxkZXIodGhpcy5pc0Fic29sdXRlKCkpO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIEl0ZXJVdGlscy5za2lwTGFzdCh0aGlzLmdldFBhdGhQYXJ0cygpLCAxKSkge1xuICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgICAgICB5aWVsZCByZXN1bHQudG9QYXRoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpbUxhc3RTdGFySWZMYXN0VG9rZW4oKTogTW9kZWxQYXRoIHtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBJdGVyVXRpbHMubGFzdCh0aGlzLnRva2Vucyk7XG4gICAgICAgIGlmIChsYXN0SXRlbSAhPSB1bmRlZmluZWQgJiYgUGF0aFRva2Vucy5pc011bHRpVG9rZW4obGFzdEl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aCh0aGlzLnRva2Vucy5zbGljZSgwLCAtMSksIHRoaXMuYWJzb2x1dGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJlbnRQYXRoKCk6IE1vZGVsUGF0aCB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE1vZGVsUGF0aC5idWlsZGVyKHRoaXMuaXNBYnNvbHV0ZSgpKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBJdGVyVXRpbHMuc2tpcExhc3QodGhpcy5nZXRQYXRoUGFydHMoKSwgMSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudG9BYnNvbHV0ZVBhdGgoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXBwbHlJbnN0YW5jZXNEaXJ0eShpbnN0YW5jZXM6IFNpbXBsZVBhdGhUb2tlbltdKTogTW9kZWxQYXRoIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNvbHZlZCgpIHx8IGluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbnN0YW5jZUNvdW50ZXIgPSAwO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBNb2RlbFBhdGguYnVpbGRlcigpO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRoaXMuZ2V0UGF0aFBhcnRzKCkpIHtcbiAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzTXVsdGlUb2tlbih0b2tlbikgJiYgaW5zdGFuY2VDb3VudGVyIDwgaW5zdGFuY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaW5zdGFuY2VzW2luc3RhbmNlQ291bnRlcl0gPz8gcmVqZWN0KCkpO1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnRlcisrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnRvQWJzb2x1dGVQYXRoKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXRoUGFydFRvU3RyaW5nKHBhdGhQYXJ0OiBQYXRoVG9rZW4pOiBzdHJpbmcge1xuICAgICAgICBpZiAodHlwZW9mIHBhdGhQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aFBhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBQYXRoVG9rZW5zLmVhY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBcIipcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQgPT09IFBhdGhUb2tlbnMuY3VycmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiKlwiO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXRoIHBhcnQgc3BlY2lmaWVkOiAke2Vuc3VyZUFuZEdldFN0cmluZyhwYXRoUGFydCl9YCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWJzb2x1dGVNb2RlbFBhdGggZXh0ZW5kcyBNb2RlbFBhdGgge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoUGFydHM6IHJlYWRvbmx5IFBhdGhUb2tlbltdKSB7XG4gICAgICAgIHN1cGVyKHBhdGhQYXJ0cywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVBYnNvbHV0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgbXVsdGlwbGljaXR5U3ltYm9sOiBQYXRoVG9rZW4pOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoeCA9PiAoeCA9PT0gXCIqXCIgPyBtdWx0aXBsaWNpdHlTeW1ib2wgOiB4KSk7XG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsUGF0aChwYXJ0UGFydFN0cmluZ3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlQWJzb2x1dGUocGF0aDogc3RyaW5nKTogQWJzb2x1dGVNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgdGhpcy5lbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsUGF0aChwYXJ0UGFydFN0cmluZ3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBqb2luV2l0aChwYXRoOiBNb2RlbFBhdGggfCBQYXRoVG9rZW4pOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgICAgIHJldHVybiBzdXBlci5qb2luV2l0aChwYXRoKS50b0Fic29sdXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmVudFBhdGgoKTogQWJzb2x1dGVNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBNb2RlbFBhdGguYnVpbGRlcih0cnVlKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBJdGVyVXRpbHMuc2tpcExhc3QodGhpcy5nZXRQYXRoUGFydHMoKSwgMSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudG9BYnNvbHV0ZVBhdGgoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXBwbHlJbnN0YW5jZXNEaXJ0eShpbnN0YW5jZXM6IFNpbXBsZVBhdGhUb2tlbltdKTogQWJzb2x1dGVNb2RlbFBhdGgge1xuICAgICAgICByZXR1cm4gc3VwZXIuYXBwbHlJbnN0YW5jZXNEaXJ0eShpbnN0YW5jZXMpLnRvQWJzb2x1dGUoKTtcbiAgICB9XG59XG4iXX0=
597
+ exports.ModelPathImpl = ModelPathImpl;
598
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL0NvbW1vbi9Nb2RlbFBhdGgvTW9kZWxQYXRoLnRzIl0sIm5hbWVzIjpbIkVhY2hTeW1ib2wiLCJTeW1ib2wiLCJmb3IiLCJDdXJyZW50U3ltYm9sIiwiUGF0aFRva2VucyIsImlzTXVsdGlUb2tlbiIsInBhcnQiLCJlYWNoIiwiY3VycmVudCIsImlzU2ltcGxlVG9rZW4iLCJpc0luc3RhbmNlVG9rZW4iLCJ0ZXN0IiwiaXNNb2RlbFBhdGgiLCJwYXRoIiwiTW9kZWxQYXRoSW1wbCIsImNvbnZlcnRUb0xlZ2FjeVBhdGgiLCJ0b0xlZ2FjeVBhdGgiLCJjb252ZXJ0VG9BYnNvbHV0TW9kZWxQYXRoIiwiY3JlYXRlQWJzb2x1dGVGcm9tTWFzayIsImVtcHR5TW9kZWxQYXRoIiwiZW1wdHlBYnNvbHV0ZU1vZGVsUGF0aCIsImNyZWF0ZU1vZGVsUGF0aCIsImFic29sdXRlIiwicGFydFBhcnRTdHJpbmdzIiwic3BsaXQiLCJlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5Iiwic3RhcnRzV2l0aCIsInNsaWNlIiwiY3JlYXRlRnJvbU1hc2siLCJtdWx0aXBsaWNpdHlTeW1ib2wiLCJtYXAiLCJ4IiwicGFydHMiLCJzb21lIiwiRXJyb3IiLCJjcmVhdGVBYnNvbHV0ZSIsImNyZWF0ZVJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGgiLCJjcmVhdGVBYnNvbHV0ZUZyb21Ub2tlbnMiLCJ0b2tlbnMiLCJjcmVhdGVBYnNvbHV0ZVJlc29sdmVkRnJvbVRva2VucyIsImNyZWF0ZVJlbGF0aXZlRnJvbVRva2VucyIsImpvaW5Nb2RlbFBhdGhzIiwicmVzdWx0UGFydHMiLCJqb2luSXRlbSIsInB1c2giLCJpc0Fic29sdXRlIiwiZ2V0UGF0aFBhcnRzQXNBcnJheSIsIkFycmF5IiwiaXNBcnJheSIsIkFic29sdXRlTW9kZWxGaWVsZFBhdGgiLCJjb25zdHJ1Y3RvciIsImZpZWxkTmFtZSIsImZpZWxkIiwiaXNFcXVhbHMiLCJtb2RlbFBhdGgiLCJlYWNoQ3VycmVudENvbGxpc2lvbiIsIkVhY2hDdXJyZW50Q29sbGlzaW9uIiwiQXJlU2FtZSIsImNyZWF0ZUZyb21TdHJpbmciLCJwYXRoV2l0aEZpZWxkTmFtZSIsImVuZHNXaXRoIiwicmVwbGFjZSIsImlzQWxsVG9rZW5zUmVzb2x2ZWQiLCJldmVyeSIsInBhdGhQYXJ0cyIsImxlZ2FjeVBhdGgiLCJmaWx0ZXIiLCJyZXNvbHZlZCIsImdldFBhdGhQYXJ0cyIsImdldFNpbXBsZVRva2Vuc1N0cmljdCIsInRva2VuIiwiZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCIsImpvaW5XaXRoIiwiaXNSZXNvbHZlZCIsInJlc29sdmVBbGwiLCJpbnN0YW5jZSIsImlzQ29udGFpbkl0ZXJhdGlvbiIsImlzQ29udGFpbkN1cnJlbnRJdGVyYXRpb24iLCJnZXRMYXN0TGlzdFBhdGgiLCJsYXN0SXRlcmF0aW9uSW5kZXgiLCJsYXN0SW5kZXhPZiIsInRvU3RyaW5nIiwibGVuZ3RoIiwicGF0aFBhcnRUb1N0cmluZyIsImpvaW4iLCJJdGVyYXRvciIsImZyb20iLCJJdGVyVXRpbHMiLCJ6aXAiLCJ0MSIsInQyIiwiZ2V0SGFzaCIsImhhc2giLCJjdXJyZW50U3RyIiwiQXJlRGlmZmVyZW50Iiwic3RyaW5nSW5kZXgiLCJjaGFyQ29kZUF0IiwiaXNJbmNsdWRlcyIsInRhcmdldFRva2VucyIsImkiLCJsZWZ0UGFydCIsInJpZ2h0UGFydCIsImlzRmluaXRlIiwiTnVtYmVyIiwiZ2V0SXRlcmF0aW9uUmFuayIsImlzRW1wdHkiLCJtYXRjaEZvciIsIlBhdGhNYXRjaGVyIiwibWF0Y2giLCJzcGxpdEJ5TXVsdGlwbGljaXR5IiwibGFzdFNpbXBsZVBhcnRzIiwiTW9kZWxQYXRoQnVpbGRlciIsImFwcGVuZCIsImVtcHR5IiwidG9SZXNvbHZlZFBhdGgiLCJub3JtYWxpemUiLCJyZXN1bHRUb2tlbnMiLCJwYXRoUGFydCIsInBvcCIsInRvQ3VycmVudEl0ZXJhdGlvbiIsInRvRWFjaEl0ZXJhdGlvbiIsInRvQWJzb2x1dGUiLCJnZXRBbGxQYXJlbnRQYXRocyIsInJlc3VsdCIsInNraXBMYXN0IiwidG9QYXRoIiwidHJpbUxhc3RTdGFySWZMYXN0VG9rZW4iLCJsYXN0SXRlbSIsImxhc3QiLCJ1bmRlZmluZWQiLCJnZXRQYXJlbnRQYXRoIiwiYXBwbHlJbnN0YW5jZXNEaXJ0eSIsImluc3RhbmNlcyIsImluc3RhbmNlQ291bnRlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsVUFBVSxHQUFHQyxNQUFNLENBQUNDLEdBQVAsQ0FBVyxVQUFYLENBQW5CO0FBQ0EsTUFBTUMsYUFBYSxHQUFHRixNQUFNLENBQUNDLEdBQVAsQ0FBVyxhQUFYLENBQXRCOztBQUVPLE1BQU1FLFVBQU4sQ0FBaUI7QUFJTSxTQUFaQyxZQUFZLENBQUNDLElBQUQsRUFBZ0Y7QUFDdEcsV0FBT0EsSUFBSSxLQUFLRixVQUFVLENBQUNHLElBQXBCLElBQTRCRCxJQUFJLEtBQUtGLFVBQVUsQ0FBQ0ksT0FBdkQ7QUFDSDs7QUFFMEIsU0FBYkMsYUFBYSxDQUFDSCxJQUFELEVBQThDO0FBQ3JFLFdBQU8sT0FBT0EsSUFBUCxLQUFnQixRQUF2QjtBQUNIOztBQUU0QixTQUFmSSxlQUFlLENBQUNKLElBQUQsRUFBOEM7QUFDdkUsV0FBTyxPQUFPQSxJQUFQLEtBQWdCLFFBQWhCLElBQTRCLFNBQVNLLElBQVQsQ0FBY0wsSUFBZCxDQUFuQztBQUNIOztBQWRtQjs7O0FBQVhGLFUsQ0FDS0csSSxHQUEwQlAsVTtBQUQvQkksVSxDQUVLSSxPLEdBQWdDTCxhOztBQW1CM0MsU0FBU1MsV0FBVCxDQUFxQkMsSUFBckIsRUFBaUY7QUFDcEYsU0FBTyxPQUFPQSxJQUFQLEtBQWdCLFFBQWhCLElBQTRCQSxJQUFJLFlBQVlDLGFBQW5EO0FBQ0g7O0FBRU0sU0FBU0MsbUJBQVQsQ0FBNkJGLElBQTdCLEVBQXlFO0FBQzVFLFNBQU9ELFdBQVcs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QUFDckMsVUFBSWhFLFVBQVUsQ0FBQ0MsWUFBWCxDQUF3QmlFLEtBQXhCLEtBQWtDK0QsZUFBZSxHQUFHRCxTQUFTLENBQUNsRCxNQUFsRSxFQUEwRTtBQUFBOztBQUN0RXlDLFFBQUFBLE1BQU0sQ0FBQ1gsTUFBUCwwQkFBY29CLFNBQVMsQ0FBQ0MsZUFBRCxDQUF2Qix5RUFBNEMsMEJBQTVDO0FBQ0FBLFFBQUFBLGVBQWU7QUFDbEIsT0FIRCxNQUdPO0FBQ0hWLFFBQUFBLE1BQU0sQ0FBQ1gsTUFBUCxDQUFjMUMsS0FBZDtBQUNIO0FBQ0osS0Fic0YsQ0FjdkY7QUFDQTs7O0FBQ0EsV0FBT3FELE1BQU0sQ0FBQ0UsTUFBUCxFQUFQO0FBQ0g7O0FBRU8xQyxFQUFBQSxnQkFBZ0IsQ0FBQ2tDLFFBQUQsRUFBOEI7QUFDbEQsUUFBSSxPQUFPQSxRQUFQLEtBQW9CLFFBQXhCLEVBQWtDO0FBQzlCLGFBQU9BLFFBQVA7QUFDSDs7QUFDRCxRQUFJQSxRQUFRLEtBQUtqSCxVQUFVLENBQUNHLElBQTVCLEVBQWtDO0FBQzlCLGFBQU8sR0FBUDtBQUNIOztBQUNELFFBQUk4RyxRQUFRLEtBQUtqSCxVQUFVLENBQUNJLE9BQTVCLEVBQXFDO0FBQ2pDLGFBQU8sR0FBUDtBQUNIOztBQUNELFVBQU0sSUFBSTBCLEtBQUosQ0FBVyxnQ0FBK0IscUNBQW1CbUYsUUFBbkIsQ0FBNkIsRUFBdkUsQ0FBTjtBQUNIOztBQS9VTCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJpbmRpbmdQYXRoLCBWaWV3TW9kZWxGaWVsZE5hbWUgfSBmcm9tIFwiLi4vLi4vRW5naW5lL3NyYy9FbmdpbmUvQ29yZS9Db3JlVHlwZXNcIjtcbmltcG9ydCB7IGNvdW50LCBJdGVyVXRpbHMsIHJldmVyc2VBcnJheSB9IGZyb20gXCIuLi9JdGVyYWJsZVV0aWxzXCI7XG5pbXBvcnQgeyBlbnN1cmVBbmRHZXRTdHJpbmcsIHJlamVjdCB9IGZyb20gXCIuLi9UeXBpbmdVdGlsc1wiO1xuXG5pbXBvcnQgeyBFYWNoQ3VycmVudENvbGxpc2lvbiB9IGZyb20gXCIuL0VhY2hDdXJyZW50Q29sbGlzaW9uXCI7XG5pbXBvcnQgeyBNb2RlbFBhdGhCdWlsZGVyIH0gZnJvbSBcIi4vTW9kZWxQYXRoQnVpbGRlclwiO1xuaW1wb3J0IHsgUGF0aE1hdGNoZXIsIFBhdGhNYXRjaGluZyB9IGZyb20gXCIuL1BhdGhNYXRjaGVyXCI7XG5pbXBvcnQgeyBJRXF1YXRhYmxlIH0gZnJvbSBcIi4vSUVxdWF0YWJsZVwiO1xuXG5jb25zdCBFYWNoU3ltYm9sID0gU3ltYm9sLmZvcihcIl9fRUFDSF9fXCIpO1xuY29uc3QgQ3VycmVudFN5bWJvbCA9IFN5bWJvbC5mb3IoXCJfX0NVUlJFTlRfX1wiKTtcblxuZXhwb3J0IGNsYXNzIFBhdGhUb2tlbnMge1xuICAgIHB1YmxpYyBzdGF0aWMgZWFjaDogdHlwZW9mIEVhY2hTeW1ib2wgPSBFYWNoU3ltYm9sO1xuICAgIHB1YmxpYyBzdGF0aWMgY3VycmVudDogdHlwZW9mIEN1cnJlbnRTeW1ib2wgPSBDdXJyZW50U3ltYm9sO1xuXG4gICAgcHVibGljIHN0YXRpYyBpc011bHRpVG9rZW4ocGFydDogdW5kZWZpbmVkIHwgUGF0aFRva2VuKTogcGFydCBpcyB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sIHtcbiAgICAgICAgcmV0dXJuIHBhcnQgPT09IFBhdGhUb2tlbnMuZWFjaCB8fCBwYXJ0ID09PSBQYXRoVG9rZW5zLmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc1NpbXBsZVRva2VuKHBhcnQ6IHVuZGVmaW5lZCB8IFBhdGhUb2tlbik6IHBhcnQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNJbnN0YW5jZVRva2VuKHBhcnQ6IHVuZGVmaW5lZCB8IFBhdGhUb2tlbik6IHBhcnQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiICYmIC9eXFxkKyQvaS50ZXN0KHBhcnQpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgU2ltcGxlUGF0aFRva2VuID0gc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBQYXRoVG9rZW4gPSBTaW1wbGVQYXRoVG9rZW4gfCB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbFBhdGgocGF0aDogQmluZGluZ1BhdGggfCBNb2RlbFBhdGggfCB1bmtub3duKTogcGF0aCBpcyBNb2RlbFBhdGgge1xuICAgIHJldHVybiB0eXBlb2YgcGF0aCAhPT0gXCJzdHJpbmdcIiAmJiBwYXRoIGluc3RhbmNlb2YgTW9kZWxQYXRoSW1wbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0xlZ2FjeVBhdGgocGF0aDogQmluZGluZ1BhdGggfCBNb2RlbFBhdGgpOiBCaW5kaW5nUGF0aCB7XG4gICAgcmV0dXJuIGlzTW9kZWxQYXRoKHBhdGgpID8gcGF0aC50b0xlZ2FjeVBhdGgoKSA6IHBhdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9BYnNvbHV0TW9kZWxQYXRoPFIgZXh0ZW5kcyBib29sZWFuLCBBIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcGF0aDogQmluZGluZ1BhdGggfCBJTW9kZWxQYXRoPFIsIEE+XG4pOiBJTW9kZWxQYXRoPFIsIHRydWU+O1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0Fic29sdXRNb2RlbFBhdGgocGF0aDogQmluZGluZ1BhdGggfCBBYnNvbHV0ZU1vZGVsUGF0aCk6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gaXNNb2RlbFBhdGgocGF0aCkgPyBwYXRoIDogY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoLCBQYXRoVG9rZW5zLmVhY2gpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlNb2RlbFBhdGgoKTogUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIGZhbHNlPihbXSwgZmFsc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlBYnNvbHV0ZU1vZGVsUGF0aCgpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgdHJ1ZT4oW10sIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IHRydWUpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsUGF0aChwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBmYWxzZSk6IFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IFwiYXV0b1wiKTogUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IGJvb2xlYW4gfCBcImF1dG9cIik6IFJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgaWYgKGFic29sdXRlID09PSBcImF1dG9cIikge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgZmFsc2U+KHBhcnRQYXJ0U3RyaW5ncywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhYnNvbHV0ZSAmJiBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgYm9vbGVhbj4ocGFydFBhcnRTdHJpbmdzLCBhYnNvbHV0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiB0cnVlLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IGZhbHNlLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IFJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IFwiYXV0b1wiLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IE1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuIHwgXCJhdXRvXCIsIG11bHRpcGxpY2l0eVN5bWJvbDogUGF0aFRva2VuKTogTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoeCA9PiAoeCA9PT0gXCIqXCIgPyBtdWx0aXBsaWNpdHlTeW1ib2wgOiB4KSk7XG4gICAgaWYgKGFic29sdXRlID09PSBcImF1dG9cIikge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocGFydFBhcnRTdHJpbmdzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFic29sdXRlICYmIHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3MsIGFic29sdXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aDogc3RyaW5nLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoeCA9PiAoeCA9PT0gXCIqXCIgPyBtdWx0aXBsaWNpdHlTeW1ib2wgOiB4KSk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3MsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmIChwYXJ0cy5zb21lKHggPT4geCA9PT0gXCIqXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiAqIHN5bWJvbFwiKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYnNvbHV0ZShwYXRoOiBzdHJpbmcpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3MsIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aChwYXRoOiBzdHJpbmcpOiBSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIGZhbHNlPihwYXJ0UGFydFN0cmluZ3MsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlRnJvbVRva2Vucyh0b2tlbnM6IFBhdGhUb2tlbltdKTogQWJzb2x1dGVNb2RlbFBhdGgge1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxmYWxzZSwgdHJ1ZT4odG9rZW5zLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlUmVzb2x2ZWRGcm9tVG9rZW5zKHRva2Vuczogc3RyaW5nW10pOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHRva2Vucyk7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHRva2VucywgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWxhdGl2ZUZyb21Ub2tlbnModG9rZW5zOiByZWFkb25seSBzdHJpbmdbXSk6IFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVGcm9tVG9rZW5zKHRva2VuczogcmVhZG9ubHkgUGF0aFRva2VuW10pOiBSZWxhdGl2ZU1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWxhdGl2ZUZyb21Ub2tlbnModG9rZW5zOiByZWFkb25seSBQYXRoVG9rZW5bXSk6IFJlbGF0aXZlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8ZmFsc2UsIGZhbHNlPih0b2tlbnMsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvaW5Nb2RlbFBhdGhzKC4uLnBhcnRzOiBBcnJheTxNb2RlbFBhdGggfCBQYXRoVG9rZW4gfCBQYXRoVG9rZW5bXT4pOiBNb2RlbFBhdGgge1xuICAgIGxldCBhYnNvbHV0ZSA9IGZhbHNlO1xuICAgIGxldCByZXN1bHRQYXJ0czogUGF0aFRva2VuW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGpvaW5JdGVtIG9mIHBhcnRzKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygam9pbkl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goam9pbkl0ZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTW9kZWxQYXRoKGpvaW5JdGVtKSkge1xuICAgICAgICAgICAgaWYgKGpvaW5JdGVtLmlzQWJzb2x1dGUoKSkge1xuICAgICAgICAgICAgICAgIGFic29sdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cyA9IFsuLi5qb2luSXRlbS5nZXRQYXRoUGFydHNBc0FycmF5KCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKC4uLmpvaW5JdGVtLmdldFBhdGhQYXJ0c0FzQXJyYXkoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqb2luSXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goLi4uam9pbkl0ZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKGpvaW5JdGVtKSkge1xuICAgICAgICAgICAgcmVzdWx0UGFydHMucHVzaChqb2luSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocmVzdWx0UGFydHMsIGFic29sdXRlKTtcbn1cblxuZXhwb3J0IGNsYXNzIEFic29sdXRlTW9kZWxGaWVsZFBhdGgge1xuICAgIHB1YmxpYyByZWFkb25seSBwYXRoOiBBYnNvbHV0ZU1vZGVsUGF0aDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmllbGQ6IFZpZXdNb2RlbEZpZWxkTmFtZSB8IFwiJGVycm9yQ291bnRcIiB8IFwiJHdhcm5pbmdDb3VudFwiO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGg6IEFic29sdXRlTW9kZWxQYXRoLCBmaWVsZE5hbWU6IFZpZXdNb2RlbEZpZWxkTmFtZSB8IFwiJGVycm9yQ291bnRcIiB8IFwiJHdhcm5pbmdDb3VudFwiKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZE5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRXF1YWxzKFxuICAgICAgICBtb2RlbFBhdGg6IEFic29sdXRlTW9kZWxGaWVsZFBhdGgsXG4gICAgICAgIGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWVcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0aC5pc0VxdWFscyhtb2RlbFBhdGgucGF0aCwgZWFjaEN1cnJlbnRDb2xsaXNpb24pICYmIHRoaXMuZmllbGQgPT09IG1vZGVsUGF0aC5maWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUZyb21TdHJpbmcocGF0aFdpdGhGaWVsZE5hbWU6IHN0cmluZyk6IEFic29sdXRlTW9kZWxGaWVsZFBhdGgge1xuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIuJGVycm9yQ291bnRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgICAgICBjcmVhdGVBYnNvbHV0ZShwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLiRlcnJvckNvdW50XCIsIFwiXCIpKSxcbiAgICAgICAgICAgICAgICBcIiRlcnJvckNvdW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhXaXRoRmllbGROYW1lLmVuZHNXaXRoKFwiLiR3YXJuaW5nQ291bnRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgICAgICBjcmVhdGVBYnNvbHV0ZShwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLiR3YXJuaW5nQ291bnRcIiwgXCJcIikpLFxuICAgICAgICAgICAgICAgIFwiJHdhcm5pbmdDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChjcmVhdGVBYnNvbHV0ZShwYXRoV2l0aEZpZWxkTmFtZSksIFwidmFsdWVcIik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGcm9tTWFzayhwYXRoV2l0aEZpZWxkTmFtZTogc3RyaW5nLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxGaWVsZFBhdGgge1xuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIuJGVycm9yQ291bnRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgICAgICBjcmVhdGVBYnNvbHV0ZUZyb21NYXNrKHBhdGhXaXRoRmllbGROYW1lLnJlcGxhY2UoXCIuJGVycm9yQ291bnRcIiwgXCJcIiksIG11bHRpcGxpY2l0eVN5bWJvbCksXG4gICAgICAgICAgICAgICAgXCIkZXJyb3JDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoV2l0aEZpZWxkTmFtZS5lbmRzV2l0aChcIi4kd2FybmluZ0NvdW50XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICAgICAgY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLiR3YXJuaW5nQ291bnRcIiwgXCJcIiksIG11bHRpcGxpY2l0eVN5bWJvbCksXG4gICAgICAgICAgICAgICAgXCIkd2FybmluZ0NvdW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhXaXRoRmllbGROYW1lLmVuZHNXaXRoKFwiLmVycm9yc0NvdW50XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICAgICAgY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLmVycm9yc0NvdW50XCIsIFwiXCIpLCBtdWx0aXBsaWNpdHlTeW1ib2wpLFxuICAgICAgICAgICAgICAgIFwiZXJyb3JzQ291bnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIud2FybmluZ3NDb3VudFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aFdpdGhGaWVsZE5hbWUucmVwbGFjZShcIi53YXJuaW5nc0NvdW50XCIsIFwiXCIpLCBtdWx0aXBsaWNpdHlTeW1ib2wpLFxuICAgICAgICAgICAgICAgIFwid2FybmluZ3NDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChjcmVhdGVBYnNvbHV0ZUZyb21NYXNrKHBhdGhXaXRoRmllbGROYW1lLCBtdWx0aXBsaWNpdHlTeW1ib2wpLCBcInZhbHVlXCIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTW9kZWxQYXRoPFRSZXNvbHZlZCBleHRlbmRzIGJvb2xlYW4sIFRBYnNvbHV0ZSBleHRlbmRzIGJvb2xlYW4+XG4gICAgZXh0ZW5kcyBJRXF1YXRhYmxlPElNb2RlbFBhdGg8Ym9vbGVhbiwgYm9vbGVhbj4+IHtcbiAgICByZWFkb25seSByZXNvbHZlZDogVFJlc29sdmVkO1xuICAgIHJlYWRvbmx5IGFic29sdXRlOiBUQWJzb2x1dGU7XG5cbiAgICBpc0VxdWFscyhtb2RlbFBhdGg6IE1vZGVsUGF0aCwgZWFjaEN1cnJlbnRDb2xsaXNpb24/OiBFYWNoQ3VycmVudENvbGxpc2lvbik6IGJvb2xlYW47XG4gICAgZ2V0SGFzaChlYWNoQ3VycmVudENvbGxpc2lvbj86IEVhY2hDdXJyZW50Q29sbGlzaW9uKTogbnVtYmVyO1xuXG4gICAgaXNSZXNvbHZlZCgpOiB0aGlzIGlzIElNb2RlbFBhdGg8dHJ1ZSwgVEFic29sdXRlPjtcbiAgICBpc0Fic29sdXRlKCk6IHRoaXMgaXMgSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIHRydWU+O1xuICAgIHRvQWJzb2x1dGUoKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIHRydWU+O1xuXG4gICAgam9pbldpdGgoLi4ucGF0aDogc3RyaW5nW10pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBqb2luV2l0aCguLi5wYXRoOiBQYXRoVG9rZW5bXSk6IElNb2RlbFBhdGg8Ym9vbGVhbiwgVEFic29sdXRlPjtcbiAgICBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxSZXNvbHZlZE1vZGVsUGF0aCB8IHN0cmluZz4pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHwgc3RyaW5nPik6IElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcbiAgICBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxNb2RlbFBhdGggfCBQYXRoVG9rZW4+KTogSU1vZGVsUGF0aDxib29sZWFuLCBUQWJzb2x1dGU+O1xuXG4gICAgZ2V0UGF0aFBhcnRzKCk6IEl0ZXJhYmxlPFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj47XG4gICAgZ2V0UGF0aFBhcnRzQXNBcnJheSgpOiBSZWFkb25seUFycmF5PFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj47XG4gICAgZ2V0U2ltcGxlVG9rZW5zU3RyaWN0KCk6IEl0ZXJhYmxlPFNpbXBsZVBhdGhUb2tlbj47XG4gICAgZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCgpOiByZWFkb25seSBTaW1wbGVQYXRoVG9rZW5bXTtcblxuICAgIHJlc29sdmVBbGwoaW5zdGFuY2U6IHN0cmluZyk6IE1vZGVsUGF0aDtcbiAgICBpc0NvbnRhaW5JdGVyYXRpb24oKTogYm9vbGVhbjtcbiAgICBpc0NvbnRhaW5DdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW47XG4gICAgZ2V0TGFzdExpc3RQYXRoKCk6IFBhdGhUb2tlbltdO1xuICAgIGlzSW5jbHVkZXMobW9kZWxQYXRoOiBNb2RlbFBhdGgpOiBib29sZWFuO1xuICAgIGdldEl0ZXJhdGlvblJhbmsoKTogbnVtYmVyO1xuICAgIGlzRW1wdHkoKTogYm9vbGVhbjtcbiAgICBtYXRjaEZvcihtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IFBhdGhNYXRjaGluZztcbiAgICBzcGxpdEJ5TXVsdGlwbGljaXR5KCk6IEl0ZXJhYmxlPFJlc29sdmVkTW9kZWxQYXRoIHwgdHlwZW9mIEVhY2hTeW1ib2wgfCB0eXBlb2YgQ3VycmVudFN5bWJvbD47XG4gICAgbm9ybWFsaXplKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIHRvQ3VycmVudEl0ZXJhdGlvbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICB0b0VhY2hJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgZ2V0QWxsUGFyZW50UGF0aHMoKTogSXRlcmFibGU8TW9kZWxQYXRoPjtcbiAgICB0cmltTGFzdFN0YXJJZkxhc3RUb2tlbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBnZXRQYXJlbnRQYXRoKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIGFwcGx5SW5zdGFuY2VzRGlydHkoaW5zdGFuY2VzOiBTaW1wbGVQYXRoVG9rZW5bXSk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nO1xuICAgIHRvTGVnYWN5UGF0aCgpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1vZGVsUGF0aCA9IElNb2RlbFBhdGg8Ym9vbGVhbiwgYm9vbGVhbj47XG5leHBvcnQgdHlwZSBSZXNvbHZlZE1vZGVsUGF0aCA9IElNb2RlbFBhdGg8dHJ1ZSwgYm9vbGVhbj47XG5leHBvcnQgdHlwZSBBYnNvbHV0ZU1vZGVsUGF0aCA9IElNb2RlbFBhdGg8Ym9vbGVhbiwgdHJ1ZT47XG5leHBvcnQgdHlwZSBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoID0gSU1vZGVsUGF0aDx0cnVlLCB0cnVlPjtcblxuZXhwb3J0IHR5cGUgUmVsYXRpdmVNb2RlbFBhdGggPSBJTW9kZWxQYXRoPGJvb2xlYW4sIGZhbHNlPjtcbmV4cG9ydCB0eXBlIFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGggPSBJTW9kZWxQYXRoPHRydWUsIGZhbHNlPjtcblxudHlwZSBQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZCBleHRlbmRzIGJvb2xlYW4+ID0gVFJlc29sdmVkIGV4dGVuZHMgdHJ1ZSA/IHN0cmluZyA6IFBhdGhUb2tlbjtcblxudHlwZSBQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPiA9IEFycmF5PFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj47XG5cbnR5cGUgUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPiA9IFJlYWRvbmx5QXJyYXk8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PjtcblxuZnVuY3Rpb24gaXNBbGxUb2tlbnNSZXNvbHZlZDxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPih0b2tlbnM6IFJlYWRvbmx5UGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPik6IFRSZXNvbHZlZCB7XG4gICAgLy8g0K8g0YfRgtC+LdGC0L4g0L3QtdC80L7Qs9GDINGB0L7QvtCx0YDQsNC30LjRgtGMINC60LDQuiDRgtGD0YIg0LLRgdGRINGB0YLRgNC+0LPQviDQvdCw0L/QuNGB0LDRgtGMLi4uXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHJldHVybiB0b2tlbnMuZXZlcnkoUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vZGVsUGF0aEltcGw8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbiwgVEFic29sdXRlIGV4dGVuZHMgYm9vbGVhbj5cbiAgICBpbXBsZW1lbnRzIElFcXVhdGFibGU8TW9kZWxQYXRoPiwgSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT5cbntcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRva2VuczogUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQ+O1xuICAgIHB1YmxpYyByZWFkb25seSBhYnNvbHV0ZTogVEFic29sdXRlO1xuICAgIHByaXZhdGUgbGVnYWN5UGF0aDogdW5kZWZpbmVkIHwgc3RyaW5nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGhQYXJ0czogUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQ+LCBhYnNvbHV0ZTogVEFic29sdXRlKSB7XG4gICAgICAgIHRoaXMudG9rZW5zID0gcGF0aFBhcnRzLmZpbHRlcih4ID0+IHggIT09IFwiXCIpO1xuICAgICAgICB0aGlzLmFic29sdXRlID0gYWJzb2x1dGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNvbHZlZCgpOiBUUmVzb2x2ZWQge1xuICAgICAgICByZXR1cm4gaXNBbGxUb2tlbnNSZXNvbHZlZCh0aGlzLnRva2Vucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhdGhQYXJ0cygpOiBJdGVyYWJsZTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXRoUGFydHNBc0FycmF5KCk6IFJlYWRvbmx5QXJyYXk8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgICB9XG5cbiAgICBwdWJsaWMgKmdldFNpbXBsZVRva2Vuc1N0cmljdCgpOiBJdGVyYWJsZTxTaW1wbGVQYXRoVG9rZW4+IHtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0aGlzLnRva2Vucykge1xuICAgICAgICAgICAgaWYgKCFQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aCBtdXN0IG5vdCBjb250YWluIHNwZWMgdG9rZW5zXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgdG9rZW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCgpOiByZWFkb25seSBTaW1wbGVQYXRoVG9rZW5bXSB7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmICghUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiBzcGVjIHRva2Vuc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDQn9GA0L7QstC10YDQutCwINCy0YvRiNC1INCz0LDRgNCw0LXQvdGC0LjRgNGD0LXRgiDRh9GC0L4g0LHRg9C00YPRgiDRgtC+0LvRjNC60L4gU2ltcGxlUGF0aFRva2VuLlxuICAgICAgICAvLyDQktGB0LUgbWFwINC4IGZpbHRlciDRg9Cx0YDQsNC90Ysg0LTQu9GPINC/0YDQvtC40LfQstC+0LTQuNGC0LXQu9GM0L3QvtGB0YLQuFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgICB9XG5cbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogc3RyaW5nW10pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogUGF0aFRva2VuW10pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIFRBYnNvbHV0ZT47XG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PFJlc29sdmVkTW9kZWxQYXRoIHwgc3RyaW5nPik6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIHB1YmxpYyBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHwgc3RyaW5nPik6IElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuPik6IElNb2RlbFBhdGg8Ym9vbGVhbiwgVEFic29sdXRlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuPik6IElNb2RlbFBhdGg8Ym9vbGVhbiwgYm9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gam9pbk1vZGVsUGF0aHModGhpcywgLi4ucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUmVzb2x2ZWQoKTogdGhpcyBpcyBJTW9kZWxQYXRoPHRydWUsIFRBYnNvbHV0ZT4ge1xuICAgICAgICByZXR1cm4gaXNBbGxUb2tlbnNSZXNvbHZlZCh0aGlzLnRva2Vucyk7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5ldmVyeShQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNvbHZlQWxsKGluc3RhbmNlOiBzdHJpbmcpOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2Vucy5tYXAodG9rZW4gPT4ge1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHRva2VucywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29udGFpbkl0ZXJhdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNvbWUoeCA9PiB4ID09PSBQYXRoVG9rZW5zLmVhY2gpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NvbnRhaW5DdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc29tZSh4ID0+IHggPT09IFBhdGhUb2tlbnMuY3VycmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExhc3RMaXN0UGF0aCgpOiBQYXRoVG9rZW5bXSB7XG4gICAgICAgIGlmICghdGhpcy5pc0NvbnRhaW5JdGVyYXRpb24oKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aCBtdXN0IGNvbnRhaW4gaXRlcmF0aW9uXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC90YLQuNGA0YPQtdGCLCDRh9GC0L4g0LHRg9C00LXRgiBQYXRoVG9rZW5zLmVhY2hcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBsYXN0SXRlcmF0aW9uSW5kZXggPSB0aGlzLnRva2Vucy5sYXN0SW5kZXhPZihQYXRoVG9rZW5zLmVhY2gpO1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc2xpY2UoMCwgbGFzdEl0ZXJhdGlvbkluZGV4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBYnNvbHV0ZSgpOiB0aGlzIGlzIElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFic29sdXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuYWJzb2x1dGUgPyBcIi9cIiA6IFwiXCIpICsgdGhpcy50b2tlbnMubWFwKHggPT4gdGhpcy5wYXRoUGFydFRvU3RyaW5nKHgpKS5qb2luKFwiL1wiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9MZWdhY3lQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZ2FjeVBhdGggPz8gKHRoaXMubGVnYWN5UGF0aCA9IHRoaXMudG9rZW5zLm1hcCh4ID0+IHRoaXMucGF0aFBhcnRUb1N0cmluZyh4KSkuam9pbihcIi9cIikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFscyhcbiAgICAgICAgbW9kZWxQYXRoOiBNb2RlbFBhdGgsXG4gICAgICAgIGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWVcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGVhY2hDdXJyZW50Q29sbGlzaW9uID09PSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVTYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0xlZ2FjeVBhdGgoKSA9PT0gbW9kZWxQYXRoLnRvTGVnYWN5UGF0aCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmlzQWJzb2x1dGUoKSA9PT0gbW9kZWxQYXRoLmlzQWJzb2x1dGUoKSAmJlxuICAgICAgICAgICAgICAgIEl0ZXJhdG9yLmZyb20oSXRlclV0aWxzLnppcCh0aGlzLmdldFBhdGhQYXJ0cygpLCBtb2RlbFBhdGguZ2V0UGF0aFBhcnRzKCkpKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgKFt0MSwgdDJdKSA9PiB0MSA9PT0gdDJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRgdC10LPQtNCwINGG0LXQu9C+0LUg0L/QvtC70L7QttC40YLQtdC70YzQvdC+0LUg0LHQtdC30LfQvdCw0LrQvtCy0L7QtSAzMi3QsdC40YLQvdC+0LUg0YfQuNGB0LvQvlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIYXNoKGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWUpOiBudW1iZXIge1xuICAgICAgICBsZXQgaGFzaCA9IDUzODE7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgcmV2ZXJzZUFycmF5KHRoaXMudG9rZW5zKSkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRTdHI6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFN0ciA9IHRva2VuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZWFjaEN1cnJlbnRDb2xsaXNpb24gPT09IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZURpZmZlcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RyID0gdG9rZW4gPT09IFBhdGhUb2tlbnMuZWFjaCA/IFwiKlwiIDogXCIhXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ciA9IFwiKlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzdHJpbmdJbmRleCA9IGN1cnJlbnRTdHIubGVuZ3RoO1xuICAgICAgICAgICAgd2hpbGUgKHN0cmluZ0luZGV4KSB7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgICAgICAgICBoYXNoID0gKGhhc2ggKiAzMykgXiBjdXJyZW50U3RyLmNoYXJDb2RlQXQoLS1zdHJpbmdJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgICAgdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgICAgIEphdmFTY3JpcHQgZG9lcyBiaXR3aXNlIG9wZXJhdGlvbnMgKGxpa2UgWE9SLCBhYm92ZSkgb24gMzItYml0IHNpZ25lZFxuICAgICAgICAgICAgaW50ZWdlcnMuIFNpbmNlIHdlIHdhbnQgdGhlIHJlc3VsdHMgdG8gYmUgYWx3YXlzIHBvc2l0aXZlLCBjb252ZXJ0IHRoZVxuICAgICAgICAgICAgc2lnbmVkIGludCB0byBhbiB1bnNpZ25lZCBieSBkb2luZyBhbiB1bnNpZ25lZCBiaXRzaGlmdC5cbiAgICAgICovXG4gICAgICAgIHJldHVybiBoYXNoID4+PiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0luY2x1ZGVzKG1vZGVsUGF0aDogTW9kZWxQYXRoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFRva2VucyA9IG1vZGVsUGF0aC5nZXRQYXRoUGFydHNBc0FycmF5KCk7XG4gICAgICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggIT09IHRhcmdldFRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0UGFydCA9IHRoaXMudG9rZW5zW2ldO1xuICAgICAgICAgICAgY29uc3QgcmlnaHRQYXJ0ID0gdGFyZ2V0VG9rZW5zW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsZWZ0UGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmlnaHRQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0UGFydCAhPT0gcmlnaHRQYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmdFBhcnQgPT09IFBhdGhUb2tlbnMuY3VycmVudCB8fCBsZWZ0UGFydCA9PT0gUGF0aFRva2Vucy5lYWNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByaWdodFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShOdW1iZXIocmlnaHRQYXJ0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRQYXJ0ICE9PSBQYXRoVG9rZW5zLmN1cnJlbnQgJiYgcmlnaHRQYXJ0ICE9PSBQYXRoVG9rZW5zLmVhY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEl0ZXJhdGlvblJhbmsoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGNvdW50KEl0ZXJhdG9yLmZyb20odGhpcy50b2tlbnMpLmZpbHRlcih4ID0+IHggPT09IFBhdGhUb2tlbnMuZWFjaCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBtYXRjaEZvcihtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IFBhdGhNYXRjaGluZyB7XG4gICAgICAgIGlmICghdGhpcy5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1hdGNoIG5vbiBhYnNvbHV0ZSBwYXRoICcke3RoaXMudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtb2RlbFBhdGguaXNBYnNvbHV0ZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtYXRjaCBub24gYWJzb2x1dGUgcGF0aCAnJHttb2RlbFBhdGgudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBhdGhNYXRjaGVyLm1hdGNoKHRoaXMudG9rZW5zLCBtb2RlbFBhdGguZ2V0UGF0aFBhcnRzQXNBcnJheSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKnNwbGl0QnlNdWx0aXBsaWNpdHkoKTogSXRlcmFibGU8UmVzb2x2ZWRNb2RlbFBhdGggfCB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sPiB7XG4gICAgICAgIGxldCBsYXN0U2ltcGxlUGFydHMgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0aGlzLmlzQWJzb2x1dGUoKSk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgbGFzdFNpbXBsZVBhcnRzLmFwcGVuZCh0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghbGFzdFNpbXBsZVBhcnRzLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGxhc3RTaW1wbGVQYXJ0cy50b1Jlc29sdmVkUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2ltcGxlUGFydHMgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcihmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbGFzdFNpbXBsZVBhcnRzLmVtcHR5KSB7XG4gICAgICAgICAgICB5aWVsZCBsYXN0U2ltcGxlUGFydHMudG9SZXNvbHZlZFBhdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBub3JtYWxpemUoKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBjb25zdCByZXN1bHRUb2tlbnM6IFBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwYXRoUGFydCBvZiB0aGlzLnRva2Vucykge1xuICAgICAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBcIi4uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdFRva2Vucy5wb3AoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCBpcyBpbnZhbGlkICcke3RoaXMudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRUb2tlbnMucHVzaChcIi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGF0aFBhcnQgPT09IFwiLlwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRUb2tlbnMucHVzaChwYXRoUGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCwgVEFic29sdXRlPihyZXN1bHRUb2tlbnMsIHRoaXMuYWJzb2x1dGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5INCh0L/QtdGG0LjRhNC40LrQsNGC0L7RgNGLINC80L3QvtC20LXRgdGC0LLQtdC90L3QvtGB0YLQuCBFYWNoINC30LDQvNC10L3Rj9C10YIg0L3QsCBDdXJyZW50XG4gICAgICovXG4gICAgcHVibGljIHRvQ3VycmVudEl0ZXJhdGlvbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOT1RFINCi0YPRgiDQvdC1INC/0L7Qu9GD0YfQsNC10YLRgdGPINC90LDQu9C+0LbQuNGC0Ywg0LTQuNGB0LrRgNC40LzQuNC90LDRgtC+0YBcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0czogUGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPiA9IHRoaXMudG9rZW5zLm1hcCh4ID0+XG4gICAgICAgICAgICAgICAgeCA9PT0gUGF0aFRva2Vucy5lYWNoID8gUGF0aFRva2Vucy5jdXJyZW50IDogeFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ocGF0aFBhcnRzLCB0aGlzLmFic29sdXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b0VhY2hJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBpZiAodGhpcy5pc1Jlc29sdmVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTk9URSDQotGD0YIg0L3QtSDQv9C+0LvRg9GH0LDQtdGC0YHRjyDQvdCw0LvQvtC20LjRgtGMINC00LjRgdC60YDQuNC80LjQvdCw0YLQvtGAXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBjb25zdCBwYXRoUGFydHM6IFBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4gPSB0aGlzLnRva2Vucy5tYXAoeCA9PlxuICAgICAgICAgICAgICAgIHggPT09IFBhdGhUb2tlbnMuY3VycmVudCA/IFBhdGhUb2tlbnMuZWFjaCA6IHhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8VFJlc29sdmVkLCBUQWJzb2x1dGU+KHBhdGhQYXJ0cywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BYnNvbHV0ZSgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT4ge1xuICAgICAgICBpZiAoIXRoaXMuYWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAnJHt0aGlzLnRvTGVnYWN5UGF0aCgpfSBpcyBub3QgYWJzb2x1dGUnYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCwgdHJ1ZT4odGhpcy50b2tlbnMsIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqZ2V0QWxsUGFyZW50UGF0aHMoKTogSXRlcmFibGU8TW9kZWxQYXRoPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNb2RlbFBhdGhCdWlsZGVyKHRoaXMuaXNBYnNvbHV0ZSgpKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBJdGVyVXRpbHMuc2tpcExhc3QodGhpcy5nZXRQYXRoUGFydHMoKSwgMSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodG9rZW4pO1xuICAgICAgICAgICAgeWllbGQgcmVzdWx0LnRvUGF0aCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRyaW1MYXN0U3RhcklmTGFzdFRva2VuKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBJdGVyVXRpbHMubGFzdCh0aGlzLnRva2Vucyk7XG4gICAgICAgIGlmIChsYXN0SXRlbSAhPSB1bmRlZmluZWQgJiYgUGF0aFRva2Vucy5pc011bHRpVG9rZW4obGFzdEl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwodGhpcy50b2tlbnMuc2xpY2UoMCwgLTEpLCB0aGlzLmFic29sdXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyZW50UGF0aCgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNb2RlbFBhdGhCdWlsZGVyKHRoaXMuYWJzb2x1dGUpO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIEl0ZXJVdGlscy5za2lwTGFzdCh0aGlzLmdldFBhdGhQYXJ0cygpLCAxKSkge1xuICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8g0KLRg9GCINC/0L7Qu9GD0YfQsNC10YLRgdGPINGC0LDQuiwg0YfRgtC+INC/0L4g0LTRgNGD0LPQvtC80YMg0L3QuNC60LDQulxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHJldHVybiByZXN1bHQudG9QYXRoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwcGx5SW5zdGFuY2VzRGlydHkoaW5zdGFuY2VzOiBTaW1wbGVQYXRoVG9rZW5bXSk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNvbHZlZCgpIHx8IGluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbnN0YW5jZUNvdW50ZXIgPSAwO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0cnVlKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0aGlzLmdldFBhdGhQYXJ0cygpKSB7XG4gICAgICAgICAgICBpZiAoUGF0aFRva2Vucy5pc011bHRpVG9rZW4odG9rZW4pICYmIGluc3RhbmNlQ291bnRlciA8IGluc3RhbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGluc3RhbmNlc1tpbnN0YW5jZUNvdW50ZXJdID8/IHJlamVjdCgpKTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50ZXIrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g0KLRg9GCINC/0L7Qu9GD0YfQsNC10YLRgdGPINGC0LDQuiwg0YfRgtC+INC/0L4g0LTRgNGD0LPQvtC80YMg0L3QuNC60LDQulxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHJldHVybiByZXN1bHQudG9QYXRoKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXRoUGFydFRvU3RyaW5nKHBhdGhQYXJ0OiBQYXRoVG9rZW4pOiBzdHJpbmcge1xuICAgICAgICBpZiAodHlwZW9mIHBhdGhQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aFBhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBQYXRoVG9rZW5zLmVhY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBcIipcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQgPT09IFBhdGhUb2tlbnMuY3VycmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiKlwiO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXRoIHBhcnQgc3BlY2lmaWVkOiAke2Vuc3VyZUFuZEdldFN0cmluZyhwYXRoUGFydCl9YCk7XG4gICAgfVxufVxuIl19