@sapui5/sap.fe.macros 1.142.0 → 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 (102) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/macros/.library +1 -1
  3. package/src/sap/fe/macros/CollaborativeDraftHandler.js +1 -7
  4. package/src/sap/fe/macros/CollaborativeDraftHandler.tsx +0 -6
  5. package/src/sap/fe/macros/ConditionalSwitch.js +1 -2
  6. package/src/sap/fe/macros/ConditionalSwitch.tsx +0 -1
  7. package/src/sap/fe/macros/ConditionalSwitchProperty.js +1 -3
  8. package/src/sap/fe/macros/ConditionalSwitchProperty.tsx +0 -2
  9. package/src/sap/fe/macros/Field.js +5 -5
  10. package/src/sap/fe/macros/Field.ts +5 -3
  11. package/src/sap/fe/macros/FooterContent.js +3 -2
  12. package/src/sap/fe/macros/FooterContent.tsx +2 -10
  13. package/src/sap/fe/macros/KPITag.js +6 -6
  14. package/src/sap/fe/macros/KPITag.tsx +5 -5
  15. package/src/sap/fe/macros/MacroAPI.js +2 -2
  16. package/src/sap/fe/macros/MacroAPI.ts +1 -1
  17. package/src/sap/fe/macros/MessageButton.js +3 -3
  18. package/src/sap/fe/macros/MessageButton.tsx +3 -2
  19. package/src/sap/fe/macros/MicroChart.js +3 -2
  20. package/src/sap/fe/macros/MicroChart.tsx +1 -1
  21. package/src/sap/fe/macros/Share.js +7 -7
  22. package/src/sap/fe/macros/Share.tsx +9 -6
  23. package/src/sap/fe/macros/Status.js +6 -5
  24. package/src/sap/fe/macros/Status.tsx +3 -4
  25. package/src/sap/fe/macros/ai/EasyFillDialog.js +2 -1
  26. package/src/sap/fe/macros/ai/EasyFillDialog.tsx +1 -0
  27. package/src/sap/fe/macros/ai/SummarizationButton.js +6 -4
  28. package/src/sap/fe/macros/ai/SummarizationButton.tsx +5 -3
  29. package/src/sap/fe/macros/chart/ChartDelegate.js +22 -1
  30. package/src/sap/fe/macros/chart/ChartDelegate.ts +29 -2
  31. package/src/sap/fe/macros/chart/MdcChartTemplate.js +5 -2
  32. package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +5 -2
  33. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.js +7 -7
  34. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.ts +3 -2
  35. package/src/sap/fe/macros/controls/FileWrapper.js +11 -5
  36. package/src/sap/fe/macros/controls/FileWrapper.ts +10 -4
  37. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.js +3 -1
  38. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.tsx +2 -0
  39. package/src/sap/fe/macros/coreUI/CreateDialog.js +2 -2
  40. package/src/sap/fe/macros/coreUI/CreateDialog.tsx +1 -1
  41. package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +4 -4
  42. package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +3 -3
  43. package/src/sap/fe/macros/field/FieldFormatOptions.js +2 -2
  44. package/src/sap/fe/macros/field/FieldFormatOptions.ts +1 -1
  45. package/src/sap/fe/macros/field/FieldRuntime.js +7 -2
  46. package/src/sap/fe/macros/field/FieldRuntime.ts +7 -1
  47. package/src/sap/fe/macros/filter/FilterUtils.js +31 -5
  48. package/src/sap/fe/macros/filter/FilterUtils.ts +40 -6
  49. package/src/sap/fe/macros/filterBar/FilterBarAPI.js +6 -3
  50. package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +5 -1
  51. package/src/sap/fe/macros/filterBar/FilterBarDelegate.js +19 -9
  52. package/src/sap/fe/macros/filterBar/FilterBarDelegate.ts +76 -61
  53. package/src/sap/fe/macros/filterBar/UOMValidationDelegate.js +376 -0
  54. package/src/sap/fe/macros/filterBar/UOMValidationDelegate.ts +463 -0
  55. package/src/sap/fe/macros/form/FormContainer.block.js +22 -6
  56. package/src/sap/fe/macros/form/FormContainer.block.ts +24 -6
  57. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +2 -2
  58. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +2 -1
  59. package/src/sap/fe/macros/library.js +5 -6
  60. package/src/sap/fe/macros/{library.ts → library.tsx} +1 -1
  61. package/src/sap/fe/macros/messagebundle.properties +6 -0
  62. package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +1 -1
  63. package/src/sap/fe/macros/messages/MessageButton.js +21 -12
  64. package/src/sap/fe/macros/messages/MessageButton.ts +21 -11
  65. package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.js +7 -3
  66. package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.ts +8 -2
  67. package/src/sap/fe/macros/quickView/QuickView.js +5 -4
  68. package/src/sap/fe/macros/quickView/QuickView.tsx +10 -3
  69. package/src/sap/fe/macros/table/Action.js +7 -4
  70. package/src/sap/fe/macros/table/Action.ts +3 -3
  71. package/src/sap/fe/macros/table/Column.js +3 -2
  72. package/src/sap/fe/macros/table/Column.ts +1 -1
  73. package/src/sap/fe/macros/table/MdcTableTemplate.js +6 -9
  74. package/src/sap/fe/macros/table/MdcTableTemplate.tsx +5 -7
  75. package/src/sap/fe/macros/table/Table.block.js +6 -3
  76. package/src/sap/fe/macros/table/Table.block.tsx +13 -3
  77. package/src/sap/fe/macros/table/TableAPI.js +13 -8
  78. package/src/sap/fe/macros/table/TableAPI.ts +10 -3
  79. package/src/sap/fe/macros/table/TableDefinition.js +2 -2
  80. package/src/sap/fe/macros/table/TableDefinition.ts +1 -1
  81. package/src/sap/fe/macros/table/TableEventHandlerProvider.js +3 -1
  82. package/src/sap/fe/macros/table/TableEventHandlerProvider.ts +4 -0
  83. package/src/sap/fe/macros/table/TableRuntime.js +24 -12
  84. package/src/sap/fe/macros/table/TableRuntime.ts +27 -11
  85. package/src/sap/fe/macros/table/Utils.js +9 -3
  86. package/src/sap/fe/macros/table/Utils.ts +14 -8
  87. package/src/sap/fe/macros/table/delegates/TableDelegate.js +6 -4
  88. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +6 -5
  89. package/src/sap/fe/macros/table/massEdit/MassEditDialog.js +41 -15
  90. package/src/sap/fe/macros/table/massEdit/MassEditDialog.tsx +41 -22
  91. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.js +14 -5
  92. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.tsx +13 -4
  93. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +2 -3
  94. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +3 -2
  95. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.js +37 -10
  96. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.ts +39 -15
  97. package/src/sap/fe/macros/table/mixin/TableHierarchy.js +3 -4
  98. package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +2 -3
  99. package/src/sap/fe/macros/table/uploadTable/UploadTableRuntime.js +5 -4
  100. package/src/sap/fe/macros/table/uploadTable/UploadTableRuntime.ts +6 -3
  101. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +17 -10
  102. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +24 -9
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/DeleteHelper", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/library", "sap/fe/macros/table/Utils", "sap/m/MessageToast", "sap/ui/core/Messaging", "../field/FieldRuntimeHelper"], function (Log, ActionRuntime, CommonUtils, BusyLocker, MetaModelConverter, deleteHelper, FPMHelper, ResourceModelHelper, FELibrary, TableUtils, MessageToast, Messaging, FieldRuntimeHelper) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controls/Any", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/DeleteHelper", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/library", "sap/fe/macros/table/Utils", "sap/m/MessageToast", "sap/ui/core/Messaging", "../field/FieldRuntimeHelper"], function (Log, ActionRuntime, CommonUtils, BusyLocker, Any, MetaModelConverter, deleteHelper, FPMHelper, ResourceModelHelper, FELibrary, TableUtils, MessageToast, Messaging, FieldRuntimeHelper) {
6
6
  "use strict";
7
7
 
8
8
  const CreationMode = FELibrary.CreationMode;
@@ -48,7 +48,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
48
48
  }
49
49
  const tableDefinition = tableAPI.tableDefinition;
50
50
  const collectionEntity = MetaModelConverter.convertTypes(metaModel).resolvePath(tableDefinition.annotation.collection).target;
51
- const sUpdatablePath = tableDefinition.annotation.updatablePropertyPath;
52
51
  const aActionsMultiselectDisabled = table.data("actionsMultiselectDisabled")?.split(",") ?? [];
53
52
  const oActionOperationAvailableMap = JSON.parse(tableDefinition.operationAvailableMap || "{}");
54
53
  const oNavigationAvailableMap = table.data("navigationAvailableMap");
@@ -102,7 +101,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
102
101
  oInternalModelContext.setProperty("", oModelObject);
103
102
  }
104
103
  }
105
- if (this.isUpdatableContext(sUpdatablePath, oSelectedContext, bReadOnlyDraftEnabled)) {
104
+ if (this.isUpdatableContext(tableDefinition.annotation.updatablePropertyPathInfo, oSelectedContext, bReadOnlyDraftEnabled)) {
106
105
  aUpdatableContexts.push(oSelectedContext);
107
106
  }
108
107
  }
@@ -128,24 +127,37 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
128
127
  return ActionRuntime.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, activeSelectedContexts, "table");
129
128
  },
130
129
  /**
131
- * Checks, if the selected context is updatable for Mass Edit.
132
- * @param updatablePropertyPath The updatablePropertyPath from the table annotation
130
+ * Checks if the selected context is updatable for Mass Edit.
131
+ * @param updatablePropertyPathInfo The updatablePropertyPathInfo from the table annotation
133
132
  * @param selectedContext The selected context
134
133
  * @param readOnlyDraftEnabled Indicates, if the table is read only and draft enabled
135
134
  * @returns Boolean Indicating context is updatable
136
135
  */
137
- isUpdatableContext: function (updatablePropertyPath, selectedContext, readOnlyDraftEnabled) {
136
+
137
+ isUpdatableContext: function (updatablePropertyPathInfo, selectedContext, readOnlyDraftEnabled) {
138
138
  /* The updatable contexts with mass edit depend on the following:
139
- 1. Update is dependent on current entity property (updatablePath).
140
- 2. The table is read only and draft enabled (like LR), in this case only active contexts can be mass edited (not draft contexts).
139
+ 1. The update is dependent on current entity property (updatablePaths).
140
+ 2. The table is read only and draft enabled (such as on the list report page). Only active contexts can be used with mass edit (not draft contexts).
141
141
  So, update depends on 'IsActiveEntity', 'HasDraftEntity' value which needs to be checked. */
142
142
  const contextData = selectedContext.getObject();
143
- const updatableByPath = updatablePropertyPath.length === 0 || !!selectedContext.getProperty(updatablePropertyPath);
144
143
  const notDraftInReadOnlyMode = !readOnlyDraftEnabled || contextData.IsActiveEntity && !contextData.HasDraftEntity;
145
- if (updatableByPath && notDraftInReadOnlyMode) {
144
+ if (!notDraftInReadOnlyMode) {
145
+ return false;
146
+ }
147
+ if (!updatablePropertyPathInfo || updatablePropertyPathInfo.paths.length === 0) {
146
148
  return true;
147
149
  }
148
- return false;
150
+ if (updatablePropertyPathInfo.isPathAnnotationExpression) {
151
+ return !!selectedContext.getProperty(updatablePropertyPathInfo.paths[0]);
152
+ }
153
+ const anyObject = new Any({
154
+ anyBoolean: updatablePropertyPathInfo.bindingExpression
155
+ });
156
+ anyObject.setModel(selectedContext.getModel());
157
+ anyObject.setBindingContext(selectedContext);
158
+ const isUpdatable = anyObject.getBinding("anyBoolean").getExternalValue();
159
+ anyObject.destroy();
160
+ return !!isUpdatable;
149
161
  },
150
162
  /**
151
163
  * Checks if the node is movable according to the custom logic (if any).
@@ -566,4 +578,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
566
578
  };
567
579
  return TableRuntime;
568
580
  }, false);
569
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJUYWJsZVJ1bnRpbWUiLCJleGVjdXRlQ29uZGl0aW9uYWxBY3Rpb25TaG9ydGN1dCIsInNCdXR0b25NYXRjaGVyIiwib1NvdXJjZSIsIm9NZGNUYWJsZSIsImdldFBhcmVudCIsIkNyZWF0aW9uUm93Iiwib0J1dHRvbiIsImdldEFjdGlvbnMiLCJyZWR1Y2UiLCJhQWN0aW9uQnV0dG9ucyIsIm9BY3Rpb25Ub29sYmFyQWN0aW9uIiwiY29uY2F0IiwiZ2V0QWN0aW9uIiwiZmluZCIsIm9BY3Rpb25CdXR0b24iLCJnZXRJZCIsImVuZHNXaXRoIiwiQ29tbW9uVXRpbHMiLCJmaXJlQnV0dG9uUHJlc3MiLCJvQ3JlYXRpb25Sb3ciLCJnZXRBZ2dyZWdhdGlvbiIsImdldEFwcGx5RW5hYmxlZCIsImdldFZpc2libGUiLCJmaXJlQXBwbHkiLCJzZXRDb250ZXh0cyIsImV2ZW50Iiwic291cmNlIiwiZ2V0U291cmNlIiwidGFibGUiLCJCdXN5TG9ja2VyIiwibG9jayIsInNldENvbnRleHRzQXN5bmMiLCJlcnJvciIsIkxvZyIsInVubG9jayIsIm1ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwidGFibGVBUEkiLCJ0YWJsZURlZmluaXRpb24iLCJjb2xsZWN0aW9uRW50aXR5IiwiTWV0YU1vZGVsQ29udmVydGVyIiwiY29udmVydFR5cGVzIiwicmVzb2x2ZVBhdGgiLCJhbm5vdGF0aW9uIiwiY29sbGVjdGlvbiIsInRhcmdldCIsInNVcGRhdGFibGVQYXRoIiwidXBkYXRhYmxlUHJvcGVydHlQYXRoIiwiYUFjdGlvbnNNdWx0aXNlbGVjdERpc2FibGVkIiwiZGF0YSIsInNwbGl0Iiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsIkpTT04iLCJwYXJzZSIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsIm9OYXZpZ2F0aW9uQXZhaWxhYmxlTWFwIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiYURlbGV0YWJsZUNvbnRleHRzIiwiYlJlYWRPbmx5RHJhZnRFbmFibGVkIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJhVXBkYXRhYmxlQ29udGV4dHMiLCJvRHluYW1pY0FjdGlvbnMiLCJvSUJOIiwib0ludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJkZWxldGVIZWxwZXIiLCJ1cGRhdGVEZWxldGVJbmZvRm9yU2VsZWN0ZWRDb250ZXh0cyIsImFjdGl2ZVNlbGVjdGVkQ29udGV4dHMiLCJmaWx0ZXIiLCJvQ29udGV4dCIsImlzSW5hY3RpdmUiLCJvTW9kZWxPYmplY3QiLCJPYmplY3QiLCJhc3NpZ24iLCJnZXRPYmplY3QiLCJzZWxlY3RlZENvbnRleHRzIiwic2VsZWN0ZWRDb250ZXh0c0luY2x1ZGluZ0luYWN0aXZlIiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwibGVuZ3RoIiwiZHluYW1pY0FjdGlvbnMiLCJpYm4iLCJkZWxldGVFbmFibGVkIiwiZGVsZXRhYmxlQ29udGV4dHMiLCJ1blNhdmVkQ29udGV4dHMiLCJsb2NrZWRDb250ZXh0cyIsImRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUiLCJkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlIiwiY29udHJvbElkIiwidXBkYXRhYmxlQ29udGV4dHMiLCJwYXN0ZUF1dGhvcml6ZWQiLCJwYXN0ZUZyb21Db3B5QXV0b3JpemVkIiwic2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvciIsImdldFByb3BlcnR5IiwidW5kZWZpbmVkIiwibm9kZVVwZGF0ZXNJbmZvIiwib1NlbGVjdGVkQ29udGV4dCIsIm9Db250ZXh0RGF0YSIsImtleSIsImluZGV4T2YiLCJzQWN0aW9uUGF0aCIsInN1YnN0cmluZyIsImVuYWJsZWQiLCJzZXRQcm9wZXJ0eSIsImlzVXBkYXRhYmxlQ29udGV4dCIsInB1c2giLCJzZXRJbnRlbnRCYXNlZE5hdmlnYXRpb25FbmFibGVtZW50IiwiZGlzYWJsZUFjdGlvbiIsImNvbnRyb2wiLCJjcmVhdGVFbmFibGVtZW50IiwicGFyZW50Q29udGV4dCIsIl91cGRhdGVDcmVhdGVFbmFibGVtZW50Iiwibm9kZVR5cGUiLCJ1cGRhdGVDdXRDb3B5UGFzdGVFbmFibGVtZW50IiwidXBkYXRlTW92ZVVwRG93bkVuYWJsZW1lbnQiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudCIsInNlbGVjdGVkQ29udGV4dCIsInJlYWRPbmx5RHJhZnRFbmFibGVkIiwiY29udGV4dERhdGEiLCJ1cGRhdGFibGVCeVBhdGgiLCJub3REcmFmdEluUmVhZE9ubHlNb2RlIiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsImNoZWNrSWZOb2RlSXNNb3ZhYmxlIiwibm9kZSIsImlzTm9kZU1vdmFibGVGdW5jdGlvbiIsImdldFRhYmxlRGVmaW5pdGlvbiIsImlzTm9kZU1vdmFibGUiLCJub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uIiwiRlBNSGVscGVyIiwiZ2V0Q3VzdG9tRnVuY3Rpb24iLCJtb2R1bGVOYW1lIiwibWV0aG9kTmFtZSIsIndhcm5pbmciLCJjaGVja0lmTm9kZUlzQ29weWFibGUiLCJpc05vZGVDb3B5YWJsZUZ1bmN0aW9uIiwiaXNOb2RlQ29weWFibGUiLCJtb2RlbE9iamVjdCIsImZvckNvbnRleHRNZW51IiwiYXJndW1lbnRzIiwiY29udGV4dG1lbnUiLCJ0eXBlIiwidmlldyIsImdldFRhcmdldFZpZXciLCJpc1ZpZXdFZGl0YWJsZSIsImdldElzRWRpdGFibGUiLCJnZXRDb250cm9sbGVyTmFtZSIsImNoZWNrRHJhZnRJbnN0YW5jZSIsImdldFJvd0JpbmRpbmciLCJpc1JlbGF0aXZlIiwicGFzdGFibGVDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImNvbnRleHQiLCJtYXAiLCJwYXN0YWJsZUNvbnRleHQiLCJnZXRQYXRoIiwiaW5jbHVkZXMiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiUmVzb3VyY2VNb2RlbEhlbHBlciIsImdldFJlc291cmNlTW9kZWwiLCJnZXRUZXh0IiwiY29weUN1dFBhc3RlRW5hYmxlbWVudEluZm8iLCJkYXRhTW9kZWxzcmMiLCJjdXRhYmxlQ29udGV4dHMiLCJjb3B5YWJsZUNvbnRleHRzIiwiY3V0RW5hYmxlbWVudCIsImNvcHlFbmFibGVtZW50IiwibGFzdEFjdGlvbiIsInBhc3RlRW5hYmxlbWVudCIsImNvbnRleHRzZm9yUGFzdGFibGVFbmFibGVtZW50IiwiZXh0ZW5zaW9uUG9pbnQiLCJpc01vdmVUb1Bvc2l0aW9uQWxsb3dlZCIsImlzQ29weVRvUG9zaXRpb25BbGxvd2VkIiwidGFyZ2V0Q29udGV4dCIsIm1vZGVsT2JqZWN0UGF0aCIsImNoYW5nZVNpYmxpbmdGb3JSb290c1N1cHBvcnRlZCIsInNpbmdsZUNvbnRleHRNb3ZhYmxlVXAiLCJzaW5nbGVDb250ZXh0TW92YWJsZURvd24iLCJtb3ZlZENvbnRleHQiLCJtb3ZhYmxlRHJhZnQiLCJvdXRPZlBsYWNlQ29udGV4dCIsImlzVHJhbnNpZW50IiwiY3VzdG9tTW92YWJsZSIsImlzRGVsZXRlZCIsImdldFNpYmxpbmciLCJpbnRlcm5hbENvbnRleHQiLCJjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2siLCJub2RlVHlwZVBhcmFtZXRlcnMiLCJwb3NzaWJsZVZhbHVlcyIsInZhbHVlcyIsIm9wdGlvbiIsInZhbHVlIiwiZW5hYmxlbWVudEZ1bmN0aW9uIiwiZW5hYmxlZEZsYWdzIiwiX2Vycm9yIiwiZW5hYmxlbWVudE1hcCIsInNvbWUiLCJmbGFnIiwiZm9yRWFjaCIsImluZGV4IiwiY29udGV4dFBhdGgiLCJjbGVhclNlbGVjdGlvbiIsImludGVybmFsTW9kZWxDb250ZXh0Iiwic0FjdGlvbiIsImJFbmFibGVkIiwib25GaWVsZENoYW5nZUluQ3JlYXRpb25Sb3ciLCJvRXZlbnQiLCJ3aXRoQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwibUZpZWxkIiwiRmllbGRSdW50aW1lSGVscGVyIiwiZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlIiwib1NvdXJjZUZpZWxkIiwiZmllbGQiLCJzRmllbGRJZCIsIm1GaWVsZFZhbGlkaXR5IiwibU5ld0ZpZWxkVmFsaWRpdHkiLCJzdGF0ZSIsIm1DdXN0b21WYWxpZGl0eSIsIm1OZXdDdXN0b21WYWxpZGl0eSIsImdldEJpbmRpbmciLCJmaWVsZElkIiwic1RhcmdldCIsImdldEJpbmRpbmdQYXRoIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsIm9NZXNzYWdlIiwiZ2V0VGFyZ2V0cyIsInJlbW92ZU1lc3NhZ2VzIiwib25UcmVlVGFibGVDb250ZXh0Q2hhbmdlZCIsImluaXRpYWxFeHBhbnNpb25MZXZlbCIsInJvd0JpbmRpbmciLCJnZXRDb250ZXh0IiwiZ2V0SWdub3JlQ29udGV4dENoYW5nZUV2ZW50IiwiYWdncmVnYXRpb24iLCJmaWx0ZXJJbmZvIiwiVGFibGVVdGlscyIsImdldEFsbEZpbHRlckluZm8iLCJleHBhbmRUbyIsInNlYXJjaCIsIk51bWJlciIsIk1BWF9TQUZFX0lOVEVHRVIiLCJzZXRBZ2dyZWdhdGlvbiIsIm9uQ3JlYXRlTWVudUl0ZW1QcmVzcyIsInZhbHVlSW5kZXgiLCJtZGNUYWJsZSIsImdldE1kY1RhYmxlIiwiY3JlYXRpb25EYXRhIiwicHJvcGVydHlOYW1lIiwiY3JlYXRpb25QYXJhbWV0ZXJzIiwiY3JlYXRpb25Nb2RlIiwiY3JlYXRlIiwibW9kZSIsInRhYmxlSWQiLCJDcmVhdGlvbkRpYWxvZyIsImNyZWF0aW9uRGlhbG9nRmllbGRzIiwicmViaW5kIiwiZ2V0Q29udHJvbGxlciIsImVkaXRGbG93IiwiY3JlYXRlRG9jdW1lbnQiLCJjYXRjaCIsIm9uQ3JlYXRlQnV0dG9uUHJlc3MiLCJFeHRlcm5hbCIsIm91dGJvdW5kIiwiY3JlYXRpb25Sb3ciLCJjcmVhdGVBdEVuZCIsIk5ld1BhZ2UiLCJJbmxpbmUiLCJJbmxpbmVDcmVhdGlvblJvd3MiLCJjcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyIsIm5hdmlnYXRpb25BdmFpbGFibGVNYXAiLCJzS2V5IiwiYUFwcGxpY2FibGUiLCJhTm90QXBwbGljYWJsZSIsImJFbmFibGVkRm9yQ29udGV4dE1lbnUiLCJhQXBwbGljYWJsZUZvckNvbnRleHRNZW51IiwiYU5vdEFwcGxpY2FibGVGb3JDb250ZXh0TWVudSIsInNQcm9wZXJ0eSIsImVuYWJsZWRQcm9wZXJ0eSIsImFwcGxpY2FibGVQcm9wZXJ0eSIsIm5vdEFwcGxpY2FibGVQcm9wZXJ0eSIsIm9uQ29udGV4dE1lbnVJdGVtU2VsZWN0ZWQiLCJzZXRDb250ZXh0TWVudUFjdGl2ZSIsInNldFRpbWVvdXQiLCJkYXRhU3RhdGVJbmRpY2F0b3JGaWx0ZXIiLCJtZXNzYWdlIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJUYWJsZVJ1bnRpbWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcInNhcC9mZS9jb3JlL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IENyZWF0ZUJlaGF2aW9yRXh0ZXJuYWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vVGFibGVcIjtcbmltcG9ydCBkZWxldGVIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRGVsZXRlSGVscGVyXCI7XG5pbXBvcnQgRlBNSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0ZQTUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IFRhYmxlVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVXRpbHNcIjtcbmltcG9ydCB0eXBlIE1lbnVJdGVtIGZyb20gXCJzYXAvbS9NZW51SXRlbVwiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgTURDVGFibGUsIGRlZmF1bHQgYXMgVGFibGUgfSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQWN0aW9uVG9vbGJhckFjdGlvbiBmcm9tIFwic2FwL3VpL21kYy9hY3Rpb250b29sYmFyL0FjdGlvblRvb2xiYXJBY3Rpb25cIjtcbmltcG9ydCB0eXBlIENyZWF0aW9uUm93IGZyb20gXCJzYXAvdWkvbWRjL3RhYmxlL0NyZWF0aW9uUm93XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBFdmVudFR5cGUgfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgdHlwZSBGaWVsZCBmcm9tIFwiLi4vRmllbGRcIjtcbmltcG9ydCBGaWVsZFJ1bnRpbWVIZWxwZXIgZnJvbSBcIi4uL2ZpZWxkL0ZpZWxkUnVudGltZUhlbHBlclwiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlO1xuLyoqXG4gKiBTdGF0aWMgY2xhc3MgdXNlZCBieSB0aGUgVGFibGUgYnVpbGRpbmcgYmxvY2sgZHVyaW5nIHJ1bnRpbWVcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IFRhYmxlUnVudGltZSA9IHtcblx0ZXhlY3V0ZUNvbmRpdGlvbmFsQWN0aW9uU2hvcnRjdXQ6IGZ1bmN0aW9uIChzQnV0dG9uTWF0Y2hlcjogc3RyaW5nLCBvU291cmNlOiBDb250cm9sKTogdm9pZCB7XG5cdFx0Ly8gR2V0IHRoZSBidXR0b24gcmVsYXRlZCB0byBrZXlib2FyZCBzaG9ydGN1dFxuXHRcdGNvbnN0IG9NZGNUYWJsZSA9IG9Tb3VyY2UuZ2V0UGFyZW50KCkgYXMgTURDVGFibGU7XG5cdFx0aWYgKHNCdXR0b25NYXRjaGVyICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cpIHtcblx0XHRcdGNvbnN0IG9CdXR0b24gPSBvTWRjVGFibGVcblx0XHRcdFx0LmdldEFjdGlvbnMoKVxuXHRcdFx0XHQucmVkdWNlKGZ1bmN0aW9uIChhQWN0aW9uQnV0dG9uczogQ29udHJvbFtdLCBvQWN0aW9uVG9vbGJhckFjdGlvbjogQ29udHJvbCkge1xuXHRcdFx0XHRcdHJldHVybiBhQWN0aW9uQnV0dG9ucy5jb25jYXQoKG9BY3Rpb25Ub29sYmFyQWN0aW9uIGFzIEFjdGlvblRvb2xiYXJBY3Rpb24pLmdldEFjdGlvbigpKTtcblx0XHRcdFx0fSwgW10gYXMgQ29udHJvbFtdKVxuXHRcdFx0XHQuZmluZChmdW5jdGlvbiAob0FjdGlvbkJ1dHRvbjogQ29udHJvbCkge1xuXHRcdFx0XHRcdHJldHVybiBvQWN0aW9uQnV0dG9uLmdldElkKCkuZW5kc1dpdGgoc0J1dHRvbk1hdGNoZXIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdENvbW1vblV0aWxzLmZpcmVCdXR0b25QcmVzcyhvQnV0dG9uKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93ID0gb01kY1RhYmxlLmdldEFnZ3JlZ2F0aW9uKFwiY3JlYXRpb25Sb3dcIikgYXMgQ3JlYXRpb25Sb3c7XG5cdFx0XHRpZiAob0NyZWF0aW9uUm93ICYmIG9DcmVhdGlvblJvdy5nZXRBcHBseUVuYWJsZWQoKSAmJiBvQ3JlYXRpb25Sb3cuZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRcdG9DcmVhdGlvblJvdy5maXJlQXBwbHkoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0c2V0Q29udGV4dHM6IGFzeW5jIGZ1bmN0aW9uIChldmVudDogVUk1RXZlbnQ8e30sIFRhYmxlPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IHRhYmxlID0gc291cmNlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0YWJsZSk7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IFRhYmxlUnVudGltZS5zZXRDb250ZXh0c0FzeW5jKHRhYmxlKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRhYmxlKTtcblx0XHR9XG5cdH0sXG5cblx0c2V0Q29udGV4dHNBc3luYzogYXN5bmMgZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSk6IFByb21pc2U8dm9pZFtdIHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gdGFibGUuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgdW5kZWZpbmVkIHwgT0RhdGFNZXRhTW9kZWw7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRpZiAoIXRhYmxlQVBJIHx8ICFtZXRhTW9kZWwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgdGFibGVEZWZpbml0aW9uID0gdGFibGVBUEkudGFibGVEZWZpbml0aW9uO1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRpdHkgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuY29udmVydFR5cGVzKG1ldGFNb2RlbCkucmVzb2x2ZVBhdGg8RW50aXR5U2V0Pihcblx0XHRcdHRhYmxlRGVmaW5pdGlvbi5hbm5vdGF0aW9uLmNvbGxlY3Rpb25cblx0XHQpLnRhcmdldDtcblx0XHRjb25zdCBzVXBkYXRhYmxlUGF0aCA9IHRhYmxlRGVmaW5pdGlvbi5hbm5vdGF0aW9uLnVwZGF0YWJsZVByb3BlcnR5UGF0aDtcblxuXHRcdGNvbnN0IGFBY3Rpb25zTXVsdGlzZWxlY3REaXNhYmxlZCA9IHRhYmxlLmRhdGEoXCJhY3Rpb25zTXVsdGlzZWxlY3REaXNhYmxlZFwiKT8uc3BsaXQoXCIsXCIpID8/IFtdO1xuXHRcdGNvbnN0IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAgPSBKU09OLnBhcnNlKHRhYmxlRGVmaW5pdGlvbi5vcGVyYXRpb25BdmFpbGFibGVNYXAgfHwgXCJ7fVwiKTtcblx0XHRjb25zdCBvTmF2aWdhdGlvbkF2YWlsYWJsZU1hcCA9IHRhYmxlLmRhdGEoXCJuYXZpZ2F0aW9uQXZhaWxhYmxlTWFwXCIpO1xuXG5cdFx0Y29uc3QgYVNlbGVjdGVkQ29udGV4dHMgPSB0YWJsZS5nZXRTZWxlY3RlZENvbnRleHRzKCkgYXMgQ29udGV4dFtdO1xuXHRcdGNvbnN0IGFEZWxldGFibGVDb250ZXh0czogQ29udGV4dFtdID0gW107XG5cdFx0Y29uc3QgYlJlYWRPbmx5RHJhZnRFbmFibGVkID1cblx0XHRcdHRhYmxlLmRhdGEoXCJkaXNwbGF5TW9kZVByb3BlcnR5QmluZGluZ1wiKSA9PT0gXCJ0cnVlXCIgJiYgISFjb2xsZWN0aW9uRW50aXR5Py5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Um9vdDtcblx0XHRjb25zdCBhVXBkYXRhYmxlQ29udGV4dHM6IENvbnRleHRbXSA9IFtdO1xuXHRcdC8vIG9EeW5hbWljQWN0aW9ucyBhcmUgYm91bmQgYWN0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgYWNjb3JkaW5nIHRvIHNvbWUgcHJvcGVydHlcblx0XHQvLyBpbiBlYWNoIGl0ZW1cblx0XHRjb25zdCBvRHluYW1pY0FjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgYkVuYWJsZWQ/OiBib29sZWFuIH0+IHwgdW5kZWZpbmVkID0ge307XG5cdFx0Y29uc3Qgb0lCTiA9IHt9O1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cblx0XHRpZiAoIW9JbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBmb3IgdGhlIGRlbGV0ZSB3ZSBjb25zaWRlciB0aGUgaW5hY3RpdmUgY29udGV4dHMgYXMgcG90ZW50aWFsbHkgcGFydCBvZiB0aGUgc2VsZWN0ZWQgY29udGV4dHNcblx0XHRkZWxldGVIZWxwZXIudXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBhU2VsZWN0ZWRDb250ZXh0cyk7XG5cblx0XHQvL2RvIG5vdCBjb25zaWRlciBlbXB0eSByb3dzIGFzIHNlbGVjdGVkIGNvbnRleHQsIGZvciB0aGUgb3RoZXIgYWN0aW9uc1xuXHRcdGNvbnN0IGFjdGl2ZVNlbGVjdGVkQ29udGV4dHMgPSBhU2VsZWN0ZWRDb250ZXh0cy5maWx0ZXIoZnVuY3Rpb24gKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gIW9Db250ZXh0LmlzSW5hY3RpdmUoKTtcblx0XHR9KTtcblxuXHRcdGNvbnN0IG9Nb2RlbE9iamVjdCA9IE9iamVjdC5hc3NpZ24ob0ludGVybmFsTW9kZWxDb250ZXh0LmdldE9iamVjdCgpIHx8IHt9LCB7XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzOiBhY3RpdmVTZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0c2VsZWN0ZWRDb250ZXh0c0luY2x1ZGluZ0luYWN0aXZlOiBhU2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0czogYWN0aXZlU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGgsXG5cdFx0XHRkeW5hbWljQWN0aW9uczogb0R5bmFtaWNBY3Rpb25zLFxuXHRcdFx0aWJuOiBvSUJOLFxuXHRcdFx0ZGVsZXRlRW5hYmxlZDogdHJ1ZSxcblx0XHRcdGRlbGV0YWJsZUNvbnRleHRzOiBhRGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHR1blNhdmVkQ29udGV4dHM6IFtdLFxuXHRcdFx0bG9ja2VkQ29udGV4dHM6IFtdLFxuXHRcdFx0ZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZTogW10sXG5cdFx0XHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlOiBbXSxcblx0XHRcdGNvbnRyb2xJZDogXCJcIixcblx0XHRcdHVwZGF0YWJsZUNvbnRleHRzOiBhVXBkYXRhYmxlQ29udGV4dHMsXG5cdFx0XHRwYXN0ZUF1dGhvcml6ZWQ6IHRydWUsXG5cdFx0XHRwYXN0ZUZyb21Db3B5QXV0b3JpemVkOiB0cnVlLFxuXHRcdFx0c2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvcjogb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwic2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvclwiKVxuXHRcdFx0XHQ/IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcInNlbWFudGljS2V5SGFzRHJhZnRJbmRpY2F0b3JcIilcblx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHR9KTtcblx0XHRvTW9kZWxPYmplY3Qubm9kZVVwZGF0ZXNJbmZvID0gb01vZGVsT2JqZWN0Lm5vZGVVcGRhdGVzSW5mbyB8fCB7fTtcblxuXHRcdGZvciAoY29uc3Qgb1NlbGVjdGVkQ29udGV4dCBvZiBhY3RpdmVTZWxlY3RlZENvbnRleHRzKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gb0NvbnRleHREYXRhKSB7XG5cdFx0XHRcdGlmIChrZXkuaW5kZXhPZihcIiNcIikgPT09IDApIHtcblx0XHRcdFx0XHRsZXQgc0FjdGlvblBhdGg6IHN0cmluZyA9IGtleTtcblx0XHRcdFx0XHRzQWN0aW9uUGF0aCA9IHNBY3Rpb25QYXRoLnN1YnN0cmluZygxLCBzQWN0aW9uUGF0aC5sZW5ndGgpO1xuXHRcdFx0XHRcdG9Nb2RlbE9iamVjdC5keW5hbWljQWN0aW9uc1tzQWN0aW9uUGF0aF0gPSB7IGVuYWJsZWQ6IHRydWUgfTtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJcIiwgb01vZGVsT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuaXNVcGRhdGFibGVDb250ZXh0KHNVcGRhdGFibGVQYXRoLCBvU2VsZWN0ZWRDb250ZXh0LCBiUmVhZE9ubHlEcmFmdEVuYWJsZWQpKSB7XG5cdFx0XHRcdGFVcGRhdGFibGVDb250ZXh0cy5wdXNoKG9TZWxlY3RlZENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghdGFibGUuZGF0YShcImVuYWJsZUFuYWx5dGljc1wiKSkge1xuXHRcdFx0VGFibGVSdW50aW1lLnNldEludGVudEJhc2VkTmF2aWdhdGlvbkVuYWJsZW1lbnQob0ludGVybmFsTW9kZWxDb250ZXh0LCBvTmF2aWdhdGlvbkF2YWlsYWJsZU1hcCwgYWN0aXZlU2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFjdGl2ZVNlbGVjdGVkQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0dGhpcy5kaXNhYmxlQWN0aW9uKGFBY3Rpb25zTXVsdGlzZWxlY3REaXNhYmxlZCwgb0R5bmFtaWNBY3Rpb25zKTtcblx0XHR9XG5cblx0XHRpZiAob01vZGVsT2JqZWN0KSB7XG5cdFx0XHRvTW9kZWxPYmplY3RbXCJ1cGRhdGFibGVDb250ZXh0c1wiXSA9IGFVcGRhdGFibGVDb250ZXh0cztcblx0XHRcdG9Nb2RlbE9iamVjdFtcImNvbnRyb2xJZFwiXSA9IHRhYmxlLmdldElkKCk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJcIiwgb01vZGVsT2JqZWN0KTtcblx0XHR9XG5cblx0XHQvLyBNYW5hZ2UgYSBwb3RlbnRpYWwgY2FsbGJhY2sgdG8gZW5hYmxlL2Rpc2FibGUgdGhlIGNyZWF0ZSBidXR0b24vbWVudSBmb3IgYSBUcmVlVGFibGVcblx0XHRpZiAoYWN0aXZlU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPD0gMSAmJiB0YWJsZURlZmluaXRpb24uY29udHJvbC5jcmVhdGVFbmFibGVtZW50KSB7XG5cdFx0XHRjb25zdCBwYXJlbnRDb250ZXh0ID0gYWN0aXZlU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPyBhY3RpdmVTZWxlY3RlZENvbnRleHRzWzBdIDogbnVsbDtcblx0XHRcdHRoaXMuX3VwZGF0ZUNyZWF0ZUVuYWJsZW1lbnQoXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0dGFibGVEZWZpbml0aW9uLmNvbnRyb2wuY3JlYXRlRW5hYmxlbWVudCxcblx0XHRcdFx0dGFibGUsXG5cdFx0XHRcdHBhcmVudENvbnRleHQsXG5cdFx0XHRcdHRhYmxlRGVmaW5pdGlvbi5jb250cm9sLm5vZGVUeXBlXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlQ3V0Q29weVBhc3RlRW5hYmxlbWVudChvTW9kZWxPYmplY3QsIHRhYmxlKTtcblx0XHR0aGlzLnVwZGF0ZU1vdmVVcERvd25FbmFibGVtZW50KG9Nb2RlbE9iamVjdCwgdGFibGUpO1xuXHRcdHJldHVybiBBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQob0ludGVybmFsTW9kZWxDb250ZXh0LCBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBhY3RpdmVTZWxlY3RlZENvbnRleHRzLCBcInRhYmxlXCIpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3MsIGlmIHRoZSBzZWxlY3RlZCBjb250ZXh0IGlzIHVwZGF0YWJsZSBmb3IgTWFzcyBFZGl0LlxuXHQgKiBAcGFyYW0gdXBkYXRhYmxlUHJvcGVydHlQYXRoIFRoZSB1cGRhdGFibGVQcm9wZXJ0eVBhdGggZnJvbSB0aGUgdGFibGUgYW5ub3RhdGlvblxuXHQgKiBAcGFyYW0gc2VsZWN0ZWRDb250ZXh0IFRoZSBzZWxlY3RlZCBjb250ZXh0XG5cdCAqIEBwYXJhbSByZWFkT25seURyYWZ0RW5hYmxlZCBJbmRpY2F0ZXMsIGlmIHRoZSB0YWJsZSBpcyByZWFkIG9ubHkgYW5kIGRyYWZ0IGVuYWJsZWRcblx0ICogQHJldHVybnMgQm9vbGVhbiBJbmRpY2F0aW5nIGNvbnRleHQgaXMgdXBkYXRhYmxlXG5cdCAqL1xuXHRpc1VwZGF0YWJsZUNvbnRleHQ6IGZ1bmN0aW9uICh1cGRhdGFibGVQcm9wZXJ0eVBhdGg6IHN0cmluZywgc2VsZWN0ZWRDb250ZXh0OiBDb250ZXh0LCByZWFkT25seURyYWZ0RW5hYmxlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xuXHRcdC8qIFRoZSB1cGRhdGFibGUgY29udGV4dHMgd2l0aCBtYXNzIGVkaXQgZGVwZW5kIG9uIHRoZSBmb2xsb3dpbmc6XG5cdFx0IFx0MS4gVXBkYXRlIGlzIGRlcGVuZGVudCBvbiBjdXJyZW50IGVudGl0eSBwcm9wZXJ0eSAodXBkYXRhYmxlUGF0aCkuXG5cdFx0IFx0Mi4gVGhlIHRhYmxlIGlzIHJlYWQgb25seSBhbmQgZHJhZnQgZW5hYmxlZCAobGlrZSBMUiksIGluIHRoaXMgY2FzZSBvbmx5IGFjdGl2ZSBjb250ZXh0cyBjYW4gYmUgbWFzcyBlZGl0ZWQgKG5vdCBkcmFmdCBjb250ZXh0cykuXG5cdFx0ICAgIFNvLCB1cGRhdGUgZGVwZW5kcyBvbiAnSXNBY3RpdmVFbnRpdHknLCAnSGFzRHJhZnRFbnRpdHknICB2YWx1ZSB3aGljaCBuZWVkcyB0byBiZSBjaGVja2VkLiAqL1xuXHRcdGNvbnN0IGNvbnRleHREYXRhID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdGNvbnN0IHVwZGF0YWJsZUJ5UGF0aCA9IHVwZGF0YWJsZVByb3BlcnR5UGF0aC5sZW5ndGggPT09IDAgfHwgISFzZWxlY3RlZENvbnRleHQuZ2V0UHJvcGVydHkodXBkYXRhYmxlUHJvcGVydHlQYXRoKTtcblx0XHRjb25zdCBub3REcmFmdEluUmVhZE9ubHlNb2RlID0gIXJlYWRPbmx5RHJhZnRFbmFibGVkIHx8IChjb250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiAhY29udGV4dERhdGEuSGFzRHJhZnRFbnRpdHkpO1xuXHRcdGlmICh1cGRhdGFibGVCeVBhdGggJiYgbm90RHJhZnRJblJlYWRPbmx5TW9kZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBub2RlIGlzIG1vdmFibGUgYWNjb3JkaW5nIHRvIHRoZSBjdXN0b20gbG9naWMgKGlmIGFueSkuXG5cdCAqIEBwYXJhbSBub2RlXG5cdCAqIEBwYXJhbSB0YWJsZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjdXN0b20gbG9naWMgYWxsb3dzIHRoZSBub2RlIHRvIGJlIG1vdmVkIChvciBpZiB0aGVyZSdzIG5vIGN1c3RvbSBsb2dpYyksIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0Y2hlY2tJZk5vZGVJc01vdmFibGU6IGZ1bmN0aW9uIChub2RlOiBDb250ZXh0LCB0YWJsZTogVGFibGUpOiBib29sZWFuIHtcblx0XHRjb25zdCBpc05vZGVNb3ZhYmxlRnVuY3Rpb24gPSAodGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpLmdldFRhYmxlRGVmaW5pdGlvbigpLmNvbnRyb2wuaXNOb2RlTW92YWJsZTtcblx0XHRjb25zdCBub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uID0gaXNOb2RlTW92YWJsZUZ1bmN0aW9uXG5cdFx0XHQ/IEZQTUhlbHBlci5nZXRDdXN0b21GdW5jdGlvbjwoY29udGV4dDogQ29udGV4dCkgPT4gYm9vbGVhbj4oXG5cdFx0XHRcdFx0aXNOb2RlTW92YWJsZUZ1bmN0aW9uLm1vZHVsZU5hbWUsXG5cdFx0XHRcdFx0aXNOb2RlTW92YWJsZUZ1bmN0aW9uLm1ldGhvZE5hbWUsXG5cdFx0XHRcdFx0dGFibGVcblx0XHRcdCAgKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIG5vZGVNb3ZhYmxlQ3VzdG9tRnVuY3Rpb24gPT09IHVuZGVmaW5lZCB8fCBub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uKG5vZGUpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cud2FybmluZyhgRXJyb3IgaW4gY3VzdG9tIGZ1bmN0aW9uIGZvciBpc05vZGVNb3ZhYmxlOiAke2Vycm9yfWApO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2hldGhlciB0aGUgbm9kZSBjYW4gYmUgY29waWVkIGFjY29yZGluZyB0byB0aGUgY3VzdG9tIGxvZ2ljLCBpZiBhbnkuXG5cdCAqIEBwYXJhbSBub2RlXG5cdCAqIEBwYXJhbSB0YWJsZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGN1c3RvbSBsb2dpYyBhbGxvd3MgdGhlIG5vZGUgdG8gYmUgY29waWVkIChvciBpZiBubyBjdXN0b20gbG9naWMgaXMgZGVmaW5lZCk7IGZhbHNlIG90aGVyd2lzZS5cblx0ICovXG5cdGNoZWNrSWZOb2RlSXNDb3B5YWJsZTogZnVuY3Rpb24gKG5vZGU6IENvbnRleHQsIHRhYmxlOiBUYWJsZSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGlzTm9kZUNvcHlhYmxlRnVuY3Rpb24gPSAodGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpLmdldFRhYmxlRGVmaW5pdGlvbigpLmNvbnRyb2wuaXNOb2RlQ29weWFibGU7XG5cdFx0Y29uc3Qgbm9kZU1vdmFibGVDdXN0b21GdW5jdGlvbiA9IGlzTm9kZUNvcHlhYmxlRnVuY3Rpb25cblx0XHRcdD8gRlBNSGVscGVyLmdldEN1c3RvbUZ1bmN0aW9uPChjb250ZXh0OiBDb250ZXh0KSA9PiBib29sZWFuPihcblx0XHRcdFx0XHRpc05vZGVDb3B5YWJsZUZ1bmN0aW9uLm1vZHVsZU5hbWUsXG5cdFx0XHRcdFx0aXNOb2RlQ29weWFibGVGdW5jdGlvbi5tZXRob2ROYW1lLFxuXHRcdFx0XHRcdHRhYmxlXG5cdFx0XHQgIClcblx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uID09PSB1bmRlZmluZWQgfHwgbm9kZU1vdmFibGVDdXN0b21GdW5jdGlvbihub2RlKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLndhcm5pbmcoYEVycm9yIGluIGN1c3RvbSBmdW5jdGlvbiBmb3IgaXNOb2RlTW92YWJsZTogJHtlcnJvcn1gKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgY29udGV4dCB0byBlbmFibGUvZGlzYWJsZSB0aGUgQ3V0IGFuZCBQYXN0ZSBidXR0b25zLlxuXHQgKiBAcGFyYW0gbW9kZWxPYmplY3QgSW50ZXJuYWwgY29udGV4dCBvYmplY3Qgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSB0YWJsZSBJbnN0YW5jZSBvZiB0aGUgVGFibGVcblx0ICogQHBhcmFtIGZvckNvbnRleHRNZW51XG5cdCAqL1xuXHR1cGRhdGVDdXRDb3B5UGFzdGVFbmFibGVtZW50OiBmdW5jdGlvbiAobW9kZWxPYmplY3Q6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9LCB0YWJsZTogVGFibGUsIGZvckNvbnRleHRNZW51ID0gZmFsc2UpOiB2b2lkIHtcblx0XHRtb2RlbE9iamVjdC5jb250ZXh0bWVudSA9IG1vZGVsT2JqZWN0LmNvbnRleHRtZW51ID8/IHsgc2VsZWN0ZWRDb250ZXh0czogW10gfTtcblxuXHRcdGNvbnN0IHRhYmxlRGVmaW5pdGlvbiA9ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCk7XG5cdFx0aWYgKHRhYmxlRGVmaW5pdGlvbi5jb250cm9sLnR5cGUgIT09IFwiVHJlZVRhYmxlXCIpIHtcblx0XHRcdC8vIFRoZSBsb2dpYyBiZWxvdyBvbmx5IG1ha2VzIHNlbnNlIGZvciBhIFRyZWUgVGFibGVcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgdmlldyA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcodGFibGUpO1xuXHRcdGNvbnN0IGlzVmlld0VkaXRhYmxlID0gQ29tbW9uVXRpbHMuZ2V0SXNFZGl0YWJsZSh2aWV3KTtcblx0XHRpZiAodmlldy5nZXRDb250cm9sbGVyTmFtZSgpICE9PSBcInNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5MaXN0UmVwb3J0Q29udHJvbGxlclwiICYmICFpc1ZpZXdFZGl0YWJsZSkge1xuXHRcdFx0Ly8gSWYgdGhlIHZpZXcgaXMgbm90IGVkaXRhYmxlLCB3ZSBkaXNhYmxlIHRoZSBjdXQvY29weS9wYXN0ZSBmdW5jdGlvbmFsaXR5IGFuZCBjbGVhciB0aGUgbm9kZVVwZGF0ZXNJbmZvXG5cdFx0XHRtb2RlbE9iamVjdC5ub2RlVXBkYXRlc0luZm8gPSB7fTtcblx0XHRcdChtb2RlbE9iamVjdC5jb250ZXh0bWVudSBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkubm9kZVVwZGF0ZXNJbmZvID0ge307XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGNoZWNrRHJhZnRJbnN0YW5jZSA9ICF0YWJsZS5nZXRSb3dCaW5kaW5nKCkuaXNSZWxhdGl2ZSgpO1xuXG5cdFx0aWYgKGZvckNvbnRleHRNZW51KSB7XG5cdFx0XHQobW9kZWxPYmplY3QuY29udGV4dG1lbnUgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pLm5vZGVVcGRhdGVzSW5mbyA9IHt9O1xuXHRcdH1cblx0XHRjb25zdCBub2RlVXBkYXRlc0luZm8gPSBtb2RlbE9iamVjdC5ub2RlVXBkYXRlc0luZm8gYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG5cdFx0Ly9JZiB0aGUgcGFzdGFibGVDb250ZXh0IGJlY29tZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgbGlzdEJpbmRpbmcsIGZvciBleGFtcGxlLCB3aGVuIHRoZSB1c2VyIGNvbGxhcHNlcyB0aGUgcGFyZW50IG5vZGUsIHdlIGF0dGVtcHQgdG8gbG9jYXRlIHRoZSBjb3JyZWN0IGNvbnRleHQgYnkgY29tcGFyaW5nIHRoZWlyIHBhdGhzXG5cdFx0Y29uc3QgcGFzdGFibGVDb250ZXh0czogQ29udGV4dFtdID0gdGFibGVcblx0XHRcdC5nZXRSb3dCaW5kaW5nKClcblx0XHRcdC5nZXRBbGxDdXJyZW50Q29udGV4dHMoKVxuXHRcdFx0LmZpbHRlcigoY29udGV4dCkgPT5cblx0XHRcdFx0KChub2RlVXBkYXRlc0luZm8ucGFzdGFibGVDb250ZXh0cyB8fCBbXSkgYXMgQ29udGV4dFtdKVxuXHRcdFx0XHRcdC5tYXAoKHBhc3RhYmxlQ29udGV4dCkgPT4gcGFzdGFibGVDb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0XHQuaW5jbHVkZXMoY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHQpO1xuXG5cdFx0aWYgKHBhc3RhYmxlQ29udGV4dHMubGVuZ3RoICE9PSAoKG5vZGVVcGRhdGVzSW5mby5wYXN0YWJsZUNvbnRleHRzIHx8IFtdKSBhcyBDb250ZXh0W10pLmxlbmd0aCkge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3coXCJcIiArIFJlc291cmNlTW9kZWxIZWxwZXIuZ2V0UmVzb3VyY2VNb2RlbCh0YWJsZSkuZ2V0VGV4dChcIk1fUEFTVEFCTEVfQ09OVEVYVFNfTk9UX0FWQUlMQUJMRVwiKSk7XG5cdFx0fVxuXHRcdGNvbnN0IGNvcHlDdXRQYXN0ZUVuYWJsZW1lbnRJbmZvID0gKCghZm9yQ29udGV4dE1lbnUgPyBtb2RlbE9iamVjdCA6IG1vZGVsT2JqZWN0LmNvbnRleHRtZW51KSBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSlcblx0XHRcdC5ub2RlVXBkYXRlc0luZm8gYXMge1xuXHRcdFx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0XHR9O1xuXHRcdGNvbnN0IGRhdGFNb2RlbHNyYyA9ICghZm9yQ29udGV4dE1lbnUgPyBtb2RlbE9iamVjdCA6IG1vZGVsT2JqZWN0LmNvbnRleHRtZW51KSBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfTtcblx0XHRjb25zdCBjdXRhYmxlQ29udGV4dHMgPSAoZGF0YU1vZGVsc3JjLnVwZGF0YWJsZUNvbnRleHRzIGFzIENvbnRleHRbXSkuZmlsdGVyKFxuXHRcdFx0KGNvbnRleHQpID0+XG5cdFx0XHRcdFRhYmxlUnVudGltZS5jaGVja0lmTm9kZUlzTW92YWJsZShjb250ZXh0LCB0YWJsZSkgJiYgKCFjaGVja0RyYWZ0SW5zdGFuY2UgfHwgY29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpICE9PSB0cnVlKVxuXHRcdCk7XG5cdFx0Y29uc3QgY29weWFibGVDb250ZXh0cyA9IChkYXRhTW9kZWxzcmMuc2VsZWN0ZWRDb250ZXh0cyBhcyBDb250ZXh0W10pLmZpbHRlcigoY29udGV4dCkgPT5cblx0XHRcdFRhYmxlUnVudGltZS5jaGVja0lmTm9kZUlzQ29weWFibGUoY29udGV4dCwgdGFibGUpXG5cdFx0KTtcblx0XHRjb25zdCBzZWxlY3RlZENvbnRleHRzID0gZGF0YU1vZGVsc3JjLnNlbGVjdGVkQ29udGV4dHMgYXMgQ29udGV4dFtdO1xuXHRcdGNvcHlDdXRQYXN0ZUVuYWJsZW1lbnRJbmZvLmN1dEVuYWJsZW1lbnQgPSBzZWxlY3RlZENvbnRleHRzLmxlbmd0aCA9PT0gMSAmJiBjdXRhYmxlQ29udGV4dHMubGVuZ3RoID09PSAxO1xuXHRcdGNvcHlDdXRQYXN0ZUVuYWJsZW1lbnRJbmZvLmNvcHlFbmFibGVtZW50ID0gc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPT09IDEgJiYgY29weWFibGVDb250ZXh0cy5sZW5ndGggPT09IDE7XG5cblx0XHRpZiAobm9kZVVwZGF0ZXNJbmZvLmxhc3RBY3Rpb24pIHtcblx0XHRcdGlmIChwYXN0YWJsZUNvbnRleHRzPy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Y29weUN1dFBhc3RlRW5hYmxlbWVudEluZm8ucGFzdGVFbmFibGVtZW50ID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBjb250ZXh0c2ZvclBhc3RhYmxlRW5hYmxlbWVudDogQ29udGV4dFtdO1xuXHRcdFx0Y29uc3QgZXh0ZW5zaW9uUG9pbnQgPVxuXHRcdFx0XHRub2RlVXBkYXRlc0luZm8ubGFzdEFjdGlvbiA9PT0gXCJDdXRcIlxuXHRcdFx0XHRcdD8gdGFibGVEZWZpbml0aW9uLmNvbnRyb2wuaXNNb3ZlVG9Qb3NpdGlvbkFsbG93ZWRcblx0XHRcdFx0XHQ6IHRhYmxlRGVmaW5pdGlvbi5jb250cm9sLmlzQ29weVRvUG9zaXRpb25BbGxvd2VkO1xuXG5cdFx0XHQvL3JlbW92ZSBjb250ZXh0cyBkZXBlbmRpbmcgb2YgdGhlIGN1c3RvbSBmdW5jdGlvblxuXHRcdFx0aWYgKGV4dGVuc2lvblBvaW50KSB7XG5cdFx0XHRcdGNvbnRleHRzZm9yUGFzdGFibGVFbmFibGVtZW50ID0gWy4uLnNlbGVjdGVkQ29udGV4dHNdLmZpbHRlcihcblx0XHRcdFx0XHQodGFyZ2V0Q29udGV4dCkgPT5cblx0XHRcdFx0XHRcdChcblx0XHRcdFx0XHRcdFx0RlBNSGVscGVyLmdldEN1c3RvbUZ1bmN0aW9uPChjb250ZXh0czogQ29udGV4dFtdKSA9PiBib29sZWFuPihcblx0XHRcdFx0XHRcdFx0XHRleHRlbnNpb25Qb2ludC5tb2R1bGVOYW1lLFxuXHRcdFx0XHRcdFx0XHRcdGV4dGVuc2lvblBvaW50Lm1ldGhvZE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0dGFibGVcblx0XHRcdFx0XHRcdFx0KSBhcyBGdW5jdGlvblxuXHRcdFx0XHRcdFx0KShwYXN0YWJsZUNvbnRleHRzWzBdLCB0YXJnZXRDb250ZXh0KSAvL25vZGVVcGRhdGVzSW5mby5wYXN0YWJsZUNvbnRleHRzIGhhcyBiZWVuIHRoZSBsYXN0IHRpbWUgdGhlIHVzZXIgcHJlc3NlZCB0aGUgY3V0L2NvcHkgYnV0dG9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb250ZXh0c2ZvclBhc3RhYmxlRW5hYmxlbWVudCA9IFsuLi5zZWxlY3RlZENvbnRleHRzXTtcblx0XHRcdH1cblxuXHRcdFx0Ly90aGUgcGFzdGUgY2Fubm90IGJlIGRvbmUgaWYgc2V2ZXJhbCBjb250ZXh0cyBhcmUgc2VsZWN0ZWRcblx0XHRcdGNvcHlDdXRQYXN0ZUVuYWJsZW1lbnRJbmZvLnBhc3RlRW5hYmxlbWVudCA9XG5cdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMubGVuZ3RoIDw9IDEgJiYgY29udGV4dHNmb3JQYXN0YWJsZUVuYWJsZW1lbnQubGVuZ3RoID09PSBzZWxlY3RlZENvbnRleHRzLmxlbmd0aDtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqICBVcGRhdGVzIHRoZSBpbnRlcm5hbCBjb250ZXh0IHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBtb3ZlIHVwL21vdmUgZG93biBidXR0b25zLlxuXHQgKiBAcGFyYW0gbW9kZWxPYmplY3Rcblx0ICogQHBhcmFtIHRhYmxlXG5cdCAqIEBwYXJhbSBmb3JDb250ZXh0TWVudVxuXHQgKi9cblx0dXBkYXRlTW92ZVVwRG93bkVuYWJsZW1lbnQ6IGZ1bmN0aW9uIChtb2RlbE9iamVjdDogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0sIHRhYmxlOiBUYWJsZSwgZm9yQ29udGV4dE1lbnUgPSBmYWxzZSk6IHZvaWQge1xuXHRcdGNvbnN0IG1vZGVsT2JqZWN0UGF0aCA9ICFmb3JDb250ZXh0TWVudSA/IG1vZGVsT2JqZWN0IDogKG1vZGVsT2JqZWN0LmNvbnRleHRtZW51IGFzIHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KTtcblx0XHRjb25zdCBzZWxlY3RlZENvbnRleHRzID0gbW9kZWxPYmplY3RQYXRoLnNlbGVjdGVkQ29udGV4dHMgYXMgQ29udGV4dFtdO1xuXHRcdGNvbnN0IHRhYmxlRGVmaW5pdGlvbiA9ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCk7XG5cblx0XHRjb25zdCBjaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQgPSB0YWJsZURlZmluaXRpb24uYW5ub3RhdGlvbi5jaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQ7XG5cdFx0Ly8gRGlzYWJsZSB0aGUgbW92ZSB1cC9tb3ZlIGRvd24gYnV0dG9ucyBpZiB0aGVyZSBhcmUgbm8gc2VsZWN0ZWQgY29udGV4dHMsIGlmIHRoZSB0YWJsZSBpcyBub3QgYSBUcmVlVGFibGUsIG9yIGlmIHRoZSB0YWJsZSBpcyBzb3J0ZWRcblx0XHRpZiAoXG5cdFx0XHRzZWxlY3RlZENvbnRleHRzLmxlbmd0aCAhPT0gMSB8fFxuXHRcdFx0dGFibGVEZWZpbml0aW9uLmNvbnRyb2wudHlwZSAhPT0gXCJUcmVlVGFibGVcIiB8fFxuXHRcdFx0dGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJpc1NvcnRlZFwiKSA9PT0gdHJ1ZSB8fFxuXHRcdFx0KHNlbGVjdGVkQ29udGV4dHNbMF0uZ2V0UHJvcGVydHkoXCJAJHVpNS5ub2RlLmxldmVsXCIpID09PSAxICYmICFjaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQpIC8vIERpc2FibGUgbW92ZSB1cC9kb3duIGZvciByb290c1xuXHRcdCkge1xuXHRcdFx0bW9kZWxPYmplY3RQYXRoLnNpbmdsZUNvbnRleHRNb3ZhYmxlVXAgPSBmYWxzZTtcblx0XHRcdG1vZGVsT2JqZWN0UGF0aC5zaW5nbGVDb250ZXh0TW92YWJsZURvd24gPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbW92ZWRDb250ZXh0ID0gc2VsZWN0ZWRDb250ZXh0c1swXTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIGNvbnRleHQgY2FuIGJlIG1vdmVkIGFjY29yZGluZyB0byB0aGUgY3VzdG9tIGxvZ2ljIChpZiBhbnkpIGFuZCBpZiBpdCBkb2Vzbid0IGhhdmUgYSBkcmFmdCBpbnN0YW5jZSBpZiB3ZSdyZSBpbiBhIExpc3RSZXBvcnQsXG5cdFx0XHQvLyBhbmQgaWYgaXQncyBub3Qgb3V0LW9mLXBsYWNlIChpLmUuIGl0IG11c3QgYmUgZGlzcGxheWVkIGF0IGl0cyAncmVhbCcgcG9zaXRpb24pXG5cdFx0XHRjb25zdCBtb3ZhYmxlRHJhZnQgPSB0YWJsZS5nZXRSb3dCaW5kaW5nKCkuaXNSZWxhdGl2ZSgpIHx8IG1vdmVkQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpICE9PSB0cnVlO1xuXHRcdFx0Y29uc3Qgb3V0T2ZQbGFjZUNvbnRleHQgPSBtb3ZlZENvbnRleHQuaXNUcmFuc2llbnQoKSAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgY3VzdG9tTW92YWJsZSA9IFRhYmxlUnVudGltZS5jaGVja0lmTm9kZUlzTW92YWJsZShtb3ZlZENvbnRleHQsIHRhYmxlKTtcblx0XHRcdG1vZGVsT2JqZWN0UGF0aC5zaW5nbGVDb250ZXh0TW92YWJsZVVwID1cblx0XHRcdFx0bW92YWJsZURyYWZ0ICYmIGN1c3RvbU1vdmFibGUgJiYgIW91dE9mUGxhY2VDb250ZXh0ICYmICFtb3ZlZENvbnRleHQuaXNEZWxldGVkKCkgJiYgbW92ZWRDb250ZXh0LmdldFNpYmxpbmcoLTEpICE9PSBudWxsO1xuXHRcdFx0bW9kZWxPYmplY3RQYXRoLnNpbmdsZUNvbnRleHRNb3ZhYmxlRG93biA9XG5cdFx0XHRcdG1vdmFibGVEcmFmdCAmJiBjdXN0b21Nb3ZhYmxlICYmICFvdXRPZlBsYWNlQ29udGV4dCAmJiAhbW92ZWRDb250ZXh0LmlzRGVsZXRlZCgpICYmIG1vdmVkQ29udGV4dC5nZXRTaWJsaW5nKDEpICE9PSBudWxsO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgY29udGV4dCB0byBlbmFibGUvZGlzYWJsZSB0aGUgQ3JlYXRlIGJ1dHRvbiAvIG1lbnUgLyBtZW51IGl0ZW1zLlxuXHQgKiBAcGFyYW0gaW50ZXJuYWxDb250ZXh0XG5cdCAqIEBwYXJhbSBjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2tcblx0ICogQHBhcmFtIGNyZWF0ZUVuYWJsZW1lbnRDYWxsYmFjay5tb2R1bGVOYW1lXG5cdCAqIEBwYXJhbSBjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2subWV0aG9kTmFtZVxuXHQgKiBAcGFyYW0gdGFibGVcblx0ICogQHBhcmFtIHBhcmVudENvbnRleHRcblx0ICogQHBhcmFtIG5vZGVUeXBlUGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gbm9kZVR5cGVQYXJhbWV0ZXJzLnByb3BlcnR5TmFtZVxuXHQgKiBAcGFyYW0gbm9kZVR5cGVQYXJhbWV0ZXJzLnZhbHVlc1xuXHQgKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcblx0ICovXG5cdF91cGRhdGVDcmVhdGVFbmFibGVtZW50OiBmdW5jdGlvbiAoXG5cdFx0aW50ZXJuYWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2s6IHsgbW9kdWxlTmFtZTogc3RyaW5nOyBtZXRob2ROYW1lOiBzdHJpbmcgfSxcblx0XHR0YWJsZTogVGFibGUsXG5cdFx0cGFyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwsXG5cdFx0bm9kZVR5cGVQYXJhbWV0ZXJzPzogeyBwcm9wZXJ0eU5hbWU6IHN0cmluZzsgdmFsdWVzOiB7IHZhbHVlOiBzdHJpbmcgfVtdIH0sXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiB2b2lkIHtcblx0XHRsZXQgcG9zc2libGVWYWx1ZXM6IChzdHJpbmcgfCB1bmRlZmluZWQpW107XG5cdFx0aWYgKG5vZGVUeXBlUGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBQdXNoIGFsbCBwb3NzaWJsZSB2YWx1ZXMgaW4gdGhlIG1lbnVcblx0XHRcdHBvc3NpYmxlVmFsdWVzID0gbm9kZVR5cGVQYXJhbWV0ZXJzLnZhbHVlcy5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gbWVudSAtLT4gT25seSAndW5kZWZpbmVkJyB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSAnQ3JlYXRlJyBidXR0b25cblx0XHRcdHBvc3NpYmxlVmFsdWVzID0gW3VuZGVmaW5lZF07XG5cdFx0fVxuXG5cdFx0Y29uc3QgZW5hYmxlbWVudEZ1bmN0aW9uID0gRlBNSGVscGVyLmdldEN1c3RvbUZ1bmN0aW9uPChub2RlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgbnVsbCkgPT4gYm9vbGVhbj4oXG5cdFx0XHRjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2subW9kdWxlTmFtZSxcblx0XHRcdGNyZWF0ZUVuYWJsZW1lbnRDYWxsYmFjay5tZXRob2ROYW1lLFxuXHRcdFx0dGFibGVcblx0XHQpO1xuXG5cdFx0aWYgKCFlbmFibGVtZW50RnVuY3Rpb24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZW5hYmxlZEZsYWdzID0gcG9zc2libGVWYWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuXHRcdFx0bGV0IGVuYWJsZWQgPSBmYWxzZTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGVuYWJsZWQgPSAhIShlbmFibGVtZW50RnVuY3Rpb24odmFsdWUsIHBhcmVudENvbnRleHQpID8/IHRydWUpO1xuXHRcdFx0fSBjYXRjaCAoX2Vycm9yKSB7XG5cdFx0XHRcdGVuYWJsZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGVuYWJsZWQ7XG5cdFx0fSk7XG5cdFx0Ly8gZW5hYmxlRmxhZ3NbaV0gaXMgdHJ1ZSA8PT4gcG9zc2libGVWYWx1ZXNbaV0gaXMgYWxsb3dlZCBmb3IgY3JlYXRpb25cblxuXHRcdGNvbnN0IGVuYWJsZW1lbnRNYXA6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cdFx0ZW5hYmxlbWVudE1hcFtcIkNyZWF0ZVwiXSA9IGVuYWJsZWRGbGFncy5zb21lKChmbGFnKSA9PiBmbGFnKTsgLy8gRW5hYmxlIHRoZSBNZW51IChvciB0aGUgYnV0dG9uKSBpZiBhdCBsZWFzdCBvbmUgb3B0aW9uIGlzIHBvc3NpYmxlXG5cdFx0ZW5hYmxlZEZsYWdzLmZvckVhY2goKGVuYWJsZWQsIGluZGV4KSA9PiB7XG5cdFx0XHRlbmFibGVtZW50TWFwW2BDcmVhdGVfJHtpbmRleH1gXSA9IGVuYWJsZWQ7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBjb250ZXh0UGF0aCA9IGZvckNvbnRleHRNZW51ID8gXCJjb250ZXh0bWVudS9cIiA6IFwiXCI7XG5cdFx0aW50ZXJuYWxDb250ZXh0LnNldFByb3BlcnR5KGNvbnRleHRQYXRoICsgXCJjcmVhdGVFbmFibGVtZW50XCIsIGVuYWJsZW1lbnRNYXApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDbGVhcnMgdGhlIHRhYmxlIHNlbGVjdGlvbiwgYW5kIGVuYWJsZXMvZGlzYWJsZXMgdGhlICdDcmVhdGUnIGJ1dHRvbi9tZW51IGlmIG5lY2Vzc2FyeS5cblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZVxuXHQgKi9cblx0Y2xlYXJTZWxlY3Rpb246IGZ1bmN0aW9uICh0YWJsZTogVGFibGUpOiB2b2lkIHtcblx0XHQvLyBDbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb250cm9sXG5cdFx0dGFibGUuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdC8vIFVwZGF0ZSB0aGUgc2VsZWN0aW9uLXJlbGF0ZWQgaW5mb3JtYXRpb24gaW4gdGhlIGludGVybmFsIG1vZGVsXG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSB0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdGlmIChpbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIsIDApO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIsIFtdKTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZGVsZXRhYmxlQ29udGV4dHNcIiwgW10pO1xuXHRcdH1cblxuXHRcdC8vIEVuYWJsZS9kaXNhYmxlIHRoZSAnQ3JlYXRlJyBidXR0b24vbWVudSBpZiBuZWNlc3Nhcnlcblx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdGlmICh0YWJsZUFQSS50YWJsZURlZmluaXRpb24uY29udHJvbC5jcmVhdGVFbmFibGVtZW50KSB7XG5cdFx0XHR0aGlzLl91cGRhdGVDcmVhdGVFbmFibGVtZW50KFxuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dCBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0dGFibGVBUEkudGFibGVEZWZpbml0aW9uLmNvbnRyb2wuY3JlYXRlRW5hYmxlbWVudCxcblx0XHRcdFx0dGFibGUsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5jb250cm9sLm5vZGVUeXBlXG5cdFx0XHQpO1xuXHRcdH1cblx0fSxcblxuXHRkaXNhYmxlQWN0aW9uOiBmdW5jdGlvbiAoYUFjdGlvbnNNdWx0aXNlbGVjdERpc2FibGVkOiBzdHJpbmdbXSwgb0R5bmFtaWNBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IGJFbmFibGVkPzogYm9vbGVhbiB9Pik6IHZvaWQge1xuXHRcdGFBY3Rpb25zTXVsdGlzZWxlY3REaXNhYmxlZC5mb3JFYWNoKGZ1bmN0aW9uIChzQWN0aW9uOiBzdHJpbmcpIHtcblx0XHRcdG9EeW5hbWljQWN0aW9uc1tzQWN0aW9uXSA9IHsgYkVuYWJsZWQ6IGZhbHNlIH07XG5cdFx0fSk7XG5cdH0sXG5cdG9uRmllbGRDaGFuZ2VJbkNyZWF0aW9uUm93OiBmdW5jdGlvbiAob0V2ZW50OiBFdmVudFR5cGU8dHlwZW9mIEZpZWxkLnByb3RvdHlwZS5jaGFuZ2U+LCB3aXRoQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Ly8gQ1JFQVRJT04gUk9XIENBU0Vcblx0XHRjb25zdCBtRmllbGQgPSBGaWVsZFJ1bnRpbWVIZWxwZXIuZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlKG9FdmVudCksXG5cdFx0XHRvU291cmNlRmllbGQgPSBtRmllbGQuZmllbGQsXG5cdFx0XHRzRmllbGRJZCA9IG9Tb3VyY2VGaWVsZC5nZXRJZCgpO1xuXG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1NvdXJjZUZpZWxkLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRtRmllbGRWYWxpZGl0eSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiKSxcblx0XHRcdG1OZXdGaWVsZFZhbGlkaXR5ID0gT2JqZWN0LmFzc2lnbih7fSwgbUZpZWxkVmFsaWRpdHkpO1xuXG5cdFx0bU5ld0ZpZWxkVmFsaWRpdHlbc0ZpZWxkSWRdID0gbUZpZWxkLnN0YXRlO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCBtTmV3RmllbGRWYWxpZGl0eSk7XG5cblx0XHQvLyBwcmVwYXJlIEN1c3RvbSBWYWxpZGF0aW9uXG5cdFx0aWYgKHdpdGhDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdGNvbnN0IG1DdXN0b21WYWxpZGl0eSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIiksXG5cdFx0XHRcdG1OZXdDdXN0b21WYWxpZGl0eSA9IE9iamVjdC5hc3NpZ24oe30sIG1DdXN0b21WYWxpZGl0eSk7XG5cdFx0XHRtTmV3Q3VzdG9tVmFsaWRpdHlbb1NvdXJjZUZpZWxkLmdldEJpbmRpbmcoXCJ2YWx1ZVwiKSEuZ2V0UGF0aCgpXSA9IHtcblx0XHRcdFx0ZmllbGRJZDogb1NvdXJjZUZpZWxkLmdldElkKClcblx0XHRcdH07XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIsIG1OZXdDdXN0b21WYWxpZGl0eSk7XG5cdFx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRjb25zdCBzVGFyZ2V0ID0gYCR7b1NvdXJjZUZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKX0vJHtvU291cmNlRmllbGQuZ2V0QmluZGluZ1BhdGgoXCJ2YWx1ZVwiKX1gO1xuXHRcdFx0TWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0LmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBNZXNzYWdlKSB7XG5cdFx0XHRcdFx0aWYgKG9NZXNzYWdlLmdldFRhcmdldHMoKVswXSA9PT0gc1RhcmdldCkge1xuXHRcdFx0XHRcdFx0TWVzc2FnaW5nLnJlbW92ZU1lc3NhZ2VzKG9NZXNzYWdlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblx0b25UcmVlVGFibGVDb250ZXh0Q2hhbmdlZDogZnVuY3Rpb24gKGV2ZW50OiBVSTVFdmVudCwgaW5pdGlhbEV4cGFuc2lvbkxldmVsPzogbnVtYmVyKTogdm9pZCB7XG5cdFx0Ly8gV2hlbiB0aGUgY29udGV4dCBvZiBhIFRyZWVUYWJsZSBjaGFuZ2VzLCB3ZSB3YW50IHRvIHJlc3RvcmUgaXRzIGV4cGFuc2lvbiBzdGF0ZSB0byB0aGUgZGVmYXVsdDpcblx0XHQvLyAgIC0gYWxsIGV4cGFuZGVkIGlmIHRoZXJlJ3MgYSBzZWFyY2ggcGFyYW1ldGVyIGNvbWluZyBmcm9tIHRoZSBmaWx0ZXJCYXJcblx0XHQvLyAgIC0gb3RoZXJ3aXNlIGluaXRpYWwgZXhwYW5zaW9uIHN0YXRlIGNvbWluZyBmcm9tIHRoZSBQViAoc3RvcmVkIGluIHRoZSBwYXlsb2FkKVxuXHRcdC8vICAgLSBvdGhlcndpc2Ugbm8gZXhwYW5zaW9uIGF0IGFsbFxuXG5cdFx0Y29uc3Qgc291cmNlID0gZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3QgdGFibGUgPSBzb3VyY2UgYXMgVGFibGU7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRjb25zdCByb3dCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdGlmICghcm93QmluZGluZz8uZ2V0Q29udGV4dCgpIHx8IHRhYmxlQVBJLmdldElnbm9yZUNvbnRleHRDaGFuZ2VFdmVudCgpKSB7XG5cdFx0XHQvLyBUaGUgdGFibGUgaXMgbm90IGJvdW5kLCBvciB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIHN3aXRjaGluZyBiZXR3ZWVuIG5vcm1hbCBhbmQgZnVsbHNjcmVlbiwgc28gd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIGV4cGFuc2lvbiBzdGF0ZVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGFnZ3JlZ2F0aW9uOiB7XG5cdFx0XHRhZ2dyZWdhdGU/OiBvYmplY3Q7XG5cdFx0XHRleHBhbmRUbz86IG51bWJlcjtcblx0XHRcdGdyYW5kVG90YWxBdEJvdHRvbU9ubHk/OiBib29sZWFuO1xuXHRcdFx0Z3JvdXA/OiBvYmplY3Q7XG5cdFx0XHRncm91cExldmVscz86IHN0cmluZ1tdO1xuXHRcdFx0aGllcmFyY2h5UXVhbGlmaWVyPzogc3RyaW5nO1xuXHRcdFx0c2VhcmNoPzogc3RyaW5nO1xuXHRcdFx0c3VidG90YWxzQXRCb3R0b21Pbmx5PzogYm9vbGVhbjtcblx0XHR9ID0gcm93QmluZGluZy5nZXRBZ2dyZWdhdGlvbigpID8/IHt9O1xuXHRcdGNvbnN0IGZpbHRlckluZm8gPSBUYWJsZVV0aWxzLmdldEFsbEZpbHRlckluZm8odGFibGUpO1xuXHRcdGFnZ3JlZ2F0aW9uLmV4cGFuZFRvID0gZmlsdGVySW5mby5zZWFyY2ggPyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA6IGluaXRpYWxFeHBhbnNpb25MZXZlbDtcblx0XHRyb3dCaW5kaW5nLnNldEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uKTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYW4gaXRlbSBpbiBhICdDcmVhdGUnIG1lbnUgaXMgY2xpY2tlZC4gSXQgY3JlYXRlcyBhIGRvY3VtZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgaW5pdGlhbCBkYXRhLlxuXHQgKiBAcGFyYW0gZXZlbnRcblx0ICogQHBhcmFtIHZhbHVlSW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIHRoZSBtZW51XG5cdCAqIEBwYXJhbSBzZWxlY3RlZENvbnRleHRzIFRoZSBzZWxlY3RlZCBjb250ZXh0cyBpbiB0aGUgdGFibGUgZm9yIHRoaXMgJ0NyZWF0ZScgbWVudVxuXHQgKi9cblx0b25DcmVhdGVNZW51SXRlbVByZXNzOiBhc3luYyBmdW5jdGlvbiAoZXZlbnQ6IFVJNUV2ZW50PHt9LCBNZW51SXRlbT4sIHZhbHVlSW5kZXg6IG51bWJlciwgc2VsZWN0ZWRDb250ZXh0czogQ29udGV4dFtdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgbWRjVGFibGUgPSBGUE1IZWxwZXIuZ2V0TWRjVGFibGUoZXZlbnQuZ2V0U291cmNlKCkpO1xuXHRcdGNvbnN0IHRhYmxlQVBJID0gbWRjVGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkO1xuXG5cdFx0Ly8gU29tZSBjaGVja3MgdG8gYmUgb24gdGhlIHNhZmUgc2lkZVxuXHRcdGlmICghdGFibGVBUEkgfHwgIW1kY1RhYmxlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IG5vZGVUeXBlID0gdGFibGVBUEkudGFibGVEZWZpbml0aW9uLmNvbnRyb2wubm9kZVR5cGU7XG5cdFx0aWYgKCFub2RlVHlwZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHZpZXcgPSBDb21tb25VdGlscy5nZXRUYXJnZXRWaWV3KHRhYmxlQVBJKTtcblx0XHRjb25zdCBjcmVhdGlvbkRhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0XHRjcmVhdGlvbkRhdGFbbm9kZVR5cGUucHJvcGVydHlOYW1lXSA9IG5vZGVUeXBlLnZhbHVlc1t2YWx1ZUluZGV4XS52YWx1ZTtcblxuXHRcdGNvbnN0IGNyZWF0aW9uUGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG5cdFx0XHRkYXRhPzogb2JqZWN0O1xuXHRcdH0gPSB7XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0Y3JlYXRpb25Nb2RlOiB0YWJsZUFQSS50YWJsZURlZmluaXRpb24uYW5ub3RhdGlvbi5jcmVhdGUubW9kZSxcblx0XHRcdGRhdGE6IGNyZWF0aW9uRGF0YSxcblx0XHRcdHRhYmxlSWQ6IG1kY1RhYmxlPy5nZXRJZCgpXG5cdFx0fTtcblxuXHRcdGlmIChjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2cpIHtcblx0XHRcdGNyZWF0aW9uUGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcyA9IG5vZGVUeXBlLnZhbHVlc1t2YWx1ZUluZGV4XS5jcmVhdGlvbkRpYWxvZ0ZpZWxkcztcblx0XHRcdGlmICghY3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzIHx8IGNyZWF0aW9uUGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Ly8gVXNlIHRoZSBkZWZhdWx0IHZhbHVlIGlmIG5vIGNyZWF0aW9uIGZpZWxkcyBhcmUgc3BlY2lmaWVkIGZvciB0aGlzIG1lbnUgaXRlbVxuXHRcdFx0XHRjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMgPSB0YWJsZUFQSS50YWJsZURlZmluaXRpb24uY29udHJvbC5jcmVhdGlvbkRpYWxvZ0ZpZWxkcztcblx0XHRcdH1cblx0XHRcdGlmICghbWRjVGFibGUuZ2V0Um93QmluZGluZygpKSB7XG5cdFx0XHRcdC8vIEluIGNyZWF0aW9uIGRpYWxvZyBtb2RlLCB3ZSBmb3JjZSB0aGUgdGFibGUgZGF0YSB0byBiZSBsb2FkZWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFxuXHRcdFx0XHQvLyAodG8gb3ZlcmNvbWUgdGhlIGNhc2UgaW4gYSBMaXN0UmVwb3J0IHdoZXJlIG5vIGRhdGEgaXMgbG9hZGVkIHlldClcblx0XHRcdFx0YXdhaXQgbWRjVGFibGUucmViaW5kKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmlldy5nZXRDb250cm9sbGVyKClcblx0XHRcdC5lZGl0Rmxvdy5jcmVhdGVEb2N1bWVudCh0YWJsZUFQSS5nZXRSb3dCaW5kaW5nKCksIGNyZWF0aW9uUGFyYW1ldGVycylcblx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIG5ldyBkb2N1bWVudDogJHtlcnJvcn1gKTtcblx0XHRcdH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiB0aGUgJ0NyZWF0ZScgYnV0dG9uIGlzIHByZXNzZWQsIG9yIHRoZSAnQ3JlYXRlJyBjb21tYW5kIGludm9rZWQuXG5cdCAqIEBwYXJhbSBldmVudFxuXHQgKiBAcGFyYW0gc2VsZWN0ZWRDb250ZXh0cyBUaGUgc2VsZWN0ZWQgY29udGV4dHMgaW4gdGhlIHRhYmxlIGZvciB0aGlzICdDcmVhdGUnIGJ1dHRvblxuXHQgKi9cblx0b25DcmVhdGVCdXR0b25QcmVzczogYXN5bmMgZnVuY3Rpb24gKGV2ZW50OiBVSTVFdmVudCwgc2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG1kY1RhYmxlID0gRlBNSGVscGVyLmdldE1kY1RhYmxlKGV2ZW50LmdldFNvdXJjZSgpKTtcblx0XHRjb25zdCB0YWJsZUFQSSA9IG1kY1RhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZDtcblxuXHRcdC8vIFNvbWUgY2hlY2tzIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGVcblx0XHRpZiAoIXRhYmxlQVBJIHx8ICFtZGNUYWJsZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNyZWF0aW9uUGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRvdXRib3VuZD86IHN0cmluZztcblx0XHRcdGNyZWF0aW9uUm93PzogQ3JlYXRpb25Sb3c7XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG5cdFx0fSA9IHsgY3JlYXRpb25Nb2RlOiB0YWJsZUFQSS50YWJsZURlZmluaXRpb24uYW5ub3RhdGlvbi5jcmVhdGUubW9kZSB9O1xuXG5cdFx0c3dpdGNoIChjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlKSB7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5FeHRlcm5hbDpcblx0XHRcdFx0Y3JlYXRpb25QYXJhbWV0ZXJzLm91dGJvdW5kID0gKHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5hbm5vdGF0aW9uLmNyZWF0ZSBhcyBDcmVhdGVCZWhhdmlvckV4dGVybmFsKS5vdXRib3VuZDtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93OlxuXHRcdFx0XHRjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgPSBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0Y3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kID0gdGFibGVBUEkudGFibGVEZWZpbml0aW9uLmNvbnRyb2wuY3JlYXRlQXRFbmQgPz8gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5OZXdQYWdlOlxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuSW5saW5lOlxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2c6XG5cdFx0XHRcdGNyZWF0aW9uUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5jb250cm9sLmNyZWF0ZUF0RW5kID8/IGZhbHNlO1xuXHRcdFx0XHRjcmVhdGlvblBhcmFtZXRlcnMudGFibGVJZCA9IG1kY1RhYmxlPy5nZXRJZCgpO1xuXHRcdFx0XHRjcmVhdGlvblBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyA9IHNlbGVjdGVkQ29udGV4dHM7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3M6XG5cdFx0XHRcdC8vIE5vdGhpbmdcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdC8vIE90aGVyIG1vZGVzIGFyZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoY3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nKSB7XG5cdFx0XHRjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMgPSB0YWJsZUFQSS50YWJsZURlZmluaXRpb24uY29udHJvbC5jcmVhdGlvbkRpYWxvZ0ZpZWxkcztcblx0XHRcdGlmICghbWRjVGFibGUuZ2V0Um93QmluZGluZygpKSB7XG5cdFx0XHRcdC8vIEluIGNyZWF0aW9uIGRpYWxvZyBtb2RlLCB3ZSBmb3JjZSB0aGUgdGFibGUgZGF0YSB0byBiZSBsb2FkZWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFxuXHRcdFx0XHQvLyAodG8gb3ZlcmNvbWUgdGhlIGNhc2UgaW4gYSBMaXN0UmVwb3J0IHdoZXJlIG5vIGRhdGEgaXMgbG9hZGVkIHlldClcblx0XHRcdFx0YXdhaXQgbWRjVGFibGUucmViaW5kKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmlldyA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcodGFibGVBUEkpO1xuXG5cdFx0aWYgKGNyZWF0aW9uUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MpIHtcblx0XHRcdHZpZXcuZ2V0Q29udHJvbGxlcigpXG5cdFx0XHRcdC5lZGl0Rmxvdy5jcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyhtZGNUYWJsZSlcblx0XHRcdFx0LmNhdGNoKChlcnJvcikgPT4ge1xuXHRcdFx0XHRcdExvZy5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgZW1wdHkgcm93OiAke2Vycm9yfWApO1xuXHRcdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmlldy5nZXRDb250cm9sbGVyKClcblx0XHRcdFx0LmVkaXRGbG93LmNyZWF0ZURvY3VtZW50KHRhYmxlQVBJLCBjcmVhdGlvblBhcmFtZXRlcnMpXG5cdFx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbmV3IGRvY3VtZW50OiAke2Vycm9yfWApO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBtYW5hZ2UgdGhlIEludGVudEJhc2VkIE5hdmlnYXRpb24gZW5hYmxlbWVudC5cblx0ICogQHBhcmFtIGludGVybmFsTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uQXZhaWxhYmxlTWFwXG5cdCAqIEBwYXJhbSBzZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBmb3JDb250ZXh0TWVudVxuXHQgKi9cblx0c2V0SW50ZW50QmFzZWROYXZpZ2F0aW9uRW5hYmxlbWVudDogZnVuY3Rpb24gKFxuXHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uQXZhaWxhYmxlTWFwOiBzdHJpbmdbXSxcblx0XHRzZWxlY3RlZENvbnRleHRzOiBDb250ZXh0W10sXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gbmF2aWdhdGlvbkF2YWlsYWJsZU1hcCkge1xuXHRcdFx0aWYgKCFmb3JDb250ZXh0TWVudSkge1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgaWJuLyR7c0tleX1gLCB7XG5cdFx0XHRcdFx0YkVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdGFBcHBsaWNhYmxlOiBbXSxcblx0XHRcdFx0XHRhTm90QXBwbGljYWJsZTogW11cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgaWJuLyR7c0tleX1gLCB7XG5cdFx0XHRcdFx0Ly8gRG8gbm90IGNoYW5nZSBlbmFibGVkLCBhQXBwbGljYWJsZSBhbmQgYU5vdEFwcGxpY2FibGUgcHJvcGVydHkgaW4gY2FzZSBvZiBjb250ZXh0IG1lbnUgY2FsY3VsYXRpb25cblx0XHRcdFx0XHRiRW5hYmxlZDogaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYCR7aW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9pYm4vJHtzS2V5fS9iRW5hYmxlZGApLFxuXHRcdFx0XHRcdGFBcHBsaWNhYmxlOiBpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgJHtpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2libi8ke3NLZXl9L2FBcHBsaWNhYmxlYCksXG5cdFx0XHRcdFx0YU5vdEFwcGxpY2FibGU6IGludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGAke2ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vaWJuLyR7c0tleX0vYU5vdEFwcGxpY2FibGVgKSxcblx0XHRcdFx0XHRiRW5hYmxlZEZvckNvbnRleHRNZW51OiBmYWxzZSxcblx0XHRcdFx0XHRhQXBwbGljYWJsZUZvckNvbnRleHRNZW51OiBbXSxcblx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51OiBbXVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGFBcHBsaWNhYmxlID0gW10sXG5cdFx0XHRcdGFOb3RBcHBsaWNhYmxlID0gW107XG5cdFx0XHRjb25zdCBzUHJvcGVydHkgPSBuYXZpZ2F0aW9uQXZhaWxhYmxlTWFwW3NLZXldO1xuXHRcdFx0Zm9yIChjb25zdCBzZWxlY3RlZENvbnRleHQgb2Ygc2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRpZiAoc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChzUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0Y29uc3QgZW5hYmxlZFByb3BlcnR5ID0gIWZvckNvbnRleHRNZW51ID8gXCJiRW5hYmxlZFwiIDogXCJiRW5hYmxlZEZvckNvbnRleHRNZW51XCI7XG5cdFx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShgJHtpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2libi8ke3NLZXl9LyR7ZW5hYmxlZFByb3BlcnR5fWAsIHRydWUpO1xuXHRcdFx0XHRcdGFBcHBsaWNhYmxlLnB1c2goc2VsZWN0ZWRDb250ZXh0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhTm90QXBwbGljYWJsZS5wdXNoKHNlbGVjdGVkQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IGFwcGxpY2FibGVQcm9wZXJ0eSA9ICFmb3JDb250ZXh0TWVudSA/IFwiYUFwcGxpY2FibGVcIiA6IFwiYUFwcGxpY2FibGVGb3JDb250ZXh0TWVudVwiO1xuXHRcdFx0Y29uc3Qgbm90QXBwbGljYWJsZVByb3BlcnR5ID0gIWZvckNvbnRleHRNZW51ID8gXCJhTm90QXBwbGljYWJsZVwiIDogXCJhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51XCI7XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRNb2RlbCgpLnNldFByb3BlcnR5KGAke2ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vaWJuLyR7c0tleX0vJHthcHBsaWNhYmxlUHJvcGVydHl9YCwgYUFwcGxpY2FibGUpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHRcblx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0LnNldFByb3BlcnR5KGAke2ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vaWJuLyR7c0tleX0vJHtub3RBcHBsaWNhYmxlUHJvcGVydHl9YCwgYU5vdEFwcGxpY2FibGUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYSBjb250ZXh0IG1lbnUgaXRlbSBpcyBwcmVzc2VkLlxuXHQgKiBAcGFyYW0gZXZlbnRcblx0ICovXG5cdG9uQ29udGV4dE1lbnVJdGVtU2VsZWN0ZWQ6IGZ1bmN0aW9uIChldmVudDogVUk1RXZlbnQpOiB2b2lkIHtcblx0XHRjb25zdCBtZGNUYWJsZSA9IEZQTUhlbHBlci5nZXRNZGNUYWJsZShldmVudC5nZXRTb3VyY2UoKSk7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSBtZGNUYWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQ7XG5cblx0XHQvLyBTZXQgdGhlIGZsYWcgb24gdGhlIHRhYmxlQVBJIHNvIHRoYXQgZ2V0U2VsZWN0ZWRDb250ZXh0cyByZXR1cm5zIHRoZSBjb3JyZWN0IHZhbHVlXG5cdFx0dGFibGVBUEk/LnNldENvbnRleHRNZW51QWN0aXZlKHRydWUpO1xuXG5cdFx0Ly8gQWZ0ZXIgYSBzaG9ydCBkZWxheSAob25jZSB0aGUgY29ycmVzcG9uZGluZyBhY3Rpb24gaGFzIGJlZW4gdHJpZ2dlcmVkKSwgd2UgbmVlZCB0byByZXNldCB0aGUgZmxhZyBvbiB0aGUgdGFibGVcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRhYmxlQVBJPy5zZXRDb250ZXh0TWVudUFjdGl2ZShmYWxzZSk7XG5cdFx0fSwgMCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIE1EQyBEYXRhU3RhdGVJbmRpY2F0b3IgcGx1Z2luIHRvIGRpc3BsYXkgbWVzc2FnZVN0cmlwIG9uIGEgdGFibGUuXG5cdCAqIEBwYXJhbSBtZXNzYWdlXG5cdCAqIEBwYXJhbSBjb250cm9sXG5cdCAqIEByZXR1cm5zIFdoZXRoZXIgdG8gcmVuZGVyIHRoZSBtZXNzYWdlU3RyaXAgdmlzaWJsZVxuXHQgKi9cblx0ZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyOiBmdW5jdGlvbiAobWVzc2FnZTogTWVzc2FnZSwgY29udHJvbDogQ29udHJvbCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHRhYmxlQVBJID0gY29udHJvbC5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRyZXR1cm4gdGFibGVBUEkuZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyKG1lc3NhZ2UsIGNvbnRyb2wpO1xuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUYWJsZVJ1bnRpbWU7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7RUE2QkEsTUFBTUEsWUFBWSxHQUFHQyxTQUFTLENBQUNELFlBQVk7RUFDM0M7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNRSxZQUFZLEdBQUc7SUFDcEJDLGdDQUFnQyxFQUFFLFNBQUFBLENBQVVDLGNBQXNCLEVBQUVDLE9BQWdCLEVBQVE7TUFDM0Y7TUFDQSxNQUFNQyxTQUFTLEdBQUdELE9BQU8sQ0FBQ0UsU0FBUyxDQUFDLENBQWE7TUFDakQsSUFBSUgsY0FBYyxLQUFLSixZQUFZLENBQUNRLFdBQVcsRUFBRTtRQUNoRCxNQUFNQyxPQUFPLEdBQUdILFNBQVMsQ0FDdkJJLFVBQVUsQ0FBQyxDQUFDLENBQ1pDLE1BQU0sQ0FBQyxVQUFVQyxjQUF5QixFQUFFQyxvQkFBNkIsRUFBRTtVQUMzRSxPQUFPRCxjQUFjLENBQUNFLE1BQU0sQ0FBRUQsb0JBQW9CLENBQXlCRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUMsRUFBRSxFQUFlLENBQUMsQ0FDbEJDLElBQUksQ0FBQyxVQUFVQyxhQUFzQixFQUFFO1VBQ3ZDLE9BQU9BLGFBQWEsQ0FB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
581
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJUYWJsZVJ1bnRpbWUiLCJleGVjdXRlQ29uZGl0aW9uYWxBY3Rpb25TaG9ydGN1dCIsInNCdXR0b25NYXRjaGVyIiwib1NvdXJjZSIsIm9NZGNUYWJsZSIsImdldFBhcmVudCIsIkNyZWF0aW9uUm93Iiwib0J1dHRvbiIsImdldEFjdGlvbnMiLCJyZWR1Y2UiLCJhQWN0aW9uQnV0dG9ucyIsIm9BY3Rpb25Ub29sYmFyQWN0aW9uIiwiY29uY2F0IiwiZ2V0QWN0aW9uIiwiZmluZCIsIm9BY3Rpb25CdXR0b24iLCJnZXRJZCIsImVuZHNXaXRoIiwiQ29tbW9uVXRpbHMiLCJmaXJlQnV0dG9uUHJlc3MiLCJvQ3JlYXRpb25Sb3ciLCJnZXRBZ2dyZWdhdGlvbiIsImdldEFwcGx5RW5hYmxlZCIsImdldFZpc2libGUiLCJmaXJlQXBwbHkiLCJzZXRDb250ZXh0cyIsImV2ZW50Iiwic291cmNlIiwiZ2V0U291cmNlIiwidGFibGUiLCJCdXN5TG9ja2VyIiwibG9jayIsInNldENvbnRleHRzQXN5bmMiLCJlcnJvciIsIkxvZyIsInVubG9jayIsIm1ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwidGFibGVBUEkiLCJ0YWJsZURlZmluaXRpb24iLCJjb2xsZWN0aW9uRW50aXR5IiwiTWV0YU1vZGVsQ29udmVydGVyIiwiY29udmVydFR5cGVzIiwicmVzb2x2ZVBhdGgiLCJhbm5vdGF0aW9uIiwiY29sbGVjdGlvbiIsInRhcmdldCIsImFBY3Rpb25zTXVsdGlzZWxlY3REaXNhYmxlZCIsImRhdGEiLCJzcGxpdCIsIm9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAiLCJKU09OIiwicGFyc2UiLCJvcGVyYXRpb25BdmFpbGFibGVNYXAiLCJvTmF2aWdhdGlvbkF2YWlsYWJsZU1hcCIsImFTZWxlY3RlZENvbnRleHRzIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsImFEZWxldGFibGVDb250ZXh0cyIsImJSZWFkT25seURyYWZ0RW5hYmxlZCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRHJhZnRSb290IiwiYVVwZGF0YWJsZUNvbnRleHRzIiwib0R5bmFtaWNBY3Rpb25zIiwib0lCTiIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiZGVsZXRlSGVscGVyIiwidXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMiLCJhY3RpdmVTZWxlY3RlZENvbnRleHRzIiwiZmlsdGVyIiwib0NvbnRleHQiLCJpc0luYWN0aXZlIiwib01vZGVsT2JqZWN0IiwiT2JqZWN0IiwiYXNzaWduIiwiZ2V0T2JqZWN0Iiwic2VsZWN0ZWRDb250ZXh0cyIsInNlbGVjdGVkQ29udGV4dHNJbmNsdWRpbmdJbmFjdGl2ZSIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsImxlbmd0aCIsImR5bmFtaWNBY3Rpb25zIiwiaWJuIiwiZGVsZXRlRW5hYmxlZCIsImRlbGV0YWJsZUNvbnRleHRzIiwidW5TYXZlZENvbnRleHRzIiwibG9ja2VkQ29udGV4dHMiLCJkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlIiwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSIsImNvbnRyb2xJZCIsInVwZGF0YWJsZUNvbnRleHRzIiwicGFzdGVBdXRob3JpemVkIiwicGFzdGVGcm9tQ29weUF1dG9yaXplZCIsInNlbWFudGljS2V5SGFzRHJhZnRJbmRpY2F0b3IiLCJnZXRQcm9wZXJ0eSIsInVuZGVmaW5lZCIsIm5vZGVVcGRhdGVzSW5mbyIsIm9TZWxlY3RlZENvbnRleHQiLCJvQ29udGV4dERhdGEiLCJrZXkiLCJpbmRleE9mIiwic0FjdGlvblBhdGgiLCJzdWJzdHJpbmciLCJlbmFibGVkIiwic2V0UHJvcGVydHkiLCJpc1VwZGF0YWJsZUNvbnRleHQiLCJ1cGRhdGFibGVQcm9wZXJ0eVBhdGhJbmZvIiwicHVzaCIsInNldEludGVudEJhc2VkTmF2aWdhdGlvbkVuYWJsZW1lbnQiLCJkaXNhYmxlQWN0aW9uIiwiY29udHJvbCIsImNyZWF0ZUVuYWJsZW1lbnQiLCJwYXJlbnRDb250ZXh0IiwiX3VwZGF0ZUNyZWF0ZUVuYWJsZW1lbnQiLCJub2RlVHlwZSIsInVwZGF0ZUN1dENvcHlQYXN0ZUVuYWJsZW1lbnQiLCJ1cGRhdGVNb3ZlVXBEb3duRW5hYmxlbWVudCIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50Iiwic2VsZWN0ZWRDb250ZXh0IiwicmVhZE9ubHlEcmFmdEVuYWJsZWQiLCJjb250ZXh0RGF0YSIsIm5vdERyYWZ0SW5SZWFkT25seU1vZGUiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5IiwicGF0aHMiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsImFueU9iamVjdCIsIkFueSIsImFueUJvb2xlYW4iLCJiaW5kaW5nRXhwcmVzc2lvbiIsInNldE1vZGVsIiwic2V0QmluZGluZ0NvbnRleHQiLCJpc1VwZGF0YWJsZSIsImdldEJpbmRpbmciLCJnZXRFeHRlcm5hbFZhbHVlIiwiZGVzdHJveSIsImNoZWNrSWZOb2RlSXNNb3ZhYmxlIiwibm9kZSIsImlzTm9kZU1vdmFibGVGdW5jdGlvbiIsImdldFRhYmxlRGVmaW5pdGlvbiIsImlzTm9kZU1vdmFibGUiLCJub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uIiwiRlBNSGVscGVyIiwiZ2V0Q3VzdG9tRnVuY3Rpb24iLCJtb2R1bGVOYW1lIiwibWV0aG9kTmFtZSIsIndhcm5pbmciLCJjaGVja0lmTm9kZUlzQ29weWFibGUiLCJpc05vZGVDb3B5YWJsZUZ1bmN0aW9uIiwiaXNOb2RlQ29weWFibGUiLCJtb2RlbE9iamVjdCIsImZvckNvbnRleHRNZW51IiwiYXJndW1lbnRzIiwiY29udGV4dG1lbnUiLCJ0eXBlIiwidmlldyIsImdldFRhcmdldFZpZXciLCJpc1ZpZXdFZGl0YWJsZSIsImdldElzRWRpdGFibGUiLCJnZXRDb250cm9sbGVyTmFtZSIsImNoZWNrRHJhZnRJbnN0YW5jZSIsImdldFJvd0JpbmRpbmciLCJpc1JlbGF0aXZlIiwicGFzdGFibGVDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImNvbnRleHQiLCJtYXAiLCJwYXN0YWJsZUNvbnRleHQiLCJnZXRQYXRoIiwiaW5jbHVkZXMiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiUmVzb3VyY2VNb2RlbEhlbHBlciIsImdldFJlc291cmNlTW9kZWwiLCJnZXRUZXh0IiwiY29weUN1dFBhc3RlRW5hYmxlbWVudEluZm8iLCJkYXRhTW9kZWxzcmMiLCJjdXRhYmxlQ29udGV4dHMiLCJjb3B5YWJsZUNvbnRleHRzIiwiY3V0RW5hYmxlbWVudCIsImNvcHlFbmFibGVtZW50IiwibGFzdEFjdGlvbiIsInBhc3RlRW5hYmxlbWVudCIsImNvbnRleHRzZm9yUGFzdGFibGVFbmFibGVtZW50IiwiZXh0ZW5zaW9uUG9pbnQiLCJpc01vdmVUb1Bvc2l0aW9uQWxsb3dlZCIsImlzQ29weVRvUG9zaXRpb25BbGxvd2VkIiwidGFyZ2V0Q29udGV4dCIsIm1vZGVsT2JqZWN0UGF0aCIsImNoYW5nZVNpYmxpbmdGb3JSb290c1N1cHBvcnRlZCIsInNpbmdsZUNvbnRleHRNb3ZhYmxlVXAiLCJzaW5nbGVDb250ZXh0TW92YWJsZURvd24iLCJtb3ZlZENvbnRleHQiLCJtb3ZhYmxlRHJhZnQiLCJvdXRPZlBsYWNlQ29udGV4dCIsImlzVHJhbnNpZW50IiwiY3VzdG9tTW92YWJsZSIsImlzRGVsZXRlZCIsImdldFNpYmxpbmciLCJpbnRlcm5hbENvbnRleHQiLCJjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2siLCJub2RlVHlwZVBhcmFtZXRlcnMiLCJwb3NzaWJsZVZhbHVlcyIsInZhbHVlcyIsIm9wdGlvbiIsInZhbHVlIiwiZW5hYmxlbWVudEZ1bmN0aW9uIiwiZW5hYmxlZEZsYWdzIiwiX2Vycm9yIiwiZW5hYmxlbWVudE1hcCIsInNvbWUiLCJmbGFnIiwiZm9yRWFjaCIsImluZGV4IiwiY29udGV4dFBhdGgiLCJjbGVhclNlbGVjdGlvbiIsImludGVybmFsTW9kZWxDb250ZXh0Iiwic0FjdGlvbiIsImJFbmFibGVkIiwib25GaWVsZENoYW5nZUluQ3JlYXRpb25Sb3ciLCJvRXZlbnQiLCJ3aXRoQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwibUZpZWxkIiwiRmllbGRSdW50aW1lSGVscGVyIiwiZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlIiwib1NvdXJjZUZpZWxkIiwiZmllbGQiLCJzRmllbGRJZCIsIm1GaWVsZFZhbGlkaXR5IiwibU5ld0ZpZWxkVmFsaWRpdHkiLCJzdGF0ZSIsIm1DdXN0b21WYWxpZGl0eSIsIm1OZXdDdXN0b21WYWxpZGl0eSIsImZpZWxkSWQiLCJzVGFyZ2V0IiwiZ2V0QmluZGluZ1BhdGgiLCJNZXNzYWdpbmciLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwib01lc3NhZ2UiLCJnZXRUYXJnZXRzIiwicmVtb3ZlTWVzc2FnZXMiLCJvblRyZWVUYWJsZUNvbnRleHRDaGFuZ2VkIiwiaW5pdGlhbEV4cGFuc2lvbkxldmVsIiwicm93QmluZGluZyIsImdldENvbnRleHQiLCJnZXRJZ25vcmVDb250ZXh0Q2hhbmdlRXZlbnQiLCJhZ2dyZWdhdGlvbiIsImZpbHRlckluZm8iLCJUYWJsZVV0aWxzIiwiZ2V0QWxsRmlsdGVySW5mbyIsImV4cGFuZFRvIiwic2VhcmNoIiwiTnVtYmVyIiwiTUFYX1NBRkVfSU5URUdFUiIsInNldEFnZ3JlZ2F0aW9uIiwib25DcmVhdGVNZW51SXRlbVByZXNzIiwidmFsdWVJbmRleCIsIm1kY1RhYmxlIiwiZ2V0TWRjVGFibGUiLCJjcmVhdGlvbkRhdGEiLCJwcm9wZXJ0eU5hbWUiLCJjcmVhdGlvblBhcmFtZXRlcnMiLCJjcmVhdGlvbk1vZGUiLCJjcmVhdGUiLCJtb2RlIiwidGFibGVJZCIsIkNyZWF0aW9uRGlhbG9nIiwiY3JlYXRpb25EaWFsb2dGaWVsZHMiLCJyZWJpbmQiLCJnZXRDb250cm9sbGVyIiwiZWRpdEZsb3ciLCJjcmVhdGVEb2N1bWVudCIsImNhdGNoIiwib25DcmVhdGVCdXR0b25QcmVzcyIsIkV4dGVybmFsIiwib3V0Ym91bmQiLCJjcmVhdGlvblJvdyIsImNyZWF0ZUF0RW5kIiwiTmV3UGFnZSIsIklubGluZSIsIklubGluZUNyZWF0aW9uUm93cyIsImNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzIiwibmF2aWdhdGlvbkF2YWlsYWJsZU1hcCIsInNLZXkiLCJhQXBwbGljYWJsZSIsImFOb3RBcHBsaWNhYmxlIiwiYkVuYWJsZWRGb3JDb250ZXh0TWVudSIsImFBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnUiLCJhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51Iiwic1Byb3BlcnR5IiwiZW5hYmxlZFByb3BlcnR5IiwiYXBwbGljYWJsZVByb3BlcnR5Iiwibm90QXBwbGljYWJsZVByb3BlcnR5Iiwib25Db250ZXh0TWVudUl0ZW1TZWxlY3RlZCIsInNldENvbnRleHRNZW51QWN0aXZlIiwic2V0VGltZW91dCIsImRhdGFTdGF0ZUluZGljYXRvckZpbHRlciIsIm1lc3NhZ2UiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlRhYmxlUnVudGltZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVNldCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwic2FwL2ZlL2NvcmUvQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBBbnkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL0FueVwiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBDcmVhdGVCZWhhdmlvckV4dGVybmFsLCBVcGRhdGFibGVQcm9wZXJ0eVBhdGhJbmZvIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgZGVsZXRlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCBUYWJsZVV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1V0aWxzXCI7XG5pbXBvcnQgdHlwZSBNZW51SXRlbSBmcm9tIFwic2FwL20vTWVudUl0ZW1cIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgTWVzc2FnaW5nIGZyb20gXCJzYXAvdWkvY29yZS9NZXNzYWdpbmdcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE1EQ1RhYmxlLCBkZWZhdWx0IGFzIFRhYmxlIH0gZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIEFjdGlvblRvb2xiYXJBY3Rpb24gZnJvbSBcInNhcC91aS9tZGMvYWN0aW9udG9vbGJhci9BY3Rpb25Ub29sYmFyQWN0aW9uXCI7XG5pbXBvcnQgdHlwZSBDcmVhdGlvblJvdyBmcm9tIFwic2FwL3VpL21kYy90YWJsZS9DcmVhdGlvblJvd1wiO1xuaW1wb3J0IHR5cGUgUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvUHJvcGVydHlCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBFdmVudFR5cGUgfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgdHlwZSBGaWVsZCBmcm9tIFwiLi4vRmllbGRcIjtcbmltcG9ydCBGaWVsZFJ1bnRpbWVIZWxwZXIgZnJvbSBcIi4uL2ZpZWxkL0ZpZWxkUnVudGltZUhlbHBlclwiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlO1xuLyoqXG4gKiBTdGF0aWMgY2xhc3MgdXNlZCBieSB0aGUgVGFibGUgYnVpbGRpbmcgYmxvY2sgZHVyaW5nIHJ1bnRpbWVcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IFRhYmxlUnVudGltZSA9IHtcblx0ZXhlY3V0ZUNvbmRpdGlvbmFsQWN0aW9uU2hvcnRjdXQ6IGZ1bmN0aW9uIChzQnV0dG9uTWF0Y2hlcjogc3RyaW5nLCBvU291cmNlOiBDb250cm9sKTogdm9pZCB7XG5cdFx0Ly8gR2V0IHRoZSBidXR0b24gcmVsYXRlZCB0byBrZXlib2FyZCBzaG9ydGN1dFxuXHRcdGNvbnN0IG9NZGNUYWJsZSA9IG9Tb3VyY2UuZ2V0UGFyZW50KCkgYXMgTURDVGFibGU7XG5cdFx0aWYgKHNCdXR0b25NYXRjaGVyICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cpIHtcblx0XHRcdGNvbnN0IG9CdXR0b24gPSBvTWRjVGFibGVcblx0XHRcdFx0LmdldEFjdGlvbnMoKVxuXHRcdFx0XHQucmVkdWNlKGZ1bmN0aW9uIChhQWN0aW9uQnV0dG9uczogQ29udHJvbFtdLCBvQWN0aW9uVG9vbGJhckFjdGlvbjogQ29udHJvbCkge1xuXHRcdFx0XHRcdHJldHVybiBhQWN0aW9uQnV0dG9ucy5jb25jYXQoKG9BY3Rpb25Ub29sYmFyQWN0aW9uIGFzIEFjdGlvblRvb2xiYXJBY3Rpb24pLmdldEFjdGlvbigpKTtcblx0XHRcdFx0fSwgW10gYXMgQ29udHJvbFtdKVxuXHRcdFx0XHQuZmluZChmdW5jdGlvbiAob0FjdGlvbkJ1dHRvbjogQ29udHJvbCkge1xuXHRcdFx0XHRcdHJldHVybiBvQWN0aW9uQnV0dG9uLmdldElkKCkuZW5kc1dpdGgoc0J1dHRvbk1hdGNoZXIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdENvbW1vblV0aWxzLmZpcmVCdXR0b25QcmVzcyhvQnV0dG9uKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93ID0gb01kY1RhYmxlLmdldEFnZ3JlZ2F0aW9uKFwiY3JlYXRpb25Sb3dcIikgYXMgQ3JlYXRpb25Sb3c7XG5cdFx0XHRpZiAob0NyZWF0aW9uUm93ICYmIG9DcmVhdGlvblJvdy5nZXRBcHBseUVuYWJsZWQoKSAmJiBvQ3JlYXRpb25Sb3cuZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRcdG9DcmVhdGlvblJvdy5maXJlQXBwbHkoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0c2V0Q29udGV4dHM6IGFzeW5jIGZ1bmN0aW9uIChldmVudDogVUk1RXZlbnQ8e30sIFRhYmxlPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IHRhYmxlID0gc291cmNlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0YWJsZSk7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IFRhYmxlUnVudGltZS5zZXRDb250ZXh0c0FzeW5jKHRhYmxlKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRhYmxlKTtcblx0XHR9XG5cdH0sXG5cblx0c2V0Q29udGV4dHNBc3luYzogYXN5bmMgZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSk6IFByb21pc2U8dm9pZFtdIHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gdGFibGUuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgdW5kZWZpbmVkIHwgT0RhdGFNZXRhTW9kZWw7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRpZiAoIXRhYmxlQVBJIHx8ICFtZXRhTW9kZWwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgdGFibGVEZWZpbml0aW9uID0gdGFibGVBUEkudGFibGVEZWZpbml0aW9uO1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRpdHkgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuY29udmVydFR5cGVzKG1ldGFNb2RlbCkucmVzb2x2ZVBhdGg8RW50aXR5U2V0Pihcblx0XHRcdHRhYmxlRGVmaW5pdGlvbi5hbm5vdGF0aW9uLmNvbGxlY3Rpb25cblx0XHQpLnRhcmdldDtcblxuXHRcdGNvbnN0IGFBY3Rpb25zTXVsdGlzZWxlY3REaXNhYmxlZCA9IHRhYmxlLmRhdGEoXCJhY3Rpb25zTXVsdGlzZWxlY3REaXNhYmxlZFwiKT8uc3BsaXQoXCIsXCIpID8/IFtdO1xuXHRcdGNvbnN0IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAgPSBKU09OLnBhcnNlKHRhYmxlRGVmaW5pdGlvbi5vcGVyYXRpb25BdmFpbGFibGVNYXAgfHwgXCJ7fVwiKTtcblx0XHRjb25zdCBvTmF2aWdhdGlvbkF2YWlsYWJsZU1hcCA9IHRhYmxlLmRhdGEoXCJuYXZpZ2F0aW9uQXZhaWxhYmxlTWFwXCIpO1xuXG5cdFx0Y29uc3QgYVNlbGVjdGVkQ29udGV4dHMgPSB0YWJsZS5nZXRTZWxlY3RlZENvbnRleHRzKCkgYXMgQ29udGV4dFtdO1xuXHRcdGNvbnN0IGFEZWxldGFibGVDb250ZXh0czogQ29udGV4dFtdID0gW107XG5cdFx0Y29uc3QgYlJlYWRPbmx5RHJhZnRFbmFibGVkID1cblx0XHRcdHRhYmxlLmRhdGEoXCJkaXNwbGF5TW9kZVByb3BlcnR5QmluZGluZ1wiKSA9PT0gXCJ0cnVlXCIgJiYgISFjb2xsZWN0aW9uRW50aXR5Py5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Um9vdDtcblx0XHRjb25zdCBhVXBkYXRhYmxlQ29udGV4dHM6IENvbnRleHRbXSA9IFtdO1xuXHRcdC8vIG9EeW5hbWljQWN0aW9ucyBhcmUgYm91bmQgYWN0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgYWNjb3JkaW5nIHRvIHNvbWUgcHJvcGVydHlcblx0XHQvLyBpbiBlYWNoIGl0ZW1cblx0XHRjb25zdCBvRHluYW1pY0FjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgYkVuYWJsZWQ/OiBib29sZWFuIH0+IHwgdW5kZWZpbmVkID0ge307XG5cdFx0Y29uc3Qgb0lCTiA9IHt9O1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cblx0XHRpZiAoIW9JbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBmb3IgdGhlIGRlbGV0ZSB3ZSBjb25zaWRlciB0aGUgaW5hY3RpdmUgY29udGV4dHMgYXMgcG90ZW50aWFsbHkgcGFydCBvZiB0aGUgc2VsZWN0ZWQgY29udGV4dHNcblx0XHRkZWxldGVIZWxwZXIudXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBhU2VsZWN0ZWRDb250ZXh0cyk7XG5cblx0XHQvL2RvIG5vdCBjb25zaWRlciBlbXB0eSByb3dzIGFzIHNlbGVjdGVkIGNvbnRleHQsIGZvciB0aGUgb3RoZXIgYWN0aW9uc1xuXHRcdGNvbnN0IGFjdGl2ZVNlbGVjdGVkQ29udGV4dHMgPSBhU2VsZWN0ZWRDb250ZXh0cy5maWx0ZXIoZnVuY3Rpb24gKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gIW9Db250ZXh0LmlzSW5hY3RpdmUoKTtcblx0XHR9KTtcblxuXHRcdGNvbnN0IG9Nb2RlbE9iamVjdCA9IE9iamVjdC5hc3NpZ24ob0ludGVybmFsTW9kZWxDb250ZXh0LmdldE9iamVjdCgpIHx8IHt9LCB7XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzOiBhY3RpdmVTZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0c2VsZWN0ZWRDb250ZXh0c0luY2x1ZGluZ0luYWN0aXZlOiBhU2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0czogYWN0aXZlU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGgsXG5cdFx0XHRkeW5hbWljQWN0aW9uczogb0R5bmFtaWNBY3Rpb25zLFxuXHRcdFx0aWJuOiBvSUJOLFxuXHRcdFx0ZGVsZXRlRW5hYmxlZDogdHJ1ZSxcblx0XHRcdGRlbGV0YWJsZUNvbnRleHRzOiBhRGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHR1blNhdmVkQ29udGV4dHM6IFtdLFxuXHRcdFx0bG9ja2VkQ29udGV4dHM6IFtdLFxuXHRcdFx0ZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZTogW10sXG5cdFx0XHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlOiBbXSxcblx0XHRcdGNvbnRyb2xJZDogXCJcIixcblx0XHRcdHVwZGF0YWJsZUNvbnRleHRzOiBhVXBkYXRhYmxlQ29udGV4dHMsXG5cdFx0XHRwYXN0ZUF1dGhvcml6ZWQ6IHRydWUsXG5cdFx0XHRwYXN0ZUZyb21Db3B5QXV0b3JpemVkOiB0cnVlLFxuXHRcdFx0c2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvcjogb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwic2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvclwiKVxuXHRcdFx0XHQ/IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcInNlbWFudGljS2V5SGFzRHJhZnRJbmRpY2F0b3JcIilcblx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHR9KTtcblx0XHRvTW9kZWxPYmplY3Qubm9kZVVwZGF0ZXNJbmZvID0gb01vZGVsT2JqZWN0Lm5vZGVVcGRhdGVzSW5mbyB8fCB7fTtcblxuXHRcdGZvciAoY29uc3Qgb1NlbGVjdGVkQ29udGV4dCBvZiBhY3RpdmVTZWxlY3RlZENvbnRleHRzKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gb0NvbnRleHREYXRhKSB7XG5cdFx0XHRcdGlmIChrZXkuaW5kZXhPZihcIiNcIikgPT09IDApIHtcblx0XHRcdFx0XHRsZXQgc0FjdGlvblBhdGg6IHN0cmluZyA9IGtleTtcblx0XHRcdFx0XHRzQWN0aW9uUGF0aCA9IHNBY3Rpb25QYXRoLnN1YnN0cmluZygxLCBzQWN0aW9uUGF0aC5sZW5ndGgpO1xuXHRcdFx0XHRcdG9Nb2RlbE9iamVjdC5keW5hbWljQWN0aW9uc1tzQWN0aW9uUGF0aF0gPSB7IGVuYWJsZWQ6IHRydWUgfTtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJcIiwgb01vZGVsT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuaXNVcGRhdGFibGVDb250ZXh0KHRhYmxlRGVmaW5pdGlvbi5hbm5vdGF0aW9uLnVwZGF0YWJsZVByb3BlcnR5UGF0aEluZm8sIG9TZWxlY3RlZENvbnRleHQsIGJSZWFkT25seURyYWZ0RW5hYmxlZCkpIHtcblx0XHRcdFx0YVVwZGF0YWJsZUNvbnRleHRzLnB1c2gob1NlbGVjdGVkQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCF0YWJsZS5kYXRhKFwiZW5hYmxlQW5hbHl0aWNzXCIpKSB7XG5cdFx0XHRUYWJsZVJ1bnRpbWUuc2V0SW50ZW50QmFzZWROYXZpZ2F0aW9uRW5hYmxlbWVudChvSW50ZXJuYWxNb2RlbENvbnRleHQsIG9OYXZpZ2F0aW9uQXZhaWxhYmxlTWFwLCBhY3RpdmVTZWxlY3RlZENvbnRleHRzKTtcblx0XHR9XG5cblx0XHRpZiAoYWN0aXZlU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHR0aGlzLmRpc2FibGVBY3Rpb24oYUFjdGlvbnNNdWx0aXNlbGVjdERpc2FibGVkLCBvRHluYW1pY0FjdGlvbnMpO1xuXHRcdH1cblxuXHRcdGlmIChvTW9kZWxPYmplY3QpIHtcblx0XHRcdG9Nb2RlbE9iamVjdFtcInVwZGF0YWJsZUNvbnRleHRzXCJdID0gYVVwZGF0YWJsZUNvbnRleHRzO1xuXHRcdFx0b01vZGVsT2JqZWN0W1wiY29udHJvbElkXCJdID0gdGFibGUuZ2V0SWQoKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIlwiLCBvTW9kZWxPYmplY3QpO1xuXHRcdH1cblxuXHRcdC8vIE1hbmFnZSBhIHBvdGVudGlhbCBjYWxsYmFjayB0byBlbmFibGUvZGlzYWJsZSB0aGUgY3JlYXRlIGJ1dHRvbi9tZW51IGZvciBhIFRyZWVUYWJsZVxuXHRcdGlmIChhY3RpdmVTZWxlY3RlZENvbnRleHRzLmxlbmd0aCA8PSAxICYmIHRhYmxlRGVmaW5pdGlvbi5jb250cm9sLmNyZWF0ZUVuYWJsZW1lbnQpIHtcblx0XHRcdGNvbnN0IHBhcmVudENvbnRleHQgPSBhY3RpdmVTZWxlY3RlZENvbnRleHRzLmxlbmd0aCA/IGFjdGl2ZVNlbGVjdGVkQ29udGV4dHNbMF0gOiBudWxsO1xuXHRcdFx0dGhpcy5fdXBkYXRlQ3JlYXRlRW5hYmxlbWVudChcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHR0YWJsZURlZmluaXRpb24uY29udHJvbC5jcmVhdGVFbmFibGVtZW50LFxuXHRcdFx0XHR0YWJsZSxcblx0XHRcdFx0cGFyZW50Q29udGV4dCxcblx0XHRcdFx0dGFibGVEZWZpbml0aW9uLmNvbnRyb2wubm9kZVR5cGVcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVDdXRDb3B5UGFzdGVFbmFibGVtZW50KG9Nb2RlbE9iamVjdCwgdGFibGUpO1xuXHRcdHRoaXMudXBkYXRlTW92ZVVwRG93bkVuYWJsZW1lbnQob01vZGVsT2JqZWN0LCB0YWJsZSk7XG5cdFx0cmV0dXJuIEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChvSW50ZXJuYWxNb2RlbENvbnRleHQsIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAsIGFjdGl2ZVNlbGVjdGVkQ29udGV4dHMsIFwidGFibGVcIik7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgc2VsZWN0ZWQgY29udGV4dCBpcyB1cGRhdGFibGUgZm9yIE1hc3MgRWRpdC5cblx0ICogQHBhcmFtIHVwZGF0YWJsZVByb3BlcnR5UGF0aEluZm8gVGhlIHVwZGF0YWJsZVByb3BlcnR5UGF0aEluZm8gZnJvbSB0aGUgdGFibGUgYW5ub3RhdGlvblxuXHQgKiBAcGFyYW0gc2VsZWN0ZWRDb250ZXh0IFRoZSBzZWxlY3RlZCBjb250ZXh0XG5cdCAqIEBwYXJhbSByZWFkT25seURyYWZ0RW5hYmxlZCBJbmRpY2F0ZXMsIGlmIHRoZSB0YWJsZSBpcyByZWFkIG9ubHkgYW5kIGRyYWZ0IGVuYWJsZWRcblx0ICogQHJldHVybnMgQm9vbGVhbiBJbmRpY2F0aW5nIGNvbnRleHQgaXMgdXBkYXRhYmxlXG5cdCAqL1xuXG5cdGlzVXBkYXRhYmxlQ29udGV4dDogZnVuY3Rpb24gKFxuXHRcdHVwZGF0YWJsZVByb3BlcnR5UGF0aEluZm86IFVwZGF0YWJsZVByb3BlcnR5UGF0aEluZm8gfCB1bmRlZmluZWQsXG5cdFx0c2VsZWN0ZWRDb250ZXh0OiBDb250ZXh0LFxuXHRcdHJlYWRPbmx5RHJhZnRFbmFibGVkOiBib29sZWFuXG5cdCk6IGJvb2xlYW4ge1xuXHRcdC8qIFRoZSB1cGRhdGFibGUgY29udGV4dHMgd2l0aCBtYXNzIGVkaXQgZGVwZW5kIG9uIHRoZSBmb2xsb3dpbmc6XG5cdFx0IFx0MS4gVGhlIHVwZGF0ZSBpcyBkZXBlbmRlbnQgb24gY3VycmVudCBlbnRpdHkgcHJvcGVydHkgKHVwZGF0YWJsZVBhdGhzKS5cblx0XHQgXHQyLiBUaGUgdGFibGUgaXMgcmVhZCBvbmx5IGFuZCBkcmFmdCBlbmFibGVkIChzdWNoIGFzIG9uIHRoZSBsaXN0IHJlcG9ydCBwYWdlKS4gT25seSBhY3RpdmUgY29udGV4dHMgY2FuIGJlIHVzZWQgd2l0aCBtYXNzIGVkaXQgKG5vdCBkcmFmdCBjb250ZXh0cykuXG5cdFx0ICAgIFNvLCB1cGRhdGUgZGVwZW5kcyBvbiAnSXNBY3RpdmVFbnRpdHknLCAnSGFzRHJhZnRFbnRpdHknICB2YWx1ZSB3aGljaCBuZWVkcyB0byBiZSBjaGVja2VkLiAqL1xuXHRcdGNvbnN0IGNvbnRleHREYXRhID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdGNvbnN0IG5vdERyYWZ0SW5SZWFkT25seU1vZGUgPSAhcmVhZE9ubHlEcmFmdEVuYWJsZWQgfHwgKGNvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmICFjb250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSk7XG5cdFx0aWYgKCFub3REcmFmdEluUmVhZE9ubHlNb2RlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghdXBkYXRhYmxlUHJvcGVydHlQYXRoSW5mbyB8fCB1cGRhdGFibGVQcm9wZXJ0eVBhdGhJbmZvLnBhdGhzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmICh1cGRhdGFibGVQcm9wZXJ0eVBhdGhJbmZvLmlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gISFzZWxlY3RlZENvbnRleHQuZ2V0UHJvcGVydHkodXBkYXRhYmxlUHJvcGVydHlQYXRoSW5mby5wYXRoc1swXSk7XG5cdFx0fVxuXHRcdGNvbnN0IGFueU9iamVjdCA9IG5ldyBBbnkoeyBhbnlCb29sZWFuOiB1cGRhdGFibGVQcm9wZXJ0eVBhdGhJbmZvLmJpbmRpbmdFeHByZXNzaW9uIH0pO1xuXHRcdGFueU9iamVjdC5zZXRNb2RlbChzZWxlY3RlZENvbnRleHQuZ2V0TW9kZWwoKSk7XG5cdFx0YW55T2JqZWN0LnNldEJpbmRpbmdDb250ZXh0KHNlbGVjdGVkQ29udGV4dCk7XG5cdFx0Y29uc3QgaXNVcGRhdGFibGUgPSAoYW55T2JqZWN0LmdldEJpbmRpbmcoXCJhbnlCb29sZWFuXCIpIGFzIFByb3BlcnR5QmluZGluZykuZ2V0RXh0ZXJuYWxWYWx1ZSgpIGFzIGJvb2xlYW47XG5cdFx0YW55T2JqZWN0LmRlc3Ryb3koKTtcblx0XHRyZXR1cm4gISFpc1VwZGF0YWJsZTtcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBub2RlIGlzIG1vdmFibGUgYWNjb3JkaW5nIHRvIHRoZSBjdXN0b20gbG9naWMgKGlmIGFueSkuXG5cdCAqIEBwYXJhbSBub2RlXG5cdCAqIEBwYXJhbSB0YWJsZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjdXN0b20gbG9naWMgYWxsb3dzIHRoZSBub2RlIHRvIGJlIG1vdmVkIChvciBpZiB0aGVyZSdzIG5vIGN1c3RvbSBsb2dpYyksIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0Y2hlY2tJZk5vZGVJc01vdmFibGU6IGZ1bmN0aW9uIChub2RlOiBDb250ZXh0LCB0YWJsZTogVGFibGUpOiBib29sZWFuIHtcblx0XHRjb25zdCBpc05vZGVNb3ZhYmxlRnVuY3Rpb24gPSAodGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpLmdldFRhYmxlRGVmaW5pdGlvbigpLmNvbnRyb2wuaXNOb2RlTW92YWJsZTtcblx0XHRjb25zdCBub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uID0gaXNOb2RlTW92YWJsZUZ1bmN0aW9uXG5cdFx0XHQ/IEZQTUhlbHBlci5nZXRDdXN0b21GdW5jdGlvbjwoY29udGV4dDogQ29udGV4dCkgPT4gYm9vbGVhbj4oXG5cdFx0XHRcdFx0aXNOb2RlTW92YWJsZUZ1bmN0aW9uLm1vZHVsZU5hbWUsXG5cdFx0XHRcdFx0aXNOb2RlTW92YWJsZUZ1bmN0aW9uLm1ldGhvZE5hbWUsXG5cdFx0XHRcdFx0dGFibGVcblx0XHRcdCAgKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIG5vZGVNb3ZhYmxlQ3VzdG9tRnVuY3Rpb24gPT09IHVuZGVmaW5lZCB8fCBub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uKG5vZGUpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cud2FybmluZyhgRXJyb3IgaW4gY3VzdG9tIGZ1bmN0aW9uIGZvciBpc05vZGVNb3ZhYmxlOiAke2Vycm9yfWApO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2hldGhlciB0aGUgbm9kZSBjYW4gYmUgY29waWVkIGFjY29yZGluZyB0byB0aGUgY3VzdG9tIGxvZ2ljLCBpZiBhbnkuXG5cdCAqIEBwYXJhbSBub2RlXG5cdCAqIEBwYXJhbSB0YWJsZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGN1c3RvbSBsb2dpYyBhbGxvd3MgdGhlIG5vZGUgdG8gYmUgY29waWVkIChvciBpZiBubyBjdXN0b20gbG9naWMgaXMgZGVmaW5lZCk7IGZhbHNlIG90aGVyd2lzZS5cblx0ICovXG5cdGNoZWNrSWZOb2RlSXNDb3B5YWJsZTogZnVuY3Rpb24gKG5vZGU6IENvbnRleHQsIHRhYmxlOiBUYWJsZSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGlzTm9kZUNvcHlhYmxlRnVuY3Rpb24gPSAodGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpLmdldFRhYmxlRGVmaW5pdGlvbigpLmNvbnRyb2wuaXNOb2RlQ29weWFibGU7XG5cdFx0Y29uc3Qgbm9kZU1vdmFibGVDdXN0b21GdW5jdGlvbiA9IGlzTm9kZUNvcHlhYmxlRnVuY3Rpb25cblx0XHRcdD8gRlBNSGVscGVyLmdldEN1c3RvbUZ1bmN0aW9uPChjb250ZXh0OiBDb250ZXh0KSA9PiBib29sZWFuPihcblx0XHRcdFx0XHRpc05vZGVDb3B5YWJsZUZ1bmN0aW9uLm1vZHVsZU5hbWUsXG5cdFx0XHRcdFx0aXNOb2RlQ29weWFibGVGdW5jdGlvbi5tZXRob2ROYW1lLFxuXHRcdFx0XHRcdHRhYmxlXG5cdFx0XHQgIClcblx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBub2RlTW92YWJsZUN1c3RvbUZ1bmN0aW9uID09PSB1bmRlZmluZWQgfHwgbm9kZU1vdmFibGVDdXN0b21GdW5jdGlvbihub2RlKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLndhcm5pbmcoYEVycm9yIGluIGN1c3RvbSBmdW5jdGlvbiBmb3IgaXNOb2RlTW92YWJsZTogJHtlcnJvcn1gKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgY29udGV4dCB0byBlbmFibGUvZGlzYWJsZSB0aGUgQ3V0IGFuZCBQYXN0ZSBidXR0b25zLlxuXHQgKiBAcGFyYW0gbW9kZWxPYmplY3QgSW50ZXJuYWwgY29udGV4dCBvYmplY3Qgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSB0YWJsZSBJbnN0YW5jZSBvZiB0aGUgVGFibGVcblx0ICogQHBhcmFtIGZvckNvbnRleHRNZW51XG5cdCAqL1xuXHR1cGRhdGVDdXRDb3B5UGFzdGVFbmFibGVtZW50OiBmdW5jdGlvbiAobW9kZWxPYmplY3Q6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9LCB0YWJsZTogVGFibGUsIGZvckNvbnRleHRNZW51ID0gZmFsc2UpOiB2b2lkIHtcblx0XHRtb2RlbE9iamVjdC5jb250ZXh0bWVudSA9IG1vZGVsT2JqZWN0LmNvbnRleHRtZW51ID8/IHsgc2VsZWN0ZWRDb250ZXh0czogW10gfTtcblxuXHRcdGNvbnN0IHRhYmxlRGVmaW5pdGlvbiA9ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCk7XG5cdFx0aWYgKHRhYmxlRGVmaW5pdGlvbi5jb250cm9sLnR5cGUgIT09IFwiVHJlZVRhYmxlXCIpIHtcblx0XHRcdC8vIFRoZSBsb2dpYyBiZWxvdyBvbmx5IG1ha2VzIHNlbnNlIGZvciBhIFRyZWUgVGFibGVcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgdmlldyA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcodGFibGUpO1xuXHRcdGNvbnN0IGlzVmlld0VkaXRhYmxlID0gQ29tbW9uVXRpbHMuZ2V0SXNFZGl0YWJsZSh2aWV3KTtcblx0XHRpZiAodmlldy5nZXRDb250cm9sbGVyTmFtZSgpICE9PSBcInNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5MaXN0UmVwb3J0Q29udHJvbGxlclwiICYmICFpc1ZpZXdFZGl0YWJsZSkge1xuXHRcdFx0Ly8gSWYgdGhlIHZpZXcgaXMgbm90IGVkaXRhYmxlLCB3ZSBkaXNhYmxlIHRoZSBjdXQvY29weS9wYXN0ZSBmdW5jdGlvbmFsaXR5IGFuZCBjbGVhciB0aGUgbm9kZVVwZGF0ZXNJbmZvXG5cdFx0XHRtb2RlbE9iamVjdC5ub2RlVXBkYXRlc0luZm8gPSB7fTtcblx0XHRcdChtb2RlbE9iamVjdC5jb250ZXh0bWVudSBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkubm9kZVVwZGF0ZXNJbmZvID0ge307XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGNoZWNrRHJhZnRJbnN0YW5jZSA9ICF0YWJsZS5nZXRSb3dCaW5kaW5nKCkuaXNSZWxhdGl2ZSgpO1xuXG5cdFx0aWYgKGZvckNvbnRleHRNZW51KSB7XG5cdFx0XHQobW9kZWxPYmplY3QuY29udGV4dG1lbnUgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pLm5vZGVVcGRhdGVzSW5mbyA9IHt9O1xuXHRcdH1cblx0XHRjb25zdCBub2RlVXBkYXRlc0luZm8gPSBtb2RlbE9iamVjdC5ub2RlVXBkYXRlc0luZm8gYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG5cdFx0Ly9JZiB0aGUgcGFzdGFibGVDb250ZXh0IGJlY29tZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgbGlzdEJpbmRpbmcsIGZvciBleGFtcGxlLCB3aGVuIHRoZSB1c2VyIGNvbGxhcHNlcyB0aGUgcGFyZW50IG5vZGUsIHdlIGF0dGVtcHQgdG8gbG9jYXRlIHRoZSBjb3JyZWN0IGNvbnRleHQgYnkgY29tcGFyaW5nIHRoZWlyIHBhdGhzXG5cdFx0Y29uc3QgcGFzdGFibGVDb250ZXh0czogQ29udGV4dFtdID0gdGFibGVcblx0XHRcdC5nZXRSb3dCaW5kaW5nKClcblx0XHRcdC5nZXRBbGxDdXJyZW50Q29udGV4dHMoKVxuXHRcdFx0LmZpbHRlcigoY29udGV4dCkgPT5cblx0XHRcdFx0KChub2RlVXBkYXRlc0luZm8ucGFzdGFibGVDb250ZXh0cyB8fCBbXSkgYXMgQ29udGV4dFtdKVxuXHRcdFx0XHRcdC5tYXAoKHBhc3RhYmxlQ29udGV4dCkgPT4gcGFzdGFibGVDb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0XHQuaW5jbHVkZXMoY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHQpO1xuXG5cdFx0aWYgKHBhc3RhYmxlQ29udGV4dHMubGVuZ3RoICE9PSAoKG5vZGVVcGRhdGVzSW5mby5wYXN0YWJsZUNvbnRleHRzIHx8IFtdKSBhcyBDb250ZXh0W10pLmxlbmd0aCkge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3coXCJcIiArIFJlc291cmNlTW9kZWxIZWxwZXIuZ2V0UmVzb3VyY2VNb2RlbCh0YWJsZSkuZ2V0VGV4dChcIk1fUEFTVEFCTEVfQ09OVEVYVFNfTk9UX0FWQUlMQUJMRVwiKSk7XG5cdFx0fVxuXHRcdGNvbnN0IGNvcHlDdXRQYXN0ZUVuYWJsZW1lbnRJbmZvID0gKCghZm9yQ29udGV4dE1lbnUgPyBtb2RlbE9iamVjdCA6IG1vZGVsT2JqZWN0LmNvbnRleHRtZW51KSBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSlcblx0XHRcdC5ub2RlVXBkYXRlc0luZm8gYXMge1xuXHRcdFx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0XHR9O1xuXHRcdGNvbnN0IGRhdGFNb2RlbHNyYyA9ICghZm9yQ29udGV4dE1lbnUgPyBtb2RlbE9iamVjdCA6IG1vZGVsT2JqZWN0LmNvbnRleHRtZW51KSBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfTtcblx0XHRjb25zdCBjdXRhYmxlQ29udGV4dHMgPSAoZGF0YU1vZGVsc3JjLnVwZGF0YWJsZUNvbnRleHRzIGFzIENvbnRleHRbXSkuZmlsdGVyKFxuXHRcdFx0KGNvbnRleHQpID0+XG5cdFx0XHRcdFRhYmxlUnVudGltZS5jaGVja0lmTm9kZUlzTW92YWJsZShjb250ZXh0LCB0YWJsZSkgJiYgKCFjaGVja0RyYWZ0SW5zdGFuY2UgfHwgY29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpICE9PSB0cnVlKVxuXHRcdCk7XG5cdFx0Y29uc3QgY29weWFibGVDb250ZXh0cyA9IChkYXRhTW9kZWxzcmMuc2VsZWN0ZWRDb250ZXh0cyBhcyBDb250ZXh0W10pLmZpbHRlcigoY29udGV4dCkgPT5cblx0XHRcdFRhYmxlUnVudGltZS5jaGVja0lmTm9kZUlzQ29weWFibGUoY29udGV4dCwgdGFibGUpXG5cdFx0KTtcblx0XHRjb25zdCBzZWxlY3RlZENvbnRleHRzID0gZGF0YU1vZGVsc3JjLnNlbGVjdGVkQ29udGV4dHMgYXMgQ29udGV4dFtdO1xuXHRcdGNvcHlDdXRQYXN0ZUVuYWJsZW1lbnRJbmZvLmN1dEVuYWJsZW1lbnQgPSBzZWxlY3RlZENvbnRleHRzLmxlbmd0aCA9PT0gMSAmJiBjdXRhYmxlQ29udGV4dHMubGVuZ3RoID09PSAxO1xuXHRcdGNvcHlDdXRQYXN0ZUVuYWJsZW1lbnRJbmZvLmNvcHlFbmFibGVtZW50ID0gc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPT09IDEgJiYgY29weWFibGVDb250ZXh0cy5sZW5ndGggPT09IDE7XG5cblx0XHRpZiAobm9kZVVwZGF0ZXNJbmZvLmxhc3RBY3Rpb24pIHtcblx0XHRcdGlmIChwYXN0YWJsZUNvbnRleHRzPy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Y29weUN1dFBhc3RlRW5hYmxlbWVudEluZm8ucGFzdGVFbmFibGVtZW50ID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBjb250ZXh0c2ZvclBhc3RhYmxlRW5hYmxlbWVudDogQ29udGV4dFtdO1xuXHRcdFx0Y29uc3QgZXh0ZW5zaW9uUG9pbnQgPVxuXHRcdFx0XHRub2RlVXBkYXRlc0luZm8ubGFzdEFjdGlvbiA9PT0gXCJDdXRcIlxuXHRcdFx0XHRcdD8gdGFibGVEZWZpbml0aW9uLmNvbnRyb2wuaXNNb3ZlVG9Qb3NpdGlvbkFsbG93ZWRcblx0XHRcdFx0XHQ6IHRhYmxlRGVmaW5pdGlvbi5jb250cm9sLmlzQ29weVRvUG9zaXRpb25BbGxvd2VkO1xuXG5cdFx0XHQvL3JlbW92ZSBjb250ZXh0cyBkZXBlbmRpbmcgb2YgdGhlIGN1c3RvbSBmdW5jdGlvblxuXHRcdFx0aWYgKGV4dGVuc2lvblBvaW50KSB7XG5cdFx0XHRcdGNvbnRleHRzZm9yUGFzdGFibGVFbmFibGVtZW50ID0gWy4uLnNlbGVjdGVkQ29udGV4dHNdLmZpbHRlcihcblx0XHRcdFx0XHQodGFyZ2V0Q29udGV4dCkgPT5cblx0XHRcdFx0XHRcdChcblx0XHRcdFx0XHRcdFx0RlBNSGVscGVyLmdldEN1c3RvbUZ1bmN0aW9uPChjb250ZXh0czogQ29udGV4dFtdKSA9PiBib29sZWFuPihcblx0XHRcdFx0XHRcdFx0XHRleHRlbnNpb25Qb2ludC5tb2R1bGVOYW1lLFxuXHRcdFx0XHRcdFx0XHRcdGV4dGVuc2lvblBvaW50Lm1ldGhvZE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0dGFibGVcblx0XHRcdFx0XHRcdFx0KSBhcyBGdW5jdGlvblxuXHRcdFx0XHRcdFx0KShwYXN0YWJsZUNvbnRleHRzWzBdLCB0YXJnZXRDb250ZXh0KSAvL25vZGVVcGRhdGVzSW5mby5wYXN0YWJsZUNvbnRleHRzIGhhcyBiZWVuIHRoZSBsYXN0IHRpbWUgdGhlIHVzZXIgcHJlc3NlZCB0aGUgY3V0L2NvcHkgYnV0dG9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb250ZXh0c2ZvclBhc3RhYmxlRW5hYmxlbWVudCA9IFsuLi5zZWxlY3RlZENvbnRleHRzXTtcblx0XHRcdH1cblxuXHRcdFx0Ly90aGUgcGFzdGUgY2Fubm90IGJlIGRvbmUgaWYgc2V2ZXJhbCBjb250ZXh0cyBhcmUgc2VsZWN0ZWRcblx0XHRcdGNvcHlDdXRQYXN0ZUVuYWJsZW1lbnRJbmZvLnBhc3RlRW5hYmxlbWVudCA9XG5cdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMubGVuZ3RoIDw9IDEgJiYgY29udGV4dHNmb3JQYXN0YWJsZUVuYWJsZW1lbnQubGVuZ3RoID09PSBzZWxlY3RlZENvbnRleHRzLmxlbmd0aDtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqICBVcGRhdGVzIHRoZSBpbnRlcm5hbCBjb250ZXh0IHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBtb3ZlIHVwL21vdmUgZG93biBidXR0b25zLlxuXHQgKiBAcGFyYW0gbW9kZWxPYmplY3Rcblx0ICogQHBhcmFtIHRhYmxlXG5cdCAqIEBwYXJhbSBmb3JDb250ZXh0TWVudVxuXHQgKi9cblx0dXBkYXRlTW92ZVVwRG93bkVuYWJsZW1lbnQ6IGZ1bmN0aW9uIChtb2RlbE9iamVjdDogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0sIHRhYmxlOiBUYWJsZSwgZm9yQ29udGV4dE1lbnUgPSBmYWxzZSk6IHZvaWQge1xuXHRcdGNvbnN0IG1vZGVsT2JqZWN0UGF0aCA9ICFmb3JDb250ZXh0TWVudSA/IG1vZGVsT2JqZWN0IDogKG1vZGVsT2JqZWN0LmNvbnRleHRtZW51IGFzIHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KTtcblx0XHRjb25zdCBzZWxlY3RlZENvbnRleHRzID0gbW9kZWxPYmplY3RQYXRoLnNlbGVjdGVkQ29udGV4dHMgYXMgQ29udGV4dFtdO1xuXHRcdGNvbnN0IHRhYmxlRGVmaW5pdGlvbiA9ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCk7XG5cblx0XHRjb25zdCBjaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQgPSB0YWJsZURlZmluaXRpb24uYW5ub3RhdGlvbi5jaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQ7XG5cdFx0Ly8gRGlzYWJsZSB0aGUgbW92ZSB1cC9tb3ZlIGRvd24gYnV0dG9ucyBpZiB0aGVyZSBhcmUgbm8gc2VsZWN0ZWQgY29udGV4dHMsIGlmIHRoZSB0YWJsZSBpcyBub3QgYSBUcmVlVGFibGUsIG9yIGlmIHRoZSB0YWJsZSBpcyBzb3J0ZWRcblx0XHRpZiAoXG5cdFx0XHRzZWxlY3RlZENvbnRleHRzLmxlbmd0aCAhPT0gMSB8fFxuXHRcdFx0dGFibGVEZWZpbml0aW9uLmNvbnRyb2wudHlwZSAhPT0gXCJUcmVlVGFibGVcIiB8fFxuXHRcdFx0dGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJpc1NvcnRlZFwiKSA9PT0gdHJ1ZSB8fFxuXHRcdFx0KHNlbGVjdGVkQ29udGV4dHNbMF0uZ2V0UHJvcGVydHkoXCJAJHVpNS5ub2RlLmxldmVsXCIpID09PSAxICYmICFjaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQpIC8vIERpc2FibGUgbW92ZSB1cC9kb3duIGZvciByb290c1xuXHRcdCkge1xuXHRcdFx0bW9kZWxPYmplY3RQYXRoLnNpbmdsZUNvbnRleHRNb3ZhYmxlVXAgPSBmYWxzZTtcblx0XHRcdG1vZGVsT2JqZWN0UGF0aC5zaW5nbGVDb250ZXh0TW92YWJsZURvd24gPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbW92ZWRDb250ZXh0ID0gc2VsZWN0ZWRDb250ZXh0c1swXTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIGNvbnRleHQgY2FuIGJlIG1vdmVkIGFjY29yZGluZyB0byB0aGUgY3VzdG9tIGxvZ2ljIChpZiBhbnkpIGFuZCBpZiBpdCBkb2Vzbid0IGhhdmUgYSBkcmFmdCBpbnN0YW5jZSBpZiB3ZSdyZSBpbiBhIExpc3RSZXBvcnQsXG5cdFx0XHQvLyBhbmQgaWYgaXQncyBub3Qgb3V0LW9mLXBsYWNlIChpLmUuIGl0IG11c3QgYmUgZGlzcGxheWVkIGF0IGl0cyAncmVhbCcgcG9zaXRpb24pXG5cdFx0XHRjb25zdCBtb3ZhYmxlRHJhZnQgPSB0YWJsZS5nZXRSb3dCaW5kaW5nKCkuaXNSZWxhdGl2ZSgpIHx8IG1vdmVkQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpICE9PSB0cnVlO1xuXHRcdFx0Y29uc3Qgb3V0T2ZQbGFjZUNvbnRleHQgPSBtb3ZlZENvbnRleHQuaXNUcmFuc2llbnQoKSAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgY3VzdG9tTW92YWJsZSA9IFRhYmxlUnVudGltZS5jaGVja0lmTm9kZUlzTW92YWJsZShtb3ZlZENvbnRleHQsIHRhYmxlKTtcblx0XHRcdG1vZGVsT2JqZWN0UGF0aC5zaW5nbGVDb250ZXh0TW92YWJsZVVwID1cblx0XHRcdFx0bW92YWJsZURyYWZ0ICYmIGN1c3RvbU1vdmFibGUgJiYgIW91dE9mUGxhY2VDb250ZXh0ICYmICFtb3ZlZENvbnRleHQuaXNEZWxldGVkKCkgJiYgbW92ZWRDb250ZXh0LmdldFNpYmxpbmcoLTEpICE9PSBudWxsO1xuXHRcdFx0bW9kZWxPYmplY3RQYXRoLnNpbmdsZUNvbnRleHRNb3ZhYmxlRG93biA9XG5cdFx0XHRcdG1vdmFibGVEcmFmdCAmJiBjdXN0b21Nb3ZhYmxlICYmICFvdXRPZlBsYWNlQ29udGV4dCAmJiAhbW92ZWRDb250ZXh0LmlzRGVsZXRlZCgpICYmIG1vdmVkQ29udGV4dC5nZXRTaWJsaW5nKDEpICE9PSBudWxsO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgY29udGV4dCB0byBlbmFibGUvZGlzYWJsZSB0aGUgQ3JlYXRlIGJ1dHRvbiAvIG1lbnUgLyBtZW51IGl0ZW1zLlxuXHQgKiBAcGFyYW0gaW50ZXJuYWxDb250ZXh0XG5cdCAqIEBwYXJhbSBjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2tcblx0ICogQHBhcmFtIGNyZWF0ZUVuYWJsZW1lbnRDYWxsYmFjay5tb2R1bGVOYW1lXG5cdCAqIEBwYXJhbSBjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2subWV0aG9kTmFtZVxuXHQgKiBAcGFyYW0gdGFibGVcblx0ICogQHBhcmFtIHBhcmVudENvbnRleHRcblx0ICogQHBhcmFtIG5vZGVUeXBlUGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gbm9kZVR5cGVQYXJhbWV0ZXJzLnByb3BlcnR5TmFtZVxuXHQgKiBAcGFyYW0gbm9kZVR5cGVQYXJhbWV0ZXJzLnZhbHVlc1xuXHQgKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcblx0ICovXG5cdF91cGRhdGVDcmVhdGVFbmFibGVtZW50OiBmdW5jdGlvbiAoXG5cdFx0aW50ZXJuYWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2s6IHsgbW9kdWxlTmFtZTogc3RyaW5nOyBtZXRob2ROYW1lOiBzdHJpbmcgfSxcblx0XHR0YWJsZTogVGFibGUsXG5cdFx0cGFyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwsXG5cdFx0bm9kZVR5cGVQYXJhbWV0ZXJzPzogeyBwcm9wZXJ0eU5hbWU6IHN0cmluZzsgdmFsdWVzOiB7IHZhbHVlOiBzdHJpbmcgfVtdIH0sXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiB2b2lkIHtcblx0XHRsZXQgcG9zc2libGVWYWx1ZXM6IChzdHJpbmcgfCB1bmRlZmluZWQpW107XG5cdFx0aWYgKG5vZGVUeXBlUGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBQdXNoIGFsbCBwb3NzaWJsZSB2YWx1ZXMgaW4gdGhlIG1lbnVcblx0XHRcdHBvc3NpYmxlVmFsdWVzID0gbm9kZVR5cGVQYXJhbWV0ZXJzLnZhbHVlcy5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gbWVudSAtLT4gT25seSAndW5kZWZpbmVkJyB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSAnQ3JlYXRlJyBidXR0b25cblx0XHRcdHBvc3NpYmxlVmFsdWVzID0gW3VuZGVmaW5lZF07XG5cdFx0fVxuXG5cdFx0Y29uc3QgZW5hYmxlbWVudEZ1bmN0aW9uID0gRlBNSGVscGVyLmdldEN1c3RvbUZ1bmN0aW9uPChub2RlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgbnVsbCkgPT4gYm9vbGVhbj4oXG5cdFx0XHRjcmVhdGVFbmFibGVtZW50Q2FsbGJhY2subW9kdWxlTmFtZSxcblx0XHRcdGNyZWF0ZUVuYWJsZW1lbnRDYWxsYmFjay5tZXRob2ROYW1lLFxuXHRcdFx0dGFibGVcblx0XHQpO1xuXG5cdFx0aWYgKCFlbmFibGVtZW50RnVuY3Rpb24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZW5hYmxlZEZsYWdzID0gcG9zc2libGVWYWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuXHRcdFx0bGV0IGVuYWJsZWQgPSBmYWxzZTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGVuYWJsZWQgPSAhIShlbmFibGVtZW50RnVuY3Rpb24odmFsdWUsIHBhcmVudENvbnRleHQpID8/IHRydWUpO1xuXHRcdFx0fSBjYXRjaCAoX2Vycm9yKSB7XG5cdFx0XHRcdGVuYWJsZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGVuYWJsZWQ7XG5cdFx0fSk7XG5cdFx0Ly8gZW5hYmxlRmxhZ3NbaV0gaXMgdHJ1ZSA8PT4gcG9zc2libGVWYWx1ZXNbaV0gaXMgYWxsb3dlZCBmb3IgY3JlYXRpb25cblxuXHRcdGNvbnN0IGVuYWJsZW1lbnRNYXA6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cdFx0ZW5hYmxlbWVudE1hcFtcIkNyZWF0ZVwiXSA9IGVuYWJsZWRGbGFncy5zb21lKChmbGFnKSA9PiBmbGFnKTsgLy8gRW5hYmxlIHRoZSBNZW51IChvciB0aGUgYnV0dG9uKSBpZiBhdCBsZWFzdCBvbmUgb3B0aW9uIGlzIHBvc3NpYmxlXG5cdFx0ZW5hYmxlZEZsYWdzLmZvckVhY2goKGVuYWJsZWQsIGluZGV4KSA9PiB7XG5cdFx0XHRlbmFibGVtZW50TWFwW2BDcmVhdGVfJHtpbmRleH1gXSA9IGVuYWJsZWQ7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBjb250ZXh0UGF0aCA9IGZvckNvbnRleHRNZW51ID8gXCJjb250ZXh0bWVudS9cIiA6IFwiXCI7XG5cdFx0aW50ZXJuYWxDb250ZXh0LnNldFByb3BlcnR5KGNvbnRleHRQYXRoICsgXCJjcmVhdGVFbmFibGVtZW50XCIsIGVuYWJsZW1lbnRNYXApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDbGVhcnMgdGhlIHRhYmxlIHNlbGVjdGlvbiwgYW5kIGVuYWJsZXMvZGlzYWJsZXMgdGhlICdDcmVhdGUnIGJ1dHRvbi9tZW51IGlmIG5lY2Vzc2FyeS5cblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZVxuXHQgKi9cblx0Y2xlYXJTZWxlY3Rpb246IGZ1bmN0aW9uICh0YWJsZTogVGFibGUpOiB2b2lkIHtcblx0XHQvLyBDbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb250cm9sXG5cdFx0dGFibGUuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdC8vIFVwZGF0ZSB0aGUgc2VsZWN0aW9uLXJlbGF0ZWQgaW5mb3JtYXRpb24gaW4gdGhlIGludGVybmFsIG1vZGVsXG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSB0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdGlmIChpbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIsIDApO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIsIFtdKTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZGVsZXRhYmxlQ29udGV4dHNcIiwgW10pO1xuXHRcdH1cblxuXHRcdC8vIEVuYWJsZS9kaXNhYmxlIHRoZSAnQ3JlYXRlJyBidXR0b24vbWVudSBpZiBuZWNlc3Nhcnlcblx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdGlmICh0YWJsZUFQSS50YWJsZURlZmluaXRpb24uY29udHJvbC5jcmVhdGVFbmFibGVtZW50KSB7XG5cdFx0XHR0aGlzLl91cGRhdGVDcmVhdGVFbmFibGVtZW50KFxuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dCBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0dGFibGVBUEkudGFibGVEZWZpbml0aW9uLmNvbnRyb2wuY3JlYXRlRW5hYmxlbWVudCxcblx0XHRcdFx0dGFibGUsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5jb250cm9sLm5vZGVUeXBlXG5cdFx0XHQpO1xuXHRcdH1cblx0fSxcblxuXHRkaXNhYmxlQWN0aW9uOiBmdW5jdGlvbiAoYUFjdGlvbnNNdWx0aXNlbGVjdERpc2FibGVkOiBzdHJpbmdbXSwgb0R5bmFtaWNBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IGJFbmFibGVkPzogYm9vbGVhbiB9Pik6IHZvaWQge1xuXHRcdGFBY3Rpb25zTXVsdGlzZWxlY3REaXNhYmxlZC5mb3JFYWNoKGZ1bmN0aW9uIChzQWN0aW9uOiBzdHJpbmcpIHtcblx0XHRcdG9EeW5hbWljQWN0aW9uc1tzQWN0aW9uXSA9IHsgYkVuYWJsZWQ6IGZhbHNlIH07XG5cdFx0fSk7XG5cdH0sXG5cdG9uRmllbGRDaGFuZ2VJbkNyZWF0aW9uUm93OiBmdW5jdGlvbiAob0V2ZW50OiBFdmVudFR5cGU8dHlwZW9mIEZpZWxkLnByb3RvdHlwZS5jaGFuZ2U+LCB3aXRoQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Ly8gQ1JFQVRJT04gUk9XIENBU0Vcblx0XHRjb25zdCBtRmllbGQgPSBGaWVsZFJ1bnRpbWVIZWxwZXIuZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlKG9FdmVudCksXG5cdFx0XHRvU291cmNlRmllbGQgPSBtRmllbGQuZmllbGQsXG5cdFx0XHRzRmllbGRJZCA9IG9Tb3VyY2VGaWVsZC5nZXRJZCgpO1xuXG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1NvdXJjZUZpZWxkLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRtRmllbGRWYWxpZGl0eSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiKSxcblx0XHRcdG1OZXdGaWVsZFZhbGlkaXR5ID0gT2JqZWN0LmFzc2lnbih7fSwgbUZpZWxkVmFsaWRpdHkpO1xuXG5cdFx0bU5ld0ZpZWxkVmFsaWRpdHlbc0ZpZWxkSWRdID0gbUZpZWxkLnN0YXRlO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCBtTmV3RmllbGRWYWxpZGl0eSk7XG5cblx0XHQvLyBwcmVwYXJlIEN1c3RvbSBWYWxpZGF0aW9uXG5cdFx0aWYgKHdpdGhDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdGNvbnN0IG1DdXN0b21WYWxpZGl0eSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIiksXG5cdFx0XHRcdG1OZXdDdXN0b21WYWxpZGl0eSA9IE9iamVjdC5hc3NpZ24oe30sIG1DdXN0b21WYWxpZGl0eSk7XG5cdFx0XHRtTmV3Q3VzdG9tVmFsaWRpdHlbb1NvdXJjZUZpZWxkLmdldEJpbmRpbmcoXCJ2YWx1ZVwiKSEuZ2V0UGF0aCgpXSA9IHtcblx0XHRcdFx0ZmllbGRJZDogb1NvdXJjZUZpZWxkLmdldElkKClcblx0XHRcdH07XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIsIG1OZXdDdXN0b21WYWxpZGl0eSk7XG5cdFx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRjb25zdCBzVGFyZ2V0ID0gYCR7b1NvdXJjZUZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKX0vJHtvU291cmNlRmllbGQuZ2V0QmluZGluZ1BhdGgoXCJ2YWx1ZVwiKX1gO1xuXHRcdFx0TWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0LmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBNZXNzYWdlKSB7XG5cdFx0XHRcdFx0aWYgKG9NZXNzYWdlLmdldFRhcmdldHMoKVswXSA9PT0gc1RhcmdldCkge1xuXHRcdFx0XHRcdFx0TWVzc2FnaW5nLnJlbW92ZU1lc3NhZ2VzKG9NZXNzYWdlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblx0b25UcmVlVGFibGVDb250ZXh0Q2hhbmdlZDogZnVuY3Rpb24gKGV2ZW50OiBVSTVFdmVudCwgaW5pdGlhbEV4cGFuc2lvbkxldmVsPzogbnVtYmVyKTogdm9pZCB7XG5cdFx0Ly8gV2hlbiB0aGUgY29udGV4dCBvZiBhIFRyZWVUYWJsZSBjaGFuZ2VzLCB3ZSB3YW50IHRvIHJlc3RvcmUgaXRzIGV4cGFuc2lvbiBzdGF0ZSB0byB0aGUgZGVmYXVsdDpcblx0XHQvLyAgIC0gYWxsIGV4cGFuZGVkIGlmIHRoZXJlJ3MgYSBzZWFyY2ggcGFyYW1ldGVyIGNvbWluZyBmcm9tIHRoZSBmaWx0ZXJCYXJcblx0XHQvLyAgIC0gb3RoZXJ3aXNlIGluaXRpYWwgZXhwYW5zaW9uIHN0YXRlIGNvbWluZyBmcm9tIHRoZSBQViAoc3RvcmVkIGluIHRoZSBwYXlsb2FkKVxuXHRcdC8vICAgLSBvdGhlcndpc2Ugbm8gZXhwYW5zaW9uIGF0IGFsbFxuXG5cdFx0Y29uc3Qgc291cmNlID0gZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3QgdGFibGUgPSBzb3VyY2UgYXMgVGFibGU7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRjb25zdCByb3dCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdGlmICghcm93QmluZGluZz8uZ2V0Q29udGV4dCgpIHx8IHRhYmxlQVBJLmdldElnbm9yZUNvbnRleHRDaGFuZ2VFdmVudCgpKSB7XG5cdFx0XHQvLyBUaGUgdGFibGUgaXMgbm90IGJvdW5kLCBvciB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIHN3aXRjaGluZyBiZXR3ZWVuIG5vcm1hbCBhbmQgZnVsbHNjcmVlbiwgc28gd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIGV4cGFuc2lvbiBzdGF0ZVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGFnZ3JlZ2F0aW9uOiB7XG5cdFx0XHRhZ2dyZWdhdGU/OiBvYmplY3Q7XG5cdFx0XHRleHBhbmRUbz86IG51bWJlcjtcblx0XHRcdGdyYW5kVG90YWxBdEJvdHRvbU9ubHk/OiBib29sZWFuO1xuXHRcdFx0Z3JvdXA/OiBvYmplY3Q7XG5cdFx0XHRncm91cExldmVscz86IHN0cmluZ1tdO1xuXHRcdFx0aGllcmFyY2h5UXVhbGlmaWVyPzogc3RyaW5nO1xuXHRcdFx0c2VhcmNoPzogc3RyaW5nO1xuXHRcdFx0c3VidG90YWxzQXRCb3R0b21Pbmx5PzogYm9vbGVhbjtcblx0XHR9ID0gcm93QmluZGluZy5nZXRBZ2dyZWdhdGlvbigpID8/IHt9O1xuXHRcdGNvbnN0IGZpbHRlckluZm8gPSBUYWJsZVV0aWxzLmdldEFsbEZpbHRlckluZm8odGFibGUpO1xuXHRcdGFnZ3JlZ2F0aW9uLmV4cGFuZFRvID0gZmlsdGVySW5mby5zZWFyY2ggPyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA6IGluaXRpYWxFeHBhbnNpb25MZXZlbDtcblx0XHRyb3dCaW5kaW5nLnNldEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uKTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYW4gaXRlbSBpbiBhICdDcmVhdGUnIG1lbnUgaXMgY2xpY2tlZC4gSXQgY3JlYXRlcyBhIGRvY3VtZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgaW5pdGlhbCBkYXRhLlxuXHQgKiBAcGFyYW0gZXZlbnRcblx0ICogQHBhcmFtIHZhbHVlSW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIHRoZSBtZW51XG5cdCAqIEBwYXJhbSBzZWxlY3RlZENvbnRleHRzIFRoZSBzZWxlY3RlZCBjb250ZXh0cyBpbiB0aGUgdGFibGUgZm9yIHRoaXMgJ0NyZWF0ZScgbWVudVxuXHQgKi9cblx0b25DcmVhdGVNZW51SXRlbVByZXNzOiBhc3luYyBmdW5jdGlvbiAoZXZlbnQ6IFVJNUV2ZW50PHt9LCBNZW51SXRlbT4sIHZhbHVlSW5kZXg6IG51bWJlciwgc2VsZWN0ZWRDb250ZXh0czogQ29udGV4dFtdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgbWRjVGFibGUgPSBGUE1IZWxwZXIuZ2V0TWRjVGFibGUoZXZlbnQuZ2V0U291cmNlKCkpO1xuXHRcdGNvbnN0IHRhYmxlQVBJID0gbWRjVGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkO1xuXG5cdFx0Ly8gU29tZSBjaGVja3MgdG8gYmUgb24gdGhlIHNhZmUgc2lkZVxuXHRcdGlmICghdGFibGVBUEkgfHwgIW1kY1RhYmxlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IG5vZGVUeXBlID0gdGFibGVBUEkudGFibGVEZWZpbml0aW9uLmNvbnRyb2wubm9kZVR5cGU7XG5cdFx0aWYgKCFub2RlVHlwZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHZpZXcgPSBDb21tb25VdGlscy5nZXRUYXJnZXRWaWV3KHRhYmxlQVBJKTtcblx0XHRjb25zdCBjcmVhdGlvbkRhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0XHRjcmVhdGlvbkRhdGFbbm9kZVR5cGUucHJvcGVydHlOYW1lXSA9IG5vZGVUeXBlLnZhbHVlc1t2YWx1ZUluZGV4XS52YWx1ZTtcblxuXHRcdGNvbnN0IGNyZWF0aW9uUGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG5cdFx0XHRkYXRhPzogb2JqZWN0O1xuXHRcdH0gPSB7XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0Y3JlYXRpb25Nb2RlOiB0YWJsZUFQSS50YWJsZURlZmluaXRpb24uYW5ub3RhdGlvbi5jcmVhdGUubW9kZSxcblx0XHRcdGRhdGE6IGNyZWF0aW9uRGF0YSxcblx0XHRcdHRhYmxlSWQ6IG1kY1RhYmxlPy5nZXRJZCgpXG5cdFx0fTtcblxuXHRcdGlmIChjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2cpIHtcblx0XHRcdGNyZWF0aW9uUGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcyA9IG5vZGVUeXBlLnZhbHVlc1t2YWx1ZUluZGV4XS5jcmVhdGlvbkRpYWxvZ0ZpZWxkcztcblx0XHRcdGlmICghY3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzIHx8IGNyZWF0aW9uUGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Ly8gVXNlIHRoZSBkZWZhdWx0IHZhbHVlIGlmIG5vIGNyZWF0aW9uIGZpZWxkcyBhcmUgc3BlY2lmaWVkIGZvciB0aGlzIG1lbnUgaXRlbVxuXHRcdFx0XHRjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMgPSB0YWJsZUFQSS50YWJsZURlZmluaXRpb24uY29udHJvbC5jcmVhdGlvbkRpYWxvZ0ZpZWxkcztcblx0XHRcdH1cblx0XHRcdGlmICghbWRjVGFibGUuZ2V0Um93QmluZGluZygpKSB7XG5cdFx0XHRcdC8vIEluIGNyZWF0aW9uIGRpYWxvZyBtb2RlLCB3ZSBmb3JjZSB0aGUgdGFibGUgZGF0YSB0byBiZSBsb2FkZWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFxuXHRcdFx0XHQvLyAodG8gb3ZlcmNvbWUgdGhlIGNhc2UgaW4gYSBMaXN0UmVwb3J0IHdoZXJlIG5vIGRhdGEgaXMgbG9hZGVkIHlldClcblx0XHRcdFx0YXdhaXQgbWRjVGFibGUucmViaW5kKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmlldy5nZXRDb250cm9sbGVyKClcblx0XHRcdC5lZGl0Rmxvdy5jcmVhdGVEb2N1bWVudCh0YWJsZUFQSS5nZXRSb3dCaW5kaW5nKCksIGNyZWF0aW9uUGFyYW1ldGVycylcblx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIG5ldyBkb2N1bWVudDogJHtlcnJvcn1gKTtcblx0XHRcdH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiB0aGUgJ0NyZWF0ZScgYnV0dG9uIGlzIHByZXNzZWQsIG9yIHRoZSAnQ3JlYXRlJyBjb21tYW5kIGludm9rZWQuXG5cdCAqIEBwYXJhbSBldmVudFxuXHQgKiBAcGFyYW0gc2VsZWN0ZWRDb250ZXh0cyBUaGUgc2VsZWN0ZWQgY29udGV4dHMgaW4gdGhlIHRhYmxlIGZvciB0aGlzICdDcmVhdGUnIGJ1dHRvblxuXHQgKi9cblx0b25DcmVhdGVCdXR0b25QcmVzczogYXN5bmMgZnVuY3Rpb24gKGV2ZW50OiBVSTVFdmVudCwgc2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG1kY1RhYmxlID0gRlBNSGVscGVyLmdldE1kY1RhYmxlKGV2ZW50LmdldFNvdXJjZSgpKTtcblx0XHRjb25zdCB0YWJsZUFQSSA9IG1kY1RhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZDtcblxuXHRcdC8vIFNvbWUgY2hlY2tzIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGVcblx0XHRpZiAoIXRhYmxlQVBJIHx8ICFtZGNUYWJsZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNyZWF0aW9uUGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRvdXRib3VuZD86IHN0cmluZztcblx0XHRcdGNyZWF0aW9uUm93PzogQ3JlYXRpb25Sb3c7XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG5cdFx0fSA9IHsgY3JlYXRpb25Nb2RlOiB0YWJsZUFQSS50YWJsZURlZmluaXRpb24uYW5ub3RhdGlvbi5jcmVhdGUubW9kZSB9O1xuXG5cdFx0c3dpdGNoIChjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlKSB7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5FeHRlcm5hbDpcblx0XHRcdFx0Y3JlYXRpb25QYXJhbWV0ZXJzLm91dGJvdW5kID0gKHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5hbm5vdGF0aW9uLmNyZWF0ZSBhcyBDcmVhdGVCZWhhdmlvckV4dGVybmFsKS5vdXRib3VuZDtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93OlxuXHRcdFx0XHRjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgPSBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0Y3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kID0gdGFibGVBUEkudGFibGVEZWZpbml0aW9uLmNvbnRyb2wuY3JlYXRlQXRFbmQgPz8gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5OZXdQYWdlOlxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuSW5saW5lOlxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2c6XG5cdFx0XHRcdGNyZWF0aW9uUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5jb250cm9sLmNyZWF0ZUF0RW5kID8/IGZhbHNlO1xuXHRcdFx0XHRjcmVhdGlvblBhcmFtZXRlcnMudGFibGVJZCA9IG1kY1RhYmxlPy5nZXRJZCgpO1xuXHRcdFx0XHRjcmVhdGlvblBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyA9IHNlbGVjdGVkQ29udGV4dHM7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3M6XG5cdFx0XHRcdC8vIE5vdGhpbmdcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdC8vIE90aGVyIG1vZGVzIGFyZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoY3JlYXRpb25QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nKSB7XG5cdFx0XHRjcmVhdGlvblBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMgPSB0YWJsZUFQSS50YWJsZURlZmluaXRpb24uY29udHJvbC5jcmVhdGlvbkRpYWxvZ0ZpZWxkcztcblx0XHRcdGlmICghbWRjVGFibGUuZ2V0Um93QmluZGluZygpKSB7XG5cdFx0XHRcdC8vIEluIGNyZWF0aW9uIGRpYWxvZyBtb2RlLCB3ZSBmb3JjZSB0aGUgdGFibGUgZGF0YSB0byBiZSBsb2FkZWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFxuXHRcdFx0XHQvLyAodG8gb3ZlcmNvbWUgdGhlIGNhc2UgaW4gYSBMaXN0UmVwb3J0IHdoZXJlIG5vIGRhdGEgaXMgbG9hZGVkIHlldClcblx0XHRcdFx0YXdhaXQgbWRjVGFibGUucmViaW5kKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmlldyA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcodGFibGVBUEkpO1xuXG5cdFx0aWYgKGNyZWF0aW9uUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MpIHtcblx0XHRcdHZpZXcuZ2V0Q29udHJvbGxlcigpXG5cdFx0XHRcdC5lZGl0Rmxvdy5jcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyhtZGNUYWJsZSlcblx0XHRcdFx0LmNhdGNoKChlcnJvcikgPT4ge1xuXHRcdFx0XHRcdExvZy5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgZW1wdHkgcm93OiAke2Vycm9yfWApO1xuXHRcdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmlldy5nZXRDb250cm9sbGVyKClcblx0XHRcdFx0LmVkaXRGbG93LmNyZWF0ZURvY3VtZW50KHRhYmxlQVBJLCBjcmVhdGlvblBhcmFtZXRlcnMpXG5cdFx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbmV3IGRvY3VtZW50OiAke2Vycm9yfWApO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBtYW5hZ2UgdGhlIEludGVudEJhc2VkIE5hdmlnYXRpb24gZW5hYmxlbWVudC5cblx0ICogQHBhcmFtIGludGVybmFsTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uQXZhaWxhYmxlTWFwXG5cdCAqIEBwYXJhbSBzZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBmb3JDb250ZXh0TWVudVxuXHQgKi9cblx0c2V0SW50ZW50QmFzZWROYXZpZ2F0aW9uRW5hYmxlbWVudDogZnVuY3Rpb24gKFxuXHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uQXZhaWxhYmxlTWFwOiBzdHJpbmdbXSxcblx0XHRzZWxlY3RlZENvbnRleHRzOiBDb250ZXh0W10sXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gbmF2aWdhdGlvbkF2YWlsYWJsZU1hcCkge1xuXHRcdFx0aWYgKCFmb3JDb250ZXh0TWVudSkge1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgaWJuLyR7c0tleX1gLCB7XG5cdFx0XHRcdFx0YkVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdGFBcHBsaWNhYmxlOiBbXSxcblx0XHRcdFx0XHRhTm90QXBwbGljYWJsZTogW11cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgaWJuLyR7c0tleX1gLCB7XG5cdFx0XHRcdFx0Ly8gRG8gbm90IGNoYW5nZSBlbmFibGVkLCBhQXBwbGljYWJsZSBhbmQgYU5vdEFwcGxpY2FibGUgcHJvcGVydHkgaW4gY2FzZSBvZiBjb250ZXh0IG1lbnUgY2FsY3VsYXRpb25cblx0XHRcdFx0XHRiRW5hYmxlZDogaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYCR7aW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9pYm4vJHtzS2V5fS9iRW5hYmxlZGApLFxuXHRcdFx0XHRcdGFBcHBsaWNhYmxlOiBpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgJHtpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2libi8ke3NLZXl9L2FBcHBsaWNhYmxlYCksXG5cdFx0XHRcdFx0YU5vdEFwcGxpY2FibGU6IGludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGAke2ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vaWJuLyR7c0tleX0vYU5vdEFwcGxpY2FibGVgKSxcblx0XHRcdFx0XHRiRW5hYmxlZEZvckNvbnRleHRNZW51OiBmYWxzZSxcblx0XHRcdFx0XHRhQXBwbGljYWJsZUZvckNvbnRleHRNZW51OiBbXSxcblx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51OiBbXVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGFBcHBsaWNhYmxlID0gW10sXG5cdFx0XHRcdGFOb3RBcHBsaWNhYmxlID0gW107XG5cdFx0XHRjb25zdCBzUHJvcGVydHkgPSBuYXZpZ2F0aW9uQXZhaWxhYmxlTWFwW3NLZXldO1xuXHRcdFx0Zm9yIChjb25zdCBzZWxlY3RlZENvbnRleHQgb2Ygc2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRpZiAoc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChzUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0Y29uc3QgZW5hYmxlZFByb3BlcnR5ID0gIWZvckNvbnRleHRNZW51ID8gXCJiRW5hYmxlZFwiIDogXCJiRW5hYmxlZEZvckNvbnRleHRNZW51XCI7XG5cdFx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShgJHtpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2libi8ke3NLZXl9LyR7ZW5hYmxlZFByb3BlcnR5fWAsIHRydWUpO1xuXHRcdFx0XHRcdGFBcHBsaWNhYmxlLnB1c2goc2VsZWN0ZWRDb250ZXh0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhTm90QXBwbGljYWJsZS5wdXNoKHNlbGVjdGVkQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IGFwcGxpY2FibGVQcm9wZXJ0eSA9ICFmb3JDb250ZXh0TWVudSA/IFwiYUFwcGxpY2FibGVcIiA6IFwiYUFwcGxpY2FibGVGb3JDb250ZXh0TWVudVwiO1xuXHRcdFx0Y29uc3Qgbm90QXBwbGljYWJsZVByb3BlcnR5ID0gIWZvckNvbnRleHRNZW51ID8gXCJhTm90QXBwbGljYWJsZVwiIDogXCJhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51XCI7XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRNb2RlbCgpLnNldFByb3BlcnR5KGAke2ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vaWJuLyR7c0tleX0vJHthcHBsaWNhYmxlUHJvcGVydHl9YCwgYUFwcGxpY2FibGUpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHRcblx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0LnNldFByb3BlcnR5KGAke2ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vaWJuLyR7c0tleX0vJHtub3RBcHBsaWNhYmxlUHJvcGVydHl9YCwgYU5vdEFwcGxpY2FibGUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYSBjb250ZXh0IG1lbnUgaXRlbSBpcyBwcmVzc2VkLlxuXHQgKiBAcGFyYW0gZXZlbnRcblx0ICovXG5cdG9uQ29udGV4dE1lbnVJdGVtU2VsZWN0ZWQ6IGZ1bmN0aW9uIChldmVudDogVUk1RXZlbnQpOiB2b2lkIHtcblx0XHRjb25zdCBtZGNUYWJsZSA9IEZQTUhlbHBlci5nZXRNZGNUYWJsZShldmVudC5nZXRTb3VyY2UoKSk7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSBtZGNUYWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQ7XG5cblx0XHQvLyBTZXQgdGhlIGZsYWcgb24gdGhlIHRhYmxlQVBJIHNvIHRoYXQgZ2V0U2VsZWN0ZWRDb250ZXh0cyByZXR1cm5zIHRoZSBjb3JyZWN0IHZhbHVlXG5cdFx0dGFibGVBUEk/LnNldENvbnRleHRNZW51QWN0aXZlKHRydWUpO1xuXG5cdFx0Ly8gQWZ0ZXIgYSBzaG9ydCBkZWxheSAob25jZSB0aGUgY29ycmVzcG9uZGluZyBhY3Rpb24gaGFzIGJlZW4gdHJpZ2dlcmVkKSwgd2UgbmVlZCB0byByZXNldCB0aGUgZmxhZyBvbiB0aGUgdGFibGVcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRhYmxlQVBJPy5zZXRDb250ZXh0TWVudUFjdGl2ZShmYWxzZSk7XG5cdFx0fSwgMCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIE1EQyBEYXRhU3RhdGVJbmRpY2F0b3IgcGx1Z2luIHRvIGRpc3BsYXkgbWVzc2FnZVN0cmlwIG9uIGEgdGFibGUuXG5cdCAqIEBwYXJhbSBtZXNzYWdlXG5cdCAqIEBwYXJhbSBjb250cm9sXG5cdCAqIEByZXR1cm5zIFdoZXRoZXIgdG8gcmVuZGVyIHRoZSBtZXNzYWdlU3RyaXAgdmlzaWJsZVxuXHQgKi9cblx0ZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyOiBmdW5jdGlvbiAobWVzc2FnZTogTWVzc2FnZSwgY29udHJvbDogQ29udHJvbCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHRhYmxlQVBJID0gY29udHJvbC5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRyZXR1cm4gdGFibGVBUEkuZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyKG1lc3NhZ2UsIGNvbnRyb2wpO1xuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUYWJsZVJ1bnRpbWU7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7RUErQkEsTUFBTUEsWUFBWSxHQUFHQyxTQUFTLENBQUNELFlBQVk7RUFDM0M7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNRSxZQUFZLEdBQUc7SUFDcEJDLGdDQUFnQyxFQUFFLFNBQUFBLENBQVVDLGNBQXNCLEVBQUVDLE9BQWdCLEVBQVE7TUFDM0Y7TUFDQSxNQUFNQyxTQUFTLEdBQUdELE9BQU8sQ0FBQ0UsU0FBUyxDQUFDLENBQWE7TUFDakQsSUFBSUgsY0FBYyxLQUFLSixZQUFZLENBQUNRLFdBQVcsRUFBRTtRQUNoRCxNQUFNQyxPQUFPLEdBQUdILFNBQVMsQ0FDdkJJLFVBQVUsQ0FBQyxDQUFDLENBQ1pDLE1BQU0sQ0FBQyxVQUFVQyxjQUF5QixFQUFFQyxvQkFBNkIsRUFBRTtVQUMzRSxPQUFPRCxjQUFjLENBQUNFLE1BQU0sQ0FBRUQsb0JBQW9CLENBQXlCRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUMsRUFBRSxFQUFlLENBQUMsQ0FDbEJDLElBQUksQ0FBQyxVQUFVQyxhQUFzQixFQUFFO1VBQ3ZDLE9BQU9BLGFBQWEsQ0FBQ0MsS0FBSyxDQUFDLENBQUMsQ0FBQ0MsUUFBUSxDQUFDZixjQUFjLENBQUM7UUFDdEQsQ0FBQyxDQUFDO1FBQ0hnQixXQUFXLENBQUNDLGVBQWUsQ0FBQ1osT0FBTyxDQUFDO01BQ3JD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
@@ -3,8 +3,9 @@ import Log from "sap/base/Log";
3
3
  import ActionRuntime from "sap/fe/core/ActionRuntime";
4
4
  import CommonUtils from "sap/fe/core/CommonUtils";
5
5
  import BusyLocker from "sap/fe/core/controllerextensions/BusyLocker";
6
+ import Any from "sap/fe/core/controls/Any";
6
7
  import * as MetaModelConverter from "sap/fe/core/converters/MetaModelConverter";
7
- import type { CreateBehaviorExternal } from "sap/fe/core/converters/controls/Common/Table";
8
+ import type { CreateBehaviorExternal, UpdatablePropertyPathInfo } from "sap/fe/core/converters/controls/Common/Table";
8
9
  import deleteHelper from "sap/fe/core/helpers/DeleteHelper";
9
10
  import FPMHelper from "sap/fe/core/helpers/FPMHelper";
10
11
  import type { InternalModelContext } from "sap/fe/core/helpers/ModelHelper";
@@ -21,6 +22,7 @@ import type Message from "sap/ui/core/message/Message";
21
22
  import type { default as MDCTable, default as Table } from "sap/ui/mdc/Table";
22
23
  import type ActionToolbarAction from "sap/ui/mdc/actiontoolbar/ActionToolbarAction";
23
24
  import type CreationRow from "sap/ui/mdc/table/CreationRow";
25
+ import type PropertyBinding from "sap/ui/model/PropertyBinding";
24
26
  import type Context from "sap/ui/model/odata/v4/Context";
25
27
  import type ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
26
28
  import type { EventType } from "types/extension_types";
@@ -77,7 +79,6 @@ const TableRuntime = {
77
79
  const collectionEntity = MetaModelConverter.convertTypes(metaModel).resolvePath<EntitySet>(
78
80
  tableDefinition.annotation.collection
79
81
  ).target;
80
- const sUpdatablePath = tableDefinition.annotation.updatablePropertyPath;
81
82
 
82
83
  const aActionsMultiselectDisabled = table.data("actionsMultiselectDisabled")?.split(",") ?? [];
83
84
  const oActionOperationAvailableMap = JSON.parse(tableDefinition.operationAvailableMap || "{}");
@@ -137,7 +138,7 @@ const TableRuntime = {
137
138
  oInternalModelContext.setProperty("", oModelObject);
138
139
  }
139
140
  }
140
- if (this.isUpdatableContext(sUpdatablePath, oSelectedContext, bReadOnlyDraftEnabled)) {
141
+ if (this.isUpdatableContext(tableDefinition.annotation.updatablePropertyPathInfo, oSelectedContext, bReadOnlyDraftEnabled)) {
141
142
  aUpdatableContexts.push(oSelectedContext);
142
143
  }
143
144
  }
@@ -174,24 +175,39 @@ const TableRuntime = {
174
175
  },
175
176
 
176
177
  /**
177
- * Checks, if the selected context is updatable for Mass Edit.
178
- * @param updatablePropertyPath The updatablePropertyPath from the table annotation
178
+ * Checks if the selected context is updatable for Mass Edit.
179
+ * @param updatablePropertyPathInfo The updatablePropertyPathInfo from the table annotation
179
180
  * @param selectedContext The selected context
180
181
  * @param readOnlyDraftEnabled Indicates, if the table is read only and draft enabled
181
182
  * @returns Boolean Indicating context is updatable
182
183
  */
183
- isUpdatableContext: function (updatablePropertyPath: string, selectedContext: Context, readOnlyDraftEnabled: boolean): boolean {
184
+
185
+ isUpdatableContext: function (
186
+ updatablePropertyPathInfo: UpdatablePropertyPathInfo | undefined,
187
+ selectedContext: Context,
188
+ readOnlyDraftEnabled: boolean
189
+ ): boolean {
184
190
  /* The updatable contexts with mass edit depend on the following:
185
- 1. Update is dependent on current entity property (updatablePath).
186
- 2. The table is read only and draft enabled (like LR), in this case only active contexts can be mass edited (not draft contexts).
191
+ 1. The update is dependent on current entity property (updatablePaths).
192
+ 2. The table is read only and draft enabled (such as on the list report page). Only active contexts can be used with mass edit (not draft contexts).
187
193
  So, update depends on 'IsActiveEntity', 'HasDraftEntity' value which needs to be checked. */
188
194
  const contextData = selectedContext.getObject();
189
- const updatableByPath = updatablePropertyPath.length === 0 || !!selectedContext.getProperty(updatablePropertyPath);
190
195
  const notDraftInReadOnlyMode = !readOnlyDraftEnabled || (contextData.IsActiveEntity && !contextData.HasDraftEntity);
191
- if (updatableByPath && notDraftInReadOnlyMode) {
196
+ if (!notDraftInReadOnlyMode) {
197
+ return false;
198
+ }
199
+ if (!updatablePropertyPathInfo || updatablePropertyPathInfo.paths.length === 0) {
192
200
  return true;
193
201
  }
194
- return false;
202
+ if (updatablePropertyPathInfo.isPathAnnotationExpression) {
203
+ return !!selectedContext.getProperty(updatablePropertyPathInfo.paths[0]);
204
+ }
205
+ const anyObject = new Any({ anyBoolean: updatablePropertyPathInfo.bindingExpression });
206
+ anyObject.setModel(selectedContext.getModel());
207
+ anyObject.setBindingContext(selectedContext);
208
+ const isUpdatable = (anyObject.getBinding("anyBoolean") as PropertyBinding).getExternalValue() as boolean;
209
+ anyObject.destroy();
210
+ return !!isUpdatable;
195
211
  },
196
212
 
197
213
  /**