@sapui5/sap.fe.core 1.141.2 → 1.143.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +4 -1
  3. package/src/sap/fe/core/ActionRuntime.js +78 -23
  4. package/src/sap/fe/core/ActionRuntime.ts +91 -35
  5. package/src/sap/fe/core/AppComponent.js +76 -6
  6. package/src/sap/fe/core/AppComponent.ts +91 -8
  7. package/src/sap/fe/core/AppStateHandler.js +7 -7
  8. package/src/sap/fe/core/AppStateHandler.ts +9 -8
  9. package/src/sap/fe/core/BaseController.js +8 -5
  10. package/src/sap/fe/core/BaseController.ts +6 -1
  11. package/src/sap/fe/core/CommonUtils.js +4 -123
  12. package/src/sap/fe/core/CommonUtils.ts +3 -172
  13. package/src/sap/fe/core/ExtensionAPI.js +3 -11
  14. package/src/sap/fe/core/ExtensionAPI.ts +3 -16
  15. package/src/sap/fe/core/PageController.js +64 -43
  16. package/src/sap/fe/core/PageController.ts +62 -47
  17. package/src/sap/fe/core/TemplateComponent.js +12 -1
  18. package/src/sap/fe/core/TemplateComponent.ts +16 -2
  19. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +37 -24
  20. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +47 -31
  21. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
  22. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +4 -0
  23. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +4 -1
  24. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -0
  25. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +5 -3
  26. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +5 -2
  27. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +7 -5
  28. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +22 -2
  29. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +82 -44
  30. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +92 -59
  31. package/src/sap/fe/core/controllerextensions/EditFlow.js +74 -48
  32. package/src/sap/fe/core/controllerextensions/EditFlow.ts +87 -50
  33. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +9 -7
  34. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +17 -5
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +37 -18
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +49 -17
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +30 -15
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +32 -14
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +9 -10
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +10 -9
  41. package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -2
  44. package/src/sap/fe/core/controllerextensions/Placeholder.ts +5 -1
  45. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -3
  46. package/src/sap/fe/core/controllerextensions/Recommendations.ts +2 -2
  47. package/src/sap/fe/core/controllerextensions/Routing.js +4 -4
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +3 -6
  49. package/src/sap/fe/core/controllerextensions/Share.js +5 -5
  50. package/src/sap/fe/core/controllerextensions/Share.ts +4 -4
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +17 -2
  53. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +2 -2
  54. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +1 -1
  55. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +3 -3
  56. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +3 -2
  57. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +49 -21
  58. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +64 -24
  59. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -3
  60. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +41 -8
  61. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -4
  62. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +6 -1
  63. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +6 -7
  64. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +5 -5
  65. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  66. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +2 -1
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +1 -0
  69. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
  70. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
  71. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +21 -15
  72. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +18 -15
  73. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -6
  74. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +8 -5
  75. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +9 -4
  76. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +10 -4
  77. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +3 -2
  78. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +2 -1
  79. package/src/sap/fe/core/converters/ManifestSettings.js +7 -1
  80. package/src/sap/fe/core/converters/ManifestSettings.ts +37 -0
  81. package/src/sap/fe/core/converters/ManifestWrapper.js +29 -9
  82. package/src/sap/fe/core/converters/ManifestWrapper.ts +29 -11
  83. package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  84. package/src/sap/fe/core/converters/MetaModelConverter.ts +1 -1
  85. package/src/sap/fe/core/converters/annotations/DataField.js +46 -19
  86. package/src/sap/fe/core/converters/annotations/DataField.ts +93 -19
  87. package/src/sap/fe/core/converters/common/AnnotationConverter.js +118 -39
  88. package/src/sap/fe/core/converters/controls/Common/Action.js +58 -21
  89. package/src/sap/fe/core/converters/controls/Common/Action.ts +72 -22
  90. package/src/sap/fe/core/converters/controls/Common/Chart.js +13 -3
  91. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -4
  92. package/src/sap/fe/core/converters/controls/Common/Form.js +18 -3
  93. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -1
  94. package/src/sap/fe/core/converters/controls/Common/Table.js +87 -22
  95. package/src/sap/fe/core/converters/controls/Common/Table.ts +112 -21
  96. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.js +243 -0
  97. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.ts +309 -0
  98. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +142 -58
  99. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +174 -79
  100. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -16
  101. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +6 -17
  102. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +16 -5
  103. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +16 -5
  104. package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -2
  105. package/src/sap/fe/core/converters/helpers/Aggregation.ts +11 -1
  106. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +27 -3
  107. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +28 -1
  108. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  109. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  110. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +10 -5
  111. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +13 -1
  112. package/src/sap/fe/core/converters/templates/ListReportConverter.js +11 -3
  113. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -4
  114. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +19 -8
  115. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -7
  116. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
  117. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
  118. package/src/sap/fe/core/flexibility/AppComponent.flexibility.js +55 -0
  119. package/src/sap/fe/core/flexibility/AppComponent.flexibility.ts +65 -0
  120. package/src/sap/fe/core/flexibility/XMLTools.js +71 -0
  121. package/src/sap/fe/core/flexibility/XMLTools.ts +61 -0
  122. package/src/sap/fe/core/fpm/manifest.json +2 -2
  123. package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
  124. package/src/sap/fe/core/helpers/AppStartupHelper.ts +92 -32
  125. package/src/sap/fe/core/helpers/DeleteHelper.js +13 -13
  126. package/src/sap/fe/core/helpers/DeleteHelper.ts +17 -15
  127. package/src/sap/fe/core/helpers/ManifestHelper.js +6 -3
  128. package/src/sap/fe/core/helpers/ManifestHelper.ts +3 -0
  129. package/src/sap/fe/core/helpers/MetaModelFunction.js +12 -3
  130. package/src/sap/fe/core/helpers/MetaModelFunction.ts +11 -3
  131. package/src/sap/fe/core/helpers/ModelHelper.js +47 -11
  132. package/src/sap/fe/core/helpers/ModelHelper.ts +62 -15
  133. package/src/sap/fe/core/helpers/PasteHelper.js +6 -2
  134. package/src/sap/fe/core/helpers/PasteHelper.ts +5 -7
  135. package/src/sap/fe/core/helpers/TypeGuards.js +12 -2
  136. package/src/sap/fe/core/helpers/TypeGuards.ts +10 -1
  137. package/src/sap/fe/core/helpers/WebSocket.js +6 -7
  138. package/src/sap/fe/core/helpers/WebSocket.ts +10 -6
  139. package/src/sap/fe/core/library.js +33 -3
  140. package/src/sap/fe/core/library.ts +31 -1
  141. package/src/sap/fe/core/messagebundle.properties +8 -1
  142. package/src/sap/fe/core/messagebundle_ar.properties +8 -1
  143. package/src/sap/fe/core/messagebundle_bg.properties +10 -3
  144. package/src/sap/fe/core/messagebundle_ca.properties +7 -0
  145. package/src/sap/fe/core/messagebundle_cnr.properties +7 -0
  146. package/src/sap/fe/core/messagebundle_cs.properties +7 -0
  147. package/src/sap/fe/core/messagebundle_cy.properties +8 -1
  148. package/src/sap/fe/core/messagebundle_da.properties +7 -0
  149. package/src/sap/fe/core/messagebundle_de.properties +7 -0
  150. package/src/sap/fe/core/messagebundle_el.properties +7 -0
  151. package/src/sap/fe/core/messagebundle_en.properties +8 -1
  152. package/src/sap/fe/core/messagebundle_en_GB.properties +7 -0
  153. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +8 -1
  154. package/src/sap/fe/core/messagebundle_es.properties +8 -1
  155. package/src/sap/fe/core/messagebundle_es_MX.properties +7 -0
  156. package/src/sap/fe/core/messagebundle_et.properties +7 -0
  157. package/src/sap/fe/core/messagebundle_fi.properties +7 -0
  158. package/src/sap/fe/core/messagebundle_fr.properties +16 -9
  159. package/src/sap/fe/core/messagebundle_fr_CA.properties +7 -0
  160. package/src/sap/fe/core/messagebundle_hi.properties +8 -1
  161. package/src/sap/fe/core/messagebundle_hr.properties +7 -0
  162. package/src/sap/fe/core/messagebundle_hu.properties +7 -0
  163. package/src/sap/fe/core/messagebundle_id.properties +7 -0
  164. package/src/sap/fe/core/messagebundle_it.properties +7 -0
  165. package/src/sap/fe/core/messagebundle_iw.properties +7 -0
  166. package/src/sap/fe/core/messagebundle_ja.properties +8 -1
  167. package/src/sap/fe/core/messagebundle_kk.properties +7 -0
  168. package/src/sap/fe/core/messagebundle_ko.properties +7 -0
  169. package/src/sap/fe/core/messagebundle_lt.properties +7 -0
  170. package/src/sap/fe/core/messagebundle_lv.properties +7 -0
  171. package/src/sap/fe/core/messagebundle_mk.properties +7 -0
  172. package/src/sap/fe/core/messagebundle_ms.properties +7 -0
  173. package/src/sap/fe/core/messagebundle_nl.properties +7 -0
  174. package/src/sap/fe/core/messagebundle_no.properties +9 -2
  175. package/src/sap/fe/core/messagebundle_pl.properties +7 -0
  176. package/src/sap/fe/core/messagebundle_pt.properties +7 -0
  177. package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -0
  178. package/src/sap/fe/core/messagebundle_ro.properties +7 -0
  179. package/src/sap/fe/core/messagebundle_ru.properties +7 -0
  180. package/src/sap/fe/core/messagebundle_sh.properties +7 -0
  181. package/src/sap/fe/core/messagebundle_sk.properties +7 -0
  182. package/src/sap/fe/core/messagebundle_sl.properties +7 -0
  183. package/src/sap/fe/core/messagebundle_sr.properties +7 -0
  184. package/src/sap/fe/core/messagebundle_sv.properties +7 -0
  185. package/src/sap/fe/core/messagebundle_th.properties +7 -0
  186. package/src/sap/fe/core/messagebundle_tr.properties +7 -0
  187. package/src/sap/fe/core/messagebundle_uk.properties +7 -0
  188. package/src/sap/fe/core/messagebundle_vi.properties +7 -0
  189. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -1
  190. package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -0
  191. package/src/sap/fe/core/rootView/Fcl.controller.js +21 -7
  192. package/src/sap/fe/core/rootView/Fcl.controller.ts +22 -5
  193. package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
  194. package/src/sap/fe/core/rootView/NavContainer.controller.ts +2 -1
  195. package/src/sap/fe/core/rootView/RootViewBaseController.js +96 -88
  196. package/src/sap/fe/core/rootView/RootViewBaseController.ts +106 -96
  197. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +1 -1
  198. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.ts +9 -9
  199. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +14 -10
  200. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -10
  201. package/src/sap/fe/core/services/RoutingServiceFactory.js +9 -4
  202. package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -6
  203. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +9 -7
  204. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -8
  205. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +57 -5
  206. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +69 -10
  207. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +33 -15
  208. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +31 -11
  209. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  210. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
  211. package/src/sap/fe/core/templating/UIFormatters.js +17 -2
  212. package/src/sap/fe/core/templating/UIFormatters.ts +25 -1
  213. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.js +10 -0
  214. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.ts +369 -0
  215. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.js +9 -0
  216. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.ts +49 -0
  217. package/ui5.yaml +2 -0
@@ -157,6 +157,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
157
157
  private entityTypeRegexPattern!: RegExp;
158
158
 
159
159
  private webSocketStatus!: WEBSOCKET_STATUS;
160
+
160
161
  // Interaction type for SideEffects events
161
162
  private interactionTypeDefinition?: SideEffectsEventsInteractionManifestSetting;
162
163
 
@@ -191,7 +192,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
191
192
  const channel = getWebSocketChannelUrl(ChannelType.SideEffectsEvents, model);
192
193
 
193
194
  if (url && channel) {
194
- this.webSocket = createWebSocket(ChannelType.SideEffectsEvents, model);
195
+ this.webSocket = createWebSocket(ChannelType.SideEffectsEvents, this.appComponent);
195
196
  this.webSocket.attachMessage(this.onSideEffectsEventReceived.bind(this));
196
197
  this.webSocketStatus = WEBSOCKET_STATUS.CONNECTED;
197
198
 
@@ -400,7 +401,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
400
401
  if (executionOptions.submitBatch != false) {
401
402
  context.getModel().submitBatch(groupId);
402
403
  }
403
- await action.execute(groupId, true);
404
+ await action.invoke(groupId, true);
404
405
  }
405
406
 
406
407
  /**
@@ -557,9 +558,8 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
557
558
  }
558
559
  };
559
560
  source.entityProperties.forEach((property) => {
560
- const commonAnno = property.annotations.Common as PropertyAnnotationsWithRecommendation;
561
- if (commonAnno?.RecommendationRole) {
562
- const roleType = commonAnno.RecommendationRole;
561
+ const roleType = (property.annotations.Common as PropertyAnnotationsWithRecommendation)?.RecommendationRole;
562
+ if (roleType) {
563
563
  if (roleType.valueOf().includes("Input")) {
564
564
  addRecommendationRoles(`${source.name}`);
565
565
  this.recommendationRegistry.roles[`${source.name}`].input.push(property.name);
@@ -583,6 +583,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
583
583
  * @returns True if field is has recommendation role - Input annotation
584
584
  */
585
585
  public checkIfFieldIsRecommendationRelevant(field: Control): boolean {
586
+ // Runtime call
586
587
  const context = field.getBindingContext();
587
588
  const propertyName = field.data().sourcePath.split("/").pop();
588
589
  if (context) {
@@ -610,6 +611,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
610
611
  * @returns Array of property names which are marked RecommendationRole Output
611
612
  */
612
613
  public getRecommendationOutputFields(entityTypeName: string): string[] {
614
+ // Runtime ish
613
615
  //TODO: We have to consider 1:1 navigation properties as well.
614
616
  const recommendationRolesForEntity = this.recommendationRegistry.roles[entityTypeName];
615
617
  if (recommendationRolesForEntity?.output?.length > 0) {
@@ -1127,9 +1129,12 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
1127
1129
  */
1128
1130
  private getSideEffectsAnnotationFromSource(source: EntityType | Action): CommonSideEffectTypeWithQualifier[] {
1129
1131
  const sideEffects: CommonSideEffectsType[] = [];
1130
- const commonAnnotation = source.annotations?.Common as undefined | unknown as Record<string, CommonSideEffectTypeWithQualifier>;
1131
- for (const key in commonAnnotation) {
1132
- const annotation = commonAnnotation[key];
1132
+ const commonAnnotation = source.annotations?.Common as unknown as
1133
+ | undefined
1134
+ | (Record<string, CommonSideEffectTypeWithQualifier> & { _keys?: string[] });
1135
+ const existingKeys = commonAnnotation?._keys?.filter((key) => key.startsWith("SideEffects")) ?? [];
1136
+ for (const key of existingKeys) {
1137
+ const annotation = commonAnnotation![key];
1133
1138
  if (this.isSideEffectsAnnotation(annotation)) {
1134
1139
  sideEffects.push(annotation);
1135
1140
  }
@@ -157,6 +157,10 @@ sap.ui.define(["sap/base/Log", "sap/base/i18n/Localization", "sap/fe/base/Bindin
157
157
  if (oViewSettings.preprocessors) {
158
158
  oViewSettings.preprocessors.xml.models["error"] = new JSONModel(reason);
159
159
  }
160
+ delete oViewSettings.cache;
161
+ oViewSettings.id += "-Error";
162
+ oViewSettings.viewData.stableId += "-Error";
163
+ delete oViewSettings.controller;
160
164
  return oComponent.runAsOwner(async () => {
161
165
  return View.create(oViewSettings).then(oView => {
162
166
  this.oView = oView;
@@ -180,7 +184,10 @@ sap.ui.define(["sap/base/Log", "sap/base/i18n/Localization", "sap/fe/base/Bindin
180
184
  let sFullContextPath = oAppComponent.getRoutingService().getTargetInformationFor(oComponent)?.options?.settings?.fullContextPath ?? "";
181
185
  if (!sFullContextPath) {
182
186
  // if the context path couldn't be retrieved from the routing service, try to get it from the component itself
183
- sFullContextPath = oComponent.getContextPath() ?? "";
187
+ const componentContextPath = oComponent.getContextPath();
188
+ if (componentContextPath) {
189
+ sFullContextPath = componentContextPath.endsWith("/") ? componentContextPath : `${componentContextPath}/`;
190
+ }
184
191
  }
185
192
  const oMetaModel = oAppComponent.getMetaModel();
186
193
  const oManifestContent = oAppComponent.getManifest();
@@ -290,17 +297,62 @@ sap.ui.define(["sap/base/Log", "sap/base/i18n/Localization", "sap/fe/base/Bindin
290
297
  oViewSettings = this._getViewSettings(preprocessorContext, mServiceSettings, oComponent, mViewData, sCacheKey, oPageModel, oResourceModel);
291
298
  // Setting the pageModel on the component for potential reuse
292
299
  oComponent.setModel(oPageModel, "_pageModel");
300
+ oComponent.setModel(oViewDataModel, "viewData");
301
+ const uiModel = oAppComponent.getModel("ui");
302
+ const internalModel = oAppComponent.getModel("internal");
303
+ oComponent.setModel(uiModel, "ui");
304
+ oComponent.setModel(internalModel, "internal");
305
+ oComponent.setModel(internalModel, "pageInternal");
306
+ const path = `/pages/${oViewSettings.id}`;
307
+ uiModel.setProperty(path, {
308
+ controls: {}
309
+ });
310
+ internalModel.setProperty(path, {
311
+ controls: {},
312
+ collaboration: {}
313
+ });
314
+ let targetUIModelContext = "/";
315
+ if (oComponent.isA("sap.fe.templates.ListReport.Component")) {
316
+ targetUIModelContext = `/${oViewSettings.id}`;
317
+ }
318
+ oComponent.setBindingContext(uiModel.createBindingContext(targetUIModelContext), "ui");
319
+ oComponent.setBindingContext(internalModel.createBindingContext(path), "internal");
320
+
321
+ // for the time being provide it also pageInternal as some macros access it - to be removed
322
+ oComponent.setBindingContext(internalModel.createBindingContext(path), "pageInternal");
293
323
  oComponent.setPreprocessorContext(preprocessorContext);
294
324
  return oComponent.runAsOwner(async () => {
295
325
  return View.create(oViewSettings).then(oView => {
296
326
  this.oView = oView;
297
327
  const viewJSONModel = new JSONModel(this.oView);
298
328
  ModelHelper.enhanceViewJSONModel(viewJSONModel);
299
- this.oView.setModel(viewJSONModel, "$view");
300
- this.oView.setModel(oViewDataModel, "viewData");
329
+ oComponent.setModel(viewJSONModel, "$view");
330
+ if (oAppComponent.hideViewDuringCreation && oComponent.isA("sap.fe.templates.ObjectPage.Component")) {
331
+ this.oView.setVisible(false);
332
+ }
301
333
  oComponent.setAggregation("rootControl", this.oView);
334
+ if (oAppComponent.eagerViewCreation) {
335
+ setTimeout(() => {
336
+ for (const navName in mNavigation) {
337
+ const routingTargets = oAppComponent.getRoutingService()._getRouteInformation(mNavigation[navName].detail.route)?.targetsWithInfo;
338
+ if (routingTargets) {
339
+ for (const routingTarget of routingTargets) {
340
+ const routingTargetName = typeof routingTarget === "string" ? routingTarget : routingTarget.name;
341
+ const routerTarget = oAppComponent.getRouter().getTarget(routingTargetName);
342
+ if (routerTarget && !Array.isArray(routerTarget)) {
343
+ routerTarget.load(routingTarget);
344
+ }
345
+ }
346
+ }
347
+ }
348
+ }, 2000); // Delay a bit to not block the initial rendering
349
+ }
302
350
  return sCacheKey;
303
- }).catch(async reason => this._createErrorPage(reason, oViewSettings, mServiceSettings.errorViewName || "sap.fe.core.services.view.TemplatingErrorPage", oComponent, sCacheKey)).catch(e => Log.error(e.message, e));
351
+ }).catch(async reason => {
352
+ oComponent.getRootController()?.destroy();
353
+ oComponent.setRootController();
354
+ return this._createErrorPage(reason, oViewSettings, mServiceSettings.errorViewName || "sap.fe.core.services.view.TemplatingErrorPage", oComponent, sCacheKey);
355
+ }).catch(e => Log.error(e.message, e));
304
356
  });
305
357
  } catch (error) {
306
358
  Log.error(error.message, error);
@@ -441,4 +493,4 @@ sap.ui.define(["sap/base/Log", "sap/base/i18n/Localization", "sap/fe/base/Bindin
441
493
  _exports.TemplatedViewServiceFactory = TemplatedViewServiceFactory;
442
494
  return _exports;
443
495
  }, false);
444
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUZW1wbGF0ZWRWaWV3U2VydmljZSIsIl9TZXJ2aWNlIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfZXhwb3J0cyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiaW5pdCIsImFTZXJ2aWNlRGVwZW5kZW5jaWVzIiwib0NvbnRleHQiLCJnZXRDb250ZXh0Iiwib0NvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50Iiwidmlld1ByZWxvYWRlclNlcnZpY2UiLCJnZXRWaWV3UHJlbG9hZGVyU2VydmljZSIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJwYWdlSWQiLCJnZXRMb2NhbElkIiwiZ2V0SWQiLCJzU3RhYmxlSWQiLCJnZXRNZXRhZGF0YSIsImdldENvbXBvbmVudE5hbWUiLCJhRW5oYW5jZUkxOG4iLCJnZXRFbmhhbmNlSTE4biIsInNBcHBOYW1lc3BhY2UiLCJvRmFjdG9yeSIsImZhY3RvcnkiLCJpIiwibGVuZ3RoIiwib1Jlc291cmNlTW9kZWwiLCJnZXRNb2RlbCIsImlzQSIsInJlcGxhY2UiLCJzQ2FjaGVJZGVudGlmaWVyIiwiZ2V0TmFtZSIsIkxvY2FsaXphdGlvbiIsImdldExhbmd1YWdlVGFnIiwicHVzaCIsIlNlcnZpY2VGYWN0b3J5UmVnaXN0cnkiLCJnZXQiLCJjcmVhdGVJbnN0YW5jZSIsInNjb3BlVHlwZSIsInNldHRpbmdzIiwiYnVuZGxlcyIsImVuaGFuY2VJMThuIiwibW9kZWxOYW1lIiwidGhlbiIsIm9SZXNvdXJjZU1vZGVsU2VydmljZSIsImdldFJlc291cmNlTW9kZWwiLCJtZXRhTW9kZWwiLCJhcHBDb21wb25lbnQiLCJjb21wb25lbnQiLCJvQ2FjaGVIYW5kbGVyU2VydmljZSIsImlzQ2FjaGVSZWFkeSIsInZhbGlkYXRlQ2FjaGVLZXkiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsIlZlcnNpb25JbmZvIiwibG9hZCIsIm9JbmZvIiwic1RpbWVzdGFtcCIsImxpYnJhcmllcyIsIkNvcmUiLCJidWlsZGluZm8iLCJidWlsZHRpbWUiLCJmb3JFYWNoIiwib0xpYnJhcnkiLCJidWlsZFRpbWVzdGFtcCIsImNhdGNoIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwiYWxsIiwiYURlcGVuZGVuY2llc1Jlc3VsdCIsInNDYWNoZUtleSIsIlRlbXBsYXRlQ29udmVydGVyIiwiTWV0YU1vZGVsQ29udmVydGVyIiwicmVxdWlyZURlcGVuZGVuY2llcyIsImNyZWF0ZVZpZXciLCJnZXRJbnN0YW5jZSIsImludmFsaWRhdGVJZk5lZWRlZCIsInJlZnJlc2hWaWV3Iiwib1Jvb3RWaWV3IiwiZ2V0Um9vdENvbnRyb2wiLCJkZXN0cm95Iiwib1ZpZXciLCJyZXNvdXJjZU1vZGVsIiwic3RhYmxlSWQiLCJnZXRVSUFyZWEiLCJpbnZhbGlkYXRlIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJfZ2V0Vmlld1NldHRpbmdzIiwicHJlcHJvY2Vzc29yQ29udGV4dCIsIm1TZXJ2aWNlU2V0dGluZ3MiLCJtVmlld0RhdGEiLCJvUGFnZU1vZGVsIiwidmlld1R5cGUiLCJnZXRWaWV3VHlwZSIsInVuZGVmaW5lZCIsInR5cGUiLCJwcmVwcm9jZXNzb3JzIiwieG1sIiwiY29udHJvbHMiLCJpZCIsInZpZXdOYW1lIiwiZ2V0Vmlld05hbWUiLCJ2aWV3RGF0YSIsImNhY2hlIiwia2V5cyIsImFkZGl0aW9uYWxEYXRhIiwiZ2V0QWRkaXRpb25hbENhY2hlRGF0YSIsImdldERhdGEiLCJzZXRBZGRpdGlvbmFsQ2FjaGVEYXRhIiwidmFsdWUiLCJzZXREYXRhIiwibW9kZWxzIiwiaGVpZ2h0IiwiX2NyZWF0ZUVycm9yUGFnZSIsInJlYXNvbiIsIm9WaWV3U2V0dGluZ3MiLCJtZXNzYWdlIiwiSlNPTk1vZGVsIiwicnVuQXNPd25lciIsIlZpZXciLCJjcmVhdGUiLCJzZXRNb2RlbCIsInNldEFnZ3JlZ2F0aW9uIiwiZ2V0Q29udHJvbGxlciIsImdldFBsYWNlaG9sZGVyIiwiaGlkZVJvb3RQbGFjZWhvbGRlciIsInNDb252ZXJ0ZXJUeXBlIiwiY29udmVydGVyVHlwZSIsInNGdWxsQ29udGV4dFBhdGgiLCJnZXRSb3V0aW5nU2VydmljZSIsImdldFRhcmdldEluZm9ybWF0aW9uRm9yIiwib3B0aW9ucyIsImZ1bGxDb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwib01hbmlmZXN0Q29udGVudCIsImdldE1hbmlmZXN0Iiwib0RldmljZU1vZGVsIiwiRGV2aWNlIiwic2V0RGVmYXVsdEJpbmRpbmdNb2RlIiwib01hbmlmZXN0TW9kZWwiLCJvVmlld0RhdGFNb2RlbCIsIm9Sb3V0aW5nU2VydmljZSIsImdldFNlcnZpY2UiLCJvVGFyZ2V0SW5mbyIsIm1PdXRib3VuZHMiLCJjcm9zc05hdmlnYXRpb24iLCJvdXRib3VuZHMiLCJtTmF2aWdhdGlvbiIsImdldE5hdmlnYXRpb24iLCJjb252ZXJ0ZWRNZXRhZGF0YSIsImNvbnZlcnRUeXBlcyIsImdldENhcGFiaWxpdGllcyIsIl9lbmhhbmNlTmF2aWdhdGlvbkNvbmZpZyIsImRlZmluaXRpb25Db250ZXh0IiwiRGVmaW5pdGlvbkNvbnRleHQiLCJhZGRBcHBsaWNhdGlvbk1hbmlmZXN0IiwibmF2aWdhdGlvbiIsInZpZXdMZXZlbCIsImNvbnRlbnREZW5zaXRpZXMiLCJpc0Rlc2t0b3AiLCJzeXN0ZW0iLCJkZXNrdG9wIiwiaXNQaG9uZSIsInBob25lIiwiVGVtcGxhdGVUeXBlIiwiRnJlZVN0eWxlUGFnZSIsImdldFZpZXdEYXRhIiwiT2JqZWN0IiwiYXNzaWduIiwiVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5Iiwic2V0UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzIiwiaXNTaGFyZUJ1dHRvblZpc2libGVGb3JNeUluYm94IiwiZ2V0U2hhcmVCdXR0b25WaXNpYmlsaXR5Rm9yTXlJbmJveCIsIm9TaGVsbFNlcnZpY2VzIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNoZWxsQ29udGVudERlbnNpdHkiLCJnZXRDb250ZW50RGVuc2l0eSIsInNhcGZlTWFuaWZlc3RDb250ZW50Iiwic2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IiwiZm9ybSIsImNvbnRyb2xDb25maWd1cmF0aW9uIiwic0Fubm90YXRpb25QYXRoIiwiaW5jbHVkZXMiLCJzVGFyZ2V0QW5ub3RhdGlvblBhdGgiLCJyZXNvbHZlRHluYW1pY0V4cHJlc3Npb24iLCJUZW1wbGF0ZU1vZGVsIiwib0RpYWdub3N0aWNzIiwiZ2V0RGlhZ25vc3RpY3MiLCJpSXNzdWVDb3VudCIsImdldElzc3VlcyIsIm9Db252ZXJ0ZXJQYWdlTW9kZWwiLCJjb252ZXJ0UGFnZSIsIk1hbmlmZXN0V3JhcHBlciIsIl9nZXRDb250cm9sbGVyTmFtZSIsImNvbnRyb2xsZXJOYW1lIiwiYUlzc3VlcyIsImFBZGRlZElzc3VlcyIsInNsaWNlIiwid2FybmluZyIsImFTcGxpdFBhdGgiLCJzcGxpdCIsInNFbnRpdHlTZXRQYXRoIiwiX2dldEZ1bGxQYXRoVG9FbnRpdHlTZXQiLCJiaW5kaW5nQ29udGV4dHMiLCJlbnRpdHlTZXQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsIm5vUmVzb2x2ZSIsImRldmljZSIsIm1hbmlmZXN0IiwiZ2V0Q29udmVydGVkTWV0YWRhdGEiLCJnZXREZWZpbml0aW9uQ29udGV4dCIsImdldERlZmluaXRpb25Gb3JQYWdlIiwiZW5kc1dpdGgiLCJzdWJzdHJpbmciLCJnZXRQYWdlRm9yIiwidmlld0lkIiwic2V0UHJlcHJvY2Vzc29yQ29udGV4dCIsInZpZXdKU09OTW9kZWwiLCJNb2RlbEhlbHBlciIsImVuaGFuY2VWaWV3SlNPTk1vZGVsIiwiZXJyb3JWaWV3TmFtZSIsImUiLCJFcnJvciIsImNvbnZlcnRlZFR5cGVzIiwibmF2aWdhdGlvbk9iamVjdEtleSIsIm5hdmlnYXRpb25PYmplY3QiLCJvdXRib3VuZENvbmZpZyIsImRldGFpbCIsIm91dGJvdW5kIiwib3V0Ym91bmREZXRhaWwiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsInBhcmFtZXRlcnMiLCJhdmFpbGFiaWxpdHkiLCJyZWdpc3RlclZpcnR1YWxQcm9wZXJ0eSIsInJvdXRlIiwicmVzb2x2ZUJpbmRpbmdTdHJpbmciLCJyZWR1Y2UiLCJzUGF0aFNvRmFyIiwic05leHRQYXRoUGFydCIsIm9UYXJnZXQiLCJnZXRPYmplY3QiLCJnZXRWaWV3IiwiZ2V0SW50ZXJmYWNlIiwiZXhpdCIsInJlbW92ZUdsb2JhbEluc3RhbmNlIiwiU2VydmljZSIsIl9TZXJ2aWNlRmFjdG9yeSIsIl90aGlzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJjYWxsIiwiX29JbnN0YW5jZVJlZ2lzdHJ5IiwiX3Byb3RvMiIsIm9TZXJ2aWNlQ29udGV4dCIsImlDcmVhdGluZ1ZpZXdzIiwib1RlbXBsYXRlZFZpZXdTZXJ2aWNlIiwiY29tcG9uZW50RGF0YSIsImdldENvbXBvbmVudERhdGEiLCJmZUVudmlyb25tZW50IiwiZ2V0U2hhcmVDb250cm9sVmlzaWJpbGl0eSIsImdldE51bWJlck9mVmlld3NJbkNyZWF0aW9uU3RhdGUiLCJ0YXJnZXRzIiwicm91dGluZyIsInJlYWxUYXJnZXQiLCJ0YXJnZXRUb0ZpbmQiLCJhY3R1YWxTZXR0aW5ncyIsImFwcGx5UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzIiwiU2VydmljZUZhY3RvcnkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbnZlcnRlZE1ldGFkYXRhIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNBUEpTT05TY2hlbWFGb3JXZWJBcHBsaWNhdGlvbk1hbmlmZXN0RmlsZSB9IGZyb20gXCJAdWk1L21hbmlmZXN0L3R5cGVzL21hbmlmZXN0XCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBMb2NhbGl6YXRpb24gZnJvbSBcInNhcC9iYXNlL2kxOG4vTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgeyByZXNvbHZlQmluZGluZ1N0cmluZyB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudERhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24sIFhNTFByZXByb2Nlc3NvckNvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IFN1cnZleUNvbmZpZyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHR5cGUge1xuXHRCYXNlTWFuaWZlc3RTZXR0aW5ncyxcblx0Q29udGVudERlbnNpdGllc1R5cGUsXG5cdENvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRNYW5pZmVzdEFjdGlvbixcblx0TWFuaWZlc3RIZWFkZXJGYWNldCxcblx0VmFyaWFudE1hbmFnZW1lbnRUeXBlXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IFRlbXBsYXRlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCBNYW5pZmVzdFdyYXBwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RXcmFwcGVyXCI7XG5pbXBvcnQgdHlwZSAqIGFzIF9NZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyByZWdpc3RlclZpcnR1YWxQcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgKiBhcyBfVGVtcGxhdGVDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhYmxlUmVjb3JkIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgRGVmaW5pdGlvblBhZ2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZGVmaW5pdGlvbi9GRURlZmluaXRpb25cIjtcbmltcG9ydCB7IERlZmluaXRpb25Db250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2RlZmluaXRpb24vRkVEZWZpbml0aW9uXCI7XG5pbXBvcnQgeyByZXF1aXJlRGVwZW5kZW5jaWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTG9hZGVyVXRpbHNcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgYXBwbHlQYWdlQ29uZmlndXJhdGlvbkNoYW5nZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvbWFuaWZlc3RNZXJnZXIvQ2hhbmdlUGFnZUNvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVIYW5kbGVyU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9DYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgdHlwZSBIaWVyYWNoeU1vZGUgYXMgQnJlYWRjcnVtYnNIaWVyYWNoeU1vZGUgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9CcmVhZGNydW1ic1wiO1xuaW1wb3J0IHR5cGUgeyBPdmVyZmxvd1Rvb2xiYXJQcmlvcml0eSB9IGZyb20gXCJzYXAvbS9saWJyYXJ5XCI7XG5pbXBvcnQgRGV2aWNlIGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgVmVyc2lvbkluZm8gZnJvbSBcInNhcC91aS9WZXJzaW9uSW5mb1wiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCB0eXBlIHsgTWFuaWZlc3RDb250ZW50LCBNYW5pZmVzdE91dGJvdW5kRW50cnksIFNoYXJlT3B0aW9ucyB9IGZyb20gXCJzYXAvdWkvY29yZS9NYW5pZmVzdFwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5UmVnaXN0cnlcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJ0eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcbmltcG9ydCB7IHJlc29sdmVEeW5hbWljRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9oZWxwZXJzL0R5bmFtaWNBbm5vdGF0aW9uUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZU1vZGVsU2VydmljZSB9IGZyb20gXCIuL1Jlc291cmNlTW9kZWxTZXJ2aWNlRmFjdG9yeVwiO1xuXG50eXBlIFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3MgPSB7XG5cdHZpZXdUeXBlPzogc3RyaW5nO1xuXHR2aWV3TmFtZT86IHN0cmluZztcbn07XG5cbnR5cGUgVmlld1NldHRpbmdzID0gUGFyYW1ldGVyczx0eXBlb2YgVmlldy5jcmVhdGU+WzBdICYgeyBjYWNoZTogdW5rbm93bjsgbW9kZWxzOiB1bmtub3duOyBoZWlnaHQ6IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgVmlld0RhdGEgPSB7XG5cdGJyZWFkY3J1bWJzSGllcmFyY2h5TW9kZT86IEJyZWFkY3J1bWJzSGllcmFjaHlNb2RlO1xuXHRmY2xFbmFibGVkPzogYm9vbGVhbjtcblx0ZWRpdGFibGVIZWFkZXJDb250ZW50PzogYm9vbGVhbjtcblx0aGlkZUZpbHRlckJhcj86IGJvb2xlYW47XG5cdHVzZUhpZGRlbkZpbHRlckJhcj86IGJvb2xlYW47XG5cdHNlY3Rpb25MYXlvdXQ/OiBzdHJpbmc7XG5cdGFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHM/OiBSZWNvcmQ8c3RyaW5nLCBTZW1hbnRpY09iamVjdD47XG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRuYXZpZ2F0aW9uOiBvYmplY3Q7XG5cdHZpZXdMZXZlbDogbnVtYmVyO1xuXHR2YXJpYW50TWFuYWdlbWVudD86IFZhcmlhbnRNYW5hZ2VtZW50VHlwZTtcblx0c3RhYmxlSWQ6IHN0cmluZztcblx0Y29udGVudERlbnNpdGllcz86IENvbnRlbnREZW5zaXRpZXNUeXBlO1xuXHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsO1xuXHRmdWxsQ29udGV4dFBhdGg6IHN0cmluZztcblx0aXNEZXNrdG9wOiBib29sZWFuO1xuXHRpc1Bob25lOiBib29sZWFuO1xuXHRjb252ZXJ0ZXJUeXBlOiBUZW1wbGF0ZVR5cGU7XG5cdHNoZWxsQ29udGVudERlbnNpdHk/OiBzdHJpbmc7XG5cdHVzZU5ld0xhenlMb2FkaW5nPzogYm9vbGVhbjtcblx0aW5pdGlhbExvYWQ/OiBzdHJpbmc7XG5cdGxpdmVNb2RlPzogYm9vbGVhbjtcblx0cmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdD86IGJvb2xlYW47XG5cdGNvbnRyb2xDb25maWd1cmF0aW9uPzogQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdHJlZnJlc2hTdHJhdGVneU9uQXBwUmVzdG9yZT86IHVua25vd247XG5cdGVudGl0eVNldD86IHN0cmluZztcblx0aXNTaGFyZUJ1dHRvblZpc2libGVGb3JNeUluYm94PzogYm9vbGVhbjtcblx0Y29udGV4dFBhdGg/OiBzdHJpbmc7XG5cdHNoYXJlPzogU2hhcmVPcHRpb25zO1xuXHRzaGFyZU92ZXJmbG93UHJpb3JpdHk/OiBPdmVyZmxvd1Rvb2xiYXJQcmlvcml0eTtcblx0c2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24/OiBNYW5pZmVzdENvbnRlbnRbXCJzYXAuZmVcIl07XG5cdGNvbnRlbnQ/OiB7XG5cdFx0ZmVlZGJhY2s/OiB7IGFjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBTdXJ2ZXlDb25maWc+OyBzdGFuZGFyZEFjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBTdXJ2ZXlDb25maWc+IH07XG5cdFx0aGVhZGVyPzoge1xuXHRcdFx0ZmFjZXRzPzogQ29uZmlndXJhYmxlUmVjb3JkPE1hbmlmZXN0SGVhZGVyRmFjZXQ+O1xuXHRcdFx0YWN0aW9ucz86IENvbmZpZ3VyYWJsZVJlY29yZDxNYW5pZmVzdEFjdGlvbj47XG5cdFx0fTtcblx0XHRmb290ZXI/OiB7XG5cdFx0XHRhY3Rpb25zPzogQ29uZmlndXJhYmxlUmVjb3JkPE1hbmlmZXN0QWN0aW9uPjtcblx0XHR9O1xuXHR9O1xufTtcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZWRWaWV3U2VydmljZSBleHRlbmRzIFNlcnZpY2U8VGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncz4ge1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8dm9pZD47XG5cblx0b1ZpZXchOiBWaWV3O1xuXG5cdG9SZXNvdXJjZU1vZGVsU2VydmljZSE6IFJlc291cmNlTW9kZWxTZXJ2aWNlO1xuXG5cdG9DYWNoZUhhbmRsZXJTZXJ2aWNlITogQ2FjaGVIYW5kbGVyU2VydmljZTtcblxuXHRvRmFjdG9yeSE6IFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeTtcblxuXHRyZXNvdXJjZU1vZGVsITogUmVzb3VyY2VNb2RlbDtcblxuXHRzdGFibGVJZCE6IHN0cmluZztcblxuXHRwYWdlSWQhOiBzdHJpbmc7XG5cblx0VGVtcGxhdGVDb252ZXJ0ZXI/OiB0eXBlb2YgX1RlbXBsYXRlQ29udmVydGVyO1xuXG5cdE1ldGFNb2RlbENvbnZlcnRlcj86IHR5cGVvZiBfTWV0YU1vZGVsQ29udmVydGVyO1xuXG5cdGluaXQoKTogdm9pZCB7XG5cdFx0Y29uc3QgYVNlcnZpY2VEZXBlbmRlbmNpZXMgPSBbXTtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udGV4dC5zY29wZU9iamVjdDtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9Db21wb25lbnQpO1xuXHRcdGNvbnN0IHZpZXdQcmVsb2FkZXJTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRWaWV3UHJlbG9hZGVyU2VydmljZSgpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdHRoaXMucGFnZUlkID0gb0FwcENvbXBvbmVudC5nZXRMb2NhbElkKG9Db21wb25lbnQuZ2V0SWQoKSkgYXMgc3RyaW5nO1xuXHRcdGNvbnN0IHNTdGFibGVJZCA9IGAke29BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXRDb21wb25lbnROYW1lKCl9Ojoke3RoaXMucGFnZUlkfWA7XG5cdFx0Y29uc3QgYUVuaGFuY2VJMThuID0gb0NvbXBvbmVudC5nZXRFbmhhbmNlSTE4bigpIHx8IFtdO1xuXHRcdGxldCBzQXBwTmFtZXNwYWNlO1xuXHRcdHRoaXMub0ZhY3RvcnkgPSBvQ29udGV4dC5mYWN0b3J5O1xuXHRcdGlmIChhRW5oYW5jZUkxOG4pIHtcblx0XHRcdHNBcHBOYW1lc3BhY2UgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFkYXRhKCkuZ2V0Q29tcG9uZW50TmFtZSgpO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhRW5oYW5jZUkxOG4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Ly8gSW4gb3JkZXIgdG8gc3VwcG9ydCB0ZXh0LXZlcnRpY2FsaXphdGlvbiBhcHBsaWNhdGlvbnMgY2FuIGFsc28gcGFzcyBhIHJlc291cmNlIG1vZGVsIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHRcdC8vIFVJNSB0YWtlcyBjYXJlIG9mIHRleHQtdmVydGljYWxpemF0aW9uIGZvciByZXNvdXJjZSBtb2RlbHMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0Ly8gSGVuY2UgY2hlY2sgaWYgdGhlIGdpdmVuIGtleSBpcyBhIHJlc291cmNlIG1vZGVsIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHRcdC8vIGlmIHNvIHRoaXMgbW9kZWwgc2hvdWxkIGJlIHVzZWQgdG8gZW5oYW5jZSB0aGUgc2FwLmZlIHJlc291cmNlIG1vZGVsIHNvIHBhc3MgaXQgYXMgaXQgaXNcblx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1vZGVsKGFFbmhhbmNlSTE4bltpXSk7XG5cdFx0XHRcdGlmIChvUmVzb3VyY2VNb2RlbCAmJiBvUmVzb3VyY2VNb2RlbC5pc0EoXCJzYXAudWkubW9kZWwucmVzb3VyY2UuUmVzb3VyY2VNb2RlbFwiKSkge1xuXHRcdFx0XHRcdGFFbmhhbmNlSTE4bltpXSA9IG9SZXNvdXJjZU1vZGVsO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFFbmhhbmNlSTE4bltpXSA9IGAke3NBcHBOYW1lc3BhY2V9LiR7YUVuaGFuY2VJMThuW2ldLnJlcGxhY2UoXCIucHJvcGVydGllc1wiLCBcIlwiKX1gO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IHNDYWNoZUlkZW50aWZpZXIgPSBgJHtvQXBwQ29tcG9uZW50LmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpfV8ke3NTdGFibGVJZH1fJHtMb2NhbGl6YXRpb24uZ2V0TGFuZ3VhZ2VUYWcoKX1gO1xuXHRcdGFTZXJ2aWNlRGVwZW5kZW5jaWVzLnB1c2goXG5cdFx0XHRTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5LmdldChcInNhcC5mZS5jb3JlLnNlcnZpY2VzLlJlc291cmNlTW9kZWxTZXJ2aWNlXCIpXG5cdFx0XHRcdC5jcmVhdGVJbnN0YW5jZSh7XG5cdFx0XHRcdFx0c2NvcGVUeXBlOiBcImNvbXBvbmVudFwiLFxuXHRcdFx0XHRcdHNjb3BlT2JqZWN0OiBvQ29tcG9uZW50LFxuXHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRidW5kbGVzOiBbXCJzYXAuZmUuY29yZS5tZXNzYWdlYnVuZGxlXCIsIFwic2FwLmZlLm1hY3Jvcy5tZXNzYWdlYnVuZGxlXCIsIFwic2FwLmZlLnRlbXBsYXRlcy5tZXNzYWdlYnVuZGxlXCJdLFxuXHRcdFx0XHRcdFx0ZW5oYW5jZUkxOG46IGFFbmhhbmNlSTE4bixcblx0XHRcdFx0XHRcdG1vZGVsTmFtZTogXCJzYXAuZmUuaTE4blwiXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbigob1Jlc291cmNlTW9kZWxTZXJ2aWNlOiBSZXNvdXJjZU1vZGVsU2VydmljZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMub1Jlc291cmNlTW9kZWxTZXJ2aWNlID0gb1Jlc291cmNlTW9kZWxTZXJ2aWNlO1xuXHRcdFx0XHRcdHJldHVybiBvUmVzb3VyY2VNb2RlbFNlcnZpY2UuZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdFx0YVNlcnZpY2VEZXBlbmRlbmNpZXMucHVzaChcblx0XHRcdFNlcnZpY2VGYWN0b3J5UmVnaXN0cnkuZ2V0KFwic2FwLmZlLmNvcmUuc2VydmljZXMuQ2FjaGVIYW5kbGVyU2VydmljZVwiKVxuXHRcdFx0XHQuY3JlYXRlSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQ6IG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRjb21wb25lbnQ6IG9Db21wb25lbnRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKGFzeW5jIChvQ2FjaGVIYW5kbGVyU2VydmljZTogQ2FjaGVIYW5kbGVyU2VydmljZSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4gPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHZpZXdQcmVsb2FkZXJTZXJ2aWNlLmlzQ2FjaGVSZWFkeSgpO1xuXHRcdFx0XHRcdHRoaXMub0NhY2hlSGFuZGxlclNlcnZpY2UgPSBvQ2FjaGVIYW5kbGVyU2VydmljZTtcblx0XHRcdFx0XHRyZXR1cm4gb0NhY2hlSGFuZGxlclNlcnZpY2UudmFsaWRhdGVDYWNoZUtleShzQ2FjaGVJZGVudGlmaWVyLCBvQ29tcG9uZW50LCBvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkpO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdFx0YVNlcnZpY2VEZXBlbmRlbmNpZXMucHVzaChcblx0XHRcdFZlcnNpb25JbmZvLmxvYWQoKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0luZm8pIHtcblx0XHRcdFx0XHRsZXQgc1RpbWVzdGFtcCA9IFwiXCI7XG5cdFx0XHRcdFx0aWYgKCFvSW5mby5saWJyYXJpZXMpIHtcblx0XHRcdFx0XHRcdHNUaW1lc3RhbXAgPSAoQ29yZSBhcyB7IGJ1aWxkaW5mbz86IHsgYnVpbGR0aW1lPzogc3RyaW5nIH0gfSk/LmJ1aWxkaW5mbz8uYnVpbGR0aW1lID8/IFwiPE5PVkFMVUU+XCI7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9JbmZvLmxpYnJhcmllcy5mb3JFYWNoKGZ1bmN0aW9uIChvTGlicmFyeSkge1xuXHRcdFx0XHRcdFx0XHRzVGltZXN0YW1wICs9IG9MaWJyYXJ5LmJ1aWxkVGltZXN0YW1wO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBzVGltZXN0YW1wO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBcIjxOT1ZBTFVFPlwiO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdFx0dGhpcy5pbml0UHJvbWlzZSA9IFByb21pc2UuYWxsKGFTZXJ2aWNlRGVwZW5kZW5jaWVzKVxuXHRcdFx0LnRoZW4oYXN5bmMgKGFEZXBlbmRlbmNpZXNSZXN1bHQ6IHVua25vd25bXSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VNb2RlbCA9IGFEZXBlbmRlbmNpZXNSZXN1bHRbMF0gYXMgUmVzb3VyY2VNb2RlbDtcblx0XHRcdFx0Y29uc3Qgc0NhY2hlS2V5ID0gYURlcGVuZGVuY2llc1Jlc3VsdFsxXSBhcyBzdHJpbmcgfCBudWxsO1xuXHRcdFx0XHRjb25zdCBbVGVtcGxhdGVDb252ZXJ0ZXIsIE1ldGFNb2RlbENvbnZlcnRlcl0gPSBhd2FpdCByZXF1aXJlRGVwZW5kZW5jaWVzKFtcblx0XHRcdFx0XHRcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIixcblx0XHRcdFx0XHRcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCJcblx0XHRcdFx0XSk7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZVZpZXcoXG5cdFx0XHRcdFx0b1Jlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0c1N0YWJsZUlkLFxuXHRcdFx0XHRcdHNDYWNoZUtleSxcblx0XHRcdFx0XHRUZW1wbGF0ZUNvbnZlcnRlciBhcyB0eXBlb2YgX1RlbXBsYXRlQ29udmVydGVyLFxuXHRcdFx0XHRcdE1ldGFNb2RlbENvbnZlcnRlciBhcyB0eXBlb2YgX01ldGFNb2RlbENvbnZlcnRlclxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChzQ2FjaGVLZXk6IHN0cmluZyB8IHZvaWQgfCBudWxsKTogdm9pZCB7XG5cdFx0XHRcdGNvbnN0IG9DYWNoZUhhbmRsZXJTZXJ2aWNlID0gU2VydmljZUZhY3RvcnlSZWdpc3RyeS5nZXQoXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy5DYWNoZUhhbmRsZXJTZXJ2aWNlXCIpLmdldEluc3RhbmNlKG9NZXRhTW9kZWwpO1xuXHRcdFx0XHRvQ2FjaGVIYW5kbGVyU2VydmljZS5pbnZhbGlkYXRlSWZOZWVkZWQoXG5cdFx0XHRcdFx0c0NhY2hlS2V5LFxuXHRcdFx0XHRcdHNDYWNoZUlkZW50aWZpZXIsXG5cdFx0XHRcdFx0b0NvbXBvbmVudCxcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKClcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVmcmVzaCB0aGUgY3VycmVudCB2aWV3IHVzaW5nIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gYXMgYmVmb3JlLlxuXHQgKiBAcGFyYW0gb0NvbXBvbmVudFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgaW5kaWNhdGluZyB3aGVuIHRoZSB2aWV3IGlzIHJlZnJlc2hlZFxuXHQgKi9cblx0YXN5bmMgcmVmcmVzaFZpZXcob0NvbXBvbmVudDogVGVtcGxhdGVDb21wb25lbnQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvUm9vdFZpZXcgPSBvQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCk7XG5cdFx0aWYgKG9Sb290Vmlldykge1xuXHRcdFx0b1Jvb3RWaWV3LmRlc3Ryb3koKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMub1ZpZXcpIHtcblx0XHRcdHRoaXMub1ZpZXcuZGVzdHJveSgpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVWaWV3KHRoaXMucmVzb3VyY2VNb2RlbCwgdGhpcy5zdGFibGVJZCwgXCJcIiwgdGhpcy5UZW1wbGF0ZUNvbnZlcnRlciEsIHRoaXMuTWV0YU1vZGVsQ29udmVydGVyISlcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0b0NvbXBvbmVudC5nZXRVSUFyZWEoKS5pbnZhbGlkYXRlKCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRvQ29tcG9uZW50LmdldFVJQXJlYSgpLmludmFsaWRhdGUoKTtcblx0XHRcdFx0TG9nLmVycm9yKG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRfZ2V0Vmlld1NldHRpbmdzKFxuXHRcdHByZXByb2Nlc3NvckNvbnRleHQ6IFhNTFByZXByb2Nlc3NvckNvbnRleHQsXG5cdFx0bVNlcnZpY2VTZXR0aW5nczogVGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncyxcblx0XHRvQ29tcG9uZW50OiBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD4sXG5cdFx0bVZpZXdEYXRhOiBWaWV3RGF0YSxcblx0XHRzQ2FjaGVLZXk6IHN0cmluZyB8IG51bGwsXG5cdFx0b1BhZ2VNb2RlbDogSlNPTk1vZGVsLFxuXHRcdG9SZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsXG5cdCk6IFZpZXdTZXR0aW5ncyB7XG5cdFx0bGV0IHZpZXdUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBtU2VydmljZVNldHRpbmdzLnZpZXdUeXBlIHx8IG9Db21wb25lbnQuZ2V0Vmlld1R5cGUoKSB8fCBcIlhNTFwiO1xuXHRcdGlmICh2aWV3VHlwZSAhPT0gXCJYTUxcIikge1xuXHRcdFx0dmlld1R5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR0eXBlOiB2aWV3VHlwZSxcblx0XHRcdHByZXByb2Nlc3NvcnM6IHtcblx0XHRcdFx0eG1sOiBwcmVwcm9jZXNzb3JDb250ZXh0LFxuXHRcdFx0XHRjb250cm9sczoge31cblx0XHRcdH0sXG5cdFx0XHRpZDogbVZpZXdEYXRhLnN0YWJsZUlkLFxuXHRcdFx0dmlld05hbWU6IG1TZXJ2aWNlU2V0dGluZ3Mudmlld05hbWUgfHwgb0NvbXBvbmVudC5nZXRWaWV3TmFtZT8uKCksXG5cdFx0XHR2aWV3RGF0YTogbVZpZXdEYXRhLFxuXHRcdFx0Y2FjaGU6IHtcblx0XHRcdFx0a2V5czogW3NDYWNoZUtleV0sXG5cdFx0XHRcdGFkZGl0aW9uYWxEYXRhOiB7XG5cdFx0XHRcdFx0Ly8gV2Ugc3RvcmUgdGhlIHBhZ2UgbW9kZWwgZGF0YSBpbiB0aGUgYGFkZGl0aW9uYWxEYXRhYCBvZiB0aGUgdmlldyBjYWNoZSwgdGhpcyB3YXkgaXQgaXMgYWx3YXlzIGluIHN5bmNcblx0XHRcdFx0XHRnZXRBZGRpdGlvbmFsQ2FjaGVEYXRhOiAoKTogdW5rbm93biA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1BhZ2VNb2RlbC5nZXREYXRhKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRzZXRBZGRpdGlvbmFsQ2FjaGVEYXRhOiAodmFsdWU6IG9iamVjdCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0b1BhZ2VNb2RlbC5zZXREYXRhKHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XCJzYXAuZmUuaTE4blwiOiBvUmVzb3VyY2VNb2RlbFxuXHRcdFx0fSxcblx0XHRcdGhlaWdodDogXCIxMDAlXCJcblx0XHR9O1xuXHR9XG5cblx0YXN5bmMgX2NyZWF0ZUVycm9yUGFnZShcblx0XHRyZWFzb246IEVycm9yLFxuXHRcdG9WaWV3U2V0dGluZ3M6IFZpZXdTZXR0aW5ncyxcblx0XHR2aWV3TmFtZTogc3RyaW5nLFxuXHRcdG9Db21wb25lbnQ6IFRlbXBsYXRlQ29tcG9uZW50LFxuXHRcdHNDYWNoZUtleTogc3RyaW5nIHwgbnVsbFxuXHQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdC8vIGp1c3QgcmVwbGFjZSB0aGUgdmlldyBuYW1lIGFuZCBhIG1vZGVsIGNvbnRhaW5pbmcgdGhlIHJlYXNvbiwgYnV0IGtlZXAgdGhlIG90aGVyIHNldHRpbmdzXG5cdFx0TG9nLmVycm9yKHJlYXNvbi5tZXNzYWdlLCByZWFzb24pO1xuXHRcdG9WaWV3U2V0dGluZ3Mudmlld05hbWUgPSB2aWV3TmFtZTtcblx0XHRpZiAob1ZpZXdTZXR0aW5ncy5wcmVwcm9jZXNzb3JzKSB7XG5cdFx0XHQob1ZpZXdTZXR0aW5ncy5wcmVwcm9jZXNzb3JzIGFzIFJlY29yZDxzdHJpbmcsIHsgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbD4gfT4pLnhtbC5tb2RlbHNbXCJlcnJvclwiXSA9IG5ldyBKU09OTW9kZWwocmVhc29uKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb0NvbXBvbmVudC5ydW5Bc093bmVyKGFzeW5jICgpID0+IHtcblx0XHRcdHJldHVybiBWaWV3LmNyZWF0ZShvVmlld1NldHRpbmdzKS50aGVuKChvVmlldzogVmlldykgPT4ge1xuXHRcdFx0XHR0aGlzLm9WaWV3ID0gb1ZpZXc7XG5cdFx0XHRcdHRoaXMub1ZpZXcuc2V0TW9kZWwobmV3IEpTT05Nb2RlbCh0aGlzLm9WaWV3KSwgXCIkdmlld1wiKTtcblx0XHRcdFx0b0NvbXBvbmVudC5zZXRBZ2dyZWdhdGlvbihcInJvb3RDb250cm9sXCIsIHRoaXMub1ZpZXcpO1xuXHRcdFx0XHRvQ29tcG9uZW50LmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RDb250cm9sKCkuZ2V0Q29udHJvbGxlcigpLmdldFBsYWNlaG9sZGVyKCkuaGlkZVJvb3RQbGFjZWhvbGRlcigpO1xuXHRcdFx0XHRyZXR1cm4gc0NhY2hlS2V5O1xuXHRcdFx0fSk7XG5cdFx0fSkgYXMgUHJvbWlzZTxzdHJpbmc+O1xuXHR9XG5cblx0YXN5bmMgY3JlYXRlVmlldyhcblx0XHRvUmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRzU3RhYmxlSWQ6IHN0cmluZyxcblx0XHRzQ2FjaGVLZXk6IHN0cmluZyB8IG51bGwsXG5cdFx0VGVtcGxhdGVDb252ZXJ0ZXI6IHR5cGVvZiBfVGVtcGxhdGVDb252ZXJ0ZXIsXG5cdFx0TWV0YU1vZGVsQ29udmVydGVyOiB0eXBlb2YgX01ldGFNb2RlbENvbnZlcnRlclxuXHQpOiBQcm9taXNlPHN0cmluZyB8IG51bGwgfCB2b2lkPiB7XG5cdFx0dGhpcy5yZXNvdXJjZU1vZGVsID0gb1Jlc291cmNlTW9kZWw7XG5cdFx0dGhpcy5zdGFibGVJZCA9IHNTdGFibGVJZDtcblx0XHR0aGlzLlRlbXBsYXRlQ29udmVydGVyID0gVGVtcGxhdGVDb252ZXJ0ZXI7XG5cdFx0dGhpcy5NZXRhTW9kZWxDb252ZXJ0ZXIgPSBNZXRhTW9kZWxDb252ZXJ0ZXI7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHRjb25zdCBtU2VydmljZVNldHRpbmdzID0gb0NvbnRleHQuc2V0dGluZ3M7XG5cdFx0Y29uc3Qgc0NvbnZlcnRlclR5cGUgPSBtU2VydmljZVNldHRpbmdzLmNvbnZlcnRlclR5cGU7XG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db250ZXh0LnNjb3BlT2JqZWN0IGFzIEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50Pjtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9Db21wb25lbnQpO1xuXHRcdGxldCBzRnVsbENvbnRleHRQYXRoOiBzdHJpbmcgPVxuXHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKG9Db21wb25lbnQpPy5vcHRpb25zPy5zZXR0aW5ncz8uZnVsbENvbnRleHRQYXRoID8/IFwiXCI7XG5cdFx0aWYgKCFzRnVsbENvbnRleHRQYXRoKSB7XG5cdFx0XHQvLyBpZiB0aGUgY29udGV4dCBwYXRoIGNvdWxkbid0IGJlIHJldHJpZXZlZCBmcm9tIHRoZSByb3V0aW5nIHNlcnZpY2UsIHRyeSB0byBnZXQgaXQgZnJvbSB0aGUgY29tcG9uZW50IGl0c2VsZlxuXHRcdFx0c0Z1bGxDb250ZXh0UGF0aCA9IG9Db21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSA/PyBcIlwiO1xuXHRcdH1cblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBvTWFuaWZlc3RDb250ZW50ID0gb0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpO1xuXHRcdGNvbnN0IG9EZXZpY2VNb2RlbCA9IG5ldyBKU09OTW9kZWwoRGV2aWNlKS5zZXREZWZhdWx0QmluZGluZ01vZGUoXCJPbmVXYXlcIik7XG5cdFx0Y29uc3Qgb01hbmlmZXN0TW9kZWwgPSBuZXcgSlNPTk1vZGVsKG9NYW5pZmVzdENvbnRlbnQpO1xuXHRcdGxldCBvUGFnZU1vZGVsOiBUZW1wbGF0ZU1vZGVsLCBvVmlld0RhdGFNb2RlbDogTW9kZWwsIG1WaWV3RGF0YTogVmlld0RhdGE7XG5cdFx0Ly8gTG9hZCB0aGUgaW5kZXggZm9yIHRoZSBhZGRpdGlvbmFsIGJ1aWxkaW5nIGJsb2NrcyB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZW1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb1JvdXRpbmdTZXJ2aWNlID0gYXdhaXQgb0FwcENvbXBvbmVudC5nZXRTZXJ2aWNlKFwicm91dGluZ1NlcnZpY2VcIik7XG5cdFx0XHQvLyBSZXRyaWV2ZSB0aGUgdmlld0xldmVsIGZvciB0aGUgY29tcG9uZW50XG5cdFx0XHRjb25zdCBvVGFyZ2V0SW5mbyA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcihvQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IG1PdXRib3VuZHMgPVxuXHRcdFx0XHQob01hbmlmZXN0Q29udGVudFtcInNhcC5hcHBcIl0gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXS5jcm9zc05hdmlnYXRpb24gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXS5jcm9zc05hdmlnYXRpb24ub3V0Ym91bmRzKSB8fFxuXHRcdFx0XHR7fTtcblx0XHRcdGNvbnN0IG1OYXZpZ2F0aW9uID0gb0NvbXBvbmVudC5nZXROYXZpZ2F0aW9uKCkgfHwge307XG5cdFx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IE1ldGFNb2RlbENvbnZlcnRlci5jb252ZXJ0VHlwZXMoXG5cdFx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX2VuaGFuY2VOYXZpZ2F0aW9uQ29uZmlnKG1OYXZpZ2F0aW9uLCBtT3V0Ym91bmRzLCBjb252ZXJ0ZWRNZXRhZGF0YSwgc1N0YWJsZUlkKTtcblx0XHRcdGNvbnN0IGRlZmluaXRpb25Db250ZXh0ID0gbmV3IERlZmluaXRpb25Db250ZXh0KGNvbnZlcnRlZE1ldGFkYXRhKTtcblx0XHRcdGRlZmluaXRpb25Db250ZXh0LmFkZEFwcGxpY2F0aW9uTWFuaWZlc3Qob01hbmlmZXN0Q29udGVudCBhcyBTQVBKU09OU2NoZW1hRm9yV2ViQXBwbGljYXRpb25NYW5pZmVzdEZpbGUpO1xuXG5cdFx0XHRtVmlld0RhdGEgPSB7XG5cdFx0XHRcdGFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCxcblx0XHRcdFx0bmF2aWdhdGlvbjogbU5hdmlnYXRpb24sXG5cdFx0XHRcdHZpZXdMZXZlbDogb1RhcmdldEluZm8/LnZpZXdMZXZlbCxcblx0XHRcdFx0c3RhYmxlSWQ6IHNTdGFibGVJZCxcblx0XHRcdFx0Y29udGVudERlbnNpdGllczogb01hbmlmZXN0Q29udGVudFtcInNhcC51aTVcIl0/LmNvbnRlbnREZW5zaXRpZXMsXG5cdFx0XHRcdHJlc291cmNlTW9kZWw6IG9SZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRmdWxsQ29udGV4dFBhdGg6IHNGdWxsQ29udGV4dFBhdGgsXG5cdFx0XHRcdGlzRGVza3RvcDogRGV2aWNlLnN5c3RlbS5kZXNrdG9wLFxuXHRcdFx0XHRpc1Bob25lOiBEZXZpY2Uuc3lzdGVtLnBob25lLFxuXHRcdFx0XHRjb252ZXJ0ZXJUeXBlOiBUZW1wbGF0ZVR5cGUuRnJlZVN0eWxlUGFnZVxuXHRcdFx0fTtcblx0XHRcdGlmIChvQ29tcG9uZW50LmdldFZpZXdEYXRhKSB7XG5cdFx0XHRcdE9iamVjdC5hc3NpZ24obVZpZXdEYXRhLCBvQ29tcG9uZW50LmdldFZpZXdEYXRhKCkpO1xuXHRcdFx0XHRtVmlld0RhdGEgPSBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3Rvcnkuc2V0UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzKFxuXHRcdFx0XHRcdG9NYW5pZmVzdENvbnRlbnQsXG5cdFx0XHRcdFx0bVZpZXdEYXRhLFxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0dGhpcy5wYWdlSWRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1WaWV3RGF0YS5pc1NoYXJlQnV0dG9uVmlzaWJsZUZvck15SW5ib3ggPSBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuZ2V0U2hhcmVCdXR0b25WaXNpYmlsaXR5Rm9yTXlJbmJveChvQXBwQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IG9TaGVsbFNlcnZpY2VzID0gb0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cdFx0XHRtVmlld0RhdGEuY29udmVydGVyVHlwZSA9IHNDb252ZXJ0ZXJUeXBlO1xuXHRcdFx0bVZpZXdEYXRhLnNoZWxsQ29udGVudERlbnNpdHkgPSBvU2hlbGxTZXJ2aWNlcy5nZXRDb250ZW50RGVuc2l0eSgpO1xuXHRcdFx0Y29uc3Qgc2FwZmVNYW5pZmVzdENvbnRlbnQgPSBvTWFuaWZlc3RDb250ZW50W1wic2FwLmZlXCJdO1xuXHRcdFx0bVZpZXdEYXRhLnNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gb01hbmlmZXN0Q29udGVudFtcInNhcC5mZVwiXTtcblx0XHRcdG1WaWV3RGF0YS5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0ID0gc2FwZmVNYW5pZmVzdENvbnRlbnQ/LmZvcm1cblx0XHRcdFx0PyBzYXBmZU1hbmlmZXN0Q29udGVudD8uZm9ybT8ucmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdFxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdG9WaWV3RGF0YU1vZGVsID0gbmV3IEpTT05Nb2RlbChtVmlld0RhdGEpO1xuXHRcdFx0aWYgKG1WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbikge1xuXHRcdFx0XHRmb3IgKGNvbnN0IHNBbm5vdGF0aW9uUGF0aCBpbiBtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24pIHtcblx0XHRcdFx0XHRpZiAoc0Fubm90YXRpb25QYXRoLmluY2x1ZGVzKFwiW1wiKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc1RhcmdldEFubm90YXRpb25QYXRoID0gcmVzb2x2ZUR5bmFtaWNFeHByZXNzaW9uKHNBbm5vdGF0aW9uUGF0aCwgb01ldGFNb2RlbCk7XG5cdFx0XHRcdFx0XHRtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb25bc1RhcmdldEFubm90YXRpb25QYXRoXSA9IG1WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbltzQW5ub3RhdGlvblBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvUGFnZU1vZGVsID0gbmV3IFRlbXBsYXRlTW9kZWwoKCkgPT4ge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IG9EaWFnbm9zdGljcyA9IG9BcHBDb21wb25lbnQuZ2V0RGlhZ25vc3RpY3MoKTtcblx0XHRcdFx0XHRjb25zdCBpSXNzdWVDb3VudCA9IG9EaWFnbm9zdGljcy5nZXRJc3N1ZXMoKS5sZW5ndGg7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnZlcnRlclBhZ2VNb2RlbCA9IFRlbXBsYXRlQ29udmVydGVyLmNvbnZlcnRQYWdlKFxuXHRcdFx0XHRcdFx0c0NvbnZlcnRlclR5cGUsXG5cdFx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0bVZpZXdEYXRhIGFzIHVua25vd24gYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3MsXG5cdFx0XHRcdFx0XHRuZXcgTWFuaWZlc3RXcmFwcGVyKG1WaWV3RGF0YSBhcyB1bmtub3duIGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzLCBvQXBwQ29tcG9uZW50KSxcblx0XHRcdFx0XHRcdG9EaWFnbm9zdGljcyxcblx0XHRcdFx0XHRcdHNGdWxsQ29udGV4dFBhdGgsXG5cdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkuZ2V0Q2FwYWJpbGl0aWVzKCksXG5cdFx0XHRcdFx0XHRvQ29tcG9uZW50XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRpZiAob0NvbnZlcnRlclBhZ2VNb2RlbCAmJiBvQ29tcG9uZW50Ll9nZXRDb250cm9sbGVyTmFtZSgpKSB7XG5cdFx0XHRcdFx0XHQob0NvbnZlcnRlclBhZ2VNb2RlbCBhcyB7IGNvbnRyb2xsZXJOYW1lPzogc3RyaW5nIH0pLmNvbnRyb2xsZXJOYW1lID0gb0NvbXBvbmVudC5fZ2V0Q29udHJvbGxlck5hbWUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYUlzc3VlcyA9IG9EaWFnbm9zdGljcy5nZXRJc3N1ZXMoKTtcblx0XHRcdFx0XHRjb25zdCBhQWRkZWRJc3N1ZXMgPSBhSXNzdWVzLnNsaWNlKGlJc3N1ZUNvdW50KTtcblx0XHRcdFx0XHRpZiAoYUFkZGVkSXNzdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdExvZy53YXJuaW5nKFxuXHRcdFx0XHRcdFx0XHRcIlNvbWUgaXNzdWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiB5b3VyIHByb2plY3QsIHBsZWFzZSBjaGVjayB0aGUgVUk1IHN1cHBvcnQgYXNzaXN0YW50IHJ1bGUgZm9yIHNhcC5mZS5jb3JlXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBvQ29udmVydGVyUGFnZU1vZGVsO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5lcnJvcihlcnJvciBhcyBzdHJpbmcsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHR9XG5cdFx0XHR9LCBvTWV0YU1vZGVsKTtcblx0XHRcdGNvbnN0IGFTcGxpdFBhdGggPSBzRnVsbENvbnRleHRQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gdGhpcy5fZ2V0RnVsbFBhdGhUb0VudGl0eVNldChhU3BsaXRQYXRoLCBvTWV0YU1vZGVsKTtcblx0XHRcdGNvbnN0IHByZXByb2Nlc3NvckNvbnRleHQ6IFhNTFByZXByb2Nlc3NvckNvbnRleHQgPSB7XG5cdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IHNFbnRpdHlTZXRQYXRoID8gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRW50aXR5U2V0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0ZnVsbENvbnRleHRQYXRoOiBzRnVsbENvbnRleHRQYXRoID8gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVsbENvbnRleHRQYXRoKSA6IG51bGwsXG5cdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogc0Z1bGxDb250ZXh0UGF0aCA/IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bGxDb250ZXh0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogb1BhZ2VNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIiwgdW5kZWZpbmVkLCB7IG5vUmVzb2x2ZTogdHJ1ZSB9KSxcblx0XHRcdFx0XHRcdHZpZXdEYXRhOiBtVmlld0RhdGEgPyBvVmlld0RhdGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgOiBudWxsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdGVudGl0eVNldDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGZ1bGxDb250ZXh0UGF0aDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XCJzYXAuZmUuaTE4blwiOiBvUmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGRldmljZTogb0RldmljZU1vZGVsLFxuXHRcdFx0XHRcdFx0bWFuaWZlc3Q6IG9NYW5pZmVzdE1vZGVsLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogb1BhZ2VNb2RlbCBhcyB1bmtub3duIGFzIEpTT05Nb2RlbCxcblx0XHRcdFx0XHRcdHZpZXdEYXRhOiBvVmlld0RhdGFNb2RlbFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZnVsbENvbnRleHRQYXRoOiBzRnVsbENvbnRleHRQYXRoLFxuXHRcdFx0XHRcdGdldENvbnZlcnRlZE1ldGFkYXRhOiAoKSA9PiBjb252ZXJ0ZWRNZXRhZGF0YSxcblx0XHRcdFx0XHRnZXREZWZpbml0aW9uQ29udGV4dCgpOiBEZWZpbml0aW9uQ29udGV4dCB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGVmaW5pdGlvbkNvbnRleHQ7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXREZWZpbml0aW9uRm9yUGFnZSgpOiBEZWZpbml0aW9uUGFnZSB7XG5cdFx0XHRcdFx0XHRsZXQgZnVsbENvbnRleHRQYXRoID0gc0Z1bGxDb250ZXh0UGF0aDtcblx0XHRcdFx0XHRcdGlmIChmdWxsQ29udGV4dFBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGZ1bGxDb250ZXh0UGF0aCA9IGZ1bGxDb250ZXh0UGF0aC5zdWJzdHJpbmcoMCwgZnVsbENvbnRleHRQYXRoLmxlbmd0aCAtIDEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIGRlZmluaXRpb25Db250ZXh0LmdldFBhZ2VGb3IoZnVsbENvbnRleHRQYXRoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHR2aWV3SWQ6IHNTdGFibGVJZFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRvVmlld1NldHRpbmdzID0gdGhpcy5fZ2V0Vmlld1NldHRpbmdzKFxuXHRcdFx0XHRcdHByZXByb2Nlc3NvckNvbnRleHQsXG5cdFx0XHRcdFx0bVNlcnZpY2VTZXR0aW5ncyxcblx0XHRcdFx0XHRvQ29tcG9uZW50LFxuXHRcdFx0XHRcdG1WaWV3RGF0YSxcblx0XHRcdFx0XHRzQ2FjaGVLZXksXG5cdFx0XHRcdFx0b1BhZ2VNb2RlbCBhcyB1bmtub3duIGFzIEpTT05Nb2RlbCxcblx0XHRcdFx0XHRvUmVzb3VyY2VNb2RlbFxuXHRcdFx0XHQpO1xuXHRcdFx0Ly8gU2V0dGluZyB0aGUgcGFnZU1vZGVsIG9uIHRoZSBjb21wb25lbnQgZm9yIHBvdGVudGlhbCByZXVzZVxuXHRcdFx0b0NvbXBvbmVudC5zZXRNb2RlbChvUGFnZU1vZGVsIGFzIHVua25vd24gYXMgSlNPTk1vZGVsLCBcIl9wYWdlTW9kZWxcIik7XG5cdFx0XHRvQ29tcG9uZW50LnNldFByZXByb2Nlc3NvckNvbnRleHQocHJlcHJvY2Vzc29yQ29udGV4dCk7XG5cdFx0XHRyZXR1cm4gb0NvbXBvbmVudC5ydW5Bc093bmVyKGFzeW5jICgpID0+IHtcblx0XHRcdFx0cmV0dXJuIFZpZXcuY3JlYXRlKG9WaWV3U2V0dGluZ3MpXG5cblx0XHRcdFx0XHQudGhlbigob1ZpZXc6IFZpZXcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMub1ZpZXcgPSBvVmlldztcblx0XHRcdFx0XHRcdGNvbnN0IHZpZXdKU09OTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHRoaXMub1ZpZXcpO1xuXHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuZW5oYW5jZVZpZXdKU09OTW9kZWwodmlld0pTT05Nb2RlbCBhcyBKU09OTW9kZWwgJiB7IF9nZXRPYmplY3Q6IEZ1bmN0aW9uIH0pO1xuXHRcdFx0XHRcdFx0dGhpcy5vVmlldy5zZXRNb2RlbCh2aWV3SlNPTk1vZGVsLCBcIiR2aWV3XCIpO1xuXHRcdFx0XHRcdFx0dGhpcy5vVmlldy5zZXRNb2RlbChvVmlld0RhdGFNb2RlbCwgXCJ2aWV3RGF0YVwiKTtcblx0XHRcdFx0XHRcdG9Db21wb25lbnQuc2V0QWdncmVnYXRpb24oXCJyb290Q29udHJvbFwiLCB0aGlzLm9WaWV3KTtcblx0XHRcdFx0XHRcdHJldHVybiBzQ2FjaGVLZXk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goYXN5bmMgKHJlYXNvbjogRXJyb3IpID0+XG5cdFx0XHRcdFx0XHR0aGlzLl9jcmVhdGVFcnJvclBhZ2UoXG5cdFx0XHRcdFx0XHRcdHJlYXNvbixcblx0XHRcdFx0XHRcdFx0b1ZpZXdTZXR0aW5ncyxcblx0XHRcdFx0XHRcdFx0bVNlcnZpY2VTZXR0aW5ncy5lcnJvclZpZXdOYW1lIHx8IFwic2FwLmZlLmNvcmUuc2VydmljZXMudmlldy5UZW1wbGF0aW5nRXJyb3JQYWdlXCIsXG5cdFx0XHRcdFx0XHRcdG9Db21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdHNDYWNoZUtleVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQuY2F0Y2goKGUpID0+IExvZy5lcnJvcihlLm1lc3NhZ2UsIGUpKTtcblx0XHRcdH0pO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyB2aWV3IDogJHtlcnJvcn1gKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIF9lbmhhbmNlTmF2aWdhdGlvbkNvbmZpZyhcblx0XHRtTmF2aWdhdGlvbjogUmVjb3JkPHN0cmluZywgTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24+LFxuXHRcdG1PdXRib3VuZHM6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0T3V0Ym91bmRFbnRyeT4sXG5cdFx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRcdHN0YWJsZUlkOiBzdHJpbmdcblx0KTogdm9pZCB7XG5cdFx0T2JqZWN0LmtleXMobU5hdmlnYXRpb24pLmZvckVhY2goZnVuY3Rpb24gKG5hdmlnYXRpb25PYmplY3RLZXk6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0Y29uc3QgbmF2aWdhdGlvbk9iamVjdCA9IG1OYXZpZ2F0aW9uW25hdmlnYXRpb25PYmplY3RLZXldO1xuXHRcdFx0bGV0IG91dGJvdW5kQ29uZmlnO1xuXHRcdFx0aWYgKG5hdmlnYXRpb25PYmplY3QuZGV0YWlsICYmIG5hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kICYmIG1PdXRib3VuZHNbbmF2aWdhdGlvbk9iamVjdC5kZXRhaWwub3V0Ym91bmRdKSB7XG5cdFx0XHRcdG91dGJvdW5kQ29uZmlnID0gbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZF07XG5cdFx0XHRcdG5hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kRGV0YWlsID0ge1xuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBvdXRib3VuZENvbmZpZy5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRhY3Rpb246IG91dGJvdW5kQ29uZmlnLmFjdGlvbixcblx0XHRcdFx0XHRwYXJhbWV0ZXJzOiBvdXRib3VuZENvbmZpZy5wYXJhbWV0ZXJzXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRpZiAobmF2aWdhdGlvbk9iamVjdC5kZXRhaWwuYXZhaWxhYmlsaXR5KSB7XG5cdFx0XHRcdHJlZ2lzdGVyVmlydHVhbFByb3BlcnR5KFxuXHRcdFx0XHRcdGNvbnZlcnRlZFR5cGVzLFxuXHRcdFx0XHRcdFwicm91dGVOYXZpZ2FibGUtXCIgKyBuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5yb3V0ZSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzb2x2ZUJpbmRpbmdTdHJpbmcobmF2aWdhdGlvbk9iamVjdC5kZXRhaWwuYXZhaWxhYmlsaXR5ISk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRzdGFibGVJZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG5hdmlnYXRpb25PYmplY3QuY3JlYXRlICYmIG5hdmlnYXRpb25PYmplY3QuY3JlYXRlLm91dGJvdW5kICYmIG1PdXRib3VuZHNbbmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmRdKSB7XG5cdFx0XHRcdG91dGJvdW5kQ29uZmlnID0gbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmNyZWF0ZS5vdXRib3VuZF07XG5cdFx0XHRcdG5hdmlnYXRpb25PYmplY3QuY3JlYXRlLm91dGJvdW5kRGV0YWlsID0ge1xuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBvdXRib3VuZENvbmZpZy5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRhY3Rpb246IG91dGJvdW5kQ29uZmlnLmFjdGlvbixcblx0XHRcdFx0XHRwYXJhbWV0ZXJzOiBvdXRib3VuZENvbmZpZy5wYXJhbWV0ZXJzXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIF9nZXRGdWxsUGF0aFRvRW50aXR5U2V0KGFTcGxpdFBhdGg6IHN0cmluZ1tdLCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGFTcGxpdFBhdGgucmVkdWNlKGZ1bmN0aW9uIChzUGF0aFNvRmFyOiBzdHJpbmcsIHNOZXh0UGF0aFBhcnQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0XHRpZiAoc05leHRQYXRoUGFydCA9PT0gXCJcIikge1xuXHRcdFx0XHRyZXR1cm4gc1BhdGhTb0Zhcjtcblx0XHRcdH1cblx0XHRcdGlmIChzUGF0aFNvRmFyID09PSBcIlwiKSB7XG5cdFx0XHRcdHNQYXRoU29GYXIgPSBgLyR7c05leHRQYXRoUGFydH1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb1RhcmdldCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRoU29GYXJ9LyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLyR7c05leHRQYXRoUGFydH1gKTtcblx0XHRcdFx0aWYgKG9UYXJnZXQgJiYgT2JqZWN0LmtleXMob1RhcmdldCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHNQYXRoU29GYXIgKz0gXCIvJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRzUGF0aFNvRmFyICs9IGAvJHtzTmV4dFBhdGhQYXJ0fWA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc1BhdGhTb0Zhcjtcblx0XHR9LCBcIlwiKTtcblx0fVxuXG5cdGdldFZpZXcoKTogVmlldyB7XG5cdFx0cmV0dXJuIHRoaXMub1ZpZXc7XG5cdH1cblxuXHRnZXRJbnRlcmZhY2UoKTogVGVtcGxhdGVkVmlld1NlcnZpY2Uge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0ZXhpdCgpOiB2b2lkIHtcblx0XHQvLyBEZXJlZ2lzdGVyIGdsb2JhbCBpbnN0YW5jZVxuXHRcdGlmICh0aGlzLm9SZXNvdXJjZU1vZGVsU2VydmljZSkge1xuXHRcdFx0dGhpcy5vUmVzb3VyY2VNb2RlbFNlcnZpY2UuZGVzdHJveSgpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5vQ2FjaGVIYW5kbGVyU2VydmljZSkge1xuXHRcdFx0dGhpcy5vQ2FjaGVIYW5kbGVyU2VydmljZS5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdHRoaXMub0ZhY3RvcnkucmVtb3ZlR2xvYmFsSW5zdGFuY2UoKTtcblx0fVxufVxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeSBleHRlbmRzIFNlcnZpY2VGYWN0b3J5PFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3M+IHtcblx0X29JbnN0YW5jZVJlZ2lzdHJ5OiBSZWNvcmQ8c3RyaW5nLCBUZW1wbGF0ZWRWaWV3U2VydmljZT4gPSB7fTtcblxuXHRzdGF0aWMgaUNyZWF0aW5nVmlld3M6IDA7XG5cblx0YXN5bmMgY3JlYXRlSW5zdGFuY2Uob1NlcnZpY2VDb250ZXh0OiBTZXJ2aWNlQ29udGV4dDxUZW1wbGF0ZWRWaWV3U2VydmljZVNldHRpbmdzPik6IFByb21pc2U8VGVtcGxhdGVkVmlld1NlcnZpY2U+IHtcblx0XHRUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuaUNyZWF0aW5nVmlld3MrKztcblx0XHRjb25zdCBvVGVtcGxhdGVkVmlld1NlcnZpY2UgPSBuZXcgVGVtcGxhdGVkVmlld1NlcnZpY2UoT2JqZWN0LmFzc2lnbih7IGZhY3Rvcnk6IHRoaXMgfSwgb1NlcnZpY2VDb250ZXh0KSk7XG5cdFx0cmV0dXJuIG9UZW1wbGF0ZWRWaWV3U2VydmljZS5pbml0UHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5pQ3JlYXRpbmdWaWV3cy0tO1xuXHRcdFx0cmV0dXJuIG9UZW1wbGF0ZWRWaWV3U2VydmljZTtcblx0XHR9KTtcblx0fVxuXG5cdHJlbW92ZUdsb2JhbEluc3RhbmNlKCk6IHZvaWQge1xuXHRcdHRoaXMuX29JbnN0YW5jZVJlZ2lzdHJ5ID0ge307XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGNvbXBvbmVudCBkYXRhIHNwZWNpZmllcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgJ1NoYXJlJyBidXR0b24gYW5kIHJldHVybnMgdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiB0aGUgdmlzaWJpbGl0eS5cblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBTcGVjaWZpZXMgdGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgQm9vbGVhbiB2YWx1ZSBhcyB0cnVlIG9yIGZhbHNlIGJhc2VkIHdoZXRoZXIgdGhlICdTaGFyZScgYnV0dG9uIHNob3VsZCBiZSB2aXNpYmxlIG9yIG5vdFxuXHQgKi9cblx0c3RhdGljIGdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eUZvck15SW5ib3goYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBjb21wb25lbnREYXRhOiBDb21wb25lbnREYXRhID0gYXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKTtcblx0XHRpZiAoY29tcG9uZW50RGF0YSAhPT0gdW5kZWZpbmVkICYmIGNvbXBvbmVudERhdGEuZmVFbnZpcm9ubWVudCkge1xuXHRcdFx0cmV0dXJuIGNvbXBvbmVudERhdGEuZmVFbnZpcm9ubWVudC5nZXRTaGFyZUNvbnRyb2xWaXNpYmlsaXR5KCk7XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TnVtYmVyT2ZWaWV3c0luQ3JlYXRpb25TdGF0ZSgpOiBudW1iZXIge1xuXHRcdHJldHVybiBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuaUNyZWF0aW5nVmlld3M7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBwYWdlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBmb3IgYSBzcGVjaWZpYyBwYWdlIGlkZW50aWZpZWQgYnkgaXRzIElELlxuXHQgKiBAcGFyYW0gbWFuaWZlc3QgVGhlIG1hbmlmZXN0IGNvbnRlbnQgb2JqZWN0IGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBkZXRhaWxzLlxuXHQgKiBAcGFyYW0gdmlld0RhdGEgVGhlIHZpZXcgZGF0YSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2aWV3LlxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSBwYWdlSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwYWdlIGZvciB3aGljaCBjb25maWd1cmF0aW9uIGNoYW5nZXMgYXJlIHRvIGJlIGFwcGxpZWQuXG5cdCAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIHZpZXcgZGF0YSBvYmplY3QgcmVmbGVjdGluZyB0aGUgYXBwbGllZCBjaGFuZ2VzLlxuXHQgKi9cblx0c3RhdGljIHNldFBhZ2VDb25maWd1cmF0aW9uQ2hhbmdlcyhcblx0XHRtYW5pZmVzdDogTWFuaWZlc3RDb250ZW50LFxuXHRcdHZpZXdEYXRhOiBWaWV3RGF0YSxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRwYWdlSWQ6IHN0cmluZ1xuXHQpOiBWaWV3RGF0YSB7XG5cdFx0Y29uc3QgdGFyZ2V0cyA9IG1hbmlmZXN0Py5bXCJzYXAudWk1XCJdPy5yb3V0aW5nPy50YXJnZXRzID8/IHt9O1xuXHRcdGxldCByZWFsVGFyZ2V0ID0gXCJcIjtcblx0XHRmb3IgKGNvbnN0IHRhcmdldFRvRmluZCBpbiB0YXJnZXRzKSB7XG5cdFx0XHRpZiAodGFyZ2V0c1t0YXJnZXRUb0ZpbmRdLmlkID09PSBwYWdlSWQpIHtcblx0XHRcdFx0cmVhbFRhcmdldCA9IHRhcmdldFRvRmluZDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChyZWFsVGFyZ2V0ID09PSBcIlwiKSB7XG5cdFx0XHRyZWFsVGFyZ2V0ID0gcGFnZUlkO1xuXHRcdH1cblx0XHRjb25zdCBhY3R1YWxTZXR0aW5ncyA9IG1hbmlmZXN0Py5bXCJzYXAudWk1XCJdPy5yb3V0aW5nPy50YXJnZXRzPy5bcmVhbFRhcmdldF0/Lm9wdGlvbnM/LnNldHRpbmdzIHx8IHt9O1xuXHRcdHJldHVybiBhcHBseVBhZ2VDb25maWd1cmF0aW9uQ2hhbmdlcyhhY3R1YWxTZXR0aW5ncywgdmlld0RhdGEsIGFwcENvbXBvbmVudCwgcGFnZUlkKTtcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztNQXFHYUEsb0JBQW9CLDBCQUFBQyxRQUFBO0lBQUEsU0FBQUQscUJBQUE7TUFBQSxPQUFBQyxRQUFBLENBQUFDLEtBQUEsT0FBQUMsU0FBQTtJQUFBO0lBQUFDLFFBQUEsQ0FBQUosb0JBQUEsR0FBQUEsb0JBQUE7SUFBQUssY0FBQSxDQUFBTCxvQkFBQSxFQUFBQyxRQUFBO0lBQUEsSUFBQUssTUFBQSxHQUFBTixvQkFBQSxDQUFBTyxTQUFBO0lBQUFELE1BQUEsQ0FxQmhDRSxJQUFJLEdBQUosU0FBQUEsSUFBSUEsQ0FBQSxFQUFTO01BQ1osTUFBTUMsb0JBQW9CLEdBQUcsRUFBRTtNQUMvQixNQUFNQyxRQUFRLEdBQUcsSUFBSSxDQUFDQyxVQUFVLENBQUMsQ0FBQztNQUNsQyxNQUFNQyxVQUFVLEdBQUdGLFFBQVEsQ0FBQ0csV0FBVztNQUN2QyxNQUFNQyxhQUFhLEdBQUdDLFdBQVcs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
496
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUZW1wbGF0ZWRWaWV3U2VydmljZSIsIl9TZXJ2aWNlIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfZXhwb3J0cyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiaW5pdCIsImFTZXJ2aWNlRGVwZW5kZW5jaWVzIiwib0NvbnRleHQiLCJnZXRDb250ZXh0Iiwib0NvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50Iiwidmlld1ByZWxvYWRlclNlcnZpY2UiLCJnZXRWaWV3UHJlbG9hZGVyU2VydmljZSIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJwYWdlSWQiLCJnZXRMb2NhbElkIiwiZ2V0SWQiLCJzU3RhYmxlSWQiLCJnZXRNZXRhZGF0YSIsImdldENvbXBvbmVudE5hbWUiLCJhRW5oYW5jZUkxOG4iLCJnZXRFbmhhbmNlSTE4biIsInNBcHBOYW1lc3BhY2UiLCJvRmFjdG9yeSIsImZhY3RvcnkiLCJpIiwibGVuZ3RoIiwib1Jlc291cmNlTW9kZWwiLCJnZXRNb2RlbCIsImlzQSIsInJlcGxhY2UiLCJzQ2FjaGVJZGVudGlmaWVyIiwiZ2V0TmFtZSIsIkxvY2FsaXphdGlvbiIsImdldExhbmd1YWdlVGFnIiwicHVzaCIsIlNlcnZpY2VGYWN0b3J5UmVnaXN0cnkiLCJnZXQiLCJjcmVhdGVJbnN0YW5jZSIsInNjb3BlVHlwZSIsInNldHRpbmdzIiwiYnVuZGxlcyIsImVuaGFuY2VJMThuIiwibW9kZWxOYW1lIiwidGhlbiIsIm9SZXNvdXJjZU1vZGVsU2VydmljZSIsImdldFJlc291cmNlTW9kZWwiLCJtZXRhTW9kZWwiLCJhcHBDb21wb25lbnQiLCJjb21wb25lbnQiLCJvQ2FjaGVIYW5kbGVyU2VydmljZSIsImlzQ2FjaGVSZWFkeSIsInZhbGlkYXRlQ2FjaGVLZXkiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsIlZlcnNpb25JbmZvIiwibG9hZCIsIm9JbmZvIiwic1RpbWVzdGFtcCIsImxpYnJhcmllcyIsIkNvcmUiLCJidWlsZGluZm8iLCJidWlsZHRpbWUiLCJmb3JFYWNoIiwib0xpYnJhcnkiLCJidWlsZFRpbWVzdGFtcCIsImNhdGNoIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwiYWxsIiwiYURlcGVuZGVuY2llc1Jlc3VsdCIsInNDYWNoZUtleSIsIlRlbXBsYXRlQ29udmVydGVyIiwiTWV0YU1vZGVsQ29udmVydGVyIiwicmVxdWlyZURlcGVuZGVuY2llcyIsImNyZWF0ZVZpZXciLCJnZXRJbnN0YW5jZSIsImludmFsaWRhdGVJZk5lZWRlZCIsInJlZnJlc2hWaWV3Iiwib1Jvb3RWaWV3IiwiZ2V0Um9vdENvbnRyb2wiLCJkZXN0cm95Iiwib1ZpZXciLCJyZXNvdXJjZU1vZGVsIiwic3RhYmxlSWQiLCJnZXRVSUFyZWEiLCJpbnZhbGlkYXRlIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJfZ2V0Vmlld1NldHRpbmdzIiwicHJlcHJvY2Vzc29yQ29udGV4dCIsIm1TZXJ2aWNlU2V0dGluZ3MiLCJtVmlld0RhdGEiLCJvUGFnZU1vZGVsIiwidmlld1R5cGUiLCJnZXRWaWV3VHlwZSIsInVuZGVmaW5lZCIsInR5cGUiLCJwcmVwcm9jZXNzb3JzIiwieG1sIiwiY29udHJvbHMiLCJpZCIsInZpZXdOYW1lIiwiZ2V0Vmlld05hbWUiLCJ2aWV3RGF0YSIsImNhY2hlIiwia2V5cyIsImFkZGl0aW9uYWxEYXRhIiwiZ2V0QWRkaXRpb25hbENhY2hlRGF0YSIsImdldERhdGEiLCJzZXRBZGRpdGlvbmFsQ2FjaGVEYXRhIiwidmFsdWUiLCJzZXREYXRhIiwibW9kZWxzIiwiaGVpZ2h0IiwiX2NyZWF0ZUVycm9yUGFnZSIsInJlYXNvbiIsIm9WaWV3U2V0dGluZ3MiLCJtZXNzYWdlIiwiSlNPTk1vZGVsIiwiY29udHJvbGxlciIsInJ1bkFzT3duZXIiLCJWaWV3IiwiY3JlYXRlIiwic2V0TW9kZWwiLCJzZXRBZ2dyZWdhdGlvbiIsImdldENvbnRyb2xsZXIiLCJnZXRQbGFjZWhvbGRlciIsImhpZGVSb290UGxhY2Vob2xkZXIiLCJzQ29udmVydGVyVHlwZSIsImNvbnZlcnRlclR5cGUiLCJzRnVsbENvbnRleHRQYXRoIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsIm9wdGlvbnMiLCJmdWxsQ29udGV4dFBhdGgiLCJjb21wb25lbnRDb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwiZW5kc1dpdGgiLCJvTWFuaWZlc3RDb250ZW50IiwiZ2V0TWFuaWZlc3QiLCJvRGV2aWNlTW9kZWwiLCJEZXZpY2UiLCJzZXREZWZhdWx0QmluZGluZ01vZGUiLCJvTWFuaWZlc3RNb2RlbCIsIm9WaWV3RGF0YU1vZGVsIiwib1JvdXRpbmdTZXJ2aWNlIiwiZ2V0U2VydmljZSIsIm9UYXJnZXRJbmZvIiwibU91dGJvdW5kcyIsImNyb3NzTmF2aWdhdGlvbiIsIm91dGJvdW5kcyIsIm1OYXZpZ2F0aW9uIiwiZ2V0TmF2aWdhdGlvbiIsImNvbnZlcnRlZE1ldGFkYXRhIiwiY29udmVydFR5cGVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiX2VuaGFuY2VOYXZpZ2F0aW9uQ29uZmlnIiwiZGVmaW5pdGlvbkNvbnRleHQiLCJEZWZpbml0aW9uQ29udGV4dCIsImFkZEFwcGxpY2F0aW9uTWFuaWZlc3QiLCJuYXZpZ2F0aW9uIiwidmlld0xldmVsIiwiY29udGVudERlbnNpdGllcyIsImlzRGVza3RvcCIsInN5c3RlbSIsImRlc2t0b3AiLCJpc1Bob25lIiwicGhvbmUiLCJUZW1wbGF0ZVR5cGUiLCJGcmVlU3R5bGVQYWdlIiwiZ2V0Vmlld0RhdGEiLCJPYmplY3QiLCJhc3NpZ24iLCJUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkiLCJzZXRQYWdlQ29uZmlndXJhdGlvbkNoYW5nZXMiLCJpc1NoYXJlQnV0dG9uVmlzaWJsZUZvck15SW5ib3giLCJnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHlGb3JNeUluYm94Iiwib1NoZWxsU2VydmljZXMiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2hlbGxDb250ZW50RGVuc2l0eSIsImdldENvbnRlbnREZW5zaXR5Iiwic2FwZmVNYW5pZmVzdENvbnRlbnQiLCJzYXBGZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsInJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QiLCJmb3JtIiwiY29udHJvbENvbmZpZ3VyYXRpb24iLCJzQW5ub3RhdGlvblBhdGgiLCJpbmNsdWRlcyIsInNUYXJnZXRBbm5vdGF0aW9uUGF0aCIsInJlc29sdmVEeW5hbWljRXhwcmVzc2lvbiIsIlRlbXBsYXRlTW9kZWwiLCJvRGlhZ25vc3RpY3MiLCJnZXREaWFnbm9zdGljcyIsImlJc3N1ZUNvdW50IiwiZ2V0SXNzdWVzIiwib0NvbnZlcnRlclBhZ2VNb2RlbCIsImNvbnZlcnRQYWdlIiwiTWFuaWZlc3RXcmFwcGVyIiwiX2dldENvbnRyb2xsZXJOYW1lIiwiY29udHJvbGxlck5hbWUiLCJhSXNzdWVzIiwiYUFkZGVkSXNzdWVzIiwic2xpY2UiLCJ3YXJuaW5nIiwiYVNwbGl0UGF0aCIsInNwbGl0Iiwic0VudGl0eVNldFBhdGgiLCJfZ2V0RnVsbFBhdGhUb0VudGl0eVNldCIsImJpbmRpbmdDb250ZXh0cyIsImVudGl0eVNldCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiY29udGV4dFBhdGgiLCJjb252ZXJ0ZXJDb250ZXh0Iiwibm9SZXNvbHZlIiwiZGV2aWNlIiwibWFuaWZlc3QiLCJnZXRDb252ZXJ0ZWRNZXRhZGF0YSIsImdldERlZmluaXRpb25Db250ZXh0IiwiZ2V0RGVmaW5pdGlvbkZvclBhZ2UiLCJzdWJzdHJpbmciLCJnZXRQYWdlRm9yIiwidmlld0lkIiwidWlNb2RlbCIsImludGVybmFsTW9kZWwiLCJwYXRoIiwic2V0UHJvcGVydHkiLCJjb2xsYWJvcmF0aW9uIiwidGFyZ2V0VUlNb2RlbENvbnRleHQiLCJzZXRCaW5kaW5nQ29udGV4dCIsInNldFByZXByb2Nlc3NvckNvbnRleHQiLCJ2aWV3SlNPTk1vZGVsIiwiTW9kZWxIZWxwZXIiLCJlbmhhbmNlVmlld0pTT05Nb2RlbCIsImhpZGVWaWV3RHVyaW5nQ3JlYXRpb24iLCJzZXRWaXNpYmxlIiwiZWFnZXJWaWV3Q3JlYXRpb24iLCJzZXRUaW1lb3V0IiwibmF2TmFtZSIsInJvdXRpbmdUYXJnZXRzIiwiX2dldFJvdXRlSW5mb3JtYXRpb24iLCJkZXRhaWwiLCJyb3V0ZSIsInRhcmdldHNXaXRoSW5mbyIsInJvdXRpbmdUYXJnZXQiLCJyb3V0aW5nVGFyZ2V0TmFtZSIsIm5hbWUiLCJyb3V0ZXJUYXJnZXQiLCJnZXRSb3V0ZXIiLCJnZXRUYXJnZXQiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRSb290Q29udHJvbGxlciIsInNldFJvb3RDb250cm9sbGVyIiwiZXJyb3JWaWV3TmFtZSIsImUiLCJFcnJvciIsImNvbnZlcnRlZFR5cGVzIiwibmF2aWdhdGlvbk9iamVjdEtleSIsIm5hdmlnYXRpb25PYmplY3QiLCJvdXRib3VuZENvbmZpZyIsIm91dGJvdW5kIiwib3V0Ym91bmREZXRhaWwiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsInBhcmFtZXRlcnMiLCJhdmFpbGFiaWxpdHkiLCJyZWdpc3RlclZpcnR1YWxQcm9wZXJ0eSIsInJlc29sdmVCaW5kaW5nU3RyaW5nIiwicmVkdWNlIiwic1BhdGhTb0ZhciIsInNOZXh0UGF0aFBhcnQiLCJvVGFyZ2V0IiwiZ2V0T2JqZWN0IiwiZ2V0VmlldyIsImdldEludGVyZmFjZSIsImV4aXQiLCJyZW1vdmVHbG9iYWxJbnN0YW5jZSIsIlNlcnZpY2UiLCJfU2VydmljZUZhY3RvcnkiLCJfdGhpcyIsIl9sZW4iLCJhcmdzIiwiX2tleSIsImNhbGwiLCJfb0luc3RhbmNlUmVnaXN0cnkiLCJfcHJvdG8yIiwib1NlcnZpY2VDb250ZXh0IiwiaUNyZWF0aW5nVmlld3MiLCJvVGVtcGxhdGVkVmlld1NlcnZpY2UiLCJjb21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsImZlRW52aXJvbm1lbnQiLCJnZXRTaGFyZUNvbnRyb2xWaXNpYmlsaXR5IiwiZ2V0TnVtYmVyT2ZWaWV3c0luQ3JlYXRpb25TdGF0ZSIsInRhcmdldHMiLCJyb3V0aW5nIiwicmVhbFRhcmdldCIsInRhcmdldFRvRmluZCIsImFjdHVhbFNldHRpbmdzIiwiYXBwbHlQYWdlQ29uZmlndXJhdGlvbkNoYW5nZXMiLCJTZXJ2aWNlRmFjdG9yeSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udmVydGVkTWV0YWRhdGEgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU0FQSlNPTlNjaGVtYUZvcldlYkFwcGxpY2F0aW9uTWFuaWZlc3RGaWxlIH0gZnJvbSBcIkB1aTUvbWFuaWZlc3QvdHlwZXMvbWFuaWZlc3RcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IExvY2FsaXphdGlvbiBmcm9tIFwic2FwL2Jhc2UvaTE4bi9Mb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7IHJlc29sdmVCaW5kaW5nU3RyaW5nIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50RGF0YSB9IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24sIFhNTFByZXByb2Nlc3NvckNvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IFN1cnZleUNvbmZpZyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHR5cGUge1xuXHRCYXNlTWFuaWZlc3RTZXR0aW5ncyxcblx0Q29udGVudERlbnNpdGllc1R5cGUsXG5cdENvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRNYW5pZmVzdEFjdGlvbixcblx0TWFuaWZlc3RIZWFkZXJGYWNldCxcblx0VmFyaWFudE1hbmFnZW1lbnRUeXBlXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IFRlbXBsYXRlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCBNYW5pZmVzdFdyYXBwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RXcmFwcGVyXCI7XG5pbXBvcnQgdHlwZSAqIGFzIF9NZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyByZWdpc3RlclZpcnR1YWxQcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgKiBhcyBfVGVtcGxhdGVDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhYmxlUmVjb3JkIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgRGVmaW5pdGlvblBhZ2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZGVmaW5pdGlvbi9GRURlZmluaXRpb25cIjtcbmltcG9ydCB7IERlZmluaXRpb25Db250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2RlZmluaXRpb24vRkVEZWZpbml0aW9uXCI7XG5pbXBvcnQgeyByZXF1aXJlRGVwZW5kZW5jaWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTG9hZGVyVXRpbHNcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgYXBwbHlQYWdlQ29uZmlndXJhdGlvbkNoYW5nZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvbWFuaWZlc3RNZXJnZXIvQ2hhbmdlUGFnZUNvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVIYW5kbGVyU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9DYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgdHlwZSBIaWVyYWNoeU1vZGUgYXMgQnJlYWRjcnVtYnNIaWVyYWNoeU1vZGUgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9CcmVhZGNydW1ic1wiO1xuaW1wb3J0IHR5cGUgeyBPdmVyZmxvd1Rvb2xiYXJQcmlvcml0eSB9IGZyb20gXCJzYXAvbS9saWJyYXJ5XCI7XG5pbXBvcnQgRGV2aWNlIGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgVmVyc2lvbkluZm8gZnJvbSBcInNhcC91aS9WZXJzaW9uSW5mb1wiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCB0eXBlIHsgTWFuaWZlc3RDb250ZW50LCBNYW5pZmVzdE91dGJvdW5kRW50cnksIFNoYXJlT3B0aW9ucyB9IGZyb20gXCJzYXAvdWkvY29yZS9NYW5pZmVzdFwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5UmVnaXN0cnlcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJ0eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcbmltcG9ydCB7IHJlc29sdmVEeW5hbWljRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9oZWxwZXJzL0R5bmFtaWNBbm5vdGF0aW9uUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZU1vZGVsU2VydmljZSB9IGZyb20gXCIuL1Jlc291cmNlTW9kZWxTZXJ2aWNlRmFjdG9yeVwiO1xuXG50eXBlIFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3MgPSB7XG5cdHZpZXdUeXBlPzogc3RyaW5nO1xuXHR2aWV3TmFtZT86IHN0cmluZztcbn07XG5cbnR5cGUgVmlld1NldHRpbmdzID0gUGFyYW1ldGVyczx0eXBlb2YgVmlldy5jcmVhdGU+WzBdICYgeyBjYWNoZTogdW5rbm93bjsgbW9kZWxzOiB1bmtub3duOyBoZWlnaHQ6IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgVmlld0RhdGEgPSB7XG5cdGJyZWFkY3J1bWJzSGllcmFyY2h5TW9kZT86IEJyZWFkY3J1bWJzSGllcmFjaHlNb2RlO1xuXHRmY2xFbmFibGVkPzogYm9vbGVhbjtcblx0ZWRpdGFibGVIZWFkZXJDb250ZW50PzogYm9vbGVhbjtcblx0aGlkZUZpbHRlckJhcj86IGJvb2xlYW47XG5cdHVzZUhpZGRlbkZpbHRlckJhcj86IGJvb2xlYW47XG5cdHNlY3Rpb25MYXlvdXQ/OiBzdHJpbmc7XG5cdGFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHM/OiBSZWNvcmQ8c3RyaW5nLCBTZW1hbnRpY09iamVjdD47XG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRuYXZpZ2F0aW9uOiBvYmplY3Q7XG5cdHZpZXdMZXZlbDogbnVtYmVyO1xuXHR2YXJpYW50TWFuYWdlbWVudD86IFZhcmlhbnRNYW5hZ2VtZW50VHlwZTtcblx0c3RhYmxlSWQ6IHN0cmluZztcblx0Y29udGVudERlbnNpdGllcz86IENvbnRlbnREZW5zaXRpZXNUeXBlO1xuXHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsO1xuXHRmdWxsQ29udGV4dFBhdGg6IHN0cmluZztcblx0aXNEZXNrdG9wOiBib29sZWFuO1xuXHRpc1Bob25lOiBib29sZWFuO1xuXHRjb252ZXJ0ZXJUeXBlOiBUZW1wbGF0ZVR5cGU7XG5cdHNoZWxsQ29udGVudERlbnNpdHk/OiBzdHJpbmc7XG5cdHVzZU5ld0xhenlMb2FkaW5nPzogYm9vbGVhbjtcblx0aW5pdGlhbExvYWQ/OiBzdHJpbmc7XG5cdGxpdmVNb2RlPzogYm9vbGVhbjtcblx0cmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdD86IGJvb2xlYW47XG5cdGNvbnRyb2xDb25maWd1cmF0aW9uPzogQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdHJlZnJlc2hTdHJhdGVneU9uQXBwUmVzdG9yZT86IHVua25vd247XG5cdGVudGl0eVNldD86IHN0cmluZztcblx0aXNTaGFyZUJ1dHRvblZpc2libGVGb3JNeUluYm94PzogYm9vbGVhbjtcblx0Y29udGV4dFBhdGg/OiBzdHJpbmc7XG5cdHNoYXJlPzogU2hhcmVPcHRpb25zO1xuXHRzaGFyZU92ZXJmbG93UHJpb3JpdHk/OiBPdmVyZmxvd1Rvb2xiYXJQcmlvcml0eTtcblx0c2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24/OiBNYW5pZmVzdENvbnRlbnRbXCJzYXAuZmVcIl07XG5cdGNvbnRlbnQ/OiB7XG5cdFx0ZmVlZGJhY2s/OiB7IGFjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBTdXJ2ZXlDb25maWc+OyBzdGFuZGFyZEFjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBTdXJ2ZXlDb25maWc+IH07XG5cdFx0aGVhZGVyPzoge1xuXHRcdFx0ZmFjZXRzPzogQ29uZmlndXJhYmxlUmVjb3JkPE1hbmlmZXN0SGVhZGVyRmFjZXQ+O1xuXHRcdFx0YWN0aW9ucz86IENvbmZpZ3VyYWJsZVJlY29yZDxNYW5pZmVzdEFjdGlvbj47XG5cdFx0fTtcblx0XHRmb290ZXI/OiB7XG5cdFx0XHRhY3Rpb25zPzogQ29uZmlndXJhYmxlUmVjb3JkPE1hbmlmZXN0QWN0aW9uPjtcblx0XHR9O1xuXHR9O1xufTtcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZWRWaWV3U2VydmljZSBleHRlbmRzIFNlcnZpY2U8VGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncz4ge1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8dm9pZD47XG5cblx0b1ZpZXchOiBGRVZpZXc7XG5cblx0b1Jlc291cmNlTW9kZWxTZXJ2aWNlITogUmVzb3VyY2VNb2RlbFNlcnZpY2U7XG5cblx0b0NhY2hlSGFuZGxlclNlcnZpY2UhOiBDYWNoZUhhbmRsZXJTZXJ2aWNlO1xuXG5cdG9GYWN0b3J5ITogVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5O1xuXG5cdHJlc291cmNlTW9kZWwhOiBSZXNvdXJjZU1vZGVsO1xuXG5cdHN0YWJsZUlkITogc3RyaW5nO1xuXG5cdHBhZ2VJZCE6IHN0cmluZztcblxuXHRUZW1wbGF0ZUNvbnZlcnRlcj86IHR5cGVvZiBfVGVtcGxhdGVDb252ZXJ0ZXI7XG5cblx0TWV0YU1vZGVsQ29udmVydGVyPzogdHlwZW9mIF9NZXRhTW9kZWxDb252ZXJ0ZXI7XG5cblx0aW5pdCgpOiB2b2lkIHtcblx0XHRjb25zdCBhU2VydmljZURlcGVuZGVuY2llcyA9IFtdO1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db250ZXh0LnNjb3BlT2JqZWN0O1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob0NvbXBvbmVudCk7XG5cdFx0Y29uc3Qgdmlld1ByZWxvYWRlclNlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldFZpZXdQcmVsb2FkZXJTZXJ2aWNlKCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0dGhpcy5wYWdlSWQgPSBvQXBwQ29tcG9uZW50LmdldExvY2FsSWQob0NvbXBvbmVudC5nZXRJZCgpKSBhcyBzdHJpbmc7XG5cdFx0Y29uc3Qgc1N0YWJsZUlkID0gYCR7b0FwcENvbXBvbmVudC5nZXRNZXRhZGF0YSgpLmdldENvbXBvbmVudE5hbWUoKX06OiR7dGhpcy5wYWdlSWR9YDtcblx0XHRjb25zdCBhRW5oYW5jZUkxOG4gPSBvQ29tcG9uZW50LmdldEVuaGFuY2VJMThuKCkgfHwgW107XG5cdFx0bGV0IHNBcHBOYW1lc3BhY2U7XG5cdFx0dGhpcy5vRmFjdG9yeSA9IG9Db250ZXh0LmZhY3Rvcnk7XG5cdFx0aWYgKGFFbmhhbmNlSTE4bikge1xuXHRcdFx0c0FwcE5hbWVzcGFjZSA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXRDb21wb25lbnROYW1lKCk7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFFbmhhbmNlSTE4bi5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHQvLyBJbiBvcmRlciB0byBzdXBwb3J0IHRleHQtdmVydGljYWxpemF0aW9uIGFwcGxpY2F0aW9ucyBjYW4gYWxzbyBwYXNzIGEgcmVzb3VyY2UgbW9kZWwgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0Ly8gVUk1IHRha2VzIGNhcmUgb2YgdGV4dC12ZXJ0aWNhbGl6YXRpb24gZm9yIHJlc291cmNlIG1vZGVscyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0XHQvLyBIZW5jZSBjaGVjayBpZiB0aGUgZ2l2ZW4ga2V5IGlzIGEgcmVzb3VyY2UgbW9kZWwgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0Ly8gaWYgc28gdGhpcyBtb2RlbCBzaG91bGQgYmUgdXNlZCB0byBlbmhhbmNlIHRoZSBzYXAuZmUgcmVzb3VyY2UgbW9kZWwgc28gcGFzcyBpdCBhcyBpdCBpc1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TW9kZWwoYUVuaGFuY2VJMThuW2ldKTtcblx0XHRcdFx0aWYgKG9SZXNvdXJjZU1vZGVsICYmIG9SZXNvdXJjZU1vZGVsLmlzQShcInNhcC51aS5tb2RlbC5yZXNvdXJjZS5SZXNvdXJjZU1vZGVsXCIpKSB7XG5cdFx0XHRcdFx0YUVuaGFuY2VJMThuW2ldID0gb1Jlc291cmNlTW9kZWw7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUVuaGFuY2VJMThuW2ldID0gYCR7c0FwcE5hbWVzcGFjZX0uJHthRW5oYW5jZUkxOG5baV0ucmVwbGFjZShcIi5wcm9wZXJ0aWVzXCIsIFwiXCIpfWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3Qgc0NhY2hlSWRlbnRpZmllciA9IGAke29BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCl9XyR7c1N0YWJsZUlkfV8ke0xvY2FsaXphdGlvbi5nZXRMYW5ndWFnZVRhZygpfWA7XG5cdFx0YVNlcnZpY2VEZXBlbmRlbmNpZXMucHVzaChcblx0XHRcdFNlcnZpY2VGYWN0b3J5UmVnaXN0cnkuZ2V0KFwic2FwLmZlLmNvcmUuc2VydmljZXMuUmVzb3VyY2VNb2RlbFNlcnZpY2VcIilcblx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRzY29wZVR5cGU6IFwiY29tcG9uZW50XCIsXG5cdFx0XHRcdFx0c2NvcGVPYmplY3Q6IG9Db21wb25lbnQsXG5cdFx0XHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0XHRcdGJ1bmRsZXM6IFtcInNhcC5mZS5jb3JlLm1lc3NhZ2VidW5kbGVcIiwgXCJzYXAuZmUubWFjcm9zLm1lc3NhZ2VidW5kbGVcIiwgXCJzYXAuZmUudGVtcGxhdGVzLm1lc3NhZ2VidW5kbGVcIl0sXG5cdFx0XHRcdFx0XHRlbmhhbmNlSTE4bjogYUVuaGFuY2VJMThuLFxuXHRcdFx0XHRcdFx0bW9kZWxOYW1lOiBcInNhcC5mZS5pMThuXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKChvUmVzb3VyY2VNb2RlbFNlcnZpY2U6IFJlc291cmNlTW9kZWxTZXJ2aWNlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5vUmVzb3VyY2VNb2RlbFNlcnZpY2UgPSBvUmVzb3VyY2VNb2RlbFNlcnZpY2U7XG5cdFx0XHRcdFx0cmV0dXJuIG9SZXNvdXJjZU1vZGVsU2VydmljZS5nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0XHRcdH0pXG5cdFx0KTtcblx0XHRhU2VydmljZURlcGVuZGVuY2llcy5wdXNoKFxuXHRcdFx0U2VydmljZUZhY3RvcnlSZWdpc3RyeS5nZXQoXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy5DYWNoZUhhbmRsZXJTZXJ2aWNlXCIpXG5cdFx0XHRcdC5jcmVhdGVJbnN0YW5jZSh7XG5cdFx0XHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdGNvbXBvbmVudDogb0NvbXBvbmVudFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oYXN5bmMgKG9DYWNoZUhhbmRsZXJTZXJ2aWNlOiBDYWNoZUhhbmRsZXJTZXJ2aWNlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdmlld1ByZWxvYWRlclNlcnZpY2UuaXNDYWNoZVJlYWR5KCk7XG5cdFx0XHRcdFx0dGhpcy5vQ2FjaGVIYW5kbGVyU2VydmljZSA9IG9DYWNoZUhhbmRsZXJTZXJ2aWNlO1xuXHRcdFx0XHRcdHJldHVybiBvQ2FjaGVIYW5kbGVyU2VydmljZS52YWxpZGF0ZUNhY2hlS2V5KHNDYWNoZUlkZW50aWZpZXIsIG9Db21wb25lbnQsIG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKSk7XG5cdFx0XHRcdH0pXG5cdFx0KTtcblx0XHRhU2VydmljZURlcGVuZGVuY2llcy5wdXNoKFxuXHRcdFx0VmVyc2lvbkluZm8ubG9hZCgpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvSW5mbykge1xuXHRcdFx0XHRcdGxldCBzVGltZXN0YW1wID0gXCJcIjtcblx0XHRcdFx0XHRpZiAoIW9JbmZvLmxpYnJhcmllcykge1xuXHRcdFx0XHRcdFx0c1RpbWVzdGFtcCA9IChDb3JlIGFzIHsgYnVpbGRpbmZvPzogeyBidWlsZHRpbWU/OiBzdHJpbmcgfSB9KT8uYnVpbGRpbmZvPy5idWlsZHRpbWUgPz8gXCI8Tk9WQUxVRT5cIjtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b0luZm8ubGlicmFyaWVzLmZvckVhY2goZnVuY3Rpb24gKG9MaWJyYXJ5KSB7XG5cdFx0XHRcdFx0XHRcdHNUaW1lc3RhbXAgKz0gb0xpYnJhcnkuYnVpbGRUaW1lc3RhbXA7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHNUaW1lc3RhbXA7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFwiPE5PVkFMVUU+XCI7XG5cdFx0XHRcdH0pXG5cdFx0KTtcblx0XHR0aGlzLmluaXRQcm9taXNlID0gUHJvbWlzZS5hbGwoYVNlcnZpY2VEZXBlbmRlbmNpZXMpXG5cdFx0XHQudGhlbihhc3luYyAoYURlcGVuZGVuY2llc1Jlc3VsdDogdW5rbm93bltdKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9SZXNvdXJjZU1vZGVsID0gYURlcGVuZGVuY2llc1Jlc3VsdFswXSBhcyBSZXNvdXJjZU1vZGVsO1xuXHRcdFx0XHRjb25zdCBzQ2FjaGVLZXkgPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzFdIGFzIHN0cmluZyB8IG51bGw7XG5cdFx0XHRcdGNvbnN0IFtUZW1wbGF0ZUNvbnZlcnRlciwgTWV0YU1vZGVsQ29udmVydGVyXSA9IGF3YWl0IHJlcXVpcmVEZXBlbmRlbmNpZXMoW1xuXHRcdFx0XHRcdFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiLFxuXHRcdFx0XHRcdFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIlxuXHRcdFx0XHRdKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlVmlldyhcblx0XHRcdFx0XHRvUmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRzU3RhYmxlSWQsXG5cdFx0XHRcdFx0c0NhY2hlS2V5LFxuXHRcdFx0XHRcdFRlbXBsYXRlQ29udmVydGVyIGFzIHR5cGVvZiBfVGVtcGxhdGVDb252ZXJ0ZXIsXG5cdFx0XHRcdFx0TWV0YU1vZGVsQ29udmVydGVyIGFzIHR5cGVvZiBfTWV0YU1vZGVsQ29udmVydGVyXG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKHNDYWNoZUtleTogc3RyaW5nIHwgdm9pZCB8IG51bGwpOiB2b2lkIHtcblx0XHRcdFx0Y29uc3Qgb0NhY2hlSGFuZGxlclNlcnZpY2UgPSBTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5LmdldChcInNhcC5mZS5jb3JlLnNlcnZpY2VzLkNhY2hlSGFuZGxlclNlcnZpY2VcIikuZ2V0SW5zdGFuY2Uob01ldGFNb2RlbCk7XG5cdFx0XHRcdG9DYWNoZUhhbmRsZXJTZXJ2aWNlLmludmFsaWRhdGVJZk5lZWRlZChcblx0XHRcdFx0XHRzQ2FjaGVLZXksXG5cdFx0XHRcdFx0c0NhY2hlSWRlbnRpZmllcixcblx0XHRcdFx0XHRvQ29tcG9uZW50LFxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZyZXNoIHRoZSBjdXJyZW50IHZpZXcgdXNpbmcgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBhcyBiZWZvcmUuXG5cdCAqIEBwYXJhbSBvQ29tcG9uZW50XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSBpbmRpY2F0aW5nIHdoZW4gdGhlIHZpZXcgaXMgcmVmcmVzaGVkXG5cdCAqL1xuXHRhc3luYyByZWZyZXNoVmlldyhvQ29tcG9uZW50OiBUZW1wbGF0ZUNvbXBvbmVudCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Sb290VmlldyA9IG9Db21wb25lbnQuZ2V0Um9vdENvbnRyb2woKTtcblx0XHRpZiAob1Jvb3RWaWV3KSB7XG5cdFx0XHRvUm9vdFZpZXcuZGVzdHJveSgpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5vVmlldykge1xuXHRcdFx0dGhpcy5vVmlldy5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNyZWF0ZVZpZXcodGhpcy5yZXNvdXJjZU1vZGVsLCB0aGlzLnN0YWJsZUlkLCBcIlwiLCB0aGlzLlRlbXBsYXRlQ29udmVydGVyISwgdGhpcy5NZXRhTW9kZWxDb252ZXJ0ZXIhKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRvQ29tcG9uZW50LmdldFVJQXJlYSgpLmludmFsaWRhdGUoKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdG9Db21wb25lbnQuZ2V0VUlBcmVhKCkuaW52YWxpZGF0ZSgpO1xuXHRcdFx0XHRMb2cuZXJyb3Iob0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdF9nZXRWaWV3U2V0dGluZ3MoXG5cdFx0cHJlcHJvY2Vzc29yQ29udGV4dDogWE1MUHJlcHJvY2Vzc29yQ29udGV4dCxcblx0XHRtU2VydmljZVNldHRpbmdzOiBUZW1wbGF0ZWRWaWV3U2VydmljZVNldHRpbmdzLFxuXHRcdG9Db21wb25lbnQ6IEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50Pixcblx0XHRtVmlld0RhdGE6IFZpZXdEYXRhLFxuXHRcdHNDYWNoZUtleTogc3RyaW5nIHwgbnVsbCxcblx0XHRvUGFnZU1vZGVsOiBKU09OTW9kZWwsXG5cdFx0b1Jlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWxcblx0KTogVmlld1NldHRpbmdzIHtcblx0XHRsZXQgdmlld1R5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG1TZXJ2aWNlU2V0dGluZ3Mudmlld1R5cGUgfHwgb0NvbXBvbmVudC5nZXRWaWV3VHlwZSgpIHx8IFwiWE1MXCI7XG5cdFx0aWYgKHZpZXdUeXBlICE9PSBcIlhNTFwiKSB7XG5cdFx0XHR2aWV3VHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHR5cGU6IHZpZXdUeXBlLFxuXHRcdFx0cHJlcHJvY2Vzc29yczoge1xuXHRcdFx0XHR4bWw6IHByZXByb2Nlc3NvckNvbnRleHQsXG5cdFx0XHRcdGNvbnRyb2xzOiB7fVxuXHRcdFx0fSxcblx0XHRcdGlkOiBtVmlld0RhdGEuc3RhYmxlSWQsXG5cdFx0XHR2aWV3TmFtZTogbVNlcnZpY2VTZXR0aW5ncy52aWV3TmFtZSB8fCBvQ29tcG9uZW50LmdldFZpZXdOYW1lPy4oKSxcblx0XHRcdHZpZXdEYXRhOiBtVmlld0RhdGEsXG5cdFx0XHRjYWNoZToge1xuXHRcdFx0XHRrZXlzOiBbc0NhY2hlS2V5XSxcblx0XHRcdFx0YWRkaXRpb25hbERhdGE6IHtcblx0XHRcdFx0XHQvLyBXZSBzdG9yZSB0aGUgcGFnZSBtb2RlbCBkYXRhIGluIHRoZSBgYWRkaXRpb25hbERhdGFgIG9mIHRoZSB2aWV3IGNhY2hlLCB0aGlzIHdheSBpdCBpcyBhbHdheXMgaW4gc3luY1xuXHRcdFx0XHRcdGdldEFkZGl0aW9uYWxDYWNoZURhdGE6ICgpOiB1bmtub3duID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBvUGFnZU1vZGVsLmdldERhdGEoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHNldEFkZGl0aW9uYWxDYWNoZURhdGE6ICh2YWx1ZTogb2JqZWN0KTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRvUGFnZU1vZGVsLnNldERhdGEodmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcInNhcC5mZS5pMThuXCI6IG9SZXNvdXJjZU1vZGVsXG5cdFx0XHR9LFxuXHRcdFx0aGVpZ2h0OiBcIjEwMCVcIlxuXHRcdH07XG5cdH1cblxuXHRhc3luYyBfY3JlYXRlRXJyb3JQYWdlKFxuXHRcdHJlYXNvbjogRXJyb3IsXG5cdFx0b1ZpZXdTZXR0aW5nczogVmlld1NldHRpbmdzLFxuXHRcdHZpZXdOYW1lOiBzdHJpbmcsXG5cdFx0b0NvbXBvbmVudDogVGVtcGxhdGVDb21wb25lbnQsXG5cdFx0c0NhY2hlS2V5OiBzdHJpbmcgfCBudWxsXG5cdCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Ly8ganVzdCByZXBsYWNlIHRoZSB2aWV3IG5hbWUgYW5kIGEgbW9kZWwgY29udGFpbmluZyB0aGUgcmVhc29uLCBidXQga2VlcCB0aGUgb3RoZXIgc2V0dGluZ3Ncblx0XHRMb2cuZXJyb3IocmVhc29uLm1lc3NhZ2UsIHJlYXNvbik7XG5cdFx0b1ZpZXdTZXR0aW5ncy52aWV3TmFtZSA9IHZpZXdOYW1lO1xuXHRcdGlmIChvVmlld1NldHRpbmdzLnByZXByb2Nlc3NvcnMpIHtcblx0XHRcdChvVmlld1NldHRpbmdzLnByZXByb2Nlc3NvcnMgYXMgUmVjb3JkPHN0cmluZywgeyBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIE1vZGVsPiB9PikueG1sLm1vZGVsc1tcImVycm9yXCJdID0gbmV3IEpTT05Nb2RlbChyZWFzb24pO1xuXHRcdH1cblx0XHRkZWxldGUgb1ZpZXdTZXR0aW5ncy5jYWNoZTtcblx0XHRvVmlld1NldHRpbmdzLmlkICs9IFwiLUVycm9yXCI7XG5cdFx0b1ZpZXdTZXR0aW5ncy52aWV3RGF0YS5zdGFibGVJZCArPSBcIi1FcnJvclwiO1xuXHRcdGRlbGV0ZSBvVmlld1NldHRpbmdzLmNvbnRyb2xsZXI7XG5cblx0XHRyZXR1cm4gb0NvbXBvbmVudC5ydW5Bc093bmVyKGFzeW5jICgpID0+IHtcblx0XHRcdHJldHVybiBWaWV3LmNyZWF0ZShvVmlld1NldHRpbmdzKS50aGVuKChvVmlldzogVmlldykgPT4ge1xuXHRcdFx0XHR0aGlzLm9WaWV3ID0gb1ZpZXcgYXMgRkVWaWV3O1xuXHRcdFx0XHR0aGlzLm9WaWV3LnNldE1vZGVsKG5ldyBKU09OTW9kZWwodGhpcy5vVmlldyksIFwiJHZpZXdcIik7XG5cdFx0XHRcdG9Db21wb25lbnQuc2V0QWdncmVnYXRpb24oXCJyb290Q29udHJvbFwiLCB0aGlzLm9WaWV3KTtcblx0XHRcdFx0b0NvbXBvbmVudC5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Q29udHJvbCgpLmdldENvbnRyb2xsZXIoKS5nZXRQbGFjZWhvbGRlcigpLmhpZGVSb290UGxhY2Vob2xkZXIoKTtcblx0XHRcdFx0cmV0dXJuIHNDYWNoZUtleTtcblx0XHRcdH0pO1xuXHRcdH0pIGFzIFByb21pc2U8c3RyaW5nPjtcblx0fVxuXG5cdGFzeW5jIGNyZWF0ZVZpZXcoXG5cdFx0b1Jlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0c1N0YWJsZUlkOiBzdHJpbmcsXG5cdFx0c0NhY2hlS2V5OiBzdHJpbmcgfCBudWxsLFxuXHRcdFRlbXBsYXRlQ29udmVydGVyOiB0eXBlb2YgX1RlbXBsYXRlQ29udmVydGVyLFxuXHRcdE1ldGFNb2RlbENvbnZlcnRlcjogdHlwZW9mIF9NZXRhTW9kZWxDb252ZXJ0ZXJcblx0KTogUHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdm9pZD4ge1xuXHRcdHRoaXMucmVzb3VyY2VNb2RlbCA9IG9SZXNvdXJjZU1vZGVsO1xuXHRcdHRoaXMuc3RhYmxlSWQgPSBzU3RhYmxlSWQ7XG5cdFx0dGhpcy5UZW1wbGF0ZUNvbnZlcnRlciA9IFRlbXBsYXRlQ29udmVydGVyO1xuXHRcdHRoaXMuTWV0YU1vZGVsQ29udmVydGVyID0gTWV0YU1vZGVsQ29udmVydGVyO1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cdFx0Y29uc3QgbVNlcnZpY2VTZXR0aW5ncyA9IG9Db250ZXh0LnNldHRpbmdzO1xuXHRcdGNvbnN0IHNDb252ZXJ0ZXJUeXBlID0gbVNlcnZpY2VTZXR0aW5ncy5jb252ZXJ0ZXJUeXBlO1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udGV4dC5zY29wZU9iamVjdCBhcyBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD47XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvQ29tcG9uZW50KTtcblx0XHRsZXQgc0Z1bGxDb250ZXh0UGF0aDogc3RyaW5nID1cblx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcihvQ29tcG9uZW50KT8ub3B0aW9ucz8uc2V0dGluZ3M/LmZ1bGxDb250ZXh0UGF0aCA/PyBcIlwiO1xuXHRcdGlmICghc0Z1bGxDb250ZXh0UGF0aCkge1xuXHRcdFx0Ly8gaWYgdGhlIGNvbnRleHQgcGF0aCBjb3VsZG4ndCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcm91dGluZyBzZXJ2aWNlLCB0cnkgdG8gZ2V0IGl0IGZyb20gdGhlIGNvbXBvbmVudCBpdHNlbGZcblx0XHRcdGNvbnN0IGNvbXBvbmVudENvbnRleHRQYXRoID0gb0NvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpO1xuXHRcdFx0aWYgKGNvbXBvbmVudENvbnRleHRQYXRoKSB7XG5cdFx0XHRcdHNGdWxsQ29udGV4dFBhdGggPSBjb21wb25lbnRDb250ZXh0UGF0aC5lbmRzV2l0aChcIi9cIikgPyBjb21wb25lbnRDb250ZXh0UGF0aCA6IGAke2NvbXBvbmVudENvbnRleHRQYXRofS9gO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBvTWFuaWZlc3RDb250ZW50ID0gb0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpO1xuXHRcdGNvbnN0IG9EZXZpY2VNb2RlbCA9IG5ldyBKU09OTW9kZWwoRGV2aWNlKS5zZXREZWZhdWx0QmluZGluZ01vZGUoXCJPbmVXYXlcIik7XG5cdFx0Y29uc3Qgb01hbmlmZXN0TW9kZWwgPSBuZXcgSlNPTk1vZGVsKG9NYW5pZmVzdENvbnRlbnQpO1xuXHRcdGxldCBvUGFnZU1vZGVsOiBUZW1wbGF0ZU1vZGVsLCBvVmlld0RhdGFNb2RlbDogTW9kZWwsIG1WaWV3RGF0YTogVmlld0RhdGE7XG5cdFx0Ly8gTG9hZCB0aGUgaW5kZXggZm9yIHRoZSBhZGRpdGlvbmFsIGJ1aWxkaW5nIGJsb2NrcyB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZW1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb1JvdXRpbmdTZXJ2aWNlID0gYXdhaXQgb0FwcENvbXBvbmVudC5nZXRTZXJ2aWNlKFwicm91dGluZ1NlcnZpY2VcIik7XG5cdFx0XHQvLyBSZXRyaWV2ZSB0aGUgdmlld0xldmVsIGZvciB0aGUgY29tcG9uZW50XG5cdFx0XHRjb25zdCBvVGFyZ2V0SW5mbyA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcihvQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IG1PdXRib3VuZHMgPVxuXHRcdFx0XHQob01hbmlmZXN0Q29udGVudFtcInNhcC5hcHBcIl0gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXS5jcm9zc05hdmlnYXRpb24gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXS5jcm9zc05hdmlnYXRpb24ub3V0Ym91bmRzKSB8fFxuXHRcdFx0XHR7fTtcblx0XHRcdGNvbnN0IG1OYXZpZ2F0aW9uID0gb0NvbXBvbmVudC5nZXROYXZpZ2F0aW9uKCkgfHwge307XG5cdFx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IE1ldGFNb2RlbENvbnZlcnRlci5jb252ZXJ0VHlwZXMoXG5cdFx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX2VuaGFuY2VOYXZpZ2F0aW9uQ29uZmlnKG1OYXZpZ2F0aW9uLCBtT3V0Ym91bmRzLCBjb252ZXJ0ZWRNZXRhZGF0YSwgc1N0YWJsZUlkKTtcblx0XHRcdGNvbnN0IGRlZmluaXRpb25Db250ZXh0ID0gbmV3IERlZmluaXRpb25Db250ZXh0KGNvbnZlcnRlZE1ldGFkYXRhKTtcblx0XHRcdGRlZmluaXRpb25Db250ZXh0LmFkZEFwcGxpY2F0aW9uTWFuaWZlc3Qob01hbmlmZXN0Q29udGVudCBhcyBTQVBKU09OU2NoZW1hRm9yV2ViQXBwbGljYXRpb25NYW5pZmVzdEZpbGUpO1xuXG5cdFx0XHRtVmlld0RhdGEgPSB7XG5cdFx0XHRcdGFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCxcblx0XHRcdFx0bmF2aWdhdGlvbjogbU5hdmlnYXRpb24sXG5cdFx0XHRcdHZpZXdMZXZlbDogb1RhcmdldEluZm8/LnZpZXdMZXZlbCxcblx0XHRcdFx0c3RhYmxlSWQ6IHNTdGFibGVJZCxcblx0XHRcdFx0Y29udGVudERlbnNpdGllczogb01hbmlmZXN0Q29udGVudFtcInNhcC51aTVcIl0/LmNvbnRlbnREZW5zaXRpZXMsXG5cdFx0XHRcdHJlc291cmNlTW9kZWw6IG9SZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRmdWxsQ29udGV4dFBhdGg6IHNGdWxsQ29udGV4dFBhdGgsXG5cdFx0XHRcdGlzRGVza3RvcDogRGV2aWNlLnN5c3RlbS5kZXNrdG9wLFxuXHRcdFx0XHRpc1Bob25lOiBEZXZpY2Uuc3lzdGVtLnBob25lLFxuXHRcdFx0XHRjb252ZXJ0ZXJUeXBlOiBUZW1wbGF0ZVR5cGUuRnJlZVN0eWxlUGFnZVxuXHRcdFx0fTtcblx0XHRcdGlmIChvQ29tcG9uZW50LmdldFZpZXdEYXRhKSB7XG5cdFx0XHRcdE9iamVjdC5hc3NpZ24obVZpZXdEYXRhLCBvQ29tcG9uZW50LmdldFZpZXdEYXRhKCkpO1xuXHRcdFx0XHRtVmlld0RhdGEgPSBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3Rvcnkuc2V0UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzKFxuXHRcdFx0XHRcdG9NYW5pZmVzdENvbnRlbnQsXG5cdFx0XHRcdFx0bVZpZXdEYXRhLFxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0dGhpcy5wYWdlSWRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1WaWV3RGF0YS5pc1NoYXJlQnV0dG9uVmlzaWJsZUZvck15SW5ib3ggPSBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuZ2V0U2hhcmVCdXR0b25WaXNpYmlsaXR5Rm9yTXlJbmJveChvQXBwQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IG9TaGVsbFNlcnZpY2VzID0gb0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cdFx0XHRtVmlld0RhdGEuY29udmVydGVyVHlwZSA9IHNDb252ZXJ0ZXJUeXBlO1xuXHRcdFx0bVZpZXdEYXRhLnNoZWxsQ29udGVudERlbnNpdHkgPSBvU2hlbGxTZXJ2aWNlcy5nZXRDb250ZW50RGVuc2l0eSgpO1xuXHRcdFx0Y29uc3Qgc2FwZmVNYW5pZmVzdENvbnRlbnQgPSBvTWFuaWZlc3RDb250ZW50W1wic2FwLmZlXCJdO1xuXHRcdFx0bVZpZXdEYXRhLnNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gb01hbmlmZXN0Q29udGVudFtcInNhcC5mZVwiXTtcblx0XHRcdG1WaWV3RGF0YS5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0ID0gc2FwZmVNYW5pZmVzdENvbnRlbnQ/LmZvcm1cblx0XHRcdFx0PyBzYXBmZU1hbmlmZXN0Q29udGVudD8uZm9ybT8ucmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdFxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdG9WaWV3RGF0YU1vZGVsID0gbmV3IEpTT05Nb2RlbChtVmlld0RhdGEpO1xuXHRcdFx0aWYgKG1WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbikge1xuXHRcdFx0XHRmb3IgKGNvbnN0IHNBbm5vdGF0aW9uUGF0aCBpbiBtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24pIHtcblx0XHRcdFx0XHRpZiAoc0Fubm90YXRpb25QYXRoLmluY2x1ZGVzKFwiW1wiKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc1RhcmdldEFubm90YXRpb25QYXRoID0gcmVzb2x2ZUR5bmFtaWNFeHByZXNzaW9uKHNBbm5vdGF0aW9uUGF0aCwgb01ldGFNb2RlbCk7XG5cdFx0XHRcdFx0XHRtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb25bc1RhcmdldEFubm90YXRpb25QYXRoXSA9IG1WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbltzQW5ub3RhdGlvblBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvUGFnZU1vZGVsID0gbmV3IFRlbXBsYXRlTW9kZWwoKCkgPT4ge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IG9EaWFnbm9zdGljcyA9IG9BcHBDb21wb25lbnQuZ2V0RGlhZ25vc3RpY3MoKTtcblx0XHRcdFx0XHRjb25zdCBpSXNzdWVDb3VudCA9IG9EaWFnbm9zdGljcy5nZXRJc3N1ZXMoKS5sZW5ndGg7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnZlcnRlclBhZ2VNb2RlbCA9IFRlbXBsYXRlQ29udmVydGVyLmNvbnZlcnRQYWdlKFxuXHRcdFx0XHRcdFx0c0NvbnZlcnRlclR5cGUsXG5cdFx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0bVZpZXdEYXRhIGFzIHVua25vd24gYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3MsXG5cdFx0XHRcdFx0XHRuZXcgTWFuaWZlc3RXcmFwcGVyKG1WaWV3RGF0YSBhcyB1bmtub3duIGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzLCBvQXBwQ29tcG9uZW50KSxcblx0XHRcdFx0XHRcdG9EaWFnbm9zdGljcyxcblx0XHRcdFx0XHRcdHNGdWxsQ29udGV4dFBhdGgsXG5cdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkuZ2V0Q2FwYWJpbGl0aWVzKCksXG5cdFx0XHRcdFx0XHRvQ29tcG9uZW50XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRpZiAob0NvbnZlcnRlclBhZ2VNb2RlbCAmJiBvQ29tcG9uZW50Ll9nZXRDb250cm9sbGVyTmFtZSgpKSB7XG5cdFx0XHRcdFx0XHQob0NvbnZlcnRlclBhZ2VNb2RlbCBhcyB7IGNvbnRyb2xsZXJOYW1lPzogc3RyaW5nIH0pLmNvbnRyb2xsZXJOYW1lID0gb0NvbXBvbmVudC5fZ2V0Q29udHJvbGxlck5hbWUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYUlzc3VlcyA9IG9EaWFnbm9zdGljcy5nZXRJc3N1ZXMoKTtcblx0XHRcdFx0XHRjb25zdCBhQWRkZWRJc3N1ZXMgPSBhSXNzdWVzLnNsaWNlKGlJc3N1ZUNvdW50KTtcblx0XHRcdFx0XHRpZiAoYUFkZGVkSXNzdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdExvZy53YXJuaW5nKFxuXHRcdFx0XHRcdFx0XHRcIlNvbWUgaXNzdWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiB5b3VyIHByb2plY3QsIHBsZWFzZSBjaGVjayB0aGUgVUk1IHN1cHBvcnQgYXNzaXN0YW50IHJ1bGUgZm9yIHNhcC5mZS5jb3JlXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBvQ29udmVydGVyUGFnZU1vZGVsO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5lcnJvcihlcnJvciBhcyBzdHJpbmcsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHR9XG5cdFx0XHR9LCBvTWV0YU1vZGVsKTtcblx0XHRcdGNvbnN0IGFTcGxpdFBhdGggPSBzRnVsbENvbnRleHRQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gdGhpcy5fZ2V0RnVsbFBhdGhUb0VudGl0eVNldChhU3BsaXRQYXRoLCBvTWV0YU1vZGVsKTtcblx0XHRcdGNvbnN0IHByZXByb2Nlc3NvckNvbnRleHQ6IFhNTFByZXByb2Nlc3NvckNvbnRleHQgPSB7XG5cdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IHNFbnRpdHlTZXRQYXRoID8gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRW50aXR5U2V0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0ZnVsbENvbnRleHRQYXRoOiBzRnVsbENvbnRleHRQYXRoID8gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVsbENvbnRleHRQYXRoKSA6IG51bGwsXG5cdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogc0Z1bGxDb250ZXh0UGF0aCA/IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bGxDb250ZXh0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogb1BhZ2VNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIiwgdW5kZWZpbmVkLCB7IG5vUmVzb2x2ZTogdHJ1ZSB9KSxcblx0XHRcdFx0XHRcdHZpZXdEYXRhOiBtVmlld0RhdGEgPyBvVmlld0RhdGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgOiBudWxsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdGVudGl0eVNldDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGZ1bGxDb250ZXh0UGF0aDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XCJzYXAuZmUuaTE4blwiOiBvUmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGRldmljZTogb0RldmljZU1vZGVsLFxuXHRcdFx0XHRcdFx0bWFuaWZlc3Q6IG9NYW5pZmVzdE1vZGVsLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogb1BhZ2VNb2RlbCBhcyB1bmtub3duIGFzIEpTT05Nb2RlbCxcblx0XHRcdFx0XHRcdHZpZXdEYXRhOiBvVmlld0RhdGFNb2RlbFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZnVsbENvbnRleHRQYXRoOiBzRnVsbENvbnRleHRQYXRoLFxuXHRcdFx0XHRcdGdldENvbnZlcnRlZE1ldGFkYXRhOiAoKSA9PiBjb252ZXJ0ZWRNZXRhZGF0YSxcblx0XHRcdFx0XHRnZXREZWZpbml0aW9uQ29udGV4dCgpOiBEZWZpbml0aW9uQ29udGV4dCB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGVmaW5pdGlvbkNvbnRleHQ7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXREZWZpbml0aW9uRm9yUGFnZSgpOiBEZWZpbml0aW9uUGFnZSB7XG5cdFx0XHRcdFx0XHRsZXQgZnVsbENvbnRleHRQYXRoID0gc0Z1bGxDb250ZXh0UGF0aDtcblx0XHRcdFx0XHRcdGlmIChmdWxsQ29udGV4dFBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGZ1bGxDb250ZXh0UGF0aCA9IGZ1bGxDb250ZXh0UGF0aC5zdWJzdHJpbmcoMCwgZnVsbENvbnRleHRQYXRoLmxlbmd0aCAtIDEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIGRlZmluaXRpb25Db250ZXh0LmdldFBhZ2VGb3IoZnVsbENvbnRleHRQYXRoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHR2aWV3SWQ6IHNTdGFibGVJZFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRvVmlld1NldHRpbmdzID0gdGhpcy5fZ2V0Vmlld1NldHRpbmdzKFxuXHRcdFx0XHRcdHByZXByb2Nlc3NvckNvbnRleHQsXG5cdFx0XHRcdFx0bVNlcnZpY2VTZXR0aW5ncyxcblx0XHRcdFx0XHRvQ29tcG9uZW50LFxuXHRcdFx0XHRcdG1WaWV3RGF0YSxcblx0XHRcdFx0XHRzQ2FjaGVLZXksXG5cdFx0XHRcdFx0b1BhZ2VNb2RlbCBhcyB1bmtub3duIGFzIEpTT05Nb2RlbCxcblx0XHRcdFx0XHRvUmVzb3VyY2VNb2RlbFxuXHRcdFx0XHQpO1xuXHRcdFx0Ly8gU2V0dGluZyB0aGUgcGFnZU1vZGVsIG9uIHRoZSBjb21wb25lbnQgZm9yIHBvdGVudGlhbCByZXVzZVxuXHRcdFx0b0NvbXBvbmVudC5zZXRNb2RlbChvUGFnZU1vZGVsIGFzIHVua25vd24gYXMgSlNPTk1vZGVsLCBcIl9wYWdlTW9kZWxcIik7XG5cdFx0XHRvQ29tcG9uZW50LnNldE1vZGVsKG9WaWV3RGF0YU1vZGVsLCBcInZpZXdEYXRhXCIpO1xuXHRcdFx0Y29uc3QgdWlNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKTtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdFx0b0NvbXBvbmVudC5zZXRNb2RlbCh1aU1vZGVsLCBcInVpXCIpO1xuXHRcdFx0b0NvbXBvbmVudC5zZXRNb2RlbChpbnRlcm5hbE1vZGVsLCBcImludGVybmFsXCIpO1xuXHRcdFx0b0NvbXBvbmVudC5zZXRNb2RlbChpbnRlcm5hbE1vZGVsLCBcInBhZ2VJbnRlcm5hbFwiKTtcblx0XHRcdGNvbnN0IHBhdGggPSBgL3BhZ2VzLyR7b1ZpZXdTZXR0aW5ncy5pZH1gO1xuXHRcdFx0dWlNb2RlbC5zZXRQcm9wZXJ0eShwYXRoLCB7XG5cdFx0XHRcdGNvbnRyb2xzOiB7fVxuXHRcdFx0fSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KHBhdGgsIHtcblx0XHRcdFx0Y29udHJvbHM6IHt9LFxuXHRcdFx0XHRjb2xsYWJvcmF0aW9uOiB7fVxuXHRcdFx0fSk7XG5cdFx0XHRsZXQgdGFyZ2V0VUlNb2RlbENvbnRleHQgPSBcIi9cIjtcblx0XHRcdGlmIChvQ29tcG9uZW50LmlzQTxDb250cm9sPihcInNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5Db21wb25lbnRcIikpIHtcblx0XHRcdFx0dGFyZ2V0VUlNb2RlbENvbnRleHQgPSBgLyR7b1ZpZXdTZXR0aW5ncy5pZH1gO1xuXHRcdFx0fVxuXHRcdFx0b0NvbXBvbmVudC5zZXRCaW5kaW5nQ29udGV4dCh1aU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHRhcmdldFVJTW9kZWxDb250ZXh0KSwgXCJ1aVwiKTtcblx0XHRcdG9Db21wb25lbnQuc2V0QmluZGluZ0NvbnRleHQoaW50ZXJuYWxNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChwYXRoKSwgXCJpbnRlcm5hbFwiKTtcblxuXHRcdFx0Ly8gZm9yIHRoZSB0aW1lIGJlaW5nIHByb3ZpZGUgaXQgYWxzbyBwYWdlSW50ZXJuYWwgYXMgc29tZSBtYWNyb3MgYWNjZXNzIGl0IC0gdG8gYmUgcmVtb3ZlZFxuXHRcdFx0b0NvbXBvbmVudC5zZXRCaW5kaW5nQ29udGV4dChpbnRlcm5hbE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHBhdGgpLCBcInBhZ2VJbnRlcm5hbFwiKTtcblx0XHRcdG9Db21wb25lbnQuc2V0UHJlcHJvY2Vzc29yQ29udGV4dChwcmVwcm9jZXNzb3JDb250ZXh0KTtcblx0XHRcdHJldHVybiBvQ29tcG9uZW50LnJ1bkFzT3duZXIoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gVmlldy5jcmVhdGUob1ZpZXdTZXR0aW5ncylcblxuXHRcdFx0XHRcdC50aGVuKChvVmlldzogVmlldykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5vVmlldyA9IG9WaWV3IGFzIEZFVmlldztcblxuXHRcdFx0XHRcdFx0Y29uc3Qgdmlld0pTT05Nb2RlbCA9IG5ldyBKU09OTW9kZWwodGhpcy5vVmlldyk7XG5cdFx0XHRcdFx0XHRNb2RlbEhlbHBlci5lbmhhbmNlVmlld0pTT05Nb2RlbCh2aWV3SlNPTk1vZGVsIGFzIEpTT05Nb2RlbCAmIHsgX2dldE9iamVjdDogRnVuY3Rpb24gfSk7XG5cdFx0XHRcdFx0XHRvQ29tcG9uZW50LnNldE1vZGVsKHZpZXdKU09OTW9kZWwsIFwiJHZpZXdcIik7XG5cblx0XHRcdFx0XHRcdGlmIChvQXBwQ29tcG9uZW50LmhpZGVWaWV3RHVyaW5nQ3JlYXRpb24gJiYgb0NvbXBvbmVudC5pc0E8Q29udHJvbD4oXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuQ29tcG9uZW50XCIpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMub1ZpZXcuc2V0VmlzaWJsZShmYWxzZSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdG9Db21wb25lbnQuc2V0QWdncmVnYXRpb24oXCJyb290Q29udHJvbFwiLCB0aGlzLm9WaWV3KTtcblx0XHRcdFx0XHRcdGlmIChvQXBwQ29tcG9uZW50LmVhZ2VyVmlld0NyZWF0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgbmF2TmFtZSBpbiBtTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgcm91dGluZ1RhcmdldHMgPSBvQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5nZXRSb3V0aW5nU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5fZ2V0Um91dGVJbmZvcm1hdGlvbihtTmF2aWdhdGlvbltuYXZOYW1lXS5kZXRhaWwucm91dGUpPy50YXJnZXRzV2l0aEluZm87XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAocm91dGluZ1RhcmdldHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCByb3V0aW5nVGFyZ2V0IG9mIHJvdXRpbmdUYXJnZXRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgcm91dGluZ1RhcmdldE5hbWUgPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHJvdXRpbmdUYXJnZXQgPT09IFwic3RyaW5nXCIgPyByb3V0aW5nVGFyZ2V0IDogcm91dGluZ1RhcmdldC5uYW1lO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHJvdXRlclRhcmdldCA9IG9BcHBDb21wb25lbnQuZ2V0Um91dGVyKCkuZ2V0VGFyZ2V0KHJvdXRpbmdUYXJnZXROYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAocm91dGVyVGFyZ2V0ICYmICFBcnJheS5pc0FycmF5KHJvdXRlclRhcmdldCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChyb3V0ZXJUYXJnZXQgYXMgdW5rbm93biBhcyB7IGxvYWQ6IEZ1bmN0aW9uIH0pLmxvYWQocm91dGluZ1RhcmdldCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LCAyMDAwKTsgLy8gRGVsYXkgYSBiaXQgdG8gbm90IGJsb2NrIHRoZSBpbml0aWFsIHJlbmRlcmluZ1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gc0NhY2hlS2V5O1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGFzeW5jIChyZWFzb246IEVycm9yKSA9PiB7XG5cdFx0XHRcdFx0XHRvQ29tcG9uZW50LmdldFJvb3RDb250cm9sbGVyKCk/LmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdG9Db21wb25lbnQuc2V0Um9vdENvbnRyb2xsZXIoKTtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLl9jcmVhdGVFcnJvclBhZ2UoXG5cdFx0XHRcdFx0XHRcdHJlYXNvbixcblx0XHRcdFx0XHRcdFx0b1ZpZXdTZXR0aW5ncyxcblx0XHRcdFx0XHRcdFx0bVNlcnZpY2VTZXR0aW5ncy5lcnJvclZpZXdOYW1lIHx8IFwic2FwLmZlLmNvcmUuc2VydmljZXMudmlldy5UZW1wbGF0aW5nRXJyb3JQYWdlXCIsXG5cdFx0XHRcdFx0XHRcdG9Db21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdHNDYWNoZUtleVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgoZSkgPT4gTG9nLmVycm9yKGUubWVzc2FnZSwgZSkpO1xuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcigoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIHZpZXcgOiAke2Vycm9yfWApO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgX2VuaGFuY2VOYXZpZ2F0aW9uQ29uZmlnKFxuXHRcdG1OYXZpZ2F0aW9uOiBSZWNvcmQ8c3RyaW5nLCBOYXZpZ2F0aW9uQ29uZmlndXJhdGlvbj4sXG5cdFx0bU91dGJvdW5kczogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RPdXRib3VuZEVudHJ5Pixcblx0XHRjb252ZXJ0ZWRUeXBlczogQ29udmVydGVkTWV0YWRhdGEsXG5cdFx0c3RhYmxlSWQ6IHN0cmluZ1xuXHQpOiB2b2lkIHtcblx0XHRPYmplY3Qua2V5cyhtTmF2aWdhdGlvbikuZm9yRWFjaChmdW5jdGlvbiAobmF2aWdhdGlvbk9iamVjdEtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uT2JqZWN0ID0gbU5hdmlnYXRpb25bbmF2aWdhdGlvbk9iamVjdEtleV07XG5cdFx0XHRsZXQgb3V0Ym91bmRDb25maWc7XG5cdFx0XHRpZiAobmF2aWdhdGlvbk9iamVjdC5kZXRhaWwgJiYgbmF2aWdhdGlvbk9iamVjdC5kZXRhaWwub3V0Ym91bmQgJiYgbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZF0pIHtcblx0XHRcdFx0b3V0Ym91bmRDb25maWcgPSBtT3V0Ym91bmRzW25hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kXTtcblx0XHRcdFx0bmF2aWdhdGlvbk9iamVjdC5kZXRhaWwub3V0Ym91bmREZXRhaWwgPSB7XG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG91dGJvdW5kQ29uZmlnLnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdGFjdGlvbjogb3V0Ym91bmRDb25maWcuYWN0aW9uLFxuXHRcdFx0XHRcdHBhcmFtZXRlcnM6IG91dGJvdW5kQ29uZmlnLnBhcmFtZXRlcnNcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdGlmIChuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5hdmFpbGFiaWxpdHkpIHtcblx0XHRcdFx0cmVnaXN0ZXJWaXJ0dWFsUHJvcGVydHkoXG5cdFx0XHRcdFx0Y29udmVydGVkVHlwZXMsXG5cdFx0XHRcdFx0XCJyb3V0ZU5hdmlnYWJsZS1cIiArIG5hdmlnYXRpb25PYmplY3QuZGV0YWlsLnJvdXRlLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiByZXNvbHZlQmluZGluZ1N0cmluZyhuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5hdmFpbGFiaWxpdHkhKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHN0YWJsZUlkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobmF2aWdhdGlvbk9iamVjdC5jcmVhdGUgJiYgbmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmQgJiYgbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmNyZWF0ZS5vdXRib3VuZF0pIHtcblx0XHRcdFx0b3V0Ym91bmRDb25maWcgPSBtT3V0Ym91bmRzW25hdmlnYXRpb25PYmplY3QuY3JlYXRlLm91dGJvdW5kXTtcblx0XHRcdFx0bmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmREZXRhaWwgPSB7XG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG91dGJvdW5kQ29uZmlnLnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdGFjdGlvbjogb3V0Ym91bmRDb25maWcuYWN0aW9uLFxuXHRcdFx0XHRcdHBhcmFtZXRlcnM6IG91dGJvdW5kQ29uZmlnLnBhcmFtZXRlcnNcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgX2dldEZ1bGxQYXRoVG9FbnRpdHlTZXQoYVNwbGl0UGF0aDogc3RyaW5nW10sIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gYVNwbGl0UGF0aC5yZWR1Y2UoZnVuY3Rpb24gKHNQYXRoU29GYXI6IHN0cmluZywgc05leHRQYXRoUGFydDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRcdGlmIChzTmV4dFBhdGhQYXJ0ID09PSBcIlwiKSB7XG5cdFx0XHRcdHJldHVybiBzUGF0aFNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNQYXRoU29GYXIgPT09IFwiXCIpIHtcblx0XHRcdFx0c1BhdGhTb0ZhciA9IGAvJHtzTmV4dFBhdGhQYXJ0fWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvVGFyZ2V0ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhdGhTb0Zhcn0vJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcvJHtzTmV4dFBhdGhQYXJ0fWApO1xuXHRcdFx0XHRpZiAob1RhcmdldCAmJiBPYmplY3Qua2V5cyhvVGFyZ2V0KS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0c1BhdGhTb0ZhciArPSBcIi8kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1wiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNQYXRoU29GYXIgKz0gYC8ke3NOZXh0UGF0aFBhcnR9YDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzUGF0aFNvRmFyO1xuXHRcdH0sIFwiXCIpO1xuXHR9XG5cblx0Z2V0VmlldygpOiBWaWV3IHtcblx0XHRyZXR1cm4gdGhpcy5vVmlldztcblx0fVxuXG5cdGdldEludGVyZmFjZSgpOiBUZW1wbGF0ZWRWaWV3U2VydmljZSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRleGl0KCk6IHZvaWQge1xuXHRcdC8vIERlcmVnaXN0ZXIgZ2xvYmFsIGluc3RhbmNlXG5cdFx0aWYgKHRoaXMub1Jlc291cmNlTW9kZWxTZXJ2aWNlKSB7XG5cdFx0XHR0aGlzLm9SZXNvdXJjZU1vZGVsU2VydmljZS5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLm9DYWNoZUhhbmRsZXJTZXJ2aWNlKSB7XG5cdFx0XHR0aGlzLm9DYWNoZUhhbmRsZXJTZXJ2aWNlLmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0dGhpcy5vRmFjdG9yeS5yZW1vdmVHbG9iYWxJbnN0YW5jZSgpO1xuXHR9XG59XG5leHBvcnQgY2xhc3MgVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8VGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncz4ge1xuXHRfb0luc3RhbmNlUmVnaXN0cnk6IFJlY29yZDxzdHJpbmcsIFRlbXBsYXRlZFZpZXdTZXJ2aWNlPiA9IHt9O1xuXG5cdHN0YXRpYyBpQ3JlYXRpbmdWaWV3czogMDtcblxuXHRhc3luYyBjcmVhdGVJbnN0YW5jZShvU2VydmljZUNvbnRleHQ6IFNlcnZpY2VDb250ZXh0PFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3M+KTogUHJvbWlzZTxUZW1wbGF0ZWRWaWV3U2VydmljZT4ge1xuXHRcdFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5pQ3JlYXRpbmdWaWV3cysrO1xuXHRcdGNvbnN0IG9UZW1wbGF0ZWRWaWV3U2VydmljZSA9IG5ldyBUZW1wbGF0ZWRWaWV3U2VydmljZShPYmplY3QuYXNzaWduKHsgZmFjdG9yeTogdGhpcyB9LCBvU2VydmljZUNvbnRleHQpKTtcblx0XHRyZXR1cm4gb1RlbXBsYXRlZFZpZXdTZXJ2aWNlLmluaXRQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0VGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5LmlDcmVhdGluZ1ZpZXdzLS07XG5cdFx0XHRyZXR1cm4gb1RlbXBsYXRlZFZpZXdTZXJ2aWNlO1xuXHRcdH0pO1xuXHR9XG5cblx0cmVtb3ZlR2xvYmFsSW5zdGFuY2UoKTogdm9pZCB7XG5cdFx0dGhpcy5fb0luc3RhbmNlUmVnaXN0cnkgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgY29tcG9uZW50IGRhdGEgc3BlY2lmaWVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSAnU2hhcmUnIGJ1dHRvbiBhbmQgcmV0dXJucyB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIHRoZSB2aXNpYmlsaXR5LlxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFNwZWNpZmllcyB0aGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlIGFzIHRydWUgb3IgZmFsc2UgYmFzZWQgd2hldGhlciB0aGUgJ1NoYXJlJyBidXR0b24gc2hvdWxkIGJlIHZpc2libGUgb3Igbm90XG5cdCAqL1xuXHRzdGF0aWMgZ2V0U2hhcmVCdXR0b25WaXNpYmlsaXR5Rm9yTXlJbmJveChhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGNvbXBvbmVudERhdGE6IENvbXBvbmVudERhdGEgPSBhcHBDb21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpO1xuXHRcdGlmIChjb21wb25lbnREYXRhICE9PSB1bmRlZmluZWQgJiYgY29tcG9uZW50RGF0YS5mZUVudmlyb25tZW50KSB7XG5cdFx0XHRyZXR1cm4gY29tcG9uZW50RGF0YS5mZUVudmlyb25tZW50LmdldFNoYXJlQ29udHJvbFZpc2liaWxpdHkoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdHN0YXRpYyBnZXROdW1iZXJPZlZpZXdzSW5DcmVhdGlvblN0YXRlKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5pQ3JlYXRpbmdWaWV3cztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHBhZ2UgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGZvciBhIHNwZWNpZmljIHBhZ2UgaWRlbnRpZmllZCBieSBpdHMgSUQuXG5cdCAqIEBwYXJhbSBtYW5pZmVzdCBUaGUgbWFuaWZlc3QgY29udGVudCBvYmplY3QgY29udGFpbmluZyBjb25maWd1cmF0aW9uIGRldGFpbHMuXG5cdCAqIEBwYXJhbSB2aWV3RGF0YSBUaGUgdmlldyBkYXRhIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZpZXcuXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCBpbnN0YW5jZS5cblx0ICogQHBhcmFtIHBhZ2VJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHBhZ2UgZm9yIHdoaWNoIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBhcmUgdG8gYmUgYXBwbGllZC5cblx0ICogQHJldHVybnMgVGhlIHVwZGF0ZWQgdmlldyBkYXRhIG9iamVjdCByZWZsZWN0aW5nIHRoZSBhcHBsaWVkIGNoYW5nZXMuXG5cdCAqL1xuXHRzdGF0aWMgc2V0UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzKFxuXHRcdG1hbmlmZXN0OiBNYW5pZmVzdENvbnRlbnQsXG5cdFx0dmlld0RhdGE6IFZpZXdEYXRhLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHBhZ2VJZDogc3RyaW5nXG5cdCk6IFZpZXdEYXRhIHtcblx0XHRjb25zdCB0YXJnZXRzID0gbWFuaWZlc3Q/LltcInNhcC51aTVcIl0/LnJvdXRpbmc/LnRhcmdldHMgPz8ge307XG5cdFx0bGV0IHJlYWxUYXJnZXQgPSBcIlwiO1xuXHRcdGZvciAoY29uc3QgdGFyZ2V0VG9GaW5kIGluIHRhcmdldHMpIHtcblx0XHRcdGlmICh0YXJnZXRzW3RhcmdldFRvRmluZF0uaWQgPT09IHBhZ2VJZCkge1xuXHRcdFx0XHRyZWFsVGFyZ2V0ID0gdGFyZ2V0VG9GaW5kO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHJlYWxUYXJnZXQgPT09IFwiXCIpIHtcblx0XHRcdHJlYWxUYXJnZXQgPSBwYWdlSWQ7XG5cdFx0fVxuXHRcdGNvbnN0IGFjdHVhbFNldHRpbmdzID0gbWFuaWZlc3Q/LltcInNhcC51aTVcIl0/LnJvdXRpbmc/LnRhcmdldHM/LltyZWFsVGFyZ2V0XT8ub3B0aW9ucz8uc2V0dGluZ3MgfHwge307XG5cdFx0cmV0dXJuIGFwcGx5UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzKGFjdHVhbFNldHRpbmdzLCB2aWV3RGF0YSwgYXBwQ29tcG9uZW50LCBwYWdlSWQpO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O01BdUdhQSxvQkFBb0IsMEJBQUFDLFFBQUE7SUFBQSxTQUFBRCxxQkFBQTtNQUFBLE9BQUFDLFFBQUEsQ0FBQUMsS0FBQSxPQUFBQyxTQUFBO0lBQUE7SUFBQUMsUUFBQSxDQUFBSixvQkFBQSxHQUFBQSxvQkFBQTtJQUFBSyxjQUFBLENBQUFMLG9CQUFBLEVBQUFDLFFBQUE7SUFBQSxJQUFBSyxNQUFBLEdBQUFOLG9CQUFBLENBQUFPLFNBQUE7SUFBQUQsTUFBQSxDQXFCaENFLElBQUksR0FBSixTQUFBQSxJQUFJQSxDQUFBLEVBQVM7TUFDWixNQUFNQyxvQkFBb0IsR0FBRyxFQUFFO01BQy9CLE1BQU1DLFFBQVEsR0FBRyxJQUFJLENBQUNDLFVBQVUsQ0FBQyxDQUFDO01BQ2xDLE1BQU1DLFVBQVUsR0FBR0YsUUFBUSxDQUFDRyxXQUFXO01BQ3ZDLE1BQU1DLGFBQWEsR0FBR0MsV0FBVyxDQUFDQyxlQUFlLENBQUNKLFVBQVUsQ0FBQztNQUM3RCxNQUFNSyxvQkFBb0IsR0FBR0gsYUFBYSxDQUFDSSx1QkFBdUIsQ0FBQyxDQUFDO01BQ3BFLE1BQU1DLFVBQVUsR0FBR0wsYUFBYSxDQUFDTSxZQUFZLENBQUMsQ0FBQztNQUMvQyxJQUFJLENBQUNDLE1BQU0sR0FBR1AsYUFBYSxDQUFDUSxVQUFVLENBQUNWLFVBQVUsQ0FBQ1csS0FBSyxDQUFDLENBQUMsQ0FBVztNQUNwRSxNQUFNQyxTQUFTLEdBQUcsR0FBR1YsYUFBYSxDQUFDVyxXQUFXLENBQUMsQ0FBQyxDQUFDQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssSUFBSSxD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
@@ -6,6 +6,7 @@ import { resolveBindingString } from "sap/fe/base/BindingToolkit";
6
6
  import type { EnhanceWithUI5 } from "sap/fe/base/ClassSupport";
7
7
  import type AppComponent from "sap/fe/core/AppComponent";
8
8
  import type { ComponentData } from "sap/fe/core/AppComponent";
9
+ import type { FEView } from "sap/fe/core/BaseController";
9
10
  import type { SemanticObject } from "sap/fe/core/CommonUtils";
10
11
  import CommonUtils from "sap/fe/core/CommonUtils";
11
12
  import type ResourceModel from "sap/fe/core/ResourceModel";
@@ -37,6 +38,7 @@ import { type HierachyMode as BreadcrumbsHierachyMode } from "sap/fe/macros/Brea
37
38
  import type { OverflowToolbarPriority } from "sap/m/library";
38
39
  import Device from "sap/ui/Device";
39
40
  import VersionInfo from "sap/ui/VersionInfo";
41
+ import type Control from "sap/ui/core/Control";
40
42
  import Core from "sap/ui/core/Core";
41
43
  import type { ManifestContent, ManifestOutboundEntry, ShareOptions } from "sap/ui/core/Manifest";
42
44
  import View from "sap/ui/core/mvc/View";
@@ -102,7 +104,7 @@ export type ViewData = {
102
104
  export class TemplatedViewService extends Service<TemplatedViewServiceSettings> {
103
105
  initPromise!: Promise<void>;
104
106
 
105
- oView!: View;
107
+ oView!: FEView;
106
108
 
107
109
  oResourceModelService!: ResourceModelService;
108
110
 
@@ -301,10 +303,14 @@ export class TemplatedViewService extends Service<TemplatedViewServiceSettings>
301
303
  if (oViewSettings.preprocessors) {
302
304
  (oViewSettings.preprocessors as Record<string, { models: Record<string, Model> }>).xml.models["error"] = new JSONModel(reason);
303
305
  }
306
+ delete oViewSettings.cache;
307
+ oViewSettings.id += "-Error";
308
+ oViewSettings.viewData.stableId += "-Error";
309
+ delete oViewSettings.controller;
304
310
 
305
311
  return oComponent.runAsOwner(async () => {
306
312
  return View.create(oViewSettings).then((oView: View) => {
307
- this.oView = oView;
313
+ this.oView = oView as FEView;
308
314
  this.oView.setModel(new JSONModel(this.oView), "$view");
309
315
  oComponent.setAggregation("rootControl", this.oView);
310
316
  oComponent.getAppComponent().getRootControl().getController().getPlaceholder().hideRootPlaceholder();
@@ -333,7 +339,10 @@ export class TemplatedViewService extends Service<TemplatedViewServiceSettings>
333
339
  oAppComponent.getRoutingService().getTargetInformationFor(oComponent)?.options?.settings?.fullContextPath ?? "";
334
340
  if (!sFullContextPath) {
335
341
  // if the context path couldn't be retrieved from the routing service, try to get it from the component itself
336
- sFullContextPath = oComponent.getContextPath() ?? "";
342
+ const componentContextPath = oComponent.getContextPath();
343
+ if (componentContextPath) {
344
+ sFullContextPath = componentContextPath.endsWith("/") ? componentContextPath : `${componentContextPath}/`;
345
+ }
337
346
  }
338
347
  const oMetaModel = oAppComponent.getMetaModel();
339
348
  const oManifestContent = oAppComponent.getManifest();
@@ -476,28 +485,78 @@ export class TemplatedViewService extends Service<TemplatedViewServiceSettings>
476
485
  );
477
486
  // Setting the pageModel on the component for potential reuse
478
487
  oComponent.setModel(oPageModel as unknown as JSONModel, "_pageModel");
488
+ oComponent.setModel(oViewDataModel, "viewData");
489
+ const uiModel = oAppComponent.getModel("ui");
490
+ const internalModel = oAppComponent.getModel("internal") as JSONModel;
491
+ oComponent.setModel(uiModel, "ui");
492
+ oComponent.setModel(internalModel, "internal");
493
+ oComponent.setModel(internalModel, "pageInternal");
494
+ const path = `/pages/${oViewSettings.id}`;
495
+ uiModel.setProperty(path, {
496
+ controls: {}
497
+ });
498
+ internalModel.setProperty(path, {
499
+ controls: {},
500
+ collaboration: {}
501
+ });
502
+ let targetUIModelContext = "/";
503
+ if (oComponent.isA<Control>("sap.fe.templates.ListReport.Component")) {
504
+ targetUIModelContext = `/${oViewSettings.id}`;
505
+ }
506
+ oComponent.setBindingContext(uiModel.createBindingContext(targetUIModelContext), "ui");
507
+ oComponent.setBindingContext(internalModel.createBindingContext(path), "internal");
508
+
509
+ // for the time being provide it also pageInternal as some macros access it - to be removed
510
+ oComponent.setBindingContext(internalModel.createBindingContext(path), "pageInternal");
479
511
  oComponent.setPreprocessorContext(preprocessorContext);
480
512
  return oComponent.runAsOwner(async () => {
481
513
  return View.create(oViewSettings)
482
514
 
483
515
  .then((oView: View) => {
484
- this.oView = oView;
516
+ this.oView = oView as FEView;
517
+
485
518
  const viewJSONModel = new JSONModel(this.oView);
486
519
  ModelHelper.enhanceViewJSONModel(viewJSONModel as JSONModel & { _getObject: Function });
487
- this.oView.setModel(viewJSONModel, "$view");
488
- this.oView.setModel(oViewDataModel, "viewData");
520
+ oComponent.setModel(viewJSONModel, "$view");
521
+
522
+ if (oAppComponent.hideViewDuringCreation && oComponent.isA<Control>("sap.fe.templates.ObjectPage.Component")) {
523
+ this.oView.setVisible(false);
524
+ }
525
+
489
526
  oComponent.setAggregation("rootControl", this.oView);
527
+ if (oAppComponent.eagerViewCreation) {
528
+ setTimeout(() => {
529
+ for (const navName in mNavigation) {
530
+ const routingTargets = oAppComponent
531
+ .getRoutingService()
532
+ ._getRouteInformation(mNavigation[navName].detail.route)?.targetsWithInfo;
533
+ if (routingTargets) {
534
+ for (const routingTarget of routingTargets) {
535
+ const routingTargetName =
536
+ typeof routingTarget === "string" ? routingTarget : routingTarget.name;
537
+ const routerTarget = oAppComponent.getRouter().getTarget(routingTargetName);
538
+ if (routerTarget && !Array.isArray(routerTarget)) {
539
+ (routerTarget as unknown as { load: Function }).load(routingTarget);
540
+ }
541
+ }
542
+ }
543
+ }
544
+ }, 2000); // Delay a bit to not block the initial rendering
545
+ }
546
+
490
547
  return sCacheKey;
491
548
  })
492
- .catch(async (reason: Error) =>
493
- this._createErrorPage(
549
+ .catch(async (reason: Error) => {
550
+ oComponent.getRootController()?.destroy();
551
+ oComponent.setRootController();
552
+ return this._createErrorPage(
494
553
  reason,
495
554
  oViewSettings,
496
555
  mServiceSettings.errorViewName || "sap.fe.core.services.view.TemplatingErrorPage",
497
556
  oComponent,
498
557
  sCacheKey
499
- )
500
- )
558
+ );
559
+ })
501
560
  .catch((e) => Log.error(e.message, e));
502
561
  });
503
562
  } catch (error: unknown) {