@sapui5/sap.fe.core 1.121.2 → 1.123.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 (241) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +2 -2
  4. package/src/sap/fe/core/ActionRuntime.ts +1 -2
  5. package/src/sap/fe/core/CommonUtils.js +14 -171
  6. package/src/sap/fe/core/CommonUtils.ts +15 -221
  7. package/src/sap/fe/core/PageController.js +13 -1
  8. package/src/sap/fe/core/PageController.ts +16 -0
  9. package/src/sap/fe/core/TemplateComponent.js +6 -1
  10. package/src/sap/fe/core/TemplateComponent.ts +8 -0
  11. package/src/sap/fe/core/UIProvider.js +23 -0
  12. package/src/sap/fe/core/UIProvider.ts +38 -0
  13. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +97 -43
  14. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +120 -50
  15. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +6 -3
  16. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +12 -18
  17. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +2 -2
  18. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +1 -1
  19. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -3
  21. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +1 -1
  22. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +1 -0
  23. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +42 -1
  24. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +40 -0
  25. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +5 -2
  26. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +5 -3
  27. package/src/sap/fe/core/controllerextensions/EditFlow.js +151 -60
  28. package/src/sap/fe/core/controllerextensions/EditFlow.ts +165 -68
  29. package/src/sap/fe/core/controllerextensions/HookSupport.js +32 -14
  30. package/src/sap/fe/core/controllerextensions/HookSupport.ts +35 -14
  31. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +5 -17
  32. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +0 -12
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +6 -6
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +15 -10
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +108 -287
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +117 -309
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -2
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +6 -2
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +1 -1
  41. package/src/sap/fe/core/controllerextensions/PageReady.js +6 -6
  42. package/src/sap/fe/core/controllerextensions/PageReady.ts +5 -4
  43. package/src/sap/fe/core/controllerextensions/Paginator.js +17 -110
  44. package/src/sap/fe/core/controllerextensions/Paginator.ts +13 -130
  45. package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -3
  46. package/src/sap/fe/core/controllerextensions/Placeholder.ts +1 -2
  47. package/src/sap/fe/core/controllerextensions/Recommendations.js +36 -31
  48. package/src/sap/fe/core/controllerextensions/Recommendations.ts +32 -37
  49. package/src/sap/fe/core/controllerextensions/Share.js +7 -7
  50. package/src/sap/fe/core/controllerextensions/Share.ts +6 -6
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +52 -6
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -4
  53. package/src/sap/fe/core/controllerextensions/ViewState.js +32 -46
  54. package/src/sap/fe/core/controllerextensions/ViewState.ts +24 -31
  55. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +42 -31
  56. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +6 -0
  57. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +168 -276
  58. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +182 -310
  59. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +3 -3
  60. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +2 -2
  61. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +4 -3
  62. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +3 -2
  63. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +74 -52
  64. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +95 -55
  65. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +3 -17
  66. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +10 -23
  67. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +3 -3
  68. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.ts +2 -2
  69. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +225 -0
  70. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.ts +241 -0
  71. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +69 -48
  72. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +56 -33
  73. package/src/sap/fe/core/controls/FormElementWrapper.js +8 -11
  74. package/src/sap/fe/core/controls/FormElementWrapper.ts +9 -0
  75. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +6 -14
  76. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +12 -23
  77. package/src/sap/fe/core/converters/ConverterContext.js +17 -9
  78. package/src/sap/fe/core/converters/ConverterContext.ts +55 -41
  79. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  80. package/src/sap/fe/core/converters/ManifestSettings.ts +19 -5
  81. package/src/sap/fe/core/converters/ManifestWrapper.js +14 -4
  82. package/src/sap/fe/core/converters/ManifestWrapper.ts +21 -10
  83. package/src/sap/fe/core/converters/MetaModelConverter.js +402 -383
  84. package/src/sap/fe/core/converters/MetaModelConverter.ts +538 -338
  85. package/src/sap/fe/core/converters/TemplateConverter.js +4 -2
  86. package/src/sap/fe/core/converters/TemplateConverter.ts +18 -13
  87. package/src/sap/fe/core/converters/annotations/DataField.js +30 -28
  88. package/src/sap/fe/core/converters/annotations/DataField.ts +58 -35
  89. package/src/sap/fe/core/converters/common/AnnotationConverter.js +24 -23
  90. package/src/sap/fe/core/converters/controls/Common/Action.js +5 -4
  91. package/src/sap/fe/core/converters/controls/Common/Action.ts +34 -28
  92. package/src/sap/fe/core/converters/controls/Common/Chart.js +37 -33
  93. package/src/sap/fe/core/converters/controls/Common/Chart.ts +64 -46
  94. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +15 -4
  95. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +31 -15
  96. package/src/sap/fe/core/converters/controls/Common/Form.js +6 -4
  97. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -11
  98. package/src/sap/fe/core/converters/controls/Common/KPI.js +5 -3
  99. package/src/sap/fe/core/converters/controls/Common/KPI.ts +17 -11
  100. package/src/sap/fe/core/converters/controls/Common/Table.js +197 -101
  101. package/src/sap/fe/core/converters/controls/Common/Table.ts +393 -182
  102. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +4 -5
  103. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +38 -27
  104. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +41 -11
  105. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +112 -45
  106. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +7 -7
  107. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +18 -12
  108. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  109. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +5 -4
  110. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
  111. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +19 -9
  112. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +64 -63
  113. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +109 -100
  114. package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -11
  115. package/src/sap/fe/core/converters/helpers/Aggregation.ts +35 -30
  116. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -1
  117. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +12 -9
  118. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -1
  119. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +1 -1
  120. package/src/sap/fe/core/converters/helpers/ID.js +1 -1
  121. package/src/sap/fe/core/converters/helpers/ID.ts +6 -6
  122. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +3 -3
  123. package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +11 -6
  124. package/src/sap/fe/core/converters/helpers/Key.js +2 -2
  125. package/src/sap/fe/core/converters/helpers/Key.ts +4 -4
  126. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  127. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +2 -2
  128. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +21 -19
  129. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +43 -31
  130. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
  131. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +16 -12
  132. package/src/sap/fe/core/converters/templates/ListReportConverter.js +8 -3
  133. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +41 -21
  134. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +5 -3
  135. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +24 -19
  136. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
  137. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +2 -1
  138. package/src/sap/fe/core/filter/DraftEditState.fragment.xml +1 -1
  139. package/src/sap/fe/core/formatters/CollaborationFormatter.js +4 -6
  140. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +5 -4
  141. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -13
  142. package/src/sap/fe/core/formatters/FPMFormatter.ts +11 -10
  143. package/src/sap/fe/core/formatters/FiscalFormat.js +1 -1
  144. package/src/sap/fe/core/formatters/FiscalFormat.ts +1 -1
  145. package/src/sap/fe/core/formatters/KPIFormatter.js +4 -7
  146. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -3
  147. package/src/sap/fe/core/formatters/StandardFormatter.js +4 -7
  148. package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -3
  149. package/src/sap/fe/core/formatters/ValueFormatter.js +35 -6
  150. package/src/sap/fe/core/formatters/ValueFormatter.ts +31 -3
  151. package/src/sap/fe/core/fpm/manifest.json +1 -1
  152. package/src/sap/fe/core/helpers/AppStartupHelper.js +54 -33
  153. package/src/sap/fe/core/helpers/AppStartupHelper.ts +62 -41
  154. package/src/sap/fe/core/helpers/BindingToolkit.js +17 -3
  155. package/src/sap/fe/core/helpers/BindingToolkit.ts +28 -6
  156. package/src/sap/fe/core/helpers/ClassSupport.js +32 -13
  157. package/src/sap/fe/core/helpers/ClassSupport.ts +35 -15
  158. package/src/sap/fe/core/helpers/DeleteHelper.js +71 -61
  159. package/src/sap/fe/core/helpers/DeleteHelper.ts +125 -103
  160. package/src/sap/fe/core/helpers/DraftEditState.js +5 -3
  161. package/src/sap/fe/core/helpers/DraftEditState.ts +3 -1
  162. package/src/sap/fe/core/helpers/FPMHelper.js +43 -46
  163. package/src/sap/fe/core/helpers/FPMHelper.ts +50 -56
  164. package/src/sap/fe/core/helpers/MetaModelFunction.js +77 -53
  165. package/src/sap/fe/core/helpers/MetaModelFunction.ts +78 -57
  166. package/src/sap/fe/core/helpers/ModelHelper.js +10 -4
  167. package/src/sap/fe/core/helpers/ModelHelper.ts +12 -6
  168. package/src/sap/fe/core/helpers/PasteHelper.js +194 -7
  169. package/src/sap/fe/core/helpers/PasteHelper.ts +265 -13
  170. package/src/sap/fe/core/helpers/PromiseKeeper.js +66 -0
  171. package/src/sap/fe/core/helpers/PromiseKeeper.ts +56 -0
  172. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +30 -19
  173. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +34 -22
  174. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  175. package/src/sap/fe/core/helpers/StableIdHelper.ts +7 -2
  176. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +26 -52
  177. package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +37 -63
  178. package/src/sap/fe/core/helpers/TitleHelper.js +1 -1
  179. package/src/sap/fe/core/helpers/TitleHelper.ts +17 -14
  180. package/src/sap/fe/core/helpers/TypeGuards.js +27 -3
  181. package/src/sap/fe/core/helpers/TypeGuards.ts +37 -7
  182. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +48 -8
  183. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +40 -9
  184. package/src/sap/fe/core/library.js +1 -1
  185. package/src/sap/fe/core/messagebundle.properties +5 -2
  186. package/src/sap/fe/core/messagebundle_da.properties +1 -1
  187. package/src/sap/fe/core/messagebundle_en.properties +267 -2
  188. package/src/sap/fe/core/messagebundle_sl.properties +1 -1
  189. package/src/sap/fe/core/operationsHelper.js +2 -1
  190. package/src/sap/fe/core/operationsHelper.ts +1 -0
  191. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +3 -3
  192. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +2 -2
  193. package/src/sap/fe/core/services/NavigationServiceFactory.js +2 -2
  194. package/src/sap/fe/core/services/NavigationServiceFactory.ts +3 -2
  195. package/src/sap/fe/core/services/RoutingServiceFactory.js +27 -14
  196. package/src/sap/fe/core/services/RoutingServiceFactory.ts +27 -14
  197. package/src/sap/fe/core/services/ShellServicesFactory.js +49 -12
  198. package/src/sap/fe/core/services/ShellServicesFactory.ts +62 -13
  199. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +156 -82
  200. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +218 -100
  201. package/src/sap/fe/core/services/TelemetryServiceFactory.js +3 -3
  202. package/src/sap/fe/core/services/TelemetryServiceFactory.ts +6 -6
  203. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +3 -2
  204. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +1 -1
  205. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +1 -1
  206. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +2 -2
  207. package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
  208. package/src/sap/fe/core/templating/CommonFormatters.js +6 -3
  209. package/src/sap/fe/core/templating/CommonFormatters.ts +13 -12
  210. package/src/sap/fe/core/templating/CriticalityFormatters.js +2 -2
  211. package/src/sap/fe/core/templating/CriticalityFormatters.ts +37 -14
  212. package/src/sap/fe/core/templating/DataFieldFormatters.js +12 -11
  213. package/src/sap/fe/core/templating/DataFieldFormatters.ts +35 -24
  214. package/src/sap/fe/core/templating/DataModelPathHelper.js +22 -18
  215. package/src/sap/fe/core/templating/DataModelPathHelper.ts +61 -51
  216. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  217. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +8 -3
  218. package/src/sap/fe/core/templating/EntityTypeHelper.js +1 -1
  219. package/src/sap/fe/core/templating/EntityTypeHelper.ts +1 -1
  220. package/src/sap/fe/core/templating/FieldControlHelper.js +3 -3
  221. package/src/sap/fe/core/templating/FieldControlHelper.ts +27 -8
  222. package/src/sap/fe/core/templating/FilterHelper.js +13 -10
  223. package/src/sap/fe/core/templating/FilterHelper.ts +80 -46
  224. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  225. package/src/sap/fe/core/templating/FilterTemplating.ts +2 -2
  226. package/src/sap/fe/core/templating/PropertyFormatters.js +6 -8
  227. package/src/sap/fe/core/templating/PropertyFormatters.ts +11 -11
  228. package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
  229. package/src/sap/fe/core/templating/PropertyHelper.ts +4 -4
  230. package/src/sap/fe/core/templating/SemanticObjectHelper.js +157 -13
  231. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +182 -16
  232. package/src/sap/fe/core/templating/UIFormatters.js +23 -22
  233. package/src/sap/fe/core/templating/UIFormatters.ts +94 -66
  234. package/src/sap/fe/core/type/DateTimeWithTimezone.js +1 -1
  235. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -2
  236. package/src/sap/fe/core/type/EDM.js +1 -1
  237. package/src/sap/fe/core/type/EDM.ts +2 -2
  238. package/src/sap/fe/core/type/Email.js +1 -1
  239. package/src/sap/fe/core/type/Email.ts +1 -1
  240. package/src/sap/fe/core/type/FiscalDate.js +2 -2
  241. package/src/sap/fe/core/type/FiscalDate.ts +2 -2
@@ -13,6 +13,7 @@ import type {
13
13
  import { UIAnnotationTerms, UIAnnotationTypes } from "@sap-ux/vocabularies-types/vocabularies/UI";
14
14
  import Log from "sap/base/Log";
15
15
  import type { NavigationParameters } from "sap/fe/core/controllerextensions/InternalIntentBasedNavigation";
16
+ import type { PageContextPathTarget } from "sap/fe/core/converters/TemplateConverter";
16
17
  import type {
17
18
  AnnotationAction,
18
19
  BaseAction,
@@ -56,7 +57,7 @@ import {
56
57
  } from "sap/fe/core/helpers/BindingToolkit";
57
58
  import { isPathAnnotationExpression } from "sap/fe/core/helpers/TypeGuards";
58
59
  import type ConverterContext from "../../ConverterContext";
59
- import type { ManifestAction, ManifestSubSection } from "../../ManifestSettings";
60
+ import type { FormManifestConfiguration, ManifestAction, ManifestSubSection } from "../../ManifestSettings";
60
61
  import { ActionType } from "../../ManifestSettings";
61
62
  import { isActionWithDialog } from "../../annotations/DataField";
62
63
  import type { ConfigurableObject, ConfigurableRecord, CustomElement } from "../../helpers/ConfigurableObject";
@@ -189,7 +190,7 @@ const visualizationTerms: string[] = [
189
190
  */
190
191
  export function createSubSections(
191
192
  facetCollection: FacetTypes[],
192
- converterContext: ConverterContext,
193
+ converterContext: ConverterContext<PageContextPathTarget>,
193
194
  isHeaderSection?: boolean
194
195
  ): ObjectPageSubSection[] {
195
196
  // First we determine which sub section we need to create
@@ -226,7 +227,7 @@ export function createSubSections(
226
227
  * @param converterContext The converter context
227
228
  * @returns The current subsections
228
229
  */
229
- export function createCustomHeaderFacetSubSections(converterContext: ConverterContext): ObjectPageSubSection[] {
230
+ export function createCustomHeaderFacetSubSections(converterContext: ConverterContext<PageContextPathTarget>): ObjectPageSubSection[] {
230
231
  const customHeaderFacets: Record<string, CustomObjectPageHeaderFacet> = getHeaderFacetsFromManifest(
231
232
  converterContext.getManifestWrapper().getHeaderFacets()
232
233
  );
@@ -281,7 +282,11 @@ const getSubSectionKey = (facetDefinition: FacetTypes, fallback: string): string
281
282
  * @param converterContext The converter context
282
283
  * @returns The form menu actions
283
284
  */
284
- function addFormMenuActions(actions: BaseAction[], facetDefinition: FacetTypes, converterContext: ConverterContext): CombinedAction {
285
+ function addFormMenuActions(
286
+ actions: BaseAction[],
287
+ facetDefinition: FacetTypes,
288
+ converterContext: ConverterContext<PageContextPathTarget>
289
+ ): CombinedAction {
285
290
  const hiddenActions: BaseAction[] = getFormHiddenActions(facetDefinition, converterContext) || [],
286
291
  formActions: ConfigurableRecord<ManifestAction> = getFormActions(facetDefinition, converterContext),
287
292
  manifestActions = getActionsFromManifest(formActions, converterContext, actions, undefined, undefined, hiddenActions),
@@ -305,7 +310,7 @@ function addFormMenuActions(actions: BaseAction[], facetDefinition: FacetTypes,
305
310
  * @param converterContext
306
311
  * @returns The current facet actions
307
312
  */
308
- function getFacetActions(facetDefinition: FacetTypes, converterContext: ConverterContext): CombinedAction {
313
+ function getFacetActions(facetDefinition: FacetTypes, converterContext: ConverterContext<PageContextPathTarget>): CombinedAction {
309
314
  let actions: BaseAction[] = [];
310
315
  switch (facetDefinition.$Type) {
311
316
  case UIAnnotationTypes.CollectionFacet:
@@ -350,7 +355,7 @@ function getButtonType(emphasized: Emphasized | undefined): ButtonType {
350
355
  export function createSubSection(
351
356
  facetDefinition: FacetTypes,
352
357
  facetsToCreate: FacetTypes[],
353
- converterContext: ConverterContext,
358
+ converterContext: ConverterContext<PageContextPathTarget>,
354
359
  level: number,
355
360
  hasSingleContent: boolean,
356
361
  isHeaderSection?: boolean
@@ -573,7 +578,7 @@ export function getShowSubSectionTitle(
573
578
  function createFormActionReducer(
574
579
  actions: BaseAction[],
575
580
  facetDefinition: ReferenceFacetTypes,
576
- converterContext: ConverterContext
581
+ converterContext: ConverterContext<PageContextPathTarget>
577
582
  ): BaseAction[] {
578
583
  const referenceTarget = facetDefinition.Target.$target;
579
584
  const targetValue = facetDefinition.Target.value;
@@ -594,7 +599,9 @@ function createFormActionReducer(
594
599
  case UIAnnotationTerms.FieldGroup:
595
600
  dataFieldCollection = (referenceTarget as FieldGroup).Data;
596
601
  manifestActions = getActionsFromManifest(
597
- converterContext.getManifestControlConfiguration(referenceTarget).actions,
602
+ converterContext.getManifestControlConfiguration<FormManifestConfiguration>(referenceTarget).actions as
603
+ | Record<string, ManifestAction>
604
+ | undefined,
598
605
  converterContext,
599
606
  undefined,
600
607
  undefined,
@@ -612,97 +619,99 @@ function createFormActionReducer(
612
619
  default:
613
620
  break;
614
621
  }
622
+ actions = dataFieldCollection.reduce((actionReducer, dataField: DataFieldAbstractTypes) => {
623
+ switch (dataField.$Type) {
624
+ case UIAnnotationTypes.DataFieldForIntentBasedNavigation:
625
+ if (dataField.RequiresContext?.valueOf() === true) {
626
+ converterContext
627
+ .getDiagnostics()
628
+ .addIssue(IssueCategory.Annotation, IssueSeverity.Low, IssueType.MALFORMED_DATAFIELD_FOR_IBN.REQUIRESCONTEXT);
629
+ }
630
+ if (dataField.Inline?.valueOf() === true) {
631
+ converterContext
632
+ .getDiagnostics()
633
+ .addIssue(IssueCategory.Annotation, IssueSeverity.Low, IssueType.MALFORMED_DATAFIELD_FOR_IBN.INLINE);
634
+ }
635
+ if (dataField.Determining?.valueOf() === true) {
636
+ converterContext
637
+ .getDiagnostics()
638
+ .addIssue(IssueCategory.Annotation, IssueSeverity.Low, IssueType.MALFORMED_DATAFIELD_FOR_IBN.DETERMINING);
639
+ }
640
+ const mNavigationParameters: NavigationParameters = {};
641
+ if (dataField.Mapping) {
642
+ mNavigationParameters.semanticObjectMapping = getSemanticObjectMapping(dataField.Mapping);
643
+ }
644
+ actionReducer.push({
645
+ type: ActionType.DataFieldForIntentBasedNavigation,
646
+ id: getFormID(facetDefinition, dataField),
647
+ key: KeyHelper.generateKeyFromDataField(dataField),
648
+ text: dataField.Label?.toString(),
649
+ annotationPath: "",
650
+ enabled:
651
+ dataField.NavigationAvailable !== undefined
652
+ ? compileExpression(equal(getExpressionFromAnnotation(dataField.NavigationAvailable), true))
653
+ : "true",
654
+ visible: compileExpression(not(equal(getExpressionFromAnnotation(dataField.annotations?.UI?.Hidden), true))),
655
+ buttonType: getButtonType(dataField.annotations?.UI?.Emphasized),
656
+ press: compileExpression(
657
+ fn("._intentBasedNavigation.navigate", [
658
+ getExpressionFromAnnotation(dataField.SemanticObject),
659
+ getExpressionFromAnnotation(dataField.Action),
660
+ mNavigationParameters
661
+ ])
662
+ ),
663
+ customData: compileExpression({
664
+ semanticObject: getExpressionFromAnnotation(dataField.SemanticObject),
665
+ action: getExpressionFromAnnotation(dataField.Action)
666
+ })
667
+ } as AnnotationAction);
668
+ break;
669
+ case UIAnnotationTypes.DataFieldForAction:
670
+ const formManifestActionsConfiguration =
671
+ converterContext.getManifestControlConfiguration<FormManifestConfiguration>(referenceTarget).actions;
672
+ const key: string = KeyHelper.generateKeyFromDataField(dataField);
673
+ actionReducer.push({
674
+ type: ActionType.DataFieldForAction,
675
+ id: getFormID(facetDefinition, dataField),
676
+ key: key,
677
+ text: dataField.Label?.toString(),
678
+ annotationPath: "",
679
+ enabled: getEnabledForAnnotationAction(converterContext, dataField.ActionTarget),
680
+ binding: navigationPropertyPath ? `{ 'path' : '${navigationPropertyPath}'}` : undefined,
681
+ visible: compileExpression(not(equal(getExpressionFromAnnotation(dataField.annotations?.UI?.Hidden), true))),
682
+ requiresDialog: isActionWithDialog(dataField),
683
+ buttonType: getButtonType(dataField.annotations?.UI?.Emphasized),
684
+ press: compileExpression(
685
+ fn(
686
+ "invokeAction",
687
+ [
688
+ dataField.Action,
689
+ {
690
+ contexts: fn("getBindingContext", [], pathInModel("", "$source")),
691
+ invocationGrouping: (dataField.InvocationGrouping === "UI.OperationGroupingType/ChangeSet"
692
+ ? "ChangeSet"
693
+ : "Isolated") as OperationGroupingType,
694
+ label: dataField.Label?.toString(),
695
+ model: fn("getModel", [], pathInModel("/", "$source")),
696
+ isNavigable: isActionNavigable(
697
+ formManifestActionsConfiguration &&
698
+ (formManifestActionsConfiguration as Record<string, ManifestAction>)[key]
699
+ )
700
+ }
701
+ ],
702
+ ref(".editFlow")
703
+ )
704
+ ),
705
+ facetName: dataField.Inline ? facetDefinition.fullyQualifiedName : undefined
706
+ } as AnnotationAction);
707
+ break;
708
+ default:
709
+ break;
710
+ }
711
+ return actionReducer;
712
+ }, actions);
615
713
  }
616
714
 
617
- actions = dataFieldCollection.reduce((actionReducer, dataField: DataFieldAbstractTypes) => {
618
- switch (dataField.$Type) {
619
- case UIAnnotationTypes.DataFieldForIntentBasedNavigation:
620
- if (dataField.RequiresContext?.valueOf() === true) {
621
- converterContext
622
- .getDiagnostics()
623
- .addIssue(IssueCategory.Annotation, IssueSeverity.Low, IssueType.MALFORMED_DATAFIELD_FOR_IBN.REQUIRESCONTEXT);
624
- }
625
- if (dataField.Inline?.valueOf() === true) {
626
- converterContext
627
- .getDiagnostics()
628
- .addIssue(IssueCategory.Annotation, IssueSeverity.Low, IssueType.MALFORMED_DATAFIELD_FOR_IBN.INLINE);
629
- }
630
- if (dataField.Determining?.valueOf() === true) {
631
- converterContext
632
- .getDiagnostics()
633
- .addIssue(IssueCategory.Annotation, IssueSeverity.Low, IssueType.MALFORMED_DATAFIELD_FOR_IBN.DETERMINING);
634
- }
635
- const mNavigationParameters: NavigationParameters = {};
636
- if (dataField.Mapping) {
637
- mNavigationParameters.semanticObjectMapping = getSemanticObjectMapping(dataField.Mapping);
638
- }
639
- actionReducer.push({
640
- type: ActionType.DataFieldForIntentBasedNavigation,
641
- id: getFormID(facetDefinition, dataField),
642
- key: KeyHelper.generateKeyFromDataField(dataField),
643
- text: dataField.Label?.toString(),
644
- annotationPath: "",
645
- enabled:
646
- dataField.NavigationAvailable !== undefined
647
- ? compileExpression(equal(getExpressionFromAnnotation(dataField.NavigationAvailable), true))
648
- : "true",
649
- visible: compileExpression(not(equal(getExpressionFromAnnotation(dataField.annotations?.UI?.Hidden), true))),
650
- buttonType: getButtonType(dataField.annotations?.UI?.Emphasized),
651
- press: compileExpression(
652
- fn("._intentBasedNavigation.navigate", [
653
- getExpressionFromAnnotation(dataField.SemanticObject),
654
- getExpressionFromAnnotation(dataField.Action),
655
- mNavigationParameters
656
- ])
657
- ),
658
- customData: compileExpression({
659
- semanticObject: getExpressionFromAnnotation(dataField.SemanticObject),
660
- action: getExpressionFromAnnotation(dataField.Action)
661
- })
662
- } as AnnotationAction);
663
- break;
664
- case UIAnnotationTypes.DataFieldForAction:
665
- const formManifestActionsConfiguration = converterContext.getManifestControlConfiguration(referenceTarget).actions;
666
- const key: string = KeyHelper.generateKeyFromDataField(dataField);
667
- actionReducer.push({
668
- type: ActionType.DataFieldForAction,
669
- id: getFormID(facetDefinition, dataField),
670
- key: key,
671
- text: dataField.Label?.toString(),
672
- annotationPath: "",
673
- enabled: getEnabledForAnnotationAction(converterContext, dataField.ActionTarget),
674
- binding: navigationPropertyPath ? `{ 'path' : '${navigationPropertyPath}'}` : undefined,
675
- visible: compileExpression(not(equal(getExpressionFromAnnotation(dataField.annotations?.UI?.Hidden), true))),
676
- requiresDialog: isActionWithDialog(dataField),
677
- buttonType: getButtonType(dataField.annotations?.UI?.Emphasized),
678
- press: compileExpression(
679
- fn(
680
- "invokeAction",
681
- [
682
- dataField.Action,
683
- {
684
- contexts: fn("getBindingContext", [], pathInModel("", "$source")),
685
- invocationGrouping: (dataField.InvocationGrouping === "UI.OperationGroupingType/ChangeSet"
686
- ? "ChangeSet"
687
- : "Isolated") as OperationGroupingType,
688
- label: dataField.Label?.toString(),
689
- model: fn("getModel", [], pathInModel("/", "$source")),
690
- isNavigable: isActionNavigable(
691
- formManifestActionsConfiguration && formManifestActionsConfiguration[key]
692
- )
693
- }
694
- ],
695
- ref(".editFlow")
696
- )
697
- ),
698
- facetName: dataField.Inline ? facetDefinition.fullyQualifiedName : undefined
699
- } as AnnotationAction);
700
- break;
701
- default:
702
- break;
703
- }
704
- return actionReducer;
705
- }, actions);
706
715
  // Overwriting of actions happens in addFormMenuActions
707
716
  return insertCustomElements(actions, manifestActions);
708
717
  }
@@ -722,7 +731,7 @@ export function isDialog(actionDefinition: Action | undefined): string {
722
731
 
723
732
  export function createCustomSubSections(
724
733
  manifestSubSections: Record<string, ManifestSubSection>,
725
- converterContext: ConverterContext
734
+ converterContext: ConverterContext<PageContextPathTarget>
726
735
  ): Record<string, CustomObjectPageSubSection> {
727
736
  const subSections: Record<string, CustomObjectPageSubSection> = {};
728
737
  Object.keys(manifestSubSections).forEach(
@@ -735,7 +744,7 @@ export function createCustomSubSections(
735
744
  export function createCustomSubSection(
736
745
  manifestSubSection: ManifestSubSection,
737
746
  subSectionKey: string,
738
- converterContext: ConverterContext
747
+ converterContext: ConverterContext<PageContextPathTarget>
739
748
  ): CustomObjectPageSubSection {
740
749
  const sideContent: SideContentDef | undefined = manifestSubSection.sideContent
741
750
  ? {
@@ -795,7 +804,7 @@ export function createCustomSubSection(
795
804
  function getCondensedTableLayoutCompliance(
796
805
  currentFacet: FacetTypes,
797
806
  facetsToCreateInSection: FacetTypes[],
798
- converterContext: ConverterContext
807
+ converterContext: ConverterContext<PageContextPathTarget>
799
808
  ): boolean {
800
809
  const manifestWrapper = converterContext.getManifestWrapper();
801
810
  if (manifestWrapper.useIconTabBar()) {
@@ -6,6 +6,7 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards"], function (TypeGuards) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
+ var isProperty = TypeGuards.isProperty;
9
10
  var isNavigationProperty = TypeGuards.isNavigationProperty;
10
11
  var isEntityType = TypeGuards.isEntityType;
11
12
  var isEntitySet = TypeGuards.isEntitySet;
@@ -67,7 +68,7 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards"], function (TypeGuards) {
67
68
  const oDataModelObjectPath = this._converterContext.getDataModelObjectPath();
68
69
  const oNavigationPropertyObject = oDataModelObjectPath === null || oDataModelObjectPath === void 0 ? void 0 : oDataModelObjectPath.targetObject;
69
70
  const oEntityTypeObject = oDataModelObjectPath === null || oDataModelObjectPath === void 0 ? void 0 : oDataModelObjectPath.targetEntityType;
70
- if (oNavigationPropertyObject !== null && oNavigationPropertyObject !== void 0 && (_oNavigationPropertyO = oNavigationPropertyObject.annotations) !== null && _oNavigationPropertyO !== void 0 && (_oNavigationPropertyO2 = _oNavigationPropertyO.Aggregation) !== null && _oNavigationPropertyO2 !== void 0 && _oNavigationPropertyO2.ApplySupported) {
71
+ if (oNavigationPropertyObject !== null && oNavigationPropertyObject !== void 0 && (_oNavigationPropertyO = oNavigationPropertyObject.annotations) !== null && _oNavigationPropertyO !== void 0 && (_oNavigationPropertyO2 = _oNavigationPropertyO.Aggregation) !== null && _oNavigationPropertyO2 !== void 0 && _oNavigationPropertyO2.hasOwnProperty("ApplySupported")) {
71
72
  oAggregationAnnotationSource = oNavigationPropertyObject;
72
73
  } else if (oEntityTypeObject !== null && oEntityTypeObject !== void 0 && (_oEntityTypeObject$an = oEntityTypeObject.annotations) !== null && _oEntityTypeObject$an !== void 0 && (_oEntityTypeObject$an2 = _oEntityTypeObject$an.Aggregation) !== null && _oEntityTypeObject$an2 !== void 0 && _oEntityTypeObject$an2.ApplySupported) {
73
74
  oAggregationAnnotationSource = oEntityTypeObject;
@@ -144,13 +145,12 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards"], function (TypeGuards) {
144
145
  * Returns AggregatedProperties or AggregatedProperty based on param Term.
145
146
  * The Term here indicates if the AggregatedProperty should be retrieved or the deprecated AggregatedProperties.
146
147
  *
147
- * @param Term The Annotation Term
148
148
  * @returns Annotations The appropriate annotations based on the given Term.
149
149
  */;
150
- _proto.getAggregatedProperties = function getAggregatedProperties(Term) {
151
- if (Term === "AggregatedProperties") {
152
- return this._converterContext.getAnnotationsByTerm("Analytics", "com.sap.vocabularies.Analytics.v1.AggregatedProperties", [this._converterContext.getEntityContainer(), this._converterContext.getEntityType()]);
153
- }
150
+ _proto.getAggregatedProperties = function getAggregatedProperties() {
151
+ return this._converterContext.getAnnotationsByTerm("Analytics", "com.sap.vocabularies.Analytics.v1.AggregatedProperties", [this._converterContext.getEntityContainer(), this._converterContext.getEntityType()]);
152
+ };
153
+ _proto.getAggregatedProperty = function getAggregatedProperty() {
154
154
  return this._converterContext.getAnnotationsByTerm("Analytics", "com.sap.vocabularies.Analytics.v1.AggregatedProperty", [this._converterContext.getEntityContainer(), this._converterContext.getEntityType()]);
155
155
  }
156
156
 
@@ -158,9 +158,9 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards"], function (TypeGuards) {
158
158
  ;
159
159
  _proto.getTransAggregations = function getTransAggregations() {
160
160
  var _aAggregatedPropertyO;
161
- let aAggregatedPropertyObjects = this.getAggregatedProperties("AggregatedProperty");
161
+ let aAggregatedPropertyObjects = this.getAggregatedProperty();
162
162
  if (!aAggregatedPropertyObjects || aAggregatedPropertyObjects.length === 0) {
163
- aAggregatedPropertyObjects = this.getAggregatedProperties("AggregatedProperties")[0];
163
+ aAggregatedPropertyObjects = this.getAggregatedProperties()[0];
164
164
  }
165
165
  return (_aAggregatedPropertyO = aAggregatedPropertyObjects) === null || _aAggregatedPropertyO === void 0 ? void 0 : _aAggregatedPropertyO.filter(aggregatedProperty => {
166
166
  if (this._getAggregatableAggregates(aggregatedProperty.AggregatableProperty)) {
@@ -180,10 +180,11 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards"], function (TypeGuards) {
180
180
  return aAggregatableProperties.find(function (obj) {
181
181
  var _$target, _obj$Property;
182
182
  const prop = property.qualifier ? property.qualifier : (_$target = property.$target) === null || _$target === void 0 ? void 0 : _$target.name;
183
- if (obj !== null && obj !== void 0 && (_obj$Property = obj.Property) !== null && _obj$Property !== void 0 && _obj$Property.value) {
183
+ if (isProperty(obj)) {
184
+ return (obj === null || obj === void 0 ? void 0 : obj.name) === prop;
185
+ } else if (obj !== null && obj !== void 0 && (_obj$Property = obj.Property) !== null && _obj$Property !== void 0 && _obj$Property.value) {
184
186
  return obj.Property.value === prop;
185
187
  }
186
- return (obj === null || obj === void 0 ? void 0 : obj.name) === prop;
187
188
  });
188
189
  };
189
190
  _proto._getEntityProperties = function _getEntityProperties() {
@@ -225,4 +226,4 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards"], function (TypeGuards) {
225
226
  _exports.AggregationHelper = AggregationHelper;
226
227
  return _exports;
227
228
  }, false);
228
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBZ2dyZWdhdGlvbkhlbHBlciIsImVudGl0eVR5cGUiLCJjb252ZXJ0ZXJDb250ZXh0IiwiY29uc2lkZXJPbGRBbm5vdGF0aW9ucyIsIl9lbnRpdHlUeXBlIiwiX2NvbnZlcnRlckNvbnRleHQiLCJfb0FnZ3JlZ2F0aW9uQW5ub3RhdGlvblRhcmdldCIsIl9kZXRlcm1pbmVBZ2dyZWdhdGlvbkFubm90YXRpb25UYXJnZXQiLCJpc05hdmlnYXRpb25Qcm9wZXJ0eSIsImlzRW50aXR5VHlwZSIsImlzRW50aXR5U2V0Iiwib1RhcmdldEFnZ3JlZ2F0aW9uQW5ub3RhdGlvbnMiLCJhbm5vdGF0aW9ucyIsIkFnZ3JlZ2F0aW9uIiwiX2JBcHBseVN1cHBvcnRlZCIsIkFwcGx5U3VwcG9ydGVkIiwiX2FHcm91cGFibGVQcm9wZXJ0aWVzIiwiR3JvdXBhYmxlUHJvcGVydGllcyIsIl9hQWdncmVnYXRhYmxlUHJvcGVydGllcyIsIkFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMiLCJvQ29udGFpbmVyQWdncmVnYXRpb25Bbm5vdGF0aW9uIiwiZ2V0RW50aXR5Q29udGFpbmVyIiwiZW50aXR5UHJvcGVydGllcyIsIl9nZXRFbnRpdHlQcm9wZXJ0aWVzIiwiZmlsdGVyIiwicHJvcGVydHkiLCJBZ2dyZWdhdGFibGUiLCJiSXNQYXJhbWV0ZXJpemVkIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInRhcmdldEVudGl0eVNldCIsIkNvbW1vbiIsIlJlc3VsdENvbnRleHQiLCJvQWdncmVnYXRpb25Bbm5vdGF0aW9uU291cmNlIiwib0RhdGFNb2RlbE9iamVjdFBhdGgiLCJvTmF2aWdhdGlvblByb3BlcnR5T2JqZWN0IiwidGFyZ2V0T2JqZWN0Iiwib0VudGl0eVR5cGVPYmplY3QiLCJ0YXJnZXRFbnRpdHlUeXBlIiwib0VudGl0eVNldE9iamVjdCIsImdldEVudGl0eVNldCIsImdldEVudGl0eVR5cGUiLCJpc0FuYWx5dGljc1N1cHBvcnRlZCIsImlzUHJvcGVydHlHcm91cGFibGUiLCJ1bmRlZmluZWQiLCJsZW5ndGgiLCJzb21lIiwicGF0aCIsIiR0YXJnZXQiLCJpc1Byb3BlcnR5QWdncmVnYXRhYmxlIiwiYUN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zIiwiZ2V0QW5ub3RhdGlvbnNCeVRlcm0iLCJhbm5vdGF0aW9uIiwibmFtZSIsInF1YWxpZmllciIsImdldEdyb3VwYWJsZVByb3BlcnRpZXMiLCJnZXRBZ2dyZWdhdGFibGVQcm9wZXJ0aWVzIiwiZ2V0QWdncmVnYXRlZFByb3BlcnRpZXMiLCJUZXJtIiwiZ2V0VHJhbnNBZ2dyZWdhdGlvbnMiLCJhQWdncmVnYXRlZFByb3BlcnR5T2JqZWN0cyIsImFnZ3JlZ2F0ZWRQcm9wZXJ0eSIsIl9nZXRBZ2dyZWdhdGFibGVBZ2dyZWdhdGVzIiwiQWdncmVnYXRhYmxlUHJvcGVydHkiLCJhQWdncmVnYXRhYmxlUHJvcGVydGllcyIsImZpbmQiLCJvYmoiLCJwcm9wIiwiUHJvcGVydHkiLCJ2YWx1ZSIsImdldEN1c3RvbUFnZ3JlZ2F0ZURlZmluaXRpb25zIiwiZ2V0QWxsb3dlZFRyYW5zZm9ybWF0aW9ucyIsIlRyYW5zZm9ybWF0aW9ucyIsIkFwcGx5U3VwcG9ydGVkRGVmYXVsdHMiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkFnZ3JlZ2F0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQW5ub3RhdGlvblRlcm0sIEVudGl0eVNldCwgRW50aXR5VHlwZSwgTmF2aWdhdGlvblByb3BlcnR5LCBQcm9wZXJ0eSwgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFnZ3JlZ2F0YWJsZVByb3BlcnR5VHlwZSwgQXBwbHlTdXBwb3J0ZWRUeXBlLCBDdXN0b21BZ2dyZWdhdGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkFubm90YXRpb25UZXJtcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQWdncmVnYXRpb25cIjtcbmltcG9ydCB0eXBlIHtcblx0Q29sbGVjdGlvbkFubm90YXRpb25zX0FnZ3JlZ2F0aW9uLFxuXHRFbnRpdHlDb250YWluZXJBbm5vdGF0aW9uc19BZ2dyZWdhdGlvbixcblx0RW50aXR5U2V0QW5ub3RhdGlvbnNfQWdncmVnYXRpb24sXG5cdEVudGl0eVR5cGVBbm5vdGF0aW9uc19BZ2dyZWdhdGlvblxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0FnZ3JlZ2F0aW9uX0VkbVwiO1xuaW1wb3J0IHR5cGUgeyBBZ2dyZWdhdGVkUHJvcGVydHlUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9BbmFseXRpY3NcIjtcbmltcG9ydCB7IGlzRW50aXR5U2V0LCBpc0VudGl0eVR5cGUsIGlzTmF2aWdhdGlvblByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vQ29udmVydGVyQ29udGV4dFwiO1xuXG4vKipcbiAqIGhlbHBlciBjbGFzcyBmb3IgQWdncmVnYXRpb24gYW5ub3RhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBBZ2dyZWdhdGlvbkhlbHBlciB7XG5cdF9lbnRpdHlUeXBlOiBFbnRpdHlUeXBlO1xuXG5cdF9jb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0O1xuXG5cdF9iQXBwbHlTdXBwb3J0ZWQ6IGJvb2xlYW47XG5cblx0X2FHcm91cGFibGVQcm9wZXJ0aWVzPzogUHJvcGVydHlQYXRoW107XG5cblx0X2FBZ2dyZWdhdGFibGVQcm9wZXJ0aWVzPzogQWdncmVnYXRhYmxlUHJvcGVydHlUeXBlW10gfCBQcm9wZXJ0eVtdO1xuXG5cdF9vQWdncmVnYXRpb25Bbm5vdGF0aW9uVGFyZ2V0OiBFbnRpdHlUeXBlIHwgRW50aXR5U2V0IHwgTmF2aWdhdGlvblByb3BlcnR5O1xuXG5cdG9UYXJnZXRBZ2dyZWdhdGlvbkFubm90YXRpb25zPzpcblx0XHR8IENvbGxlY3Rpb25Bbm5vdGF0aW9uc19BZ2dyZWdhdGlvblxuXHRcdHwgRW50aXR5VHlwZUFubm90YXRpb25zX0FnZ3JlZ2F0aW9uXG5cdFx0fCBFbnRpdHlTZXRBbm5vdGF0aW9uc19BZ2dyZWdhdGlvbjtcblxuXHRvQ29udGFpbmVyQWdncmVnYXRpb25Bbm5vdGF0aW9uPzogRW50aXR5Q29udGFpbmVyQW5ub3RhdGlvbnNfQWdncmVnYXRpb247XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBoZWxwZXIgZm9yIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIGEgY29udmVydGVyIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBFbnRpdHlUeXBlXG5cdCAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBDb252ZXJ0ZXJDb250ZXh0XG5cdCAqIEBwYXJhbSBbY29uc2lkZXJPbGRBbm5vdGF0aW9uc10gVGhlIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdG8gY29uc2lkZXIgb2xkIGFubm90YXRpb25zXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCBjb25zaWRlck9sZEFubm90YXRpb25zID0gZmFsc2UpIHtcblx0XHQvL2NvbnNpZGVyT2xkQW5ub3RhdGlvbnMgd2lsbCBiZSB0cnVlIGFuZCBzZW50IG9ubHkgZm9yIGNoYXJ0XG5cdFx0dGhpcy5fZW50aXR5VHlwZSA9IGVudGl0eVR5cGU7XG5cdFx0dGhpcy5fY29udmVydGVyQ29udGV4dCA9IGNvbnZlcnRlckNvbnRleHQ7XG5cblx0XHR0aGlzLl9vQWdncmVnYXRpb25Bbm5vdGF0aW9uVGFyZ2V0ID0gdGhpcy5fZGV0ZXJtaW5lQWdncmVnYXRpb25Bbm5vdGF0aW9uVGFyZ2V0KCk7XG5cdFx0aWYgKFxuXHRcdFx0aXNOYXZpZ2F0aW9uUHJvcGVydHkodGhpcy5fb0FnZ3JlZ2F0aW9uQW5ub3RhdGlvblRhcmdldCkgfHxcblx0XHRcdGlzRW50aXR5VHlwZSh0aGlzLl9vQWdncmVnYXRpb25Bbm5vdGF0aW9uVGFyZ2V0KSB8fFxuXHRcdFx0aXNFbnRpdHlTZXQodGhpcy5fb0FnZ3JlZ2F0aW9uQW5ub3RhdGlvblRhcmdldClcblx0XHQpIHtcblx0XHRcdHRoaXMub1RhcmdldEFnZ3JlZ2F0aW9uQW5ub3RhdGlvbnMgPSB0aGlzLl9vQWdncmVnYXRpb25Bbm5vdGF0aW9uVGFyZ2V0LmFubm90YXRpb25zLkFnZ3JlZ2F0aW9uO1xuXHRcdH1cblx0XHR0aGlzLl9iQXBwbHlTdXBwb3J0ZWQgPSB0aGlzLm9UYXJnZXRBZ2dyZWdhdGlvbkFubm90YXRpb25zPy5BcHBseVN1cHBvcnRlZCA/IHRydWUgOiBmYWxzZTtcblxuXHRcdGlmICh0aGlzLl9iQXBwbHlTdXBwb3J0ZWQpIHtcblx0XHRcdHRoaXMuX2FHcm91cGFibGVQcm9wZXJ0aWVzID0gdGhpcy5vVGFyZ2V0QWdncmVnYXRpb25Bbm5vdGF0aW9ucz8uQXBwbHlTdXBwb3J0ZWQ/Lkdyb3VwYWJsZVByb3BlcnRpZXMgYXMgUHJvcGVydHlQYXRoW107XG5cdFx0XHR0aGlzLl9hQWdncmVnYXRhYmxlUHJvcGVydGllcyA9IHRoaXMub1RhcmdldEFnZ3JlZ2F0aW9uQW5ub3RhdGlvbnM/LkFwcGx5U3VwcG9ydGVkPy5BZ2dyZWdhdGFibGVQcm9wZXJ0aWVzO1xuXG5cdFx0XHR0aGlzLm9Db250YWluZXJBZ2dyZWdhdGlvbkFubm90YXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eUNvbnRhaW5lcigpLmFubm90YXRpb25zXG5cdFx0XHRcdC5BZ2dyZWdhdGlvbiBhcyBFbnRpdHlDb250YWluZXJBbm5vdGF0aW9uc19BZ2dyZWdhdGlvbjtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLl9hQWdncmVnYXRhYmxlUHJvcGVydGllcyAmJiBjb25zaWRlck9sZEFubm90YXRpb25zKSB7XG5cdFx0XHRjb25zdCBlbnRpdHlQcm9wZXJ0aWVzID0gdGhpcy5fZ2V0RW50aXR5UHJvcGVydGllcygpO1xuXHRcdFx0dGhpcy5fYUFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMgPSBlbnRpdHlQcm9wZXJ0aWVzPy5maWx0ZXIoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdHJldHVybiBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQWdncmVnYXRpb24/LkFnZ3JlZ2F0YWJsZTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHRhcmdldCBmb3IgdGhlIGFnZ3JlZ2F0aW9uIGFubm90YXRpb25zLlxuXHQgKlxuXHQgKiBAcmV0dXJucyAgRW50aXR5VHlwZSwgRW50aXR5U2V0IG9yIE5hdmlnYXRpb25Qcm9wZXJ0eSB3aGVyZSBhZ2dyZWdhdGlvbiBhbm5vdGF0aW9ucyBzaG91bGQgYmUgcmVhZCBmcm9tLlxuXHQgKi9cblx0cHJpdmF0ZSBfZGV0ZXJtaW5lQWdncmVnYXRpb25Bbm5vdGF0aW9uVGFyZ2V0KCk6IEVudGl0eVR5cGUgfCBFbnRpdHlTZXQgfCBOYXZpZ2F0aW9uUHJvcGVydHkge1xuXHRcdGNvbnN0IGJJc1BhcmFtZXRlcml6ZWQgPSB0aGlzLl9jb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKT8udGFyZ2V0RW50aXR5U2V0Py5lbnRpdHlUeXBlPy5hbm5vdGF0aW9ucz8uQ29tbW9uXG5cdFx0XHQ/LlJlc3VsdENvbnRleHRcblx0XHRcdD8gdHJ1ZVxuXHRcdFx0OiBmYWxzZTtcblx0XHRsZXQgb0FnZ3JlZ2F0aW9uQW5ub3RhdGlvblNvdXJjZTtcblxuXHRcdC8vIGZpbmQgQXBwbHlTdXBwb3J0ZWRcblx0XHRpZiAoYklzUGFyYW1ldGVyaXplZCkge1xuXHRcdFx0Ly8gaWYgdGhpcyBpcyBhIHBhcmFtZXRlcml6ZWQgdmlldyB0aGVuIGFwcGx5c3VwcG9ydGVkIGNhbiBiZSBmb3VuZCBhdCBlaXRoZXIgdGhlIG5hdlByb3AgcG9pbnRpbmcgdG8gdGhlIHJlc3VsdCBzZXQgb3IgZW50aXR5VHlwZS5cblx0XHRcdC8vIElmIGFwcGx5U3VwcG9ydGVkIGlzIHByZXNlbnQgYXQgYm90aCB0aGUgbmF2UHJvcCBhbmQgdGhlIGVudGl0eVR5cGUgdGhlbiBuYXZQcm9wIGlzIG1vcmUgc3BlY2lmaWMgc28gdGFrZSBhbm5vdGF0aW9ucyBmcm9tIHRoZXJlXG5cdFx0XHQvLyB0YXJnZXRPYmplY3QgaW4gdGhlIGNvbnZlcnRlciBjb250ZXh0IGZvciBhIHBhcmFtZXRlcml6ZWQgdmlldyBpcyB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBwb2ludGluZyB0byB0aCByZXN1bHQgc2V0XG5cdFx0XHRjb25zdCBvRGF0YU1vZGVsT2JqZWN0UGF0aCA9IHRoaXMuX2NvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRcdFx0Y29uc3Qgb05hdmlnYXRpb25Qcm9wZXJ0eU9iamVjdCA9IG9EYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRPYmplY3Q7XG5cdFx0XHRjb25zdCBvRW50aXR5VHlwZU9iamVjdCA9IG9EYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRFbnRpdHlUeXBlO1xuXHRcdFx0aWYgKG9OYXZpZ2F0aW9uUHJvcGVydHlPYmplY3Q/LmFubm90YXRpb25zPy5BZ2dyZWdhdGlvbj8uQXBwbHlTdXBwb3J0ZWQpIHtcblx0XHRcdFx0b0FnZ3JlZ2F0aW9uQW5ub3RhdGlvblNvdXJjZSA9IG9OYXZpZ2F0aW9uUHJvcGVydHlPYmplY3Q7XG5cdFx0XHR9IGVsc2UgaWYgKG9FbnRpdHlUeXBlT2JqZWN0Py5hbm5vdGF0aW9ucz8uQWdncmVnYXRpb24/LkFwcGx5U3VwcG9ydGVkKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGlvbkFubm90YXRpb25Tb3VyY2UgPSBvRW50aXR5VHlwZU9iamVjdDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRm9yIHRoZSB0aW1lIGJlaW5nLCB3ZSBpZ25vcmUgYW5ub3RhdGlvbnMgYXQgdGhlIGNvbnRhaW5lciBsZXZlbCwgdW50aWwgdGhlIHZvY2FidWxhcnkgaXMgc3RhYmlsaXplZFxuXHRcdFx0Y29uc3Qgb0VudGl0eVNldE9iamVjdCA9IHRoaXMuX2NvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdFx0XHRpZiAoaXNFbnRpdHlTZXQob0VudGl0eVNldE9iamVjdCkgJiYgb0VudGl0eVNldE9iamVjdC5hbm5vdGF0aW9ucy5BZ2dyZWdhdGlvbj8uQXBwbHlTdXBwb3J0ZWQpIHtcblx0XHRcdFx0b0FnZ3JlZ2F0aW9uQW5ub3RhdGlvblNvdXJjZSA9IG9FbnRpdHlTZXRPYmplY3Q7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvQWdncmVnYXRpb25Bbm5vdGF0aW9uU291cmNlID0gdGhpcy5fY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvQWdncmVnYXRpb25Bbm5vdGF0aW9uU291cmNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgZW50aXR5IHN1cHBvcnRzIGFuYWx5dGljYWwgcXVlcmllcy5cblx0ICpcblx0ICogQHJldHVybnMgYHRydWVgIGlmIGFuYWx5dGljYWwgcXVlcmllcyBhcmUgc3VwcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNBbmFseXRpY3NTdXBwb3J0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2JBcHBseVN1cHBvcnRlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBwcm9wZXJ0eSBpcyBncm91cGFibGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gY2hlY2tcblx0ICogQHJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIGVudGl0eSBkb2Vzbid0IHN1cHBvcnQgYW5hbHl0aWNhbCBxdWVyaWVzLCB0cnVlIG9yIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHVibGljIGlzUHJvcGVydHlHcm91cGFibGUocHJvcGVydHk6IFByb3BlcnR5KTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKCF0aGlzLl9iQXBwbHlTdXBwb3J0ZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIGlmICghdGhpcy5fYUdyb3VwYWJsZVByb3BlcnRpZXMgfHwgdGhpcy5fYUdyb3VwYWJsZVByb3BlcnRpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQvLyBObyBncm91cGFibGVQcm9wZXJ0aWVzIC0tPiBhbGwgcHJvcGVydGllcyBhcmUgZ3JvdXBhYmxlXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2FHcm91cGFibGVQcm9wZXJ0aWVzLnNvbWUoKHBhdGgpID0+IHBhdGguJHRhcmdldCA9PT0gcHJvcGVydHkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBwcm9wZXJ0eSBpcyBhZ2dyZWdhdGFibGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gY2hlY2tcblx0ICogQHJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIGVudGl0eSBkb2Vzbid0IHN1cHBvcnQgYW5hbHl0aWNhbCBxdWVyaWVzLCB0cnVlIG9yIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHVibGljIGlzUHJvcGVydHlBZ2dyZWdhdGFibGUocHJvcGVydHk6IFByb3BlcnR5KTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKCF0aGlzLl9iQXBwbHlTdXBwb3J0ZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEdldCB0aGUgY3VzdG9tIGFnZ3JlZ2F0ZXNcblx0XHRcdGNvbnN0IGFDdXN0b21BZ2dyZWdhdGVBbm5vdGF0aW9uczogQ3VzdG9tQWdncmVnYXRlW10gPSB0aGlzLl9jb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFxuXHRcdFx0XHRcIkFnZ3JlZ2F0aW9uXCIsXG5cdFx0XHRcdEFnZ3JlZ2F0aW9uQW5ub3RhdGlvblRlcm1zLkN1c3RvbUFnZ3JlZ2F0ZSxcblx0XHRcdFx0W3RoaXMuX29BZ2dyZWdhdGlvbkFubm90YXRpb25UYXJnZXRdXG5cdFx0XHQpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBhIGN1c3RvbSBhZ2dyZWdhdGUgaGFzIGEgcXVhbGlmaWVyIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHByb3BlcnR5IG5hbWVcblx0XHRcdHJldHVybiBhQ3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnMuc29tZSgoYW5ub3RhdGlvbikgPT4ge1xuXHRcdFx0XHRyZXR1cm4gcHJvcGVydHkubmFtZSA9PT0gYW5ub3RhdGlvbi5xdWFsaWZpZXI7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZ2V0R3JvdXBhYmxlUHJvcGVydGllcygpIHtcblx0XHRyZXR1cm4gdGhpcy5fYUdyb3VwYWJsZVByb3BlcnRpZXM7XG5cdH1cblxuXHRwdWJsaWMgZ2V0QWdncmVnYXRhYmxlUHJvcGVydGllcygpIHtcblx0XHRyZXR1cm4gdGhpcy5fYUFnZ3JlZ2F0YWJsZVByb3BlcnRpZXM7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RW50aXR5VHlwZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fZW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIEFnZ3JlZ2F0ZWRQcm9wZXJ0aWVzIG9yIEFnZ3JlZ2F0ZWRQcm9wZXJ0eSBiYXNlZCBvbiBwYXJhbSBUZXJtLlxuXHQgKiBUaGUgVGVybSBoZXJlIGluZGljYXRlcyBpZiB0aGUgQWdncmVnYXRlZFByb3BlcnR5IHNob3VsZCBiZSByZXRyaWV2ZWQgb3IgdGhlIGRlcHJlY2F0ZWQgQWdncmVnYXRlZFByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBUZXJtIFRoZSBBbm5vdGF0aW9uIFRlcm1cblx0ICogQHJldHVybnMgQW5ub3RhdGlvbnMgVGhlIGFwcHJvcHJpYXRlIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBnaXZlbiBUZXJtLlxuXHQgKi9cblx0cHVibGljIGdldEFnZ3JlZ2F0ZWRQcm9wZXJ0aWVzKFRlcm06IFN0cmluZykge1xuXHRcdGlmIChUZXJtID09PSBcIkFnZ3JlZ2F0ZWRQcm9wZXJ0aWVzXCIpIHtcblx0XHRcdHJldHVybiB0aGlzLl9jb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiQW5hbHl0aWNzXCIsIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkFnZ3JlZ2F0ZWRQcm9wZXJ0aWVzXCIsIFtcblx0XHRcdFx0dGhpcy5fY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlDb250YWluZXIoKSxcblx0XHRcdFx0dGhpcy5fY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKClcblx0XHRcdF0pO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5fY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIkFuYWx5dGljc1wiLCBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5BZ2dyZWdhdGVkUHJvcGVydHlcIiwgW1xuXHRcdFx0dGhpcy5fY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlDb250YWluZXIoKSxcblx0XHRcdHRoaXMuX2NvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdFx0XSk7XG5cdH1cblxuXHQvLyByZXRpcnZlIGFsbCB0cmFuc2Zvcm1hdGlvbiBhZ2dyZWdhdGVzIGJ5IHByaW9yaXRpemluZyBBZ2dyZWdhdGVkUHJvcGVydHkgb3ZlciBBZ2dyZWdhdGVkUHJvcGVydGllcyBvYmplY3RzXG5cdHB1YmxpYyBnZXRUcmFuc0FnZ3JlZ2F0aW9ucygpIHtcblx0XHRsZXQgYUFnZ3JlZ2F0ZWRQcm9wZXJ0eU9iamVjdHMgPSB0aGlzLmdldEFnZ3JlZ2F0ZWRQcm9wZXJ0aWVzKFwiQWdncmVnYXRlZFByb3BlcnR5XCIpO1xuXHRcdGlmICghYUFnZ3JlZ2F0ZWRQcm9wZXJ0eU9iamVjdHMgfHwgYUFnZ3JlZ2F0ZWRQcm9wZXJ0eU9iamVjdHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRhQWdncmVnYXRlZFByb3BlcnR5T2JqZWN0cyA9IHRoaXMuZ2V0QWdncmVnYXRlZFByb3BlcnRpZXMoXCJBZ2dyZWdhdGVkUHJvcGVydGllc1wiKVswXTtcblx0XHR9XG5cdFx0cmV0dXJuIGFBZ2dyZWdhdGVkUHJvcGVydHlPYmplY3RzPy5maWx0ZXIoKGFnZ3JlZ2F0ZWRQcm9wZXJ0eTogQWdncmVnYXRlZFByb3BlcnR5VHlwZSkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuX2dldEFnZ3JlZ2F0YWJsZUFnZ3JlZ2F0ZXMoYWdncmVnYXRlZFByb3BlcnR5LkFnZ3JlZ2F0YWJsZVByb3BlcnR5KSkge1xuXHRcdFx0XHRyZXR1cm4gYWdncmVnYXRlZFByb3BlcnR5O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGVhY2ggdHJhbnNmb3JtYXRpb24gaXMgYWdncmVnYXRhYmxlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGNoZWNrXG5cdCAqIEByZXR1cm5zICdhZ2dyZWdhdGVkUHJvcGVydHknXG5cdCAqL1xuXG5cdHByaXZhdGUgX2dldEFnZ3JlZ2F0YWJsZUFnZ3JlZ2F0ZXMocHJvcGVydHk6IFByb3BlcnR5UGF0aCB8IEFubm90YXRpb25UZXJtPEN1c3RvbUFnZ3JlZ2F0ZT4pIHtcblx0XHRjb25zdCBhQWdncmVnYXRhYmxlUHJvcGVydGllcyA9ICh0aGlzLmdldEFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMoKSBhcyBBcHBseVN1cHBvcnRlZFR5cGVbXCJBZ2dyZWdhdGFibGVQcm9wZXJ0aWVzXCJdKSB8fCBbXTtcblx0XHRyZXR1cm4gYUFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMuZmluZChmdW5jdGlvbiAob2JqOiBBZ2dyZWdhdGFibGVQcm9wZXJ0eVR5cGUgfCBhbnkpIHtcblx0XHRcdGNvbnN0IHByb3AgPSAocHJvcGVydHkgYXMgQW5ub3RhdGlvblRlcm08Q3VzdG9tQWdncmVnYXRlPikucXVhbGlmaWVyXG5cdFx0XHRcdD8gKHByb3BlcnR5IGFzIEFubm90YXRpb25UZXJtPEN1c3RvbUFnZ3JlZ2F0ZT4pLnF1YWxpZmllclxuXHRcdFx0XHQ6IChwcm9wZXJ0eSBhcyBQcm9wZXJ0eVBhdGgpLiR0YXJnZXQ/Lm5hbWU7XG5cdFx0XHRpZiAob2JqPy5Qcm9wZXJ0eT8udmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIG9iai5Qcm9wZXJ0eS52YWx1ZSA9PT0gcHJvcDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvYmo/Lm5hbWUgPT09IHByb3A7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIF9nZXRFbnRpdHlQcm9wZXJ0aWVzKCkge1xuXHRcdGxldCBlbnRpdHlQcm9wZXJ0aWVzO1xuXHRcdGlmIChpc0VudGl0eVNldCh0aGlzLl9vQWdncmVnYXRpb25Bbm5vdGF0aW9uVGFyZ2V0KSkge1xuXHRcdFx0ZW50aXR5UHJvcGVydGllcyA9IHRoaXMuX29BZ2dyZWdhdGlvbkFubm90YXRpb25UYXJnZXQ/LmVudGl0eVR5cGU/LmVudGl0eVByb3BlcnRpZXM7XG5cdFx0fSBlbHNlIGlmIChpc0VudGl0eVR5cGUodGhpcy5fb0FnZ3JlZ2F0aW9uQW5ub3RhdGlvblRhcmdldCkpIHtcblx0XHRcdGVudGl0eVByb3BlcnRpZXMgPSB0aGlzLl9vQWdncmVnYXRpb25Bbm5vdGF0aW9uVGFyZ2V0Py5lbnRpdHlQcm9wZXJ0aWVzO1xuXHRcdH1cblx0XHRyZXR1cm4gZW50aXR5UHJvcGVydGllcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGN1c3RvbSBhZ2dyZWdhdGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBlbnRpdHkgdHlwZS5cblx0ICpcblx0ICogQHJldHVybnMgQSBtYXAgKHByb3BlcnR5TmFtZSAtLT4gYXJyYXkgb2YgY29udGV4dC1kZWZpbmluZyBwcm9wZXJ0eSBuYW1lcykgZm9yIGVhY2ggY3VzdG9tIGFnZ3JlZ2F0ZSBjb3JyZXNwb25kaW5nIHRvIGEgcHJvcGVydHkuIFRoZSBhcnJheSBvZlxuXHQgKiBjb250ZXh0LWRlZmluaW5nIHByb3BlcnR5IG5hbWVzIGlzIGVtcHR5IGlmIHRoZSBjdXN0b20gYWdncmVnYXRlIGRvZXNuJ3QgaGF2ZSBhbnkgY29udGV4dC1kZWZpbmluZyBwcm9wZXJ0eS5cblx0ICovXG5cdHB1YmxpYyBnZXRDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9ucygpIHtcblx0XHQvLyBHZXQgdGhlIGN1c3RvbSBhZ2dyZWdhdGVzXG5cdFx0Y29uc3QgYUN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zOiBDdXN0b21BZ2dyZWdhdGVbXSA9IHRoaXMuX2NvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXG5cdFx0XHRcIkFnZ3JlZ2F0aW9uXCIsXG5cdFx0XHRBZ2dyZWdhdGlvbkFubm90YXRpb25UZXJtcy5DdXN0b21BZ2dyZWdhdGUsXG5cdFx0XHRbdGhpcy5fb0FnZ3JlZ2F0aW9uQW5ub3RhdGlvblRhcmdldF1cblx0XHQpO1xuXHRcdHJldHVybiBhQ3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGxvd2VkIHRyYW5zZm9ybWF0aW9ucyBpbiB0aGUgJGFwcGx5LlxuXHQgKiBGaXJzdCBsb29rIGF0IHRoZSBjdXJyZW50IEVudGl0eVNldCwgdGhlbiBsb29rIGF0IHRoZSBkZWZhdWx0IHZhbHVlcyBwcm92aWRlZCBhdCB0aGUgY29udGFpbmVyIGxldmVsLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgbGlzdCBvZiB0cmFuc2Zvcm1hdGlvbnMsIG9yIHVuZGVmaW5lZCBpZiBubyBsaXN0IGlzIGZvdW5kXG5cdCAqL1xuXHRwdWJsaWMgZ2V0QWxsb3dlZFRyYW5zZm9ybWF0aW9ucygpOiBTdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIChcblx0XHRcdCh0aGlzLm9UYXJnZXRBZ2dyZWdhdGlvbkFubm90YXRpb25zPy5BcHBseVN1cHBvcnRlZD8uVHJhbnNmb3JtYXRpb25zIGFzIFN0cmluZ1tdKSB8fFxuXHRcdFx0KHRoaXMub0NvbnRhaW5lckFnZ3JlZ2F0aW9uQW5ub3RhdGlvbj8uQXBwbHlTdXBwb3J0ZWREZWZhdWx0cz8uVHJhbnNmb3JtYXRpb25zIGFzIFN0cmluZ1tdKVxuXHRcdCk7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7RUFhQTtBQUNBO0FBQ0E7RUFGQSxJQUdhQSxpQkFBaUI7SUFvQjdCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0MsMkJBQVlDLFVBQXNCLEVBQUVDLGdCQUFrQyxFQUFrQztNQUFBO01BQUEsSUFBaENDLHNCQUFzQix1RUFBRyxLQUFLO01BQ3JHO01BQ0EsSUFBSSxDQUFDQyxXQUFXLEdBQUdILFVBQVU7TUFDN0IsSUFBSSxDQUFDSSxpQkFBaUIsR0FBR0gsZ0JBQWdCO01BRXpDLElBQUksQ0FBQ0ksNkJBQTZCLEdBQUcsSUFBSSxDQUFDQyxxQ0FBcUMsRUFBRTtNQUNqRixJQUNDQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUNGLDZCQUE2QixDQUFDLElBQ3hERyxZQUFZLENBQUMsSUFBSSxDQUFDSCw2QkFBNkIsQ0FBQyxJQUNoREksV0FBVyxDQUFDLElBQUksQ0FBQ0osNkJBQTZCLENBQUMsRUFDOUM7UUFDRCxJQUFJLENBQUNLLDZCQUE2QixHQUFHLElBQUksQ0FBQ0wsNkJBQTZCLENBQUNNLFdBQVcsQ0FBQ0MsV0FBVztNQUNoRztNQUNBLElBQUksQ0FBQ0MsZ0JBQWdCLEdBQUcsNkJBQUksQ0FBQ0gsNkJBQTZCLGtEQUFsQyxzQkFBb0NJLGNBQWMsR0FBRyxJQUFJ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
229
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBZ2dyZWdhdGlvbkhlbHBlciIsImVudGl0eVR5cGUiLCJjb252ZXJ0ZXJDb250ZXh0IiwiY29uc2lkZXJPbGRBbm5vdGF0aW9ucyIsIl9lbnRpdHlUeXBlIiwiX2NvbnZlcnRlckNvbnRleHQiLCJfb0FnZ3JlZ2F0aW9uQW5ub3RhdGlvblRhcmdldCIsIl9kZXRlcm1pbmVBZ2dyZWdhdGlvbkFubm90YXRpb25UYXJnZXQiLCJpc05hdmlnYXRpb25Qcm9wZXJ0eSIsImlzRW50aXR5VHlwZSIsImlzRW50aXR5U2V0Iiwib1RhcmdldEFnZ3JlZ2F0aW9uQW5ub3RhdGlvbnMiLCJhbm5vdGF0aW9ucyIsIkFnZ3JlZ2F0aW9uIiwiX2JBcHBseVN1cHBvcnRlZCIsIkFwcGx5U3VwcG9ydGVkIiwiX2FHcm91cGFibGVQcm9wZXJ0aWVzIiwiR3JvdXBhYmxlUHJvcGVydGllcyIsIl9hQWdncmVnYXRhYmxlUHJvcGVydGllcyIsIkFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMiLCJvQ29udGFpbmVyQWdncmVnYXRpb25Bbm5vdGF0aW9uIiwiZ2V0RW50aXR5Q29udGFpbmVyIiwiZW50aXR5UHJvcGVydGllcyIsIl9nZXRFbnRpdHlQcm9wZXJ0aWVzIiwiZmlsdGVyIiwicHJvcGVydHkiLCJBZ2dyZWdhdGFibGUiLCJiSXNQYXJhbWV0ZXJpemVkIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInRhcmdldEVudGl0eVNldCIsIkNvbW1vbiIsIlJlc3VsdENvbnRleHQiLCJvQWdncmVnYXRpb25Bbm5vdGF0aW9uU291cmNlIiwib0RhdGFNb2RlbE9iamVjdFBhdGgiLCJvTmF2aWdhdGlvblByb3BlcnR5T2JqZWN0IiwidGFyZ2V0T2JqZWN0Iiwib0VudGl0eVR5cGVPYmplY3QiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiaGFzT3duUHJvcGVydHkiLCJvRW50aXR5U2V0T2JqZWN0IiwiZ2V0RW50aXR5U2V0IiwiZ2V0RW50aXR5VHlwZSIsImlzQW5hbHl0aWNzU3VwcG9ydGVkIiwiaXNQcm9wZXJ0eUdyb3VwYWJsZSIsInVuZGVmaW5lZCIsImxlbmd0aCIsInNvbWUiLCJwYXRoIiwiJHRhcmdldCIsImlzUHJvcGVydHlBZ2dyZWdhdGFibGUiLCJhQ3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnMiLCJnZXRBbm5vdGF0aW9uc0J5VGVybSIsImFubm90YXRpb24iLCJuYW1lIiwicXVhbGlmaWVyIiwiZ2V0R3JvdXBhYmxlUHJvcGVydGllcyIsImdldEFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMiLCJnZXRBZ2dyZWdhdGVkUHJvcGVydGllcyIsImdldEFnZ3JlZ2F0ZWRQcm9wZXJ0eSIsImdldFRyYW5zQWdncmVnYXRpb25zIiwiYUFnZ3JlZ2F0ZWRQcm9wZXJ0eU9iamVjdHMiLCJhZ2dyZWdhdGVkUHJvcGVydHkiLCJfZ2V0QWdncmVnYXRhYmxlQWdncmVnYXRlcyIsIkFnZ3JlZ2F0YWJsZVByb3BlcnR5IiwiYUFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMiLCJmaW5kIiwib2JqIiwicHJvcCIsImlzUHJvcGVydHkiLCJQcm9wZXJ0eSIsInZhbHVlIiwiZ2V0Q3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbnMiLCJnZXRBbGxvd2VkVHJhbnNmb3JtYXRpb25zIiwiVHJhbnNmb3JtYXRpb25zIiwiQXBwbHlTdXBwb3J0ZWREZWZhdWx0cyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQWdncmVnYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbm5vdGF0aW9uVGVybSwgRW50aXR5U2V0LCBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIFByb3BlcnR5LCBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgTXVsdGlwbGVOYXZpZ2F0aW9uUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvRWRtXCI7XG5pbXBvcnQgdHlwZSB7IEFnZ3JlZ2F0YWJsZVByb3BlcnR5VHlwZSwgQ3VzdG9tQWdncmVnYXRlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9BZ2dyZWdhdGlvblwiO1xuaW1wb3J0IHsgQWdncmVnYXRpb25Bbm5vdGF0aW9uVGVybXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7XG5cdENvbGxlY3Rpb25Bbm5vdGF0aW9uc19BZ2dyZWdhdGlvbixcblx0RW50aXR5Q29udGFpbmVyQW5ub3RhdGlvbnNfQWdncmVnYXRpb24sXG5cdEVudGl0eVNldEFubm90YXRpb25zX0FnZ3JlZ2F0aW9uLFxuXHRFbnRpdHlUeXBlQW5ub3RhdGlvbnNfQWdncmVnYXRpb25cbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9BZ2dyZWdhdGlvbl9FZG1cIjtcbmltcG9ydCB0eXBlIHsgQWdncmVnYXRlZFByb3BlcnRpZXMsIEFnZ3JlZ2F0ZWRQcm9wZXJ0eSwgQWdncmVnYXRlZFByb3BlcnR5VHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQW5hbHl0aWNzXCI7XG5pbXBvcnQgdHlwZSB7IFBhZ2VDb250ZXh0UGF0aFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgeyBpc0VudGl0eVNldCwgaXNFbnRpdHlUeXBlLCBpc05hdmlnYXRpb25Qcm9wZXJ0eSwgaXNQcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uL0NvbnZlcnRlckNvbnRleHRcIjtcblxuLyoqXG4gKiBoZWxwZXIgY2xhc3MgZm9yIEFnZ3JlZ2F0aW9uIGFubm90YXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgQWdncmVnYXRpb25IZWxwZXIge1xuXHRfZW50aXR5VHlwZTogRW50aXR5VHlwZTtcblxuXHRfY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+O1xuXG5cdF9iQXBwbHlTdXBwb3J0ZWQ6IGJvb2xlYW47XG5cblx0X2FHcm91cGFibGVQcm9wZXJ0aWVzPzogUHJvcGVydHlQYXRoW107XG5cblx0X2FBZ2dyZWdhdGFibGVQcm9wZXJ0aWVzPzogQWdncmVnYXRhYmxlUHJvcGVydHlUeXBlW10gfCBQcm9wZXJ0eVtdO1xuXG5cdF9vQWdncmVnYXRpb25Bbm5vdGF0aW9uVGFyZ2V0OiBFbnRpdHlUeXBlIHwgRW50aXR5U2V0IHwgTmF2aWdhdGlvblByb3BlcnR5O1xuXG5cdG9UYXJnZXRBZ2dyZWdhdGlvbkFubm90YXRpb25zPzpcblx0XHR8IENvbGxlY3Rpb25Bbm5vdGF0aW9uc19BZ2dyZWdhdGlvblxuXHRcdHwgRW50aXR5VHlwZUFubm90YXRpb25zX0FnZ3JlZ2F0aW9uXG5cdFx0fCBFbnRpdHlTZXRBbm5vdGF0aW9uc19BZ2dyZWdhdGlvbjtcblxuXHRvQ29udGFpbmVyQWdncmVnYXRpb25Bbm5vdGF0aW9uPzogRW50aXR5Q29udGFpbmVyQW5ub3RhdGlvbnNfQWdncmVnYXRpb247XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBoZWxwZXIgZm9yIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIGEgY29udmVydGVyIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBFbnRpdHlUeXBlXG5cdCAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBDb252ZXJ0ZXJDb250ZXh0XG5cdCAqIEBwYXJhbSBbY29uc2lkZXJPbGRBbm5vdGF0aW9uc10gVGhlIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdG8gY29uc2lkZXIgb2xkIGFubm90YXRpb25zXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sIGNvbnNpZGVyT2xkQW5ub3RhdGlvbnMgPSBmYWxzZSkge1xuXHRcdC8vY29uc2lkZXJPbGRBbm5vdGF0aW9ucyB3aWxsIGJlIHRydWUgYW5kIHNlbnQgb25seSBmb3IgY2hhcnRcblx0XHR0aGlzLl9lbnRpdHlUeXBlID0gZW50aXR5VHlwZTtcblx0XHR0aGlzLl9jb252ZXJ0ZXJDb250ZXh0ID0gY29udmVydGVyQ29udGV4dDtcblxuXHRcdHRoaXMuX29BZ2dyZWdhdGlvbkFubm90YXRpb25UYXJnZXQgPSB0aGlzLl9kZXRlcm1pbmVBZ2dyZWdhdGlvbkFubm90YXRpb25UYXJnZXQoKTtcblx0XHRpZiAoXG5cdFx0XHRpc05hdmlnYXRpb25Qcm9wZXJ0eSh0aGlzLl9vQWdncmVnYXRpb25Bbm5vdGF0aW9uVGFyZ2V0KSB8fFxuXHRcdFx0aXNFbnRpdHlUeXBlKHRoaXMuX29BZ2dyZWdhdGlvbkFubm90YXRpb25UYXJnZXQpIHx8XG5cdFx0XHRpc0VudGl0eVNldCh0aGlzLl9vQWdncmVnYXRpb25Bbm5vdGF0aW9uVGFyZ2V0KVxuXHRcdCkge1xuXHRcdFx0dGhpcy5vVGFyZ2V0QWdncmVnYXRpb25Bbm5vdGF0aW9ucyA9IHRoaXMuX29BZ2dyZWdhdGlvbkFubm90YXRpb25UYXJnZXQuYW5ub3RhdGlvbnMuQWdncmVnYXRpb247XG5cdFx0fVxuXHRcdHRoaXMuX2JBcHBseVN1cHBvcnRlZCA9IHRoaXMub1RhcmdldEFnZ3JlZ2F0aW9uQW5ub3RhdGlvbnM/LkFwcGx5U3VwcG9ydGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0aWYgKHRoaXMuX2JBcHBseVN1cHBvcnRlZCkge1xuXHRcdFx0dGhpcy5fYUdyb3VwYWJsZVByb3BlcnRpZXMgPSB0aGlzLm9UYXJnZXRBZ2dyZWdhdGlvbkFubm90YXRpb25zPy5BcHBseVN1cHBvcnRlZD8uR3JvdXBhYmxlUHJvcGVydGllcyBhcyBQcm9wZXJ0eVBhdGhbXTtcblx0XHRcdHRoaXMuX2FBZ2dyZWdhdGFibGVQcm9wZXJ0aWVzID0gdGhpcy5vVGFyZ2V0QWdncmVnYXRpb25Bbm5vdGF0aW9ucz8uQXBwbHlTdXBwb3J0ZWQ/LkFnZ3JlZ2F0YWJsZVByb3BlcnRpZXM7XG5cblx0XHRcdHRoaXMub0NvbnRhaW5lckFnZ3JlZ2F0aW9uQW5ub3RhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5Q29udGFpbmVyKCkuYW5ub3RhdGlvbnNcblx0XHRcdFx0LkFnZ3JlZ2F0aW9uIGFzIEVudGl0eUNvbnRhaW5lckFubm90YXRpb25zX0FnZ3JlZ2F0aW9uO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuX2FBZ2dyZWdhdGFibGVQcm9wZXJ0aWVzICYmIGNvbnNpZGVyT2xkQW5ub3RhdGlvbnMpIHtcblx0XHRcdGNvbnN0IGVudGl0eVByb3BlcnRpZXMgPSB0aGlzLl9nZXRFbnRpdHlQcm9wZXJ0aWVzKCk7XG5cdFx0XHR0aGlzLl9hQWdncmVnYXRhYmxlUHJvcGVydGllcyA9IGVudGl0eVByb3BlcnRpZXM/LmZpbHRlcigocHJvcGVydHkpID0+IHtcblx0XHRcdFx0cmV0dXJuIHByb3BlcnR5LmFubm90YXRpb25zPy5BZ2dyZWdhdGlvbj8uQWdncmVnYXRhYmxlO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERldGVybWluZXMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgdGFyZ2V0IGZvciB0aGUgYWdncmVnYXRpb24gYW5ub3RhdGlvbnMuXG5cdCAqXG5cdCAqIEByZXR1cm5zICBFbnRpdHlUeXBlLCBFbnRpdHlTZXQgb3IgTmF2aWdhdGlvblByb3BlcnR5IHdoZXJlIGFnZ3JlZ2F0aW9uIGFubm90YXRpb25zIHNob3VsZCBiZSByZWFkIGZyb20uXG5cdCAqL1xuXHRwcml2YXRlIF9kZXRlcm1pbmVBZ2dyZWdhdGlvbkFubm90YXRpb25UYXJnZXQoKTogRW50aXR5VHlwZSB8IEVudGl0eVNldCB8IE5hdmlnYXRpb25Qcm9wZXJ0eSB7XG5cdFx0Y29uc3QgYklzUGFyYW1ldGVyaXplZCA9IHRoaXMuX2NvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpPy50YXJnZXRFbnRpdHlTZXQ/LmVudGl0eVR5cGU/LmFubm90YXRpb25zPy5Db21tb25cblx0XHRcdD8uUmVzdWx0Q29udGV4dFxuXHRcdFx0PyB0cnVlXG5cdFx0XHQ6IGZhbHNlO1xuXHRcdGxldCBvQWdncmVnYXRpb25Bbm5vdGF0aW9uU291cmNlOiBFbnRpdHlUeXBlIHwgRW50aXR5U2V0IHwgTmF2aWdhdGlvblByb3BlcnR5O1xuXG5cdFx0Ly8gZmluZCBBcHBseVN1cHBvcnRlZFxuXHRcdGlmIChiSXNQYXJhbWV0ZXJpemVkKSB7XG5cdFx0XHQvLyBpZiB0aGlzIGlzIGEgcGFyYW1ldGVyaXplZCB2aWV3IHRoZW4gYXBwbHlzdXBwb3J0ZWQgY2FuIGJlIGZvdW5kIGF0IGVpdGhlciB0aGUgbmF2UHJvcCBwb2ludGluZyB0byB0aGUgcmVzdWx0IHNldCBvciBlbnRpdHlUeXBlLlxuXHRcdFx0Ly8gSWYgYXBwbHlTdXBwb3J0ZWQgaXMgcHJlc2VudCBhdCBib3RoIHRoZSBuYXZQcm9wIGFuZCB0aGUgZW50aXR5VHlwZSB0aGVuIG5hdlByb3AgaXMgbW9yZSBzcGVjaWZpYyBzbyB0YWtlIGFubm90YXRpb25zIGZyb20gdGhlcmVcblx0XHRcdC8vIHRhcmdldE9iamVjdCBpbiB0aGUgY29udmVydGVyIGNvbnRleHQgZm9yIGEgcGFyYW1ldGVyaXplZCB2aWV3IGlzIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHBvaW50aW5nIHRvIHRoIHJlc3VsdCBzZXRcblx0XHRcdGNvbnN0IG9EYXRhTW9kZWxPYmplY3RQYXRoID0gdGhpcy5fY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdFx0XHRjb25zdCBvTmF2aWdhdGlvblByb3BlcnR5T2JqZWN0ID0gb0RhdGFNb2RlbE9iamVjdFBhdGg/LnRhcmdldE9iamVjdCBhcyBNdWx0aXBsZU5hdmlnYXRpb25Qcm9wZXJ0eTtcblx0XHRcdGNvbnN0IG9FbnRpdHlUeXBlT2JqZWN0ID0gb0RhdGFNb2RlbE9iamVjdFBhdGg/LnRhcmdldEVudGl0eVR5cGU7XG5cdFx0XHRpZiAob05hdmlnYXRpb25Qcm9wZXJ0eU9iamVjdD8uYW5ub3RhdGlvbnM/LkFnZ3JlZ2F0aW9uPy5oYXNPd25Qcm9wZXJ0eShcIkFwcGx5U3VwcG9ydGVkXCIpKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGlvbkFubm90YXRpb25Tb3VyY2UgPSBvTmF2aWdhdGlvblByb3BlcnR5T2JqZWN0O1xuXHRcdFx0fSBlbHNlIGlmIChvRW50aXR5VHlwZU9iamVjdD8uYW5ub3RhdGlvbnM/LkFnZ3JlZ2F0aW9uPy5BcHBseVN1cHBvcnRlZCkge1xuXHRcdFx0XHRvQWdncmVnYXRpb25Bbm5vdGF0aW9uU291cmNlID0gb0VudGl0eVR5cGVPYmplY3Q7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEZvciB0aGUgdGltZSBiZWluZywgd2UgaWdub3JlIGFubm90YXRpb25zIGF0IHRoZSBjb250YWluZXIgbGV2ZWwsIHVudGlsIHRoZSB2b2NhYnVsYXJ5IGlzIHN0YWJpbGl6ZWRcblx0XHRcdGNvbnN0IG9FbnRpdHlTZXRPYmplY3QgPSB0aGlzLl9jb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRcdFx0aWYgKGlzRW50aXR5U2V0KG9FbnRpdHlTZXRPYmplY3QpICYmIG9FbnRpdHlTZXRPYmplY3QuYW5ub3RhdGlvbnMuQWdncmVnYXRpb24/LkFwcGx5U3VwcG9ydGVkKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGlvbkFubm90YXRpb25Tb3VyY2UgPSBvRW50aXR5U2V0T2JqZWN0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b0FnZ3JlZ2F0aW9uQW5ub3RhdGlvblNvdXJjZSA9IHRoaXMuX2NvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb0FnZ3JlZ2F0aW9uQW5ub3RhdGlvblNvdXJjZSE7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBlbnRpdHkgc3VwcG9ydHMgYW5hbHl0aWNhbCBxdWVyaWVzLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYW5hbHl0aWNhbCBxdWVyaWVzIGFyZSBzdXBwb3J0ZWQsIGZhbHNlIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0FuYWx5dGljc1N1cHBvcnRlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fYkFwcGx5U3VwcG9ydGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIHByb3BlcnR5IGlzIGdyb3VwYWJsZS5cblx0ICpcblx0ICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBjaGVja1xuXHQgKiBAcmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgZW50aXR5IGRvZXNuJ3Qgc3VwcG9ydCBhbmFseXRpY2FsIHF1ZXJpZXMsIHRydWUgb3IgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwdWJsaWMgaXNQcm9wZXJ0eUdyb3VwYWJsZShwcm9wZXJ0eTogUHJvcGVydHkpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoIXRoaXMuX2JBcHBseVN1cHBvcnRlZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9IGVsc2UgaWYgKCF0aGlzLl9hR3JvdXBhYmxlUHJvcGVydGllcyB8fCB0aGlzLl9hR3JvdXBhYmxlUHJvcGVydGllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIE5vIGdyb3VwYWJsZVByb3BlcnRpZXMgLS0+IGFsbCBwcm9wZXJ0aWVzIGFyZSBncm91cGFibGVcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fYUdyb3VwYWJsZVByb3BlcnRpZXMuc29tZSgocGF0aCkgPT4gcGF0aC4kdGFyZ2V0ID09PSBwcm9wZXJ0eSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIHByb3BlcnR5IGlzIGFnZ3JlZ2F0YWJsZS5cblx0ICpcblx0ICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBjaGVja1xuXHQgKiBAcmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgZW50aXR5IGRvZXNuJ3Qgc3VwcG9ydCBhbmFseXRpY2FsIHF1ZXJpZXMsIHRydWUgb3IgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwdWJsaWMgaXNQcm9wZXJ0eUFnZ3JlZ2F0YWJsZShwcm9wZXJ0eTogUHJvcGVydHkpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoIXRoaXMuX2JBcHBseVN1cHBvcnRlZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gR2V0IHRoZSBjdXN0b20gYWdncmVnYXRlc1xuXHRcdFx0Y29uc3QgYUN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zOiBDdXN0b21BZ2dyZWdhdGVbXSA9IHRoaXMuX2NvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXG5cdFx0XHRcdFwiQWdncmVnYXRpb25cIixcblx0XHRcdFx0QWdncmVnYXRpb25Bbm5vdGF0aW9uVGVybXMuQ3VzdG9tQWdncmVnYXRlLFxuXHRcdFx0XHRbdGhpcy5fb0FnZ3JlZ2F0aW9uQW5ub3RhdGlvblRhcmdldF1cblx0XHRcdCk7XG5cblx0XHRcdC8vIENoZWNrIGlmIGEgY3VzdG9tIGFnZ3JlZ2F0ZSBoYXMgYSBxdWFsaWZpZXIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcHJvcGVydHkgbmFtZVxuXHRcdFx0cmV0dXJuIGFDdXN0b21BZ2dyZWdhdGVBbm5vdGF0aW9ucy5zb21lKChhbm5vdGF0aW9uKSA9PiB7XG5cdFx0XHRcdHJldHVybiBwcm9wZXJ0eS5uYW1lID09PSBhbm5vdGF0aW9uLnF1YWxpZmllcjtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBnZXRHcm91cGFibGVQcm9wZXJ0aWVzKCk6IFByb3BlcnR5UGF0aFtdIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5fYUdyb3VwYWJsZVByb3BlcnRpZXM7XG5cdH1cblxuXHRwdWJsaWMgZ2V0QWdncmVnYXRhYmxlUHJvcGVydGllcygpOiBBZ2dyZWdhdGFibGVQcm9wZXJ0eVR5cGVbXSB8IFByb3BlcnR5W10gfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLl9hQWdncmVnYXRhYmxlUHJvcGVydGllcztcblx0fVxuXG5cdHB1YmxpYyBnZXRFbnRpdHlUeXBlKCk6IEVudGl0eVR5cGUge1xuXHRcdHJldHVybiB0aGlzLl9lbnRpdHlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgQWdncmVnYXRlZFByb3BlcnRpZXMgb3IgQWdncmVnYXRlZFByb3BlcnR5IGJhc2VkIG9uIHBhcmFtIFRlcm0uXG5cdCAqIFRoZSBUZXJtIGhlcmUgaW5kaWNhdGVzIGlmIHRoZSBBZ2dyZWdhdGVkUHJvcGVydHkgc2hvdWxkIGJlIHJldHJpZXZlZCBvciB0aGUgZGVwcmVjYXRlZCBBZ2dyZWdhdGVkUHJvcGVydGllcy5cblx0ICpcblx0ICogQHJldHVybnMgQW5ub3RhdGlvbnMgVGhlIGFwcHJvcHJpYXRlIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBnaXZlbiBUZXJtLlxuXHQgKi9cblx0cHVibGljIGdldEFnZ3JlZ2F0ZWRQcm9wZXJ0aWVzKCk6IEFnZ3JlZ2F0ZWRQcm9wZXJ0aWVzW10ge1xuXHRcdHJldHVybiB0aGlzLl9jb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiQW5hbHl0aWNzXCIsIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkFnZ3JlZ2F0ZWRQcm9wZXJ0aWVzXCIsIFtcblx0XHRcdHRoaXMuX2NvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5Q29udGFpbmVyKCksXG5cdFx0XHR0aGlzLl9jb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKVxuXHRcdF0pO1xuXHR9XG5cblx0cHVibGljIGdldEFnZ3JlZ2F0ZWRQcm9wZXJ0eSgpOiBBZ2dyZWdhdGVkUHJvcGVydHlbXSB7XG5cdFx0cmV0dXJuIHRoaXMuX2NvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJBbmFseXRpY3NcIiwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuQWdncmVnYXRlZFByb3BlcnR5XCIsIFtcblx0XHRcdHRoaXMuX2NvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5Q29udGFpbmVyKCksXG5cdFx0XHR0aGlzLl9jb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKVxuXHRcdF0pO1xuXHR9XG5cblx0Ly8gcmV0aXJ2ZSBhbGwgdHJhbnNmb3JtYXRpb24gYWdncmVnYXRlcyBieSBwcmlvcml0aXppbmcgQWdncmVnYXRlZFByb3BlcnR5IG92ZXIgQWdncmVnYXRlZFByb3BlcnRpZXMgb2JqZWN0c1xuXHRwdWJsaWMgZ2V0VHJhbnNBZ2dyZWdhdGlvbnMoKTogQWdncmVnYXRlZFByb3BlcnR5W10ge1xuXHRcdGxldCBhQWdncmVnYXRlZFByb3BlcnR5T2JqZWN0cyA9IHRoaXMuZ2V0QWdncmVnYXRlZFByb3BlcnR5KCk7XG5cdFx0aWYgKCFhQWdncmVnYXRlZFByb3BlcnR5T2JqZWN0cyB8fCBhQWdncmVnYXRlZFByb3BlcnR5T2JqZWN0cy5sZW5ndGggPT09IDApIHtcblx0XHRcdGFBZ2dyZWdhdGVkUHJvcGVydHlPYmplY3RzID0gdGhpcy5nZXRBZ2dyZWdhdGVkUHJvcGVydGllcygpWzBdIGFzIHVua25vd24gYXMgQWdncmVnYXRlZFByb3BlcnR5W107XG5cdFx0fVxuXHRcdHJldHVybiBhQWdncmVnYXRlZFByb3BlcnR5T2JqZWN0cz8uZmlsdGVyKChhZ2dyZWdhdGVkUHJvcGVydHk6IEFnZ3JlZ2F0ZWRQcm9wZXJ0eVR5cGUpID0+IHtcblx0XHRcdGlmICh0aGlzLl9nZXRBZ2dyZWdhdGFibGVBZ2dyZWdhdGVzKGFnZ3JlZ2F0ZWRQcm9wZXJ0eS5BZ2dyZWdhdGFibGVQcm9wZXJ0eSkpIHtcblx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0ZWRQcm9wZXJ0eTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBlYWNoIHRyYW5zZm9ybWF0aW9uIGlzIGFnZ3JlZ2F0YWJsZS5cblx0ICpcblx0ICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBjaGVja1xuXHQgKiBAcmV0dXJucyAnYWdncmVnYXRlZFByb3BlcnR5J1xuXHQgKi9cblxuXHRwcml2YXRlIF9nZXRBZ2dyZWdhdGFibGVBZ2dyZWdhdGVzKFxuXHRcdHByb3BlcnR5OiBQcm9wZXJ0eVBhdGggfCBBbm5vdGF0aW9uVGVybTxDdXN0b21BZ2dyZWdhdGU+XG5cdCk6IEFnZ3JlZ2F0YWJsZVByb3BlcnR5VHlwZSB8IFByb3BlcnR5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBhQWdncmVnYXRhYmxlUHJvcGVydGllcyA9IHRoaXMuZ2V0QWdncmVnYXRhYmxlUHJvcGVydGllcygpIHx8IFtdO1xuXHRcdHJldHVybiBhQWdncmVnYXRhYmxlUHJvcGVydGllcy5maW5kKGZ1bmN0aW9uIChvYmo6IEFnZ3JlZ2F0YWJsZVByb3BlcnR5VHlwZSB8IFByb3BlcnR5KSB7XG5cdFx0XHRjb25zdCBwcm9wID0gKHByb3BlcnR5IGFzIEFubm90YXRpb25UZXJtPEN1c3RvbUFnZ3JlZ2F0ZT4pLnF1YWxpZmllclxuXHRcdFx0XHQ/IChwcm9wZXJ0eSBhcyBBbm5vdGF0aW9uVGVybTxDdXN0b21BZ2dyZWdhdGU+KS5xdWFsaWZpZXJcblx0XHRcdFx0OiAocHJvcGVydHkgYXMgUHJvcGVydHlQYXRoKS4kdGFyZ2V0Py5uYW1lO1xuXHRcdFx0aWYgKGlzUHJvcGVydHkob2JqKSkge1xuXHRcdFx0XHRyZXR1cm4gb2JqPy5uYW1lID09PSBwcm9wO1xuXHRcdFx0fSBlbHNlIGlmIChvYmo/LlByb3BlcnR5Py52YWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gb2JqLlByb3BlcnR5LnZhbHVlID09PSBwcm9wO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBfZ2V0RW50aXR5UHJvcGVydGllcygpOiBQcm9wZXJ0eVtdIHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgZW50aXR5UHJvcGVydGllcztcblx0XHRpZiAoaXNFbnRpdHlTZXQodGhpcy5fb0FnZ3JlZ2F0aW9uQW5ub3RhdGlvblRhcmdldCkpIHtcblx0XHRcdGVudGl0eVByb3BlcnRpZXMgPSB0aGlzLl9vQWdncmVnYXRpb25Bbm5vdGF0aW9uVGFyZ2V0Py5lbnRpdHlUeXBlPy5lbnRpdHlQcm9wZXJ0aWVzO1xuXHRcdH0gZWxzZSBpZiAoaXNFbnRpdHlUeXBlKHRoaXMuX29BZ2dyZWdhdGlvbkFubm90YXRpb25UYXJnZXQpKSB7XG5cdFx0XHRlbnRpdHlQcm9wZXJ0aWVzID0gdGhpcy5fb0FnZ3JlZ2F0aW9uQW5ub3RhdGlvblRhcmdldD8uZW50aXR5UHJvcGVydGllcztcblx0XHR9XG5cdFx0cmV0dXJuIGVudGl0eVByb3BlcnRpZXM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbGlzdCBvZiBjdXN0b20gYWdncmVnYXRlIGRlZmluaXRpb25zIGZvciB0aGUgZW50aXR5IHR5cGUuXG5cdCAqXG5cdCAqIEByZXR1cm5zIEEgbWFwIChwcm9wZXJ0eU5hbWUgLS0+IGFycmF5IG9mIGNvbnRleHQtZGVmaW5pbmcgcHJvcGVydHkgbmFtZXMpIGZvciBlYWNoIGN1c3RvbSBhZ2dyZWdhdGUgY29ycmVzcG9uZGluZyB0byBhIHByb3BlcnR5LiBUaGUgYXJyYXkgb2Zcblx0ICogY29udGV4dC1kZWZpbmluZyBwcm9wZXJ0eSBuYW1lcyBpcyBlbXB0eSBpZiB0aGUgY3VzdG9tIGFnZ3JlZ2F0ZSBkb2Vzbid0IGhhdmUgYW55IGNvbnRleHQtZGVmaW5pbmcgcHJvcGVydHkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbnMoKTogQ3VzdG9tQWdncmVnYXRlW10ge1xuXHRcdC8vIEdldCB0aGUgY3VzdG9tIGFnZ3JlZ2F0ZXNcblx0XHRjb25zdCBhQ3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnM6IEN1c3RvbUFnZ3JlZ2F0ZVtdID0gdGhpcy5fY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcblx0XHRcdFwiQWdncmVnYXRpb25cIixcblx0XHRcdEFnZ3JlZ2F0aW9uQW5ub3RhdGlvblRlcm1zLkN1c3RvbUFnZ3JlZ2F0ZSxcblx0XHRcdFt0aGlzLl9vQWdncmVnYXRpb25Bbm5vdGF0aW9uVGFyZ2V0XVxuXHRcdCk7XG5cdFx0cmV0dXJuIGFDdXN0b21BZ2dyZWdhdGVBbm5vdGF0aW9ucztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbG93ZWQgdHJhbnNmb3JtYXRpb25zIGluIHRoZSAkYXBwbHkuXG5cdCAqIEZpcnN0IGxvb2sgYXQgdGhlIGN1cnJlbnQgRW50aXR5U2V0LCB0aGVuIGxvb2sgYXQgdGhlIGRlZmF1bHQgdmFsdWVzIHByb3ZpZGVkIGF0IHRoZSBjb250YWluZXIgbGV2ZWwuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIHRyYW5zZm9ybWF0aW9ucywgb3IgdW5kZWZpbmVkIGlmIG5vIGxpc3QgaXMgZm91bmRcblx0ICovXG5cdHB1YmxpYyBnZXRBbGxvd2VkVHJhbnNmb3JtYXRpb25zKCk6IFN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0KHRoaXMub1RhcmdldEFnZ3JlZ2F0aW9uQW5ub3RhdGlvbnM/LkFwcGx5U3VwcG9ydGVkPy5UcmFuc2Zvcm1hdGlvbnMgYXMgU3RyaW5nW10pIHx8XG5cdFx0XHQodGhpcy5vQ29udGFpbmVyQWdncmVnYXRpb25Bbm5vdGF0aW9uPy5BcHBseVN1cHBvcnRlZERlZmF1bHRzPy5UcmFuc2Zvcm1hdGlvbnMgYXMgU3RyaW5nW10pXG5cdFx0KTtcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiO0FB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
@@ -1,5 +1,6 @@
1
1
  import type { AnnotationTerm, EntitySet, EntityType, NavigationProperty, Property, PropertyPath } from "@sap-ux/vocabularies-types";
2
- import type { AggregatablePropertyType, ApplySupportedType, CustomAggregate } from "@sap-ux/vocabularies-types/vocabularies/Aggregation";
2
+ import type { MultipleNavigationProperty } from "@sap-ux/vocabularies-types/Edm";
3
+ import type { AggregatablePropertyType, CustomAggregate } from "@sap-ux/vocabularies-types/vocabularies/Aggregation";
3
4
  import { AggregationAnnotationTerms } from "@sap-ux/vocabularies-types/vocabularies/Aggregation";
4
5
  import type {
5
6
  CollectionAnnotations_Aggregation,
@@ -7,8 +8,9 @@ import type {
7
8
  EntitySetAnnotations_Aggregation,
8
9
  EntityTypeAnnotations_Aggregation
9
10
  } from "@sap-ux/vocabularies-types/vocabularies/Aggregation_Edm";
10
- import type { AggregatedPropertyType } from "@sap-ux/vocabularies-types/vocabularies/Analytics";
11
- import { isEntitySet, isEntityType, isNavigationProperty } from "sap/fe/core/helpers/TypeGuards";
11
+ import type { AggregatedProperties, AggregatedProperty, AggregatedPropertyType } from "@sap-ux/vocabularies-types/vocabularies/Analytics";
12
+ import type { PageContextPathTarget } from "sap/fe/core/converters/TemplateConverter";
13
+ import { isEntitySet, isEntityType, isNavigationProperty, isProperty } from "sap/fe/core/helpers/TypeGuards";
12
14
  import type ConverterContext from "../ConverterContext";
13
15
 
14
16
  /**
@@ -17,7 +19,7 @@ import type ConverterContext from "../ConverterContext";
17
19
  export class AggregationHelper {
18
20
  _entityType: EntityType;
19
21
 
20
- _converterContext: ConverterContext;
22
+ _converterContext: ConverterContext<PageContextPathTarget>;
21
23
 
22
24
  _bApplySupported: boolean;
23
25
 
@@ -41,7 +43,7 @@ export class AggregationHelper {
41
43
  * @param converterContext The ConverterContext
42
44
  * @param [considerOldAnnotations] The flag to indicate whether or not to consider old annotations
43
45
  */
44
- constructor(entityType: EntityType, converterContext: ConverterContext, considerOldAnnotations = false) {
46
+ constructor(entityType: EntityType, converterContext: ConverterContext<PageContextPathTarget>, considerOldAnnotations = false) {
45
47
  //considerOldAnnotations will be true and sent only for chart
46
48
  this._entityType = entityType;
47
49
  this._converterContext = converterContext;
@@ -81,7 +83,7 @@ export class AggregationHelper {
81
83
  ?.ResultContext
82
84
  ? true
83
85
  : false;
84
- let oAggregationAnnotationSource;
86
+ let oAggregationAnnotationSource: EntityType | EntitySet | NavigationProperty;
85
87
 
86
88
  // find ApplySupported
87
89
  if (bIsParameterized) {
@@ -89,9 +91,9 @@ export class AggregationHelper {
89
91
  // If applySupported is present at both the navProp and the entityType then navProp is more specific so take annotations from there
90
92
  // targetObject in the converter context for a parameterized view is the navigation property pointing to th result set
91
93
  const oDataModelObjectPath = this._converterContext.getDataModelObjectPath();
92
- const oNavigationPropertyObject = oDataModelObjectPath?.targetObject;
94
+ const oNavigationPropertyObject = oDataModelObjectPath?.targetObject as MultipleNavigationProperty;
93
95
  const oEntityTypeObject = oDataModelObjectPath?.targetEntityType;
94
- if (oNavigationPropertyObject?.annotations?.Aggregation?.ApplySupported) {
96
+ if (oNavigationPropertyObject?.annotations?.Aggregation?.hasOwnProperty("ApplySupported")) {
95
97
  oAggregationAnnotationSource = oNavigationPropertyObject;
96
98
  } else if (oEntityTypeObject?.annotations?.Aggregation?.ApplySupported) {
97
99
  oAggregationAnnotationSource = oEntityTypeObject;
@@ -105,7 +107,7 @@ export class AggregationHelper {
105
107
  oAggregationAnnotationSource = this._converterContext.getEntityType();
106
108
  }
107
109
  }
108
- return oAggregationAnnotationSource;
110
+ return oAggregationAnnotationSource!;
109
111
  }
110
112
 
111
113
  /**
@@ -158,15 +160,15 @@ export class AggregationHelper {
158
160
  }
159
161
  }
160
162
 
161
- public getGroupableProperties() {
163
+ public getGroupableProperties(): PropertyPath[] | undefined {
162
164
  return this._aGroupableProperties;
163
165
  }
164
166
 
165
- public getAggregatableProperties() {
167
+ public getAggregatableProperties(): AggregatablePropertyType[] | Property[] | undefined {
166
168
  return this._aAggregatableProperties;
167
169
  }
168
170
 
169
- public getEntityType() {
171
+ public getEntityType(): EntityType {
170
172
  return this._entityType;
171
173
  }
172
174
 
@@ -174,16 +176,16 @@ export class AggregationHelper {
174
176
  * Returns AggregatedProperties or AggregatedProperty based on param Term.
175
177
  * The Term here indicates if the AggregatedProperty should be retrieved or the deprecated AggregatedProperties.
176
178
  *
177
- * @param Term The Annotation Term
178
179
  * @returns Annotations The appropriate annotations based on the given Term.
179
180
  */
180
- public getAggregatedProperties(Term: String) {
181
- if (Term === "AggregatedProperties") {
182
- return this._converterContext.getAnnotationsByTerm("Analytics", "com.sap.vocabularies.Analytics.v1.AggregatedProperties", [
183
- this._converterContext.getEntityContainer(),
184
- this._converterContext.getEntityType()
185
- ]);
186
- }
181
+ public getAggregatedProperties(): AggregatedProperties[] {
182
+ return this._converterContext.getAnnotationsByTerm("Analytics", "com.sap.vocabularies.Analytics.v1.AggregatedProperties", [
183
+ this._converterContext.getEntityContainer(),
184
+ this._converterContext.getEntityType()
185
+ ]);
186
+ }
187
+
188
+ public getAggregatedProperty(): AggregatedProperty[] {
187
189
  return this._converterContext.getAnnotationsByTerm("Analytics", "com.sap.vocabularies.Analytics.v1.AggregatedProperty", [
188
190
  this._converterContext.getEntityContainer(),
189
191
  this._converterContext.getEntityType()
@@ -191,10 +193,10 @@ export class AggregationHelper {
191
193
  }
192
194
 
193
195
  // retirve all transformation aggregates by prioritizing AggregatedProperty over AggregatedProperties objects
194
- public getTransAggregations() {
195
- let aAggregatedPropertyObjects = this.getAggregatedProperties("AggregatedProperty");
196
+ public getTransAggregations(): AggregatedProperty[] {
197
+ let aAggregatedPropertyObjects = this.getAggregatedProperty();
196
198
  if (!aAggregatedPropertyObjects || aAggregatedPropertyObjects.length === 0) {
197
- aAggregatedPropertyObjects = this.getAggregatedProperties("AggregatedProperties")[0];
199
+ aAggregatedPropertyObjects = this.getAggregatedProperties()[0] as unknown as AggregatedProperty[];
198
200
  }
199
201
  return aAggregatedPropertyObjects?.filter((aggregatedProperty: AggregatedPropertyType) => {
200
202
  if (this._getAggregatableAggregates(aggregatedProperty.AggregatableProperty)) {
@@ -210,20 +212,23 @@ export class AggregationHelper {
210
212
  * @returns 'aggregatedProperty'
211
213
  */
212
214
 
213
- private _getAggregatableAggregates(property: PropertyPath | AnnotationTerm<CustomAggregate>) {
214
- const aAggregatableProperties = (this.getAggregatableProperties() as ApplySupportedType["AggregatableProperties"]) || [];
215
- return aAggregatableProperties.find(function (obj: AggregatablePropertyType | any) {
215
+ private _getAggregatableAggregates(
216
+ property: PropertyPath | AnnotationTerm<CustomAggregate>
217
+ ): AggregatablePropertyType | Property | undefined {
218
+ const aAggregatableProperties = this.getAggregatableProperties() || [];
219
+ return aAggregatableProperties.find(function (obj: AggregatablePropertyType | Property) {
216
220
  const prop = (property as AnnotationTerm<CustomAggregate>).qualifier
217
221
  ? (property as AnnotationTerm<CustomAggregate>).qualifier
218
222
  : (property as PropertyPath).$target?.name;
219
- if (obj?.Property?.value) {
223
+ if (isProperty(obj)) {
224
+ return obj?.name === prop;
225
+ } else if (obj?.Property?.value) {
220
226
  return obj.Property.value === prop;
221
227
  }
222
- return obj?.name === prop;
223
228
  });
224
229
  }
225
230
 
226
- private _getEntityProperties() {
231
+ private _getEntityProperties(): Property[] | undefined {
227
232
  let entityProperties;
228
233
  if (isEntitySet(this._oAggregationAnnotationTarget)) {
229
234
  entityProperties = this._oAggregationAnnotationTarget?.entityType?.entityProperties;
@@ -239,7 +244,7 @@ export class AggregationHelper {
239
244
  * @returns A map (propertyName --> array of context-defining property names) for each custom aggregate corresponding to a property. The array of
240
245
  * context-defining property names is empty if the custom aggregate doesn't have any context-defining property.
241
246
  */
242
- public getCustomAggregateDefinitions() {
247
+ public getCustomAggregateDefinitions(): CustomAggregate[] {
243
248
  // Get the custom aggregates
244
249
  const aCustomAggregateAnnotations: CustomAggregate[] = this._converterContext.getAnnotationsByTerm(
245
250
  "Aggregation",