@sapui5/sap.fe.core 1.136.1 → 1.136.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +7 -1
  4. package/src/sap/fe/core/AppComponent.ts +10 -0
  5. package/src/sap/fe/core/AppStateHandler.js +9 -2
  6. package/src/sap/fe/core/AppStateHandler.ts +8 -2
  7. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +2 -1
  8. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +1 -0
  9. package/src/sap/fe/core/controllerextensions/EditFlow.js +63 -35
  10. package/src/sap/fe/core/controllerextensions/EditFlow.ts +80 -47
  11. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +27 -41
  12. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +27 -41
  13. package/src/sap/fe/core/controllerextensions/InternalRouting.js +16 -2
  14. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +15 -1
  15. package/src/sap/fe/core/controllerextensions/MessageHandler.js +4 -4
  16. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +22 -15
  17. package/src/sap/fe/core/controllerextensions/SideEffects.js +7 -5
  18. package/src/sap/fe/core/controllerextensions/SideEffects.ts +10 -7
  19. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -1
  20. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +1 -0
  21. package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.js +9 -5
  22. package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.tsx +8 -3
  23. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +30 -3
  24. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +26 -3
  25. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +21 -16
  26. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +36 -16
  27. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +12 -26
  28. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +25 -44
  29. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +2 -2
  30. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +1 -1
  31. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +8 -6
  32. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +13 -4
  33. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +15 -5
  34. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +21 -6
  35. package/src/sap/fe/core/controls/inlineEditFlow/InlineEditExitDialog.js +144 -0
  36. package/src/sap/fe/core/controls/inlineEditFlow/{BeforeNavigationDialog.tsx → InlineEditExitDialog.tsx} +1 -1
  37. package/src/sap/fe/core/converters/controls/Common/Action.js +17 -12
  38. package/src/sap/fe/core/converters/controls/Common/Action.ts +19 -11
  39. package/src/sap/fe/core/converters/controls/Common/Table.js +25 -3
  40. package/src/sap/fe/core/converters/controls/Common/Table.ts +31 -2
  41. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +13 -11
  42. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +15 -2
  43. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +19 -5
  44. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +28 -5
  45. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +11 -6
  46. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +17 -10
  47. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +28 -3
  48. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +26 -1
  49. package/src/sap/fe/core/designtime/messagebundle_en_US_saprigi.properties +7 -0
  50. package/src/sap/fe/core/fpm/manifest.json +1 -1
  51. package/src/sap/fe/core/helpers/DeleteHelper.js +12 -10
  52. package/src/sap/fe/core/helpers/DeleteHelper.ts +9 -10
  53. package/src/sap/fe/core/helpers/ModelHelper.js +43 -4
  54. package/src/sap/fe/core/helpers/ModelHelper.ts +48 -3
  55. package/src/sap/fe/core/library.js +1 -1
  56. package/src/sap/fe/core/messagebundle.properties +4 -0
  57. package/src/sap/fe/core/messagebundle_ar.properties +5 -4
  58. package/src/sap/fe/core/messagebundle_bg.properties +2 -1
  59. package/src/sap/fe/core/messagebundle_ca.properties +2 -1
  60. package/src/sap/fe/core/messagebundle_cnr.properties +2 -1
  61. package/src/sap/fe/core/messagebundle_cs.properties +4 -3
  62. package/src/sap/fe/core/messagebundle_cy.properties +2 -1
  63. package/src/sap/fe/core/messagebundle_da.properties +2 -1
  64. package/src/sap/fe/core/messagebundle_de.properties +8 -7
  65. package/src/sap/fe/core/messagebundle_el.properties +4 -3
  66. package/src/sap/fe/core/messagebundle_en.properties +2 -1
  67. package/src/sap/fe/core/messagebundle_en_GB.properties +2 -1
  68. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +4 -1
  69. package/src/sap/fe/core/messagebundle_es.properties +5 -4
  70. package/src/sap/fe/core/messagebundle_es_MX.properties +2 -1
  71. package/src/sap/fe/core/messagebundle_et.properties +2 -1
  72. package/src/sap/fe/core/messagebundle_fi.properties +2 -1
  73. package/src/sap/fe/core/messagebundle_fr.properties +4 -3
  74. package/src/sap/fe/core/messagebundle_fr_CA.properties +2 -1
  75. package/src/sap/fe/core/messagebundle_hi.properties +2 -1
  76. package/src/sap/fe/core/messagebundle_hr.properties +2 -1
  77. package/src/sap/fe/core/messagebundle_hu.properties +2 -1
  78. package/src/sap/fe/core/messagebundle_id.properties +4 -3
  79. package/src/sap/fe/core/messagebundle_it.properties +2 -1
  80. package/src/sap/fe/core/messagebundle_iw.properties +2 -1
  81. package/src/sap/fe/core/messagebundle_ja.properties +3 -2
  82. package/src/sap/fe/core/messagebundle_kk.properties +2 -1
  83. package/src/sap/fe/core/messagebundle_ko.properties +6 -5
  84. package/src/sap/fe/core/messagebundle_lt.properties +2 -1
  85. package/src/sap/fe/core/messagebundle_lv.properties +2 -1
  86. package/src/sap/fe/core/messagebundle_mk.properties +2 -1
  87. package/src/sap/fe/core/messagebundle_ms.properties +2 -1
  88. package/src/sap/fe/core/messagebundle_nl.properties +2 -1
  89. package/src/sap/fe/core/messagebundle_no.properties +3 -2
  90. package/src/sap/fe/core/messagebundle_pl.properties +2 -1
  91. package/src/sap/fe/core/messagebundle_pt.properties +2 -1
  92. package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -1
  93. package/src/sap/fe/core/messagebundle_ro.properties +2 -1
  94. package/src/sap/fe/core/messagebundle_ru.properties +2 -1
  95. package/src/sap/fe/core/messagebundle_sh.properties +2 -1
  96. package/src/sap/fe/core/messagebundle_sk.properties +2 -1
  97. package/src/sap/fe/core/messagebundle_sl.properties +2 -1
  98. package/src/sap/fe/core/messagebundle_sr.properties +2 -1
  99. package/src/sap/fe/core/messagebundle_sv.properties +2 -1
  100. package/src/sap/fe/core/messagebundle_th.properties +2 -1
  101. package/src/sap/fe/core/messagebundle_tr.properties +2 -1
  102. package/src/sap/fe/core/messagebundle_uk.properties +2 -1
  103. package/src/sap/fe/core/messagebundle_vi.properties +9 -8
  104. package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -1
  105. package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -1
  106. package/src/sap/fe/core/rootView/Fcl.controller.js +8 -3
  107. package/src/sap/fe/core/rootView/Fcl.controller.ts +14 -7
  108. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +8 -2
  109. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +7 -1
  110. package/src/sap/fe/core/templating/EntitySetHelper.js +75 -90
  111. package/src/sap/fe/core/templating/EntitySetHelper.ts +92 -118
  112. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +0 -68
  113. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +0 -52
  114. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +0 -144
@@ -10,17 +10,13 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
10
10
  var isEntitySet = TypeGuards.isEntitySet;
11
11
  /**
12
12
  * Reads all FilterRestrictions and SortRestrictions of the main and child entities and their dedicated navigation restrictions.
13
- 1. For containment scenario:
14
- 1.1. For LR, Navigation restrictions are evaluated first, followed by the restrictions on the root entity. If both a navigation property restriction and a direct restriction exist, the navigation restriction is the most precise definition and takes precedence over the direct restriction.
15
- 1.2 For the OP, Restrictions are only calculated on the root entity, as there are no child entities. The same approach described in point 1.1 is applied.
16
-
17
- 2. For a non containment scenario:
18
- 2.1 The same logic described in point 1.1 applies.
19
- 2.2 For the OP
20
- 2.2.1 Retrieve the direct restrictions configured on the child entity displayed in the table or on the root entity.
21
- 2.2.2 If a navigation property restriction is defined on the main entity, it takes precedence over the direct restrictions from 2.2.1.
22
- 2.2.3 NavigationRestrictions on the target (child) entity set are added to the list of restrictions.
23
- * @param entitySet Entity set to be analyzed
13
+ 1. For containment scenario:
14
+ 1.1. For LR, Navigation restrictions are evaluated first, followed by the restrictions on the root entity. If Navigation property restriction and a direct restriction exist, both are considered.
15
+ 1.2 For the OP, Restrictions are only calculated on the root entity, as there are no child entities. The same approach described in point 1.1 is applied.
16
+ 2. For a non containment scenario:
17
+ 2.1 The same logic described in point 1.1 applies.
18
+ 2.2 For the OP, the direct restrictions configured for the OP are considered along with the navigation restrictions on the target (child) entity displayed.
19
+ * @param entitySet Entity set to be analyzed (target or parent entity set).
24
20
  * @param targetEntitySet The target entity set, if available. Not used in the case of containment.
25
21
  * @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
26
22
  * @returns Array containing the property names of all non-filterable and non-sortable properties
@@ -30,27 +26,19 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
30
26
  nonSortableProperties: getSortRestrictionsfromNavigationRestrictions(entitySet, targetEntitySet, parentNavigationPath),
31
27
  nonFilterableProperties: getFilterRestrictionsfromNavigationRestrictions(entitySet, targetEntitySet, parentNavigationPath)
32
28
  };
33
- if (!targetEntitySet) {
34
- // if the targetEntitySet is not available, we need to get all the list of resctrictions from the root entitySet, this applies for on the list report
35
- const directSortRestrictions = getDirectSortRestrictionsRecursively(entitySet, undefined, parentNavigationPath);
36
- const directFilterRestrictions = getDirectFilterRestrictionsRecursively(entitySet, undefined, parentNavigationPath);
37
- return {
38
- nonSortableProperties: Array.from(new Set([...restrictionsFromNavigationRestrictions.nonSortableProperties, ...directSortRestrictions])),
39
- nonFilterableProperties: Array.from(new Set([...restrictionsFromNavigationRestrictions.nonFilterableProperties, ...directFilterRestrictions]))
40
- };
41
- }
42
- if (!restrictionsFromNavigationRestrictions.nonSortableProperties.length) {
43
- restrictionsFromNavigationRestrictions.nonSortableProperties = getDirectSortRestrictionsRecursively(entitySet, targetEntitySet, parentNavigationPath);
44
- }
45
- if (!restrictionsFromNavigationRestrictions.nonFilterableProperties.length) {
46
- restrictionsFromNavigationRestrictions.nonFilterableProperties = getDirectFilterRestrictionsRecursively(entitySet, targetEntitySet, parentNavigationPath);
47
- }
48
- return restrictionsFromNavigationRestrictions;
29
+ const directRestrictions = {
30
+ nonSortableProperties: getDirectSortRestrictions(entitySet, targetEntitySet, parentNavigationPath),
31
+ nonFilterableProperties: getDirectFilterRestrictions(entitySet, targetEntitySet, parentNavigationPath)
32
+ };
33
+ return {
34
+ nonSortableProperties: Array.from(new Set([...restrictionsFromNavigationRestrictions.nonSortableProperties, ...directRestrictions.nonSortableProperties])),
35
+ nonFilterableProperties: Array.from(new Set([...restrictionsFromNavigationRestrictions.nonFilterableProperties, ...directRestrictions.nonFilterableProperties]))
36
+ };
49
37
  };
50
38
 
51
39
  /**
52
40
  * Gets all SortRestrictions and FilterRestrictions for a given context.
53
- * This function verifies whether we are in a containment scenario. In a non containment scenario it determines if we are in a List Report or an Object Page.
41
+ * This function verifies whether we are in a containment scenario.
54
42
  * @param converterContext The converter context.
55
43
  * @returns Object containing all property names of restrictions separated by sortable and filterable capabilities.
56
44
  */
@@ -67,20 +55,9 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
67
55
  } = getTargetEntitySetInfo(dataModelObjectPath);
68
56
  if (isEntitySet(targetEntitySet)) {
69
57
  // Get the restrictions on the target navigation entity set
70
- propertiesRestrictions = getPropertiesRestrictionsBasedOnEntities(targetEntitySet);
71
- if (parentEntitySet && isEntitySet(parentEntitySet)) {
72
- // Get the restrictions from the NavigationRestrictions / Restrictions on the parent entity set
73
- // It's takes precedence over the restrictions on the target entity set
74
- const parentPropertiesRestrictions = getPropertiesRestrictionsBasedOnEntities(parentEntitySet, targetEntitySet, parentNavigationPath);
75
- if (parentPropertiesRestrictions.nonSortableProperties.length) {
76
- propertiesRestrictions.nonSortableProperties = parentPropertiesRestrictions.nonSortableProperties;
77
- }
78
- if (parentPropertiesRestrictions.nonFilterableProperties.length) {
79
- propertiesRestrictions.nonFilterableProperties = parentPropertiesRestrictions.nonFilterableProperties;
80
- }
81
- }
58
+ return getPropertiesRestrictionsBasedOnEntities(targetEntitySet);
82
59
  } else if (parentEntitySet && isEntitySet(parentEntitySet)) {
83
- // Find the restrictions on the parent entity set, this applies also for containment as there isn't an entity set on the OP
60
+ // Find the restrictions on the parent entity set, this applies for containment as there isn't an entity set available on the OP
84
61
  return getPropertiesRestrictionsBasedOnEntities(parentEntitySet, undefined, parentNavigationPath);
85
62
  }
86
63
  return propertiesRestrictions;
@@ -106,21 +83,11 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
106
83
  const navigationProperty = navigationRestriction.NavigationProperty.$target;
107
84
  if (navigationProperty) {
108
85
  // add all properties of the navigation property to the nonSortableProperties
109
- if (parentNavigationPath) {
110
- sortRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => property.name));
111
- } else {
112
- sortRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => `${navigationProperty.name}/${property.name}`));
113
- }
86
+ sortRestrictionsFromNavigationRestrictions.push(...getAllPropertiesOfNavigationProperty(navigationProperty, navigationRestriction, parentNavigationPath));
114
87
  }
115
88
  } else {
116
89
  const nonSortableNavigationProperties = navigationRestriction?.SortRestrictions?.NonSortableProperties?.map(property => {
117
- // We need the property name from the navigation restriction definition when the targetEntitySet is available
118
- if ((targetEntitySet || parentNavigationPath) && property.$target?.name) {
119
- return property.$target?.name;
120
- } else {
121
- // leave the property path unchanged (it is relative to the annotation target!)
122
- return property.value;
123
- }
90
+ return getRestrictedPropertyRelativePath(property, targetEntitySet, parentNavigationPath);
124
91
  });
125
92
  if (nonSortableNavigationProperties?.length) {
126
93
  sortRestrictionsFromNavigationRestrictions.push(...nonSortableNavigationProperties);
@@ -137,12 +104,8 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
137
104
  * @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
138
105
  * @returns Array containing the property names of all non-sortable properties.
139
106
  */
140
- function getDirectSortRestrictionsRecursively(entitySet, targetEntitySet, parentNavigationPath) {
107
+ function getDirectSortRestrictions(entitySet, targetEntitySet, parentNavigationPath) {
141
108
  const sortRestrictionsOnEntitySet = [];
142
- if (targetEntitySet) {
143
- // if the targetEntitySet from a navigation is available, get the direct restriction on the targetEntitySet (child entity set)
144
- return getDirectSortRestrictionsRecursively(targetEntitySet, undefined, parentNavigationPath);
145
- }
146
109
  if (entitySet.annotations.Capabilities?.SortRestrictions?.Sortable === false) {
147
110
  // add all properties of the entity set to the nonSortableProperties
148
111
  sortRestrictionsOnEntitySet.push(...entitySet.entityType.entityProperties.map(property => property.name));
@@ -153,11 +116,7 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
153
116
  // skip the non sortable property if it doesn't belong to the parent navigation path in case of containment
154
117
  return;
155
118
  }
156
- if ((targetEntitySet || parentNavigationPath) && property.$target?.name) {
157
- nonSortableProperties.push(property.$target?.name);
158
- } else {
159
- nonSortableProperties.push(property.value);
160
- }
119
+ nonSortableProperties.push(getRestrictedPropertyRelativePath(property, targetEntitySet, parentNavigationPath));
161
120
  });
162
121
  if (nonSortableProperties?.length) {
163
122
  sortRestrictionsOnEntitySet.push(...nonSortableProperties);
@@ -176,8 +135,9 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
176
135
  function getFilterRestrictionsfromNavigationRestrictions(entitySet, targetEntitySet, parentNavigationPath) {
177
136
  const filterRestrictionsFromNavigationRestrictions = [];
178
137
  entitySet.annotations.Capabilities?.NavigationRestrictions?.RestrictedProperties?.forEach(navigationRestriction => {
179
- // if containment enabled get only the filter restrictions of the related navigation path
180
- if (parentNavigationPath && parentNavigationPath !== navigationRestriction?.NavigationProperty?.value) {
138
+ // Get the filter restrictions of the related navigation path
139
+ // The navigationRestriction is also relevant if it contains the parent navigation path
140
+ if (parentNavigationPath && !navigationRestriction?.NavigationProperty?.value.includes(parentNavigationPath)) {
181
141
  return;
182
142
  }
183
143
  if (navigationRestriction?.FilterRestrictions?.Filterable === false) {
@@ -185,21 +145,11 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
185
145
  const navigationProperty = navigationRestriction.NavigationProperty.$target;
186
146
  if (navigationProperty) {
187
147
  // add all properties of the navigation property to the nonFilterableProperties
188
- if (parentNavigationPath) {
189
- filterRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => property.name));
190
- } else {
191
- filterRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => `${navigationProperty.name}/${property.name}`));
192
- }
148
+ filterRestrictionsFromNavigationRestrictions.push(...getAllPropertiesOfNavigationProperty(navigationProperty, navigationRestriction, parentNavigationPath));
193
149
  }
194
150
  } else {
195
151
  const nonFilterableNavigationProperties = navigationRestriction?.FilterRestrictions?.NonFilterableProperties?.map(property => {
196
- // we need the property name from the navigation restriction definition when the targetEntitySet is available and it's not a containment scenario
197
- if ((targetEntitySet || parentNavigationPath) && property.$target?.name) {
198
- return property.$target?.name;
199
- } else {
200
- // leave the property path unchanged (it is relative to the annotation target!)
201
- return property.value;
202
- }
152
+ return getRestrictedPropertyRelativePath(property, targetEntitySet, parentNavigationPath);
203
153
  });
204
154
  if (nonFilterableNavigationProperties?.length) {
205
155
  filterRestrictionsFromNavigationRestrictions.push(...nonFilterableNavigationProperties);
@@ -209,6 +159,49 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
209
159
  return filterRestrictionsFromNavigationRestrictions;
210
160
  }
211
161
 
162
+ /**
163
+ * Gets all properties of a navigation property based on the navigation restriction and parent navigation path.
164
+ * @param navigationProperty The navigation property to be analyzed.
165
+ * @param navigationRestriction The navigation restriction to be applied.
166
+ * @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
167
+ * @returns The array of property names of the navigation property.
168
+ */
169
+ function getAllPropertiesOfNavigationProperty(navigationProperty, navigationRestriction, parentNavigationPath) {
170
+ if (parentNavigationPath) {
171
+ // for containment scenario only
172
+ if (navigationRestriction?.NavigationProperty?.value !== navigationProperty.name) {
173
+ // in case the target entity set is a child entity set (OP), we need to get the properties based on OP target entity set
174
+ const navigationPathBasedOnParent = navigationRestriction?.NavigationProperty?.value.replace(`${parentNavigationPath}/`, "");
175
+ return navigationProperty.targetType.entityProperties.map(property => `${navigationPathBasedOnParent}/${property.name}`);
176
+ } else {
177
+ return navigationProperty.targetType.entityProperties.map(property => property.name);
178
+ }
179
+ } else {
180
+ return navigationProperty.targetType.entityProperties.map(property => `${navigationProperty.name}/${property.name}`);
181
+ }
182
+ }
183
+
184
+ /**
185
+ * Gets the relative path of the property restricted based on the target entity set and parent navigation path.
186
+ * @param property The property to be analyzed.
187
+ * @param targetEntitySet The target entity set, if available. Not present in the case of containment.
188
+ * @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
189
+ * @returns The relative path of the restricted property.
190
+ */
191
+ function getRestrictedPropertyRelativePath(property, targetEntitySet, parentNavigationPath) {
192
+ if (parentNavigationPath && property.value.includes(parentNavigationPath)) {
193
+ // if the parentNavigationPath is available, we need to check if the property belongs to the parent navigation path
194
+ // we need to get the property path based on target entity for the child entity set (OP)
195
+ return property.value.replace(`${parentNavigationPath}/`, "");
196
+ } else if (targetEntitySet && property.$target?.name) {
197
+ // we need the property name from the navigation restriction definition when the targetEntitySet is available and it's not a containment scenario
198
+ return property.$target?.name;
199
+ } else {
200
+ // leave the property path unchanged (it is relative to the annotation target!)
201
+ return property.value;
202
+ }
203
+ }
204
+
212
205
  /**
213
206
  * Gets the filter restrictions directly from the entity set.
214
207
  * @param entitySet Entity set to be analyzed.
@@ -216,27 +209,19 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
216
209
  * @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
217
210
  * @returns Array containing the property names of all non-filterable properties.
218
211
  */
219
- function getDirectFilterRestrictionsRecursively(entitySet, targetEntitySet, parentNavigationPath) {
212
+ function getDirectFilterRestrictions(entitySet, targetEntitySet, parentNavigationPath) {
220
213
  const filterRestrictionsOnEntitySet = [];
221
- if (targetEntitySet && parentNavigationPath) {
222
- // if the targetEntitySet from a navigation is available, get the direct restriction on the targetEntitySet (child entity set)
223
- return getDirectFilterRestrictionsRecursively(targetEntitySet, undefined, parentNavigationPath);
224
- }
225
214
  if (entitySet.annotations.Capabilities?.FilterRestrictions?.Filterable === false) {
226
215
  // add all properties of the entity set to the nonFilterableProperties
227
216
  filterRestrictionsOnEntitySet.push(...entitySet.entityType.entityProperties.map(property => property.name));
228
217
  } else {
229
218
  const nonFilterableProperties = [];
230
- entitySet.annotations.Capabilities?.FilterRestrictions?.NonFilterableProperties?.forEach(property => {
231
- if (parentNavigationPath && !property.value.includes(parentNavigationPath)) {
219
+ entitySet.annotations.Capabilities?.FilterRestrictions?.NonFilterableProperties?.forEach(propertyPath => {
220
+ if (parentNavigationPath && !propertyPath.value.includes(parentNavigationPath)) {
232
221
  // skip the non filterable property if it doesn't belong to the parent navigation path in case of containment
233
222
  return;
234
223
  }
235
- if ((targetEntitySet || parentNavigationPath) && property.$target?.name) {
236
- nonFilterableProperties.push(property.$target?.name);
237
- } else {
238
- nonFilterableProperties.push(property.value);
239
- }
224
+ nonFilterableProperties.push(getRestrictedPropertyRelativePath(propertyPath, targetEntitySet, parentNavigationPath));
240
225
  });
241
226
  if (nonFilterableProperties?.length) {
242
227
  filterRestrictionsOnEntitySet.push(...nonFilterableProperties);
@@ -246,4 +231,4 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
246
231
  }
247
232
  return _exports;
248
233
  }, false);
249
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zQmFzZWRPbkVudGl0aWVzIiwiZW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwicGFyZW50TmF2aWdhdGlvblBhdGgiLCJyZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsImdldFNvcnRSZXN0cmljdGlvbnNmcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiZ2V0RmlsdGVyUmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJkaXJlY3RTb3J0UmVzdHJpY3Rpb25zIiwiZ2V0RGlyZWN0U29ydFJlc3RyaWN0aW9uc1JlY3Vyc2l2ZWx5IiwidW5kZWZpbmVkIiwiZGlyZWN0RmlsdGVyUmVzdHJpY3Rpb25zIiwiZ2V0RGlyZWN0RmlsdGVyUmVzdHJpY3Rpb25zUmVjdXJzaXZlbHkiLCJBcnJheSIsImZyb20iLCJTZXQiLCJsZW5ndGgiLCJnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMiLCJjb252ZXJ0ZXJDb250ZXh0IiwicHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwicGFyZW50RW50aXR5U2V0IiwiZ2V0VGFyZ2V0RW50aXR5U2V0SW5mbyIsImlzRW50aXR5U2V0IiwicGFyZW50UHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsIl9leHBvcnRzIiwic29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiYW5ub3RhdGlvbnMiLCJDYXBhYmlsaXRpZXMiLCJOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiUmVzdHJpY3RlZFByb3BlcnRpZXMiLCJmb3JFYWNoIiwibmF2aWdhdGlvblJlc3RyaWN0aW9uIiwiTmF2aWdhdGlvblByb3BlcnR5IiwidmFsdWUiLCJTb3J0UmVzdHJpY3Rpb25zIiwiU29ydGFibGUiLCJuYXZpZ2F0aW9uUHJvcGVydHkiLCIkdGFyZ2V0IiwicHVzaCIsInRhcmdldFR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwibWFwIiwicHJvcGVydHkiLCJuYW1lIiwibm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyIsIk5vblNvcnRhYmxlUHJvcGVydGllcyIsInNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldCIsImVudGl0eVR5cGUiLCJpbmNsdWRlcyIsImZpbHRlclJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiRmlsdGVyUmVzdHJpY3Rpb25zIiwiRmlsdGVyYWJsZSIsIm5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyIsIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiZmlsdGVyUmVzdHJpY3Rpb25zT25FbnRpdHlTZXQiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkVudGl0eVNldEhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVNldCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBpc0VudGl0eVNldCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB7IGdldFRhcmdldEVudGl0eVNldEluZm8gfSBmcm9tIFwiLi9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5cbmV4cG9ydCB0eXBlIFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IHtcblx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0bm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xufTtcblxuLyoqXG4gKiBSZWFkcyBhbGwgRmlsdGVyUmVzdHJpY3Rpb25zIGFuZCBTb3J0UmVzdHJpY3Rpb25zIG9mIHRoZSBtYWluIGFuZCBjaGlsZCBlbnRpdGllcyBhbmQgdGhlaXIgZGVkaWNhdGVkIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zLlxuXHQxLiBGb3IgY29udGFpbm1lbnQgc2NlbmFyaW86XG5cdCAgIDEuMS4gRm9yIExSLCBOYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucyBhcmUgZXZhbHVhdGVkIGZpcnN0LCBmb2xsb3dlZCBieSB0aGUgcmVzdHJpY3Rpb25zIG9uIHRoZSByb290IGVudGl0eS4gSWYgYm90aCBhIG5hdmlnYXRpb24gcHJvcGVydHkgcmVzdHJpY3Rpb24gYW5kIGEgZGlyZWN0IHJlc3RyaWN0aW9uIGV4aXN0LCB0aGUgbmF2aWdhdGlvbiByZXN0cmljdGlvbiBpcyB0aGUgbW9zdCBwcmVjaXNlIGRlZmluaXRpb24gYW5kIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZGlyZWN0IHJlc3RyaWN0aW9uLlxuXHQgICAxLjIgRm9yIHRoZSBPUCwgUmVzdHJpY3Rpb25zIGFyZSBvbmx5IGNhbGN1bGF0ZWQgb24gdGhlIHJvb3QgZW50aXR5LCBhcyB0aGVyZSBhcmUgbm8gY2hpbGQgZW50aXRpZXMuIFRoZSBzYW1lIGFwcHJvYWNoIGRlc2NyaWJlZCBpbiBwb2ludCAxLjEgaXMgYXBwbGllZC5cbiBcblx0Mi4gRm9yIGEgbm9uIGNvbnRhaW5tZW50IHNjZW5hcmlvOlxuXHQgICAyLjEgVGhlIHNhbWUgbG9naWMgZGVzY3JpYmVkIGluIHBvaW50IDEuMSBhcHBsaWVzLlxuXHQgICAyLjIgRm9yIHRoZSBPUFxuXHRcdFx0Mi4yLjEgUmV0cmlldmUgdGhlIGRpcmVjdCByZXN0cmljdGlvbnMgY29uZmlndXJlZCBvbiB0aGUgY2hpbGQgZW50aXR5IGRpc3BsYXllZCBpbiB0aGUgdGFibGUgb3Igb24gdGhlIHJvb3QgZW50aXR5LlxuXHRcdFx0Mi4yLjIgSWYgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IHJlc3RyaWN0aW9uIGlzIGRlZmluZWQgb24gdGhlIG1haW4gZW50aXR5LCBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGRpcmVjdCByZXN0cmljdGlvbnMgZnJvbSAyLjIuMS5cblx0XHRcdDIuMi4zIE5hdmlnYXRpb25SZXN0cmljdGlvbnMgb24gdGhlIHRhcmdldCAoY2hpbGQpIGVudGl0eSBzZXQgYXJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHJlc3RyaWN0aW9ucy5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZFxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gIE5vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGNvbnRhaW5tZW50LlxuICogQHBhcmFtIHBhcmVudE5hdmlnYXRpb25QYXRoIFRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLCBzcGVjaWZpYyBmb3IgY29udGFpbm1lbnQgc2NlbmFyaW8gdG8gZ2V0IHRoZSBjb3JyZWN0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1maWx0ZXJhYmxlIGFuZCBub24tc29ydGFibGUgcHJvcGVydGllc1xuICovXG5jb25zdCBnZXRQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zQmFzZWRPbkVudGl0aWVzID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlTZXQ6IEVudGl0eVNldCxcblx0dGFyZ2V0RW50aXR5U2V0PzogRW50aXR5U2V0LFxuXHRwYXJlbnROYXZpZ2F0aW9uUGF0aD86IHN0cmluZ1xuKTogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIHtcblx0Y29uc3QgcmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMgPSB7XG5cdFx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBnZXRTb3J0UmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMoZW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoKSxcblx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllczogZ2V0RmlsdGVyUmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMoZW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoKVxuXHR9O1xuXHRpZiAoIXRhcmdldEVudGl0eVNldCkge1xuXHRcdC8vIGlmIHRoZSB0YXJnZXRFbnRpdHlTZXQgaXMgbm90IGF2YWlsYWJsZSwgd2UgbmVlZCB0byBnZXQgYWxsIHRoZSBsaXN0IG9mIHJlc2N0cmljdGlvbnMgZnJvbSB0aGUgcm9vdCBlbnRpdHlTZXQsIHRoaXMgYXBwbGllcyBmb3Igb24gdGhlIGxpc3QgcmVwb3J0XG5cdFx0Y29uc3QgZGlyZWN0U29ydFJlc3RyaWN0aW9ucyA9IGdldERpcmVjdFNvcnRSZXN0cmljdGlvbnNSZWN1cnNpdmVseShlbnRpdHlTZXQsIHVuZGVmaW5lZCwgcGFyZW50TmF2aWdhdGlvblBhdGgpO1xuXHRcdGNvbnN0IGRpcmVjdEZpbHRlclJlc3RyaWN0aW9ucyA9IGdldERpcmVjdEZpbHRlclJlc3RyaWN0aW9uc1JlY3Vyc2l2ZWx5KGVudGl0eVNldCwgdW5kZWZpbmVkLCBwYXJlbnROYXZpZ2F0aW9uUGF0aCk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5vblNvcnRhYmxlUHJvcGVydGllczogQXJyYXkuZnJvbShcblx0XHRcdFx0bmV3IFNldChbLi4ucmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMubm9uU29ydGFibGVQcm9wZXJ0aWVzLCAuLi5kaXJlY3RTb3J0UmVzdHJpY3Rpb25zXSlcblx0XHRcdCksXG5cdFx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllczogQXJyYXkuZnJvbShcblx0XHRcdFx0bmV3IFNldChbLi4ucmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMsIC4uLmRpcmVjdEZpbHRlclJlc3RyaWN0aW9uc10pXG5cdFx0XHQpXG5cdFx0fTtcblx0fVxuXHRpZiAoIXJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLm5vblNvcnRhYmxlUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRyZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5ub25Tb3J0YWJsZVByb3BlcnRpZXMgPSBnZXREaXJlY3RTb3J0UmVzdHJpY3Rpb25zUmVjdXJzaXZlbHkoXG5cdFx0XHRlbnRpdHlTZXQsXG5cdFx0XHR0YXJnZXRFbnRpdHlTZXQsXG5cdFx0XHRwYXJlbnROYXZpZ2F0aW9uUGF0aFxuXHRcdCk7XG5cdH1cblx0aWYgKCFyZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5ub25GaWx0ZXJhYmxlUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRyZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5ub25GaWx0ZXJhYmxlUHJvcGVydGllcyA9IGdldERpcmVjdEZpbHRlclJlc3RyaWN0aW9uc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0ZW50aXR5U2V0LFxuXHRcdFx0dGFyZ2V0RW50aXR5U2V0LFxuXHRcdFx0cGFyZW50TmF2aWdhdGlvblBhdGhcblx0XHQpO1xuXHR9XG5cdHJldHVybiByZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucztcbn07XG5cbi8qKlxuICogR2V0cyBhbGwgU29ydFJlc3RyaWN0aW9ucyBhbmQgRmlsdGVyUmVzdHJpY3Rpb25zIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKiBUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIHdoZXRoZXIgd2UgYXJlIGluIGEgY29udGFpbm1lbnQgc2NlbmFyaW8uIEluIGEgbm9uIGNvbnRhaW5tZW50IHNjZW5hcmlvIGl0IGRldGVybWluZXMgaWYgd2UgYXJlIGluIGEgTGlzdCBSZXBvcnQgb3IgYW4gT2JqZWN0IFBhZ2UuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBhbGwgcHJvcGVydHkgbmFtZXMgb2YgcmVzdHJpY3Rpb25zIHNlcGFyYXRlZCBieSBzb3J0YWJsZSBhbmQgZmlsdGVyYWJsZSBjYXBhYmlsaXRpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSBmdW5jdGlvbiAoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyB7XG5cdGxldCBwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zOiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSB7IG5vblNvcnRhYmxlUHJvcGVydGllczogW10sIG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBbXSB9O1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IHsgcGFyZW50RW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoIH0gPSBnZXRUYXJnZXRFbnRpdHlTZXRJbmZvKGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRpZiAoaXNFbnRpdHlTZXQodGFyZ2V0RW50aXR5U2V0KSkge1xuXHRcdC8vIEdldCB0aGUgcmVzdHJpY3Rpb25zIG9uIHRoZSB0YXJnZXQgbmF2aWdhdGlvbiBlbnRpdHkgc2V0XG5cdFx0cHJvcGVydGllc1Jlc3RyaWN0aW9ucyA9IGdldFByb3BlcnRpZXNSZXN0cmljdGlvbnNCYXNlZE9uRW50aXRpZXModGFyZ2V0RW50aXR5U2V0KTtcblx0XHRpZiAocGFyZW50RW50aXR5U2V0ICYmIGlzRW50aXR5U2V0KHBhcmVudEVudGl0eVNldCkpIHtcblx0XHRcdC8vIEdldCB0aGUgcmVzdHJpY3Rpb25zIGZyb20gdGhlIE5hdmlnYXRpb25SZXN0cmljdGlvbnMgLyBSZXN0cmljdGlvbnMgb24gdGhlIHBhcmVudCBlbnRpdHkgc2V0XG5cdFx0XHQvLyBJdCdzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgcmVzdHJpY3Rpb25zIG9uIHRoZSB0YXJnZXQgZW50aXR5IHNldFxuXHRcdFx0Y29uc3QgcGFyZW50UHJvcGVydGllc1Jlc3RyaWN0aW9ucyA9IGdldFByb3BlcnRpZXNSZXN0cmljdGlvbnNCYXNlZE9uRW50aXRpZXMoXG5cdFx0XHRcdHBhcmVudEVudGl0eVNldCxcblx0XHRcdFx0dGFyZ2V0RW50aXR5U2V0LFxuXHRcdFx0XHRwYXJlbnROYXZpZ2F0aW9uUGF0aFxuXHRcdFx0KTtcblx0XHRcdGlmIChwYXJlbnRQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zLm5vblNvcnRhYmxlUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRcdFx0cHJvcGVydGllc1Jlc3RyaWN0aW9ucy5ub25Tb3J0YWJsZVByb3BlcnRpZXMgPSBwYXJlbnRQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zLm5vblNvcnRhYmxlUHJvcGVydGllcztcblx0XHRcdH1cblx0XHRcdGlmIChwYXJlbnRQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zLm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmxlbmd0aCkge1xuXHRcdFx0XHRwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zLm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzID0gcGFyZW50UHJvcGVydGllc1Jlc3RyaWN0aW9ucy5ub25GaWx0ZXJhYmxlUHJvcGVydGllcztcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAocGFyZW50RW50aXR5U2V0ICYmIGlzRW50aXR5U2V0KHBhcmVudEVudGl0eVNldCkpIHtcblx0XHQvLyBGaW5kIHRoZSByZXN0cmljdGlvbnMgb24gdGhlIHBhcmVudCBlbnRpdHkgc2V0LCB0aGlzIGFwcGxpZXMgYWxzbyBmb3IgY29udGFpbm1lbnQgYXMgdGhlcmUgaXNuJ3QgYW4gZW50aXR5IHNldCBvbiB0aGUgT1Bcblx0XHRyZXR1cm4gZ2V0UHJvcGVydGllc1Jlc3RyaWN0aW9uc0Jhc2VkT25FbnRpdGllcyhwYXJlbnRFbnRpdHlTZXQsIHVuZGVmaW5lZCwgcGFyZW50TmF2aWdhdGlvblBhdGgpO1xuXHR9XG5cdHJldHVybiBwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzb3J0IHJlc3RyaWN0aW9ucyBmcm9tIHRoZSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZC5cbiAqIEBwYXJhbSB0YXJnZXRFbnRpdHlTZXQgVGhlIHRhcmdldCBlbnRpdHkgc2V0LCBpZiBhdmFpbGFibGUuIE5vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGNvbnRhaW5tZW50LlxuICogQHBhcmFtIHBhcmVudE5hdmlnYXRpb25QYXRoIFRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLCBzcGVjaWZpYyBmb3IgY29udGFpbm1lbnQgc2NlbmFyaW8gdG8gZ2V0IHRoZSBjb3JyZWN0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1zb3J0YWJsZSBwcm9wZXJ0aWVzIGZyb20gbmF2aWdhdGlvbiByZXN0cmljdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGdldFNvcnRSZXN0cmljdGlvbnNmcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyhcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldCxcblx0cGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3Qgc29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5SZXN0cmljdGVkUHJvcGVydGllcz8uZm9yRWFjaCgobmF2aWdhdGlvblJlc3RyaWN0aW9uKSA9PiB7XG5cdFx0Ly8gaWYgY29udGFpbm1lbnQgZW5hYmxlZCBnZXQgb25seSB0aGUgc29ydCByZXN0cmljdGlvbnMgb2YgdGhlIHJlbGF0ZWQgbmF2aWdhdGlvbiBwYXRoXG5cdFx0aWYgKHBhcmVudE5hdmlnYXRpb25QYXRoICYmIHBhcmVudE5hdmlnYXRpb25QYXRoICE9PSBuYXZpZ2F0aW9uUmVzdHJpY3Rpb24/Lk5hdmlnYXRpb25Qcm9wZXJ0eT8udmFsdWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKG5hdmlnYXRpb25SZXN0cmljdGlvbj8uU29ydFJlc3RyaWN0aW9ucz8uU29ydGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHlcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0eSA9IG5hdmlnYXRpb25SZXN0cmljdGlvbi5OYXZpZ2F0aW9uUHJvcGVydHkuJHRhcmdldDtcblx0XHRcdGlmIChuYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0Ly8gYWRkIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHRvIHRoZSBub25Tb3J0YWJsZVByb3BlcnRpZXNcblx0XHRcdFx0aWYgKHBhcmVudE5hdmlnYXRpb25QYXRoKSB7XG5cdFx0XHRcdFx0c29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0XHQuLi5uYXZpZ2F0aW9uUHJvcGVydHkudGFyZ2V0VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzb3J0UmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMucHVzaChcblx0XHRcdFx0XHRcdC4uLm5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gYCR7bmF2aWdhdGlvblByb3BlcnR5Lm5hbWV9LyR7cHJvcGVydHkubmFtZX1gKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgbm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uU29ydFJlc3RyaWN0aW9ucz8uTm9uU29ydGFibGVQcm9wZXJ0aWVzPy5tYXAoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdC8vIFdlIG5lZWQgdGhlIHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgbmF2aWdhdGlvbiByZXN0cmljdGlvbiBkZWZpbml0aW9uIHdoZW4gdGhlIHRhcmdldEVudGl0eVNldCBpcyBhdmFpbGFibGVcblx0XHRcdFx0aWYgKCh0YXJnZXRFbnRpdHlTZXQgfHwgcGFyZW50TmF2aWdhdGlvblBhdGgpICYmIHByb3BlcnR5LiR0YXJnZXQ/Lm5hbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHkuJHRhcmdldD8ubmFtZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBsZWF2ZSB0aGUgcHJvcGVydHkgcGF0aCB1bmNoYW5nZWQgKGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBhbm5vdGF0aW9uIHRhcmdldCEpXG5cdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5LnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmIChub25Tb3J0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdFx0c29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLnB1c2goLi4ubm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHNvcnRSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzb3J0IHJlc3RyaWN0aW9ucyBkaXJlY3RseSBmcm9tIHRoZSBlbnRpdHkgc2V0LlxuICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHkgc2V0IHRvIGJlIGFuYWx5emVkLlxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gTm90IHVzZWQgaW4gdGhlIGNhc2Ugb2YgY29udGFpbm1lbnQuXG4gKiBAcGFyYW0gcGFyZW50TmF2aWdhdGlvblBhdGggVGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGgsIHNwZWNpZmljIGZvciBjb250YWlubWVudCBzY2VuYXJpbyB0byBnZXQgdGhlIGNvcnJlY3QgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgbm9uLXNvcnRhYmxlIHByb3BlcnRpZXMuXG4gKi9cbmZ1bmN0aW9uIGdldERpcmVjdFNvcnRSZXN0cmljdGlvbnNSZWN1cnNpdmVseShlbnRpdHlTZXQ6IEVudGl0eVNldCwgdGFyZ2V0RW50aXR5U2V0PzogRW50aXR5U2V0LCBwYXJlbnROYXZpZ2F0aW9uUGF0aD86IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0Y29uc3Qgc29ydFJlc3RyaWN0aW9uc09uRW50aXR5U2V0OiBzdHJpbmdbXSA9IFtdO1xuXHRpZiAodGFyZ2V0RW50aXR5U2V0KSB7XG5cdFx0Ly8gaWYgdGhlIHRhcmdldEVudGl0eVNldCBmcm9tIGEgbmF2aWdhdGlvbiBpcyBhdmFpbGFibGUsIGdldCB0aGUgZGlyZWN0IHJlc3RyaWN0aW9uIG9uIHRoZSB0YXJnZXRFbnRpdHlTZXQgKGNoaWxkIGVudGl0eSBzZXQpXG5cdFx0cmV0dXJuIGdldERpcmVjdFNvcnRSZXN0cmljdGlvbnNSZWN1cnNpdmVseSh0YXJnZXRFbnRpdHlTZXQsIHVuZGVmaW5lZCwgcGFyZW50TmF2aWdhdGlvblBhdGgpO1xuXHR9XG5cdGlmIChlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5Tb3J0UmVzdHJpY3Rpb25zPy5Tb3J0YWJsZSA9PT0gZmFsc2UpIHtcblx0XHQvLyBhZGQgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSBzZXQgdG8gdGhlIG5vblNvcnRhYmxlUHJvcGVydGllc1xuXHRcdHNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldC5wdXNoKC4uLmVudGl0eVNldC5lbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSkpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IG5vblNvcnRhYmxlUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5Tb3J0UmVzdHJpY3Rpb25zPy5Ob25Tb3J0YWJsZVByb3BlcnRpZXM/LmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRpZiAocGFyZW50TmF2aWdhdGlvblBhdGggJiYgIXByb3BlcnR5LnZhbHVlLmluY2x1ZGVzKHBhcmVudE5hdmlnYXRpb25QYXRoKSkge1xuXHRcdFx0XHQvLyBza2lwIHRoZSBub24gc29ydGFibGUgcHJvcGVydHkgaWYgaXQgZG9lc24ndCBiZWxvbmcgdG8gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGggaW4gY2FzZSBvZiBjb250YWlubWVudFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoKHRhcmdldEVudGl0eVNldCB8fCBwYXJlbnROYXZpZ2F0aW9uUGF0aCkgJiYgcHJvcGVydHkuJHRhcmdldD8ubmFtZSkge1xuXHRcdFx0XHRub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eS4kdGFyZ2V0Py5uYW1lKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5LnZhbHVlKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAobm9uU29ydGFibGVQcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdHNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldC5wdXNoKC4uLm5vblNvcnRhYmxlUHJvcGVydGllcyk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBzb3J0UmVzdHJpY3Rpb25zT25FbnRpdHlTZXQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZmlsdGVyIHJlc3RyaWN0aW9ucyBmcm9tIHRoZSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZC5cbiAqIEBwYXJhbSB0YXJnZXRFbnRpdHlTZXQgVGhlIHRhcmdldCBlbnRpdHkgc2V0LCBpZiBhdmFpbGFibGUuIE5vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGNvbnRhaW5tZW50LlxuICogQHBhcmFtIHBhcmVudE5hdmlnYXRpb25QYXRoIFRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLCBzcGVjaWZpYyBmb3IgY29udGFpbm1lbnQgc2NlbmFyaW8gdG8gZ2V0IHRoZSBjb3JyZWN0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1maWx0ZXJhYmxlIHByb3BlcnRpZXMgZnJvbSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMoXG5cdGVudGl0eVNldDogRW50aXR5U2V0LFxuXHR0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQsXG5cdHBhcmVudE5hdmlnYXRpb25QYXRoPzogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGZpbHRlclJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5SZXN0cmljdGVkUHJvcGVydGllcz8uZm9yRWFjaCgobmF2aWdhdGlvblJlc3RyaWN0aW9uKSA9PiB7XG5cdFx0Ly8gaWYgY29udGFpbm1lbnQgZW5hYmxlZCBnZXQgb25seSB0aGUgZmlsdGVyIHJlc3RyaWN0aW9ucyBvZiB0aGUgcmVsYXRlZCBuYXZpZ2F0aW9uIHBhdGhcblx0XHRpZiAocGFyZW50TmF2aWdhdGlvblBhdGggJiYgcGFyZW50TmF2aWdhdGlvblBhdGggIT09IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uTmF2aWdhdGlvblByb3BlcnR5Py52YWx1ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAobmF2aWdhdGlvblJlc3RyaWN0aW9uPy5GaWx0ZXJSZXN0cmljdGlvbnM/LkZpbHRlcmFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHlcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0eSA9IG5hdmlnYXRpb25SZXN0cmljdGlvbi5OYXZpZ2F0aW9uUHJvcGVydHkuJHRhcmdldDtcblx0XHRcdGlmIChuYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0Ly8gYWRkIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHRvIHRoZSBub25GaWx0ZXJhYmxlUHJvcGVydGllc1xuXHRcdFx0XHRpZiAocGFyZW50TmF2aWdhdGlvblBhdGgpIHtcblx0XHRcdFx0XHRmaWx0ZXJSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5wdXNoKFxuXHRcdFx0XHRcdFx0Li4ubmF2aWdhdGlvblByb3BlcnR5LnRhcmdldFR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMucHVzaChcblx0XHRcdFx0XHRcdC4uLm5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gYCR7bmF2aWdhdGlvblByb3BlcnR5Lm5hbWV9LyR7cHJvcGVydHkubmFtZX1gKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgbm9uRmlsdGVyYWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gbmF2aWdhdGlvblJlc3RyaWN0aW9uPy5GaWx0ZXJSZXN0cmljdGlvbnM/Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzPy5tYXAoXG5cdFx0XHRcdChwcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRcdC8vIHdlIG5lZWQgdGhlIHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgbmF2aWdhdGlvbiByZXN0cmljdGlvbiBkZWZpbml0aW9uIHdoZW4gdGhlIHRhcmdldEVudGl0eVNldCBpcyBhdmFpbGFibGUgYW5kIGl0J3Mgbm90IGEgY29udGFpbm1lbnQgc2NlbmFyaW9cblx0XHRcdFx0XHRpZiAoKHRhcmdldEVudGl0eVNldCB8fCBwYXJlbnROYXZpZ2F0aW9uUGF0aCkgJiYgcHJvcGVydHkuJHRhcmdldD8ubmFtZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5LiR0YXJnZXQ/Lm5hbWU7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIGxlYXZlIHRoZSBwcm9wZXJ0eSBwYXRoIHVuY2hhbmdlZCAoaXQgaXMgcmVsYXRpdmUgdG8gdGhlIGFubm90YXRpb24gdGFyZ2V0ISlcblx0XHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eS52YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cdFx0XHRpZiAobm9uRmlsdGVyYWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdFx0ZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMucHVzaCguLi5ub25GaWx0ZXJhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBmaWx0ZXJSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBmaWx0ZXIgcmVzdHJpY3Rpb25zIGRpcmVjdGx5IGZyb20gdGhlIGVudGl0eSBzZXQuXG4gKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eSBzZXQgdG8gYmUgYW5hbHl6ZWQuXG4gKiBAcGFyYW0gdGFyZ2V0RW50aXR5U2V0IFRoZSB0YXJnZXQgZW50aXR5IHNldCwgaWYgYXZhaWxhYmxlLiBOb3QgdXNlZCBpbiB0aGUgY2FzZSBvZiBjb250YWlubWVudC5cbiAqIEBwYXJhbSBwYXJlbnROYXZpZ2F0aW9uUGF0aCBUaGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aCwgc3BlY2lmaWMgZm9yIGNvbnRhaW5tZW50IHNjZW5hcmlvIHRvIGdldCB0aGUgY29ycmVjdCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aC5cbiAqIEByZXR1cm5zIEFycmF5IGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5IG5hbWVzIG9mIGFsbCBub24tZmlsdGVyYWJsZSBwcm9wZXJ0aWVzLlxuICovXG5mdW5jdGlvbiBnZXREaXJlY3RGaWx0ZXJSZXN0cmljdGlvbnNSZWN1cnNpdmVseShcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldCxcblx0cGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3QgZmlsdGVyUmVzdHJpY3Rpb25zT25FbnRpdHlTZXQ6IHN0cmluZ1tdID0gW107XG5cdGlmICh0YXJnZXRFbnRpdHlTZXQgJiYgcGFyZW50TmF2aWdhdGlvblBhdGgpIHtcblx0XHQvLyBpZiB0aGUgdGFyZ2V0RW50aXR5U2V0IGZyb20gYSBuYXZpZ2F0aW9uIGlzIGF2YWlsYWJsZSwgZ2V0IHRoZSBkaXJlY3QgcmVzdHJpY3Rpb24gb24gdGhlIHRhcmdldEVudGl0eVNldCAoY2hpbGQgZW50aXR5IHNldClcblx0XHRyZXR1cm4gZ2V0RGlyZWN0RmlsdGVyUmVzdHJpY3Rpb25zUmVjdXJzaXZlbHkodGFyZ2V0RW50aXR5U2V0LCB1bmRlZmluZWQsIHBhcmVudE5hdmlnYXRpb25QYXRoKTtcblx0fVxuXHRpZiAoZW50aXR5U2V0LmFubm90YXRpb25zLkNhcGFiaWxpdGllcz8uRmlsdGVyUmVzdHJpY3Rpb25zPy5GaWx0ZXJhYmxlID09PSBmYWxzZSkge1xuXHRcdC8vIGFkZCBhbGwgcHJvcGVydGllcyBvZiB0aGUgZW50aXR5IHNldCB0byB0aGUgbm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcblx0XHRmaWx0ZXJSZXN0cmljdGlvbnNPbkVudGl0eVNldC5wdXNoKC4uLmVudGl0eVNldC5lbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSkpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlclJlc3RyaWN0aW9ucz8uTm9uRmlsdGVyYWJsZVByb3BlcnRpZXM/LmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRpZiAocGFyZW50TmF2aWdhdGlvblBhdGggJiYgIXByb3BlcnR5LnZhbHVlLmluY2x1ZGVzKHBhcmVudE5hdmlnYXRpb25QYXRoKSkge1xuXHRcdFx0XHQvLyBza2lwIHRoZSBub24gZmlsdGVyYWJsZSBwcm9wZXJ0eSBpZiBpdCBkb2Vzbid0IGJlbG9uZyB0byB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aCBpbiBjYXNlIG9mIGNvbnRhaW5tZW50XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICgodGFyZ2V0RW50aXR5U2V0IHx8IHBhcmVudE5hdmlnYXRpb25QYXRoKSAmJiBwcm9wZXJ0eS4kdGFyZ2V0Py5uYW1lKSB7XG5cdFx0XHRcdG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkuJHRhcmdldD8ubmFtZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5LnZhbHVlKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAobm9uRmlsdGVyYWJsZVByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdFx0ZmlsdGVyUmVzdHJpY3Rpb25zT25FbnRpdHlTZXQucHVzaCguLi5ub25GaWx0ZXJhYmxlUHJvcGVydGllcyk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmaWx0ZXJSZXN0cmljdGlvbnNPbkVudGl0eVNldDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztFQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNQSx3Q0FBd0MsR0FBRyxTQUFBQSxDQUNoREMsU0FBb0IsRUFDcEJDLGVBQTJCLEVBQzNCQyxvQkFBNkIsRUFDRjtJQUMzQixNQUFNQyxzQ0FBc0MsR0FBRztNQUM5Q0MscUJBQXFCLEVBQUVDLDZDQUE2QyxDQUFDTCxTQUFTLEVBQUVDLGVBQWUsRUFBRUMsb0JBQW9CLENBQUM7TUFDdEhJLHVCQUF1QixFQUFFQywrQ0FBK0MsQ0FBQ1AsU0FBUyxFQUFFQyxlQUFlLEVBQUVDLG9CQUFvQjtJQUMxSCxDQUFDO0lBQ0QsSUFBSSxDQUFDRCxlQUFlLEVBQUU7TUFDckI7TUFDQSxNQUFNTyxzQkFB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
234
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zQmFzZWRPbkVudGl0aWVzIiwiZW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwicGFyZW50TmF2aWdhdGlvblBhdGgiLCJyZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsImdldFNvcnRSZXN0cmljdGlvbnNmcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiZ2V0RmlsdGVyUmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJkaXJlY3RSZXN0cmljdGlvbnMiLCJnZXREaXJlY3RTb3J0UmVzdHJpY3Rpb25zIiwiZ2V0RGlyZWN0RmlsdGVyUmVzdHJpY3Rpb25zIiwiQXJyYXkiLCJmcm9tIiwiU2V0IiwiZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIiwiY29udmVydGVyQ29udGV4dCIsInByb3BlcnRpZXNSZXN0cmljdGlvbnMiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInBhcmVudEVudGl0eVNldCIsImdldFRhcmdldEVudGl0eVNldEluZm8iLCJpc0VudGl0eVNldCIsInVuZGVmaW5lZCIsIl9leHBvcnRzIiwic29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiYW5ub3RhdGlvbnMiLCJDYXBhYmlsaXRpZXMiLCJOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiUmVzdHJpY3RlZFByb3BlcnRpZXMiLCJmb3JFYWNoIiwibmF2aWdhdGlvblJlc3RyaWN0aW9uIiwiTmF2aWdhdGlvblByb3BlcnR5IiwidmFsdWUiLCJTb3J0UmVzdHJpY3Rpb25zIiwiU29ydGFibGUiLCJuYXZpZ2F0aW9uUHJvcGVydHkiLCIkdGFyZ2V0IiwicHVzaCIsImdldEFsbFByb3BlcnRpZXNPZk5hdmlnYXRpb25Qcm9wZXJ0eSIsIm5vblNvcnRhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMiLCJOb25Tb3J0YWJsZVByb3BlcnRpZXMiLCJtYXAiLCJwcm9wZXJ0eSIsImdldFJlc3RyaWN0ZWRQcm9wZXJ0eVJlbGF0aXZlUGF0aCIsImxlbmd0aCIsInNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldCIsImVudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwibmFtZSIsImluY2x1ZGVzIiwiZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJGaWx0ZXJSZXN0cmljdGlvbnMiLCJGaWx0ZXJhYmxlIiwibm9uRmlsdGVyYWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMiLCJuYXZpZ2F0aW9uUGF0aEJhc2VkT25QYXJlbnQiLCJyZXBsYWNlIiwidGFyZ2V0VHlwZSIsImZpbHRlclJlc3RyaWN0aW9uc09uRW50aXR5U2V0IiwicHJvcGVydHlQYXRoIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJFbnRpdHlTZXRIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHsgaXNFbnRpdHlTZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgeyBnZXRUYXJnZXRFbnRpdHlTZXRJbmZvIH0gZnJvbSBcIi4vRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuXG5leHBvcnQgdHlwZSBSZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSB7XG5cdG5vblNvcnRhYmxlUHJvcGVydGllczogc3RyaW5nW107XG5cdG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICogUmVhZHMgYWxsIEZpbHRlclJlc3RyaWN0aW9ucyBhbmQgU29ydFJlc3RyaWN0aW9ucyBvZiB0aGUgbWFpbiBhbmQgY2hpbGQgZW50aXRpZXMgYW5kIHRoZWlyIGRlZGljYXRlZCBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbjEuIEZvciBjb250YWlubWVudCBzY2VuYXJpbzpcbiAgIDEuMS4gRm9yIExSLCBOYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucyBhcmUgZXZhbHVhdGVkIGZpcnN0LCBmb2xsb3dlZCBieSB0aGUgcmVzdHJpY3Rpb25zIG9uIHRoZSByb290IGVudGl0eS4gSWYgTmF2aWdhdGlvbiBwcm9wZXJ0eSByZXN0cmljdGlvbiBhbmQgYSBkaXJlY3QgcmVzdHJpY3Rpb24gZXhpc3QsIGJvdGggYXJlIGNvbnNpZGVyZWQuXG4gICAxLjIgRm9yIHRoZSBPUCwgUmVzdHJpY3Rpb25zIGFyZSBvbmx5IGNhbGN1bGF0ZWQgb24gdGhlIHJvb3QgZW50aXR5LCBhcyB0aGVyZSBhcmUgbm8gY2hpbGQgZW50aXRpZXMuIFRoZSBzYW1lIGFwcHJvYWNoIGRlc2NyaWJlZCBpbiBwb2ludCAxLjEgaXMgYXBwbGllZC5cbjIuIEZvciBhIG5vbiBjb250YWlubWVudCBzY2VuYXJpbzpcbiAgIDIuMSBUaGUgc2FtZSBsb2dpYyBkZXNjcmliZWQgaW4gcG9pbnQgMS4xIGFwcGxpZXMuXG4gICAyLjIgRm9yIHRoZSBPUCwgdGhlIGRpcmVjdCByZXN0cmljdGlvbnMgY29uZmlndXJlZCBmb3IgdGhlIE9QIGFyZSBjb25zaWRlcmVkIGFsb25nIHdpdGggdGhlIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zIG9uIHRoZSB0YXJnZXQgKGNoaWxkKSBlbnRpdHkgZGlzcGxheWVkLlxuICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHkgc2V0IHRvIGJlIGFuYWx5emVkICh0YXJnZXQgb3IgcGFyZW50IGVudGl0eSBzZXQpLlxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gIE5vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGNvbnRhaW5tZW50LlxuICogQHBhcmFtIHBhcmVudE5hdmlnYXRpb25QYXRoIFRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLCBzcGVjaWZpYyBmb3IgY29udGFpbm1lbnQgc2NlbmFyaW8gdG8gZ2V0IHRoZSBjb3JyZWN0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1maWx0ZXJhYmxlIGFuZCBub24tc29ydGFibGUgcHJvcGVydGllc1xuICovXG5jb25zdCBnZXRQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zQmFzZWRPbkVudGl0aWVzID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlTZXQ6IEVudGl0eVNldCxcblx0dGFyZ2V0RW50aXR5U2V0PzogRW50aXR5U2V0LFxuXHRwYXJlbnROYXZpZ2F0aW9uUGF0aD86IHN0cmluZ1xuKTogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIHtcblx0Y29uc3QgcmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMgPSB7XG5cdFx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBnZXRTb3J0UmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMoZW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoKSxcblx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllczogZ2V0RmlsdGVyUmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMoZW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoKVxuXHR9O1xuXHRjb25zdCBkaXJlY3RSZXN0cmljdGlvbnMgPSB7XG5cdFx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBnZXREaXJlY3RTb3J0UmVzdHJpY3Rpb25zKGVudGl0eVNldCwgdGFyZ2V0RW50aXR5U2V0LCBwYXJlbnROYXZpZ2F0aW9uUGF0aCksXG5cdFx0bm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IGdldERpcmVjdEZpbHRlclJlc3RyaWN0aW9ucyhlbnRpdHlTZXQsIHRhcmdldEVudGl0eVNldCwgcGFyZW50TmF2aWdhdGlvblBhdGgpXG5cdH07XG5cdHJldHVybiB7XG5cdFx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBBcnJheS5mcm9tKFxuXHRcdFx0bmV3IFNldChbLi4ucmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMubm9uU29ydGFibGVQcm9wZXJ0aWVzLCAuLi5kaXJlY3RSZXN0cmljdGlvbnMubm9uU29ydGFibGVQcm9wZXJ0aWVzXSlcblx0XHQpLFxuXHRcdG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBBcnJheS5mcm9tKFxuXHRcdFx0bmV3IFNldChbLi4ucmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMsIC4uLmRpcmVjdFJlc3RyaWN0aW9ucy5ub25GaWx0ZXJhYmxlUHJvcGVydGllc10pXG5cdFx0KVxuXHR9O1xufTtcblxuLyoqXG4gKiBHZXRzIGFsbCBTb3J0UmVzdHJpY3Rpb25zIGFuZCBGaWx0ZXJSZXN0cmljdGlvbnMgZm9yIGEgZ2l2ZW4gY29udGV4dC5cbiAqIFRoaXMgZnVuY3Rpb24gdmVyaWZpZXMgd2hldGhlciB3ZSBhcmUgaW4gYSBjb250YWlubWVudCBzY2VuYXJpby5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIGFsbCBwcm9wZXJ0eSBuYW1lcyBvZiByZXN0cmljdGlvbnMgc2VwYXJhdGVkIGJ5IHNvcnRhYmxlIGFuZCBmaWx0ZXJhYmxlIGNhcGFiaWxpdGllcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIHtcblx0bGV0IHByb3BlcnRpZXNSZXN0cmljdGlvbnM6IFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IHsgbm9uU29ydGFibGVQcm9wZXJ0aWVzOiBbXSwgbm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IFtdIH07XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Y29uc3QgeyBwYXJlbnRFbnRpdHlTZXQsIHRhcmdldEVudGl0eVNldCwgcGFyZW50TmF2aWdhdGlvblBhdGggfSA9IGdldFRhcmdldEVudGl0eVNldEluZm8oZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdGlmIChpc0VudGl0eVNldCh0YXJnZXRFbnRpdHlTZXQpKSB7XG5cdFx0Ly8gR2V0IHRoZSByZXN0cmljdGlvbnMgb24gdGhlIHRhcmdldCBuYXZpZ2F0aW9uIGVudGl0eSBzZXRcblx0XHRyZXR1cm4gZ2V0UHJvcGVydGllc1Jlc3RyaWN0aW9uc0Jhc2VkT25FbnRpdGllcyh0YXJnZXRFbnRpdHlTZXQpO1xuXHR9IGVsc2UgaWYgKHBhcmVudEVudGl0eVNldCAmJiBpc0VudGl0eVNldChwYXJlbnRFbnRpdHlTZXQpKSB7XG5cdFx0Ly8gRmluZCB0aGUgcmVzdHJpY3Rpb25zIG9uIHRoZSBwYXJlbnQgZW50aXR5IHNldCwgdGhpcyBhcHBsaWVzIGZvciBjb250YWlubWVudCBhcyB0aGVyZSBpc24ndCBhbiBlbnRpdHkgc2V0IGF2YWlsYWJsZSBvbiB0aGUgT1Bcblx0XHRyZXR1cm4gZ2V0UHJvcGVydGllc1Jlc3RyaWN0aW9uc0Jhc2VkT25FbnRpdGllcyhwYXJlbnRFbnRpdHlTZXQsIHVuZGVmaW5lZCwgcGFyZW50TmF2aWdhdGlvblBhdGgpO1xuXHR9XG5cdHJldHVybiBwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzb3J0IHJlc3RyaWN0aW9ucyBmcm9tIHRoZSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZC5cbiAqIEBwYXJhbSB0YXJnZXRFbnRpdHlTZXQgVGhlIHRhcmdldCBlbnRpdHkgc2V0LCBpZiBhdmFpbGFibGUuIE5vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGNvbnRhaW5tZW50LlxuICogQHBhcmFtIHBhcmVudE5hdmlnYXRpb25QYXRoIFRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLCBzcGVjaWZpYyBmb3IgY29udGFpbm1lbnQgc2NlbmFyaW8gdG8gZ2V0IHRoZSBjb3JyZWN0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1zb3J0YWJsZSBwcm9wZXJ0aWVzIGZyb20gbmF2aWdhdGlvbiByZXN0cmljdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGdldFNvcnRSZXN0cmljdGlvbnNmcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyhcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldCxcblx0cGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3Qgc29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5SZXN0cmljdGVkUHJvcGVydGllcz8uZm9yRWFjaCgobmF2aWdhdGlvblJlc3RyaWN0aW9uKSA9PiB7XG5cdFx0Ly8gaWYgY29udGFpbm1lbnQgZW5hYmxlZCBnZXQgb25seSB0aGUgc29ydCByZXN0cmljdGlvbnMgb2YgdGhlIHJlbGF0ZWQgbmF2aWdhdGlvbiBwYXRoXG5cdFx0aWYgKHBhcmVudE5hdmlnYXRpb25QYXRoICYmIHBhcmVudE5hdmlnYXRpb25QYXRoICE9PSBuYXZpZ2F0aW9uUmVzdHJpY3Rpb24/Lk5hdmlnYXRpb25Qcm9wZXJ0eT8udmFsdWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKG5hdmlnYXRpb25SZXN0cmljdGlvbj8uU29ydFJlc3RyaWN0aW9ucz8uU29ydGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHlcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0eSA9IG5hdmlnYXRpb25SZXN0cmljdGlvbi5OYXZpZ2F0aW9uUHJvcGVydHkuJHRhcmdldDtcblx0XHRcdGlmIChuYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0Ly8gYWRkIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHRvIHRoZSBub25Tb3J0YWJsZVByb3BlcnRpZXNcblx0XHRcdFx0c29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0Li4uZ2V0QWxsUHJvcGVydGllc09mTmF2aWdhdGlvblByb3BlcnR5KG5hdmlnYXRpb25Qcm9wZXJ0eSwgbmF2aWdhdGlvblJlc3RyaWN0aW9uLCBwYXJlbnROYXZpZ2F0aW9uUGF0aClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgbm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uU29ydFJlc3RyaWN0aW9ucz8uTm9uU29ydGFibGVQcm9wZXJ0aWVzPy5tYXAoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdHJldHVybiBnZXRSZXN0cmljdGVkUHJvcGVydHlSZWxhdGl2ZVBhdGgocHJvcGVydHksIHRhcmdldEVudGl0eVNldCwgcGFyZW50TmF2aWdhdGlvblBhdGgpO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAobm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0XHRcdHNvcnRSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5wdXNoKC4uLm5vblNvcnRhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBzb3J0UmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnM7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc29ydCByZXN0cmljdGlvbnMgZGlyZWN0bHkgZnJvbSB0aGUgZW50aXR5IHNldC5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZC5cbiAqIEBwYXJhbSB0YXJnZXRFbnRpdHlTZXQgVGhlIHRhcmdldCBlbnRpdHkgc2V0LCBpZiBhdmFpbGFibGUuIE5vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGNvbnRhaW5tZW50LlxuICogQHBhcmFtIHBhcmVudE5hdmlnYXRpb25QYXRoIFRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLCBzcGVjaWZpYyBmb3IgY29udGFpbm1lbnQgc2NlbmFyaW8gdG8gZ2V0IHRoZSBjb3JyZWN0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1zb3J0YWJsZSBwcm9wZXJ0aWVzLlxuICovXG5mdW5jdGlvbiBnZXREaXJlY3RTb3J0UmVzdHJpY3Rpb25zKGVudGl0eVNldDogRW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoPzogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBzb3J0UmVzdHJpY3Rpb25zT25FbnRpdHlTZXQ6IHN0cmluZ1tdID0gW107XG5cdGlmIChlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5Tb3J0UmVzdHJpY3Rpb25zPy5Tb3J0YWJsZSA9PT0gZmFsc2UpIHtcblx0XHQvLyBhZGQgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSBzZXQgdG8gdGhlIG5vblNvcnRhYmxlUHJvcGVydGllc1xuXHRcdHNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldC5wdXNoKC4uLmVudGl0eVNldC5lbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSkpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IG5vblNvcnRhYmxlUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5Tb3J0UmVzdHJpY3Rpb25zPy5Ob25Tb3J0YWJsZVByb3BlcnRpZXM/LmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRpZiAocGFyZW50TmF2aWdhdGlvblBhdGggJiYgIXByb3BlcnR5LnZhbHVlLmluY2x1ZGVzKHBhcmVudE5hdmlnYXRpb25QYXRoKSkge1xuXHRcdFx0XHQvLyBza2lwIHRoZSBub24gc29ydGFibGUgcHJvcGVydHkgaWYgaXQgZG9lc24ndCBiZWxvbmcgdG8gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGggaW4gY2FzZSBvZiBjb250YWlubWVudFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChnZXRSZXN0cmljdGVkUHJvcGVydHlSZWxhdGl2ZVBhdGgocHJvcGVydHksIHRhcmdldEVudGl0eVNldCwgcGFyZW50TmF2aWdhdGlvblBhdGgpKTtcblx0XHR9KTtcblx0XHRpZiAobm9uU29ydGFibGVQcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdHNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldC5wdXNoKC4uLm5vblNvcnRhYmxlUHJvcGVydGllcyk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBzb3J0UmVzdHJpY3Rpb25zT25FbnRpdHlTZXQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZmlsdGVyIHJlc3RyaWN0aW9ucyBmcm9tIHRoZSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZC5cbiAqIEBwYXJhbSB0YXJnZXRFbnRpdHlTZXQgVGhlIHRhcmdldCBlbnRpdHkgc2V0LCBpZiBhdmFpbGFibGUuIE5vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGNvbnRhaW5tZW50LlxuICogQHBhcmFtIHBhcmVudE5hdmlnYXRpb25QYXRoIFRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLCBzcGVjaWZpYyBmb3IgY29udGFpbm1lbnQgc2NlbmFyaW8gdG8gZ2V0IHRoZSBjb3JyZWN0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1maWx0ZXJhYmxlIHByb3BlcnRpZXMgZnJvbSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMoXG5cdGVudGl0eVNldDogRW50aXR5U2V0LFxuXHR0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQsXG5cdHBhcmVudE5hdmlnYXRpb25QYXRoPzogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGZpbHRlclJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5SZXN0cmljdGVkUHJvcGVydGllcz8uZm9yRWFjaCgobmF2aWdhdGlvblJlc3RyaWN0aW9uKSA9PiB7XG5cdFx0Ly8gR2V0IHRoZSBmaWx0ZXIgcmVzdHJpY3Rpb25zIG9mIHRoZSByZWxhdGVkIG5hdmlnYXRpb24gcGF0aFxuXHRcdC8vIFRoZSBuYXZpZ2F0aW9uUmVzdHJpY3Rpb24gaXMgYWxzbyByZWxldmFudCBpZiBpdCBjb250YWlucyB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aFxuXHRcdGlmIChwYXJlbnROYXZpZ2F0aW9uUGF0aCAmJiAhbmF2aWdhdGlvblJlc3RyaWN0aW9uPy5OYXZpZ2F0aW9uUHJvcGVydHk/LnZhbHVlLmluY2x1ZGVzKHBhcmVudE5hdmlnYXRpb25QYXRoKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAobmF2aWdhdGlvblJlc3RyaWN0aW9uPy5GaWx0ZXJSZXN0cmljdGlvbnM/LkZpbHRlcmFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHlcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0eSA9IG5hdmlnYXRpb25SZXN0cmljdGlvbi5OYXZpZ2F0aW9uUHJvcGVydHkuJHRhcmdldDtcblx0XHRcdGlmIChuYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0Ly8gYWRkIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHRvIHRoZSBub25GaWx0ZXJhYmxlUHJvcGVydGllc1xuXHRcdFx0XHRmaWx0ZXJSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5wdXNoKFxuXHRcdFx0XHRcdC4uLmdldEFsbFByb3BlcnRpZXNPZk5hdmlnYXRpb25Qcm9wZXJ0eShuYXZpZ2F0aW9uUHJvcGVydHksIG5hdmlnYXRpb25SZXN0cmljdGlvbiwgcGFyZW50TmF2aWdhdGlvblBhdGgpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uRmlsdGVyUmVzdHJpY3Rpb25zPy5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcz8ubWFwKFxuXHRcdFx0XHQocHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gZ2V0UmVzdHJpY3RlZFByb3BlcnR5UmVsYXRpdmVQYXRoKHByb3BlcnR5LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHRcdGlmIChub25GaWx0ZXJhYmxlTmF2aWdhdGlvblByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdFx0XHRmaWx0ZXJSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5wdXNoKC4uLm5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGZpbHRlclJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zO1xufVxuXG4vKipcbiAqIEdldHMgYWxsIHByb3BlcnRpZXMgb2YgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9uIGFuZCBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHBhcmFtIG5hdmlnYXRpb25Qcm9wZXJ0eSBUaGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSB0byBiZSBhbmFseXplZC5cbiAqIEBwYXJhbSBuYXZpZ2F0aW9uUmVzdHJpY3Rpb24gVGhlIG5hdmlnYXRpb24gcmVzdHJpY3Rpb24gdG8gYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBwYXJlbnROYXZpZ2F0aW9uUGF0aCBUaGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aCwgc3BlY2lmaWMgZm9yIGNvbnRhaW5tZW50IHNjZW5hcmlvIHRvIGdldCB0aGUgY29ycmVjdCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsUHJvcGVydGllc09mTmF2aWdhdGlvblByb3BlcnR5KFxuXHRuYXZpZ2F0aW9uUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSxcblx0bmF2aWdhdGlvblJlc3RyaWN0aW9uPzogTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb24sXG5cdHBhcmVudE5hdmlnYXRpb25QYXRoPzogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG5cdGlmIChwYXJlbnROYXZpZ2F0aW9uUGF0aCkge1xuXHRcdC8vIGZvciBjb250YWlubWVudCBzY2VuYXJpbyBvbmx5XG5cdFx0aWYgKG5hdmlnYXRpb25SZXN0cmljdGlvbj8uTmF2aWdhdGlvblByb3BlcnR5Py52YWx1ZSAhPT0gbmF2aWdhdGlvblByb3BlcnR5Lm5hbWUpIHtcblx0XHRcdC8vIGluIGNhc2UgdGhlIHRhcmdldCBlbnRpdHkgc2V0IGlzIGEgY2hpbGQgZW50aXR5IHNldCAoT1ApLCB3ZSBuZWVkIHRvIGdldCB0aGUgcHJvcGVydGllcyBiYXNlZCBvbiBPUCB0YXJnZXQgZW50aXR5IHNldFxuXHRcdFx0Y29uc3QgbmF2aWdhdGlvblBhdGhCYXNlZE9uUGFyZW50ID0gbmF2aWdhdGlvblJlc3RyaWN0aW9uPy5OYXZpZ2F0aW9uUHJvcGVydHk/LnZhbHVlLnJlcGxhY2UoYCR7cGFyZW50TmF2aWdhdGlvblBhdGh9L2AsIFwiXCIpO1xuXHRcdFx0cmV0dXJuIG5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gYCR7bmF2aWdhdGlvblBhdGhCYXNlZE9uUGFyZW50fS8ke3Byb3BlcnR5Lm5hbWV9YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBuYXZpZ2F0aW9uUHJvcGVydHkudGFyZ2V0VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbmF2aWdhdGlvblByb3BlcnR5LnRhcmdldFR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiBgJHtuYXZpZ2F0aW9uUHJvcGVydHkubmFtZX0vJHtwcm9wZXJ0eS5uYW1lfWApO1xuXHR9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcHJvcGVydHkgcmVzdHJpY3RlZCBiYXNlZCBvbiB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgYW5kIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGFuYWx5emVkLlxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gTm90IHByZXNlbnQgaW4gdGhlIGNhc2Ugb2YgY29udGFpbm1lbnQuXG4gKiBAcGFyYW0gcGFyZW50TmF2aWdhdGlvblBhdGggVGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGgsIHNwZWNpZmljIGZvciBjb250YWlubWVudCBzY2VuYXJpbyB0byBnZXQgdGhlIGNvcnJlY3QgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzdHJpY3RlZCBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzdHJpY3RlZFByb3BlcnR5UmVsYXRpdmVQYXRoKFxuXHRwcm9wZXJ0eTogUHJvcGVydHlQYXRoLFxuXHR0YXJnZXRFbnRpdHlTZXQ6IEVudGl0eVNldCB8IHVuZGVmaW5lZCxcblx0cGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmdcbik6IHN0cmluZyB7XG5cdGlmIChwYXJlbnROYXZpZ2F0aW9uUGF0aCAmJiBwcm9wZXJ0eS52YWx1ZS5pbmNsdWRlcyhwYXJlbnROYXZpZ2F0aW9uUGF0aCkpIHtcblx0XHQvLyBpZiB0aGUgcGFyZW50TmF2aWdhdGlvblBhdGggaXMgYXZhaWxhYmxlLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBwcm9wZXJ0eSBiZWxvbmdzIHRvIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoXG5cdFx0Ly8gd2UgbmVlZCB0byBnZXQgdGhlIHByb3BlcnR5IHBhdGggYmFzZWQgb24gdGFyZ2V0IGVudGl0eSBmb3IgdGhlIGNoaWxkIGVudGl0eSBzZXQgKE9QKVxuXHRcdHJldHVybiBwcm9wZXJ0eS52YWx1ZS5yZXBsYWNlKGAke3BhcmVudE5hdmlnYXRpb25QYXRofS9gLCBcIlwiKTtcblx0fSBlbHNlIGlmICh0YXJnZXRFbnRpdHlTZXQgJiYgcHJvcGVydHkuJHRhcmdldD8ubmFtZSkge1xuXHRcdC8vIHdlIG5lZWQgdGhlIHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgbmF2aWdhdGlvbiByZXN0cmljdGlvbiBkZWZpbml0aW9uIHdoZW4gdGhlIHRhcmdldEVudGl0eVNldCBpcyBhdmFpbGFibGUgYW5kIGl0J3Mgbm90IGEgY29udGFpbm1lbnQgc2NlbmFyaW9cblx0XHRyZXR1cm4gcHJvcGVydHkuJHRhcmdldD8ubmFtZTtcblx0fSBlbHNlIHtcblx0XHQvLyBsZWF2ZSB0aGUgcHJvcGVydHkgcGF0aCB1bmNoYW5nZWQgKGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBhbm5vdGF0aW9uIHRhcmdldCEpXG5cdFx0cmV0dXJuIHByb3BlcnR5LnZhbHVlO1xuXHR9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZmlsdGVyIHJlc3RyaWN0aW9ucyBkaXJlY3RseSBmcm9tIHRoZSBlbnRpdHkgc2V0LlxuICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHkgc2V0IHRvIGJlIGFuYWx5emVkLlxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gTm90IHVzZWQgaW4gdGhlIGNhc2Ugb2YgY29udGFpbm1lbnQuXG4gKiBAcGFyYW0gcGFyZW50TmF2aWdhdGlvblBhdGggVGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGgsIHNwZWNpZmljIGZvciBjb250YWlubWVudCBzY2VuYXJpbyB0byBnZXQgdGhlIGNvcnJlY3QgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgbm9uLWZpbHRlcmFibGUgcHJvcGVydGllcy5cbiAqL1xuZnVuY3Rpb24gZ2V0RGlyZWN0RmlsdGVyUmVzdHJpY3Rpb25zKGVudGl0eVNldDogRW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoPzogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBmaWx0ZXJSZXN0cmljdGlvbnNPbkVudGl0eVNldDogc3RyaW5nW10gPSBbXTtcblx0aWYgKGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlclJlc3RyaWN0aW9ucz8uRmlsdGVyYWJsZSA9PT0gZmFsc2UpIHtcblx0XHQvLyBhZGQgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSBzZXQgdG8gdGhlIG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXG5cdFx0ZmlsdGVyUmVzdHJpY3Rpb25zT25FbnRpdHlTZXQucHVzaCguLi5lbnRpdHlTZXQuZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpKTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCBub25GaWx0ZXJhYmxlUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5GaWx0ZXJSZXN0cmljdGlvbnM/Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzPy5mb3JFYWNoKChwcm9wZXJ0eVBhdGgpID0+IHtcblx0XHRcdGlmIChwYXJlbnROYXZpZ2F0aW9uUGF0aCAmJiAhcHJvcGVydHlQYXRoLnZhbHVlLmluY2x1ZGVzKHBhcmVudE5hdmlnYXRpb25QYXRoKSkge1xuXHRcdFx0XHQvLyBza2lwIHRoZSBub24gZmlsdGVyYWJsZSBwcm9wZXJ0eSBpZiBpdCBkb2Vzbid0IGJlbG9uZyB0byB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aCBpbiBjYXNlIG9mIGNvbnRhaW5tZW50XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLnB1c2goZ2V0UmVzdHJpY3RlZFByb3BlcnR5UmVsYXRpdmVQYXRoKHByb3BlcnR5UGF0aCwgdGFyZ2V0RW50aXR5U2V0LCBwYXJlbnROYXZpZ2F0aW9uUGF0aCkpO1xuXHRcdH0pO1xuXHRcdGlmIChub25GaWx0ZXJhYmxlUHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0XHRmaWx0ZXJSZXN0cmljdGlvbnNPbkVudGl0eVNldC5wdXNoKC4uLm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZpbHRlclJlc3RyaWN0aW9uc09uRW50aXR5U2V0O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0VBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNQSx3Q0FBd0MsR0FBRyxTQUFBQSxDQUNoREMsU0FBb0IsRUFDcEJDLGVBQTJCLEVBQzNCQyxvQkFBNkIsRUFDRjtJQUMzQixNQUFNQyxzQ0FBc0MsR0FBRztNQUM5Q0MscUJBQXFCLEVBQUVDLDZDQUE2QyxDQUFDTCxTQUFTLEVB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b0JBQW9CLElBQUl3QyxRQUFRLENBQUNWLEtBQUssQ0FBQ2lCLFFBQVEsQ0FBQy9DLG9CQUFvQixDQUFDLEVBQUU7TUFDMUU7TUFDQTtNQUNBLE9BQU93QyxRQUFRLENBQUNWLEtBQUssQ0FBQ3dCLE9BQU8sQ0FBQyxHQUFHdEQsb0JBQW9CLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDOUQsQ0FBQyxNQUFNLElBQUlELGVBQWUsSUFBSXlDLFFBQVEsQ0FBQ04sT0FBTyxFQUFFWSxJQUFJLEVBQUU7TUFDckQ7TUFDQSxPQUFPTixRQUFRLENBQUNOLE9BQU8sRUFBRVksSUFBSTtJQUM5QixDQUFDLE1BQU07TUFDTjtNQUNBLE9BQU9OLFFBQVEsQ0FBQ1YsS0FBSztJQUN0QjtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU3RCLDJCQUEyQkEsQ0FBQ1YsU0FBb0IsRUFBRUMsZUFBMkIsRUFBRUMsb0JBQTZCLEVBQVk7SUFDaEksTUFBTXdELDZCQUF1QyxHQUFHLEVBQUU7SUFDbEQsSUFBSTFELFNBQVMsQ0FBQ3lCLFdBQVcsQ0FBQ0MsWUFBWSxFQUFFeUIsa0JBQWtCLEVBQUVDLFVBQVUsS0FBSyxLQUFLLEVBQUU7TUFDakY7TUFDQU0sNkJBQTZCLENBQUNyQixJQUFJLENBQUMsR0FBR3JDLFNBQVMsQ0FBQzhDLFVBQVUsQ0FBQ0MsZ0JBQWdCLENBQUNOLEdBQUcsQ0FBRUMsUUFBUSxJQUFLQSxRQUFRLENBQUNNLElBQUksQ0FBQyxDQUFDO0lBQzlHLENBQUMsTUFBTTtNQUNOLE1BQU0xQyx1QkFBaUMsR0FBRyxFQUFFO01BQzVDTixTQUFTLENBQUN5QixXQUFXLENBQUNDLFlBQVksRUFBRXlCLGtCQUFrQixFQUFFRyx1QkFBdUIsRUFBRXpCLE9BQU8sQ0FBRThCLFlBQVksSUFBSztRQUMxRyxJQUFJekQsb0JBQW9CLElBQUksQ0FBQ3lELFlBQVksQ0FBQzNCLEtBQUssQ0FBQ2lCLFFBQVEsQ0FBQy9DLG9CQUFvQixDQUFDLEVBQUU7VUFDL0U7VUFDQTtRQUNEO1FBQ0FJLHVCQUF1QixDQUFDK0IsSUFBSSxDQUFDTSxpQ0FBaUMsQ0FBQ2dCLFlBQVksRUFBRTFELGVBQWUsRUFBRUMsb0JBQW9CLENBQUMsQ0FBQztNQUNySCxDQUFDLENBQUM7TUFDRixJQUFJSSx1QkFBdUIsRUFBRXNDLE1BQU0sRUFBRTtRQUNwQ2MsNkJBQTZCLENBQUNyQixJQUFJLENBQUMsR0FBRy9CLHVCQUF1QixDQUFDO01BQy9EO0lBQ0Q7SUFDQSxPQUFPb0QsNkJBQTZCO0VBQ3JDO0VBQUMsT0FBQW5DLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==