@recursyve/nestjs-data-filter 9.4.1 → 9.4.3

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 (87) hide show
  1. package/lib/data-filter.repository.d.ts +1 -1
  2. package/lib/data-filter.repository.js +12 -9
  3. package/lib/decorators/attributes.decorator.js +1 -1
  4. package/lib/decorators/count.decorator.js +1 -1
  5. package/lib/decorators/distance.decorator.js +2 -2
  6. package/lib/decorators/ignore-in-search.decorator.js +1 -1
  7. package/lib/decorators/include.decorator.js +1 -1
  8. package/lib/decorators/limit.decorator.js +1 -1
  9. package/lib/decorators/order.decorator.js +1 -1
  10. package/lib/decorators/paranoid.decorator.js +1 -1
  11. package/lib/decorators/path.decorator.js +1 -1
  12. package/lib/decorators/required.decorator.js +1 -1
  13. package/lib/decorators/seachable-attributes.decorator.js +1 -1
  14. package/lib/decorators/separate.decorator.js +1 -1
  15. package/lib/decorators/sum.decorator.js +1 -1
  16. package/lib/decorators/where.decorator.js +1 -1
  17. package/lib/filter/base-filter.js +1 -1
  18. package/lib/filter/controllers/dynamic-filter.controller.d.ts +1 -1
  19. package/lib/filter/controllers/dynamic-filter.controller.js +1 -1
  20. package/lib/filter/controllers/filter.controller.d.ts +1 -1
  21. package/lib/filter/controllers/filter.controller.js +1 -1
  22. package/lib/filter/decorators/inject-filter.decorator.d.ts +1 -1
  23. package/lib/filter/filter.config.d.ts +1 -1
  24. package/lib/filter/filter.config.js +1 -1
  25. package/lib/filter/filter.factory.js +1 -1
  26. package/lib/filter/filter.service.d.ts +4 -4
  27. package/lib/filter/filter.service.js +43 -24
  28. package/lib/filter/filter.utils.d.ts +1 -1
  29. package/lib/filter/filter.utils.js +1 -1
  30. package/lib/filter/filters/coordinate.filter.d.ts +4 -4
  31. package/lib/filter/filters/coordinate.filter.js +34 -24
  32. package/lib/filter/filters/date-time.filter.d.ts +1 -1
  33. package/lib/filter/filters/date-time.filter.js +4 -1
  34. package/lib/filter/filters/date.filter.d.ts +1 -1
  35. package/lib/filter/filters/date.filter.js +18 -13
  36. package/lib/filter/filters/default.filter.d.ts +4 -4
  37. package/lib/filter/filters/default.filter.js +1 -1
  38. package/lib/filter/filters/filter.d.ts +13 -12
  39. package/lib/filter/filters/filter.js +16 -12
  40. package/lib/filter/filters/geo-bounds.filter.js +1 -1
  41. package/lib/filter/filters/geo-localization.filter.d.ts +1 -1
  42. package/lib/filter/filters/geo-localization.filter.js +4 -1
  43. package/lib/filter/filters/group.filter.d.ts +9 -9
  44. package/lib/filter/filters/group.filter.js +20 -15
  45. package/lib/filter/filters/radio.filter.d.ts +3 -3
  46. package/lib/filter/filters/radio.filter.js +14 -7
  47. package/lib/filter/filters/select.filter.d.ts +2 -2
  48. package/lib/filter/filters/select.filter.js +2 -2
  49. package/lib/filter/filters/text.filter.d.ts +1 -1
  50. package/lib/filter/filters/text.filter.js +1 -1
  51. package/lib/filter/guards/filter-query.guard.js +6 -3
  52. package/lib/filter/interceptors/data-file-download.interceptor.js +1 -1
  53. package/lib/filter/models/filter-configuration.model.d.ts +2 -2
  54. package/lib/filter/models/filter-configuration.model.js +1 -1
  55. package/lib/filter/models/rule.model.d.ts +3 -0
  56. package/lib/filter/models/rule.model.js +1 -1
  57. package/lib/filter/order-rules/default.order-rule.d.ts +4 -3
  58. package/lib/filter/order-rules/default.order-rule.js +1 -1
  59. package/lib/filter/order-rules/enum.order-rule.js +1 -1
  60. package/lib/filter/order-rules/order-rule.d.ts +4 -3
  61. package/lib/filter/order-rules/order-rule.js +1 -1
  62. package/lib/handlers/attributes.handler.d.ts +1 -1
  63. package/lib/handlers/attributes.handler.js +1 -1
  64. package/lib/index.js +23 -32
  65. package/lib/json.data.js +1 -1
  66. package/lib/models/attributes.model.d.ts +4 -4
  67. package/lib/models/attributes.model.js +11 -6
  68. package/lib/models/count.model.js +1 -1
  69. package/lib/models/custom-attributes.model.d.ts +1 -1
  70. package/lib/models/custom-attributes.model.js +1 -1
  71. package/lib/models/data-filter.model.d.ts +1 -1
  72. package/lib/models/data-filter.model.js +18 -10
  73. package/lib/models/distance.model.d.ts +3 -3
  74. package/lib/models/distance.model.js +2 -2
  75. package/lib/models/include.model.js +1 -1
  76. package/lib/models/path.model.js +1 -1
  77. package/lib/models/sum.model.js +1 -1
  78. package/lib/scanners/sequelize-model.scanner.d.ts +2 -2
  79. package/lib/scanners/sequelize-model.scanner.js +6 -5
  80. package/lib/sequelize.utils.d.ts +4 -4
  81. package/lib/sequelize.utils.js +6 -6
  82. package/lib/utils/xlsx.utils.js +1 -1
  83. package/package.json +7 -7
  84. package/lib/filter/filters/options.filter.d.ts +0 -46
  85. package/lib/filter/filters/options.filter.js +0 -111
  86. package/lib/services/dialect-formatter.service.d.ts +0 -10
  87. package/lib/services/dialect-formatter.service.js +0 -58
@@ -42,6 +42,7 @@ let FilterService = FilterService_1 = class FilterService {
42
42
  }, this.sequelizeModelScanner, this.dataFilter, this.options);
43
43
  }
44
44
  async getConfig(request, user) {
45
+ var _a;
45
46
  const result = [];
46
47
  for (const key in this.definitions) {
47
48
  if (!this.definitions.hasOwnProperty(key) || order_rule_1.OrderRule.validate(this.definitions[key])) {
@@ -54,7 +55,7 @@ let FilterService = FilterService_1 = class FilterService {
54
55
  result.push({
55
56
  ...config,
56
57
  id: key,
57
- name: await this.translateAdapter.getTranslation(user.language, filter_utils_1.FilterUtils.getFilterTranslationKey(key))
58
+ name: await this.translateAdapter.getTranslation((_a = user === null || user === void 0 ? void 0 : user.language) !== null && _a !== void 0 ? _a : "fr", filter_utils_1.FilterUtils.getFilterTranslationKey(key))
58
59
  });
59
60
  }
60
61
  return result;
@@ -84,30 +85,38 @@ let FilterService = FilterService_1 = class FilterService {
84
85
  }
85
86
  async findResourceValueById(request, search, user) {
86
87
  if (!this.definitions.hasOwnProperty(search.id)) {
87
- return;
88
+ return null;
88
89
  }
89
90
  const filter = this.definitions[search.id];
90
91
  if (filter instanceof filters_1.SelectFilter && filter.getResourceById) {
91
92
  return await filter.getResourceById({ id: search.resourceId, user, request });
92
93
  }
93
- return;
94
+ return null;
94
95
  }
95
96
  async count(...args) {
96
97
  const [userOrOpt, opt] = args;
97
98
  const options = opt ? opt : userOrOpt;
98
99
  const user = opt ? userOrOpt : null;
99
100
  const countOptions = await this.getFindOptions(this.repository.model, options.query);
100
- this.addSearchCondition(options.search, countOptions);
101
+ if (options.search) {
102
+ this.addSearchCondition(options.search, countOptions);
103
+ }
101
104
  return user ? this.countTotalValues(user, countOptions) : this.countTotalValues(countOptions);
102
105
  }
103
106
  async filter(...args) {
104
107
  const [userOrOpt, opt] = args;
105
108
  const options = opt ? opt : userOrOpt;
106
109
  const user = opt ? userOrOpt : null;
107
- options.order = this.normalizeOrder(options.order);
110
+ if (options.order) {
111
+ options.order = this.normalizeOrder(options.order);
112
+ }
108
113
  const countOptions = await this.getFindOptions(this.repository.model, options.query, options.data);
109
- this.addSearchCondition(options.search, countOptions);
110
- this.addOrderCondition(options.order, countOptions, options.data);
114
+ if (options.search) {
115
+ this.addSearchCondition(options.search, countOptions);
116
+ }
117
+ if (options.order) {
118
+ this.addOrderCondition(options.order, countOptions, options.data);
119
+ }
111
120
  this.addGroupOption(options, countOptions);
112
121
  const total = await (user ? this.countTotalValues(user, countOptions) : this.countTotalValues(countOptions));
113
122
  const values = await (user ? this.findValues(user, options, countOptions) : this.findValues(options, countOptions));
@@ -120,9 +129,15 @@ let FilterService = FilterService_1 = class FilterService {
120
129
  async downloadData(user, type, options, exportOptions) {
121
130
  var _a, _b;
122
131
  const findOptions = await this.getFindOptions(this.exportRepository.model, options.query);
123
- options.order = this.normalizeOrder(options.order);
124
- this.addSearchCondition(options.search, findOptions);
125
- this.addOrderCondition(options.order, findOptions, options.data);
132
+ if (options.order) {
133
+ options.order = this.normalizeOrder(options.order);
134
+ }
135
+ if (options.search) {
136
+ this.addSearchCondition(options.search, findOptions);
137
+ }
138
+ if (options.order) {
139
+ this.addOrderCondition(options.order, findOptions, options.data);
140
+ }
126
141
  delete options.page;
127
142
  const values = await (user ? this.findValues(user, options, findOptions, this.exportRepository) : this.findValues(options, findOptions, this.exportRepository));
128
143
  const headers = await this.model.getExportedFieldsKeys(type);
@@ -199,9 +214,11 @@ let FilterService = FilterService_1 = class FilterService {
199
214
  const f = filter;
200
215
  includes.push(...this.getFilterInclude(model, f.rootFilter, r, data));
201
216
  if (!f.lazyLoading) {
202
- includes.push(...this.getFilterInclude(model, f.valueFilter, r, data));
217
+ if (f.valueFilter) {
218
+ includes.push(...this.getFilterInclude(model, f.valueFilter, r, data));
219
+ }
203
220
  }
204
- else {
221
+ else if (f.getValueFilter && Array.isArray(r.value)) {
205
222
  const valueFiler = await f.getValueFilter(r.value[0]);
206
223
  includes.push(...this.getFilterInclude(model, valueFiler, r, data));
207
224
  }
@@ -232,7 +249,7 @@ let FilterService = FilterService_1 = class FilterService {
232
249
  async generateWhereOptions(query, options) {
233
250
  var _a;
234
251
  if (!query.rules) {
235
- return;
252
+ return true;
236
253
  }
237
254
  let paranoid = true;
238
255
  for (const rule of query.rules) {
@@ -312,7 +329,7 @@ let FilterService = FilterService_1 = class FilterService {
312
329
  for (const order of orders) {
313
330
  const rule = this.definitions[order.column];
314
331
  const includes = rule && order_rule_1.OrderRule.validate(rule) ?
315
- this.sequelizeModelScanner.getIncludes(this.repository.model, { path: rule.path }, []) :
332
+ rule.path ? this.sequelizeModelScanner.getIncludes(this.repository.model, { path: rule.path }, []) : [] :
316
333
  this.repository.generateOrderInclude(order, data);
317
334
  if (!includes.length) {
318
335
  continue;
@@ -408,8 +425,8 @@ let FilterService = FilterService_1 = class FilterService {
408
425
  const values = await repository.model.findAll({
409
426
  ...options,
410
427
  attributes: ["id", ...nonNestedOrderColumns, ...customAttributes],
411
- limit: filter.page ? filter.page.size : null,
412
- offset: filter.page ? filter.page.number * filter.page.size + ((_a = filter.page.offset) !== null && _a !== void 0 ? _a : 0) : null,
428
+ limit: filter.page ? filter.page.size : undefined,
429
+ offset: filter.page ? filter.page.number * filter.page.size + ((_a = filter.page.offset) !== null && _a !== void 0 ? _a : 0) : undefined,
413
430
  subQuery: false,
414
431
  group: (_b = filter.groupBy) !== null && _b !== void 0 ? _b : options.group,
415
432
  order
@@ -456,7 +473,9 @@ let FilterService = FilterService_1 = class FilterService {
456
473
  includes.push(this.sequelizeModelScanner.getIncludes(model, path, [], [], true));
457
474
  }
458
475
  if (!filter.path) {
459
- includes.push(this.getConditionInclude(model, filter.condition));
476
+ if (filter.condition) {
477
+ includes.push(this.getConditionInclude(model, filter.condition));
478
+ }
460
479
  return includes;
461
480
  }
462
481
  return [
@@ -464,9 +483,9 @@ let FilterService = FilterService_1 = class FilterService {
464
483
  this.sequelizeModelScanner.getIncludes(model, {
465
484
  path: filter.path,
466
485
  paranoid: filter.paranoid,
467
- where: filter_utils_1.FilterUtils.generateWhereConditions(filter.where, data)
486
+ where: filter.where ? filter_utils_1.FilterUtils.generateWhereConditions(filter.where, data) : undefined
468
487
  }, [], [], true),
469
- this.getConditionInclude(model, filter.condition)
488
+ filter.condition ? this.getConditionInclude(model, filter.condition) : []
470
489
  ];
471
490
  }
472
491
  getOrderOptions(orders) {
@@ -510,7 +529,7 @@ let FilterService = FilterService_1 = class FilterService {
510
529
  continue;
511
530
  }
512
531
  const customAttribute = this.repository.getCustomAttribute(order.column);
513
- const attribute = customAttribute.transform(data);
532
+ const attribute = customAttribute === null || customAttribute === void 0 ? void 0 : customAttribute.transform(data);
514
533
  if (attribute) {
515
534
  attributes.push(attribute);
516
535
  }
@@ -556,7 +575,7 @@ let FilterService = FilterService_1 = class FilterService {
556
575
  if ((query === null || query === void 0 ? void 0 : query.condition) !== "and") {
557
576
  query = {
558
577
  condition: "and",
559
- rules: [query]
578
+ rules: query ? [query] : []
560
579
  };
561
580
  }
562
581
  }
@@ -564,11 +583,11 @@ let FilterService = FilterService_1 = class FilterService {
564
583
  if ((query === null || query === void 0 ? void 0 : query.condition) !== "or") {
565
584
  query = {
566
585
  condition: "or",
567
- rules: [query]
586
+ rules: query ? [query] : []
568
587
  };
569
588
  }
570
589
  }
571
- query.rules.push(this.model.defaultFilter.filter);
590
+ query === null || query === void 0 ? void 0 : query.rules.push(this.model.defaultFilter.filter);
572
591
  return query;
573
592
  }
574
593
  normalizeOrder(orders) {
@@ -598,4 +617,4 @@ FilterService = FilterService_1 = __decorate([
598
617
  ], FilterService);
599
618
  exports.FilterService = FilterService;
600
619
 
601
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9maWx0ZXIvZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUFrRDtBQUNsRCx5Q0FXbUI7QUFHbkIsK0VBQTBFO0FBQzFFLHFFQUFpRTtBQUNqRSxzRUFBaUU7QUFDakUsZ0VBQTJEO0FBRTNELGlGQUE0RTtBQUM1RSx3REFBdUQ7QUFDdkQsK0NBQTJDO0FBQzNDLGlEQUE2QztBQUM3Qyx1Q0FPbUI7QUFDbkIsK0VBQTBFO0FBQzFFLHlEQUE0RTtBQUs1RSx5REFBMEU7QUFHbkUsSUFBTSxhQUFhLHFCQUFuQixNQUFNLGFBQWE7SUFLdEIsWUFDWSxvQkFBMEMsRUFDMUMsZ0JBQWtDLEVBQ2xDLEtBQXVCLEVBQ3ZCLHFCQUE0QyxFQUM1QyxVQUE2QixFQUM3QixPQUE0QztRQUw1Qyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzFDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsVUFBSyxHQUFMLEtBQUssQ0FBa0I7UUFDdkIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QyxlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixZQUFPLEdBQVAsT0FBTyxDQUFxQztRQUVwRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVNLE9BQU8sQ0FBSSxPQUFnQjtRQUM5QixPQUFPLElBQUksZUFBYSxDQUNwQixJQUFJLENBQUMsb0JBQW9CLEVBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsRUFDckI7WUFDSSxHQUFHLElBQUksQ0FBQyxLQUFLO1lBQ2IsY0FBYyxFQUFFLE9BQU87U0FDRSxFQUM3QixJQUFJLENBQUMscUJBQXFCLEVBQzFCLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FDZixDQUFDO0lBQ04sQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBWSxFQUFFLElBQTBCO1FBQzNELE1BQU0sTUFBTSxHQUErQixF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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgICBDb3VudE9wdGlvbnMsXG4gICAgRmluZE9wdGlvbnMsXG4gICAgR3JvdXBlZENvdW50UmVzdWx0SXRlbSxcbiAgICBJbmNsdWRlYWJsZSxcbiAgICBJbmNsdWRlT3B0aW9ucyxcbiAgICBsaXRlcmFsLFxuICAgIE9wLFxuICAgIE9yZGVyLFxuICAgIE9yZGVySXRlbSxcbiAgICBXaGVyZU9wdGlvbnNcbn0gZnJvbSBcInNlcXVlbGl6ZVwiO1xuaW1wb3J0IHsgR3JvdXBPcHRpb24sIFByb2plY3Rpb25BbGlhcyB9IGZyb20gXCJzZXF1ZWxpemUvdHlwZXMvbW9kZWxcIjtcbmltcG9ydCB7IEV4cG9ydFR5cGVzLCBGaWx0ZXJRdWVyeU1vZGVsLCBGaWx0ZXJSZXN1bHRNb2RlbCwgRmlsdGVyU2VhcmNoTW9kZWwsIE9yZGVyTW9kZWwgfSBmcm9tIFwiLi4vXCI7XG5pbXBvcnQgeyBBY2Nlc3NDb250cm9sQWRhcHRlciB9IGZyb20gXCIuLi9hZGFwdGVycy9hY2Nlc3MtY29udHJvbC5hZGFwdGVyXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGVBZGFwdGVyIH0gZnJvbSBcIi4uL2FkYXB0ZXJzL3RyYW5zbGF0ZS5hZGFwdGVyXCI7XG5pbXBvcnQgeyBEYXRhRmlsdGVyUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9kYXRhLWZpbHRlci5yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBEYXRhRmlsdGVyU2VydmljZSB9IGZyb20gXCIuLi9kYXRhLWZpbHRlci5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBEYXRhRmlsdGVyVXNlck1vZGVsIH0gZnJvbSBcIi4uL21vZGVscy91c2VyLm1vZGVsXCI7XG5pbXBvcnQgeyBTZXF1ZWxpemVNb2RlbFNjYW5uZXIgfSBmcm9tIFwiLi4vc2Nhbm5lcnMvc2VxdWVsaXplLW1vZGVsLnNjYW5uZXJcIjtcbmltcG9ydCB7IE0sIFNlcXVlbGl6ZVV0aWxzIH0gZnJvbSBcIi4uL3NlcXVlbGl6ZS51dGlsc1wiO1xuaW1wb3J0IHsgQmFzZUZpbHRlciB9IGZyb20gXCIuL2Jhc2UtZmlsdGVyXCI7XG5pbXBvcnQgeyBGaWx0ZXJVdGlscyB9IGZyb20gXCIuL2ZpbHRlci51dGlsc1wiO1xuaW1wb3J0IHtcbiAgICBGaWx0ZXIsXG4gICAgRmlsdGVyQ29uZGl0aW9uLFxuICAgIEZpbHRlckNvbmRpdGlvblJ1bGUsXG4gICAgRmlsdGVyRGVmaW5pdGlvbixcbiAgICBTZWxlY3RGaWx0ZXIsXG4gICAgU2VsZWN0RmlsdGVyVmFsdWVcbn0gZnJvbSBcIi4vZmlsdGVyc1wiO1xuaW1wb3J0IHsgR2VvTG9jYWxpemF0aW9uRmlsdGVyIH0gZnJvbSBcIi4vZmlsdGVycy9nZW8tbG9jYWxpemF0aW9uLmZpbHRlclwiO1xuaW1wb3J0IHsgR3JvdXBGaWx0ZXIsIEdyb3VwRmlsdGVyRGVmaW5pdGlvbiB9IGZyb20gXCIuL2ZpbHRlcnMvZ3JvdXAuZmlsdGVyXCI7XG5pbXBvcnQgeyBRdWVyeU1vZGVsLCBRdWVyeVJ1bGVNb2RlbCB9IGZyb20gXCIuL21vZGVsc1wiO1xuaW1wb3J0IHsgRmlsdGVyQ29uZmlndXJhdGlvblNlYXJjaE1vZGVsIH0gZnJvbSBcIi4vbW9kZWxzL2ZpbHRlci1jb25maWd1cmF0aW9uLXNlYXJjaC5tb2RlbFwiO1xuaW1wb3J0IHsgRmlsdGVyQ29uZmlndXJhdGlvbk1vZGVsIH0gZnJvbSBcIi4vbW9kZWxzL2ZpbHRlci1jb25maWd1cmF0aW9uLm1vZGVsXCI7XG5pbXBvcnQgeyBGaWx0ZXJSZXNvdXJjZVZhbHVlTW9kZWwgfSBmcm9tIFwiLi9tb2RlbHMvZmlsdGVyLXJlc291cmNlLXZhbHVlLm1vZGVsXCI7XG5pbXBvcnQgeyBPcmRlclJ1bGUsIE9yZGVyUnVsZURlZmluaXRpb24gfSBmcm9tIFwiLi9vcmRlci1ydWxlcy9vcmRlci1ydWxlXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGaWx0ZXJTZXJ2aWNlPERhdGE+IHtcbiAgICBwcml2YXRlIGRlZmluaXRpb25zOiB7IFtuYW1lOiBzdHJpbmddOiBGaWx0ZXJEZWZpbml0aW9uIHwgR3JvdXBGaWx0ZXJEZWZpbml0aW9uIHwgT3JkZXJSdWxlRGVmaW5pdGlvbiB9O1xuICAgIHByaXZhdGUgcmVwb3NpdG9yeTogRGF0YUZpbHRlclJlcG9zaXRvcnk8RGF0YT47XG4gICAgcHJpdmF0ZSBleHBvcnRSZXBvc2l0b3J5OiBEYXRhRmlsdGVyUmVwb3NpdG9yeTxEYXRhPjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGFjY2Vzc0NvbnRyb2xBZGFwdGVyOiBBY2Nlc3NDb250cm9sQWRhcHRlcixcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGVBZGFwdGVyOiBUcmFuc2xhdGVBZGFwdGVyLFxuICAgICAgICBwcml2YXRlIG1vZGVsOiBCYXNlRmlsdGVyPERhdGE+LFxuICAgICAgICBwcml2YXRlIHNlcXVlbGl6ZU1vZGVsU2Nhbm5lcjogU2VxdWVsaXplTW9kZWxTY2FubmVyLFxuICAgICAgICBwcml2YXRlIGRhdGFGaWx0ZXI6IERhdGFGaWx0ZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG9wdGlvbnM/OiB7IGRpc2FibGVBY2Nlc3NDb250cm9sPzogYm9vbGVhbiB9XG4gICAgKSB7XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb3JEYXRhPFQ+KGRhdGFEZWY6IFR5cGU8VD4pOiBGaWx0ZXJTZXJ2aWNlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJTZXJ2aWNlKFxuICAgICAgICAgICAgdGhpcy5hY2Nlc3NDb250cm9sQWRhcHRlcixcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlQWRhcHRlcixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLm1vZGVsLFxuICAgICAgICAgICAgICAgIGRhdGFEZWZpbml0aW9uOiBkYXRhRGVmXG4gICAgICAgICAgICB9IGFzIHVua25vd24gYXMgQmFzZUZpbHRlcjxUPixcbiAgICAgICAgICAgIHRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLFxuICAgICAgICAgICAgdGhpcy5kYXRhRmlsdGVyLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZyhyZXF1ZXN0OiBhbnksIHVzZXI/OiBEYXRhRmlsdGVyVXNlck1vZGVsKTogUHJvbWlzZTxGaWx0ZXJDb25maWd1cmF0aW9uTW9kZWxbXT4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IEZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpIHx8IE9yZGVyUnVsZS52YWxpZGF0ZSh0aGlzLmRlZmluaXRpb25zW2tleV0gYXMgT3JkZXJSdWxlRGVmaW5pdGlvbikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgKHRoaXMuZGVmaW5pdGlvbnNba2V5XSBhcyBGaWx0ZXJEZWZpbml0aW9uKS5nZXRDb25maWcoa2V5LCByZXF1ZXN0LCB1c2VyKTtcbiAgICAgICAgICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgICAgIGlkOiBrZXksXG4gICAgICAgICAgICAgICAgbmFtZTogYXdhaXQgdGhpcy50cmFuc2xhdGVBZGFwdGVyLmdldFRyYW5zbGF0aW9uKHVzZXIubGFuZ3VhZ2UsIEZpbHRlclV0aWxzLmdldEZpbHRlclRyYW5zbGF0aW9uS2V5KGtleSkpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlYXJjaENvbmZpZ1ZhbHVlcyhcbiAgICAgICAgcmVxdWVzdDogYW55LFxuICAgICAgICBzZWFyY2g6IEZpbHRlckNvbmZpZ3VyYXRpb25TZWFyY2hNb2RlbCxcbiAgICAgICAgdXNlcj86IERhdGFGaWx0ZXJVc2VyTW9kZWxcbiAgICApOiBQcm9taXNlPFNlbGVjdEZpbHRlclZhbHVlW10+IHtcbiAgICAgICAgaWYgKCF0aGlzLmRlZmluaXRpb25zLmhhc093blByb3BlcnR5KHNlYXJjaC5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZGVmaW5pdGlvbnNbc2VhcmNoLmlkXTtcbiAgICAgICAgaWYgKGZpbHRlciBpbnN0YW5jZW9mIFNlbGVjdEZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZpbHRlci52YWx1ZXMoe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBzZWFyY2gudmFsdWUsXG4gICAgICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMuY29udmVydE51bWJlcihzZWFyY2gucGFnZSksXG4gICAgICAgICAgICAgICAgcGFnZVNpemU6IHRoaXMuY29udmVydE51bWJlcihzZWFyY2gucGFnZVNpemUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb252ZXJ0TnVtYmVyKHZhbHVlPzogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyc2VkTnVtYmVyID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGlzTmFOKHBhcnNlZE51bWJlcikgPyBudWxsIDogcGFyc2VkTnVtYmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kUmVzb3VyY2VWYWx1ZUJ5SWQocmVxdWVzdDogYW55LCBzZWFyY2g6IEZpbHRlclJlc291cmNlVmFsdWVNb2RlbCwgdXNlcj86IERhdGFGaWx0ZXJVc2VyTW9kZWwpOiBQcm9taXNlPFNlbGVjdEZpbHRlclZhbHVlIHwgbnVsbD4ge1xuICAgICAgICBpZiAoIXRoaXMuZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkoc2VhcmNoLmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5kZWZpbml0aW9uc1tzZWFyY2guaWRdO1xuICAgICAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgU2VsZWN0RmlsdGVyICYmIGZpbHRlci5nZXRSZXNvdXJjZUJ5SWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmaWx0ZXIuZ2V0UmVzb3VyY2VCeUlkKHsgaWQ6IHNlYXJjaC5yZXNvdXJjZUlkLCB1c2VyLCByZXF1ZXN0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjb3VudCh1c2VyOiBEYXRhRmlsdGVyVXNlck1vZGVsLCBvcHRpb25zOiBGaWx0ZXJRdWVyeU1vZGVsKTogUHJvbWlzZTxudW1iZXI+O1xuICAgIHB1YmxpYyBhc3luYyBjb3VudChvcHRpb25zOiBGaWx0ZXJRdWVyeU1vZGVsKTogUHJvbWlzZTxudW1iZXI+O1xuICAgIHB1YmxpYyBhc3luYyBjb3VudCguLi5hcmdzOiBbRGF0YUZpbHRlclVzZXJNb2RlbCB8IEZpbHRlclF1ZXJ5TW9kZWwsIEZpbHRlclF1ZXJ5TW9kZWw/XSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IFt1c2VyT3JPcHQsIG9wdF0gPSBhcmdzO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gb3B0ID8gb3B0IDogdXNlck9yT3B0IGFzIEZpbHRlclF1ZXJ5TW9kZWw7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBvcHQgPyB1c2VyT3JPcHQgYXMgRGF0YUZpbHRlclVzZXJNb2RlbCA6IG51bGw7XG5cbiAgICAgICAgY29uc3QgY291bnRPcHRpb25zID0gYXdhaXQgdGhpcy5nZXRGaW5kT3B0aW9ucyh0aGlzLnJlcG9zaXRvcnkubW9kZWwsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICB0aGlzLmFkZFNlYXJjaENvbmRpdGlvbihvcHRpb25zLnNlYXJjaCwgY291bnRPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHVzZXIgPyB0aGlzLmNvdW50VG90YWxWYWx1ZXModXNlciwgY291bnRPcHRpb25zKSA6IHRoaXMuY291bnRUb3RhbFZhbHVlcyhjb3VudE9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaWx0ZXIodXNlcjogRGF0YUZpbHRlclVzZXJNb2RlbCwgb3B0aW9uczogRmlsdGVyUXVlcnlNb2RlbCk6IFByb21pc2U8RmlsdGVyUmVzdWx0TW9kZWw8RGF0YT4+O1xuICAgIHB1YmxpYyBhc3luYyBmaWx0ZXIob3B0aW9uczogRmlsdGVyUXVlcnlNb2RlbCk6IFByb21pc2U8RmlsdGVyUmVzdWx0TW9kZWw8RGF0YT4+O1xuICAgIHB1YmxpYyBhc3luYyBmaWx0ZXIoLi4uYXJnczogW0RhdGFGaWx0ZXJVc2VyTW9kZWwgfCBGaWx0ZXJRdWVyeU1vZGVsLCBGaWx0ZXJRdWVyeU1vZGVsP10pOiBQcm9taXNlPEZpbHRlclJlc3VsdE1vZGVsPERhdGE+PiB7XG4gICAgICAgIGNvbnN0IFt1c2VyT3JPcHQsIG9wdF0gPSBhcmdzO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gb3B0ID8gb3B0IDogdXNlck9yT3B0IGFzIEZpbHRlclF1ZXJ5TW9kZWw7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBvcHQgPyB1c2VyT3JPcHQgYXMgRGF0YUZpbHRlclVzZXJNb2RlbCA6IG51bGw7XG5cbiAgICAgICAgb3B0aW9ucy5vcmRlciA9IHRoaXMubm9ybWFsaXplT3JkZXIob3B0aW9ucy5vcmRlcik7XG5cbiAgICAgICAgY29uc3QgY291bnRPcHRpb25zID0gYXdhaXQgdGhpcy5nZXRGaW5kT3B0aW9ucyh0aGlzLnJlcG9zaXRvcnkubW9kZWwsIG9wdGlvbnMucXVlcnksIG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIHRoaXMuYWRkU2VhcmNoQ29uZGl0aW9uKG9wdGlvbnMuc2VhcmNoLCBjb3VudE9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZE9yZGVyQ29uZGl0aW9uKG9wdGlvbnMub3JkZXIsIGNvdW50T3B0aW9ucywgb3B0aW9ucy5kYXRhKTtcbiAgICAgICAgdGhpcy5hZGRHcm91cE9wdGlvbihvcHRpb25zLCBjb3VudE9wdGlvbnMpO1xuXG4gICAgICAgIGNvbnN0IHRvdGFsID0gYXdhaXQgKHVzZXIgPyB0aGlzLmNvdW50VG90YWxWYWx1ZXModXNlciwgY291bnRPcHRpb25zKSA6IHRoaXMuY291bnRUb3RhbFZhbHVlcyhjb3VudE9wdGlvbnMpKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gYXdhaXQgKHVzZXIgPyB0aGlzLmZpbmRWYWx1ZXModXNlciwgb3B0aW9ucywgY291bnRPcHRpb25zKSA6IHRoaXMuZmluZFZhbHVlcyhvcHRpb25zLCBjb3VudE9wdGlvbnMpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgICAgcGFnZTogb3B0aW9ucy5wYWdlLFxuICAgICAgICAgICAgdmFsdWVzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvd25sb2FkRGF0YShcbiAgICAgICAgdXNlcjogRGF0YUZpbHRlclVzZXJNb2RlbCxcbiAgICAgICAgdHlwZTogRXhwb3J0VHlwZXMsXG4gICAgICAgIG9wdGlvbnM6IEZpbHRlclF1ZXJ5TW9kZWwsXG4gICAgICAgIGV4cG9ydE9wdGlvbnM/OiBvYmplY3RcbiAgICApOiBQcm9taXNlPEJ1ZmZlciB8IHN0cmluZz4ge1xuICAgICAgICBjb25zdCBmaW5kT3B0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0RmluZE9wdGlvbnModGhpcy5leHBvcnRSZXBvc2l0b3J5Lm1vZGVsLCBvcHRpb25zLnF1ZXJ5KTtcblxuICAgICAgICBvcHRpb25zLm9yZGVyID0gdGhpcy5ub3JtYWxpemVPcmRlcihvcHRpb25zLm9yZGVyKTtcblxuICAgICAgICB0aGlzLmFkZFNlYXJjaENvbmRpdGlvbihvcHRpb25zLnNlYXJjaCwgZmluZE9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZE9yZGVyQ29uZGl0aW9uKG9wdGlvbnMub3JkZXIsIGZpbmRPcHRpb25zLCBvcHRpb25zLmRhdGEpO1xuICAgICAgICBkZWxldGUgb3B0aW9ucy5wYWdlO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCAodXNlciA/IHRoaXMuZmluZFZhbHVlcyh1c2VyLCBvcHRpb25zLCBmaW5kT3B0aW9ucywgdGhpcy5leHBvcnRSZXBvc2l0b3J5KSA6IHRoaXMuZmluZFZhbHVlcyhvcHRpb25zLCBmaW5kT3B0aW9ucywgdGhpcy5leHBvcnRSZXBvc2l0b3J5KSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLm1vZGVsLmdldEV4cG9ydGVkRmllbGRzS2V5cyh0eXBlKTtcbiAgICAgICAgaWYgKGhlYWRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgUHJvbWlzZS5hbGwodmFsdWVzLm1hcCgodmFsdWUpID0+IHRoaXMubW9kZWwuZ2V0RXhwb3J0ZWRGaWVsZHModmFsdWUsIHVzZXI/Lmxhbmd1YWdlID8/IFwiZnJcIiwgdHlwZSkpKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcG9zaXRvcnkuZG93bmxvYWREYXRhKGhlYWRlcnMsIGRhdGEsIHR5cGUsIHVzZXI/Lmxhbmd1YWdlID8/IFwiZnJcIiwgZXhwb3J0T3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXBvc2l0b3J5LmRvd25sb2FkRGF0YSh2YWx1ZXMsIHR5cGUsIHVzZXI/Lmxhbmd1YWdlID8/IFwiZnJcIiwgZXhwb3J0T3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RmluZE9wdGlvbnMobW9kZWw6IHR5cGVvZiBNLCBxdWVyeTogUXVlcnlNb2RlbCwgZGF0YT86IG9iamVjdCk6IFByb21pc2U8RmluZE9wdGlvbnM+IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlc2V0IEdlbyBsb2NhbGl6YXRpb24gZmlsdGVyIHN0YXRlXG4gICAgICAgICAqL1xuICAgICAgICBHZW9Mb2NhbGl6YXRpb25GaWx0ZXIucmVzZXQoKTtcblxuICAgICAgICBxdWVyeSA9IHRoaXMuYWRkRGVmYXVsdEZpbHRlcihxdWVyeSk7XG4gICAgICAgIGxldCBvcHRpb246IEZpbmRPcHRpb25zID0ge307XG4gICAgICAgIGlmIChxdWVyeSkge1xuICAgICAgICAgICAgY29uc3Qgd2hlcmVDb25kaXRpb25zID0gW107XG4gICAgICAgICAgICBjb25zdCBoYXZpbmdDb25kaXRpb25zID0gW107XG5cbiAgICAgICAgICAgIG9wdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICAgICAgaW5jbHVkZTogYXdhaXQgdGhpcy5nZXRJbmNsdWRlKG1vZGVsLCBxdWVyeSwgZGF0YSksXG4gICAgICAgICAgICAgICAgd2hlcmU6IHF1ZXJ5LmNvbmRpdGlvbiA9PT0gXCJhbmRcIiA/IHsgW09wLmFuZF06IHdoZXJlQ29uZGl0aW9ucyB9IDogeyBbT3Aub3JdOiB3aGVyZUNvbmRpdGlvbnMgfSxcbiAgICAgICAgICAgICAgICBoYXZpbmc6IHF1ZXJ5LmNvbmRpdGlvbiA9PT0gXCJhbmRcIiA/IHsgW09wLmFuZF06IGhhdmluZ0NvbmRpdGlvbnMgfSA6IHsgW09wLm9yXTogaGF2aW5nQ29uZGl0aW9ucyB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbm9pZCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVXaGVyZU9wdGlvbnMocXVlcnksIHdoZXJlQ29uZGl0aW9ucyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlSGF2aW5nT3B0aW9ucyhxdWVyeSwgaGF2aW5nQ29uZGl0aW9ucyk7XG5cbiAgICAgICAgICAgIGlmICghcGFyYW5vaWQpIHtcbiAgICAgICAgICAgICAgICBvcHRpb24ucGFyYW5vaWQgPSBwYXJhbm9pZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFoYXZpbmdDb25kaXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb24uaGF2aW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXQoKSB7XG4gICAgICAgIHRoaXMucmVwb3NpdG9yeSA9IHRoaXMuZGF0YUZpbHRlci5mb3IodGhpcy5tb2RlbC5kYXRhRGVmaW5pdGlvbik7XG4gICAgICAgIHRoaXMuZXhwb3J0UmVwb3NpdG9yeSA9IHRoaXMuZGF0YUZpbHRlci5mb3IodGhpcy5tb2RlbC5leHBvcnREYXRhRGVmaW5pdGlvbiA/PyB0aGlzLm1vZGVsLmRhdGFEZWZpbml0aW9uKTtcbiAgICAgICAgdGhpcy5tb2RlbC50cmFuc2xhdGVTZXJ2aWNlID0gdGhpcy50cmFuc2xhdGVBZGFwdGVyO1xuXG4gICAgICAgIHRoaXMuZGVmaW5pdGlvbnMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5tb2RlbCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1vZGVsLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFGaWx0ZXIudmFsaWRhdGUodGhpcy5tb2RlbFtrZXldIGFzIEZpbHRlckRlZmluaXRpb24pICYmXG4gICAgICAgICAgICAgICAgIUdyb3VwRmlsdGVyLnZhbGlkYXRlKHRoaXMubW9kZWxba2V5XSBhcyBHcm91cEZpbHRlckRlZmluaXRpb24pICYmXG4gICAgICAgICAgICAgICAgIU9yZGVyUnVsZS52YWxpZGF0ZSh0aGlzLm1vZGVsW2tleV0gYXMgT3JkZXJSdWxlRGVmaW5pdGlvbilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRlZmluaXRpb25zW2tleV0gPSB0aGlzLm1vZGVsW2tleV0gYXMgRmlsdGVyRGVmaW5pdGlvbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0SW5jbHVkZShtb2RlbDogdHlwZW9mIE0sIHF1ZXJ5OiBRdWVyeU1vZGVsLCBkYXRhPzogb2JqZWN0KTogUHJvbWlzZTxJbmNsdWRlYWJsZVtdPiB7XG4gICAgICAgIGlmICghcXVlcnkucnVsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluY2x1ZGVzOiBJbmNsdWRlT3B0aW9uc1tdW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHF1ZXJ5LnJ1bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBtID0gcnVsZSBhcyBRdWVyeU1vZGVsO1xuICAgICAgICAgICAgaWYgKG0uY29uZGl0aW9uKSB7XG4gICAgICAgICAgICAgICAgaW5jbHVkZXMucHVzaChhd2FpdCB0aGlzLmdldEluY2x1ZGUobW9kZWwsIG0sIGRhdGEpIGFzIEluY2x1ZGVPcHRpb25zW10pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByID0gcnVsZSBhcyBRdWVyeVJ1bGVNb2RlbDtcbiAgICAgICAgICAgIGlmICghdGhpcy5kZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eShyLmlkKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmRlZmluaXRpb25zW3IuaWRdO1xuICAgICAgICAgICAgaWYgKChmaWx0ZXIgYXMgR3JvdXBGaWx0ZXJEZWZpbml0aW9uKS5yb290RmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZiA9IGZpbHRlciBhcyBHcm91cEZpbHRlckRlZmluaXRpb247XG4gICAgICAgICAgICAgICAgaW5jbHVkZXMucHVzaCguLi50aGlzLmdldEZpbHRlckluY2x1ZGUobW9kZWwsIGYucm9vdEZpbHRlciwgciwgZGF0YSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFmLmxhenlMb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzLnB1c2goLi4udGhpcy5nZXRGaWx0ZXJJbmNsdWRlKG1vZGVsLCBmLnZhbHVlRmlsdGVyLCByLCBkYXRhKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVGaWxlciA9IGF3YWl0IGYuZ2V0VmFsdWVGaWx0ZXIoci52YWx1ZVswXSk7XG4gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzLnB1c2goLi4udGhpcy5nZXRGaWx0ZXJJbmNsdWRlKG1vZGVsLCB2YWx1ZUZpbGVyIGFzIEZpbHRlckRlZmluaXRpb24sIHIsIGRhdGEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGluY2x1ZGVzLnB1c2goLi4udGhpcy5nZXRGaWx0ZXJJbmNsdWRlKG1vZGVsLCBmaWx0ZXIgYXMgRmlsdGVyRGVmaW5pdGlvbiwgciwgZGF0YSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTZXF1ZWxpemVVdGlscy5yZWR1Y2VJbmNsdWRlcyhpbmNsdWRlcywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDb25kaXRpb25JbmNsdWRlKG1vZGVsOiB0eXBlb2YgTSwgY29uZGl0aW9uOiBGaWx0ZXJDb25kaXRpb24pOiBJbmNsdWRlT3B0aW9uc1tdIHtcbiAgICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluY2x1ZGVzOiBJbmNsdWRlT3B0aW9uc1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBjb25kaXRpb24ucnVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBydWxlIGFzIEZpbHRlckNvbmRpdGlvbjtcbiAgICAgICAgICAgIGlmIChjLmNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgIGluY2x1ZGVzLnB1c2goLi4udGhpcy5nZXRDb25kaXRpb25JbmNsdWRlKG1vZGVsLCBjb25kaXRpb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHIgPSBydWxlIGFzIEZpbHRlckNvbmRpdGlvblJ1bGU7XG4gICAgICAgICAgICBpZiAoci5wYXRoKSB7XG4gICAgICAgICAgICAgICAgaW5jbHVkZXMucHVzaCguLi50aGlzLnNlcXVlbGl6ZU1vZGVsU2Nhbm5lci5nZXRJbmNsdWRlcyhtb2RlbCwgeyBwYXRoOiByLnBhdGggfSwgW10sIHsgaW5jbHVkZTogW10gfSwgdHJ1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmNsdWRlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlV2hlcmVPcHRpb25zKHF1ZXJ5OiBRdWVyeU1vZGVsLCBvcHRpb25zOiBXaGVyZU9wdGlvbnNbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoIXF1ZXJ5LnJ1bGVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyYW5vaWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcXVlcnkucnVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBydWxlIGFzIFF1ZXJ5TW9kZWw7XG4gICAgICAgICAgICBpZiAoYy5jb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25zID0gW107XG4gICAgICAgICAgICAgICAgY29uc3Qgb3AgPSBjLmNvbmRpdGlvbiA9PT0gXCJhbmRcIiA/IE9wLmFuZCA6IE9wLm9yO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdoZXJlID0geyBbb3BdOiBjb25kaXRpb25zIH07XG4gICAgICAgICAgICAgICAgcGFyYW5vaWQgPSBwYXJhbm9pZCAmJiBhd2FpdCB0aGlzLmdlbmVyYXRlV2hlcmVPcHRpb25zKGMsIGNvbmRpdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHdoZXJlW29wIGFzIGFueV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaCh3aGVyZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHIgPSBydWxlIGFzIFF1ZXJ5UnVsZU1vZGVsO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRlZmluaXRpb25zLmhhc093blByb3BlcnR5KHIuaWQpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZGVmaW5pdGlvbnNbci5pZF0gYXMgRmlsdGVyRGVmaW5pdGlvbjtcbiAgICAgICAgICAgIGlmICghT3JkZXJSdWxlLnZhbGlkYXRlKGZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJPcHRpb25zID0gYXdhaXQgZmlsdGVyLmdldFdoZXJlT3B0aW9ucyhyKTtcblxuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaChmaWx0ZXJPcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJhbm9pZCA9IGZpbHRlci5wYXJhbm9pZCA/PyB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFub2lkO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVIYXZpbmdPcHRpb25zKHF1ZXJ5OiBRdWVyeU1vZGVsLCBvcHRpb25zOiBXaGVyZU9wdGlvbnNbXSkge1xuICAgICAgICBpZiAoIXF1ZXJ5LnJ1bGVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcXVlcnkucnVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBydWxlIGFzIFF1ZXJ5TW9kZWw7XG4gICAgICAgICAgICBpZiAoYy5jb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25zID0gW107XG4gICAgICAgICAgICAgICAgY29uc3Qgb3AgPSBjLmNvbmRpdGlvbiA9PT0gXCJhbmRcIiA/IE9wLmFuZCA6IE9wLm9yO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhdmluZyA9IHsgW29wXTogY29uZGl0aW9ucyB9O1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVIYXZpbmdPcHRpb25zKGMsIGNvbmRpdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGhhdmluZ1tvcCBhcyBhbnldLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2goaGF2aW5nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgciA9IHJ1bGUgYXMgUXVlcnlSdWxlTW9kZWw7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkoci5pZCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5kZWZpbml0aW9uc1tyLmlkXSBhcyBGaWx0ZXJEZWZpbml0aW9uO1xuICAgICAgICAgICAgaWYgKCFPcmRlclJ1bGUudmFsaWRhdGUoZmlsdGVyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlck9wdGlvbnMgPSBhd2FpdCBmaWx0ZXIuZ2V0SGF2aW5nT3B0aW9ucyhyKTtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyT3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2goZmlsdGVyT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRTZWFyY2hDb25kaXRpb24oc2VhcmNoOiBGaWx0ZXJTZWFyY2hNb2RlbCwgb3B0aW9uczogQ291bnRPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc2VhcmNoPy52YWx1ZT8udG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKCF2YWx1ZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcG9zaXRvcnkuYWRkU2VhcmNoQ29uZGl0aW9uKHNlYXJjaC52YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRPcmRlckNvbmRpdGlvbihvcmRlcnM6IE9yZGVyTW9kZWxbXSwgb3B0aW9uczogQ291bnRPcHRpb25zLCBkYXRhPzogb2JqZWN0KTogdm9pZCB7XG4gICAgICAgIGlmIChvcmRlcnMuZXZlcnkob3JkZXIgPT4gIW9yZGVyLmRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmRlZmF1bHRPcmRlclJ1bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRPcmRlcnMgPSBBcnJheS5pc0FycmF5KHRoaXMubW9kZWwuZGVmYXVsdE9yZGVyUnVsZS5vcmRlcilcbiAgICAgICAgICAgICAgICA/IHRoaXMubW9kZWwuZGVmYXVsdE9yZGVyUnVsZS5vcmRlclxuICAgICAgICAgICAgICAgIDogW3RoaXMubW9kZWwuZGVmYXVsdE9yZGVyUnVsZS5vcmRlcl07XG5cbiAgICAgICAgICAgIG9yZGVycyA9IFsuLi5kZWZhdWx0T3JkZXJzLCAuLi5vcmRlcnNdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBvcmRlciBvZiBvcmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmRlZmluaXRpb25zW29yZGVyLmNvbHVtbl0gYXMgT3JkZXJSdWxlRGVmaW5pdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVzID0gcnVsZSAmJiBPcmRlclJ1bGUudmFsaWRhdGUocnVsZSkgP1xuICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEluY2x1ZGVzKHRoaXMucmVwb3NpdG9yeS5tb2RlbCwgeyBwYXRoOiBydWxlLnBhdGggfSwgW10pIDpcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG9zaXRvcnkuZ2VuZXJhdGVPcmRlckluY2x1ZGUob3JkZXIsIGRhdGEpO1xuXG4gICAgICAgICAgICBpZiAoIWluY2x1ZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvcHRpb25zLmluY2x1ZGUgPSBTZXF1ZWxpemVVdGlscy5tZXJnZUluY2x1ZGVzKFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5jbHVkZSBhcyBJbmNsdWRlT3B0aW9ucyB8IEluY2x1ZGVPcHRpb25zW10sXG4gICAgICAgICAgICAgICAgaW5jbHVkZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRHcm91cE9wdGlvbihmaWx0ZXI6IEZpbHRlclF1ZXJ5TW9kZWwsIG9wdGlvbnM6IENvdW50T3B0aW9ucyk6IHZvaWQge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMucmVwb3NpdG9yeS5tb2RlbDtcbiAgICAgICAgb3B0aW9ucy5ncm91cCA9IFtgJHttb2RlbC5uYW1lfS5pZGBdO1xuICAgICAgICBpZiAoZmlsdGVyLmdyb3VwQnkpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZ3JvdXAucHVzaChTZXF1ZWxpemVVdGlscy5nZXRHcm91cExpdGVyYWwodGhpcy5yZXBvc2l0b3J5Lm1vZGVsLCBmaWx0ZXIuZ3JvdXBCeSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaWx0ZXIub3JkZXIgfHwgKGZpbHRlci5vcmRlciBpbnN0YW5jZW9mIEFycmF5ICYmICFmaWx0ZXIub3JkZXIubGVuZ3RoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3JkZXJzID0gdGhpcy5ub3JtYWxpemVPcmRlcihmaWx0ZXIub3JkZXIpO1xuICAgICAgICBmb3IgKGNvbnN0IG9yZGVyIG9mIG9yZGVycykge1xuICAgICAgICAgICAgY29uc3QgcnVsZSA9IHRoaXMuZGVmaW5pdGlvbnNbb3JkZXIuY29sdW1uXSBhcyBPcmRlclJ1bGVEZWZpbml0aW9uO1xuICAgICAgICAgICAgaWYgKHJ1bGUgJiYgT3JkZXJSdWxlLnZhbGlkYXRlKHJ1bGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlcG9zaXRvcnkuaGFzQ3VzdG9tQXR0cmlidXRlKG9yZGVyLmNvbHVtbikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gb3JkZXIuY29sdW1uLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHZhbHVlcy5wb3AoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuZ3JvdXAucHVzaChgJHttb2RlbC5uYW1lfS4ke1NlcXVlbGl6ZVV0aWxzLmZpbmRDb2x1bW5GaWVsZE5hbWUobW9kZWwsIGNvbHVtbil9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuZ3JvdXAucHVzaCguLi50aGlzLnNlcXVlbGl6ZU1vZGVsU2Nhbm5lci5nZXRHcm91cChtb2RlbCwgb3JkZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY291bnRUb3RhbFZhbHVlcyh1c2VyOiBEYXRhRmlsdGVyVXNlck1vZGVsLCBvcHRpb25zOiBGaW5kT3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPjtcbiAgICBwcml2YXRlIGFzeW5jIGNvdW50VG90YWxWYWx1ZXMob3B0aW9uczogRmluZE9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj47XG4gICAgcHJpdmF0ZSBhc3luYyBjb3VudFRvdGFsVmFsdWVzKC4uLmFyZ3M6IFtEYXRhRmlsdGVyVXNlck1vZGVsIHwgRmluZE9wdGlvbnMsIEZpbmRPcHRpb25zP10pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBbdXNlck9yT3B0LCBvcHRdID0gYXJncztcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IG9wdCA/IG9wdCA6IHVzZXJPck9wdCBhcyBGaW5kT3B0aW9ucztcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZWFucyB0aGF0IGNvdW50VG90YWxWYWx1ZXMgd2FzIGNhbGxlZCB3aXRoIGEgdXNlclxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKG9wdCkge1xuICAgICAgICAgICAgb3B0aW9ucy53aGVyZSA9IGF3YWl0IHRoaXMuZ2V0QWNjZXNzQ29udHJvbFdoZXJlQ29uZGl0aW9uKG9wdGlvbnMud2hlcmUsIHVzZXJPck9wdCBhcyBEYXRhRmlsdGVyVXNlck1vZGVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmhhdmluZykge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5tb2RlbC5maW5kQWxsKHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgIHN1YlF1ZXJ5OiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IGdyb3VwLCAuLi5jb3VudE9wdGlvbnMgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5tb2RlbC5jb3VudCh7XG4gICAgICAgICAgICAgICAgLi4uY291bnRPcHRpb25zLFxuICAgICAgICAgICAgICAgIGRpc3RpbmN0OiB0cnVlXG4gICAgICAgICAgICB9KSBhcyBudW1iZXIgfCBHcm91cGVkQ291bnRSZXN1bHRJdGVtW107XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmaW5kVmFsdWVzPFVzZXJzIGV4dGVuZHMgRGF0YUZpbHRlclVzZXJNb2RlbD4odXNlcjogVXNlcnMsIGZpbHRlcjogRmlsdGVyUXVlcnlNb2RlbCwgb3B0aW9uczogRmluZE9wdGlvbnMsIHJlcG9zaXRvcnk/OiBEYXRhRmlsdGVyUmVwb3NpdG9yeTxEYXRhPik6IFByb21pc2U8RGF0YVtdPjtcbiAgICBwcml2YXRlIGFzeW5jIGZpbmRWYWx1ZXM8VXNlcnMgZXh0ZW5kcyBEYXRhRmlsdGVyVXNlck1vZGVsPihmaWx0ZXI6IEZpbHRlclF1ZXJ5TW9kZWwsIG9wdGlvbnM6IEZpbmRPcHRpb25zLCByZXBvc2l0b3J5PzogRGF0YUZpbHRlclJlcG9zaXRvcnk8RGF0YT4pOiBQcm9taXNlPERhdGFbXT47XG4gICAgcHJpdmF0ZSBhc3luYyBmaW5kVmFsdWVzPFVzZXJzIGV4dGVuZHMgRGF0YUZpbHRlclVzZXJNb2RlbD4oLi4uYXJnczogW1VzZXJzIHwgRmlsdGVyUXVlcnlNb2RlbCwgRmlsdGVyUXVlcnlNb2RlbCB8IEZpbmRPcHRpb25zLCBGaW5kT3B0aW9ucyB8IERhdGFGaWx0ZXJSZXBvc2l0b3J5PERhdGE+LCBEYXRhRmlsdGVyUmVwb3NpdG9yeTxEYXRhPj9dKTogUHJvbWlzZTxEYXRhW10+IHtcbiAgICAgICAgY29uc3QgW3VzZXJPck9GaWx0ZXIsIGZpbHRlck9yT3B0LCBvcHRPclJlcG8sIHJlcG9dID0gYXJncztcbiAgICAgICAgY29uc3Qgb3B0T3JSZXBvSXNSZXBvID0gb3B0T3JSZXBvIGluc3RhbmNlb2YgRGF0YUZpbHRlclJlcG9zaXRvcnk7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IG9wdE9yUmVwbyAmJiAhb3B0T3JSZXBvSXNSZXBvID8gb3B0T3JSZXBvIDogZmlsdGVyT3JPcHQgYXMgRmluZE9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IG9wdE9yUmVwbyAmJiAhb3B0T3JSZXBvSXNSZXBvID8gZmlsdGVyT3JPcHQgYXMgRmlsdGVyUXVlcnlNb2RlbCA6IHVzZXJPck9GaWx0ZXIgYXMgRmlsdGVyUXVlcnlNb2RlbDtcblxuICAgICAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwbyA/PyAob3B0T3JSZXBvSXNSZXBvID8gb3B0T3JSZXBvIDogdGhpcy5yZXBvc2l0b3J5KTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZWFucyB0aGF0IGZpbmRWYWx1ZXMgd2FzIGNhbGxlZCB3aXRoIGEgdXNlclxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHJlcG8pIHtcbiAgICAgICAgICAgIG9wdGlvbnMud2hlcmUgPSBhd2FpdCB0aGlzLmdldEFjY2Vzc0NvbnRyb2xXaGVyZUNvbmRpdGlvbihvcHRpb25zLndoZXJlLCB1c2VyT3JPRmlsdGVyIGFzIFVzZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9yZGVyID0gdGhpcy5nZXRPcmRlck9wdGlvbnMoZmlsdGVyLm9yZGVyIGFzIE9yZGVyTW9kZWxbXSk7XG5cbiAgICAgICAgY29uc3Qgbm9uTmVzdGVkT3JkZXJDb2x1bW5zID0gKGZpbHRlci5vcmRlciBhcyBPcmRlck1vZGVsW10pXG4gICAgICAgICAgICAubWFwKG9yZGVyID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBydWxlID0gdGhpcy5kZWZpbml0aW9uc1tvcmRlci5jb2x1bW5dIGFzIE9yZGVyUnVsZURlZmluaXRpb247XG4gICAgICAgICAgICAgICAgaWYgKCFydWxlIHx8ICFPcmRlclJ1bGUudmFsaWRhdGUocnVsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yZGVyLmNvbHVtbjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3J1bGUucGF0aCA/PyBcIlwiLCBydWxlLmF0dHJpYnV0ZV0uam9pbihcIi5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoY29sdW1uID0+IGNvbHVtbiAmJiAhY29sdW1uLmluY2x1ZGVzKFwiLlwiKSAmJiAhcmVwb3NpdG9yeS5oYXNDdXN0b21BdHRyaWJ1dGUoY29sdW1uKSk7XG4gICAgICAgIGNvbnN0IGN1c3RvbUF0dHJpYnV0ZXMgPSB0aGlzLmdldE9yZGVyQ3VzdG9tQXR0cmlidXRlKGZpbHRlci5vcmRlciBhcyBPcmRlck1vZGVsW10sIGZpbHRlci5kYXRhKTtcblxuICAgICAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCByZXBvc2l0b3J5Lm1vZGVsLmZpbmRBbGwoe1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcImlkXCIsIC4uLm5vbk5lc3RlZE9yZGVyQ29sdW1ucywgLi4uY3VzdG9tQXR0cmlidXRlc10sXG4gICAgICAgICAgICBsaW1pdDogZmlsdGVyLnBhZ2UgPyBmaWx0ZXIucGFnZS5zaXplIDogbnVsbCxcbiAgICAgICAgICAgIG9mZnNldDogZmlsdGVyLnBhZ2UgPyBmaWx0ZXIucGFnZS5udW1iZXIgKiBmaWx0ZXIucGFnZS5zaXplICsgKGZpbHRlci5wYWdlLm9mZnNldCA/PyAwKSA6IG51bGwsXG4gICAgICAgICAgICBzdWJRdWVyeTogZmFsc2UsXG4gICAgICAgICAgICBncm91cDogZmlsdGVyLmdyb3VwQnkgPz8gb3B0aW9ucy5ncm91cCxcbiAgICAgICAgICAgIG9yZGVyXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5nZW5lcmF0ZVJlcG9zaXRvcnlHcm91cEJ5KGZpbHRlcik7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXBvc2l0b3J5LmZpbmRBbGwoe1xuICAgICAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICAgICAgICBpZDogdmFsdWVzLm1hcCh4ID0+IHguaWQpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3JkZXIsXG4gICAgICAgICAgICBwYXJhbm9pZDogb3B0aW9ucy5wYXJhbm9pZCxcbiAgICAgICAgICAgIGdyb3VwXG4gICAgICAgIH0sIGZpbHRlci5kYXRhID8/IHt9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEFjY2Vzc0NvbnRyb2xXaGVyZUNvbmRpdGlvbih3aGVyZTogV2hlcmVPcHRpb25zLCB1c2VyOiBEYXRhRmlsdGVyVXNlck1vZGVsKTogUHJvbWlzZTxXaGVyZU9wdGlvbnM+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucz8uZGlzYWJsZUFjY2Vzc0NvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybiB3aGVyZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdXNlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdXNlciBmb3VuZFwiKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5hY2Nlc3NDb250cm9sQWRhcHRlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWNjZXNzQ29udHJvbCBpc24ndCBlbmFibGUgaW4geW91ciBwcm9qZWN0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb3VyY2VzID0gYXdhaXQgdGhpcy5hY2Nlc3NDb250cm9sQWRhcHRlci5nZXRSZXNvdXJjZXModGhpcy5yZXBvc2l0b3J5Lm1vZGVsLCB1c2VyKTtcbiAgICAgICAgaWYgKHJlc291cmNlcy5pZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBTZXF1ZWxpemVVdGlscy5tZXJnZVdoZXJlKHsgaWQ6IHJlc291cmNlcy5pZHMgfSwgd2hlcmUgPz8ge30pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvdXJjZXMud2hlcmUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgW09wLmFuZF06IFtcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLndoZXJlLFxuICAgICAgICAgICAgICAgICAgICB3aGVyZSA/PyB7fVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2hlcmU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGaWx0ZXJJbmNsdWRlKFxuICAgICAgICBtb2RlbDogdHlwZW9mIE0sXG4gICAgICAgIGZpbHRlcjogRmlsdGVyRGVmaW5pdGlvbixcbiAgICAgICAgcnVsZTogUXVlcnlSdWxlTW9kZWwsXG4gICAgICAgIGRhdGE/OiBvYmplY3RcbiAgICApOiBJbmNsdWRlT3B0aW9uc1tdW10ge1xuICAgICAgICBjb25zdCBpbmNsdWRlczogSW5jbHVkZU9wdGlvbnNbXVtdID0gW107XG4gICAgICAgIGNvbnN0IHBhdGhzID0gZmlsdGVyLmdldEluY2x1ZGVQYXRocyhydWxlLCBkYXRhKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICAgICAgICBpbmNsdWRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEluY2x1ZGVzKG1vZGVsLCBwYXRoLCBbXSwgW10sIHRydWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaWx0ZXIucGF0aCkge1xuICAgICAgICAgICAgaW5jbHVkZXMucHVzaCh0aGlzLmdldENvbmRpdGlvbkluY2x1ZGUobW9kZWwsIGZpbHRlci5jb25kaXRpb24pKTtcbiAgICAgICAgICAgIHJldHVybiBpbmNsdWRlcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi5pbmNsdWRlcyxcbiAgICAgICAgICAgIHRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEluY2x1ZGVzKG1vZGVsLCB7XG4gICAgICAgICAgICAgICAgcGF0aDogZmlsdGVyLnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyYW5vaWQ6IGZpbHRlci5wYXJhbm9pZCxcbiAgICAgICAgICAgICAgICB3aGVyZTogRmlsdGVyVXRpbHMuZ2VuZXJhdGVXaGVyZUNvbmRpdGlvbnMoZmlsdGVyLndoZXJlLCBkYXRhKVxuICAgICAgICAgICAgfSwgW10sIFtdLCB0cnVlKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29uZGl0aW9uSW5jbHVkZShtb2RlbCwgZmlsdGVyLmNvbmRpdGlvbilcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE9yZGVyT3B0aW9ucyhvcmRlcnM6IE9yZGVyTW9kZWwgfCBPcmRlck1vZGVsW10pOiBPcmRlciB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcmRlcnMpKSB7XG4gICAgICAgICAgICBvcmRlcnMgPSBbb3JkZXJzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmRlZmF1bHRPcmRlclJ1bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRPcmRlcnMgPSBBcnJheS5pc0FycmF5KHRoaXMubW9kZWwuZGVmYXVsdE9yZGVyUnVsZS5vcmRlcilcbiAgICAgICAgICAgICAgICA/IHRoaXMubW9kZWwuZGVmYXVsdE9yZGVyUnVsZS5vcmRlclxuICAgICAgICAgICAgICAgIDogW3RoaXMubW9kZWwuZGVmYXVsdE9yZGVyUnVsZS5vcmRlcl07XG5cbiAgICAgICAgICAgIG9yZGVycyA9IFsuLi5kZWZhdWx0T3JkZXJzLCAuLi5vcmRlcnNdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkT3JkZXI6IE9yZGVyID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBvcmRlciBvZiBvcmRlcnMpIHtcbiAgICAgICAgICAgIGlmICghb3JkZXI/LmNvbHVtbiB8fCAhb3JkZXIuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlcG9zaXRvcnkuaGFzQ3VzdG9tQXR0cmlidXRlKG9yZGVyLmNvbHVtbikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSBvcmRlci5udWxsTGFzdCA/IGAtJHtvcmRlci5jb2x1bW59YCA6IG9yZGVyLmNvbHVtbjtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBvcmRlci5udWxsTGFzdCA/IG9yZGVyLmRpcmVjdGlvbiA9PT0gXCJhc2NcIiA/IFwiZGVzY1wiIDogXCJhc2NcIiA6IG9yZGVyLmRpcmVjdGlvbjtcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZWRPcmRlci5wdXNoKFtsaXRlcmFsKGNvbHVtbiksIGRpcmVjdGlvbi50b1VwcGVyQ2FzZSgpXSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmRlZmluaXRpb25zW29yZGVyLmNvbHVtbl0gYXMgT3JkZXJSdWxlRGVmaW5pdGlvbjtcbiAgICAgICAgICAgIGlmICghcnVsZSB8fCAhT3JkZXJSdWxlLnZhbGlkYXRlKHJ1bGUpKSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVkT3JkZXIucHVzaCh0aGlzLnNlcXVlbGl6ZU1vZGVsU2Nhbm5lci5nZXRPcmRlcih0aGlzLnJlcG9zaXRvcnkubW9kZWwsIG9yZGVyKSBhcyBPcmRlckl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZWRPcmRlci5wdXNoKFtydWxlLmdldE9yZGVyT3B0aW9uKHRoaXMucmVwb3NpdG9yeS5tb2RlbCksIG9yZGVyLmRpcmVjdGlvbi50b1VwcGVyQ2FzZSgpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVkT3JkZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRPcmRlckN1c3RvbUF0dHJpYnV0ZShvcmRlcnM6IE9yZGVyTW9kZWwgfCBPcmRlck1vZGVsW10sIGRhdGE/OiBvYmplY3QpOiBQcm9qZWN0aW9uQWxpYXNbXSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcmRlcnMpKSB7XG4gICAgICAgICAgICBvcmRlcnMgPSBbb3JkZXJzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXM6IFByb2plY3Rpb25BbGlhc1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgb3JkZXIgb2Ygb3JkZXJzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVwb3NpdG9yeS5oYXNDdXN0b21BdHRyaWJ1dGUob3JkZXIuY29sdW1uKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjdXN0b21BdHRyaWJ1dGUgPSB0aGlzLnJlcG9zaXRvcnkuZ2V0Q3VzdG9tQXR0cmlidXRlKG9yZGVyLmNvbHVtbik7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBjdXN0b21BdHRyaWJ1dGUudHJhbnNmb3JtKGRhdGEpIGFzIFByb2plY3Rpb25BbGlhcztcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlUmVwb3NpdG9yeUdyb3VwQnkoZmlsdGVyOiBGaWx0ZXJRdWVyeU1vZGVsKTogR3JvdXBPcHRpb24gfCBudWxsIHtcbiAgICAgICAgY29uc3QgZ3JvdXA6IEdyb3VwT3B0aW9uID0gW107XG4gICAgICAgIGlmIChmaWx0ZXIuZ3JvdXBCeSkge1xuICAgICAgICAgICAgZ3JvdXAucHVzaChTZXF1ZWxpemVVdGlscy5nZXRHcm91cExpdGVyYWwodGhpcy5yZXBvc2l0b3J5Lm1vZGVsLCBmaWx0ZXIuZ3JvdXBCeSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ3JvdXBCeSA9IHRoaXMucmVwb3NpdG9yeS5nZXRDdXN0b21BdHRyaWJ1dGVHcm91cEJ5KCk7XG4gICAgICAgIGlmICghZ3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBncm91cDtcbiAgICAgICAgfVxuXG4gICAgICAgIGdyb3VwLnB1c2goLi4uZ3JvdXBCeSk7XG4gICAgICAgIGlmICghZmlsdGVyLm9yZGVyIHx8IChmaWx0ZXIub3JkZXIgaW5zdGFuY2VvZiBBcnJheSAmJiAhZmlsdGVyLm9yZGVyLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBncm91cDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9yZGVycyA9IHRoaXMubm9ybWFsaXplT3JkZXIoZmlsdGVyLm9yZGVyKTtcbiAgICAgICAgZm9yIChjb25zdCBvcmRlciBvZiBvcmRlcnMpIHtcbiAgICAgICAgICAgIGlmICghb3JkZXI/LmNvbHVtbiB8fCAhb3JkZXIuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlcG9zaXRvcnkuaGFzQ3VzdG9tQXR0cmlidXRlKG9yZGVyLmNvbHVtbikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcnVsZSA9IHRoaXMuZGVmaW5pdGlvbnNbb3JkZXIuY29sdW1uXSBhcyBPcmRlclJ1bGVEZWZpbml0aW9uO1xuICAgICAgICAgICAgaWYgKCFydWxlIHx8ICFPcmRlclJ1bGUudmFsaWRhdGUocnVsZSkpIHtcbiAgICAgICAgICAgICAgICBncm91cC5wdXNoKGAke3RoaXMucmVwb3NpdG9yeS5tb2RlbC5uYW1lfS4ke1NlcXVlbGl6ZVV0aWxzLmZpbmRDb2x1bW5GaWVsZE5hbWUodGhpcy5yZXBvc2l0b3J5Lm1vZGVsLCBvcmRlci5jb2x1bW4pfWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBncm91cC5wdXNoKC4uLnRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEdyb3VwKHRoaXMucmVwb3NpdG9yeS5tb2RlbCwgb3JkZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBncm91cDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZERlZmF1bHRGaWx0ZXIocXVlcnk6IFF1ZXJ5TW9kZWwpOiBRdWVyeU1vZGVsIHtcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsLmRlZmF1bHRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWVyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmRlZmF1bHRGaWx0ZXIucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGlmIChxdWVyeT8uY29uZGl0aW9uICE9PSBcImFuZFwiKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCJhbmRcIixcbiAgICAgICAgICAgICAgICAgICAgcnVsZXM6IFtxdWVyeV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHF1ZXJ5Py5jb25kaXRpb24gIT09IFwib3JcIikge1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IFwib3JcIixcbiAgICAgICAgICAgICAgICAgICAgcnVsZXM6IFtxdWVyeV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXJ5LnJ1bGVzLnB1c2godGhpcy5tb2RlbC5kZWZhdWx0RmlsdGVyLmZpbHRlcik7XG4gICAgICAgIHJldHVybiBxdWVyeTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vcm1hbGl6ZU9yZGVyKG9yZGVyczogT3JkZXJNb2RlbCB8IE9yZGVyTW9kZWxbXSk6IE9yZGVyTW9kZWxbXSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcmRlcnMpKSB7XG4gICAgICAgICAgICBvcmRlcnMgPSBbb3JkZXJzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9yZGVycyA9IG9yZGVycz8uZmlsdGVyKG9yZGVyID0+IG9yZGVyPy5jb2x1bW4pO1xuXG4gICAgICAgIGlmICghb3JkZXJzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG9yZGVycyA9IFt7XG4gICAgICAgICAgICAgICAgY29sdW1uOiBcImlkXCIsXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcImFzY1wiXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmRlcnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROb25OZXN0ZWRPcmRlckNvbHVtbnMob3JkZXJzOiBPcmRlck1vZGVsW10pOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBvcmRlcnMuZmlsdGVyKG9yZGVyID0+IG9yZGVyLmNvbHVtbiAmJiAhb3JkZXIuY29sdW1uLmluY2x1ZGVzKFwiLlwiKSkubWFwKG9yZGVyID0+IG9yZGVyLmNvbHVtbik7XG4gICAgfVxufVxuIl19
620
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9maWx0ZXIvZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUFrRDtBQUNsRCx5Q0FXbUI7QUFHbkIsK0VBQTBFO0FBQzFFLHFFQUFpRTtBQUNqRSxzRUFBaUU7QUFDakUsZ0VBQTJEO0FBRTNELGlGQUE0RTtBQUM1RSx3REFBdUQ7QUFDdkQsK0NBQTJDO0FBQzNDLGlEQUE2QztBQUM3Qyx1Q0FPbUI7QUFDbkIsK0VBQTBFO0FBQzFFLHlEQUE0RTtBQUs1RSx5REFBMEU7QUFHbkUsSUFBTSxhQUFhLHFCQUFuQixNQUFNLGFBQWE7SUFLdEIsWUFDWSxvQkFBMEMsRUFDMUMsZ0JBQWtDLEVBQ2xDLEtBQXVCLEVBQ3ZCLHFCQUE0QyxFQUM1QyxVQUE2QixFQUM3QixPQUE0QztRQUw1Qyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzFDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsVUFBSyxHQUFMLEtBQUssQ0FBa0I7UUFDdkIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QyxlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixZQUFPLEdBQVAsT0FBTyxDQUFxQztRQUVwRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVNLE9BQU8sQ0FBSSxPQUFnQjtRQUM5QixPQUFPLElBQUksZUFBYSxDQUNwQixJQUFJLENBQUMsb0JBQW9CLEVBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsRUFDckI7WUFDSSxHQUFHLElBQUksQ0FBQyxLQUFLO1lBQ2IsY0FBYyxFQUFFLE9BQU87U0FDRSxFQUM3QixJQUFJLENBQUMscUJBQXFCLEVBQzFCLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FDZixDQUFDO0lBQ04sQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBWSxFQUFFLElBQTBCOztRQUMzRCxNQUFNLE1BQU0sR0FBK0Is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TSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckI7UUFFRCxNQUFNLEdBQUcsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxNQUFNLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsTUFBTSxDQUFBLEVBQUU7WUFDakIsTUFBTSxHQUFHLENBQUM7b0JBQ04sTUFBTSxFQUFFLElBQUk7b0JBQ1osU0FBUyxFQUFFLEtBQUs7aUJBQ25CLENBQUMsQ0FBQztTQUNOO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVPLHdCQUF3QixDQUFDLE1BQW9CO1FBQ2pELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxRyxDQUFDO0NBQ0osQ0FBQTtBQXpzQlksYUFBYTtJQUR6QixJQUFBLG1CQUFVLEdBQUU7cUNBT3lCLDZDQUFvQjtRQUN4QixvQ0FBZ0I7UUFDM0Isd0JBQVU7UUFDTSwrQ0FBcUI7UUFDaEMsdUNBQWlCO0dBVmhDLGFBQWEsQ0F5c0J6QjtBQXpzQlksc0NBQWEiLCJmaWxlIjoibGliL2ZpbHRlci9maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7XG4gICAgQ291bnRPcHRpb25zLFxuICAgIEZpbmRPcHRpb25zLFxuICAgIEdyb3VwZWRDb3VudFJlc3VsdEl0ZW0sXG4gICAgSW5jbHVkZWFibGUsXG4gICAgSW5jbHVkZU9wdGlvbnMsXG4gICAgbGl0ZXJhbCxcbiAgICBPcCxcbiAgICBPcmRlcixcbiAgICBPcmRlckl0ZW0sXG4gICAgV2hlcmVPcHRpb25zXG59IGZyb20gXCJzZXF1ZWxpemVcIjtcbmltcG9ydCB7IEdyb3VwT3B0aW9uLCBQcm9qZWN0aW9uQWxpYXMgfSBmcm9tIFwic2VxdWVsaXplL3R5cGVzL21vZGVsXCI7XG5pbXBvcnQgeyBFeHBvcnRUeXBlcywgRmlsdGVyUXVlcnlNb2RlbCwgRmlsdGVyUmVzdWx0TW9kZWwsIEZpbHRlclNlYXJjaE1vZGVsLCBPcmRlck1vZGVsIH0gZnJvbSBcIi4uL1wiO1xuaW1wb3J0IHsgQWNjZXNzQ29udHJvbEFkYXB0ZXIgfSBmcm9tIFwiLi4vYWRhcHRlcnMvYWNjZXNzLWNvbnRyb2wuYWRhcHRlclwiO1xuaW1wb3J0IHsgVHJhbnNsYXRlQWRhcHRlciB9IGZyb20gXCIuLi9hZGFwdGVycy90cmFuc2xhdGUuYWRhcHRlclwiO1xuaW1wb3J0IHsgRGF0YUZpbHRlclJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vZGF0YS1maWx0ZXIucmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgRGF0YUZpbHRlclNlcnZpY2UgfSBmcm9tIFwiLi4vZGF0YS1maWx0ZXIuc2VydmljZVwiO1xuaW1wb3J0IHsgRGF0YUZpbHRlclVzZXJNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvdXNlci5tb2RlbFwiO1xuaW1wb3J0IHsgU2VxdWVsaXplTW9kZWxTY2FubmVyIH0gZnJvbSBcIi4uL3NjYW5uZXJzL3NlcXVlbGl6ZS1tb2RlbC5zY2FubmVyXCI7XG5pbXBvcnQgeyBNLCBTZXF1ZWxpemVVdGlscyB9IGZyb20gXCIuLi9zZXF1ZWxpemUudXRpbHNcIjtcbmltcG9ydCB7IEJhc2VGaWx0ZXIgfSBmcm9tIFwiLi9iYXNlLWZpbHRlclwiO1xuaW1wb3J0IHsgRmlsdGVyVXRpbHMgfSBmcm9tIFwiLi9maWx0ZXIudXRpbHNcIjtcbmltcG9ydCB7XG4gICAgRmlsdGVyLFxuICAgIEZpbHRlckNvbmRpdGlvbixcbiAgICBGaWx0ZXJDb25kaXRpb25SdWxlLFxuICAgIEZpbHRlckRlZmluaXRpb24sXG4gICAgU2VsZWN0RmlsdGVyLFxuICAgIFNlbGVjdEZpbHRlclZhbHVlXG59IGZyb20gXCIuL2ZpbHRlcnNcIjtcbmltcG9ydCB7IEdlb0xvY2FsaXphdGlvbkZpbHRlciB9IGZyb20gXCIuL2ZpbHRlcnMvZ2VvLWxvY2FsaXphdGlvbi5maWx0ZXJcIjtcbmltcG9ydCB7IEdyb3VwRmlsdGVyLCBHcm91cEZpbHRlckRlZmluaXRpb24gfSBmcm9tIFwiLi9maWx0ZXJzL2dyb3VwLmZpbHRlclwiO1xuaW1wb3J0IHsgUXVlcnlNb2RlbCwgUXVlcnlSdWxlTW9kZWwgfSBmcm9tIFwiLi9tb2RlbHNcIjtcbmltcG9ydCB7IEZpbHRlckNvbmZpZ3VyYXRpb25TZWFyY2hNb2RlbCB9IGZyb20gXCIuL21vZGVscy9maWx0ZXItY29uZmlndXJhdGlvbi1zZWFyY2gubW9kZWxcIjtcbmltcG9ydCB7IEZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbCB9IGZyb20gXCIuL21vZGVscy9maWx0ZXItY29uZmlndXJhdGlvbi5tb2RlbFwiO1xuaW1wb3J0IHsgRmlsdGVyUmVzb3VyY2VWYWx1ZU1vZGVsIH0gZnJvbSBcIi4vbW9kZWxzL2ZpbHRlci1yZXNvdXJjZS12YWx1ZS5tb2RlbFwiO1xuaW1wb3J0IHsgT3JkZXJSdWxlLCBPcmRlclJ1bGVEZWZpbml0aW9uIH0gZnJvbSBcIi4vb3JkZXItcnVsZXMvb3JkZXItcnVsZVwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmlsdGVyU2VydmljZTxEYXRhPiB7XG4gICAgcHJpdmF0ZSBkZWZpbml0aW9ucyE6IHsgW25hbWU6IHN0cmluZ106IEZpbHRlckRlZmluaXRpb24gfCBHcm91cEZpbHRlckRlZmluaXRpb24gfCBPcmRlclJ1bGVEZWZpbml0aW9uIH07XG4gICAgcHJpdmF0ZSByZXBvc2l0b3J5ITogRGF0YUZpbHRlclJlcG9zaXRvcnk8RGF0YT47XG4gICAgcHJpdmF0ZSBleHBvcnRSZXBvc2l0b3J5ITogRGF0YUZpbHRlclJlcG9zaXRvcnk8RGF0YT47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBhY2Nlc3NDb250cm9sQWRhcHRlcjogQWNjZXNzQ29udHJvbEFkYXB0ZXIsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlQWRhcHRlcjogVHJhbnNsYXRlQWRhcHRlcixcbiAgICAgICAgcHJpdmF0ZSBtb2RlbDogQmFzZUZpbHRlcjxEYXRhPixcbiAgICAgICAgcHJpdmF0ZSBzZXF1ZWxpemVNb2RlbFNjYW5uZXI6IFNlcXVlbGl6ZU1vZGVsU2Nhbm5lcixcbiAgICAgICAgcHJpdmF0ZSBkYXRhRmlsdGVyOiBEYXRhRmlsdGVyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBvcHRpb25zPzogeyBkaXNhYmxlQWNjZXNzQ29udHJvbD86IGJvb2xlYW4gfVxuICAgICkge1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9yRGF0YTxUPihkYXRhRGVmOiBUeXBlPFQ+KTogRmlsdGVyU2VydmljZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgRmlsdGVyU2VydmljZShcbiAgICAgICAgICAgIHRoaXMuYWNjZXNzQ29udHJvbEFkYXB0ZXIsXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZUFkYXB0ZXIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5tb2RlbCxcbiAgICAgICAgICAgICAgICBkYXRhRGVmaW5pdGlvbjogZGF0YURlZlxuICAgICAgICAgICAgfSBhcyB1bmtub3duIGFzIEJhc2VGaWx0ZXI8VD4sXG4gICAgICAgICAgICB0aGlzLnNlcXVlbGl6ZU1vZGVsU2Nhbm5lcixcbiAgICAgICAgICAgIHRoaXMuZGF0YUZpbHRlcixcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcocmVxdWVzdDogYW55LCB1c2VyPzogRGF0YUZpbHRlclVzZXJNb2RlbCk6IFByb21pc2U8RmlsdGVyQ29uZmlndXJhdGlvbk1vZGVsW10+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBGaWx0ZXJDb25maWd1cmF0aW9uTW9kZWxbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRlZmluaXRpb25zKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSB8fCBPcmRlclJ1bGUudmFsaWRhdGUodGhpcy5kZWZpbml0aW9uc1trZXldKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCAodGhpcy5kZWZpbml0aW9uc1trZXldIGFzIEZpbHRlckRlZmluaXRpb24pLmdldENvbmZpZyhrZXksIHJlcXVlc3QsIHVzZXIpO1xuICAgICAgICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgICAgICAgaWQ6IGtleSxcbiAgICAgICAgICAgICAgICBuYW1lOiBhd2FpdCB0aGlzLnRyYW5zbGF0ZUFkYXB0ZXIuZ2V0VHJhbnNsYXRpb24odXNlcj8ubGFuZ3VhZ2UgPz8gXCJmclwiLCBGaWx0ZXJVdGlscy5nZXRGaWx0ZXJUcmFuc2xhdGlvbktleShrZXkpKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZWFyY2hDb25maWdWYWx1ZXMoXG4gICAgICAgIHJlcXVlc3Q6IGFueSxcbiAgICAgICAgc2VhcmNoOiBGaWx0ZXJDb25maWd1cmF0aW9uU2VhcmNoTW9kZWwsXG4gICAgICAgIHVzZXI/OiBEYXRhRmlsdGVyVXNlck1vZGVsXG4gICAgKTogUHJvbWlzZTxTZWxlY3RGaWx0ZXJWYWx1ZVtdPiB7XG4gICAgICAgIGlmICghdGhpcy5kZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eShzZWFyY2guaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmRlZmluaXRpb25zW3NlYXJjaC5pZF07XG4gICAgICAgIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBTZWxlY3RGaWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmaWx0ZXIudmFsdWVzKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogc2VhcmNoLnZhbHVlLFxuICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLmNvbnZlcnROdW1iZXIoc2VhcmNoLnBhZ2UpLFxuICAgICAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLmNvbnZlcnROdW1iZXIoc2VhcmNoLnBhZ2VTaXplKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29udmVydE51bWJlcih2YWx1ZT86IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlZE51bWJlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIHJldHVybiBpc05hTihwYXJzZWROdW1iZXIpID8gbnVsbCA6IHBhcnNlZE51bWJlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZFJlc291cmNlVmFsdWVCeUlkKHJlcXVlc3Q6IGFueSwgc2VhcmNoOiBGaWx0ZXJSZXNvdXJjZVZhbHVlTW9kZWwsIHVzZXI/OiBEYXRhRmlsdGVyVXNlck1vZGVsKTogUHJvbWlzZTxTZWxlY3RGaWx0ZXJWYWx1ZSB8IG51bGw+IHtcbiAgICAgICAgaWYgKCF0aGlzLmRlZmluaXRpb25zLmhhc093blByb3BlcnR5KHNlYXJjaC5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5kZWZpbml0aW9uc1tzZWFyY2guaWRdO1xuICAgICAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgU2VsZWN0RmlsdGVyICYmIGZpbHRlci5nZXRSZXNvdXJjZUJ5SWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmaWx0ZXIuZ2V0UmVzb3VyY2VCeUlkKHsgaWQ6IHNlYXJjaC5yZXNvdXJjZUlkLCB1c2VyLCByZXF1ZXN0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNvdW50KHVzZXI6IERhdGFGaWx0ZXJVc2VyTW9kZWwsIG9wdGlvbnM6IEZpbHRlclF1ZXJ5TW9kZWwpOiBQcm9taXNlPG51bWJlcj47XG4gICAgcHVibGljIGFzeW5jIGNvdW50KG9wdGlvbnM6IEZpbHRlclF1ZXJ5TW9kZWwpOiBQcm9taXNlPG51bWJlcj47XG4gICAgcHVibGljIGFzeW5jIGNvdW50KC4uLmFyZ3M6IFtEYXRhRmlsdGVyVXNlck1vZGVsIHwgRmlsdGVyUXVlcnlNb2RlbCwgRmlsdGVyUXVlcnlNb2RlbD9dKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3QgW3VzZXJPck9wdCwgb3B0XSA9IGFyZ3M7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBvcHQgPyBvcHQgOiB1c2VyT3JPcHQgYXMgRmlsdGVyUXVlcnlNb2RlbDtcbiAgICAgICAgY29uc3QgdXNlciA9IG9wdCA/IHVzZXJPck9wdCBhcyBEYXRhRmlsdGVyVXNlck1vZGVsIDogbnVsbDtcblxuICAgICAgICBjb25zdCBjb3VudE9wdGlvbnMgPSBhd2FpdCB0aGlzLmdldEZpbmRPcHRpb25zKHRoaXMucmVwb3NpdG9yeS5tb2RlbCwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgIGlmIChvcHRpb25zLnNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5hZGRTZWFyY2hDb25kaXRpb24ob3B0aW9ucy5zZWFyY2gsIGNvdW50T3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVzZXIgPyB0aGlzLmNvdW50VG90YWxWYWx1ZXModXNlciwgY291bnRPcHRpb25zKSA6IHRoaXMuY291bnRUb3RhbFZhbHVlcyhjb3VudE9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaWx0ZXIodXNlcjogRGF0YUZpbHRlclVzZXJNb2RlbCwgb3B0aW9uczogRmlsdGVyUXVlcnlNb2RlbCk6IFByb21pc2U8RmlsdGVyUmVzdWx0TW9kZWw8RGF0YT4+O1xuICAgIHB1YmxpYyBhc3luYyBmaWx0ZXIob3B0aW9uczogRmlsdGVyUXVlcnlNb2RlbCk6IFByb21pc2U8RmlsdGVyUmVzdWx0TW9kZWw8RGF0YT4+O1xuICAgIHB1YmxpYyBhc3luYyBmaWx0ZXIoLi4uYXJnczogW0RhdGFGaWx0ZXJVc2VyTW9kZWwgfCBGaWx0ZXJRdWVyeU1vZGVsLCBGaWx0ZXJRdWVyeU1vZGVsP10pOiBQcm9taXNlPEZpbHRlclJlc3VsdE1vZGVsPERhdGE+PiB7XG4gICAgICAgIGNvbnN0IFt1c2VyT3JPcHQsIG9wdF0gPSBhcmdzO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gb3B0ID8gb3B0IDogdXNlck9yT3B0IGFzIEZpbHRlclF1ZXJ5TW9kZWw7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBvcHQgPyB1c2VyT3JPcHQgYXMgRGF0YUZpbHRlclVzZXJNb2RlbCA6IG51bGw7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMub3JkZXIpIHtcbiAgICAgICAgICAgIG9wdGlvbnMub3JkZXIgPSB0aGlzLm5vcm1hbGl6ZU9yZGVyKG9wdGlvbnMub3JkZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnRPcHRpb25zID0gYXdhaXQgdGhpcy5nZXRGaW5kT3B0aW9ucyh0aGlzLnJlcG9zaXRvcnkubW9kZWwsIG9wdGlvbnMucXVlcnksIG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIGlmIChvcHRpb25zLnNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5hZGRTZWFyY2hDb25kaXRpb24ob3B0aW9ucy5zZWFyY2gsIGNvdW50T3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMub3JkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JkZXJDb25kaXRpb24ob3B0aW9ucy5vcmRlciwgY291bnRPcHRpb25zLCBvcHRpb25zLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkR3JvdXBPcHRpb24ob3B0aW9ucywgY291bnRPcHRpb25zKTtcblxuICAgICAgICBjb25zdCB0b3RhbCA9IGF3YWl0ICh1c2VyID8gdGhpcy5jb3VudFRvdGFsVmFsdWVzKHVzZXIsIGNvdW50T3B0aW9ucykgOiB0aGlzLmNvdW50VG90YWxWYWx1ZXMoY291bnRPcHRpb25zKSk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0ICh1c2VyID8gdGhpcy5maW5kVmFsdWVzKHVzZXIsIG9wdGlvbnMsIGNvdW50T3B0aW9ucykgOiB0aGlzLmZpbmRWYWx1ZXMob3B0aW9ucywgY291bnRPcHRpb25zKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3RhbCxcbiAgICAgICAgICAgIHBhZ2U6IG9wdGlvbnMucGFnZSxcbiAgICAgICAgICAgIHZhbHVlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3dubG9hZERhdGEoXG4gICAgICAgIHVzZXI6IERhdGFGaWx0ZXJVc2VyTW9kZWwgfCBudWxsLFxuICAgICAgICB0eXBlOiBFeHBvcnRUeXBlcyxcbiAgICAgICAgb3B0aW9uczogRmlsdGVyUXVlcnlNb2RlbCxcbiAgICAgICAgZXhwb3J0T3B0aW9ucz86IG9iamVjdFxuICAgICk6IFByb21pc2U8QnVmZmVyIHwgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGZpbmRPcHRpb25zID0gYXdhaXQgdGhpcy5nZXRGaW5kT3B0aW9ucyh0aGlzLmV4cG9ydFJlcG9zaXRvcnkubW9kZWwsIG9wdGlvbnMucXVlcnkpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLm9yZGVyKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9yZGVyID0gdGhpcy5ub3JtYWxpemVPcmRlcihvcHRpb25zLm9yZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5hZGRTZWFyY2hDb25kaXRpb24ob3B0aW9ucy5zZWFyY2gsIGZpbmRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5vcmRlcikge1xuICAgICAgICAgICAgdGhpcy5hZGRPcmRlckNvbmRpdGlvbihvcHRpb25zLm9yZGVyLCBmaW5kT3B0aW9ucywgb3B0aW9ucy5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgb3B0aW9ucy5wYWdlO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCAodXNlciA/IHRoaXMuZmluZFZhbHVlcyh1c2VyLCBvcHRpb25zLCBmaW5kT3B0aW9ucywgdGhpcy5leHBvcnRSZXBvc2l0b3J5KSA6IHRoaXMuZmluZFZhbHVlcyhvcHRpb25zLCBmaW5kT3B0aW9ucywgdGhpcy5leHBvcnRSZXBvc2l0b3J5KSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLm1vZGVsLmdldEV4cG9ydGVkRmllbGRzS2V5cyh0eXBlKTtcbiAgICAgICAgaWYgKGhlYWRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgUHJvbWlzZS5hbGwodmFsdWVzLm1hcCgodmFsdWUpID0+IHRoaXMubW9kZWwuZ2V0RXhwb3J0ZWRGaWVsZHModmFsdWUsIHVzZXI/Lmxhbmd1YWdlID8/IFwiZnJcIiwgdHlwZSkpKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcG9zaXRvcnkuZG93bmxvYWREYXRhKGhlYWRlcnMsIGRhdGEsIHR5cGUsIHVzZXI/Lmxhbmd1YWdlID8/IFwiZnJcIiwgZXhwb3J0T3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXBvc2l0b3J5LmRvd25sb2FkRGF0YSh2YWx1ZXMsIHR5cGUsIHVzZXI/Lmxhbmd1YWdlID8/IFwiZnJcIiwgZXhwb3J0T3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RmluZE9wdGlvbnMobW9kZWw6IHR5cGVvZiBNLCBxdWVyeTogUXVlcnlNb2RlbCB8IHVuZGVmaW5lZCwgZGF0YT86IG9iamVjdCk6IFByb21pc2U8RmluZE9wdGlvbnM+IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlc2V0IEdlbyBsb2NhbGl6YXRpb24gZmlsdGVyIHN0YXRlXG4gICAgICAgICAqL1xuICAgICAgICBHZW9Mb2NhbGl6YXRpb25GaWx0ZXIucmVzZXQoKTtcblxuICAgICAgICBxdWVyeSA9IHRoaXMuYWRkRGVmYXVsdEZpbHRlcihxdWVyeSk7XG4gICAgICAgIGxldCBvcHRpb246IEZpbmRPcHRpb25zID0ge307XG4gICAgICAgIGlmIChxdWVyeSkge1xuICAgICAgICAgICAgY29uc3Qgd2hlcmVDb25kaXRpb25zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgaGF2aW5nQ29uZGl0aW9uczogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgb3B0aW9uID0ge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgICAgICBpbmNsdWRlOiBhd2FpdCB0aGlzLmdldEluY2x1ZGUobW9kZWwsIHF1ZXJ5LCBkYXRhKSxcbiAgICAgICAgICAgICAgICB3aGVyZTogcXVlcnkuY29uZGl0aW9uID09PSBcImFuZFwiID8geyBbT3AuYW5kXTogd2hlcmVDb25kaXRpb25zIH0gOiB7IFtPcC5vcl06IHdoZXJlQ29uZGl0aW9ucyB9LFxuICAgICAgICAgICAgICAgIGhhdmluZzogcXVlcnkuY29uZGl0aW9uID09PSBcImFuZFwiID8geyBbT3AuYW5kXTogaGF2aW5nQ29uZGl0aW9ucyB9IDogeyBbT3Aub3JdOiBoYXZpbmdDb25kaXRpb25zIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFub2lkID0gYXdhaXQgdGhpcy5nZW5lcmF0ZVdoZXJlT3B0aW9ucyhxdWVyeSwgd2hlcmVDb25kaXRpb25zKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVIYXZpbmdPcHRpb25zKHF1ZXJ5LCBoYXZpbmdDb25kaXRpb25zKTtcblxuICAgICAgICAgICAgaWYgKCFwYXJhbm9pZCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbi5wYXJhbm9pZCA9IHBhcmFub2lkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWhhdmluZ0NvbmRpdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbi5oYXZpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5yZXBvc2l0b3J5ID0gdGhpcy5kYXRhRmlsdGVyLmZvcih0aGlzLm1vZGVsLmRhdGFEZWZpbml0aW9uKTtcbiAgICAgICAgdGhpcy5leHBvcnRSZXBvc2l0b3J5ID0gdGhpcy5kYXRhRmlsdGVyLmZvcih0aGlzLm1vZGVsLmV4cG9ydERhdGFEZWZpbml0aW9uID8/IHRoaXMubW9kZWwuZGF0YURlZmluaXRpb24pO1xuICAgICAgICB0aGlzLm1vZGVsLnRyYW5zbGF0ZVNlcnZpY2UgPSB0aGlzLnRyYW5zbGF0ZUFkYXB0ZXI7XG5cbiAgICAgICAgdGhpcy5kZWZpbml0aW9ucyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubW9kZWwuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIUZpbHRlci52YWxpZGF0ZSh0aGlzLm1vZGVsW2tleV0gYXMgRmlsdGVyRGVmaW5pdGlvbikgJiZcbiAgICAgICAgICAgICAgICAhR3JvdXBGaWx0ZXIudmFsaWRhdGUodGhpcy5tb2RlbFtrZXldIGFzIEdyb3VwRmlsdGVyRGVmaW5pdGlvbikgJiZcbiAgICAgICAgICAgICAgICAhT3JkZXJSdWxlLnZhbGlkYXRlKHRoaXMubW9kZWxba2V5XSBhcyBPcmRlclJ1bGVEZWZpbml0aW9uKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZGVmaW5pdGlvbnNba2V5XSA9IHRoaXMubW9kZWxba2V5XSBhcyBGaWx0ZXJEZWZpbml0aW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRJbmNsdWRlKG1vZGVsOiB0eXBlb2YgTSwgcXVlcnk6IFF1ZXJ5TW9kZWwsIGRhdGE/OiBvYmplY3QpOiBQcm9taXNlPEluY2x1ZGVhYmxlW10+IHtcbiAgICAgICAgaWYgKCFxdWVyeS5ydWxlcykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5jbHVkZXM6IEluY2x1ZGVPcHRpb25zW11bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcXVlcnkucnVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG0gPSBydWxlIGFzIFF1ZXJ5TW9kZWw7XG4gICAgICAgICAgICBpZiAobS5jb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgICBpbmNsdWRlcy5wdXNoKGF3YWl0IHRoaXMuZ2V0SW5jbHVkZShtb2RlbCwgbSwgZGF0YSkgYXMgSW5jbHVkZU9wdGlvbnNbXSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHIgPSBydWxlIGFzIFF1ZXJ5UnVsZU1vZGVsO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRlZmluaXRpb25zLmhhc093blByb3BlcnR5KHIuaWQpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZGVmaW5pdGlvbnNbci5pZF07XG4gICAgICAgICAgICBpZiAoKGZpbHRlciBhcyBHcm91cEZpbHRlckRlZmluaXRpb24pLnJvb3RGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmID0gZmlsdGVyIGFzIEdyb3VwRmlsdGVyRGVmaW5pdGlvbjtcbiAgICAgICAgICAgICAgICBpbmNsdWRlcy5wdXNoKC4uLnRoaXMuZ2V0RmlsdGVySW5jbHVkZShtb2RlbCwgZi5yb290RmlsdGVyLCByLCBkYXRhKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWYubGF6eUxvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGYudmFsdWVGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzLnB1c2goLi4udGhpcy5nZXRGaWx0ZXJJbmNsdWRlKG1vZGVsLCBmLnZhbHVlRmlsdGVyLCByLCBkYXRhKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGYuZ2V0VmFsdWVGaWx0ZXIgJiYgQXJyYXkuaXNBcnJheShyLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUZpbGVyID0gYXdhaXQgZi5nZXRWYWx1ZUZpbHRlcihyLnZhbHVlWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMucHVzaCguLi50aGlzLmdldEZpbHRlckluY2x1ZGUobW9kZWwsIHZhbHVlRmlsZXIgYXMgRmlsdGVyRGVmaW5pdGlvbiwgciwgZGF0YSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5jbHVkZXMucHVzaCguLi50aGlzLmdldEZpbHRlckluY2x1ZGUobW9kZWwsIGZpbHRlciBhcyBGaWx0ZXJEZWZpbml0aW9uLCByLCBkYXRhKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNlcXVlbGl6ZVV0aWxzLnJlZHVjZUluY2x1ZGVzKGluY2x1ZGVzLCB0cnVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbmRpdGlvbkluY2x1ZGUobW9kZWw6IHR5cGVvZiBNLCBjb25kaXRpb246IEZpbHRlckNvbmRpdGlvbik6IEluY2x1ZGVPcHRpb25zW10ge1xuICAgICAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5jbHVkZXM6IEluY2x1ZGVPcHRpb25zW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNvbmRpdGlvbi5ydWxlcykge1xuICAgICAgICAgICAgY29uc3QgYyA9IHJ1bGUgYXMgRmlsdGVyQ29uZGl0aW9uO1xuICAgICAgICAgICAgaWYgKGMuY29uZGl0aW9uKSB7XG4gICAgICAgICAgICAgICAgaW5jbHVkZXMucHVzaCguLi50aGlzLmdldENvbmRpdGlvbkluY2x1ZGUobW9kZWwsIGNvbmRpdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgciA9IHJ1bGUgYXMgRmlsdGVyQ29uZGl0aW9uUnVsZTtcbiAgICAgICAgICAgIGlmIChyLnBhdGgpIHtcbiAgICAgICAgICAgICAgICBpbmNsdWRlcy5wdXNoKC4uLnRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEluY2x1ZGVzKG1vZGVsLCB7IHBhdGg6IHIucGF0aCB9LCBbXSwgeyBpbmNsdWRlOiBbXSB9LCB0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluY2x1ZGVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVXaGVyZU9wdGlvbnMocXVlcnk6IFF1ZXJ5TW9kZWwsIG9wdGlvbnM6IFdoZXJlT3B0aW9uc1tdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghcXVlcnkucnVsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcmFub2lkID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHF1ZXJ5LnJ1bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gcnVsZSBhcyBRdWVyeU1vZGVsO1xuICAgICAgICAgICAgaWYgKGMuY29uZGl0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcCA9IGMuY29uZGl0aW9uID09PSBcImFuZFwiID8gT3AuYW5kIDogT3Aub3I7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2hlcmUgPSB7IFtvcF06IGNvbmRpdGlvbnMgfTtcbiAgICAgICAgICAgICAgICBwYXJhbm9pZCA9IHBhcmFub2lkICYmIGF3YWl0IHRoaXMuZ2VuZXJhdGVXaGVyZU9wdGlvbnMoYywgY29uZGl0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICBpZiAod2hlcmVbb3AgYXMgYW55XS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHdoZXJlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgciA9IHJ1bGUgYXMgUXVlcnlSdWxlTW9kZWw7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkoci5pZCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5kZWZpbml0aW9uc1tyLmlkXSBhcyBGaWx0ZXJEZWZpbml0aW9uO1xuICAgICAgICAgICAgaWYgKCFPcmRlclJ1bGUudmFsaWRhdGUoZmlsdGVyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlck9wdGlvbnMgPSBhd2FpdCBmaWx0ZXIuZ2V0V2hlcmVPcHRpb25zKHIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlck9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKGZpbHRlck9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmFub2lkID0gZmlsdGVyLnBhcmFub2lkID8/IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyYW5vaWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUhhdmluZ09wdGlvbnMocXVlcnk6IFF1ZXJ5TW9kZWwsIG9wdGlvbnM6IFdoZXJlT3B0aW9uc1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghcXVlcnkucnVsZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBxdWVyeS5ydWxlcykge1xuICAgICAgICAgICAgY29uc3QgYyA9IHJ1bGUgYXMgUXVlcnlNb2RlbDtcbiAgICAgICAgICAgIGlmIChjLmNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbnM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgY29uc3Qgb3AgPSBjLmNvbmRpdGlvbiA9PT0gXCJhbmRcIiA/IE9wLmFuZCA6IE9wLm9yO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhdmluZyA9IHsgW29wXTogY29uZGl0aW9ucyB9O1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVIYXZpbmdPcHRpb25zKGMsIGNvbmRpdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGhhdmluZ1tvcCBhcyBhbnldLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2goaGF2aW5nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgciA9IHJ1bGUgYXMgUXVlcnlSdWxlTW9kZWw7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkoci5pZCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5kZWZpbml0aW9uc1tyLmlkXSBhcyBGaWx0ZXJEZWZpbml0aW9uO1xuICAgICAgICAgICAgaWYgKCFPcmRlclJ1bGUudmFsaWRhdGUoZmlsdGVyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlck9wdGlvbnMgPSBhd2FpdCBmaWx0ZXIuZ2V0SGF2aW5nT3B0aW9ucyhyKTtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyT3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2goZmlsdGVyT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRTZWFyY2hDb25kaXRpb24oc2VhcmNoOiBGaWx0ZXJTZWFyY2hNb2RlbCwgb3B0aW9uczogQ291bnRPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc2VhcmNoPy52YWx1ZT8udG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKCF2YWx1ZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcG9zaXRvcnkuYWRkU2VhcmNoQ29uZGl0aW9uKHNlYXJjaC52YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRPcmRlckNvbmRpdGlvbihvcmRlcnM6IE9yZGVyTW9kZWxbXSwgb3B0aW9uczogQ291bnRPcHRpb25zLCBkYXRhPzogb2JqZWN0KTogdm9pZCB7XG4gICAgICAgIGlmIChvcmRlcnMuZXZlcnkob3JkZXIgPT4gIW9yZGVyLmRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmRlZmF1bHRPcmRlclJ1bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRPcmRlcnMgPSBBcnJheS5pc0FycmF5KHRoaXMubW9kZWwuZGVmYXVsdE9yZGVyUnVsZS5vcmRlcilcbiAgICAgICAgICAgICAgICA/IHRoaXMubW9kZWwuZGVmYXVsdE9yZGVyUnVsZS5vcmRlclxuICAgICAgICAgICAgICAgIDogW3RoaXMubW9kZWwuZGVmYXVsdE9yZGVyUnVsZS5vcmRlcl07XG5cbiAgICAgICAgICAgIG9yZGVycyA9IFsuLi5kZWZhdWx0T3JkZXJzLCAuLi5vcmRlcnNdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBvcmRlciBvZiBvcmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmRlZmluaXRpb25zW29yZGVyLmNvbHVtbl0gYXMgT3JkZXJSdWxlRGVmaW5pdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVzID0gcnVsZSAmJiBPcmRlclJ1bGUudmFsaWRhdGUocnVsZSkgP1xuICAgICAgICAgICAgICAgIHJ1bGUucGF0aCA/IHRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEluY2x1ZGVzKHRoaXMucmVwb3NpdG9yeS5tb2RlbCwgeyBwYXRoOiBydWxlLnBhdGggfSwgW10pIDogW10gOlxuICAgICAgICAgICAgICAgIHRoaXMucmVwb3NpdG9yeS5nZW5lcmF0ZU9yZGVySW5jbHVkZShvcmRlciwgZGF0YSk7XG5cbiAgICAgICAgICAgIGlmICghaW5jbHVkZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9wdGlvbnMuaW5jbHVkZSA9IFNlcXVlbGl6ZVV0aWxzLm1lcmdlSW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5pbmNsdWRlIGFzIEluY2x1ZGVPcHRpb25zIHwgSW5jbHVkZU9wdGlvbnNbXSxcbiAgICAgICAgICAgICAgICBpbmNsdWRlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkR3JvdXBPcHRpb24oZmlsdGVyOiBGaWx0ZXJRdWVyeU1vZGVsLCBvcHRpb25zOiBDb3VudE9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLnJlcG9zaXRvcnkubW9kZWw7XG4gICAgICAgIG9wdGlvbnMuZ3JvdXAgPSBbYCR7bW9kZWwubmFtZX0uaWRgXTtcbiAgICAgICAgaWYgKGZpbHRlci5ncm91cEJ5KSB7XG4gICAgICAgICAgICBvcHRpb25zLmdyb3VwLnB1c2goU2VxdWVsaXplVXRpbHMuZ2V0R3JvdXBMaXRlcmFsKHRoaXMucmVwb3NpdG9yeS5tb2RlbCwgZmlsdGVyLmdyb3VwQnkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmlsdGVyLm9yZGVyIHx8IChmaWx0ZXIub3JkZXIgaW5zdGFuY2VvZiBBcnJheSAmJiAhZmlsdGVyLm9yZGVyLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9yZGVycyA9IHRoaXMubm9ybWFsaXplT3JkZXIoZmlsdGVyLm9yZGVyKTtcbiAgICAgICAgZm9yIChjb25zdCBvcmRlciBvZiBvcmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmRlZmluaXRpb25zW29yZGVyLmNvbHVtbl0gYXMgT3JkZXJSdWxlRGVmaW5pdGlvbjtcbiAgICAgICAgICAgIGlmIChydWxlICYmIE9yZGVyUnVsZS52YWxpZGF0ZShydWxlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5yZXBvc2l0b3J5Lmhhc0N1c3RvbUF0dHJpYnV0ZShvcmRlci5jb2x1bW4pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG9yZGVyLmNvbHVtbi5zcGxpdChcIi5cIik7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB2YWx1ZXMucG9wKCkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ncm91cC5wdXNoKGAke21vZGVsLm5hbWV9LiR7U2VxdWVsaXplVXRpbHMuZmluZENvbHVtbkZpZWxkTmFtZShtb2RlbCwgY29sdW1uKX1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ncm91cC5wdXNoKC4uLnRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEdyb3VwKG1vZGVsLCBvcmRlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb3VudFRvdGFsVmFsdWVzKHVzZXI6IERhdGFGaWx0ZXJVc2VyTW9kZWwsIG9wdGlvbnM6IEZpbmRPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+O1xuICAgIHByaXZhdGUgYXN5bmMgY291bnRUb3RhbFZhbHVlcyhvcHRpb25zOiBGaW5kT3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPjtcbiAgICBwcml2YXRlIGFzeW5jIGNvdW50VG90YWxWYWx1ZXMoLi4uYXJnczogW0RhdGFGaWx0ZXJVc2VyTW9kZWwgfCBGaW5kT3B0aW9ucywgRmluZE9wdGlvbnM/XSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IFt1c2VyT3JPcHQsIG9wdF0gPSBhcmdzO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gb3B0ID8gb3B0IDogdXNlck9yT3B0IGFzIEZpbmRPcHRpb25zO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIG1lYW5zIHRoYXQgY291bnRUb3RhbFZhbHVlcyB3YXMgY2FsbGVkIHdpdGggYSB1c2VyXG4gICAgICAgICAqL1xuICAgICAgICBpZiAob3B0KSB7XG4gICAgICAgICAgICBvcHRpb25zLndoZXJlID0gYXdhaXQgdGhpcy5nZXRBY2Nlc3NDb250cm9sV2hlcmVDb25kaXRpb24ob3B0aW9ucy53aGVyZSwgdXNlck9yT3B0IGFzIERhdGFGaWx0ZXJVc2VyTW9kZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuaGF2aW5nKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5yZXBvc2l0b3J5Lm1vZGVsLmZpbmRBbGwoe1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgc3ViUXVlcnk6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZ3JvdXAsIC4uLmNvdW50T3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5yZXBvc2l0b3J5Lm1vZGVsLmNvdW50KHtcbiAgICAgICAgICAgICAgICAuLi5jb3VudE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgZGlzdGluY3Q6IHRydWVcbiAgICAgICAgICAgIH0pIGFzIG51bWJlciB8IEdyb3VwZWRDb3VudFJlc3VsdEl0ZW1bXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZpbmRWYWx1ZXM8VXNlcnMgZXh0ZW5kcyBEYXRhRmlsdGVyVXNlck1vZGVsPih1c2VyOiBVc2VycywgZmlsdGVyOiBGaWx0ZXJRdWVyeU1vZGVsLCBvcHRpb25zOiBGaW5kT3B0aW9ucywgcmVwb3NpdG9yeT86IERhdGFGaWx0ZXJSZXBvc2l0b3J5PERhdGE+KTogUHJvbWlzZTxEYXRhW10+O1xuICAgIHByaXZhdGUgYXN5bmMgZmluZFZhbHVlczxVc2VycyBleHRlbmRzIERhdGFGaWx0ZXJVc2VyTW9kZWw+KGZpbHRlcjogRmlsdGVyUXVlcnlNb2RlbCwgb3B0aW9uczogRmluZE9wdGlvbnMsIHJlcG9zaXRvcnk/OiBEYXRhRmlsdGVyUmVwb3NpdG9yeTxEYXRhPik6IFByb21pc2U8RGF0YVtdPjtcbiAgICBwcml2YXRlIGFzeW5jIGZpbmRWYWx1ZXM8VXNlcnMgZXh0ZW5kcyBEYXRhRmlsdGVyVXNlck1vZGVsPiguLi5hcmdzOiBbVXNlcnMgfCBGaWx0ZXJRdWVyeU1vZGVsLCBGaWx0ZXJRdWVyeU1vZGVsIHwgRmluZE9wdGlvbnMsIEZpbmRPcHRpb25zIHwgRGF0YUZpbHRlclJlcG9zaXRvcnk8RGF0YT4gfCB1bmRlZmluZWQsIERhdGFGaWx0ZXJSZXBvc2l0b3J5PERhdGE+P10pOiBQcm9taXNlPERhdGFbXT4ge1xuICAgICAgICBjb25zdCBbdXNlck9yT0ZpbHRlciwgZmlsdGVyT3JPcHQsIG9wdE9yUmVwbywgcmVwb10gPSBhcmdzO1xuICAgICAgICBjb25zdCBvcHRPclJlcG9Jc1JlcG8gPSBvcHRPclJlcG8gaW5zdGFuY2VvZiBEYXRhRmlsdGVyUmVwb3NpdG9yeTtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0gb3B0T3JSZXBvICYmICFvcHRPclJlcG9Jc1JlcG8gPyBvcHRPclJlcG8gOiBmaWx0ZXJPck9wdCBhcyBGaW5kT3B0aW9ucztcbiAgICAgICAgY29uc3QgZmlsdGVyID0gb3B0T3JSZXBvICYmICFvcHRPclJlcG9Jc1JlcG8gPyBmaWx0ZXJPck9wdCBhcyBGaWx0ZXJRdWVyeU1vZGVsIDogdXNlck9yT0ZpbHRlciBhcyBGaWx0ZXJRdWVyeU1vZGVsO1xuXG4gICAgICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvID8/IChvcHRPclJlcG9Jc1JlcG8gPyBvcHRPclJlcG8gOiB0aGlzLnJlcG9zaXRvcnkpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIG1lYW5zIHRoYXQgZmluZFZhbHVlcyB3YXMgY2FsbGVkIHdpdGggYSB1c2VyXG4gICAgICAgICAqL1xuICAgICAgICBpZiAocmVwbykge1xuICAgICAgICAgICAgb3B0aW9ucy53aGVyZSA9IGF3YWl0IHRoaXMuZ2V0QWNjZXNzQ29udHJvbFdoZXJlQ29uZGl0aW9uKG9wdGlvbnMud2hlcmUsIHVzZXJPck9GaWx0ZXIgYXMgVXNlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3JkZXIgPSB0aGlzLmdldE9yZGVyT3B0aW9ucyhmaWx0ZXIub3JkZXIgYXMgT3JkZXJNb2RlbFtdKTtcblxuICAgICAgICBjb25zdCBub25OZXN0ZWRPcmRlckNvbHVtbnMgPSAoZmlsdGVyLm9yZGVyIGFzIE9yZGVyTW9kZWxbXSlcbiAgICAgICAgICAgIC5tYXAob3JkZXIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmRlZmluaXRpb25zW29yZGVyLmNvbHVtbl0gYXMgT3JkZXJSdWxlRGVmaW5pdGlvbjtcbiAgICAgICAgICAgICAgICBpZiAoIXJ1bGUgfHwgIU9yZGVyUnVsZS52YWxpZGF0ZShydWxlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JkZXIuY29sdW1uO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbcnVsZS5wYXRoID8/IFwiXCIsIHJ1bGUuYXR0cmlidXRlXS5qb2luKFwiLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uICYmICFjb2x1bW4uaW5jbHVkZXMoXCIuXCIpICYmICFyZXBvc2l0b3J5Lmhhc0N1c3RvbUF0dHJpYnV0ZShjb2x1bW4pKTtcbiAgICAgICAgY29uc3QgY3VzdG9tQXR0cmlidXRlcyA9IHRoaXMuZ2V0T3JkZXJDdXN0b21BdHRyaWJ1dGUoZmlsdGVyLm9yZGVyIGFzIE9yZGVyTW9kZWxbXSwgZmlsdGVyLmRhdGEpO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHJlcG9zaXRvcnkubW9kZWwuZmluZEFsbCh7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgYXR0cmlidXRlczogW1wiaWRcIiwgLi4ubm9uTmVzdGVkT3JkZXJDb2x1bW5zLCAuLi5jdXN0b21BdHRyaWJ1dGVzXSxcbiAgICAgICAgICAgIGxpbWl0OiBmaWx0ZXIucGFnZSA/IGZpbHRlci5wYWdlLnNpemUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBvZmZzZXQ6IGZpbHRlci5wYWdlID8gZmlsdGVyLnBhZ2UubnVtYmVyICogZmlsdGVyLnBhZ2Uuc2l6ZSArIChmaWx0ZXIucGFnZS5vZmZzZXQgPz8gMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdWJRdWVyeTogZmFsc2UsXG4gICAgICAgICAgICBncm91cDogZmlsdGVyLmdyb3VwQnkgPz8gb3B0aW9ucy5ncm91cCxcbiAgICAgICAgICAgIG9yZGVyXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5nZW5lcmF0ZVJlcG9zaXRvcnlHcm91cEJ5KGZpbHRlcik7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXBvc2l0b3J5LmZpbmRBbGwoe1xuICAgICAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICAgICAgICBpZDogdmFsdWVzLm1hcCh4ID0+IHguaWQpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3JkZXIsXG4gICAgICAgICAgICBwYXJhbm9pZDogb3B0aW9ucy5wYXJhbm9pZCxcbiAgICAgICAgICAgIGdyb3VwXG4gICAgICAgIH0sIGZpbHRlci5kYXRhID8/IHt9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEFjY2Vzc0NvbnRyb2xXaGVyZUNvbmRpdGlvbih3aGVyZTogV2hlcmVPcHRpb25zIHwgdW5kZWZpbmVkLCB1c2VyOiBEYXRhRmlsdGVyVXNlck1vZGVsKTogUHJvbWlzZTxXaGVyZU9wdGlvbnMgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucz8uZGlzYWJsZUFjY2Vzc0NvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybiB3aGVyZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdXNlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdXNlciBmb3VuZFwiKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5hY2Nlc3NDb250cm9sQWRhcHRlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWNjZXNzQ29udHJvbCBpc24ndCBlbmFibGUgaW4geW91ciBwcm9qZWN0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb3VyY2VzID0gYXdhaXQgdGhpcy5hY2Nlc3NDb250cm9sQWRhcHRlci5nZXRSZXNvdXJjZXModGhpcy5yZXBvc2l0b3J5Lm1vZGVsLCB1c2VyKTtcbiAgICAgICAgaWYgKHJlc291cmNlcy5pZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBTZXF1ZWxpemVVdGlscy5tZXJnZVdoZXJlKHsgaWQ6IHJlc291cmNlcy5pZHMgfSwgd2hlcmUgPz8ge30pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvdXJjZXMud2hlcmUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgW09wLmFuZF06IFtcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLndoZXJlLFxuICAgICAgICAgICAgICAgICAgICB3aGVyZSA/PyB7fVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2hlcmU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGaWx0ZXJJbmNsdWRlKFxuICAgICAgICBtb2RlbDogdHlwZW9mIE0sXG4gICAgICAgIGZpbHRlcjogRmlsdGVyRGVmaW5pdGlvbixcbiAgICAgICAgcnVsZTogUXVlcnlSdWxlTW9kZWwsXG4gICAgICAgIGRhdGE/OiBvYmplY3RcbiAgICApOiBJbmNsdWRlT3B0aW9uc1tdW10ge1xuICAgICAgICBjb25zdCBpbmNsdWRlczogSW5jbHVkZU9wdGlvbnNbXVtdID0gW107XG4gICAgICAgIGNvbnN0IHBhdGhzID0gZmlsdGVyLmdldEluY2x1ZGVQYXRocyhydWxlLCBkYXRhKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICAgICAgICBpbmNsdWRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEluY2x1ZGVzKG1vZGVsLCBwYXRoLCBbXSwgW10sIHRydWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaWx0ZXIucGF0aCkge1xuICAgICAgICAgICAgaWYgKGZpbHRlci5jb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgICBpbmNsdWRlcy5wdXNoKHRoaXMuZ2V0Q29uZGl0aW9uSW5jbHVkZShtb2RlbCwgZmlsdGVyLmNvbmRpdGlvbikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaW5jbHVkZXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4uaW5jbHVkZXMsXG4gICAgICAgICAgICB0aGlzLnNlcXVlbGl6ZU1vZGVsU2Nhbm5lci5nZXRJbmNsdWRlcyhtb2RlbCwge1xuICAgICAgICAgICAgICAgIHBhdGg6IGZpbHRlci5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmFub2lkOiBmaWx0ZXIucGFyYW5vaWQsXG4gICAgICAgICAgICAgICAgd2hlcmU6IGZpbHRlci53aGVyZSA/IEZpbHRlclV0aWxzLmdlbmVyYXRlV2hlcmVDb25kaXRpb25zKGZpbHRlci53aGVyZSwgZGF0YSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH0sIFtdLCBbXSwgdHJ1ZSksXG4gICAgICAgICAgICBmaWx0ZXIuY29uZGl0aW9uID8gdGhpcy5nZXRDb25kaXRpb25JbmNsdWRlKG1vZGVsLCBmaWx0ZXIuY29uZGl0aW9uKTogW11cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE9yZGVyT3B0aW9ucyhvcmRlcnM6IE9yZGVyTW9kZWwgfCBPcmRlck1vZGVsW10pOiBPcmRlciB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcmRlcnMpKSB7XG4gICAgICAgICAgICBvcmRlcnMgPSBbb3JkZXJzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmRlZmF1bHRPcmRlclJ1bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRPcmRlcnMgPSBBcnJheS5pc0FycmF5KHRoaXMubW9kZWwuZGVmYXVsdE9yZGVyUnVsZS5vcmRlcilcbiAgICAgICAgICAgICAgICA/IHRoaXMubW9kZWwuZGVmYXVsdE9yZGVyUnVsZS5vcmRlclxuICAgICAgICAgICAgICAgIDogW3RoaXMubW9kZWwuZGVmYXVsdE9yZGVyUnVsZS5vcmRlcl07XG5cbiAgICAgICAgICAgIG9yZGVycyA9IFsuLi5kZWZhdWx0T3JkZXJzLCAuLi5vcmRlcnNdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkT3JkZXI6IE9yZGVyID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBvcmRlciBvZiBvcmRlcnMpIHtcbiAgICAgICAgICAgIGlmICghb3JkZXI/LmNvbHVtbiB8fCAhb3JkZXIuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlcG9zaXRvcnkuaGFzQ3VzdG9tQXR0cmlidXRlKG9yZGVyLmNvbHVtbikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSBvcmRlci5udWxsTGFzdCA/IGAtJHtvcmRlci5jb2x1bW59YCA6IG9yZGVyLmNvbHVtbjtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBvcmRlci5udWxsTGFzdCA/IG9yZGVyLmRpcmVjdGlvbiA9PT0gXCJhc2NcIiA/IFwiZGVzY1wiIDogXCJhc2NcIiA6IG9yZGVyLmRpcmVjdGlvbjtcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZWRPcmRlci5wdXNoKFtsaXRlcmFsKGNvbHVtbiksIGRpcmVjdGlvbi50b1VwcGVyQ2FzZSgpXSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmRlZmluaXRpb25zW29yZGVyLmNvbHVtbl0gYXMgT3JkZXJSdWxlRGVmaW5pdGlvbjtcbiAgICAgICAgICAgIGlmICghcnVsZSB8fCAhT3JkZXJSdWxlLnZhbGlkYXRlKHJ1bGUpKSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVkT3JkZXIucHVzaCh0aGlzLnNlcXVlbGl6ZU1vZGVsU2Nhbm5lci5nZXRPcmRlcih0aGlzLnJlcG9zaXRvcnkubW9kZWwsIG9yZGVyKSBhcyBPcmRlckl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZWRPcmRlci5wdXNoKFtydWxlLmdldE9yZGVyT3B0aW9uKHRoaXMucmVwb3NpdG9yeS5tb2RlbCksIG9yZGVyLmRpcmVjdGlvbi50b1VwcGVyQ2FzZSgpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVkT3JkZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRPcmRlckN1c3RvbUF0dHJpYnV0ZShvcmRlcnM6IE9yZGVyTW9kZWwgfCBPcmRlck1vZGVsW10sIGRhdGE/OiBvYmplY3QpOiBQcm9qZWN0aW9uQWxpYXNbXSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcmRlcnMpKSB7XG4gICAgICAgICAgICBvcmRlcnMgPSBbb3JkZXJzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXM6IFByb2plY3Rpb25BbGlhc1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgb3JkZXIgb2Ygb3JkZXJzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVwb3NpdG9yeS5oYXNDdXN0b21BdHRyaWJ1dGUob3JkZXIuY29sdW1uKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjdXN0b21BdHRyaWJ1dGUgPSB0aGlzLnJlcG9zaXRvcnkuZ2V0Q3VzdG9tQXR0cmlidXRlKG9yZGVyLmNvbHVtbik7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBjdXN0b21BdHRyaWJ1dGU/LnRyYW5zZm9ybShkYXRhKSBhcyBQcm9qZWN0aW9uQWxpYXM7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVJlcG9zaXRvcnlHcm91cEJ5KGZpbHRlcjogRmlsdGVyUXVlcnlNb2RlbCk6IEdyb3VwT3B0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZ3JvdXA6IEdyb3VwT3B0aW9uID0gW107XG4gICAgICAgIGlmIChmaWx0ZXIuZ3JvdXBCeSkge1xuICAgICAgICAgICAgZ3JvdXAucHVzaChTZXF1ZWxpemVVdGlscy5nZXRHcm91cExpdGVyYWwodGhpcy5yZXBvc2l0b3J5Lm1vZGVsLCBmaWx0ZXIuZ3JvdXBCeSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ3JvdXBCeSA9IHRoaXMucmVwb3NpdG9yeS5nZXRDdXN0b21BdHRyaWJ1dGVHcm91cEJ5KCk7XG4gICAgICAgIGlmICghZ3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBncm91cDtcbiAgICAgICAgfVxuXG4gICAgICAgIGdyb3VwLnB1c2goLi4uZ3JvdXBCeSk7XG4gICAgICAgIGlmICghZmlsdGVyLm9yZGVyIHx8IChmaWx0ZXIub3JkZXIgaW5zdGFuY2VvZiBBcnJheSAmJiAhZmlsdGVyLm9yZGVyLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBncm91cDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9yZGVycyA9IHRoaXMubm9ybWFsaXplT3JkZXIoZmlsdGVyLm9yZGVyKTtcbiAgICAgICAgZm9yIChjb25zdCBvcmRlciBvZiBvcmRlcnMpIHtcbiAgICAgICAgICAgIGlmICghb3JkZXI/LmNvbHVtbiB8fCAhb3JkZXIuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlcG9zaXRvcnkuaGFzQ3VzdG9tQXR0cmlidXRlKG9yZGVyLmNvbHVtbikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcnVsZSA9IHRoaXMuZGVmaW5pdGlvbnNbb3JkZXIuY29sdW1uXSBhcyBPcmRlclJ1bGVEZWZpbml0aW9uO1xuICAgICAgICAgICAgaWYgKCFydWxlIHx8ICFPcmRlclJ1bGUudmFsaWRhdGUocnVsZSkpIHtcbiAgICAgICAgICAgICAgICBncm91cC5wdXNoKGAke3RoaXMucmVwb3NpdG9yeS5tb2RlbC5uYW1lfS4ke1NlcXVlbGl6ZVV0aWxzLmZpbmRDb2x1bW5GaWVsZE5hbWUodGhpcy5yZXBvc2l0b3J5Lm1vZGVsLCBvcmRlci5jb2x1bW4pfWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBncm91cC5wdXNoKC4uLnRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEdyb3VwKHRoaXMucmVwb3NpdG9yeS5tb2RlbCwgb3JkZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBncm91cDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZERlZmF1bHRGaWx0ZXIocXVlcnk/OiBRdWVyeU1vZGVsKTogUXVlcnlNb2RlbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghdGhpcy5tb2RlbC5kZWZhdWx0RmlsdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVlcnk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tb2RlbC5kZWZhdWx0RmlsdGVyLnJlcXVpcmVkKSB7XG4gICAgICAgICAgICBpZiAocXVlcnk/LmNvbmRpdGlvbiAhPT0gXCJhbmRcIikge1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IFwiYW5kXCIsXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVzOiBxdWVyeSA/IFtxdWVyeV0gOiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocXVlcnk/LmNvbmRpdGlvbiAhPT0gXCJvclwiKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCJvclwiLFxuICAgICAgICAgICAgICAgICAgICBydWxlczogcXVlcnkgPyBbcXVlcnldIDogW11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXJ5Py5ydWxlcy5wdXNoKHRoaXMubW9kZWwuZGVmYXVsdEZpbHRlci5maWx0ZXIpO1xuICAgICAgICByZXR1cm4gcXVlcnk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3JtYWxpemVPcmRlcihvcmRlcnM6IE9yZGVyTW9kZWwgfCBPcmRlck1vZGVsW10pOiBPcmRlck1vZGVsW10ge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob3JkZXJzKSkge1xuICAgICAgICAgICAgb3JkZXJzID0gW29yZGVyc107XG4gICAgICAgIH1cblxuICAgICAgICBvcmRlcnMgPSBvcmRlcnM/LmZpbHRlcihvcmRlciA9PiBvcmRlcj8uY29sdW1uKTtcblxuICAgICAgICBpZiAoIW9yZGVycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBvcmRlcnMgPSBbe1xuICAgICAgICAgICAgICAgIGNvbHVtbjogXCJpZFwiLFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogXCJhc2NcIlxuICAgICAgICAgICAgfV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3JkZXJzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Tm9uTmVzdGVkT3JkZXJDb2x1bW5zKG9yZGVyczogT3JkZXJNb2RlbFtdKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gb3JkZXJzLmZpbHRlcihvcmRlciA9PiBvcmRlci5jb2x1bW4gJiYgIW9yZGVyLmNvbHVtbi5pbmNsdWRlcyhcIi5cIikpLm1hcChvcmRlciA9PiBvcmRlci5jb2x1bW4pO1xuICAgIH1cbn1cbiJdfQ==
@@ -9,5 +9,5 @@ export declare class FilterUtils {
9
9
  static getOperatorTranslationKey(operator: string): string;
10
10
  static getCustomOperatorTranslationKey(key: string, operator: string): string;
11
11
  static getRadioOptionTranslationKey(key: string, option: string): string;
12
- static generateWhereConditions(model: IncludeWhereModel, data?: object): WhereOptions;
12
+ static generateWhereConditions(model: IncludeWhereModel | undefined, data?: object): WhereOptions | undefined;
13
13
  }
@@ -39,4 +39,4 @@ class FilterUtils {
39
39
  }
40
40
  exports.FilterUtils = FilterUtils;
41
41
 
42
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9maWx0ZXIvZmlsdGVyLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLE1BQWEsV0FBVztJQUNiLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUE2QjtRQUN4RCxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDO0lBQ25DLENBQUM7SUFFTSxNQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBVztRQUM3QyxPQUFPLFVBQVUsR0FBRyxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFhO1FBQzlDLE9BQU8sNkJBQTZCLEtBQUssRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFTSxNQUFNLENBQUMseUJBQXlCLENBQUMsUUFBZ0I7UUFDcEQsT0FBTyxnQ0FBZ0MsUUFBUSxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVNLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxHQUFXLEVBQUUsUUFBZ0I7UUFDdkUsT0FBTyxVQUFVLEdBQUcsY0FBYyxRQUFRLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRU0sTUFBTSxDQUFDLDRCQUE0QixDQUFDLEdBQVcsRUFBRSxNQUFjO1FBQ2xFLE9BQU8sVUFBVSxHQUFHLFlBQVksTUFBTSxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVNLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxLQUF3QixFQUFFLElBQWE7UUFDekUsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE9BQU87U0FDVjtRQUVELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNqQixLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRTtZQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDNUIsU0FBUzthQUNaO1lBRUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxFQUFFO2dCQUM5QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ3RCO1NBQ0o7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0NBQ0o7QUE1Q0Qsa0NBNENDIiwiZmlsZSI6ImxpYi9maWx0ZXIvZmlsdGVyLnV0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgV2hlcmVPcHRpb25zIH0gZnJvbSBcInNlcXVlbGl6ZVwiO1xuaW1wb3J0IHsgSW5jbHVkZVdoZXJlTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxzL2luY2x1ZGUubW9kZWxcIjtcbmltcG9ydCB7IEJhc2VGaWx0ZXIgfSBmcm9tIFwiLi9iYXNlLWZpbHRlclwiO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyVXRpbHMge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UHJvdmlkZXJUb2tlbihmaWx0ZXI6IFR5cGU8QmFzZUZpbHRlcjxhbnk+Pik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHtmaWx0ZXIubmFtZX1TZXJ2aWNlYDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEZpbHRlclRyYW5zbGF0aW9uS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBmaWx0ZXIuJHtrZXl9Lm5hbWVgO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0R3JvdXBUcmFuc2xhdGlvbktleShncm91cDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBkYXRhX2ZpbHRlci5maWx0ZXIuZ3JvdXBzLiR7Z3JvdXB9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldE9wZXJhdG9yVHJhbnNsYXRpb25LZXkob3BlcmF0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZGF0YV9maWx0ZXIuZmlsdGVyLm9wZXJhdG9ycy4ke29wZXJhdG9yfWA7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDdXN0b21PcGVyYXRvclRyYW5zbGF0aW9uS2V5KGtleTogc3RyaW5nLCBvcGVyYXRvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBmaWx0ZXIuJHtrZXl9Lm9wZXJhdG9ycy4ke29wZXJhdG9yfWA7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRSYWRpb09wdGlvblRyYW5zbGF0aW9uS2V5KGtleTogc3RyaW5nLCBvcHRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZmlsdGVyLiR7a2V5fS5vcHRpb25zLiR7b3B0aW9ufWA7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZVdoZXJlQ29uZGl0aW9ucyhtb2RlbDogSW5jbHVkZVdoZXJlTW9kZWwsIGRhdGE/OiBvYmplY3QpOiBXaGVyZU9wdGlvbnMge1xuICAgICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3aGVyZSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtb2RlbCkge1xuICAgICAgICAgICAgaWYgKCFtb2RlbC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbW9kZWxba2V5XShkYXRhKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICB3aGVyZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2hlcmU7XG4gICAgfVxufVxuIl19
42
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9maWx0ZXIvZmlsdGVyLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLE1BQWEsV0FBVztJQUNiLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUE2QjtRQUN4RCxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDO0lBQ25DLENBQUM7SUFFTSxNQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBVztRQUM3QyxPQUFPLFVBQVUsR0FBRyxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFhO1FBQzlDLE9BQU8sNkJBQTZCLEtBQUssRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFTSxNQUFNLENBQUMseUJBQXlCLENBQUMsUUFBZ0I7UUFDcEQsT0FBTyxnQ0FBZ0MsUUFBUSxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVNLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxHQUFXLEVBQUUsUUFBZ0I7UUFDdkUsT0FBTyxVQUFVLEdBQUcsY0FBYyxRQUFRLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRU0sTUFBTSxDQUFDLDRCQUE0QixDQUFDLEdBQVcsRUFBRSxNQUFjO1FBQ2xFLE9BQU8sVUFBVSxHQUFHLFlBQVksTUFBTSxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVNLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFvQyxFQUFFLElBQWE7UUFDckYsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE9BQU87U0FDVjtRQUVELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNqQixLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRTtZQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDNUIsU0FBUzthQUNaO1lBRUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxFQUFFO2dCQUM3QixLQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQy9CO1NBQ0o7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0NBQ0o7QUE1Q0Qsa0NBNENDIiwiZmlsZSI6ImxpYi9maWx0ZXIvZmlsdGVyLnV0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgV2hlcmVPcHRpb25zIH0gZnJvbSBcInNlcXVlbGl6ZVwiO1xuaW1wb3J0IHsgSW5jbHVkZVdoZXJlTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxzL2luY2x1ZGUubW9kZWxcIjtcbmltcG9ydCB7IEJhc2VGaWx0ZXIgfSBmcm9tIFwiLi9iYXNlLWZpbHRlclwiO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyVXRpbHMge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UHJvdmlkZXJUb2tlbihmaWx0ZXI6IFR5cGU8QmFzZUZpbHRlcjxhbnk+Pik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHtmaWx0ZXIubmFtZX1TZXJ2aWNlYDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEZpbHRlclRyYW5zbGF0aW9uS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBmaWx0ZXIuJHtrZXl9Lm5hbWVgO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0R3JvdXBUcmFuc2xhdGlvbktleShncm91cDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBkYXRhX2ZpbHRlci5maWx0ZXIuZ3JvdXBzLiR7Z3JvdXB9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldE9wZXJhdG9yVHJhbnNsYXRpb25LZXkob3BlcmF0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZGF0YV9maWx0ZXIuZmlsdGVyLm9wZXJhdG9ycy4ke29wZXJhdG9yfWA7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDdXN0b21PcGVyYXRvclRyYW5zbGF0aW9uS2V5KGtleTogc3RyaW5nLCBvcGVyYXRvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBmaWx0ZXIuJHtrZXl9Lm9wZXJhdG9ycy4ke29wZXJhdG9yfWA7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRSYWRpb09wdGlvblRyYW5zbGF0aW9uS2V5KGtleTogc3RyaW5nLCBvcHRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZmlsdGVyLiR7a2V5fS5vcHRpb25zLiR7b3B0aW9ufWA7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZVdoZXJlQ29uZGl0aW9ucyhtb2RlbDogSW5jbHVkZVdoZXJlTW9kZWwgfCB1bmRlZmluZWQsIGRhdGE/OiBvYmplY3QpOiBXaGVyZU9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3aGVyZSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtb2RlbCkge1xuICAgICAgICAgICAgaWYgKCFtb2RlbC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbW9kZWxba2V5XShkYXRhKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAod2hlcmUgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2hlcmU7XG4gICAgfVxufVxuIl19
@@ -1,13 +1,13 @@
1
- import { FilterType } from "../type";
1
+ import { WhereOptions } from "sequelize";
2
+ import { QueryRuleModel, RuleModel } from "../models";
2
3
  import { FilterOperatorTypes } from "../operators";
4
+ import { FilterType } from "../type";
3
5
  import { BaseFilterDefinition, Filter } from "./filter";
4
- import { QueryRuleModel, RuleModel } from "../models";
5
- import { WhereOptions } from "sequelize";
6
6
  export declare class CoordinateFilter extends Filter {
7
7
  type: FilterType;
8
8
  operators: FilterOperatorTypes[];
9
9
  constructor(definition: BaseFilterDefinition);
10
- getWhereOptions(rule: QueryRuleModel): Promise<WhereOptions>;
10
+ getWhereOptions(rule: QueryRuleModel): Promise<WhereOptions | undefined>;
11
11
  private getEqualWhereOptions;
12
12
  private getNotEqualWhereOptions;
13
13
  static getCoordinates(rule: RuleModel): [number, number];