@mediusinc/mng-commons-audit 3.0.0-rc.1 → 3.0.0-rc.10

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 (49) hide show
  1. package/assets/i18n/en.json +17 -1
  2. package/assets/i18n/sl.json +18 -2
  3. package/esm2022/lib/api/models/entityChange.mjs +9 -9
  4. package/esm2022/lib/api/models/guiEntityModel.mjs +9 -9
  5. package/esm2022/lib/api/models/guiPropertyModel.mjs +9 -9
  6. package/esm2022/lib/api/models/guiPropertyType.mjs +12 -12
  7. package/esm2022/lib/api/models/guiRelationModel.mjs +9 -9
  8. package/esm2022/lib/api/models/revEntityWithChangesDto.mjs +9 -9
  9. package/esm2022/lib/api/models/revEntityWithStateDto.mjs +9 -9
  10. package/esm2022/lib/api/models/revisionType.mjs +8 -8
  11. package/esm2022/lib/api/services/audit-revisions-api.service.mjs +14 -10
  12. package/esm2022/lib/api/services/audit.service.mjs +3 -3
  13. package/esm2022/lib/audit.routes.mjs +39 -21
  14. package/esm2022/lib/components/entity-changes-field/entity-changes-field.component.mjs +59 -25
  15. package/esm2022/lib/components/pages/entity-revisions/audit-entity-revisions-page.component.mjs +70 -38
  16. package/esm2022/lib/components/pages/revisions/audit-revisions-page.component.mjs +34 -25
  17. package/esm2022/lib/models/entity-revision-change-state.model.mjs +8 -0
  18. package/esm2022/lib/models/entity-revision-changes.model.mjs +8 -0
  19. package/esm2022/lib/models/rev-entity-detailed.model.mjs +9 -0
  20. package/esm2022/lib/models/rev-entity.model.mjs +8 -0
  21. package/esm2022/lib/models/revEntityWithId.model.mjs +8 -7
  22. package/esm2022/lib/utils/audit.util.mjs +101 -187
  23. package/fesm2022/mediusinc-mng-commons-audit.mjs +402 -491
  24. package/fesm2022/mediusinc-mng-commons-audit.mjs.map +1 -1
  25. package/lib/api/models/entityChange.d.ts +3 -3
  26. package/lib/api/models/guiEntityModel.d.ts +3 -3
  27. package/lib/api/models/guiPropertyModel.d.ts +5 -5
  28. package/lib/api/models/guiPropertyType.d.ts +1 -1
  29. package/lib/api/models/guiRelationModel.d.ts +1 -1
  30. package/lib/api/models/revEntityWithChangesDto.d.ts +3 -3
  31. package/lib/api/models/revEntityWithStateDto.d.ts +3 -3
  32. package/lib/api/models/revisionType.d.ts +1 -1
  33. package/lib/api/services/audit-revisions-api.service.d.ts +7 -6
  34. package/lib/api/services/audit.service.d.ts +3 -3
  35. package/lib/audit.routes.d.ts +13 -1
  36. package/lib/components/entity-changes-field/entity-changes-field.component.d.ts +6 -3
  37. package/lib/components/pages/entity-revisions/audit-entity-revisions-page.component.d.ts +12 -11
  38. package/lib/components/pages/revisions/audit-revisions-page.component.d.ts +9 -8
  39. package/lib/models/entity-revision-change-state.model.d.ts +6 -0
  40. package/lib/models/entity-revision-changes.model.d.ts +5 -0
  41. package/lib/models/rev-entity-detailed.model.d.ts +10 -0
  42. package/lib/models/rev-entity.model.d.ts +6 -0
  43. package/lib/models/revEntityWithId.model.d.ts +2 -2
  44. package/lib/utils/audit.util.d.ts +8 -4
  45. package/package.json +10 -2
  46. package/esm2022/lib/api/models/index.mjs +0 -9
  47. package/esm2022/lib/models/entity-changes.model.mjs +0 -8
  48. package/lib/api/models/index.d.ts +0 -8
  49. package/lib/models/entity-changes.model.d.ts +0 -4
@@ -1,226 +1,145 @@
1
+ import { of } from 'rxjs';
1
2
  import { MediusFilterMatchType, ObjectSerializer } from '@mediusinc/mng-commons';
2
- import { GuiPropertyType, RevisionType } from '../api/models';
3
+ import { MngGuiPropertyTypeDto } from '../api/models/guiPropertyType';
4
+ import { MngRevisionTypeDto } from '../api/models/revisionType';
3
5
  import { NewMediusFilterMatchType } from '../models/new-filter-match-type.model';
4
6
  export class AuditUtil {
5
- static addColumnsFromModel(descriptor, propertyList) {
6
- for (const property of propertyList) {
7
- if (property.propertyType === GuiPropertyType.Enum) {
8
- // TODO is there a nicer way than appending "Dto" at the end of the simple name to match
9
- descriptor
10
- .addColumn(property.resolvedPropertyName)
11
- .withSort()
12
- .asEnum(ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'))
13
- .withFilterLookupEnum(property.possibleEnumValues);
7
+ static addColumnsFromModel(descriptor, properties, modelType = undefined, addFilters = true, addSorts = true) {
8
+ for (const property of properties) {
9
+ if (!property.resolvedPropertyName) {
10
+ continue;
11
+ }
12
+ const columnPrepend = modelType ? `${modelType}.` : '';
13
+ const isEnum = property.propertyType === MngGuiPropertyTypeDto.Enum;
14
+ let column = null;
15
+ if (isEnum) {
16
+ if (!property.possibleEnumValues) {
17
+ continue;
18
+ }
19
+ const enumType = AuditUtil.findEnumType(property);
20
+ if (enumType) {
21
+ column = descriptor.addColumn(columnPrepend + property.resolvedPropertyName).asEnum(enumType);
22
+ if (addFilters) {
23
+ column.withFilterLookupEnum(property.possibleEnumValues);
24
+ }
25
+ }
26
+ else {
27
+ column = descriptor.addColumn(columnPrepend + property.resolvedPropertyName);
28
+ if (addFilters) {
29
+ (column?.withFilterLookup()).withLookup(() => of(property.possibleEnumValues ?? []));
30
+ }
31
+ }
14
32
  }
15
- else if (property.propertyType === GuiPropertyType.Number) {
16
- descriptor.addColumn(property.resolvedPropertyName).withSort().asNumber().withFilter();
33
+ else if (property.propertyType === MngGuiPropertyTypeDto.Number) {
34
+ column = descriptor.addColumn(columnPrepend + property.resolvedPropertyName).asNumber();
17
35
  }
18
- else if (property.propertyType === GuiPropertyType.Boolean) {
19
- descriptor.addColumn(property.resolvedPropertyName).withSort().asBoolean().withFilter();
36
+ else if (property.propertyType === MngGuiPropertyTypeDto.Boolean) {
37
+ column = descriptor.addColumn(columnPrepend + property.resolvedPropertyName).asBoolean();
20
38
  }
21
- else if (property.propertyType === GuiPropertyType.LocalDate) {
22
- descriptor.addColumn(property.resolvedPropertyName).withSort().asDate('dd. MMM yyyy').withFilter();
39
+ else if (property.propertyType === MngGuiPropertyTypeDto.LocalDate) {
40
+ column = descriptor.addColumn(columnPrepend + property.resolvedPropertyName).asDate('dd. MM yyyy');
23
41
  }
24
- else if (property.propertyType === GuiPropertyType.OffsetDateTime) {
25
- descriptor.addColumn(property.resolvedPropertyName).withSort().asDate('dd. MMM yyyy HH:mm').withFilter();
42
+ else if (property.propertyType === MngGuiPropertyTypeDto.OffsetDateTime) {
43
+ column = descriptor.addColumn(columnPrepend + property.resolvedPropertyName).asDate('dd. MM yyyy HH:mm');
26
44
  }
27
45
  else {
28
46
  // string / wildcard
29
- descriptor.addColumn(property.resolvedPropertyName).withSort().withFilter();
47
+ column = descriptor.addColumn(columnPrepend + property.resolvedPropertyName).withTitle(AuditUtil.getPropertyTitleKey(property, modelType));
48
+ }
49
+ column.withTitle(AuditUtil.getPropertyTitleKey(property, modelType));
50
+ if (!isEnum && addFilters) {
51
+ column?.withFilter();
52
+ }
53
+ if (addSorts) {
54
+ column?.withSort();
30
55
  }
31
56
  }
32
57
  return descriptor;
33
58
  }
34
- static addFieldsFromModel(descriptor, revModel) {
35
- for (const property of revModel.properties) {
36
- if (property.propertyType === GuiPropertyType.Enum) {
37
- descriptor
38
- .addFieldLookupEnum('revEntity.' + property.resolvedPropertyName, ObjectSerializer.get().findEnum(property.enumClassSimpleName), property.possibleEnumValues)
39
- .withLabel(property.resolvedPropertyName)
40
- .withDisabled();
59
+ static getPropertyTitleKey(property, modelType = undefined) {
60
+ if (modelType === 'revEntity') {
61
+ return 'MngRevEntity.properties.' + property.resolvedPropertyName;
62
+ }
63
+ return property.resolvedPropertyName ?? '';
64
+ }
65
+ static addFieldsFromModel(descriptor, properties, modelType = 'revEntity') {
66
+ for (const property of properties) {
67
+ if (!property.resolvedPropertyName) {
68
+ continue;
69
+ }
70
+ const fieldPrepend = `${modelType}.`;
71
+ if (property.propertyType === MngGuiPropertyTypeDto.Enum) {
72
+ const enumType = AuditUtil.findEnumType(property);
73
+ if (enumType) {
74
+ if (!property.possibleEnumValues) {
75
+ continue;
76
+ }
77
+ descriptor.addFieldLookupEnum(fieldPrepend + property.resolvedPropertyName, enumType, property.possibleEnumValues).withDisabled();
78
+ }
79
+ else {
80
+ descriptor.addField(fieldPrepend + property.resolvedPropertyName).withLabel(AuditUtil.getPropertyTitleKey(property, modelType));
81
+ }
41
82
  }
42
- else if (property.propertyType === GuiPropertyType.Number) {
83
+ else if (property.propertyType === MngGuiPropertyTypeDto.Number) {
43
84
  descriptor
44
- .addField('revEntity.' + property.resolvedPropertyName)
45
- .withLabel(property.resolvedPropertyName)
85
+ .addField(fieldPrepend + property.resolvedPropertyName)
86
+ .withLabel(AuditUtil.getPropertyTitleKey(property, modelType))
46
87
  .asNumber()
47
88
  .withDisabled();
48
89
  }
49
- else if (property.propertyType === GuiPropertyType.Boolean) {
90
+ else if (property.propertyType === MngGuiPropertyTypeDto.Boolean) {
50
91
  descriptor
51
- .addField('revEntity.' + property.resolvedPropertyName)
52
- .withLabel(property.resolvedPropertyName)
92
+ .addField(fieldPrepend + property.resolvedPropertyName)
93
+ .withLabel(AuditUtil.getPropertyTitleKey(property, modelType))
53
94
  .withDisabled();
54
95
  }
55
- else if (property.propertyType === GuiPropertyType.LocalDate) {
96
+ else if (property.propertyType === MngGuiPropertyTypeDto.LocalDate) {
56
97
  descriptor
57
- .addField('revEntity.' + property.resolvedPropertyName)
58
- .withLabel(property.resolvedPropertyName)
98
+ .addField(fieldPrepend + property.resolvedPropertyName)
99
+ .withLabel(AuditUtil.getPropertyTitleKey(property, modelType))
59
100
  .asDatePicker('dd. MMM yyyy')
60
101
  .withDisabled();
61
102
  }
62
- else if (property.propertyType === GuiPropertyType.OffsetDateTime) {
103
+ else if (property.propertyType === MngGuiPropertyTypeDto.OffsetDateTime) {
63
104
  descriptor
64
- .addField('revEntity.' + property.resolvedPropertyName)
65
- .withLabel(property.resolvedPropertyName)
105
+ .addField(fieldPrepend + property.resolvedPropertyName)
106
+ .withLabel(AuditUtil.getPropertyTitleKey(property, modelType))
66
107
  .asDatePicker('dd. MM yy', undefined, undefined, true, false)
67
108
  .withDisabled();
68
109
  }
69
110
  else {
70
111
  // string / wildcard
71
112
  descriptor
72
- .addField('revEntity.' + property.resolvedPropertyName)
73
- .withLabel(property.resolvedPropertyName)
113
+ .addField(fieldPrepend + property.resolvedPropertyName)
114
+ .withLabel(AuditUtil.getPropertyTitleKey(property, modelType))
74
115
  .withDisabled();
75
116
  }
76
117
  }
77
118
  return descriptor;
78
119
  }
79
120
  static buildDescriptorForEntityRevision(descriptor, revModel, entityModel) {
80
- descriptor
81
- .addColumn('revType')
82
- .withTitle('revType')
83
- .asEnum(ObjectSerializer.get().findEnum('RevisionType'))
84
- .withFilterLookupEnum([RevisionType.Add, RevisionType.Mod, RevisionType.Del]);
85
- descriptor.addFieldLookupEnum('revType', ObjectSerializer.get().findEnum('RevisionType'), [RevisionType.Add, RevisionType.Mod, RevisionType.Del]).withLabel('revType');
86
- for (const property of revModel.properties) {
87
- if (property.propertyType === GuiPropertyType.Enum) {
88
- // TODO is there a nicer way than appending "Dto" at the end of the simple name to match
89
- descriptor
90
- .addColumn('revEntity.' + property.resolvedPropertyName)
91
- .withTitle(property.resolvedPropertyName)
92
- .asEnum(ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'))
93
- .withSort()
94
- .withFilterLookupEnum(property.possibleEnumValues);
95
- descriptor
96
- .addFieldLookupEnum('revEntity.' + property.resolvedPropertyName, ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'), property.possibleEnumValues)
97
- .withLabel(property.resolvedPropertyName);
98
- }
99
- else if (property.propertyType === GuiPropertyType.Number) {
100
- descriptor
101
- .addColumn('revEntity.' + property.resolvedPropertyName)
102
- .withTitle(property.resolvedPropertyName)
103
- .asNumber()
104
- .withSort()
105
- .withFilter();
106
- descriptor
107
- .addField('revEntity.' + property.resolvedPropertyName)
108
- .withLabel(property.resolvedPropertyName)
109
- .asNumber();
110
- }
111
- else if (property.propertyType === GuiPropertyType.Boolean) {
112
- descriptor
113
- .addColumn('revEntity.' + property.resolvedPropertyName)
114
- .withTitle(property.resolvedPropertyName)
115
- .asBoolean()
116
- .withSort()
117
- .withFilter();
118
- descriptor.addField('revEntity.' + property.resolvedPropertyName).withLabel(property.resolvedPropertyName);
119
- }
120
- else if (property.propertyType === GuiPropertyType.LocalDate) {
121
- descriptor
122
- .addColumn('revEntity.' + property.resolvedPropertyName)
123
- .withTitle(property.resolvedPropertyName)
124
- .asDate('dd. MMM yyyy')
125
- .withSort()
126
- .withFilter();
127
- descriptor
128
- .addField('revEntity.' + property.resolvedPropertyName)
129
- .withLabel(property.resolvedPropertyName)
130
- .asDatePicker('dd. MMM yyyy');
131
- }
132
- else if (property.propertyType === GuiPropertyType.OffsetDateTime) {
133
- descriptor
134
- .addColumn('revEntity.' + property.resolvedPropertyName)
135
- .withTitle(property.resolvedPropertyName)
136
- .asDate('dd. MMM yyyy HH:mm')
137
- .withSort()
138
- .withFilter();
139
- descriptor
140
- .addField('revEntity.' + property.resolvedPropertyName)
141
- .withLabel(property.resolvedPropertyName)
142
- .asDatePicker('dd. MM yy', undefined, undefined, true, false);
143
- }
144
- else {
145
- // string / wildcard
146
- descriptor
147
- .addColumn('revEntity.' + property.resolvedPropertyName)
148
- .withTitle(property.resolvedPropertyName)
149
- .withSort()
150
- .withFilter();
151
- descriptor.addField('revEntity.' + property.resolvedPropertyName).withLabel(property.resolvedPropertyName);
152
- }
121
+ descriptor.addColumn('revType').withTitle('MngEntityRevisionChangeState.properties.revType').asEnum(MngRevisionTypeDto).withFilter();
122
+ descriptor.addFieldLookupEnum('revType', MngRevisionTypeDto).withLabel('MngEntityRevisionChangeState.properties.revType');
123
+ if (revModel.properties) {
124
+ AuditUtil.addColumnsFromModel(descriptor.table, revModel.properties, 'revEntity');
125
+ AuditUtil.addFieldsFromModel(descriptor.detailsEditor, revModel.properties, 'revEntity');
153
126
  }
154
- for (const property of entityModel.properties) {
155
- if (property.propertyType === GuiPropertyType.Enum) {
156
- // TODO is there a nicer way than appending "Dto" at the end of the simple name to match
157
- descriptor
158
- .addColumn('entityState.' + property.resolvedPropertyName)
159
- .withTitle(property.resolvedPropertyName)
160
- .asEnum(ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'))
161
- .withSort()
162
- .withFilterLookupEnum(property.possibleEnumValues);
163
- descriptor
164
- .addFieldLookupEnum('entityState.' + property.resolvedPropertyName, ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'), property.possibleEnumValues)
165
- .withLabel(property.resolvedPropertyName);
166
- }
167
- else if (property.propertyType === GuiPropertyType.Number) {
168
- descriptor
169
- .addColumn('entityState.' + property.resolvedPropertyName)
170
- .withTitle(property.resolvedPropertyName)
171
- .asNumber()
172
- .withSort()
173
- .withFilter();
174
- descriptor
175
- .addField('entityState.' + property.resolvedPropertyName)
176
- .withLabel(property.resolvedPropertyName)
177
- .asNumber();
178
- }
179
- else if (property.propertyType === GuiPropertyType.Boolean) {
180
- descriptor
181
- .addColumn('entityState.' + property.resolvedPropertyName)
182
- .withTitle(property.resolvedPropertyName)
183
- .asBoolean()
184
- .withSort()
185
- .withFilter();
186
- descriptor.addField('entityState.' + property.resolvedPropertyName).withLabel(property.resolvedPropertyName);
187
- }
188
- else if (property.propertyType === GuiPropertyType.LocalDate) {
189
- descriptor
190
- .addColumn('entityState.' + property.resolvedPropertyName)
191
- .withTitle(property.resolvedPropertyName)
192
- .asDate('dd. MMM yyyy')
193
- .withSort()
194
- .withFilter();
195
- descriptor
196
- .addField('entityState.' + property.resolvedPropertyName)
197
- .withLabel(property.resolvedPropertyName)
198
- .asDatePicker('dd. MMM yyyy');
199
- }
200
- else if (property.propertyType === GuiPropertyType.OffsetDateTime) {
201
- descriptor
202
- .addColumn('entityState.' + property.resolvedPropertyName)
203
- .withTitle(property.resolvedPropertyName)
204
- .asDate('dd. MMM yyyy HH:mm')
205
- .withSort()
206
- .withFilter();
207
- descriptor
208
- .addField('entityState.' + property.resolvedPropertyName)
209
- .withLabel(property.resolvedPropertyName)
210
- .asDatePicker('dd. MM yy', undefined, undefined, true, false);
211
- }
212
- else {
213
- // string / wildcard
214
- descriptor
215
- .addColumn('entityState.' + property.resolvedPropertyName)
216
- .withTitle(property.resolvedPropertyName)
217
- .withSort()
218
- .withFilter();
219
- descriptor.addField('entityState.' + property.resolvedPropertyName).withLabel(property.resolvedPropertyName);
220
- }
127
+ if (entityModel.properties) {
128
+ AuditUtil.addColumnsFromModel(descriptor.table, entityModel.properties, 'entityState');
129
+ AuditUtil.addFieldsFromModel(descriptor.detailsEditor, entityModel.properties, 'entityState');
221
130
  }
222
131
  return descriptor;
223
132
  }
133
+ static findEnumType(property) {
134
+ if (!property.enumClassSimpleName) {
135
+ return undefined;
136
+ }
137
+ let enumType = ObjectSerializer.get().findEnum(property.enumClassSimpleName);
138
+ if (!enumType) {
139
+ enumType = ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto');
140
+ }
141
+ return enumType;
142
+ }
224
143
  static extractPropertyName(fullPropertyName) {
225
144
  if (fullPropertyName?.includes('entityState.')) {
226
145
  return fullPropertyName.replace('entityState.', '');
@@ -236,12 +155,7 @@ export class AuditUtil {
236
155
  url += '&sorts=';
237
156
  const sortingQPs = [];
238
157
  for (let i = 0; i < queryParams.sortProperty.length; i++) {
239
- if (queryParams.sortAsc[i]) {
240
- sortingQPs.push(`asc:${this.extractPropertyName(queryParams.sortProperty[i])}`);
241
- }
242
- else {
243
- sortingQPs.push(`desc:${this.extractPropertyName(queryParams.sortProperty[i])}`);
244
- }
158
+ sortingQPs.push(`${queryParams.sortAsc?.[i] ?? true ? 'asc' : 'desc'}:${this.extractPropertyName(queryParams.sortProperty[i])}`);
245
159
  }
246
160
  url += sortingQPs.join(',');
247
161
  }
@@ -297,4 +211,4 @@ export class AuditUtil {
297
211
  return url;
298
212
  }
299
213
  }
300
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdXRpbHMvYXVkaXQudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1CLHFCQUFxQixFQUFvQixnQkFBZ0IsRUFBdUMsTUFBTSx3QkFBd0IsQ0FBQztBQUV6SixPQUFPLEVBQW1DLGVBQWUsRUFBeUIsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBRS9FLE1BQU0sT0FBTyxTQUFTO0lBQ1gsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFVBQWdDLEVBQUUsWUFBZ0M7UUFDaEcsS0FBSyxNQUFNLFFBQVEsSUFBSSxZQUFZLEVBQUU7WUFDakMsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLGVBQWUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2hELHdGQUF3RjtnQkFDeEYsVUFBVTtxQkFDTCxTQUFTLENBQUMsUUFBUSxDQUFDLG9CQUFxQixDQUFDO3FCQUN6QyxRQUFRLEVBQUU7cUJBQ1YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLENBQUM7cUJBQzdFLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQzFEO2lCQUFNLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxlQUFlLENBQUMsTUFBTSxFQUFFO2dCQUN6RCxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxvQkFBcUIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQzNGO2lCQUFNLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxlQUFlLENBQUMsT0FBTyxFQUFFO2dCQUMxRCxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEs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SjtZQUNELEdBQUcsSUFBSSxHQUFHLENBQUM7WUFDWCxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM5QjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFZGl0b3JEZXNjcmlwdG9yLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUsIE1lZGl1c1F1ZXJ5UGFyYW0sIE9iamVjdFNlcmlhbGl6ZXIsIFRhYmxlRGVzY3JpcHRvciwgVGFibGV2aWV3RGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucyc7XG5cbmltcG9ydCB7R3VpRW50aXR5TW9kZWwsIEd1aVByb3BlcnR5TW9kZWwsIEd1aVByb3BlcnR5VHlwZSwgUmV2RW50aXR5V2l0aFN0YXRlRHRvLCBSZXZpc2lvblR5cGV9IGZyb20gJy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGV9IGZyb20gJy4uL21vZGVscy9uZXctZmlsdGVyLW1hdGNoLXR5cGUubW9kZWwnO1xuXG5leHBvcnQgY2xhc3MgQXVkaXRVdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIGFkZENvbHVtbnNGcm9tTW9kZWwoZGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPGFueT4sIHByb3BlcnR5TGlzdDogR3VpUHJvcGVydHlNb2RlbFtdKTogVGFibGVEZXNjcmlwdG9yPGFueT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnR5TGlzdCkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkVudW0pIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIGlzIHRoZXJlIGEgbmljZXIgd2F5IHRoYW4gYXBwZW5kaW5nIFwiRHRvXCIgYXQgdGhlIGVuZCBvZiB0aGUgc2ltcGxlIG5hbWUgdG8gbWF0Y2hcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4ocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAuYXNFbnVtKE9iamVjdFNlcmlhbGl6ZXIuZ2V0KCkuZmluZEVudW0ocHJvcGVydHkuZW51bUNsYXNzU2ltcGxlTmFtZSArICdEdG8nKSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXJMb29rdXBFbnVtKHByb3BlcnR5LnBvc3NpYmxlRW51bVZhbHVlcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLk51bWJlcikge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkQ29sdW1uKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aFNvcnQoKS5hc051bWJlcigpLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuQm9vbGVhbikge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkQ29sdW1uKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aFNvcnQoKS5hc0Jvb2xlYW4oKS53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkxvY2FsRGF0ZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkQ29sdW1uKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aFNvcnQoKS5hc0RhdGUoJ2RkLiBNTU0geXl5eScpLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuT2Zmc2V0RGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZENvbHVtbihwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpLndpdGhTb3J0KCkuYXNEYXRlKCdkZC4gTU1NIHl5eXkgSEg6bW0nKS53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHN0cmluZyAvIHdpbGRjYXJkXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvci5hZGRDb2x1bW4ocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKS53aXRoU29ydCgpLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFkZEZpZWxkc0Zyb21Nb2RlbDxUPihkZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9yPFQ+LCByZXZNb2RlbDogR3VpRW50aXR5TW9kZWwpOiBFZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiByZXZNb2RlbC5wcm9wZXJ0aWVzISkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkVudW0pIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZExvb2t1cEVudW0oJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhLCBPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRFbnVtKHByb3BlcnR5LmVudW1DbGFzc1NpbXBsZU5hbWUhKSwgcHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhEaXNhYmxlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5OdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNOdW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkxvY2FsRGF0ZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGVQaWNrZXIoJ2RkLiBNTU0geXl5eScpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuT2Zmc2V0RGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNEYXRlUGlja2VyKCdkZC4gTU0geXknLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc3RyaW5nIC8gd2lsZGNhcmRcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBidWlsZERlc2NyaXB0b3JGb3JFbnRpdHlSZXZpc2lvbihcbiAgICAgICAgZGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvcjxSZXZFbnRpdHlXaXRoU3RhdGVEdG8+LFxuICAgICAgICByZXZNb2RlbDogR3VpRW50aXR5TW9kZWwsXG4gICAgICAgIGVudGl0eU1vZGVsOiBHdWlFbnRpdHlNb2RlbFxuICAgICk6IFRhYmxldmlld0Rlc2NyaXB0b3I8UmV2RW50aXR5V2l0aFN0YXRlRHRvPiB7XG4gICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgIC5hZGRDb2x1bW4oJ3JldlR5cGUnKVxuICAgICAgICAgICAgLndpdGhUaXRsZSgncmV2VHlwZScpXG4gICAgICAgICAgICAuYXNFbnVtKE9iamVjdFNlcmlhbGl6ZXIuZ2V0KCkuZmluZEVudW0oJ1JldmlzaW9uVHlwZScpKVxuICAgICAgICAgICAgLndpdGhGaWx0ZXJMb29rdXBFbnVtKFtSZXZpc2lvblR5cGUuQWRkLCBSZXZpc2lvblR5cGUuTW9kLCBSZXZpc2lvblR5cGUuRGVsXSk7XG4gICAgICAgIGRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXBFbnVtKCdyZXZUeXBlJywgT2JqZWN0U2VyaWFsaXplci5nZXQoKS5maW5kRW51bSgnUmV2aXNpb25UeXBlJyksIFtSZXZpc2lvblR5cGUuQWRkLCBSZXZpc2lvblR5cGUuTW9kLCBSZXZpc2lvblR5cGUuRGVsXSkud2l0aExhYmVsKCdyZXZUeXBlJyk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcmV2TW9kZWwucHJvcGVydGllcyEpIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5FbnVtKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyBpcyB0aGVyZSBhIG5pY2VyIHdheSB0aGFuIGFwcGVuZGluZyBcIkR0b1wiIGF0IHRoZSBlbmQgb2YgdGhlIHNpbXBsZSBuYW1lIHRvIG1hdGNoXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0VudW0oT2JqZWN0U2VyaWFsaXplci5nZXQoKS5maW5kRW51bShwcm9wZXJ0eS5lbnVtQ2xhc3NTaW1wbGVOYW1lICsgJ0R0bycpKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aEZpbHRlckxvb2t1cEVudW0ocHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzKTtcblxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkTG9va3VwRW51bShcbiAgICAgICAgICAgICAgICAgICAgICAgICdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISxcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFNlcmlhbGl6ZXIuZ2V0KCkuZmluZEVudW0ocHJvcGVydHkuZW51bUNsYXNzU2ltcGxlTmFtZSEgKyAnRHRvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5wb3NzaWJsZUVudW1WYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLk51bWJlcikge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbigncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoVGl0bGUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNOdW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aEZpbHRlcigpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc051bWJlcigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5Cb29sZWFuKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0Jvb2xlYW4oKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aEZpbHRlcigpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkRmllbGQoJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKS53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuTG9jYWxEYXRlKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGUoJ2RkLiBNTU0geXl5eScpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoU29ydCgpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGQoJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLmFzRGF0ZVBpY2tlcignZGQuIE1NTSB5eXl5Jyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLk9mZnNldERhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGUoJ2RkLiBNTU0geXl5eSBISDptbScpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoU29ydCgpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGQoJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLmFzRGF0ZVBpY2tlcignZGQuIE1NIHl5JywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc3RyaW5nIC8gd2lsZGNhcmRcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFRpdGxlKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhTb3J0KClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZEZpZWxkKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBlbnRpdHlNb2RlbC5wcm9wZXJ0aWVzISkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkVudW0pIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIGlzIHRoZXJlIGEgbmljZXIgd2F5IHRoYW4gYXBwZW5kaW5nIFwiRHRvXCIgYXQgdGhlIGVuZCBvZiB0aGUgc2ltcGxlIG5hbWUgdG8gbWF0Y2hcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoVGl0bGUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNFbnVtKE9iamVjdFNlcmlhbGl6ZXIuZ2V0KCkuZmluZEVudW0ocHJvcGVydHkuZW51bUNsYXNzU2ltcGxlTmFtZSArICdEdG8nKSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhTb3J0KClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXJMb29rdXBFbnVtKHByb3BlcnR5LnBvc3NpYmxlRW51bVZhbHVlcyk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGRMb29rdXBFbnVtKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEsXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRFbnVtKHByb3BlcnR5LmVudW1DbGFzc1NpbXBsZU5hbWUhICsgJ0R0bycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5OdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoVGl0bGUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNOdW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aEZpbHRlcigpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkKCdlbnRpdHlTdGF0ZS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoVGl0bGUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNCb29sZWFuKClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhTb3J0KClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZEZpZWxkKCdlbnRpdHlTdGF0ZS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKS53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuTG9jYWxEYXRlKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdlbnRpdHlTdGF0ZS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFRpdGxlKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLmFzRGF0ZSgnZGQuIE1NTSB5eXl5JylcbiAgICAgICAgICAgICAgICAgICAgLndpdGhTb3J0KClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgnZW50aXR5U3RhdGUuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGVQaWNrZXIoJ2RkLiBNTU0geXl5eScpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5PZmZzZXREYXRlVGltZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbignZW50aXR5U3RhdGUuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGUoJ2RkLiBNTU0geXl5eSBISDptbScpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoU29ydCgpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGQoJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNEYXRlUGlja2VyKCdkZC4gTU0geXknLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBzdHJpbmcgLyB3aWxkY2FyZFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbignZW50aXR5U3RhdGUuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoU29ydCgpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvci5hZGRGaWVsZCgnZW50aXR5U3RhdGUuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdFByb3BlcnR5TmFtZShmdWxsUHJvcGVydHlOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoZnVsbFByb3BlcnR5TmFtZT8uaW5jbHVkZXMoJ2VudGl0eVN0YXRlLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVsbFByb3BlcnR5TmFtZS5yZXBsYWNlKCdlbnRpdHlTdGF0ZS4nLCAnJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZnVsbFByb3BlcnR5TmFtZT8uaW5jbHVkZXMoJ3JldkVudGl0eS4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bGxQcm9wZXJ0eU5hbWU/LnJlcGxhY2UoJ3JldkVudGl0eS4nLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bGxQcm9wZXJ0eU5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhcHBlbmRNZWRpdXNRdWVyeVBhcmFtc1RvVXJsKHF1ZXJ5UGFyYW1zOiBNZWRpdXNRdWVyeVBhcmFtKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHVybCA9IGA/Zmlyc3RSZXN1bHQ9JHtxdWVyeVBhcmFtcy5pdGVtc09mZnNldH0mbWF4UmVzdWx0cz0ke3F1ZXJ5UGFyYW1zLml0ZW1zUGVyUGFnZX1gO1xuICAgICAgICBpZiAocXVlcnlQYXJhbXMuc29ydFByb3BlcnR5ICYmIHF1ZXJ5UGFyYW1zLnNvcnRQcm9wZXJ0eS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB1cmwgKz0gJyZzb3J0cz0nO1xuICAgICAgICAgICAgY29uc3Qgc29ydGluZ1FQcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVyeVBhcmFtcy5zb3J0UHJvcGVydHkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAocXVlcnlQYXJhbXMuc29ydEFzYyFbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc29ydGluZ1FQcy5wdXNoKGBhc2M6JHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUocXVlcnlQYXJhbXMuc29ydFByb3BlcnR5W2ldKX1gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzb3J0aW5nUVBzLnB1c2goYGRlc2M6JHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUocXVlcnlQYXJhbXMuc29ydFByb3BlcnR5W2ldKX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cmwgKz0gc29ydGluZ1FQcy5qb2luKCcsJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLmZpbHRlclBhcmFtcyAmJiBxdWVyeVBhcmFtcy5maWx0ZXJQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyUVBzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1mcCBvZiBxdWVyeVBhcmFtcy5maWx0ZXJQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1mcC5maWx0ZXJNYXRjaFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXF1YWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXF1YWxzfToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEVxdWFsczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEVxdWFsc306JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5Gcm9tVG86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclFQcy5wdXNoKGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5CZXR3ZWVufToke21mcC5maWx0ZXJWYWx1ZX0sJHttZnAuZmlsdGVyVmFsdWVUb31gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkNvbnRhaW5zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuQ29udGFpbnN9OiR7bWZwLmZpbHRlclZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuU3RhcnRzV2l0aDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLlN0YXJ0c1dpdGh9OiR7bWZwLmZpbHRlclZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRW5kc1dpdGg6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclFQcy5wdXNoKGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5FbmRzV2l0aH06JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5Jbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLklufToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEluOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuTm90SW59OiR7bWZwLmZpbHRlclZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuU21hbGxlclRoYW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclFQcy5wdXNoKGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5MZXNzVGhhbn06JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5HcmVhdGVyVGhhbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkdyZWF0ZXJUaGFufToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJsICs9ICcmJztcbiAgICAgICAgICAgIHVybCArPSBmaWx0ZXJRUHMuam9pbignJicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxufVxuIl19
214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdXRpbHMvYXVkaXQudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXhCLE9BQU8sRUFJSCxxQkFBcUIsRUFFckIsZ0JBQWdCLEVBR25CLE1BQU0sd0JBQXdCLENBQUM7QUFJaEMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFFcEUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFFL0UsTUFBTSxPQUFPLFNBQVM7SUFDWCxNQUFNLENBQUMsbUJBQW1CLENBQzdCLFVBQThCLEVBQzlCLFVBQW9DLEVBQ3BDLFlBQXFELFNBQVMsRUFDOUQsVUFBVSxHQUFHLElBQUksRUFDakIsUUFBUSxHQUFHLElBQUk7UUFFZixLQUFLLE1BQU0sUUFBUSxJQUFJLFVBQVUsRUFBRTtZQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFO2dCQUNoQyxTQUFTO2FBQ1o7WUFFRCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUV2RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsWUFBWSxLQUFLLHFCQUFxQixDQUFDLElBQUksQ0FBQztZQUNwRSxJQUFJLE1BQU0sR0FBdUMsSUFBSSxDQUFDO1lBQ3RELElBQUksTUFBTSxFQUFFO2dCQUNSLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUU7b0JBQzlCLFNBQVM7aUJBQ1o7Z0JBRUQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxR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QUFLLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUNwQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSx3QkFBd0IsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7d0JBQ3ZILE1BQU07cUJBQ1Q7aUJBQ0o7YUFDSjtZQUNELEdBQUcsSUFBSSxHQUFHLENBQUM7WUFDWCxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM5QjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtvZn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gICAgQ29sdW1uRGVzY3JpcHRvcixcbiAgICBFZGl0b3JEZXNjcmlwdG9yLFxuICAgIEZpbHRlckxvb2t1cERlc2NyaXB0b3IsXG4gICAgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLFxuICAgIE1lZGl1c1F1ZXJ5UGFyYW0sXG4gICAgT2JqZWN0U2VyaWFsaXplcixcbiAgICBUYWJsZURlc2NyaXB0b3IsXG4gICAgVGFibGV2aWV3RGVzY3JpcHRvclxufSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zJztcblxuaW1wb3J0IHtNbmdHdWlFbnRpdHlNb2RlbER0b30gZnJvbSAnLi4vYXBpL21vZGVscy9ndWlFbnRpdHlNb2RlbCc7XG5pbXBvcnQge01uZ0d1aVByb3BlcnR5TW9kZWxEdG99IGZyb20gJy4uL2FwaS9tb2RlbHMvZ3VpUHJvcGVydHlNb2RlbCc7XG5pbXBvcnQge01uZ0d1aVByb3BlcnR5VHlwZUR0b30gZnJvbSAnLi4vYXBpL21vZGVscy9ndWlQcm9wZXJ0eVR5cGUnO1xuaW1wb3J0IHtNbmdSZXZFbnRpdHlXaXRoU3RhdGVEdG99IGZyb20gJy4uL2FwaS9tb2RlbHMvcmV2RW50aXR5V2l0aFN0YXRlRHRvJztcbmltcG9ydCB7TW5nUmV2aXNpb25UeXBlRHRvfSBmcm9tICcuLi9hcGkvbW9kZWxzL3JldmlzaW9uVHlwZSc7XG5pbXBvcnQge05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZX0gZnJvbSAnLi4vbW9kZWxzL25ldy1maWx0ZXItbWF0Y2gtdHlwZS5tb2RlbCc7XG5cbmV4cG9ydCBjbGFzcyBBdWRpdFV0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgYWRkQ29sdW1uc0Zyb21Nb2RlbDxUPihcbiAgICAgICAgZGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+LFxuICAgICAgICBwcm9wZXJ0aWVzOiBNbmdHdWlQcm9wZXJ0eU1vZGVsRHRvW10sXG4gICAgICAgIG1vZGVsVHlwZTogJ3JldkVudGl0eScgfCAnZW50aXR5U3RhdGUnIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgICAgICBhZGRGaWx0ZXJzID0gdHJ1ZSxcbiAgICAgICAgYWRkU29ydHMgPSB0cnVlXG4gICAgKTogVGFibGVEZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbHVtblByZXBlbmQgPSBtb2RlbFR5cGUgPyBgJHttb2RlbFR5cGV9LmAgOiAnJztcblxuICAgICAgICAgICAgY29uc3QgaXNFbnVtID0gcHJvcGVydHkucHJvcGVydHlUeXBlID09PSBNbmdHdWlQcm9wZXJ0eVR5cGVEdG8uRW51bTtcbiAgICAgICAgICAgIGxldCBjb2x1bW46IENvbHVtbkRlc2NyaXB0b3I8c3RyaW5nLCBUPiB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGlzRW51bSkge1xuICAgICAgICAgICAgICAgIGlmICghcHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVudW1UeXBlID0gQXVkaXRVdGlsLmZpbmRFbnVtVHlwZShwcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgaWYgKGVudW1UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IGRlc2NyaXB0b3IuYWRkQ29sdW1uKGNvbHVtblByZXBlbmQgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSkuYXNFbnVtKGVudW1UeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi53aXRoRmlsdGVyTG9va3VwRW51bShwcm9wZXJ0eS5wb3NzaWJsZUVudW1WYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gZGVzY3JpcHRvci5hZGRDb2x1bW4oY29sdW1uUHJlcGVuZCArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIChjb2x1bW4/LndpdGhGaWx0ZXJMb29rdXAoKSBhcyBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yPHN0cmluZz4pLndpdGhMb29rdXAoKCkgPT4gb2YocHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzID8/IFtdKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gTW5nR3VpUHJvcGVydHlUeXBlRHRvLk51bWJlcikge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IGRlc2NyaXB0b3IuYWRkQ29sdW1uKGNvbHVtblByZXBlbmQgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSkuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBNbmdHdWlQcm9wZXJ0eVR5cGVEdG8uQm9vbGVhbikge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IGRlc2NyaXB0b3IuYWRkQ29sdW1uKGNvbHVtblByZXBlbmQgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSkuYXNCb29sZWFuKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gTW5nR3VpUHJvcGVydHlUeXBlRHRvLkxvY2FsRGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IGRlc2NyaXB0b3IuYWRkQ29sdW1uKGNvbHVtblByZXBlbmQgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSkuYXNEYXRlKCdkZC4gTU0geXl5eScpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IE1uZ0d1aVByb3BlcnR5VHlwZUR0by5PZmZzZXREYXRlVGltZSkge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IGRlc2NyaXB0b3IuYWRkQ29sdW1uKGNvbHVtblByZXBlbmQgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSkuYXNEYXRlKCdkZC4gTU0geXl5eSBISDptbScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBzdHJpbmcgLyB3aWxkY2FyZFxuICAgICAgICAgICAgICAgIGNvbHVtbiA9IGRlc2NyaXB0b3IuYWRkQ29sdW1uKGNvbHVtblByZXBlbmQgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSkud2l0aFRpdGxlKEF1ZGl0VXRpbC5nZXRQcm9wZXJ0eVRpdGxlS2V5KHByb3BlcnR5LCBtb2RlbFR5cGUpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29sdW1uLndpdGhUaXRsZShBdWRpdFV0aWwuZ2V0UHJvcGVydHlUaXRsZUtleShwcm9wZXJ0eSwgbW9kZWxUeXBlKSk7XG5cbiAgICAgICAgICAgIGlmICghaXNFbnVtICYmIGFkZEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4/LndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhZGRTb3J0cykge1xuICAgICAgICAgICAgICAgIGNvbHVtbj8ud2l0aFNvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFByb3BlcnR5VGl0bGVLZXkocHJvcGVydHk6IE1uZ0d1aVByb3BlcnR5TW9kZWxEdG8sIG1vZGVsVHlwZTogJ3JldkVudGl0eScgfCAnZW50aXR5U3RhdGUnIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChtb2RlbFR5cGUgPT09ICdyZXZFbnRpdHknKSB7XG4gICAgICAgICAgICByZXR1cm4gJ01uZ1JldkVudGl0eS5wcm9wZXJ0aWVzLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUgPz8gJyc7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhZGRGaWVsZHNGcm9tTW9kZWw8VD4oXG4gICAgICAgIGRlc2NyaXB0b3I6IEVkaXRvckRlc2NyaXB0b3I8VD4sXG4gICAgICAgIHByb3BlcnRpZXM6IE1uZ0d1aVByb3BlcnR5TW9kZWxEdG9bXSxcbiAgICAgICAgbW9kZWxUeXBlOiAncmV2RW50aXR5JyB8ICdlbnRpdHlTdGF0ZScgPSAncmV2RW50aXR5J1xuICAgICk6IEVkaXRvckRlc2NyaXB0b3I8VD4ge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICghcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmllbGRQcmVwZW5kID0gYCR7bW9kZWxUeXBlfS5gO1xuXG4gICAgICAgICAgICBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBNbmdHdWlQcm9wZXJ0eVR5cGVEdG8uRW51bSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudW1UeXBlID0gQXVkaXRVdGlsLmZpbmRFbnVtVHlwZShwcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgaWYgKGVudW1UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXBFbnVtKGZpZWxkUHJlcGVuZCArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lLCBlbnVtVHlwZSwgcHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzKS53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZEZpZWxkKGZpZWxkUHJlcGVuZCArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKS53aXRoTGFiZWwoQXVkaXRVdGlsLmdldFByb3BlcnR5VGl0bGVLZXkocHJvcGVydHksIG1vZGVsVHlwZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBNbmdHdWlQcm9wZXJ0eVR5cGVEdG8uTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGQoZmllbGRQcmVwZW5kICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwoQXVkaXRVdGlsLmdldFByb3BlcnR5VGl0bGVLZXkocHJvcGVydHksIG1vZGVsVHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIC5hc051bWJlcigpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBNbmdHdWlQcm9wZXJ0eVR5cGVEdG8uQm9vbGVhbikge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkKGZpZWxkUHJlcGVuZCArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKEF1ZGl0VXRpbC5nZXRQcm9wZXJ0eVRpdGxlS2V5KHByb3BlcnR5LCBtb2RlbFR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gTW5nR3VpUHJvcGVydHlUeXBlRHRvLkxvY2FsRGF0ZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkKGZpZWxkUHJlcGVuZCArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKEF1ZGl0VXRpbC5nZXRQcm9wZXJ0eVRpdGxlS2V5KHByb3BlcnR5LCBtb2RlbFR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAuYXNEYXRlUGlja2VyKCdkZC4gTU1NIHl5eXknKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gTW5nR3VpUHJvcGVydHlUeXBlRHRvLk9mZnNldERhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGQoZmllbGRQcmVwZW5kICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwoQXVkaXRVdGlsLmdldFByb3BlcnR5VGl0bGVLZXkocHJvcGVydHksIG1vZGVsVHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGVQaWNrZXIoJ2RkLiBNTSB5eScsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhEaXNhYmxlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBzdHJpbmcgLyB3aWxkY2FyZFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkKGZpZWxkUHJlcGVuZCArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKEF1ZGl0VXRpbC5nZXRQcm9wZXJ0eVRpdGxlS2V5KHByb3BlcnR5LCBtb2RlbFR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBidWlsZERlc2NyaXB0b3JGb3JFbnRpdHlSZXZpc2lvbihcbiAgICAgICAgZGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvcjxNbmdSZXZFbnRpdHlXaXRoU3RhdGVEdG8+LFxuICAgICAgICByZXZNb2RlbDogTW5nR3VpRW50aXR5TW9kZWxEdG8sXG4gICAgICAgIGVudGl0eU1vZGVsOiBNbmdHdWlFbnRpdHlNb2RlbER0b1xuICAgICk6IFRhYmxldmlld0Rlc2NyaXB0b3I8TW5nUmV2RW50aXR5V2l0aFN0YXRlRHRvPiB7XG4gICAgICAgIGRlc2NyaXB0b3IuYWRkQ29sdW1uKCdyZXZUeXBlJykud2l0aFRpdGxlKCdNbmdFbnRpdHlSZXZpc2lvbkNoYW5nZVN0YXRlLnByb3BlcnRpZXMucmV2VHlwZScpLmFzRW51bShNbmdSZXZpc2lvblR5cGVEdG8pLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cEVudW0oJ3JldlR5cGUnLCBNbmdSZXZpc2lvblR5cGVEdG8pLndpdGhMYWJlbCgnTW5nRW50aXR5UmV2aXNpb25DaGFuZ2VTdGF0ZS5wcm9wZXJ0aWVzLnJldlR5cGUnKTtcblxuICAgICAgICBpZiAocmV2TW9kZWwucHJvcGVydGllcykge1xuICAgICAgICAgICAgQXVkaXRVdGlsLmFkZENvbHVtbnNGcm9tTW9kZWwoZGVzY3JpcHRvci50YWJsZSwgcmV2TW9kZWwucHJvcGVydGllcywgJ3JldkVudGl0eScpO1xuICAgICAgICAgICAgQXVkaXRVdGlsLmFkZEZpZWxkc0Zyb21Nb2RlbChkZXNjcmlwdG9yLmRldGFpbHNFZGl0b3IsIHJldk1vZGVsLnByb3BlcnRpZXMsICdyZXZFbnRpdHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50aXR5TW9kZWwucHJvcGVydGllcykge1xuICAgICAgICAgICAgQXVkaXRVdGlsLmFkZENvbHVtbnNGcm9tTW9kZWwoZGVzY3JpcHRvci50YWJsZSwgZW50aXR5TW9kZWwucHJvcGVydGllcywgJ2VudGl0eVN0YXRlJyk7XG4gICAgICAgICAgICBBdWRpdFV0aWwuYWRkRmllbGRzRnJvbU1vZGVsKGRlc2NyaXB0b3IuZGV0YWlsc0VkaXRvciwgZW50aXR5TW9kZWwucHJvcGVydGllcywgJ2VudGl0eVN0YXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmaW5kRW51bVR5cGUocHJvcGVydHk6IE1uZ0d1aVByb3BlcnR5TW9kZWxEdG8pIHtcbiAgICAgICAgaWYgKCFwcm9wZXJ0eS5lbnVtQ2xhc3NTaW1wbGVOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVudW1UeXBlID0gT2JqZWN0U2VyaWFsaXplci5nZXQoKS5maW5kRW51bShwcm9wZXJ0eS5lbnVtQ2xhc3NTaW1wbGVOYW1lKTtcbiAgICAgICAgaWYgKCFlbnVtVHlwZSkge1xuICAgICAgICAgICAgZW51bVR5cGUgPSBPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRFbnVtKHByb3BlcnR5LmVudW1DbGFzc1NpbXBsZU5hbWUgKyAnRHRvJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1UeXBlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGV4dHJhY3RQcm9wZXJ0eU5hbWUoZnVsbFByb3BlcnR5TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGZ1bGxQcm9wZXJ0eU5hbWU/LmluY2x1ZGVzKCdlbnRpdHlTdGF0ZS4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bGxQcm9wZXJ0eU5hbWUucmVwbGFjZSgnZW50aXR5U3RhdGUuJywgJycpO1xuICAgICAgICB9IGVsc2UgaWYgKGZ1bGxQcm9wZXJ0eU5hbWU/LmluY2x1ZGVzKCdyZXZFbnRpdHkuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmdWxsUHJvcGVydHlOYW1lPy5yZXBsYWNlKCdyZXZFbnRpdHkuJywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdWxsUHJvcGVydHlOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXBwZW5kTWVkaXVzUXVlcnlQYXJhbXNUb1VybChxdWVyeVBhcmFtczogTWVkaXVzUXVlcnlQYXJhbSk6IHN0cmluZyB7XG4gICAgICAgIGxldCB1cmwgPSBgP2ZpcnN0UmVzdWx0PSR7cXVlcnlQYXJhbXMuaXRlbXNPZmZzZXR9Jm1heFJlc3VsdHM9JHtxdWVyeVBhcmFtcy5pdGVtc1BlclBhZ2V9YDtcbiAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLnNvcnRQcm9wZXJ0eSAmJiBxdWVyeVBhcmFtcy5zb3J0UHJvcGVydHkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdXJsICs9ICcmc29ydHM9JztcbiAgICAgICAgICAgIGNvbnN0IHNvcnRpbmdRUHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVlcnlQYXJhbXMuc29ydFByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc29ydGluZ1FQcy5wdXNoKGAke3F1ZXJ5UGFyYW1zLnNvcnRBc2M/LltpXSA/PyB0cnVlID8gJ2FzYycgOiAnZGVzYyd9OiR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKHF1ZXJ5UGFyYW1zLnNvcnRQcm9wZXJ0eVtpXSl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cmwgKz0gc29ydGluZ1FQcy5qb2luKCcsJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLmZpbHRlclBhcmFtcyAmJiBxdWVyeVBhcmFtcy5maWx0ZXJQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyUVBzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1mcCBvZiBxdWVyeVBhcmFtcy5maWx0ZXJQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1mcC5maWx0ZXJNYXRjaFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXF1YWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXF1YWxzfToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEVxdWFsczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEVxdWFsc306JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5Gcm9tVG86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclFQcy5wdXNoKGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5CZXR3ZWVufToke21mcC5maWx0ZXJWYWx1ZX0sJHttZnAuZmlsdGVyVmFsdWVUb31gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkNvbnRhaW5zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuQ29udGFpbnN9OiR7bWZwLmZpbHRlclZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuU3RhcnRzV2l0aDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLlN0YXJ0c1dpdGh9OiR7bWZwLmZpbHRlclZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRW5kc1dpdGg6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclFQcy5wdXNoKGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5FbmRzV2l0aH06JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5Jbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLklufToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEluOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuTm90SW59OiR7bWZwLmZpbHRlclZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuU21hbGxlclRoYW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclFQcy5wdXNoKGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5MZXNzVGhhbn06JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5HcmVhdGVyVGhhbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkdyZWF0ZXJUaGFufToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJsICs9ICcmJztcbiAgICAgICAgICAgIHVybCArPSBmaWx0ZXJRUHMuam9pbignJicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxufVxuIl19