@sapui5/sap.fe.controls 1.141.2 → 1.143.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/controls/.library +1 -1
  3. package/src/sap/fe/controls/easyFilter/EasyFilterBarContainer.js +3 -2
  4. package/src/sap/fe/controls/easyFilter/EasyFilterBarContainer.tsx +2 -2
  5. package/src/sap/fe/controls/easyFilter/EasyFilterInput.js +19 -12
  6. package/src/sap/fe/controls/easyFilter/EasyFilterInput.tsx +21 -13
  7. package/src/sap/fe/controls/easyFilter/ShellHistoryProvider.js +7 -5
  8. package/src/sap/fe/controls/easyFilter/ShellHistoryProvider.tsx +6 -4
  9. package/src/sap/fe/controls/easyFilter/Token.js +5 -2
  10. package/src/sap/fe/controls/easyFilter/Token.tsx +5 -1
  11. package/src/sap/fe/controls/easyFilter/innerControls/CalendarFactory.js +4 -4
  12. package/src/sap/fe/controls/easyFilter/innerControls/CalendarFactory.ts +2 -3
  13. package/src/sap/fe/controls/easyFilter/utils.js +159 -89
  14. package/src/sap/fe/controls/easyFilter/utils.ts +196 -90
  15. package/src/sap/fe/controls/library.js +1 -1
  16. package/src/sap/fe/controls/messagebundle.properties +4 -4
  17. package/src/sap/fe/controls/messagebundle_ar.properties +10 -4
  18. package/src/sap/fe/controls/messagebundle_bg.properties +10 -4
  19. package/src/sap/fe/controls/messagebundle_ca.properties +10 -4
  20. package/src/sap/fe/controls/messagebundle_cnr.properties +10 -4
  21. package/src/sap/fe/controls/messagebundle_cs.properties +10 -4
  22. package/src/sap/fe/controls/messagebundle_cy.properties +10 -4
  23. package/src/sap/fe/controls/messagebundle_da.properties +10 -4
  24. package/src/sap/fe/controls/messagebundle_de.properties +10 -4
  25. package/src/sap/fe/controls/messagebundle_el.properties +10 -4
  26. package/src/sap/fe/controls/messagebundle_en.properties +10 -4
  27. package/src/sap/fe/controls/messagebundle_en_GB.properties +10 -4
  28. package/src/sap/fe/controls/messagebundle_en_US_saprigi.properties +10 -4
  29. package/src/sap/fe/controls/messagebundle_es.properties +10 -4
  30. package/src/sap/fe/controls/messagebundle_es_MX.properties +10 -4
  31. package/src/sap/fe/controls/messagebundle_et.properties +10 -4
  32. package/src/sap/fe/controls/messagebundle_fi.properties +10 -4
  33. package/src/sap/fe/controls/messagebundle_fr.properties +10 -4
  34. package/src/sap/fe/controls/messagebundle_fr_CA.properties +10 -4
  35. package/src/sap/fe/controls/messagebundle_hi.properties +10 -4
  36. package/src/sap/fe/controls/messagebundle_hr.properties +10 -4
  37. package/src/sap/fe/controls/messagebundle_hu.properties +10 -4
  38. package/src/sap/fe/controls/messagebundle_id.properties +10 -4
  39. package/src/sap/fe/controls/messagebundle_it.properties +10 -4
  40. package/src/sap/fe/controls/messagebundle_iw.properties +10 -4
  41. package/src/sap/fe/controls/messagebundle_ja.properties +10 -4
  42. package/src/sap/fe/controls/messagebundle_kk.properties +10 -4
  43. package/src/sap/fe/controls/messagebundle_ko.properties +9 -3
  44. package/src/sap/fe/controls/messagebundle_lt.properties +10 -4
  45. package/src/sap/fe/controls/messagebundle_lv.properties +10 -4
  46. package/src/sap/fe/controls/messagebundle_mk.properties +10 -4
  47. package/src/sap/fe/controls/messagebundle_ms.properties +10 -4
  48. package/src/sap/fe/controls/messagebundle_nl.properties +10 -4
  49. package/src/sap/fe/controls/messagebundle_no.properties +10 -4
  50. package/src/sap/fe/controls/messagebundle_pl.properties +10 -4
  51. package/src/sap/fe/controls/messagebundle_pt.properties +10 -4
  52. package/src/sap/fe/controls/messagebundle_pt_PT.properties +10 -4
  53. package/src/sap/fe/controls/messagebundle_ro.properties +10 -4
  54. package/src/sap/fe/controls/messagebundle_ru.properties +10 -4
  55. package/src/sap/fe/controls/messagebundle_sh.properties +10 -4
  56. package/src/sap/fe/controls/messagebundle_sk.properties +10 -4
  57. package/src/sap/fe/controls/messagebundle_sl.properties +11 -5
  58. package/src/sap/fe/controls/messagebundle_sr.properties +10 -4
  59. package/src/sap/fe/controls/messagebundle_sv.properties +10 -4
  60. package/src/sap/fe/controls/messagebundle_th.properties +10 -4
  61. package/src/sap/fe/controls/messagebundle_tr.properties +10 -4
  62. package/src/sap/fe/controls/messagebundle_uk.properties +10 -4
  63. package/src/sap/fe/controls/messagebundle_vi.properties +10 -4
  64. package/src/sap/fe/controls/messagebundle_zh_CN.properties +10 -4
  65. package/src/sap/fe/controls/messagebundle_zh_TW.properties +10 -4
@@ -11,9 +11,25 @@ sap.ui.define(["sap/base/util/deepEqual", "sap/ui/core/Lib", "sap/ui/core/format
11
11
  if (arr1.length !== arr2.length) {
12
12
  return false;
13
13
  }
14
+
14
15
  // Compare elements of both arrays
15
16
  for (let i = 0; i < arr1.length; i++) {
16
- if (arr1[i].operator !== arr2[i].operator || !arr1[i].selectedValues.every((value, index) => value === arr2[i].selectedValues[index] || typeof value === "object" && deepEqual(value.value, arr2[i].selectedValues[index].value) && value.description === arr2[i].selectedValues[index].description)) {
17
+ if (arr1[i].operator !== arr2[i].operator || !arr1[i].selectedValues.every((firstValue, index) => {
18
+ const otherValue = arr2[i].selectedValues[index];
19
+
20
+ // Handle Date objects
21
+ if (firstValue instanceof Date || otherValue instanceof Date) {
22
+ return deepEqual(firstValue, otherValue);
23
+ }
24
+
25
+ // Handle objects with deep equality
26
+ if (typeof firstValue === "object" && typeof otherValue === "object") {
27
+ return deepEqual(firstValue.value, otherValue.value) && firstValue.description === otherValue.description;
28
+ }
29
+
30
+ // Fallback to direct comparison
31
+ return firstValue === otherValue;
32
+ })) {
17
33
  return false;
18
34
  }
19
35
  }
@@ -150,100 +166,154 @@ sap.ui.define(["sap/base/util/deepEqual", "sap/ui/core/Lib", "sap/ui/core/format
150
166
  return value ? resourceBundle.getText("M_EASY_FILTER_SELECTED_VALUES_TRUE") : resourceBundle.getText("M_EASY_FILTER_SELECTED_VALUES_FALSE");
151
167
  }
152
168
 
153
- //This function returns true if the filter is not a valid "SingleRange" (e.g., wrong operator or too many values), and false if it is valid.
169
+ /**
170
+ * Handles the single range validation and updates for a filter value.
171
+ * @param filterCriteria The metadata for the filter
172
+ * @param filterValue The filter value to validate
173
+ * @param singleRangeTokenLabels Array to collect labels of invalid single range filters
174
+ * @param singleRangeUsage Record to track usage count of single range filters
175
+ * @returns True if processing should continue, false if it should skip and make the existing token as empty
176
+ */
177
+ function handleSingleRangeFilter(filterCriteria, filterValue, singleRangeTokenLabels, singleRangeUsage) {
178
+ if (filterCriteria?.filterRestriction !== "SingleRange") {
179
+ return true;
180
+ }
181
+ const isInvalid = isInvalidSingleRange(filterValue) || (singleRangeUsage[filterValue.name] ?? 0) > 0;
182
+ singleRangeUsage[filterValue.name] = (singleRangeUsage[filterValue.name] ?? 0) + 1;
183
+ if (!isInvalid) {
184
+ return true;
185
+ }
186
+ const label = filterCriteria.label || filterCriteria.name;
187
+ if (!singleRangeTokenLabels.includes(label)) {
188
+ singleRangeTokenLabels.push(label);
189
+ }
190
+ filterValue.values = [];
191
+ return false;
192
+ }
193
+
194
+ // Validates if a filter value violates the SingleRange restriction.
195
+ // Returns true if invalid, false if valid.
196
+ // Rules for SingleRange:
197
+ // - Allowed operators: EQ, LE, LT, GE, GT, BT, NB
198
+ // - Single-value operators (EQ, LE, LT, GE, GT): must have exactly 1 value
199
+ // - Range operators (BT, NB): must have exactly 2 values (lower & upper bound)
200
+ // - Only one condition/token is allowed per property (should be enforced outside)
201
+ //
154
202
  function isInvalidSingleRange(filterValue) {
155
- const allowed = [FilterOperator.EQ, FilterOperator.LE, FilterOperator.LT, FilterOperator.GE, FilterOperator.GT, FilterOperator.BT];
203
+ const singleValueOps = [FilterOperator.EQ, FilterOperator.LE, FilterOperator.LT, FilterOperator.GE, FilterOperator.GT];
204
+ const rangeOps = [FilterOperator.BT, FilterOperator.NB];
205
+ const op = filterValue.operator;
206
+ const valCount = filterValue.values?.length || 0;
207
+
208
+ // Single-value operators → must have exactly 1 value
209
+ if (singleValueOps.includes(op)) {
210
+ return valCount !== 1;
211
+ }
212
+
213
+ // Range operators (Between / Not Between) → must have exactly 2 values
214
+ if (rangeOps.includes(op)) {
215
+ return valCount !== 2;
216
+ }
156
217
 
157
- // filterValue.operator !== FilterOperator.BT ensures BT is always valid.
158
- // !allowed.includes() blocks unsupported operators.
159
- // filterValue.values.length >= 2 blocks multiple values for single-range filters.
160
- // Together, this returns true when the filter is not a valid single-range.
161
- return filterValue.operator !== FilterOperator.BT && (!allowed.includes(filterValue.operator) || filterValue.values.length >= 2);
218
+ // Anything else is not allowed for SingleRange
219
+ return true;
162
220
  }
163
221
  function formatData(tokens, filterValues, filterBarMetadata, setMessageStripForValidatedFilters) {
164
- if (filterValues) {
165
- const visitedMapForMandatoryTokens = {};
166
- const nonFilterableTokenLabels = [];
167
- const singleRangeTokenLabels = [];
168
- const hiddenFilterTokenLabels = [];
169
- for (const filterValue of filterValues) {
170
- const filterCriteria = filterBarMetadata.find(field => field.name === filterValue.name);
171
- if (filterCriteria) {
172
- // Only block if filterable is false
173
- if (Object.prototype.hasOwnProperty.call(filterCriteria, "filterable") && !filterCriteria?.filterable) {
174
- nonFilterableTokenLabels.push(filterCriteria.label || filterCriteria.name);
175
- continue;
176
- }
177
- // Only block if hiddenFilter is true
178
- if (Object.prototype.hasOwnProperty.call(filterCriteria, "hiddenFilter") && filterCriteria?.hiddenFilter) {
179
- hiddenFilterTokenLabels.push(filterCriteria.label || filterCriteria.name);
180
- continue;
181
- }
182
- // Only apply SingleRange logic if filterRestriction is set to SingleRange
183
- if (filterCriteria?.filterRestriction === "SingleRange" && isInvalidSingleRange(filterValue)) {
184
- singleRangeTokenLabels.push(filterCriteria.label || filterCriteria.name);
185
- filterValue.values = []; // Reset values to avoid adding invalid token values
186
- }
187
- const {
188
- type
189
- } = filterCriteria;
190
- const tokenIndex = tokens.findIndex(token => token.key === filterValue.name);
191
- const {
192
- operator,
193
- values
194
- } = filterValue;
195
- let keySpecificSelectedValues;
196
- if (EasyFilterUtils.isBetweenSelectedValues(operator)) {
197
- keySpecificSelectedValues = {
198
- operator,
199
- selectedValues: values
200
- };
201
- } else {
202
- keySpecificSelectedValues = {
203
- operator: operator,
204
- selectedValues: values
205
- };
206
- }
207
- if (tokenIndex === -1) {
208
- // Add new token if it doesn't exist
209
- const newToken = {
210
- key: filterValue.name,
211
- label: filterCriteria.label,
212
- keySpecificSelectedValues: [keySpecificSelectedValues],
213
- type: type,
214
- busy: type === "ValueHelp" ? true : false
215
- };
216
- tokens.push(newToken);
217
- } else {
218
- // Update existing token
219
- const currentToken = tokens[tokenIndex];
220
- //If its default value , override it
221
- if ((currentToken.isRequired ?? false) && !visitedMapForMandatoryTokens[currentToken.key]) {
222
- currentToken.keySpecificSelectedValues = [keySpecificSelectedValues];
223
- visitedMapForMandatoryTokens[currentToken.key] = true;
224
- } else {
225
- currentToken.keySpecificSelectedValues.push(keySpecificSelectedValues);
226
- }
227
- }
228
- }
222
+ if (!filterValues) {
223
+ return;
224
+ }
225
+ const visitedMapForMandatoryTokens = {};
226
+ const nonFilterableTokenLabels = [];
227
+ const singleRangeTokenLabels = [];
228
+ const hiddenFilterTokenLabels = [];
229
+ const singleRangeUsage = {};
230
+ for (const filterValue of filterValues) {
231
+ const filterCriteria = filterBarMetadata.find(field => field.name === filterValue.name);
232
+ if (!filterCriteria) {
233
+ continue;
229
234
  }
230
- if (nonFilterableTokenLabels.length > 0 || singleRangeTokenLabels.length > 0 || hiddenFilterTokenLabels.length > 0) {
231
- const messages = [];
232
- if (nonFilterableTokenLabels.length > 0) {
233
- const nonFilterableTokenLabel = `<strong>${nonFilterableTokenLabels.join(", ")}</strong>`;
234
- messages.push(resourceBundle.getText("M_EASY_FILTER_NON_FILTERABLE", [nonFilterableTokenLabel]));
235
- }
236
- if (hiddenFilterTokenLabels.length > 0) {
237
- const label = `<strong>${hiddenFilterTokenLabels.join(", ")}</strong>`;
238
- messages.push(resourceBundle.getText("M_EASY_FILTER_HIDDEN_FILTER", [label]));
239
- }
240
- if (singleRangeTokenLabels.length > 0) {
241
- const label = `<strong>${singleRangeTokenLabels.join(", ")}</strong>`;
242
- messages.push(resourceBundle.getText("M_EASY_FILTER_SINGLE_RANGE", [label]));
243
- }
244
- setMessageStripForValidatedFilters(messages.join("<br>"));
235
+
236
+ // Handle non-filterable and hidden filters
237
+ if (!processFilterCriteria(filterCriteria, nonFilterableTokenLabels, hiddenFilterTokenLabels)) {
238
+ continue;
245
239
  }
240
+
241
+ // Validate single range filters
242
+ const isInvalidSingleRangeToken = !handleSingleRangeFilter(filterCriteria, filterValue, singleRangeTokenLabels, singleRangeUsage);
243
+
244
+ // Update tokens
245
+ updateTokens(tokens, filterValue, filterCriteria, visitedMapForMandatoryTokens, isInvalidSingleRangeToken);
246
+ }
247
+
248
+ // Handle validation messages
249
+ if (nonFilterableTokenLabels.length > 0 || singleRangeTokenLabels.length > 0 || hiddenFilterTokenLabels.length > 0) {
250
+ setMessageStripForValidatedFilters(generateValidationMessages(nonFilterableTokenLabels, singleRangeTokenLabels, hiddenFilterTokenLabels));
251
+ }
252
+ }
253
+ function processFilterCriteria(filterCriteria, nonFilterableTokenLabels, hiddenFilterTokenLabels) {
254
+ if (filterCriteria.filterable === false) {
255
+ nonFilterableTokenLabels.push(filterCriteria.label || filterCriteria.name);
256
+ return false;
257
+ }
258
+ if (filterCriteria.hiddenFilter === true) {
259
+ hiddenFilterTokenLabels.push(filterCriteria.label || filterCriteria.name);
260
+ return false;
261
+ }
262
+ return true;
263
+ }
264
+ function updateTokens(tokens, filterValue, filterCriteria, visitedMapForMandatoryTokens, isInvalidSingleRangeToken) {
265
+ const tokenIndex = tokens.findIndex(token => token.key === filterValue.name);
266
+ const keySpecificSelectedValues = createKeySpecificSelectedValues(filterValue);
267
+ if (tokenIndex === -1) {
268
+ // Add new token
269
+ tokens.push({
270
+ key: filterValue.name,
271
+ label: filterCriteria.label,
272
+ keySpecificSelectedValues: isInvalidSingleRangeToken ? [] : [keySpecificSelectedValues],
273
+ type: filterCriteria.type,
274
+ busy: filterCriteria.type === "ValueHelp"
275
+ });
276
+ } else {
277
+ // Update existing token
278
+ const currentToken = tokens[tokenIndex];
279
+ if (isInvalidSingleRangeToken) {
280
+ currentToken.keySpecificSelectedValues = [];
281
+ } else if ((currentToken.isRequired ?? false) && !visitedMapForMandatoryTokens[currentToken.key]) {
282
+ currentToken.keySpecificSelectedValues = [keySpecificSelectedValues];
283
+ visitedMapForMandatoryTokens[currentToken.key] = true;
284
+ } else {
285
+ currentToken.keySpecificSelectedValues.push(keySpecificSelectedValues);
286
+ }
287
+ }
288
+ }
289
+ function createKeySpecificSelectedValues(filterValue) {
290
+ const {
291
+ operator,
292
+ values
293
+ } = filterValue;
294
+ if (EasyFilterUtils.isBetweenSelectedValues(operator)) {
295
+ return {
296
+ operator,
297
+ selectedValues: values
298
+ };
299
+ }
300
+ return {
301
+ operator: operator,
302
+ selectedValues: values
303
+ };
304
+ }
305
+ function generateValidationMessages(nonFilterableTokenLabels, singleRangeTokenLabels, hiddenFilterTokenLabels) {
306
+ const messages = [];
307
+ if (nonFilterableTokenLabels.length > 0) {
308
+ messages.push(resourceBundle.getText("M_EASY_FILTER_NON_FILTERABLE", [`<strong>${nonFilterableTokenLabels.join(", ")}</strong>`]));
309
+ }
310
+ if (hiddenFilterTokenLabels.length > 0) {
311
+ messages.push(resourceBundle.getText("M_EASY_FILTER_HIDDEN_FILTER", [`<strong>${hiddenFilterTokenLabels.join(", ")}</strong>`]));
312
+ }
313
+ if (singleRangeTokenLabels.length > 0) {
314
+ messages.push(resourceBundle.getText("M_EASY_FILTER_SINGLE_RANGE", [`<strong>${singleRangeTokenLabels.join(", ")}</strong>`]));
246
315
  }
316
+ return messages.join("<br>");
247
317
  }
248
318
  const EasyFilterUtils = {
249
319
  areItemsSame,
@@ -258,4 +328,4 @@ sap.ui.define(["sap/base/util/deepEqual", "sap/ui/core/Lib", "sap/ui/core/format
258
328
  };
259
329
  return EasyFilterUtils;
260
330
  }, false);
261
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXNvdXJjZUJ1bmRsZSIsIkxpYiIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiZGF0ZVRpbWVPZmZzZXQiLCJEYXRlVGltZU9mZnNldCIsImFyZUl0ZW1zU2FtZSIsImFycjEiLCJhcnIyIiwibGVuZ3RoIiwiaSIsIm9wZXJhdG9yIiwic2VsZWN0ZWRWYWx1ZXMiLCJldmVyeSIsInZhbHVlIiwiaW5kZXgiLCJkZWVwRXF1YWwiLCJkZXNjcmlwdGlvbiIsImFyZUFycmF5U2FtZSIsImFyZUNvZGVMaXN0c1NhbWUiLCJhcnJOZXcxIiwiZ2V0Q29kZUxpc3RBcnJheSIsImFyck5ldzIiLCJkZXNjcmlwdGlvbk5ldzEiLCJtYXAiLCJkYXRhIiwiZGVzY3JpcHRpb25OZXcyIiwidmFsdWUxIiwidmFsdWUyIiwiYXJyIiwiY29udmVydERhdGVUb1N0cmluZyIsInRva2VuVHlwZSIsImlzRGF0ZVRpbWVPZmZzZXQiLCJmb3JtYXR0ZWREYXRlVGltZSIsImZvcm1hdFZhbHVlIiwiRGF0ZUZvcm1hdCIsImdldERhdGVJbnN0YW5jZSIsImZvcm1hdCIsImdldFRpbWVJbnN0YW5jZSIsIm1hcE9wZXJhdG9yIiwibmV3VmFsdWUiLCJjb252ZXJ0Qm9vbFRvU3RyaW5nIiwiRGF0ZSIsIkZpbHRlck9wZXJhdG9yIiwiR1QiLCJMVCIsIkdFIiwiTEUiLCJFUSIsIkNvbnRhaW5zIiwiRW5kc1dpdGgiLCJTdGFydHNXaXRoIiwiTkUiLCJOb3RDb250YWlucyIsIk5vdEVuZHNXaXRoIiwiTm90U3RhcnRzV2l0aCIsInRvU3RyaW5nIiwibWFwT3BlcmF0b3JGb3JWYWx1ZUhlbHAiLCJtYXBPcGVyYXRvckZvckJldHdlZW5PcGVyYXRvciIsInZhbHVlcyIsIm5ld1ZhbHVlMSIsIm5ld1ZhbHVlMiIsIkJUIiwiaXNCZXR3ZWVuU2VsZWN0ZWRWYWx1ZXMiLCJOQiIsImdldFRleHQiLCJpc0ludmFsaWRTaW5nbGVSYW5nZSIsImZpbHRlclZhbHVlIiwiYWxsb3dlZCIsImluY2x1ZGVzIiwiZm9ybWF0RGF0YSIsInRva2VucyIsImZpbHRlclZhbHVlcyIsImZpbHRlckJhck1ldGFkYXRhIiwic2V0TWVzc2FnZVN0cmlwRm9yVmFsaWRhdGVkRmlsdGVycyIsInZpc2l0ZWRNYXBGb3JNYW5kYXRvcnlUb2tlbnMiLCJub25GaWx0ZXJhYmxlVG9rZW5MYWJlbHMiLCJzaW5nbGVSYW5nZVRva2VuTGFiZWxzIiwiaGlkZGVuRmlsdGVyVG9rZW5MYWJlbHMiLCJmaWx0ZXJDcml0ZXJpYSIsImZpbmQiLCJmaWVsZCIsIm5hbWUiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJmaWx0ZXJhYmxlIiwicHVzaCIsImxhYmVsIiwiaGlkZGVuRmlsdGVyIiwiZmlsdGVyUmVzdHJpY3Rpb24iLCJ0eXBlIiwidG9rZW5JbmRleCIsImZpbmRJbmRleCIsInRva2VuIiwia2V5Iiwia2V5U3BlY2lmaWNTZWxlY3RlZFZhbHVlcyIsIkVhc3lGaWx0ZXJVdGlscyIsIm5ld1Rva2VuIiwiYnVzeSIsImN1cnJlbnRUb2tlbiIsImlzUmVxdWlyZWQiLCJtZXNzYWdlcyIsIm5vbkZpbHRlcmFibGVUb2tlbkxhYmVsIiwiam9pbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsidXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcmltaXRpdmVUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL0VkbVwiO1xuaW1wb3J0IGRlZXBFcXVhbCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwRXF1YWxcIjtcbmltcG9ydCBMaWIgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IERhdGVGb3JtYXQgZnJvbSBcInNhcC91aS9jb3JlL2Zvcm1hdC9EYXRlRm9ybWF0XCI7XG5pbXBvcnQgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IERhdGVUaW1lT2Zmc2V0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdHlwZS9EYXRlVGltZU9mZnNldFwiO1xuaW1wb3J0IHR5cGUgeyBFYXN5RmlsdGVyUmVzdWx0LCBQcm9wZXJ0eU1ldGFkYXRhIH0gZnJvbSBcInV4L2VuZy9maW9yaWFpL3JldXNlL2Vhc3lmaWx0ZXIvRWFzeUZpbHRlclwiO1xuaW1wb3J0IHR5cGUge1xuXHRCZXR3ZWVuU2VsZWN0ZWRWYWx1ZXMsXG5cdENvZGVMaXN0VHlwZSxcblx0RWFzeUZpbHRlclByb3BlcnR5TWV0YWRhdGEsXG5cdFRva2VuRGVmaW5pdGlvbixcblx0VG9rZW5TZWxlY3RlZFZhbHVlc0RlZmluaXRpb24sXG5cdFRva2VuVHlwZSxcblx0VmFsdWVIZWxwQmV0d2VlblNlbGVjdGVkVmFsdWVzLFxuXHRWYWx1ZUhlbHBTZWxlY3RlZFZhbHVlc0RlZmluaXRpb25cbn0gZnJvbSBcIi4vRWFzeUZpbHRlckJhckNvbnRhaW5lclwiO1xuXG50eXBlIGNvZGVMaXN0VHlwZSA9IFByb3BlcnR5TWV0YWRhdGFbXCJjb2RlTGlzdFwiXTtcbnR5cGUgZmluYWxDb2RlTGlzdFR5cGUgPSB7IHZhbHVlOiBQcmltaXRpdmVUeXBlOyBkZXNjcmlwdGlvbj86IHN0cmluZyB9W107XG5jb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYi5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb250cm9sc1wiKSE7XG5jb25zdCBkYXRlVGltZU9mZnNldCA9IG5ldyBEYXRlVGltZU9mZnNldCgpO1xuXG5mdW5jdGlvbiBhcmVJdGVtc1NhbWUoXG5cdGFycjE6IHJlYWRvbmx5IFRva2VuU2VsZWN0ZWRWYWx1ZXNEZWZpbml0aW9uW10gfCBWYWx1ZUhlbHBTZWxlY3RlZFZhbHVlc0RlZmluaXRpb25bXSxcblx0YXJyMjogcmVhZG9ubHkgVG9rZW5TZWxlY3RlZFZhbHVlc0RlZmluaXRpb25bXSB8IFZhbHVlSGVscFNlbGVjdGVkVmFsdWVzRGVmaW5pdGlvbltdXG4pOiBib29sZWFuIHtcblx0aWYgKGFycjEubGVuZ3RoICE9PSBhcnIyLmxlbmd0aCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHQvLyBDb21wYXJlIGVsZW1lbnRzIG9mIGJvdGggYXJyYXlzXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgYXJyMS5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChcblx0XHRcdGFycjFbaV0ub3BlcmF0b3IgIT09IGFycjJbaV0ub3BlcmF0b3IgfHxcblx0XHRcdCFhcnIxW2ldLnNlbGVjdGVkVmFsdWVzLmV2ZXJ5KFxuXHRcdFx0XHQodmFsdWUsIGluZGV4KSA9PlxuXHRcdFx0XHRcdHZhbHVlID09PSBhcnIyW2ldLnNlbGVjdGVkVmFsdWVzW2luZGV4XSB8fFxuXHRcdFx0XHRcdCh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcblx0XHRcdFx0XHRcdGRlZXBFcXVhbCgodmFsdWUgYXMgQ29kZUxpc3RUeXBlKS52YWx1ZSwgKGFycjJbaV0uc2VsZWN0ZWRWYWx1ZXNbaW5kZXhdIGFzIENvZGVMaXN0VHlwZSkudmFsdWUpICYmXG5cdFx0XHRcdFx0XHQodmFsdWUgYXMgQ29kZUxpc3RUeXBlKS5kZXNjcmlwdGlvbiA9PT0gKGFycjJbaV0uc2VsZWN0ZWRWYWx1ZXNbaW5kZXhdIGFzIENvZGVMaXN0VHlwZSkuZGVzY3JpcHRpb24pXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0cnVlOyAvLyBBcnJheXMgYXJlIHRoZSBzYW1lXG59XG5cbmZ1bmN0aW9uIGFyZUFycmF5U2FtZShhcnIxOiByZWFkb25seSB1bmtub3duW10sIGFycjI6IHJlYWRvbmx5IHVua25vd25bXSk6IGJvb2xlYW4ge1xuXHRpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdC8vIENvbXBhcmUgZWxlbWVudHMgb2YgYm90aCBhcnJheXNcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcnIxLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKGFycjFbaV0gIT09IGFycjJbaV0pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRydWU7IC8vIEFycmF5cyBhcmUgdGhlIHNhbWVcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXJlQ29kZUxpc3RzU2FtZShhcnIxOiBjb2RlTGlzdFR5cGUsIGFycjI6IGNvZGVMaXN0VHlwZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRjb25zdCBhcnJOZXcxOiBmaW5hbENvZGVMaXN0VHlwZSB8IHVuZGVmaW5lZCA9IGF3YWl0IGdldENvZGVMaXN0QXJyYXkoYXJyMSk7XG5cdGNvbnN0IGFyck5ldzI6IGZpbmFsQ29kZUxpc3RUeXBlIHwgdW5kZWZpbmVkID0gYXdhaXQgZ2V0Q29kZUxpc3RBcnJheShhcnIyKTtcblx0Y29uc3QgZGVzY3JpcHRpb25OZXcxID0gYXJyTmV3MT8ubWFwKChkYXRhKSA9PiBkYXRhLmRlc2NyaXB0aW9uKTtcblx0Y29uc3QgZGVzY3JpcHRpb25OZXcyID0gYXJyTmV3Mj8ubWFwKChkYXRhKSA9PiBkYXRhLmRlc2NyaXB0aW9uKTtcblxuXHRjb25zdCB2YWx1ZTEgPSBhcnJOZXcxPy5tYXAoKGRhdGEpID0+IGRhdGEudmFsdWUpO1xuXHRjb25zdCB2YWx1ZTIgPSBhcnJOZXcyPy5tYXAoKGRhdGEpID0+IGRhdGEudmFsdWUpO1xuXHRpZiAoIWRlc2NyaXB0aW9uTmV3MSB8fCAhZGVzY3JpcHRpb25OZXcyKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHJldHVybiBhcmVBcnJheVNhbWUoZGVzY3JpcHRpb25OZXcxLCBkZXNjcmlwdGlvbk5ldzIpICYmIGFyZUFycmF5U2FtZSh2YWx1ZTEgYXMgUHJpbWl0aXZlVHlwZSwgdmFsdWUyIGFzIFByaW1pdGl2ZVR5cGUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDb2RlTGlzdEFycmF5KGFycjogY29kZUxpc3RUeXBlKTogUHJvbWlzZTxmaW5hbENvZGVMaXN0VHlwZSB8IHVuZGVmaW5lZD4ge1xuXHRpZiAodHlwZW9mIGFyciA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0cmV0dXJuIGFycigpO1xuXHR9XG5cdHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnREYXRlVG9TdHJpbmcodmFsdWU6IERhdGUsIHRva2VuVHlwZTogVG9rZW5UeXBlLCBpc0RhdGVUaW1lT2Zmc2V0OiBib29sZWFuKTogc3RyaW5nIHtcblx0bGV0IGZvcm1hdHRlZERhdGVUaW1lID0gXCJcIjtcblx0aWYgKGlzRGF0ZVRpbWVPZmZzZXQpIHtcblx0XHRyZXR1cm4gZGF0ZVRpbWVPZmZzZXQuZm9ybWF0VmFsdWUodmFsdWUsIFwic3RyaW5nXCIpIGFzIHN0cmluZztcblx0fVxuXHRzd2l0Y2ggKHRva2VuVHlwZSkge1xuXHRcdGNhc2UgXCJDYWxlbmRhclwiOlxuXHRcdFx0Zm9ybWF0dGVkRGF0ZVRpbWUgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpLmZvcm1hdCh2YWx1ZSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiVGltZVwiOlxuXHRcdFx0Zm9ybWF0dGVkRGF0ZVRpbWUgPSBEYXRlRm9ybWF0LmdldFRpbWVJbnN0YW5jZSgpLmZvcm1hdCh2YWx1ZSk7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0YnJlYWs7XG5cdH1cblx0cmV0dXJuIGZvcm1hdHRlZERhdGVUaW1lO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb3BlcmF0b3IgYW5kIHZhbHVlLlxuICogQHBhcmFtIG9wZXJhdG9yIFRoZSBvcGVyYXRvciB0byByZXByZXNlbnRcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVwcmVzZW50XG4gKiBAcGFyYW0gdG9rZW5UeXBlIFRoZSB0b2tlbidzIHR5cGVcbiAqIEBwYXJhbSBpc0RhdGVUaW1lT2Zmc2V0IENoZWNrcyBpZiB0aGUgZGF0YSB0eXBlIGlzIG9mIERhdGVUaW1lT2Zmc2V0XG4gKiBAcmV0dXJucyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvcGVyYXRvciBhbmQgdmFsdWVcbiAqL1xuZnVuY3Rpb24gbWFwT3BlcmF0b3IoXG5cdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvcixcblx0dmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlLFxuXHR0b2tlblR5cGU6IFRva2VuVHlwZSxcblx0aXNEYXRlVGltZU9mZnNldDogYm9vbGVhblxuKTogc3RyaW5nIHtcblx0bGV0IG5ld1ZhbHVlOiBudW1iZXIgfCBzdHJpbmcgPSBcIlwiO1xuXHRpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuXHRcdG5ld1ZhbHVlID0gY29udmVydEJvb2xUb1N0cmluZyh2YWx1ZSk7XG5cdH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG5cdFx0bmV3VmFsdWUgPSBjb252ZXJ0RGF0ZVRvU3RyaW5nKHZhbHVlLCB0b2tlblR5cGUsIGlzRGF0ZVRpbWVPZmZzZXQpO1xuXHR9IGVsc2Uge1xuXHRcdG5ld1ZhbHVlID0gdmFsdWU7XG5cdH1cblxuXHRzd2l0Y2ggKG9wZXJhdG9yKSB7XG5cdFx0Y2FzZSBGaWx0ZXJPcGVyYXRvci5HVDpcblx0XHRcdHJldHVybiBgPiAke25ld1ZhbHVlfWA7XG5cdFx0Y2FzZSBGaWx0ZXJPcGVyYXRvci5MVDpcblx0XHRcdHJldHVybiBgPCAke25ld1ZhbHVlfWA7XG5cdFx0Y2FzZSBGaWx0ZXJPcGVyYXRvci5HRTpcblx0XHRcdHJldHVybiBgPj0gJHtuZXdWYWx1ZX1gO1xuXHRcdGNhc2UgRmlsdGVyT3BlcmF0b3IuTEU6XG5cdFx0XHRyZXR1cm4gYDw9ICR7bmV3VmFsdWV9YDtcblx0XHRjYXNlIEZpbHRlck9wZXJhdG9yLkVROlxuXHRcdFx0cmV0dXJuIGAke25ld1ZhbHVlfWA7XG5cdFx0Y2FzZSBGaWx0ZXJPcGVyYXRvci5Db250YWluczpcblx0XHRcdHJldHVybiBgKiR7bmV3VmFsdWV9KmA7XG5cdFx0Y2FzZSBGaWx0ZXJPcGVyYXRvci5FbmRzV2l0aDpcblx0XHRcdHJldHVybiBgKiR7bmV3VmFsdWV9YDtcblx0XHRjYXNlIEZpbHRlck9wZXJhdG9yLlN0YXJ0c1dpdGg6XG5cdFx0XHRyZXR1cm4gYCR7bmV3VmFsdWV9KmA7XG5cdFx0Y2FzZSBGaWx0ZXJPcGVyYXRvci5ORTpcblx0XHRcdHJldHVybiBgIT0oJHtuZXdWYWx1ZX0pYDtcblx0XHRjYXNlIEZpbHRlck9wZXJhdG9yLk5vdENvbnRhaW5zOlxuXHRcdFx0cmV0dXJuIGAhKCoke25ld1ZhbHVlfSopYDtcblx0XHRjYXNlIEZpbHRlck9wZXJhdG9yLk5vdEVuZHNXaXRoOlxuXHRcdFx0cmV0dXJuIGAhKCoke25ld1ZhbHVlfSlgO1xuXHRcdGNhc2UgRmlsdGVyT3BlcmF0b3IuTm90U3RhcnRzV2l0aDpcblx0XHRcdHJldHVybiBgISgke25ld1ZhbHVlfSopYDtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIG5ld1ZhbHVlPy50b1N0cmluZygpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIG1hcE9wZXJhdG9yRm9yVmFsdWVIZWxwKG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvciwgdmFsdWU6IENvZGVMaXN0VHlwZSwgdG9rZW5UeXBlOiBUb2tlblR5cGUsIGlzRGF0ZVRpbWVPZmZzZXQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuXHRyZXR1cm4gbWFwT3BlcmF0b3Iob3BlcmF0b3IsIHZhbHVlLmRlc2NyaXB0aW9uLCB0b2tlblR5cGUsIGlzRGF0ZVRpbWVPZmZzZXQpO1xufVxuXG5mdW5jdGlvbiBtYXBPcGVyYXRvckZvckJldHdlZW5PcGVyYXRvcihcblx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLFxuXHR2YWx1ZXM6IEJldHdlZW5TZWxlY3RlZFZhbHVlcyB8IFZhbHVlSGVscEJldHdlZW5TZWxlY3RlZFZhbHVlcyxcblx0dG9rZW5UeXBlOiBUb2tlblR5cGUsXG5cdGlzRGF0ZVRpbWVPZmZzZXQ6IGJvb2xlYW5cbik6IHN0cmluZyB7XG5cdGxldCBuZXdWYWx1ZTE6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBcIlwiO1xuXHRsZXQgbmV3VmFsdWUyOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gXCJcIjtcblx0aWYgKHR5cGVvZiB2YWx1ZXNbMF0gPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0bmV3VmFsdWUxID0gY29udmVydEJvb2xUb1N0cmluZyh2YWx1ZXNbMF0pO1xuXHR9IGVsc2UgaWYgKHZhbHVlc1swXSBpbnN0YW5jZW9mIERhdGUpIHtcblx0XHRuZXdWYWx1ZTEgPSBjb252ZXJ0RGF0ZVRvU3RyaW5nKHZhbHVlc1swXSwgdG9rZW5UeXBlLCBpc0RhdGVUaW1lT2Zmc2V0KTtcblx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWVzWzBdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0bmV3VmFsdWUxID0gdmFsdWVzWzBdLmRlc2NyaXB0aW9uIGFzIHN0cmluZztcblx0fSBlbHNlIHtcblx0XHRuZXdWYWx1ZTEgPSB2YWx1ZXNbMF07XG5cdH1cblxuXHRpZiAodHlwZW9mIHZhbHVlc1sxXSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRuZXdWYWx1ZTIgPSBjb252ZXJ0Qm9vbFRvU3RyaW5nKHZhbHVlc1sxXSk7XG5cdH0gZWxzZSBpZiAodmFsdWVzWzFdIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdG5ld1ZhbHVlMiA9IGNvbnZlcnREYXRlVG9TdHJpbmcodmFsdWVzWzFdLCB0b2tlblR5cGUsIGlzRGF0ZVRpbWVPZmZzZXQpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZXNbMF0gPT09IFwib2JqZWN0XCIpIHtcblx0XHRuZXdWYWx1ZTIgPSB2YWx1ZXNbMV0uZGVzY3JpcHRpb24gYXMgc3RyaW5nO1xuXHR9IGVsc2Uge1xuXHRcdG5ld1ZhbHVlMiA9IHZhbHVlc1sxXTtcblx0fVxuXHRpZiAob3BlcmF0b3IgPT09IEZpbHRlck9wZXJhdG9yLkJUKSB7XG5cdFx0cmV0dXJuIGAke25ld1ZhbHVlMX0uLi4ke25ld1ZhbHVlMn1gO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBgISgke25ld1ZhbHVlMX0uLi4ke25ld1ZhbHVlMn0pYDtcblx0fVxufVxuXG5mdW5jdGlvbiBpc0JldHdlZW5TZWxlY3RlZFZhbHVlcyhvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IpOiBib29sZWFuIHtcblx0cmV0dXJuIG9wZXJhdG9yID09PSBGaWx0ZXJPcGVyYXRvci5CVCB8fCBvcGVyYXRvciA9PT0gRmlsdGVyT3BlcmF0b3IuTkI7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRCb29sVG9TdHJpbmcodmFsdWU6IGJvb2xlYW4pOiBzdHJpbmcge1xuXHRyZXR1cm4gdmFsdWVcblx0XHQ/IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX0VBU1lfRklMVEVSX1NFTEVDVEVEX1ZBTFVFU19UUlVFXCIpXG5cdFx0OiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiTV9FQVNZX0ZJTFRFUl9TRUxFQ1RFRF9WQUxVRVNfRkFMU0VcIik7XG59XG5cbi8vVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGZpbHRlciBpcyBub3QgYSB2YWxpZCBcIlNpbmdsZVJhbmdlXCIgKGUuZy4sIHdyb25nIG9wZXJhdG9yIG9yIHRvbyBtYW55IHZhbHVlcyksIGFuZCBmYWxzZSBpZiBpdCBpcyB2YWxpZC5cbmZ1bmN0aW9uIGlzSW52YWxpZFNpbmdsZVJhbmdlKGZpbHRlclZhbHVlOiB7IG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvcjsgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB8IGJvb2xlYW4pW10gfSk6IGJvb2xlYW4ge1xuXHRjb25zdCBhbGxvd2VkID0gW0ZpbHRlck9wZXJhdG9yLkVRLCBGaWx0ZXJPcGVyYXRvci5MRSwgRmlsdGVyT3BlcmF0b3IuTFQsIEZpbHRlck9wZXJhdG9yLkdFLCBGaWx0ZXJPcGVyYXRvci5HVCwgRmlsdGVyT3BlcmF0b3IuQlRdO1xuXG5cdC8vIFx0ZmlsdGVyVmFsdWUub3BlcmF0b3IgIT09IEZpbHRlck9wZXJhdG9yLkJUIGVuc3VyZXMgQlQgaXMgYWx3YXlzIHZhbGlkLlxuXHQvLyAhYWxsb3dlZC5pbmNsdWRlcygpIGJsb2NrcyB1bnN1cHBvcnRlZCBvcGVyYXRvcnMuXG5cdC8vIGZpbHRlclZhbHVlLnZhbHVlcy5sZW5ndGggPj0gMiBibG9ja3MgbXVsdGlwbGUgdmFsdWVzIGZvciBzaW5nbGUtcmFuZ2UgZmlsdGVycy5cblx0Ly8gVG9nZXRoZXIsIHRoaXMgcmV0dXJucyB0cnVlIHdoZW4gdGhlIGZpbHRlciBpcyBub3QgYSB2YWxpZCBzaW5nbGUtcmFuZ2UuXG5cdHJldHVybiBmaWx0ZXJWYWx1ZS5vcGVyYXRvciAhPT0gRmlsdGVyT3BlcmF0b3IuQlQgJiYgKCFhbGxvd2VkLmluY2x1ZGVzKGZpbHRlclZhbHVlLm9wZXJhdG9yKSB8fCBmaWx0ZXJWYWx1ZS52YWx1ZXMubGVuZ3RoID49IDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRhKFxuXHR0b2tlbnM6IFRva2VuRGVmaW5pdGlvbltdLFxuXHRmaWx0ZXJWYWx1ZXM6IEVhc3lGaWx0ZXJSZXN1bHRbXCJmaWx0ZXJcIl0sXG5cdGZpbHRlckJhck1ldGFkYXRhOiBFYXN5RmlsdGVyUHJvcGVydHlNZXRhZGF0YVtdLFxuXHRzZXRNZXNzYWdlU3RyaXBGb3JWYWxpZGF0ZWRGaWx0ZXJzOiAobXNnOiBzdHJpbmcpID0+IHZvaWRcbik6IHZvaWQge1xuXHRpZiAoZmlsdGVyVmFsdWVzKSB7XG5cdFx0Y29uc3QgdmlzaXRlZE1hcEZvck1hbmRhdG9yeVRva2VuczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblx0XHRjb25zdCBub25GaWx0ZXJhYmxlVG9rZW5MYWJlbHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3Qgc2luZ2xlUmFuZ2VUb2tlbkxhYmVsczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBoaWRkZW5GaWx0ZXJUb2tlbkxhYmVsczogc3RyaW5nW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgZmlsdGVyVmFsdWUgb2YgZmlsdGVyVmFsdWVzKSB7XG5cdFx0XHRjb25zdCBmaWx0ZXJDcml0ZXJpYSA9IGZpbHRlckJhck1ldGFkYXRhLmZpbmQoKGZpZWxkKSA9PiBmaWVsZC5uYW1lID09PSBmaWx0ZXJWYWx1ZS5uYW1lKTtcblx0XHRcdGlmIChmaWx0ZXJDcml0ZXJpYSkge1xuXHRcdFx0XHQvLyBPbmx5IGJsb2NrIGlmIGZpbHRlcmFibGUgaXMgZmFsc2Vcblx0XHRcdFx0aWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWx0ZXJDcml0ZXJpYSwgXCJmaWx0ZXJhYmxlXCIpICYmICFmaWx0ZXJDcml0ZXJpYT8uZmlsdGVyYWJsZSkge1xuXHRcdFx0XHRcdG5vbkZpbHRlcmFibGVUb2tlbkxhYmVscy5wdXNoKGZpbHRlckNyaXRlcmlhLmxhYmVsIHx8IGZpbHRlckNyaXRlcmlhLm5hbWUpO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIE9ubHkgYmxvY2sgaWYgaGlkZGVuRmlsdGVyIGlzIHRydWVcblx0XHRcdFx0aWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWx0ZXJDcml0ZXJpYSwgXCJoaWRkZW5GaWx0ZXJcIikgJiYgZmlsdGVyQ3JpdGVyaWE/LmhpZGRlbkZpbHRlcikge1xuXHRcdFx0XHRcdGhpZGRlbkZpbHRlclRva2VuTGFiZWxzLnB1c2goZmlsdGVyQ3JpdGVyaWEubGFiZWwgfHwgZmlsdGVyQ3JpdGVyaWEubmFtZSk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gT25seSBhcHBseSBTaW5nbGVSYW5nZSBsb2dpYyBpZiBmaWx0ZXJSZXN0cmljdGlvbiBpcyBzZXQgdG8gU2luZ2xlUmFuZ2Vcblx0XHRcdFx0aWYgKGZpbHRlckNyaXRlcmlhPy5maWx0ZXJSZXN0cmljdGlvbiA9PT0gXCJTaW5nbGVSYW5nZVwiICYmIGlzSW52YWxpZFNpbmdsZVJhbmdlKGZpbHRlclZhbHVlKSkge1xuXHRcdFx0XHRcdHNpbmdsZVJhbmdlVG9rZW5MYWJlbHMucHVzaChmaWx0ZXJDcml0ZXJpYS5sYWJlbCB8fCBmaWx0ZXJDcml0ZXJpYS5uYW1lKTtcblx0XHRcdFx0XHRmaWx0ZXJWYWx1ZS52YWx1ZXMgPSBbXTsgLy8gUmVzZXQgdmFsdWVzIHRvIGF2b2lkIGFkZGluZyBpbnZhbGlkIHRva2VuIHZhbHVlc1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgeyB0eXBlIH0gPSBmaWx0ZXJDcml0ZXJpYTtcblx0XHRcdFx0Y29uc3QgdG9rZW5JbmRleCA9IHRva2Vucy5maW5kSW5kZXgoKHRva2VuKSA9PiB0b2tlbi5rZXkgPT09IGZpbHRlclZhbHVlLm5hbWUpO1xuXHRcdFx0XHRjb25zdCB7IG9wZXJhdG9yLCB2YWx1ZXMgfSA9IGZpbHRlclZhbHVlO1xuXHRcdFx0XHRsZXQga2V5U3BlY2lmaWNTZWxlY3RlZFZhbHVlczogVG9rZW5TZWxlY3RlZFZhbHVlc0RlZmluaXRpb247XG5cdFx0XHRcdGlmIChFYXN5RmlsdGVyVXRpbHMuaXNCZXR3ZWVuU2VsZWN0ZWRWYWx1ZXMob3BlcmF0b3IpKSB7XG5cdFx0XHRcdFx0a2V5U3BlY2lmaWNTZWxlY3RlZFZhbHVlcyA9IHtcblx0XHRcdFx0XHRcdG9wZXJhdG9yLFxuXHRcdFx0XHRcdFx0c2VsZWN0ZWRWYWx1ZXM6IHZhbHVlcyBhcyBCZXR3ZWVuU2VsZWN0ZWRWYWx1ZXNcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGtleVNwZWNpZmljU2VsZWN0ZWRWYWx1ZXMgPSB7XG5cdFx0XHRcdFx0XHRvcGVyYXRvcjogb3BlcmF0b3IgYXMgRXhjbHVkZTxGaWx0ZXJPcGVyYXRvciwgRmlsdGVyT3BlcmF0b3IuQlQgfCBGaWx0ZXJPcGVyYXRvci5OQj4sXG5cdFx0XHRcdFx0XHRzZWxlY3RlZFZhbHVlczogdmFsdWVzIGFzIHN0cmluZ1tdIHwgRGF0ZVtdIHwgbnVtYmVyW10gfCBib29sZWFuW11cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0b2tlbkluZGV4ID09PSAtMSkge1xuXHRcdFx0XHRcdC8vIEFkZCBuZXcgdG9rZW4gaWYgaXQgZG9lc24ndCBleGlzdFxuXHRcdFx0XHRcdGNvbnN0IG5ld1Rva2VuOiBUb2tlbkRlZmluaXRpb24gPSB7XG5cdFx0XHRcdFx0XHRrZXk6IGZpbHRlclZhbHVlLm5hbWUsXG5cdFx0XHRcdFx0XHRsYWJlbDogZmlsdGVyQ3JpdGVyaWEubGFiZWwgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdFx0a2V5U3BlY2lmaWNTZWxlY3RlZFZhbHVlczogW2tleVNwZWNpZmljU2VsZWN0ZWRWYWx1ZXNdLFxuXHRcdFx0XHRcdFx0dHlwZTogdHlwZSBhcyBFeGNsdWRlPFRva2VuVHlwZSwgXCJWYWx1ZUhlbHBcIj4sXG5cdFx0XHRcdFx0XHRidXN5OiB0eXBlID09PSBcIlZhbHVlSGVscFwiID8gdHJ1ZSA6IGZhbHNlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR0b2tlbnMucHVzaChuZXdUb2tlbik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gVXBkYXRlIGV4aXN0aW5nIHRva2VuXG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSW5kZXhdO1xuXHRcdFx0XHRcdC8vSWYgaXRzIGRlZmF1bHQgdmFsdWUgLCBvdmVycmlkZSBpdFxuXHRcdFx0XHRcdGlmICgoY3VycmVudFRva2VuLmlzUmVxdWlyZWQgPz8gZmFsc2UpICYmICF2aXNpdGVkTWFwRm9yTWFuZGF0b3J5VG9rZW5zW2N1cnJlbnRUb2tlbi5rZXldKSB7XG5cdFx0XHRcdFx0XHRjdXJyZW50VG9rZW4ua2V5U3BlY2lmaWNTZWxlY3RlZFZhbHVlcyA9IFtrZXlTcGVjaWZpY1NlbGVjdGVkVmFsdWVzXTtcblx0XHRcdFx0XHRcdHZpc2l0ZWRNYXBGb3JNYW5kYXRvcnlUb2tlbnNbY3VycmVudFRva2VuLmtleV0gPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQoY3VycmVudFRva2VuLmtleVNwZWNpZmljU2VsZWN0ZWRWYWx1ZXMgYXMgVG9rZW5TZWxlY3RlZFZhbHVlc0RlZmluaXRpb25bXSkucHVzaChrZXlTcGVjaWZpY1NlbGVjdGVkVmFsdWVzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG5vbkZpbHRlcmFibGVUb2tlbkxhYmVscy5sZW5ndGggPiAwIHx8IHNpbmdsZVJhbmdlVG9rZW5MYWJlbHMubGVuZ3RoID4gMCB8fCBoaWRkZW5GaWx0ZXJUb2tlbkxhYmVscy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcblx0XHRcdGlmIChub25GaWx0ZXJhYmxlVG9rZW5MYWJlbHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb25zdCBub25GaWx0ZXJhYmxlVG9rZW5MYWJlbCA9IGA8c3Ryb25nPiR7bm9uRmlsdGVyYWJsZVRva2VuTGFiZWxzLmpvaW4oXCIsIFwiKX08L3N0cm9uZz5gO1xuXHRcdFx0XHRtZXNzYWdlcy5wdXNoKHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX0VBU1lfRklMVEVSX05PTl9GSUxURVJBQkxFXCIsIFtub25GaWx0ZXJhYmxlVG9rZW5MYWJlbF0pKTtcblx0XHRcdH1cblx0XHRcdGlmIChoaWRkZW5GaWx0ZXJUb2tlbkxhYmVscy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbnN0IGxhYmVsID0gYDxzdHJvbmc+JHtoaWRkZW5GaWx0ZXJUb2tlbkxhYmVscy5qb2luKFwiLCBcIil9PC9zdHJvbmc+YDtcblx0XHRcdFx0bWVzc2FnZXMucHVzaChyZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiTV9FQVNZX0ZJTFRFUl9ISURERU5fRklMVEVSXCIsIFtsYWJlbF0pKTtcblx0XHRcdH1cblx0XHRcdGlmIChzaW5nbGVSYW5nZVRva2VuTGFiZWxzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29uc3QgbGFiZWwgPSBgPHN0cm9uZz4ke3NpbmdsZVJhbmdlVG9rZW5MYWJlbHMuam9pbihcIiwgXCIpfTwvc3Ryb25nPmA7XG5cdFx0XHRcdG1lc3NhZ2VzLnB1c2gocmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIk1fRUFTWV9GSUxURVJfU0lOR0xFX1JBTkdFXCIsIFtsYWJlbF0pKTtcblx0XHRcdH1cblx0XHRcdHNldE1lc3NhZ2VTdHJpcEZvclZhbGlkYXRlZEZpbHRlcnMobWVzc2FnZXMuam9pbihcIjxicj5cIikpO1xuXHRcdH1cblx0fVxufVxuXG5jb25zdCBFYXN5RmlsdGVyVXRpbHMgPSB7XG5cdGFyZUl0ZW1zU2FtZSxcblx0YXJlQ29kZUxpc3RzU2FtZSxcblx0Z2V0Q29kZUxpc3RBcnJheSxcblx0YXJlQXJyYXlTYW1lLFxuXHRtYXBPcGVyYXRvcixcblx0bWFwT3BlcmF0b3JGb3JCZXR3ZWVuT3BlcmF0b3IsXG5cdGlzQmV0d2VlblNlbGVjdGVkVmFsdWVzLFxuXHRmb3JtYXREYXRhLFxuXHRtYXBPcGVyYXRvckZvclZhbHVlSGVscFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRWFzeUZpbHRlclV0aWxzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0VBb0JBLE1BQU1BLGNBQWMsR0FBR0MsR0FBRyxDQUFDQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBRTtFQUNuRSxNQUFNQyxjQUFjLEdBQUcsSUFBSUMsY0FBYyxDQUFDLENBQUM7RUFFM0MsU0FBU0MsWUFBWUEsQ0FDcEJDLElBQW9GLEVBQ3BGQyxJQUFvRixFQUMxRTtJQUNWLElBQUlELElBQUksQ0FBQ0UsTUFBTSxLQUFLRCxJQUFJLENBQUNDLE1BQU0sRUFBRTtNQUNoQyxPQUFPLEtBQUs7SUFDYjtJQUNBO0lBQ0EsS0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdILElBQUksQ0FBQ0UsTUFBTSxFQUFFQyxDQUFDLEVBQUUsRUFBRTtNQUNyQyxJQUNDSCxJQUFJLENBQUNHLENBQUMsQ0FBQyxDQUFDQyxRQUFRLEtBQUtILElBQUksQ0FBQ0UsQ0FBQyxDQUFDLENBQUNDLFFBQVEsSUFDckMsQ0FBQ0osSUFB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
331
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXNvdXJjZUJ1bmRsZSIsIkxpYiIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiZGF0ZVRpbWVPZmZzZXQiLCJEYXRlVGltZU9mZnNldCIsImFyZUl0ZW1zU2FtZSIsImFycjEiLCJhcnIyIiwibGVuZ3RoIiwiaSIsIm9wZXJhdG9yIiwic2VsZWN0ZWRWYWx1ZXMiLCJldmVyeSIsImZpcnN0VmFsdWUiLCJpbmRleCIsIm90aGVyVmFsdWUiLCJEYXRlIiwiZGVlcEVxdWFsIiwidmFsdWUiLCJkZXNjcmlwdGlvbiIsImFyZUFycmF5U2FtZSIsImFyZUNvZGVMaXN0c1NhbWUiLCJhcnJOZXcxIiwiZ2V0Q29kZUxpc3RBcnJheSIsImFyck5ldzIiLCJkZXNjcmlwdGlvbk5ldzEiLCJtYXAiLCJkYXRhIiwiZGVzY3JpcHRpb25OZXcyIiwidmFsdWUxIiwidmFsdWUyIiwiYXJyIiwiY29udmVydERhdGVUb1N0cmluZyIsInRva2VuVHlwZSIsImlzRGF0ZVRpbWVPZmZzZXQiLCJmb3JtYXR0ZWREYXRlVGltZSIsImZvcm1hdFZhbHVlIiwiRGF0ZUZvcm1hdCIsImdldERhdGVJbnN0YW5jZSIsImZvcm1hdCIsImdldFRpbWVJbnN0YW5jZSIsIm1hcE9wZXJhdG9yIiwibmV3VmFsdWUiLCJjb252ZXJ0Qm9vbFRvU3RyaW5nIiwiRmlsdGVyT3BlcmF0b3IiLCJHVCIsIkxUIiwiR0UiLCJMRSIsIkVRIiwiQ29udGFpbnMiLCJFbmRzV2l0aCIsIlN0YXJ0c1dpdGgiLCJORSIsIk5vdENvbnRhaW5zIiwiTm90RW5kc1dpdGgiLCJOb3RTdGFydHNXaXRoIiwidG9TdHJpbmciLCJtYXBPcGVyYXRvckZvclZhbHVlSGVscCIsIm1hcE9wZXJhdG9yRm9yQmV0d2Vlbk9wZXJhdG9yIiwidmFsdWVzIiwibmV3VmFsdWUxIiwibmV3VmFsdWUyIiwiQlQiLCJpc0JldHdlZW5TZWxlY3RlZFZhbHVlcyIsIk5CIiwiZ2V0VGV4dCIsImhhbmRsZVNpbmdsZVJhbmdlRmlsdGVyIiwiZmlsdGVyQ3JpdGVyaWEiLCJmaWx0ZXJWYWx1ZSIsInNpbmdsZVJhbmdlVG9rZW5MYWJlbHMiLCJzaW5nbGVSYW5nZVVzYWdlIiwiZmlsdGVyUmVzdHJpY3Rpb24iLCJpc0ludmFsaWQiLCJpc0ludmFsaWRTaW5nbGVSYW5nZSIsIm5hbWUiLCJsYWJlbCIsImluY2x1ZGVzIiwicHVzaCIsInNpbmdsZVZhbHVlT3BzIiwicmFuZ2VPcHMiLCJvcCIsInZhbENvdW50IiwiZm9ybWF0RGF0YSIsInRva2VucyIsImZpbHRlclZhbHVlcyIsImZpbHRlckJhck1ldGFkYXRhIiwic2V0TWVzc2FnZVN0cmlwRm9yVmFsaWRhdGVkRmlsdGVycyIsInZpc2l0ZWRNYXBGb3JNYW5kYXRvcnlUb2tlbnMiLCJub25GaWx0ZXJhYmxlVG9rZW5MYWJlbHMiLCJoaWRkZW5GaWx0ZXJUb2tlbkxhYmVscyIsImZpbmQiLCJmaWVsZCIsInByb2Nlc3NGaWx0ZXJDcml0ZXJpYSIsImlzSW52YWxpZFNpbmdsZVJhbmdlVG9rZW4iLCJ1cGRhdGVUb2tlbnMiLCJnZW5lcmF0ZVZhbGlkYXRpb25NZXNzYWdlcyIsImZpbHRlcmFibGUiLCJoaWRkZW5GaWx0ZXIiLCJ0b2tlbkluZGV4IiwiZmluZEluZGV4IiwidG9rZW4iLCJrZXkiLCJrZXlTcGVjaWZpY1NlbGVjdGVkVmFsdWVzIiwiY3JlYXRlS2V5U3BlY2lmaWNTZWxlY3RlZFZhbHVlcyIsInR5cGUiLCJidXN5IiwiY3VycmVudFRva2VuIiwiaXNSZXF1aXJlZCIsIkVhc3lGaWx0ZXJVdGlscyIsIm1lc3NhZ2VzIiwiam9pbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsidXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcmltaXRpdmVUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL0VkbVwiO1xuaW1wb3J0IGRlZXBFcXVhbCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwRXF1YWxcIjtcbmltcG9ydCBMaWIgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IERhdGVGb3JtYXQgZnJvbSBcInNhcC91aS9jb3JlL2Zvcm1hdC9EYXRlRm9ybWF0XCI7XG5pbXBvcnQgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IERhdGVUaW1lT2Zmc2V0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdHlwZS9EYXRlVGltZU9mZnNldFwiO1xuaW1wb3J0IHR5cGUgeyBFYXN5RmlsdGVyUmVzdWx0LCBQcm9wZXJ0eU1ldGFkYXRhIH0gZnJvbSBcInV4L2VuZy9maW9yaWFpL3JldXNlL2Vhc3lmaWx0ZXIvRWFzeUZpbHRlclwiO1xuaW1wb3J0IHR5cGUge1xuXHRCZXR3ZWVuU2VsZWN0ZWRWYWx1ZXMsXG5cdENvZGVMaXN0VHlwZSxcblx0RWFzeUZpbHRlclByb3BlcnR5TWV0YWRhdGEsXG5cdFRva2VuRGVmaW5pdGlvbixcblx0VG9rZW5TZWxlY3RlZFZhbHVlc0RlZmluaXRpb24sXG5cdFRva2VuVHlwZSxcblx0VmFsdWVIZWxwQmV0d2VlblNlbGVjdGVkVmFsdWVzLFxuXHRWYWx1ZUhlbHBTZWxlY3RlZFZhbHVlc0RlZmluaXRpb25cbn0gZnJvbSBcIi4vRWFzeUZpbHRlckJhckNvbnRhaW5lclwiO1xuXG50eXBlIGNvZGVMaXN0VHlwZSA9IFByb3BlcnR5TWV0YWRhdGFbXCJjb2RlTGlzdFwiXTtcbnR5cGUgZmluYWxDb2RlTGlzdFR5cGUgPSB7IHZhbHVlOiBQcmltaXRpdmVUeXBlOyBkZXNjcmlwdGlvbj86IHN0cmluZyB9W107XG5jb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYi5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb250cm9sc1wiKSE7XG5jb25zdCBkYXRlVGltZU9mZnNldCA9IG5ldyBEYXRlVGltZU9mZnNldCgpO1xuXG5mdW5jdGlvbiBhcmVJdGVtc1NhbWUoXG5cdGFycjE6IHJlYWRvbmx5IFRva2VuU2VsZWN0ZWRWYWx1ZXNEZWZpbml0aW9uW10gfCBWYWx1ZUhlbHBTZWxlY3RlZFZhbHVlc0RlZmluaXRpb25bXSxcblx0YXJyMjogcmVhZG9ubHkgVG9rZW5TZWxlY3RlZFZhbHVlc0RlZmluaXRpb25bXSB8IFZhbHVlSGVscFNlbGVjdGVkVmFsdWVzRGVmaW5pdGlvbltdXG4pOiBib29sZWFuIHtcblx0aWYgKGFycjEubGVuZ3RoICE9PSBhcnIyLmxlbmd0aCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIENvbXBhcmUgZWxlbWVudHMgb2YgYm90aCBhcnJheXNcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcnIxLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKFxuXHRcdFx0YXJyMVtpXS5vcGVyYXRvciAhPT0gYXJyMltpXS5vcGVyYXRvciB8fFxuXHRcdFx0IWFycjFbaV0uc2VsZWN0ZWRWYWx1ZXMuZXZlcnkoKGZpcnN0VmFsdWUsIGluZGV4KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG90aGVyVmFsdWUgPSBhcnIyW2ldLnNlbGVjdGVkVmFsdWVzW2luZGV4XTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgRGF0ZSBvYmplY3RzXG5cdFx0XHRcdGlmIChmaXJzdFZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCBvdGhlclZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdFx0XHRcdHJldHVybiBkZWVwRXF1YWwoZmlyc3RWYWx1ZSwgb3RoZXJWYWx1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBIYW5kbGUgb2JqZWN0cyB3aXRoIGRlZXAgZXF1YWxpdHlcblx0XHRcdFx0aWYgKHR5cGVvZiBmaXJzdFZhbHVlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvdGhlclZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRlZXBFcXVhbChmaXJzdFZhbHVlLnZhbHVlLCBvdGhlclZhbHVlLnZhbHVlKSAmJiBmaXJzdFZhbHVlLmRlc2NyaXB0aW9uID09PSBvdGhlclZhbHVlLmRlc2NyaXB0aW9uO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRmFsbGJhY2sgdG8gZGlyZWN0IGNvbXBhcmlzb25cblx0XHRcdFx0cmV0dXJuIGZpcnN0VmFsdWUgPT09IG90aGVyVmFsdWU7XG5cdFx0XHR9KVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0cnVlOyAvLyBBcnJheXMgYXJlIHRoZSBzYW1lXG59XG5cbmZ1bmN0aW9uIGFyZUFycmF5U2FtZShhcnIxOiByZWFkb25seSB1bmtub3duW10sIGFycjI6IHJlYWRvbmx5IHVua25vd25bXSk6IGJvb2xlYW4ge1xuXHRpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdC8vIENvbXBhcmUgZWxlbWVudHMgb2YgYm90aCBhcnJheXNcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcnIxLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKGFycjFbaV0gIT09IGFycjJbaV0pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRydWU7IC8vIEFycmF5cyBhcmUgdGhlIHNhbWVcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXJlQ29kZUxpc3RzU2FtZShhcnIxOiBjb2RlTGlzdFR5cGUsIGFycjI6IGNvZGVMaXN0VHlwZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRjb25zdCBhcnJOZXcxOiBmaW5hbENvZGVMaXN0VHlwZSB8IHVuZGVmaW5lZCA9IGF3YWl0IGdldENvZGVMaXN0QXJyYXkoYXJyMSk7XG5cdGNvbnN0IGFyck5ldzI6IGZpbmFsQ29kZUxpc3RUeXBlIHwgdW5kZWZpbmVkID0gYXdhaXQgZ2V0Q29kZUxpc3RBcnJheShhcnIyKTtcblx0Y29uc3QgZGVzY3JpcHRpb25OZXcxID0gYXJyTmV3MT8ubWFwKChkYXRhKSA9PiBkYXRhLmRlc2NyaXB0aW9uKTtcblx0Y29uc3QgZGVzY3JpcHRpb25OZXcyID0gYXJyTmV3Mj8ubWFwKChkYXRhKSA9PiBkYXRhLmRlc2NyaXB0aW9uKTtcblxuXHRjb25zdCB2YWx1ZTEgPSBhcnJOZXcxPy5tYXAoKGRhdGEpID0+IGRhdGEudmFsdWUpO1xuXHRjb25zdCB2YWx1ZTIgPSBhcnJOZXcyPy5tYXAoKGRhdGEpID0+IGRhdGEudmFsdWUpO1xuXHRpZiAoIWRlc2NyaXB0aW9uTmV3MSB8fCAhZGVzY3JpcHRpb25OZXcyKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHJldHVybiBhcmVBcnJheVNhbWUoZGVzY3JpcHRpb25OZXcxLCBkZXNjcmlwdGlvbk5ldzIpICYmIGFyZUFycmF5U2FtZSh2YWx1ZTEgYXMgUHJpbWl0aXZlVHlwZSwgdmFsdWUyIGFzIFByaW1pdGl2ZVR5cGUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDb2RlTGlzdEFycmF5KGFycjogY29kZUxpc3RUeXBlKTogUHJvbWlzZTxmaW5hbENvZGVMaXN0VHlwZSB8IHVuZGVmaW5lZD4ge1xuXHRpZiAodHlwZW9mIGFyciA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0cmV0dXJuIGFycigpO1xuXHR9XG5cdHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnREYXRlVG9TdHJpbmcodmFsdWU6IERhdGUsIHRva2VuVHlwZTogVG9rZW5UeXBlLCBpc0RhdGVUaW1lT2Zmc2V0OiBib29sZWFuKTogc3RyaW5nIHtcblx0bGV0IGZvcm1hdHRlZERhdGVUaW1lID0gXCJcIjtcblx0aWYgKGlzRGF0ZVRpbWVPZmZzZXQpIHtcblx0XHRyZXR1cm4gZGF0ZVRpbWVPZmZzZXQuZm9ybWF0VmFsdWUodmFsdWUsIFwic3RyaW5nXCIpIGFzIHN0cmluZztcblx0fVxuXHRzd2l0Y2ggKHRva2VuVHlwZSkge1xuXHRcdGNhc2UgXCJDYWxlbmRhclwiOlxuXHRcdFx0Zm9ybWF0dGVkRGF0ZVRpbWUgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpLmZvcm1hdCh2YWx1ZSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiVGltZVwiOlxuXHRcdFx0Zm9ybWF0dGVkRGF0ZVRpbWUgPSBEYXRlRm9ybWF0LmdldFRpbWVJbnN0YW5jZSgpLmZvcm1hdCh2YWx1ZSk7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0YnJlYWs7XG5cdH1cblx0cmV0dXJuIGZvcm1hdHRlZERhdGVUaW1lO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb3BlcmF0b3IgYW5kIHZhbHVlLlxuICogQHBhcmFtIG9wZXJhdG9yIFRoZSBvcGVyYXRvciB0byByZXByZXNlbnRcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVwcmVzZW50XG4gKiBAcGFyYW0gdG9rZW5UeXBlIFRoZSB0b2tlbidzIHR5cGVcbiAqIEBwYXJhbSBpc0RhdGVUaW1lT2Zmc2V0IENoZWNrcyBpZiB0aGUgZGF0YSB0eXBlIGlzIG9mIERhdGVUaW1lT2Zmc2V0XG4gKiBAcmV0dXJucyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvcGVyYXRvciBhbmQgdmFsdWVcbiAqL1xuZnVuY3Rpb24gbWFwT3BlcmF0b3IoXG5cdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvcixcblx0dmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlLFxuXHR0b2tlblR5cGU6IFRva2VuVHlwZSxcblx0aXNEYXRlVGltZU9mZnNldDogYm9vbGVhblxuKTogc3RyaW5nIHtcblx0bGV0IG5ld1ZhbHVlOiBudW1iZXIgfCBzdHJpbmcgPSBcIlwiO1xuXHRpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuXHRcdG5ld1ZhbHVlID0gY29udmVydEJvb2xUb1N0cmluZyh2YWx1ZSk7XG5cdH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG5cdFx0bmV3VmFsdWUgPSBjb252ZXJ0RGF0ZVRvU3RyaW5nKHZhbHVlLCB0b2tlblR5cGUsIGlzRGF0ZVRpbWVPZmZzZXQpO1xuXHR9IGVsc2Uge1xuXHRcdG5ld1ZhbHVlID0gdmFsdWU7XG5cdH1cblxuXHRzd2l0Y2ggKG9wZXJhdG9yKSB7XG5cdFx0Y2FzZSBGaWx0ZXJPcGVyYXRvci5HVDpcblx0XHRcdHJldHVybiBgPiAke25ld1ZhbHVlfWA7XG5cdFx0Y2FzZSBGaWx0ZXJPcGVyYXRvci5MVDpcblx0XHRcdHJldHVybiBgPCAke25ld1ZhbHVlfWA7XG5cdFx0Y2FzZSBGaWx0ZXJPcGVyYXRvci5HRTpcblx0XHRcdHJldHVybiBgPj0gJHtuZXdWYWx1ZX1gO1xuXHRcdGNhc2UgRmlsdGVyT3BlcmF0b3IuTEU6XG5cdFx0XHRyZXR1cm4gYDw9ICR7bmV3VmFsdWV9YDtcblx0XHRjYXNlIEZpbHRlck9wZXJhdG9yLkVROlxuXHRcdFx0cmV0dXJuIGAke25ld1ZhbHVlfWA7XG5cdFx0Y2FzZSBGaWx0ZXJPcGVyYXRvci5Db250YWluczpcblx0XHRcdHJldHVybiBgKiR7bmV3VmFsdWV9KmA7XG5cdFx0Y2FzZSBGaWx0ZXJPcGVyYXRvci5FbmRzV2l0aDpcblx0XHRcdHJldHVybiBgKiR7bmV3VmFsdWV9YDtcblx0XHRjYXNlIEZpbHRlck9wZXJhdG9yLlN0YXJ0c1dpdGg6XG5cdFx0XHRyZXR1cm4gYCR7bmV3VmFsdWV9KmA7XG5cdFx0Y2FzZSBGaWx0ZXJPcGVyYXRvci5ORTpcblx0XHRcdHJldHVybiBgIT0oJHtuZXdWYWx1ZX0pYDtcblx0XHRjYXNlIEZpbHRlck9wZXJhdG9yLk5vdENvbnRhaW5zOlxuXHRcdFx0cmV0dXJuIGAhKCoke25ld1ZhbHVlfSopYDtcblx0XHRjYXNlIEZpbHRlck9wZXJhdG9yLk5vdEVuZHNXaXRoOlxuXHRcdFx0cmV0dXJuIGAhKCoke25ld1ZhbHVlfSlgO1xuXHRcdGNhc2UgRmlsdGVyT3BlcmF0b3IuTm90U3RhcnRzV2l0aDpcblx0XHRcdHJldHVybiBgISgke25ld1ZhbHVlfSopYDtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIG5ld1ZhbHVlPy50b1N0cmluZygpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIG1hcE9wZXJhdG9yRm9yVmFsdWVIZWxwKG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvciwgdmFsdWU6IENvZGVMaXN0VHlwZSwgdG9rZW5UeXBlOiBUb2tlblR5cGUsIGlzRGF0ZVRpbWVPZmZzZXQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuXHRyZXR1cm4gbWFwT3BlcmF0b3Iob3BlcmF0b3IsIHZhbHVlLmRlc2NyaXB0aW9uLCB0b2tlblR5cGUsIGlzRGF0ZVRpbWVPZmZzZXQpO1xufVxuXG5mdW5jdGlvbiBtYXBPcGVyYXRvckZvckJldHdlZW5PcGVyYXRvcihcblx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLFxuXHR2YWx1ZXM6IEJldHdlZW5TZWxlY3RlZFZhbHVlcyB8IFZhbHVlSGVscEJldHdlZW5TZWxlY3RlZFZhbHVlcyxcblx0dG9rZW5UeXBlOiBUb2tlblR5cGUsXG5cdGlzRGF0ZVRpbWVPZmZzZXQ6IGJvb2xlYW5cbik6IHN0cmluZyB7XG5cdGxldCBuZXdWYWx1ZTE6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBcIlwiO1xuXHRsZXQgbmV3VmFsdWUyOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gXCJcIjtcblx0aWYgKHR5cGVvZiB2YWx1ZXNbMF0gPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0bmV3VmFsdWUxID0gY29udmVydEJvb2xUb1N0cmluZyh2YWx1ZXNbMF0pO1xuXHR9IGVsc2UgaWYgKHZhbHVlc1swXSBpbnN0YW5jZW9mIERhdGUpIHtcblx0XHRuZXdWYWx1ZTEgPSBjb252ZXJ0RGF0ZVRvU3RyaW5nKHZhbHVlc1swXSwgdG9rZW5UeXBlLCBpc0RhdGVUaW1lT2Zmc2V0KTtcblx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWVzWzBdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0bmV3VmFsdWUxID0gdmFsdWVzWzBdLmRlc2NyaXB0aW9uIGFzIHN0cmluZztcblx0fSBlbHNlIHtcblx0XHRuZXdWYWx1ZTEgPSB2YWx1ZXNbMF07XG5cdH1cblxuXHRpZiAodHlwZW9mIHZhbHVlc1sxXSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRuZXdWYWx1ZTIgPSBjb252ZXJ0Qm9vbFRvU3RyaW5nKHZhbHVlc1sxXSk7XG5cdH0gZWxzZSBpZiAodmFsdWVzWzFdIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdG5ld1ZhbHVlMiA9IGNvbnZlcnREYXRlVG9TdHJpbmcodmFsdWVzWzFdLCB0b2tlblR5cGUsIGlzRGF0ZVRpbWVPZmZzZXQpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZXNbMF0gPT09IFwib2JqZWN0XCIpIHtcblx0XHRuZXdWYWx1ZTIgPSB2YWx1ZXNbMV0uZGVzY3JpcHRpb24gYXMgc3RyaW5nO1xuXHR9IGVsc2Uge1xuXHRcdG5ld1ZhbHVlMiA9IHZhbHVlc1sxXTtcblx0fVxuXHRpZiAob3BlcmF0b3IgPT09IEZpbHRlck9wZXJhdG9yLkJUKSB7XG5cdFx0cmV0dXJuIGAke25ld1ZhbHVlMX0uLi4ke25ld1ZhbHVlMn1gO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBgISgke25ld1ZhbHVlMX0uLi4ke25ld1ZhbHVlMn0pYDtcblx0fVxufVxuXG5mdW5jdGlvbiBpc0JldHdlZW5TZWxlY3RlZFZhbHVlcyhvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IpOiBib29sZWFuIHtcblx0cmV0dXJuIG9wZXJhdG9yID09PSBGaWx0ZXJPcGVyYXRvci5CVCB8fCBvcGVyYXRvciA9PT0gRmlsdGVyT3BlcmF0b3IuTkI7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRCb29sVG9TdHJpbmcodmFsdWU6IGJvb2xlYW4pOiBzdHJpbmcge1xuXHRyZXR1cm4gdmFsdWVcblx0XHQ/IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX0VBU1lfRklMVEVSX1NFTEVDVEVEX1ZBTFVFU19UUlVFXCIpXG5cdFx0OiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiTV9FQVNZX0ZJTFRFUl9TRUxFQ1RFRF9WQUxVRVNfRkFMU0VcIik7XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgc2luZ2xlIHJhbmdlIHZhbGlkYXRpb24gYW5kIHVwZGF0ZXMgZm9yIGEgZmlsdGVyIHZhbHVlLlxuICogQHBhcmFtIGZpbHRlckNyaXRlcmlhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGZpbHRlclxuICogQHBhcmFtIGZpbHRlclZhbHVlIFRoZSBmaWx0ZXIgdmFsdWUgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSBzaW5nbGVSYW5nZVRva2VuTGFiZWxzIEFycmF5IHRvIGNvbGxlY3QgbGFiZWxzIG9mIGludmFsaWQgc2luZ2xlIHJhbmdlIGZpbHRlcnNcbiAqIEBwYXJhbSBzaW5nbGVSYW5nZVVzYWdlIFJlY29yZCB0byB0cmFjayB1c2FnZSBjb3VudCBvZiBzaW5nbGUgcmFuZ2UgZmlsdGVyc1xuICogQHJldHVybnMgVHJ1ZSBpZiBwcm9jZXNzaW5nIHNob3VsZCBjb250aW51ZSwgZmFsc2UgaWYgaXQgc2hvdWxkIHNraXAgYW5kIG1ha2UgdGhlIGV4aXN0aW5nIHRva2VuIGFzIGVtcHR5XG4gKi9cbmZ1bmN0aW9uIGhhbmRsZVNpbmdsZVJhbmdlRmlsdGVyKFxuXHRmaWx0ZXJDcml0ZXJpYTogRWFzeUZpbHRlclByb3BlcnR5TWV0YWRhdGEsXG5cdGZpbHRlclZhbHVlOiBFYXN5RmlsdGVyUmVzdWx0W1wiZmlsdGVyXCJdWzBdLFxuXHRzaW5nbGVSYW5nZVRva2VuTGFiZWxzOiBzdHJpbmdbXSxcblx0c2luZ2xlUmFuZ2VVc2FnZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuKTogYm9vbGVhbiB7XG5cdGlmIChmaWx0ZXJDcml0ZXJpYT8uZmlsdGVyUmVzdHJpY3Rpb24gIT09IFwiU2luZ2xlUmFuZ2VcIikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Y29uc3QgaXNJbnZhbGlkID0gaXNJbnZhbGlkU2luZ2xlUmFuZ2UoZmlsdGVyVmFsdWUpIHx8IChzaW5nbGVSYW5nZVVzYWdlW2ZpbHRlclZhbHVlLm5hbWVdID8/IDApID4gMDtcblx0c2luZ2xlUmFuZ2VVc2FnZVtmaWx0ZXJWYWx1ZS5uYW1lXSA9IChzaW5nbGVSYW5nZVVzYWdlW2ZpbHRlclZhbHVlLm5hbWVdID8/IDApICsgMTtcblxuXHRpZiAoIWlzSW52YWxpZCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Y29uc3QgbGFiZWwgPSBmaWx0ZXJDcml0ZXJpYS5sYWJlbCB8fCBmaWx0ZXJDcml0ZXJpYS5uYW1lO1xuXHRpZiAoIXNpbmdsZVJhbmdlVG9rZW5MYWJlbHMuaW5jbHVkZXMobGFiZWwpKSB7XG5cdFx0c2luZ2xlUmFuZ2VUb2tlbkxhYmVscy5wdXNoKGxhYmVsKTtcblx0fVxuXG5cdGZpbHRlclZhbHVlLnZhbHVlcyA9IFtdO1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8vIFZhbGlkYXRlcyBpZiBhIGZpbHRlciB2YWx1ZSB2aW9sYXRlcyB0aGUgU2luZ2xlUmFuZ2UgcmVzdHJpY3Rpb24uXG4vLyBSZXR1cm5zIHRydWUgaWYgaW52YWxpZCwgZmFsc2UgaWYgdmFsaWQuXG4vLyBSdWxlcyBmb3IgU2luZ2xlUmFuZ2U6XG4vLyAtIEFsbG93ZWQgb3BlcmF0b3JzOiBFUSwgTEUsIExULCBHRSwgR1QsIEJULCBOQlxuLy8gLSBTaW5nbGUtdmFsdWUgb3BlcmF0b3JzIChFUSwgTEUsIExULCBHRSwgR1QpOiBtdXN0IGhhdmUgZXhhY3RseSAxIHZhbHVlXG4vLyAtIFJhbmdlIG9wZXJhdG9ycyAoQlQsIE5CKTogbXVzdCBoYXZlIGV4YWN0bHkgMiB2YWx1ZXMgKGxvd2VyICYgdXBwZXIgYm91bmQpXG4vLyAtIE9ubHkgb25lIGNvbmRpdGlvbi90b2tlbiBpcyBhbGxvd2VkIHBlciBwcm9wZXJ0eSAoc2hvdWxkIGJlIGVuZm9yY2VkIG91dHNpZGUpXG4vL1xuZnVuY3Rpb24gaXNJbnZhbGlkU2luZ2xlUmFuZ2UoZmlsdGVyVmFsdWU6IHsgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yOyB2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIgfCBEYXRlIHwgYm9vbGVhbilbXSB9KTogYm9vbGVhbiB7XG5cdGNvbnN0IHNpbmdsZVZhbHVlT3BzID0gW0ZpbHRlck9wZXJhdG9yLkVRLCBGaWx0ZXJPcGVyYXRvci5MRSwgRmlsdGVyT3BlcmF0b3IuTFQsIEZpbHRlck9wZXJhdG9yLkdFLCBGaWx0ZXJPcGVyYXRvci5HVF07XG5cdGNvbnN0IHJhbmdlT3BzID0gW0ZpbHRlck9wZXJhdG9yLkJULCBGaWx0ZXJPcGVyYXRvci5OQl07XG5cblx0Y29uc3Qgb3AgPSBmaWx0ZXJWYWx1ZS5vcGVyYXRvcjtcblx0Y29uc3QgdmFsQ291bnQgPSBmaWx0ZXJWYWx1ZS52YWx1ZXM/Lmxlbmd0aCB8fCAwO1xuXG5cdC8vIFNpbmdsZS12YWx1ZSBvcGVyYXRvcnMg4oaSIG11c3QgaGF2ZSBleGFjdGx5IDEgdmFsdWVcblx0aWYgKHNpbmdsZVZhbHVlT3BzLmluY2x1ZGVzKG9wKSkge1xuXHRcdHJldHVybiB2YWxDb3VudCAhPT0gMTtcblx0fVxuXG5cdC8vIFJhbmdlIG9wZXJhdG9ycyAoQmV0d2VlbiAvIE5vdCBCZXR3ZWVuKSDihpIgbXVzdCBoYXZlIGV4YWN0bHkgMiB2YWx1ZXNcblx0aWYgKHJhbmdlT3BzLmluY2x1ZGVzKG9wKSkge1xuXHRcdHJldHVybiB2YWxDb3VudCAhPT0gMjtcblx0fVxuXG5cdC8vIEFueXRoaW5nIGVsc2UgaXMgbm90IGFsbG93ZWQgZm9yIFNpbmdsZVJhbmdlXG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRhKFxuXHR0b2tlbnM6IFRva2VuRGVmaW5pdGlvbltdLFxuXHRmaWx0ZXJWYWx1ZXM6IEVhc3lGaWx0ZXJSZXN1bHRbXCJmaWx0ZXJcIl0sXG5cdGZpbHRlckJhck1ldGFkYXRhOiBFYXN5RmlsdGVyUHJvcGVydHlNZXRhZGF0YVtdLFxuXHRzZXRNZXNzYWdlU3RyaXBGb3JWYWxpZGF0ZWRGaWx0ZXJzOiAobXNnOiBzdHJpbmcpID0+IHZvaWRcbik6IHZvaWQge1xuXHRpZiAoIWZpbHRlclZhbHVlcykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IHZpc2l0ZWRNYXBGb3JNYW5kYXRvcnlUb2tlbnM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cdGNvbnN0IG5vbkZpbHRlcmFibGVUb2tlbkxhYmVsczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3Qgc2luZ2xlUmFuZ2VUb2tlbkxhYmVsczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgaGlkZGVuRmlsdGVyVG9rZW5MYWJlbHM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IHNpbmdsZVJhbmdlVXNhZ2U6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IGZpbHRlclZhbHVlIG9mIGZpbHRlclZhbHVlcykge1xuXHRcdGNvbnN0IGZpbHRlckNyaXRlcmlhID0gZmlsdGVyQmFyTWV0YWRhdGEuZmluZCgoZmllbGQpID0+IGZpZWxkLm5hbWUgPT09IGZpbHRlclZhbHVlLm5hbWUpO1xuXHRcdGlmICghZmlsdGVyQ3JpdGVyaWEpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBub24tZmlsdGVyYWJsZSBhbmQgaGlkZGVuIGZpbHRlcnNcblx0XHRpZiAoIXByb2Nlc3NGaWx0ZXJDcml0ZXJpYShmaWx0ZXJDcml0ZXJpYSwgbm9uRmlsdGVyYWJsZVRva2VuTGFiZWxzLCBoaWRkZW5GaWx0ZXJUb2tlbkxhYmVscykpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdC8vIFZhbGlkYXRlIHNpbmdsZSByYW5nZSBmaWx0ZXJzXG5cdFx0Y29uc3QgaXNJbnZhbGlkU2luZ2xlUmFuZ2VUb2tlbiA9ICFoYW5kbGVTaW5nbGVSYW5nZUZpbHRlcihmaWx0ZXJDcml0ZXJpYSwgZmlsdGVyVmFsdWUsIHNpbmdsZVJhbmdlVG9rZW5MYWJlbHMsIHNpbmdsZVJhbmdlVXNhZ2UpO1xuXG5cdFx0Ly8gVXBkYXRlIHRva2Vuc1xuXHRcdHVwZGF0ZVRva2Vucyh0b2tlbnMsIGZpbHRlclZhbHVlLCBmaWx0ZXJDcml0ZXJpYSwgdmlzaXRlZE1hcEZvck1hbmRhdG9yeVRva2VucywgaXNJbnZhbGlkU2luZ2xlUmFuZ2VUb2tlbik7XG5cdH1cblxuXHQvLyBIYW5kbGUgdmFsaWRhdGlvbiBtZXNzYWdlc1xuXHRpZiAobm9uRmlsdGVyYWJsZVRva2VuTGFiZWxzLmxlbmd0aCA+IDAgfHwgc2luZ2xlUmFuZ2VUb2tlbkxhYmVscy5sZW5ndGggPiAwIHx8IGhpZGRlbkZpbHRlclRva2VuTGFiZWxzLmxlbmd0aCA+IDApIHtcblx0XHRzZXRNZXNzYWdlU3RyaXBGb3JWYWxpZGF0ZWRGaWx0ZXJzKFxuXHRcdFx0Z2VuZXJhdGVWYWxpZGF0aW9uTWVzc2FnZXMobm9uRmlsdGVyYWJsZVRva2VuTGFiZWxzLCBzaW5nbGVSYW5nZVRva2VuTGFiZWxzLCBoaWRkZW5GaWx0ZXJUb2tlbkxhYmVscylcblx0XHQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NGaWx0ZXJDcml0ZXJpYShcblx0ZmlsdGVyQ3JpdGVyaWE6IEVhc3lGaWx0ZXJQcm9wZXJ0eU1ldGFkYXRhLFxuXHRub25GaWx0ZXJhYmxlVG9rZW5MYWJlbHM6IHN0cmluZ1tdLFxuXHRoaWRkZW5GaWx0ZXJUb2tlbkxhYmVsczogc3RyaW5nW11cbik6IGJvb2xlYW4ge1xuXHRpZiAoZmlsdGVyQ3JpdGVyaWEuZmlsdGVyYWJsZSA9PT0gZmFsc2UpIHtcblx0XHRub25GaWx0ZXJhYmxlVG9rZW5MYWJlbHMucHVzaChmaWx0ZXJDcml0ZXJpYS5sYWJlbCB8fCBmaWx0ZXJDcml0ZXJpYS5uYW1lKTtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpZiAoZmlsdGVyQ3JpdGVyaWEuaGlkZGVuRmlsdGVyID09PSB0cnVlKSB7XG5cdFx0aGlkZGVuRmlsdGVyVG9rZW5MYWJlbHMucHVzaChmaWx0ZXJDcml0ZXJpYS5sYWJlbCB8fCBmaWx0ZXJDcml0ZXJpYS5uYW1lKTtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVG9rZW5zKFxuXHR0b2tlbnM6IFRva2VuRGVmaW5pdGlvbltdLFxuXHRmaWx0ZXJWYWx1ZTogRWFzeUZpbHRlclJlc3VsdFtcImZpbHRlclwiXVswXSxcblx0ZmlsdGVyQ3JpdGVyaWE6IEVhc3lGaWx0ZXJQcm9wZXJ0eU1ldGFkYXRhLFxuXHR2aXNpdGVkTWFwRm9yTWFuZGF0b3J5VG9rZW5zOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPixcblx0aXNJbnZhbGlkU2luZ2xlUmFuZ2VUb2tlbjogYm9vbGVhblxuKTogdm9pZCB7XG5cdGNvbnN0IHRva2VuSW5kZXggPSB0b2tlbnMuZmluZEluZGV4KCh0b2tlbikgPT4gdG9rZW4ua2V5ID09PSBmaWx0ZXJWYWx1ZS5uYW1lKTtcblx0Y29uc3Qga2V5U3BlY2lmaWNTZWxlY3RlZFZhbHVlcyA9IGNyZWF0ZUtleVNwZWNpZmljU2VsZWN0ZWRWYWx1ZXMoZmlsdGVyVmFsdWUpO1xuXG5cdGlmICh0b2tlbkluZGV4ID09PSAtMSkge1xuXHRcdC8vIEFkZCBuZXcgdG9rZW5cblx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRrZXk6IGZpbHRlclZhbHVlLm5hbWUsXG5cdFx0XHRsYWJlbDogZmlsdGVyQ3JpdGVyaWEubGFiZWwgYXMgc3RyaW5nLFxuXHRcdFx0a2V5U3BlY2lmaWNTZWxlY3RlZFZhbHVlczogaXNJbnZhbGlkU2luZ2xlUmFuZ2VUb2tlbiA/IFtdIDogW2tleVNwZWNpZmljU2VsZWN0ZWRWYWx1ZXNdLFxuXHRcdFx0dHlwZTogZmlsdGVyQ3JpdGVyaWEudHlwZSBhcyBFeGNsdWRlPFRva2VuVHlwZSwgXCJWYWx1ZUhlbHBcIj4sXG5cdFx0XHRidXN5OiBmaWx0ZXJDcml0ZXJpYS50eXBlID09PSBcIlZhbHVlSGVscFwiXG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gVXBkYXRlIGV4aXN0aW5nIHRva2VuXG5cdFx0Y29uc3QgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSW5kZXhdO1xuXHRcdGlmIChpc0ludmFsaWRTaW5nbGVSYW5nZVRva2VuKSB7XG5cdFx0XHRjdXJyZW50VG9rZW4ua2V5U3BlY2lmaWNTZWxlY3RlZFZhbHVlcyA9IFtdO1xuXHRcdH0gZWxzZSBpZiAoKGN1cnJlbnRUb2tlbi5pc1JlcXVpcmVkID8/IGZhbHNlKSAmJiAhdmlzaXRlZE1hcEZvck1hbmRhdG9yeVRva2Vuc1tjdXJyZW50VG9rZW4ua2V5XSkge1xuXHRcdFx0Y3VycmVudFRva2VuLmtleVNwZWNpZmljU2VsZWN0ZWRWYWx1ZXMgPSBba2V5U3BlY2lmaWNTZWxlY3RlZFZhbHVlc107XG5cdFx0XHR2aXNpdGVkTWFwRm9yTWFuZGF0b3J5VG9rZW5zW2N1cnJlbnRUb2tlbi5rZXldID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0KGN1cnJlbnRUb2tlbi5rZXlTcGVjaWZpY1NlbGVjdGVkVmFsdWVzIGFzIFRva2VuU2VsZWN0ZWRWYWx1ZXNEZWZpbml0aW9uW10pLnB1c2goa2V5U3BlY2lmaWNTZWxlY3RlZFZhbHVlcyk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleVNwZWNpZmljU2VsZWN0ZWRWYWx1ZXMoZmlsdGVyVmFsdWU6IEVhc3lGaWx0ZXJSZXN1bHRbXCJmaWx0ZXJcIl1bMF0pOiBUb2tlblNlbGVjdGVkVmFsdWVzRGVmaW5pdGlvbiB7XG5cdGNvbnN0IHsgb3BlcmF0b3IsIHZhbHVlcyB9ID0gZmlsdGVyVmFsdWU7XG5cblx0aWYgKEVhc3lGaWx0ZXJVdGlscy5pc0JldHdlZW5TZWxlY3RlZFZhbHVlcyhvcGVyYXRvcikpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0b3BlcmF0b3IsXG5cdFx0XHRzZWxlY3RlZFZhbHVlczogdmFsdWVzIGFzIEJldHdlZW5TZWxlY3RlZFZhbHVlc1xuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG9wZXJhdG9yOiBvcGVyYXRvciBhcyBFeGNsdWRlPEZpbHRlck9wZXJhdG9yLCBGaWx0ZXJPcGVyYXRvci5CVCB8IEZpbHRlck9wZXJhdG9yLk5CPixcblx0XHRzZWxlY3RlZFZhbHVlczogdmFsdWVzIGFzIHN0cmluZ1tdIHwgRGF0ZVtdIHwgbnVtYmVyW10gfCBib29sZWFuW11cblx0fTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVWYWxpZGF0aW9uTWVzc2FnZXMoXG5cdG5vbkZpbHRlcmFibGVUb2tlbkxhYmVsczogc3RyaW5nW10sXG5cdHNpbmdsZVJhbmdlVG9rZW5MYWJlbHM6IHN0cmluZ1tdLFxuXHRoaWRkZW5GaWx0ZXJUb2tlbkxhYmVsczogc3RyaW5nW11cbik6IHN0cmluZyB7XG5cdGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdGlmIChub25GaWx0ZXJhYmxlVG9rZW5MYWJlbHMubGVuZ3RoID4gMCkge1xuXHRcdG1lc3NhZ2VzLnB1c2gocmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIk1fRUFTWV9GSUxURVJfTk9OX0ZJTFRFUkFCTEVcIiwgW2A8c3Ryb25nPiR7bm9uRmlsdGVyYWJsZVRva2VuTGFiZWxzLmpvaW4oXCIsIFwiKX08L3N0cm9uZz5gXSkpO1xuXHR9XG5cblx0aWYgKGhpZGRlbkZpbHRlclRva2VuTGFiZWxzLmxlbmd0aCA+IDApIHtcblx0XHRtZXNzYWdlcy5wdXNoKHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX0VBU1lfRklMVEVSX0hJRERFTl9GSUxURVJcIiwgW2A8c3Ryb25nPiR7aGlkZGVuRmlsdGVyVG9rZW5MYWJlbHMuam9pbihcIiwgXCIpfTwvc3Ryb25nPmBdKSk7XG5cdH1cblxuXHRpZiAoc2luZ2xlUmFuZ2VUb2tlbkxhYmVscy5sZW5ndGggPiAwKSB7XG5cdFx0bWVzc2FnZXMucHVzaChyZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiTV9FQVNZX0ZJTFRFUl9TSU5HTEVfUkFOR0VcIiwgW2A8c3Ryb25nPiR7c2luZ2xlUmFuZ2VUb2tlbkxhYmVscy5qb2luKFwiLCBcIil9PC9zdHJvbmc+YF0pKTtcblx0fVxuXG5cdHJldHVybiBtZXNzYWdlcy5qb2luKFwiPGJyPlwiKTtcbn1cblxuY29uc3QgRWFzeUZpbHRlclV0aWxzID0ge1xuXHRhcmVJdGVtc1NhbWUsXG5cdGFyZUNvZGVMaXN0c1NhbWUsXG5cdGdldENvZGVMaXN0QXJyYXksXG5cdGFyZUFycmF5U2FtZSxcblx0bWFwT3BlcmF0b3IsXG5cdG1hcE9wZXJhdG9yRm9yQmV0d2Vlbk9wZXJhdG9yLFxuXHRpc0JldHdlZW5TZWxlY3RlZFZhbHVlcyxcblx0Zm9ybWF0RGF0YSxcblx0bWFwT3BlcmF0b3JGb3JWYWx1ZUhlbHBcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEVhc3lGaWx0ZXJVdGlscztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztFQW9CQSxNQUFNQSxjQUFjLEdBQUdDLEdBQUcsQ0FBQ0Msb0JBQW9CLENBQUMsaUJBQWlCLENBQUU7RUFDbkUsTUFBTUMsY0FBYyxHQUFHLElBQUlDLGNBQWMsQ0FBQyxDQUFDO0VBRTNDLFNBQVNDLFlBQVlBLENBQ3BCQyxJQUFvRixFQUNwRkMsSUFBb0YsRUFDMUU7SUFDVixJQUFJRCxJQUFJLENBQUNFLE1BQU0sS0FBS0QsSUFBSSxDQUFDQyxNQUFNLEVBQUU7TUFDaEMsT0FBTyxLQUFLO0lBQ2I7O0lBRUE7SUFDQSxLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0gsSUFBSSxDQUFDRSxNQUFNLEVBQUVDLENBQUMsRUFBRSxFQUFFO01BQ3JDLElBQ0NILElBQUksQ0FBQ0csQ0FBQyxDQUFDLENBQUNDLFFBQVEsS0FBS0gsSUFBSSxDQUFDRSxDQUFDLENBQUMsQ0FBQ0MsUUFBUSxJQUNyQyxDQUFDSixJQUFJLENBQUNHLENBQUMsQ0FBQyxDQUFDRSxjQUFjLENBQUNDLEtBQUssQ0FBQyxDQUFDQyxVQUFVLEVBQUVDLEtBQUssS0FBSztRQUNwRCxNQUFNQyxVQUFVLEdBQUdSLElBQUksQ0FBQ0UsQ0FBQyxDQUFDLENBQUNFLGNBQWMsQ0FBQ0csS0FBSyxDQUFDOztRQUVoRDtRQUNBLElBQUlELFVBQVUsWUFBWUcsSUFBSSxJQUFJRCxVQUFVLFlBQVlDLElBQUksRUFBRTtVQUM3RCxPQUFPQyxTQUFTLENBQUNKLFVBQVUsRUFBRUUsVUFBVSxDQUFDO1FBQ3pDOztRQUVBO1FBQ0EsSUFBSSxPQUFPRixVQUFVLEtB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