@sapui5/sap.fe.core 1.98.0 → 1.101.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 (318) hide show
  1. package/package.json +8 -5
  2. package/src/sap/fe/core/.library +2 -3
  3. package/src/sap/fe/core/AnnotationHelper.js +328 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +321 -0
  5. package/src/sap/fe/core/AppComponent.js +382 -399
  6. package/src/sap/fe/core/AppComponent.ts +397 -0
  7. package/src/sap/fe/core/AppStateHandler.js +198 -181
  8. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  9. package/src/sap/fe/core/BaseController.js +83 -58
  10. package/src/sap/fe/core/BaseController.ts +67 -0
  11. package/src/sap/fe/core/BusyLocker.js +105 -121
  12. package/src/sap/fe/core/BusyLocker.ts +98 -0
  13. package/src/sap/fe/core/CommonUtils.js +2221 -2399
  14. package/src/sap/fe/core/CommonUtils.ts +2248 -0
  15. package/src/sap/fe/core/ExtensionAPI.js +280 -274
  16. package/src/sap/fe/core/ExtensionAPI.ts +242 -0
  17. package/src/sap/fe/core/PageController.js +219 -131
  18. package/src/sap/fe/core/PageController.ts +129 -0
  19. package/src/sap/fe/core/RouterProxy.js +936 -823
  20. package/src/sap/fe/core/RouterProxy.ts +854 -0
  21. package/src/sap/fe/core/Synchronization.js +41 -35
  22. package/src/sap/fe/core/Synchronization.ts +29 -0
  23. package/src/sap/fe/core/TemplateComponent.js +248 -164
  24. package/src/sap/fe/core/TemplateComponent.ts +161 -0
  25. package/src/sap/fe/core/TemplateModel.js +77 -54
  26. package/src/sap/fe/core/TemplateModel.ts +63 -0
  27. package/src/sap/fe/core/TransactionHelper.js +1575 -1664
  28. package/src/sap/fe/core/TransactionHelper.ts +1736 -0
  29. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +406 -0
  30. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +362 -0
  31. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +146 -0
  32. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +129 -0
  33. package/src/sap/fe/core/actions/collaboration/Manage.js +264 -0
  34. package/src/sap/fe/core/actions/collaboration/Manage.ts +246 -0
  35. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +100 -0
  36. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  37. package/src/sap/fe/core/actions/draft.js +663 -608
  38. package/src/sap/fe/core/actions/draft.ts +669 -0
  39. package/src/sap/fe/core/actions/messageHandling.js +576 -514
  40. package/src/sap/fe/core/actions/messageHandling.ts +562 -0
  41. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  42. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  43. package/src/sap/fe/core/actions/operations.js +1093 -1215
  44. package/src/sap/fe/core/actions/operations.ts +1193 -0
  45. package/src/sap/fe/core/actions/sticky.js +114 -104
  46. package/src/sap/fe/core/actions/sticky.ts +119 -0
  47. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
  48. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
  49. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
  50. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
  51. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +707 -0
  52. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +628 -0
  53. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
  54. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
  55. package/src/sap/fe/core/controllerextensions/EditFlow.js +1855 -1827
  56. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1792 -0
  57. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
  58. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +60 -0
  59. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +717 -512
  60. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +785 -0
  61. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -815
  62. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +810 -0
  63. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1057 -1004
  64. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1001 -0
  65. package/src/sap/fe/core/controllerextensions/KPIManagement.js +498 -533
  66. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +36 -32
  67. package/src/sap/fe/core/controllerextensions/MassEdit.js +142 -77
  68. package/src/sap/fe/core/controllerextensions/MassEdit.ts +155 -0
  69. package/src/sap/fe/core/controllerextensions/MessageHandler.js +222 -236
  70. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +215 -0
  71. package/src/sap/fe/core/controllerextensions/PageReady.js +312 -345
  72. package/src/sap/fe/core/controllerextensions/PageReady.ts +63 -55
  73. package/src/sap/fe/core/controllerextensions/Paginator.js +189 -175
  74. package/src/sap/fe/core/controllerextensions/Paginator.ts +169 -0
  75. package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -149
  76. package/src/sap/fe/core/controllerextensions/Placeholder.ts +149 -0
  77. package/src/sap/fe/core/controllerextensions/Routing.js +145 -121
  78. package/src/sap/fe/core/controllerextensions/Routing.ts +131 -0
  79. package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
  80. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  81. package/src/sap/fe/core/controllerextensions/Share.js +231 -268
  82. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  83. package/src/sap/fe/core/controllerextensions/SideEffects.js +603 -644
  84. package/src/sap/fe/core/controllerextensions/SideEffects.ts +79 -79
  85. package/src/sap/fe/core/controllerextensions/ViewState.js +775 -806
  86. package/src/sap/fe/core/controllerextensions/ViewState.ts +796 -0
  87. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
  88. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  89. package/src/sap/fe/core/controls/Any.js +28 -0
  90. package/src/sap/fe/core/controls/Any.ts +30 -0
  91. package/src/sap/fe/core/controls/CommandExecution.js +93 -68
  92. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  93. package/src/sap/fe/core/controls/ConditionalWrapper.js +166 -79
  94. package/src/sap/fe/core/controls/ConditionalWrapper.ts +74 -0
  95. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +366 -0
  96. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +278 -0
  97. package/src/sap/fe/core/controls/CustomQuickViewPage.js +168 -125
  98. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +116 -0
  99. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +44 -5
  100. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +164 -122
  101. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +155 -0
  102. package/src/sap/fe/core/controls/FieldWrapper.js +213 -153
  103. package/src/sap/fe/core/controls/FieldWrapper.ts +104 -0
  104. package/src/sap/fe/core/controls/FileWrapper.js +313 -0
  105. package/src/sap/fe/core/controls/FileWrapper.ts +169 -0
  106. package/src/sap/fe/core/controls/FilterBar.js +198 -159
  107. package/src/sap/fe/core/controls/FilterBar.ts +148 -0
  108. package/src/sap/fe/core/controls/FormElementWrapper.js +101 -39
  109. package/src/sap/fe/core/controls/FormElementWrapper.ts +37 -0
  110. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
  111. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  112. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
  113. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +148 -115
  114. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +102 -0
  115. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +301 -265
  116. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +252 -0
  117. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +186 -140
  118. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  119. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -322
  120. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  121. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +37 -42
  122. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +76 -74
  123. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +71 -0
  124. package/src/sap/fe/core/converters/ConverterContext.js +348 -379
  125. package/src/sap/fe/core/converters/ConverterContext.ts +23 -19
  126. package/src/sap/fe/core/converters/ManifestSettings.js +13 -1
  127. package/src/sap/fe/core/converters/ManifestSettings.ts +18 -2
  128. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -365
  129. package/src/sap/fe/core/converters/ManifestWrapper.ts +19 -0
  130. package/src/sap/fe/core/converters/MetaModelConverter.js +16 -11
  131. package/src/sap/fe/core/converters/MetaModelConverter.ts +21 -18
  132. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  133. package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
  134. package/src/sap/fe/core/converters/annotations/DataField.js +26 -13
  135. package/src/sap/fe/core/converters/annotations/DataField.ts +40 -17
  136. package/src/sap/fe/core/converters/common/AnnotationConverter.js +17 -13
  137. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -11
  138. package/src/sap/fe/core/converters/controls/Common/Action.ts +22 -21
  139. package/src/sap/fe/core/converters/controls/Common/Chart.js +12 -10
  140. package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -14
  141. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  142. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  143. package/src/sap/fe/core/converters/controls/Common/Form.js +9 -7
  144. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -5
  145. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  146. package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -2
  147. package/src/sap/fe/core/converters/controls/Common/Table.js +562 -218
  148. package/src/sap/fe/core/converters/controls/Common/Table.ts +670 -320
  149. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +218 -94
  150. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +265 -159
  151. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +495 -77
  152. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +535 -130
  153. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
  154. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
  155. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +10 -7
  156. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +13 -16
  157. package/src/sap/fe/core/converters/helpers/Aggregation.js +117 -127
  158. package/src/sap/fe/core/converters/helpers/Aggregation.ts +20 -5
  159. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  160. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  161. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  162. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  163. package/src/sap/fe/core/converters/helpers/IssueManager.js +4 -1
  164. package/src/sap/fe/core/converters/helpers/IssueManager.ts +3 -0
  165. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  166. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  167. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  168. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
  169. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +54 -30
  170. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +69 -43
  171. package/src/sap/fe/core/converters/templates/ListReportConverter.js +52 -28
  172. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +111 -74
  173. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +11 -9
  174. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +8 -8
  175. package/src/sap/fe/core/designtime/AppComponent.designtime.js +93 -98
  176. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  177. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  178. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  179. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  180. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  181. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  182. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  183. package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
  184. package/src/sap/fe/core/formatters/KPIFormatter.ts +4 -1
  185. package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
  186. package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
  187. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
  188. package/src/sap/fe/core/formatters/ValueFormatter.ts +5 -7
  189. package/src/sap/fe/core/fpm/Component.js +81 -55
  190. package/src/sap/fe/core/fpm/Component.ts +43 -0
  191. package/src/sap/fe/core/helpers/AppStartupHelper.js +324 -310
  192. package/src/sap/fe/core/helpers/AppStartupHelper.ts +370 -341
  193. package/src/sap/fe/core/helpers/BindingExpression.js +319 -360
  194. package/src/sap/fe/core/helpers/BindingExpression.ts +323 -397
  195. package/src/sap/fe/core/helpers/ClassSupport.js +321 -168
  196. package/src/sap/fe/core/helpers/ClassSupport.ts +362 -158
  197. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
  198. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
  199. package/src/sap/fe/core/helpers/EditState.js +81 -84
  200. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  201. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  202. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  203. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  204. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  205. package/src/sap/fe/core/helpers/KeepAliveHelper.js +3 -4
  206. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +9 -9
  207. package/src/sap/fe/core/helpers/MassEditHelper.js +736 -676
  208. package/src/sap/fe/core/helpers/MassEditHelper.ts +803 -0
  209. package/src/sap/fe/core/helpers/ModelHelper.js +281 -225
  210. package/src/sap/fe/core/helpers/ModelHelper.ts +273 -0
  211. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  212. package/src/sap/fe/core/helpers/PasteHelper.ts +197 -0
  213. package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
  214. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +336 -0
  215. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  216. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  217. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -10
  218. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -10
  219. package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
  220. package/src/sap/fe/core/jsx-runtime/jsx.ts +23 -9
  221. package/src/sap/fe/core/library.js +426 -451
  222. package/src/sap/fe/core/library.support.js +23 -33
  223. package/src/sap/fe/core/library.support.ts +23 -0
  224. package/src/sap/fe/core/library.ts +420 -0
  225. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
  226. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +5 -5
  227. package/src/sap/fe/core/messagebundle.properties +63 -18
  228. package/src/sap/fe/core/messagebundle_ar.properties +37 -6
  229. package/src/sap/fe/core/messagebundle_bg.properties +37 -6
  230. package/src/sap/fe/core/messagebundle_ca.properties +37 -6
  231. package/src/sap/fe/core/messagebundle_cs.properties +38 -7
  232. package/src/sap/fe/core/messagebundle_cy.properties +37 -6
  233. package/src/sap/fe/core/messagebundle_da.properties +37 -6
  234. package/src/sap/fe/core/messagebundle_de.properties +37 -6
  235. package/src/sap/fe/core/messagebundle_el.properties +37 -6
  236. package/src/sap/fe/core/messagebundle_en.properties +37 -6
  237. package/src/sap/fe/core/messagebundle_en_GB.properties +37 -6
  238. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +37 -6
  239. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +37 -6
  240. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +37 -6
  241. package/src/sap/fe/core/messagebundle_es.properties +37 -6
  242. package/src/sap/fe/core/messagebundle_es_MX.properties +37 -6
  243. package/src/sap/fe/core/messagebundle_et.properties +37 -6
  244. package/src/sap/fe/core/messagebundle_fi.properties +38 -7
  245. package/src/sap/fe/core/messagebundle_fr.properties +43 -12
  246. package/src/sap/fe/core/messagebundle_fr_CA.properties +45 -14
  247. package/src/sap/fe/core/messagebundle_hi.properties +43 -12
  248. package/src/sap/fe/core/messagebundle_hr.properties +43 -12
  249. package/src/sap/fe/core/messagebundle_hu.properties +37 -6
  250. package/src/sap/fe/core/messagebundle_id.properties +38 -7
  251. package/src/sap/fe/core/messagebundle_it.properties +37 -6
  252. package/src/sap/fe/core/messagebundle_iw.properties +37 -6
  253. package/src/sap/fe/core/messagebundle_ja.properties +36 -5
  254. package/src/sap/fe/core/messagebundle_kk.properties +43 -12
  255. package/src/sap/fe/core/messagebundle_ko.properties +37 -6
  256. package/src/sap/fe/core/messagebundle_lt.properties +37 -6
  257. package/src/sap/fe/core/messagebundle_lv.properties +44 -13
  258. package/src/sap/fe/core/messagebundle_ms.properties +42 -11
  259. package/src/sap/fe/core/messagebundle_nl.properties +37 -6
  260. package/src/sap/fe/core/messagebundle_no.properties +37 -6
  261. package/src/sap/fe/core/messagebundle_pl.properties +37 -6
  262. package/src/sap/fe/core/messagebundle_pt.properties +38 -7
  263. package/src/sap/fe/core/messagebundle_pt_PT.properties +37 -6
  264. package/src/sap/fe/core/messagebundle_ro.properties +37 -6
  265. package/src/sap/fe/core/messagebundle_ru.properties +37 -6
  266. package/src/sap/fe/core/messagebundle_sh.properties +39 -8
  267. package/src/sap/fe/core/messagebundle_sk.properties +37 -6
  268. package/src/sap/fe/core/messagebundle_sl.properties +43 -12
  269. package/src/sap/fe/core/messagebundle_sv.properties +38 -7
  270. package/src/sap/fe/core/messagebundle_th.properties +36 -5
  271. package/src/sap/fe/core/messagebundle_tr.properties +39 -8
  272. package/src/sap/fe/core/messagebundle_uk.properties +37 -6
  273. package/src/sap/fe/core/messagebundle_vi.properties +37 -6
  274. package/src/sap/fe/core/messagebundle_zh_CN.properties +37 -6
  275. package/src/sap/fe/core/messagebundle_zh_TW.properties +43 -12
  276. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +47 -73
  277. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  278. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
  279. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +211 -0
  280. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +70 -96
  281. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -8
  282. package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
  283. package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
  284. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
  285. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
  286. package/src/sap/fe/core/services/RoutingServiceFactory.js +963 -899
  287. package/src/sap/fe/core/services/RoutingServiceFactory.ts +907 -0
  288. package/src/sap/fe/core/services/ShellServicesFactory.js +694 -741
  289. package/src/sap/fe/core/services/ShellServicesFactory.ts +45 -40
  290. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +572 -643
  291. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +67 -96
  292. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -487
  293. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +449 -0
  294. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +48 -8
  295. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +11 -0
  296. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  297. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  298. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  299. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  300. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  301. package/src/sap/fe/core/support/CommonHelper.ts +1 -4
  302. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  303. package/src/sap/fe/core/templating/DataModelPathHelper.js +91 -90
  304. package/src/sap/fe/core/templating/DataModelPathHelper.ts +126 -123
  305. package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
  306. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +26 -5
  307. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  308. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  309. package/src/sap/fe/core/templating/FilterHelper.js +138 -79
  310. package/src/sap/fe/core/templating/FilterHelper.ts +148 -79
  311. package/src/sap/fe/core/templating/PropertyHelper.js +16 -2
  312. package/src/sap/fe/core/templating/PropertyHelper.ts +31 -24
  313. package/src/sap/fe/core/templating/UIFormatters.js +179 -43
  314. package/src/sap/fe/core/templating/UIFormatters.ts +190 -61
  315. package/src/sap/fe/core/type/Email.js +26 -8
  316. package/src/sap/fe/core/type/Email.ts +10 -11
  317. package/ui5.yaml +0 -3
  318. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -74
@@ -0,0 +1,436 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/ui/base/ManagedObject", "sap/ui/core/util/XMLPreprocessor"], function (ManagedObject, XMLPreprocessor) {
6
+ "use strict";
7
+
8
+ //Trace information
9
+ var aTraceInfo = [
10
+ /* Structure for a macro
11
+ {
12
+ macro: '', //name of macro
13
+ metaDataContexts: [ //Properties of type sap.ui.model.Context
14
+ {
15
+ name: '', //context property name / key
16
+ path: '', //from oContext.getPath()
17
+ }
18
+ ],
19
+ properties: { // Other properties which become part of {this>}
20
+ property1: value,
21
+ property2: value
22
+ }
23
+ viewInfo: {
24
+ viewInfo: {} // As specified in view or fragement creation
25
+ },
26
+ traceID: this.index, //ID for this trace information,
27
+ macroInfo: {
28
+ macroID: index, // traceID of this macro (redundant for macros)
29
+ parentMacroID, index // traceID of the parent macro (if it has a parent)
30
+ }
31
+ }
32
+ // Structure for a control
33
+ {
34
+ control: '', //control class
35
+ properties: { // Other properties which become part of {this>}
36
+ property1: {
37
+ originalValue: '', //Value before templating
38
+ resolvedValue: '' //Value after templating
39
+ }
40
+ }
41
+ contexts: { //Models and Contexts used during templating
42
+ // Model or context name used for this control
43
+ modelName1: { // For ODataMetaModel
44
+ path1: {
45
+ path: '', //absolut path within metamodel
46
+ data: '', //data of path unless type Object
47
+ }
48
+ modelName2: {
49
+ // for other model types
50
+ {
51
+ property1: value,
52
+ property2: value
53
+ }
54
+ // In case binding cannot be resolved -> mark as runtime binding
55
+ // This is not always true, e.g. in case the path is metamodelpath
56
+ {
57
+ "bindingFor": "Runtime"
58
+ }
59
+ }
60
+ },
61
+ viewInfo: {
62
+ viewInfo: {} // As specified in view or fragement creation
63
+ },
64
+ macroInfo: {
65
+ macroID: index, // traceID of the macro that created this control
66
+ parentMacroID, index // traceID of the macro's parent macro
67
+ },
68
+ traceID: this.index //ID for this trace information
69
+ }
70
+ */
71
+ ];
72
+ var traceNamespace = "http://schemas.sap.com/sapui5/extension/sap.fe.info/1",
73
+ xmlns = "http://www.w3.org/2000/xmlns/",
74
+
75
+ /**
76
+ * Switch is currently based on url parameter
77
+ */
78
+ traceIsOn = location.search.indexOf("sap-ui-xx-feTraceInfo=true") > -1,
79
+
80
+ /**
81
+ * Specify all namespaces that shall be traced during templating
82
+ */
83
+ aNamespaces = ["sap.m", "sap.uxap", "sap.ui.unified", "sap.f", "sap.ui.table", "sap.suite.ui.microchart", "sap.ui.layout.form", "sap.ui.mdc", "sap.ui.mdc.link", "sap.ui.mdc.field", "sap.fe.fpm"],
84
+ oCallbacks = {};
85
+
86
+ function fnClone(oObject) {
87
+ return JSON.parse(JSON.stringify(oObject));
88
+ }
89
+
90
+ function collectContextInfo(sValue, oContexts, oVisitor, oNode) {
91
+ var aContexts;
92
+ var aPromises = [];
93
+
94
+ try {
95
+ aContexts = ManagedObject.bindingParser(sValue, undefined, false, true) || [];
96
+ } catch (e) {
97
+ aContexts = [];
98
+ }
99
+
100
+ aContexts = Array.isArray(aContexts) ? aContexts : [aContexts];
101
+ aContexts.filter(function (oContext) {
102
+ return oContext.path || oContext.parts;
103
+ }).forEach(function (oContext) {
104
+ var aParts = oContext.parts || [oContext];
105
+ aParts.filter(function (oContext) {
106
+ return oContext.path;
107
+ }).forEach(function (oContext) {
108
+ var oModel = oContexts[oContext.model] = oContexts[oContext.model] || {};
109
+ var sSimplePath = oContext.path.indexOf(">") < 0 ? (oContext.model && oContext.model + ">") + oContext.path : oContext.path;
110
+ var oRealContext;
111
+ var aParts;
112
+
113
+ if (typeof oContext.model === "undefined" && sSimplePath.indexOf(">") > -1) {
114
+ aParts = sSimplePath.split(">");
115
+ oContext.model = aParts[0];
116
+ oContext.path = aParts[1];
117
+ }
118
+
119
+ try {
120
+ oRealContext = oVisitor.getContext(sSimplePath);
121
+ aPromises.push(oVisitor.getResult("{" + sSimplePath + "}", oNode).then(function (oResult) {
122
+ if (oRealContext.getModel().getMetadata().getName() === "sap.ui.model.json.JSONModel") {
123
+ if (!oResult.oModel) {
124
+ oModel[oContext.path] = oResult; //oRealContext.getObject(oContext.path);
125
+ } else {
126
+ oModel[oContext.path] = "Context from " + oResult.getPath();
127
+ }
128
+ } else {
129
+ oModel[oContext.path] = {
130
+ path: oRealContext.getPath(),
131
+ data: typeof oResult === "object" ? "[ctrl/cmd-click] on path to see data" : oResult
132
+ };
133
+ }
134
+ }).catch(function () {
135
+ oModel[oContext.path] = {
136
+ bindingFor: "Runtime"
137
+ };
138
+ }));
139
+ } catch (exc) {
140
+ oModel[oContext.path] = {
141
+ bindingFor: "Runtime"
142
+ };
143
+ }
144
+ });
145
+ });
146
+ return Promise.all(aPromises);
147
+ }
148
+
149
+ function fillAttributes(oResults, oAttributes, sName, sValue) {
150
+ return oResults.then(function (result) {
151
+ oAttributes[sName] = sValue !== result ? {
152
+ originalValue: sValue,
153
+ resolvedValue: result
154
+ } : sValue;
155
+ }).catch(function (e) {
156
+ oAttributes[sName] = {
157
+ originalValue: sValue,
158
+ error: e.stack && e.stack.toString() || e
159
+ };
160
+ });
161
+ }
162
+
163
+ function collectInfo(oNode, oVisitor) {
164
+ var oAttributes = {};
165
+ var aPromises = [];
166
+ var oContexts = {};
167
+ var oResults;
168
+
169
+ for (var i = oNode.attributes.length >>> 0; i--;) {
170
+ var oAttribute = oNode.attributes[i],
171
+ sName = oAttribute.nodeName,
172
+ sValue = oNode.getAttribute(sName);
173
+
174
+ if (!["core:require"].includes(sName)) {
175
+ aPromises.push(collectContextInfo(sValue, oContexts, oVisitor, oNode));
176
+ oResults = oVisitor.getResult(sValue, oNode);
177
+
178
+ if (oResults) {
179
+ aPromises.push(fillAttributes(oResults, oAttributes, sName, sValue));
180
+ } else {//What
181
+ }
182
+ }
183
+ }
184
+
185
+ return Promise.all(aPromises).then(function () {
186
+ return {
187
+ properties: oAttributes,
188
+ contexts: oContexts
189
+ };
190
+ });
191
+ }
192
+
193
+ function resolve(oNode, oVisitor) {
194
+ var sControlName = oNode.nodeName.split(":")[1] || oNode.nodeName,
195
+ bIsControl = /^[A-Z]/.test(sControlName),
196
+ oTraceMetadataContext = {
197
+ control: oNode.namespaceURI + "." + (oNode.nodeName.split(":")[1] || oNode.nodeName)
198
+ };
199
+
200
+ if (bIsControl) {
201
+ if (!oNode.ownerDocument.firstChild.getAttribute("xmlns:trace")) {
202
+ oNode.ownerDocument.firstChild.setAttributeNS(xmlns, "xmlns:trace", traceNamespace);
203
+ oNode.ownerDocument.firstChild.setAttributeNS(traceNamespace, "trace:is", "on");
204
+ }
205
+
206
+ return collectInfo(oNode, oVisitor).then(function (result) {
207
+ var bRelevant = Object.keys(result.contexts).length > 0; //If no context was used it is not relevant so we ignore Object.keys(result.properties).length
208
+
209
+ if (bRelevant) {
210
+ Object.assign(oTraceMetadataContext, result);
211
+ oTraceMetadataContext.viewInfo = oVisitor.getViewInfo();
212
+ oTraceMetadataContext.macroInfo = oVisitor.getSettings()["_macroInfo"];
213
+ oTraceMetadataContext.traceID = aTraceInfo.length;
214
+ oNode.setAttributeNS(traceNamespace, "trace:traceID", oTraceMetadataContext.traceID);
215
+ aTraceInfo.push(oTraceMetadataContext);
216
+ }
217
+
218
+ return oVisitor.visitAttributes(oNode).then(function () {
219
+ return oVisitor.visitChildNodes(oNode);
220
+ });
221
+ }).catch(function (exc) {
222
+ oTraceMetadataContext.error = {
223
+ exception: exc,
224
+ node: new XMLSerializer().serializeToString(oNode)
225
+ };
226
+ });
227
+ } else {
228
+ return oVisitor.visitAttributes(oNode).then(function () {
229
+ return oVisitor.visitChildNodes(oNode);
230
+ });
231
+ }
232
+ }
233
+ /**
234
+ * Register path-through XMLPreprocessor plugin for all namespaces
235
+ * given above in aNamespaces
236
+ */
237
+
238
+
239
+ if (traceIsOn) {
240
+ aNamespaces.forEach(function (namespace) {
241
+ oCallbacks[namespace] = XMLPreprocessor.plugIn(resolve.bind(namespace), namespace);
242
+ });
243
+ }
244
+ /**
245
+ * Adds information about the processing of one macro to the collection.
246
+ *
247
+ * @name sap.fe.macros.TraceInfo.traceMacroCalls
248
+ * @param {string} sName Macro class name
249
+ * @param {object} oMetadata Definition from (macro).metadata.js
250
+ * @param {object} mContexts Available named contexts
251
+ * @param {XMLNode} oNode
252
+ * @param {object} oVisitor
253
+ * @returns {object}
254
+ * @private
255
+ * @ui5-restricted
256
+ * @static
257
+ */
258
+
259
+
260
+ function traceMacroCalls(sName, oMetadata, mContexts, oNode, oVisitor) {
261
+ var aMetadataContextKeys = oMetadata.metadataContexts && Object.keys(oMetadata.metadataContexts) || [];
262
+ var aProperties = oMetadata.properties && Object.keys(oMetadata.properties) || [];
263
+ var macroInfo = fnClone(oVisitor.getSettings()["_macroInfo"] || {});
264
+ var oTraceMetadataContext = {
265
+ macro: sName,
266
+ metaDataContexts: [],
267
+ properties: {}
268
+ };
269
+
270
+ if (aMetadataContextKeys.length === 0) {
271
+ //In case the macro has not metadata.js we take all metadataContexts except this
272
+ aMetadataContextKeys = Object.keys(mContexts).filter(function (name) {
273
+ return name !== "this";
274
+ });
275
+ }
276
+
277
+ if (!oNode.getAttribute("xmlns:trace")) {
278
+ oNode.setAttributeNS(xmlns, "xmlns:trace", traceNamespace);
279
+ }
280
+
281
+ if (aMetadataContextKeys.length > 0) {
282
+ aMetadataContextKeys.forEach(function (sKey) {
283
+ var oContext = mContexts[sKey],
284
+ oMetaDataContext = oContext && {
285
+ name: sKey,
286
+ path: oContext.getPath() //data: JSON.stringify(oContext.getObject(),null,2)
287
+
288
+ };
289
+
290
+ if (oMetaDataContext) {
291
+ oTraceMetadataContext.metaDataContexts.push(oMetaDataContext);
292
+ }
293
+ });
294
+ aProperties.forEach(function (sKey) {
295
+ var //oPropertySettings = oMetadata.properties[sKey],
296
+ oProperty = mContexts.this.getObject(sKey); // (oNode.hasAttribute(sKey) && oNode.getAttribute(sKey)) ||
297
+ // (oPropertySettings.hasOwnProperty("defaultValue") && oPropertySettings.define) ||
298
+ // false;
299
+
300
+ if (oProperty) {
301
+ oTraceMetadataContext.properties[sKey] = oProperty;
302
+ }
303
+ });
304
+ oTraceMetadataContext.viewInfo = oVisitor.getViewInfo();
305
+ oTraceMetadataContext.traceID = aTraceInfo.length;
306
+ macroInfo.parentMacroID = macroInfo.macroID;
307
+ macroInfo.macroID = oTraceMetadataContext.traceID;
308
+ oTraceMetadataContext.macroInfo = macroInfo;
309
+ oNode.setAttributeNS(traceNamespace, "trace:macroID", oTraceMetadataContext.traceID);
310
+ aTraceInfo.push(oTraceMetadataContext);
311
+ return oTraceMetadataContext;
312
+ }
313
+ }
314
+ /**
315
+ * Returns the globally stored trace information for the macro or
316
+ * control marked with the given id.
317
+ *
318
+ * Returns all trace information if no id is specified
319
+ *
320
+ *
321
+ <pre>Structure for a macro
322
+ {
323
+ macro: '', //name of macro
324
+ metaDataContexts: [ //Properties of type sap.ui.model.Context
325
+ {
326
+ name: '', //context property name / key
327
+ path: '', //from oContext.getPath()
328
+ }
329
+ ],
330
+ properties: { // Other properties which become part of {this>}
331
+ property1: value,
332
+ property2: value
333
+ }
334
+ viewInfo: {
335
+ viewInfo: {} // As specified in view or fragement creation
336
+ },
337
+ traceID: this.index, //ID for this trace information,
338
+ macroInfo: {
339
+ macroID: index, // traceID of this macro (redundant for macros)
340
+ parentMacroID, index // traceID of the parent macro (if it has a parent)
341
+ }
342
+ }
343
+ Structure for a control
344
+ {
345
+ control: '', //control class
346
+ properties: { // Other properties which become part of {this>}
347
+ property1: {
348
+ originalValue: '', //Value before templating
349
+ resolvedValue: '' //Value after templating
350
+ }
351
+ }
352
+ contexts: { //Models and Contexts used during templating
353
+ // Model or context name used for this control
354
+ modelName1: { // For ODataMetaModel
355
+ path1: {
356
+ path: '', //absolut path within metamodel
357
+ data: '', //data of path unless type Object
358
+ }
359
+ modelName2: {
360
+ // for other model types
361
+ {
362
+ property1: value,
363
+ property2: value
364
+ }
365
+ // In case binding cannot be resolved -> mark as runtime binding
366
+ // This is not always true, e.g. in case the path is metamodelpath
367
+ {
368
+ "bindingFor": "Runtime"
369
+ }
370
+ }
371
+ },
372
+ viewInfo: {
373
+ viewInfo: {} // As specified in view or fragement creation
374
+ },
375
+ macroInfo: {
376
+ macroID: index, // traceID of the macro that created this control
377
+ parentMacroID, index // traceID of the macro's parent macro
378
+ },
379
+ traceID: this.index //ID for this trace information
380
+ }</pre>.
381
+ *
382
+ * @function
383
+ * @name sap.fe.macros.TraceInfo.getTraceInfo
384
+ * @param {number} id TraceInfo id
385
+ * @returns {object|Array} Object / Array for TraceInfo
386
+ * @private
387
+ * @static
388
+ */
389
+
390
+
391
+ function getTraceInfo(id) {
392
+ if (id) {
393
+ return aTraceInfo[id];
394
+ }
395
+
396
+ var aErrors = aTraceInfo.filter(function (traceInfo) {
397
+ return traceInfo.error;
398
+ });
399
+ return aErrors.length > 0 && aErrors || aTraceInfo;
400
+ }
401
+ /**
402
+ * Returns true if TraceInfo is active.
403
+ *
404
+ * @function
405
+ * @name sap.fe.macros.TraceInfo.isTraceInfoActive
406
+ * @returns {boolean} `true` when active
407
+ * @private
408
+ * @static
409
+ */
410
+
411
+
412
+ function isTraceInfoActive() {
413
+ return traceIsOn;
414
+ }
415
+ /**
416
+ * @typedef sap.fe.macros.TraceInfo
417
+ * TraceInfo for SAP Fiori elements
418
+ *
419
+ * Once traces is switched, information about macros and controls
420
+ * that are processed during xml preprocessing ( @see {@link sap.ui.core.util.XMLPreprocessor})
421
+ * will be collected within this singleton
422
+ * @namespace
423
+ * @private
424
+ * @global
425
+ * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
426
+ * @since 1.74.0
427
+ */
428
+
429
+
430
+ return {
431
+ isTraceInfoActive: isTraceInfoActive,
432
+ traceMacroCalls: traceMacroCalls,
433
+ getTraceInfo: getTraceInfo
434
+ };
435
+ }, true);
436
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyYWNlSW5mby50cyJdLCJuYW1lcyI6WyJhVHJhY2VJbmZvIiwidHJhY2VOYW1lc3BhY2UiLCJ4bWxucyIsInRyYWNlSXNPbiIsImxvY2F0aW9uIiwic2VhcmNoIiwiaW5kZXhPZiIsImFOYW1lc3BhY2VzIiwib0NhbGxiYWNrcyIsImZuQ2xvbmUiLCJvT2JqZWN0IiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiY29sbGVjdENvbnRleHRJbmZvIiwic1ZhbHVlIiwib0NvbnRleHRzIiwib1Zpc2l0b3IiLCJvTm9kZSIsImFDb250ZXh0cyIsImFQcm9taXNlcyIsIk1hbmFnZWRPYmplY3QiLCJiaW5kaW5nUGFyc2VyIiwidW5kZWZpbmVkIiwiZSIsIkFycmF5IiwiaXNBcnJheSIsImZpbHRlciIsIm9Db250ZXh0IiwicGF0aCIsInBhcnRzIiwiZm9yRWFjaCIsImFQYXJ0cyIsIm9Nb2RlbCIsIm1vZGVsIiwic1NpbXBsZVBhdGgiLCJvUmVhbENvbnRleHQiLCJzcGxpdCIsImdldENvbnRleHQiLCJwdXNoIiwiZ2V0UmVzdWx0IiwidGhlbiIsIm9SZXN1bHQiLCJnZXRNb2RlbCIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsImdldFBhdGgiLCJkYXRhIiwiY2F0Y2giLCJiaW5kaW5nRm9yIiwiZXhjIiwiUHJvbWlzZSIsImFsbCIsImZpbGxBdHRyaWJ1dGVzIiwib1Jlc3VsdHMiLCJvQXR0cmlidXRlcyIsInNOYW1lIiwicmVzdWx0Iiwib3JpZ2luYWxWYWx1ZSIsInJlc29sdmVkVmFsdWUiLCJlcnJvciIsInN0YWNrIiwidG9TdHJpbmciLCJjb2xsZWN0SW5mbyIsImkiLCJhdHRyaWJ1dGVzIiwibGVuZ3RoIiwib0F0dHJpYnV0ZSIsIm5vZGVOYW1lIiwiZ2V0QXR0cmlidXRlIiwiaW5jbHVkZXMiLCJwcm9wZXJ0aWVzIiwiY29udGV4dHMiLCJyZXNvbHZlIiwic0NvbnRyb2xOYW1lIiwiYklzQ29udHJvbCIsInRlc3QiLCJvVHJhY2VNZXRhZGF0YUNvbnRleHQiLCJjb250cm9sIiwibmFtZXNwYWNlVVJJIiwib3duZXJEb2N1bWVudCIsImZpcnN0Q2hpbGQiLCJzZXRBdHRyaWJ1dGVOUyIsImJSZWxldmFudCIsIk9iamVjdCIsImtleXMiLCJhc3NpZ24iLCJ2aWV3SW5mbyIsImdldFZpZXdJbmZvIiwibWFjcm9JbmZvIiwiZ2V0U2V0dGluZ3MiLCJ0cmFjZUlEIiwidmlzaXRBdHRyaWJ1dGVzIiwidmlzaXRDaGlsZE5vZGVzIiwiZXhjZXB0aW9uIiwibm9kZSIsIlhNTFNlcmlhbGl6ZXIiLCJzZXJpYWxpemVUb1N0cmluZyIsIm5hbWVzcGFjZSIsIlhNTFByZXByb2Nlc3NvciIsInBsdWdJbiIsImJpbmQiLCJ0cmFjZU1hY3JvQ2FsbHMiLCJvTWV0YWRhdGEiLCJtQ29udGV4dHMiLCJhTWV0YWRhdGFDb250ZXh0S2V5cyIsIm1ldGFkYXRhQ29udGV4dHMiLCJhUHJvcGVydGllcyIsIm1hY3JvIiwibWV0YURhdGFDb250ZXh0cyIsIm5hbWUiLCJzS2V5Iiwib01ldGFEYXRhQ29udGV4dCIsIm9Qcm9wZXJ0eSIsInRoaXMiLCJnZXRPYmplY3QiLCJwYXJlbnRNYWNyb0lEIiwibWFjcm9JRCIsImdldFRyYWNlSW5mbyIsImlkIiwiYUVycm9ycyIsInRyYWNlSW5mbyIsImlzVHJhY2VJbmZvQWN0aXZlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7O0FBQUE7QUFDQSxNQUFNQSxVQUFpQixHQUFHO0FBQ3pCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBN0QwQixHQUExQjtBQStEQSxNQUFNQyxjQUFjLEdBQUcsdURBQXZCO0FBQUEsTUFDQ0MsS0FBSyxHQUFHLCtCQURUOztBQUVDO0FBQ0Q7QUFDQTtBQUNDQyxFQUFBQSxTQUFTLEdBQUdDLFFBQVEsQ0FBQ0MsTUFBVCxDQUFnQkMsT0FBaEIsQ0FBd0IsNEJBQXhCLElBQXdELENBQUMsQ0FMdEU7O0FBTUM7QUFDRDtBQUNBO0FBQ0NDLEVBQUFBLFdBQVcsR0FBRyxDQUNiLE9BRGEsRUFFYixVQUZhLEVBR2IsZ0JBSGEsRUFJYixPQUphLEVBS2IsY0FMYSxFQU1iLHlCQU5hLEVBT2Isb0JBUGEsRUFRYixZQVJhLEVBU2IsaUJBVGEsRUFVYixrQkFWYSxFQVdiLFlBWGEsQ0FUZjtBQUFBLE1Bc0JDQyxVQUFlLEdBQUcsRUF0Qm5COztBQXdCQSxXQUFTQyxPQUFULENBQWlCQyxPQUFqQixFQUErQjtBQUM5QixXQUFPQyxJQUFJLENBQUNDLEtBQUwsQ0FBV0QsSUFBSSxDQUFDRSxTQUFMLENBQWVILE9BQWYsQ0FBWCxDQUFQO0FBQ0E7O0FBQ0QsV0FBU0ksa0JBQVQsQ0FBNEJDLE1BQTVCLEVBQXlDQyxTQUF6QyxFQUF5REMsUUFBekQsRUFBd0VDLEtBQXhFLEVBQW9GO0FBQ25GLFFBQUlDLFNBQUo7QUFDQSxRQUFNQyxTQUFnQixHQUFHLEVBQXpCOztBQUNBLFFBQUk7QUFDSEQsTUFBQUEsU0FBUyxHQUFJRSxhQUFELENBQXVCQyxhQUF2QixDQUFxQ1AsTUFBckMsRUFBNkNRLFNBQTdDLEVBQXdELEtBQXhELEVBQStELElBQS9ELEtBQXdFLEVBQXBGO0FBQ0EsS0FGRCxDQUVFLE9BQU9DLENBQVAsRUFBVTtBQUNYTCxNQUFBQSxTQUFTLEdBQUcsRUFBWjtBQUNBOztBQUNEQSxJQUFBQSxTQUFTLEdBQUdNLEtBQUssQ0FBQ0MsT0FBTixDQUFjUCxTQUFkLElBQTJCQSxTQUEzQixHQUF1QyxDQUFDQSxTQUFELENBQW5EO0FBQ0FBLElBQUFBLFNBQVMsQ0FDUFEsTUFERixDQUNTLFVBQVVDLFFBQVYsRUFBeUI7QUFDaEMsYUFBT0EsUUFBUSxDQUFDQyxJQUFULElBQWlCRCxRQUFRLENBQUNFLEtBQWpDO0FBQ0EsS0FIRixFQUlFQyxPQUpGLENBSVUsVUFBVUgsUUFBVixFQUF5QjtBQUNqQyxVQUFNSSxNQUFNLEdBQUdKLFFBQVEsQ0FBQ0UsS0FBVCxJQUFrQixDQUFDRixRQUFELENBQWpDO0FBQ0FJLE1BQUFBLE1BQU0sQ0FDSkwsTUFERixDQUNTLFVBQVVDLFFBQVYsRUFBeUI7QUFDaEMsZUFBT0EsUUFBUSxDQUFDQyxJQUFoQjtBQUNBLE9BSEYsRUFJRUUsT0FKRixDQUlVLFVBQVVILFFBQVYsRUFBeUI7QUFDakMsWUFBTUssTUFBTSxHQUFJakIsU0FBUyxDQUFDWSxRQUFRLENBQUNNLEtBQVYsQ0FBVCxHQUE0QmxCLFNBQVMsQ0FBQ1ksUUFBUSxDQUFDTSxLQUFWLENBQVQsSUFBNkIsRUFBekU7QUFDQSxZQUFNQyxXQUFXLEdBQ2hCUCxRQUFRLENBQUNDLElBQVQsQ0FBY3ZCLE9BQWQsQ0FBc0IsR0FBdEIsSUFBNkIsQ0FBN0IsR0FBaUMsQ0FBQ3NCLFFBQVEsQ0FBQ00sS0FBVCxJQUFrQk4sUUFBUSxDQUFDTSxLQUFULEdBQWlCLEdBQXBDLElBQTJDTixRQUFRLENBQUNDLElBQXJGLEdBQTRGRCxRQUFRLENBQUNDLElBRHRHO0FBRUEsWUFBSU8sWUFBSjtBQUNBLFlBQUlKLE1BQUo7O0FBRUEsWUFBSSxPQUFPSixRQUFRLENBQUNNLEtBQWhCLEtBQTBCLFdBQTFCLElBQXlDQyxXQUFXLENBQUM3QixPQUFaLENBQW9CLEdBQXBCLElBQTJCLENBQUMsQ0FBekUsRUFBNEU7QUFDM0UwQixVQUFBQSxNQUFNLEdBQUdHLFdBQVcsQ0FBQ0UsS0FBWixDQUFrQixHQUFsQixDQUFUO0FBQ0FULFVBQUFBLFFBQVEsQ0FBQ00sS0FBVCxHQUFpQkYsTUFBTSxDQUFDLENBQUQsQ0FBdkI7QUFDQUosVUFBQUEsUUFBUSxDQUFDQyxJQUFULEdBQWdCRyxNQUFNLENBQUMsQ0FBRCxDQUF0QjtBQUNBOztBQUNELFlBQUk7QUFDSEksVUFBQUEsWUFBWSxHQUFHbkIsUUFBUSxDQUFDcUIsVUFBVCxDQUFvQkgsV0FBcEIsQ0FBZjtBQUNBZixVQUFBQSxTQUFTLENBQUNtQixJQUFWLENBQ0N0QixRQUFRLENBQ051QixTQURGLENBQ1ksTUFBTUwsV0FBTixHQUFvQixHQURoQyxFQUNxQ2pCLEtBRHJDLEVBRUV1QixJQUZGLENBRU8sVUFBVUMsT0FBVixFQUF3QjtBQUM3QixnQkFBSU4sWUFBWSxDQUFDTyxRQUFiLEdBQXdCQyxXQUF4QixHQUFzQ0MsT0FBdEMsT0FBb0QsNkJBQXhELEVBQXVGO0FBQ3RGLGtCQUFJLENBQUNILE9BQU8sQ0FBQ1QsTUFBYixFQUFxQjtBQUNwQkEsZ0JBQUFBLE1BQU0sQ0FBQ0wsUUFBUSxDQUFDQyxJQUFWLENBQU4sR0FBd0JhLE9BQXhCLENBRG9CLENBQ2E7QUFDakMsZUFGRCxNQUVPO0FBQ05ULGdCQUFBQSxNQUFNLENBQUNMLFFBQVEsQ0FBQ0MsSUFBVixDQUFOLEdBQXdCLGtCQUFrQmEsT0FBTyxDQUFDSSxPQUFSLEVBQTFDO0FBQ0E7QUFDRCxhQU5ELE1BTU87QUFDTmIsY0FBQUEsTUFBTSxDQUFDTCxRQUFRLENBQUNDLElBQVYsQ0FBTixHQUF3QjtBQUN2QkEsZ0JBQUFBLElBQUksRUFBRU8sWUFBWSxDQUFDVSxPQUFiLEVBRGlCO0FBRXZCQyxnQkFBQUEsSUFBSSxFQUFFLE9BQU9MLE9BQVAsS0FBbUIsUUFBbkIsR0FBOEIsc0NBQTlCLEdBQXVFQTtBQUZ0RCxlQUF4QjtBQUlBO0FBQ0QsV0FmRixFQWdCRU0sS0FoQkYsQ0FnQlEsWUFBWTtBQUNsQmYsWUFBQUEsTUFBTSxDQUFDTCxRQUFRLENBQUNDLElBQVYsQ0FBTixHQUF3QjtBQUN2Qm9CLGNBQUFBLFVBQVUsRUFBRTtBQURXLGFBQXhCO0FBR0EsV0FwQkYsQ0FERDtBQXVCQSxTQXpCRCxDQXlCRSxPQUFPQyxHQUFQLEVBQVk7QUFDYmpCLFVBQUFBLE1BQU0sQ0FBQ0wsUUFBUSxDQUFDQyxJQUFWLENBQU4sR0FBd0I7QUFDdkJvQixZQUFBQSxVQUFVLEVBQUU7QUFEVyxXQUF4QjtBQUdBO0FBQ0QsT0E5Q0Y7QUErQ0EsS0FyREY7QUFzREEsV0FBT0UsT0FBTyxDQUFDQyxHQUFSLENBQVloQyxTQUFaLENBQVA7QUFDQTs7QUFDRCxXQUFTaUMsY0FBVCxDQUF3QkMsUUFBeEIsRUFBdUNDLFdBQXZDLEVBQXlEQyxLQUF6RCxFQUFxRXpDLE1BQXJFLEVBQWtGO0FBQ2pGLFdBQU91QyxRQUFRLENBQ2JiLElBREssQ0FDQSxVQUFVZ0IsTUFBVixFQUF1QjtBQUM1QkYsTUFBQUEsV0FBVyxDQUFDQyxLQUFELENBQVgsR0FDQ3pDLE1BQU0sS0FBSzBDLE1BQVgsR0FDRztBQUNBQyxRQUFBQSxhQUFhLEVBQUUzQyxNQURmO0FBRUE0QyxRQUFBQSxhQUFhLEVBQUVGO0FBRmYsT0FESCxHQUtHMUMsTUFOSjtBQU9BLEtBVEssRUFVTGlDLEtBVkssQ0FVQyxVQUFVeEIsQ0FBVixFQUFrQjtBQUN4QitCLE1BQUFBLFdBQVcsQ0FBQ0MsS0FBRCxDQUFYLEdBQXFCO0FBQ3BCRSxRQUFBQSxhQUFhLEVBQUUzQyxNQURLO0FBRXBCNkMsUUFBQUEsS0FBSyxFQUFHcEMsQ0FBQyxDQUFDcUMsS0FBRixJQUFXckMsQ0FBQyxDQUFDcUMsS0FBRixDQUFRQyxRQUFSLEVBQVosSUFBbUN0QztBQUZ0QixPQUFyQjtBQUlBLEtBZkssQ0FBUDtBQWdCQTs7QUFDRCxXQUFTdUMsV0FBVCxDQUFxQjdDLEtBQXJCLEVBQWlDRCxRQUFqQyxFQUFnRDtBQUMvQyxRQUFNc0MsV0FBVyxHQUFHLEVBQXBCO0FBQ0EsUUFBTW5DLFNBQVMsR0FBRyxFQUFsQjtBQUNBLFFBQU1KLFNBQVMsR0FBRyxFQUFsQjtBQUNBLFFBQUlzQyxRQUFKOztBQUNBLFNBQUssSUFBSVUsQ0FBQyxHQUFHOUMsS0FBSyxDQUFDK0MsVUFBTixDQUFpQkMsTUFBakIsS0FBNEIsQ0FBekMsRUFBNENGLENBQUMsRUFBN0MsR0FBbUQ7QUFDbEQsVUFBTUcsVUFBVSxHQUFHakQsS0FBSyxDQUFDK0MsVUFBTixDQUFpQkQsQ0FBakIsQ0FBbkI7QUFBQSxVQUNDUixLQUFLLEdBQUdXLFVBQVUsQ0FBQ0MsUUFEcEI7QUFBQSxVQUVDckQsTUFBTSxHQUFHRyxLQUFLLENBQUNtRCxZQUFOLENBQW1CYixLQUFuQixDQUZWOztBQUdBLFVBQUksQ0FBQyxDQUFDLGNBQUQsRUFBaUJjLFFBQWpCLENBQTBCZCxLQUExQixDQUFMLEVBQXVDO0FBQ3RDcEMsUUFBQUEsU0FBUyxDQUFDbUIsSUFBVixDQUFlekIsa0JBQWtCLENBQUNDLE1BQUQsRUFBU0MsU0FBVCxFQUFvQkMsUUFBcEIsRUFBOEJDLEtBQTlCLENBQWpDO0FBQ0FvQyxRQUFBQSxRQUFRLEdBQUdyQyxRQUFRLENBQUN1QixTQUFULENBQW1CekIsTUFBbkIsRUFBMkJHLEtBQTNCLENBQVg7O0FBQ0EsWUFBSW9DLFFBQUosRUFBYztBQUNibEMsVUFBQUEsU0FBUyxDQUFDbUIsSUFBVixDQUFlYyxjQUFjLENBQUNDLFFBQUQsRUFBV0MsV0FBWCxFQUF3QkMsS0FBeEIsRUFBK0J6QyxNQUEvQixDQUE3QjtBQUNBLFNBRkQsTUFFTyxDQUNOO0FBQ0E7QUFDRDtBQUNEOztBQUNELFdBQU9vQyxPQUFPLENBQUNDLEdBQVIsQ0FBWWhDLFNBQVosRUFBdUJxQixJQUF2QixDQUE0QixZQUFZO0FBQzlDLGFBQU87QUFBRThCLFFBQUFBLFVBQVUsRUFBRWhCLFdBQWQ7QUFBMkJpQixRQUFBQSxRQUFRLEVBQUV4RDtBQUFyQyxPQUFQO0FBQ0EsS0FGTSxDQUFQO0FBR0E7O0FBQ0QsV0FBU3lELE9BQVQsQ0FBaUJ2RCxLQUFqQixFQUE2QkQsUUFBN0IsRUFBNEM7QUFDM0MsUUFBTXlELFlBQVksR0FBR3hELEtBQUssQ0FBQ2tELFFBQU4sQ0FBZS9CLEtBQWYsQ0FBcUIsR0FBckIsRUFBMEIsQ0FBMUIsS0FBZ0NuQixLQUFLLENBQUNrRCxRQUEzRDtBQUFBLFFBQ0NPLFVBQVUsR0FBRyxTQUFTQyxJQUFULENBQWNGLFlBQWQsQ0FEZDtBQUFBLFFBRUNHLHFCQUEwQixHQUFHO0FBQzVCQyxNQUFBQSxPQUFPLEVBQUU1RCxLQUFLLENBQUM2RCxZQUFOLEdBQXFCLEdBQXJCLElBQTRCN0QsS0FBSyxDQUFDa0QsUUFBTixDQUFlL0IsS0FBZixDQUFxQixHQUFyQixFQUEwQixDQUExQixLQUFnQ25CLEtBQUssQ0FBQ2tELFFBQWxFO0FBRG1CLEtBRjlCOztBQU1BLFFBQUlPLFVBQUosRUFBZ0I7QUFDZixVQUFJLENBQUN6RCxLQUFLLENBQUM4RCxhQUFOLENBQW9CQyxVQUFwQixDQUErQlosWUFBL0IsQ0FBNEMsYUFBNUMsQ0FBTCxFQUFpRTtBQUNoRW5ELFFBQUFBLEtBQUssQ0FBQzhELGFBQU4sQ0FBb0JDLFVBQXBCLENBQStCQyxjQUEvQixDQUE4Q2hGLEtBQTlDLEVBQXFELGFBQXJELEVBQW9FRCxjQUFwRTtBQUNBaUIsUUFBQUEsS0FBSyxDQUFDOEQsYUFBTixDQUFvQkMsVUFBcEIsQ0FBK0JDLGNBQS9CLENBQThDakYsY0FBOUMsRUFBOEQsVUFBOUQsRUFBMEUsSUFBMUU7QUFDQTs7QUFDRCxhQUFPOEQsV0FBVyxDQUFDN0MsS0FBRCxFQUFRRCxRQUFSLENBQVgsQ0FDTHdCLElBREssQ0FDQSxVQUFVZ0IsTUFBVixFQUFvRDtBQUN6RCxZQUFNMEIsU0FBUyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWTVCLE1BQU0sQ0FBQ2UsUUFBbkIsRUFBNkJOLE1BQTdCLEdBQXNDLENBQXhELENBRHlELENBQ0U7O0FBQzNELFlBQUlpQixTQUFKLEVBQWU7QUFDZEMsVUFBQUEsTUFBTSxDQUFDRSxNQUFQLENBQWNULHFCQUFkLEVBQXFDcEIsTUFBckM7QUFDQW9CLFVBQUFBLHFCQUFxQixDQUFDVSxRQUF0QixHQUFpQ3RFLFFBQVEsQ0FBQ3VFLFdBQVQsRUFBakM7QUFDQVgsVUFBQUEscUJBQXFCLENBQUNZLFNBQXRCLEdBQWtDeEUsUUFBUSxDQUFDeUUsV0FBVCxHQUF1QixZQUF2QixDQUFsQztBQUNBYixVQUFBQSxxQkFBcUIsQ0FBQ2MsT0FBdEIsR0FBZ0MzRixVQUFVLENBQUNrRSxNQUEzQztBQUNBaEQsVUFBQUEsS0FBSyxDQUFDZ0UsY0FBTixDQUFxQmpGLGNBQXJCLEVBQXFDLGVBQXJDLEVBQXNENEUscUJBQXFCLENBQUNjLE9BQTVFO0FBQ0EzRixVQUFBQSxVQUFVLENBQUN1QyxJQUFYLENBQWdCc0MscUJBQWhCO0FBQ0E7O0FBQ0QsZUFBTzVELFFBQVEsQ0FBQzJFLGVBQVQsQ0FBeUIxRSxLQUF6QixFQUFnQ3VCLElBQWhDLENBQXFDLFlBQVk7QUFDdkQsaUJBQU94QixRQUFRLENBQUM0RSxlQUFULENBQXlCM0UsS0FBekIsQ0FBUDtBQUNBLFNBRk0sQ0FBUDtBQUdBLE9BZEssRUFlTDhCLEtBZkssQ0FlQyxVQUFVRSxHQUFWLEVBQW9CO0FBQzFCMkIsUUFBQUEscUJBQXFCLENBQUNqQixLQUF0QixHQUE4QjtBQUM3QmtDLFVBQUFBLFNBQVMsRUFBRTVDLEdBRGtCO0FBRTdCNkMsVUFBQUEsSUFBSSxFQUFFLElBQUlDLGFBQUosR0FBb0JDLGlCQUFwQixDQUFzQy9FLEtBQXRDO0FBRnVCLFNBQTlCO0FBSUEsT0FwQkssQ0FBUDtBQXFCQSxLQTFCRCxNQTBCTztBQUNOLGFBQU9ELFFBQVEsQ0FBQzJFLGVBQVQsQ0FBeUIxRSxLQUF6QixFQUFnQ3VCLElBQWhDLENBQXFDLFlBQVk7QUFDdkQsZUFBT3hCLFFBQVEsQ0FBQzRFLGVBQVQsQ0FBeUIzRSxLQUF6QixDQUFQO0FBQ0EsT0FGTSxDQUFQO0FBR0E7QUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxNQUFJZixTQUFKLEVBQWU7QUFDZEksSUFBQUEsV0FBVyxDQUFDd0IsT0FBWixDQUFvQixVQUFVbUUsU0FBVixFQUE2QjtBQUNoRDFGLE1BQUFBLFVBQVUsQ0FBQzBGLFNBQUQsQ0FBVixHQUF3QkMsZUFBZSxDQUFDQyxNQUFoQixDQUF1QjNCLE9BQU8sQ0FBQzRCLElBQVIsQ0FBYUgsU0FBYixDQUF2QixFQUFnREEsU0FBaEQsQ0FBeEI7QUFDQSxLQUZEO0FBR0E7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTSSxlQUFULENBQXlCOUMsS0FBekIsRUFBd0MrQyxTQUF4QyxFQUF3REMsU0FBeEQsRUFBd0V0RixLQUF4RSxFQUFvRkQsUUFBcEYsRUFBbUc7QUFDbEcsUUFBSXdGLG9CQUFvQixHQUFJRixTQUFTLENBQUNHLGdCQUFWLElBQThCdEIsTUFBTSxDQUFDQyxJQUFQLENBQVlrQixTQUFTLENBQUNHLGdCQUF0QixDQUEvQixJQUEyRSxFQUF0RztBQUNBLFFBQU1DLFdBQVcsR0FBSUosU0FBUyxDQUFDaEMsVUFBVixJQUF3QmEsTUFBTSxDQUFDQyxJQUFQLENBQVlrQixTQUFTLENBQUNoQyxVQUF0QixDQUF6QixJQUErRCxFQUFuRjtBQUNBLFFBQU1rQixTQUFTLEdBQUdoRixPQUFPLENBQUNRLFFBQVEsQ0FBQ3lFLFdBQVQsR0FBdUIsWUFBdkIsS0FBd0MsRUFBekMsQ0FBekI7QUFDQSxRQUFNYixxQkFBMEIsR0FBRztBQUNsQytCLE1BQUFBLEtBQUssRUFBRXBELEtBRDJCO0FBRWxDcUQsTUFBQUEsZ0JBQWdCLEVBQUUsRUFGZ0I7QUFHbEN0QyxNQUFBQSxVQUFVLEVBQUU7QUFIc0IsS0FBbkM7O0FBTUEsUUFBSWtDLG9CQUFvQixDQUFDdkMsTUFBckIsS0FBZ0MsQ0FBcEMsRUFBdUM7QUFDdEM7QUFDQXVDLE1BQUFBLG9CQUFvQixHQUFHckIsTUFBTSxDQUFDQyxJQUFQLENBQVltQixTQUFaLEVBQXVCN0UsTUFBdkIsQ0FBOEIsVUFBVW1GLElBQVYsRUFBd0I7QUFDNUUsZUFBT0EsSUFBSSxLQUFLLE1BQWhCO0FBQ0EsT0FGc0IsQ0FBdkI7QUFHQTs7QUFFRCxRQUFJLENBQUM1RixLQUFLLENBQUNtRCxZQUFOLENBQW1CLGFBQW5CLENBQUwsRUFBd0M7QUFDdkNuRCxNQUFBQSxLQUFLLENBQUNnRSxjQUFOLENBQXFCaEYsS0FBckIsRUFBNEIsYUFBNUIsRUFBMkNELGNBQTNDO0FBQ0E7O0FBRUQsUUFBSXdHLG9CQUFvQixDQUFDdkMsTUFBckIsR0FBOEIsQ0FBbEMsRUFBcUM7QUFDcEN1QyxNQUFBQSxvQkFBb0IsQ0FBQzFFLE9BQXJCLENBQTZCLFVBQVVnRixJQUFWLEVBQXFCO0FBQ2pELFlBQU1uRixRQUFRLEdBQUc0RSxTQUFTLENBQUNPLElBQUQsQ0FBMUI7QUFBQSxZQUNDQyxnQkFBcUIsR0FBR3BGLFFBQVEsSUFBSTtBQUNuQ2tGLFVBQUFBLElBQUksRUFBRUMsSUFENkI7QUFFbkNsRixVQUFBQSxJQUFJLEVBQUVELFFBQVEsQ0FBQ2tCLE9BQVQsRUFGNkIsQ0FHbkM7O0FBSG1DLFNBRHJDOztBQU9BLFlBQUlrRSxnQkFBSixFQUFzQjtBQUNyQm5DLFVBQUFBLHFCQUFxQixDQUFDZ0MsZ0JBQXRCLENBQXVDdEUsSUFBdkMsQ0FBNEN5RSxnQkFBNUM7QUFDQTtBQUNELE9BWEQ7QUFhQUwsTUFBQUEsV0FBVyxDQUFDNUUsT0FBWixDQUFvQixVQUFVZ0YsSUFBVixFQUFxQjtBQUN4QyxZQUFNO0FBQ0xFLFFBQUFBLFNBQVMsR0FBR1QsU0FBUyxDQUFDVSxJQUFWLENBQWVDLFNBQWYsQ0FBeUJKLElBQXpCLENBRGIsQ0FEd0MsQ0FHeEM7QUFDQTtBQUNBOztBQUVBLFlBQUlFLFNBQUosRUFBZTtBQUNkcEMsVUFBQUEscUJBQXFCLENBQUNOLFVBQXRCLENBQWlDd0MsSUFBakMsSUFBeUNFLFNBQXpDO0FBQ0E7QUFDRCxPQVZEO0FBV0FwQyxNQUFBQSxxQkFBcUIsQ0FBQ1UsUUFBdEIsR0FBaUN0RSxRQUFRLENBQUN1RSxXQUFULEVBQWpDO0FBQ0FYLE1BQUFBLHFCQUFxQixDQUFDYyxPQUF0QixHQUFnQzNGLFVBQVUsQ0FBQ2tFLE1BQTNDO0FBQ0F1QixNQUFBQSxTQUFTLENBQUMyQixhQUFWLEdBQTBCM0IsU0FBUyxDQUFDNEIsT0FBcEM7QUFDQTVCLE1BQUFBLFNBQVMsQ0FBQzRCLE9BQVYsR0FBb0J4QyxxQkFBcUIsQ0FBQ2MsT0FBMUM7QUFDQWQsTUFBQUEscUJBQXFCLENBQUNZLFNBQXRCLEdBQWtDQSxTQUFsQztBQUNBdkUsTUFBQUEsS0FBSyxDQUFDZ0UsY0FBTixDQUFxQmpGLGNBQXJCLEVBQXFDLGVBQXJDLEVBQXNENEUscUJBQXFCLENBQUNjLE9BQTVFO0FBQ0EzRixNQUFBQSxVQUFVLENBQUN1QyxJQUFYLENBQWdCc0MscUJBQWhCO0FBQ0EsYUFBT0EscUJBQVA7QUFDQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTeUMsWUFBVCxDQUFzQkMsRUFBdEIsRUFBa0M7QUFDakMsUUFBSUEsRUFBSixFQUFRO0FBQ1AsYUFBT3ZILFVBQVUsQ0FBQ3VILEVBQUQsQ0FBakI7QUFDQTs7QUFDRCxRQUFNQyxPQUFPLEdBQUd4SCxVQUFVLENBQUMyQixNQUFYLENBQWtCLFVBQVU4RixTQUFWLEVBQTBCO0FBQzNELGFBQU9BLFNBQVMsQ0FBQzdELEtBQWpCO0FBQ0EsS0FGZSxDQUFoQjtBQUdBLFdBQVE0RCxPQUFPLENBQUN0RCxNQUFSLEdBQWlCLENBQWpCLElBQXNCc0QsT0FBdkIsSUFBbUN4SCxVQUExQztBQUNBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTMEgsaUJBQVQsR0FBNkI7QUFDNUIsV0FBT3ZILFNBQVA7QUFDQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7U0FDZTtBQUNkdUgsSUFBQUEsaUJBQWlCLEVBQUVBLGlCQURMO0FBRWRwQixJQUFBQSxlQUFlLEVBQUVBLGVBRkg7QUFHZGdCLElBQUFBLFlBQVksRUFBRUE7QUFIQSxHIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbi8vVHJhY2UgaW5mb3JtYXRpb25cbmNvbnN0IGFUcmFjZUluZm86IGFueVtdID0gW1xuXHQvKiBTdHJ1Y3R1cmUgZm9yIGEgbWFjcm9cblx0XHRcdHtcblx0XHRcdFx0bWFjcm86ICcnLCAvL25hbWUgb2YgbWFjcm9cblx0XHRcdFx0bWV0YURhdGFDb250ZXh0czogWyAvL1Byb3BlcnRpZXMgb2YgdHlwZSBzYXAudWkubW9kZWwuQ29udGV4dFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6ICcnLCAvL2NvbnRleHQgcHJvcGVydHkgbmFtZSAvIGtleVxuXHRcdFx0XHRcdFx0cGF0aDogJycsIC8vZnJvbSBvQ29udGV4dC5nZXRQYXRoKClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdF0sXG5cdFx0XHRcdHByb3BlcnRpZXM6IHsgLy8gT3RoZXIgcHJvcGVydGllcyB3aGljaCBiZWNvbWUgcGFydCBvZiB7dGhpcz59XG5cdFx0XHRcdFx0cHJvcGVydHkxOiB2YWx1ZSxcblx0XHRcdFx0XHRwcm9wZXJ0eTI6IHZhbHVlXG5cdFx0XHRcdH1cblx0XHRcdFx0dmlld0luZm86IHtcblx0XHRcdFx0XHR2aWV3SW5mbzoge30gLy8gQXMgc3BlY2lmaWVkIGluIHZpZXcgb3IgZnJhZ2VtZW50IGNyZWF0aW9uXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRyYWNlSUQ6IHRoaXMuaW5kZXgsIC8vSUQgZm9yIHRoaXMgdHJhY2UgaW5mb3JtYXRpb24sXG5cdFx0XHRcdG1hY3JvSW5mbzoge1xuXHRcdFx0XHRcdG1hY3JvSUQ6IGluZGV4LCAvLyB0cmFjZUlEIG9mIHRoaXMgbWFjcm8gKHJlZHVuZGFudCBmb3IgbWFjcm9zKVxuXHRcdFx0XHRcdHBhcmVudE1hY3JvSUQsIGluZGV4IC8vIHRyYWNlSUQgb2YgdGhlIHBhcmVudCBtYWNybyAoaWYgaXQgaGFzIGEgcGFyZW50KVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBTdHJ1Y3R1cmUgZm9yIGEgY29udHJvbFxuXHRcdFx0e1xuXHRcdFx0XHRjb250cm9sOiAnJywgLy9jb250cm9sIGNsYXNzXG5cdFx0XHRcdHByb3BlcnRpZXM6IHsgLy8gT3RoZXIgcHJvcGVydGllcyB3aGljaCBiZWNvbWUgcGFydCBvZiB7dGhpcz59XG5cdFx0XHRcdFx0cHJvcGVydHkxOiB7XG5cdFx0XHRcdFx0XHRvcmlnaW5hbFZhbHVlOiAnJywgLy9WYWx1ZSBiZWZvcmUgdGVtcGxhdGluZ1xuXHRcdFx0XHRcdFx0cmVzb2x2ZWRWYWx1ZTogJycgLy9WYWx1ZSBhZnRlciB0ZW1wbGF0aW5nXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRleHRzOiB7IC8vTW9kZWxzIGFuZCBDb250ZXh0cyB1c2VkIGR1cmluZyB0ZW1wbGF0aW5nXG5cdFx0XHRcdFx0Ly8gTW9kZWwgb3IgY29udGV4dCBuYW1lIHVzZWQgZm9yIHRoaXMgY29udHJvbFxuXHRcdFx0XHRcdG1vZGVsTmFtZTE6IHsgLy8gRm9yIE9EYXRhTWV0YU1vZGVsXG5cdFx0XHRcdFx0XHRwYXRoMToge1xuXHRcdFx0XHRcdFx0XHRwYXRoOiAnJywgLy9hYnNvbHV0IHBhdGggd2l0aGluIG1ldGFtb2RlbFxuXHRcdFx0XHRcdFx0XHRkYXRhOiAnJywgLy9kYXRhIG9mIHBhdGggdW5sZXNzIHR5cGUgT2JqZWN0XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bW9kZWxOYW1lMjoge1xuXHRcdFx0XHRcdFx0Ly8gZm9yIG90aGVyIG1vZGVsIHR5cGVzXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5MTogdmFsdWUsXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5MjogdmFsdWVcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIEluIGNhc2UgYmluZGluZyBjYW5ub3QgYmUgcmVzb2x2ZWQgLT4gbWFyayBhcyBydW50aW1lIGJpbmRpbmdcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgbm90IGFsd2F5cyB0cnVlLCBlLmcuIGluIGNhc2UgdGhlIHBhdGggaXMgbWV0YW1vZGVscGF0aFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcImJpbmRpbmdGb3JcIjogXCJSdW50aW1lXCJcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHZpZXdJbmZvOiB7XG5cdFx0XHRcdFx0dmlld0luZm86IHt9IC8vIEFzIHNwZWNpZmllZCBpbiB2aWV3IG9yIGZyYWdlbWVudCBjcmVhdGlvblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRtYWNyb0luZm86IHtcblx0XHRcdFx0XHRtYWNyb0lEOiBpbmRleCwgLy8gdHJhY2VJRCBvZiB0aGUgbWFjcm8gdGhhdCBjcmVhdGVkIHRoaXMgY29udHJvbFxuXHRcdFx0XHRcdHBhcmVudE1hY3JvSUQsIGluZGV4IC8vIHRyYWNlSUQgb2YgdGhlIG1hY3JvJ3MgcGFyZW50IG1hY3JvXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRyYWNlSUQ6IHRoaXMuaW5kZXggLy9JRCBmb3IgdGhpcyB0cmFjZSBpbmZvcm1hdGlvblxuXHRcdFx0fVxuXHRcdFx0Ki9cbl07XG5jb25zdCB0cmFjZU5hbWVzcGFjZSA9IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC5mZS5pbmZvLzFcIixcblx0eG1sbnMgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCIsXG5cdC8qKlxuXHQgKiBTd2l0Y2ggaXMgY3VycmVudGx5IGJhc2VkIG9uIHVybCBwYXJhbWV0ZXJcblx0ICovXG5cdHRyYWNlSXNPbiA9IGxvY2F0aW9uLnNlYXJjaC5pbmRleE9mKFwic2FwLXVpLXh4LWZlVHJhY2VJbmZvPXRydWVcIikgPiAtMSxcblx0LyoqXG5cdCAqIFNwZWNpZnkgYWxsIG5hbWVzcGFjZXMgdGhhdCBzaGFsbCBiZSB0cmFjZWQgZHVyaW5nIHRlbXBsYXRpbmdcblx0ICovXG5cdGFOYW1lc3BhY2VzID0gW1xuXHRcdFwic2FwLm1cIixcblx0XHRcInNhcC51eGFwXCIsXG5cdFx0XCJzYXAudWkudW5pZmllZFwiLFxuXHRcdFwic2FwLmZcIixcblx0XHRcInNhcC51aS50YWJsZVwiLFxuXHRcdFwic2FwLnN1aXRlLnVpLm1pY3JvY2hhcnRcIixcblx0XHRcInNhcC51aS5sYXlvdXQuZm9ybVwiLFxuXHRcdFwic2FwLnVpLm1kY1wiLFxuXHRcdFwic2FwLnVpLm1kYy5saW5rXCIsXG5cdFx0XCJzYXAudWkubWRjLmZpZWxkXCIsXG5cdFx0XCJzYXAuZmUuZnBtXCJcblx0XSxcblx0b0NhbGxiYWNrczogYW55ID0ge307XG5cbmZ1bmN0aW9uIGZuQ2xvbmUob09iamVjdDogYW55KSB7XG5cdHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9PYmplY3QpKTtcbn1cbmZ1bmN0aW9uIGNvbGxlY3RDb250ZXh0SW5mbyhzVmFsdWU6IGFueSwgb0NvbnRleHRzOiBhbnksIG9WaXNpdG9yOiBhbnksIG9Ob2RlOiBhbnkpIHtcblx0bGV0IGFDb250ZXh0cztcblx0Y29uc3QgYVByb21pc2VzOiBhbnlbXSA9IFtdO1xuXHR0cnkge1xuXHRcdGFDb250ZXh0cyA9IChNYW5hZ2VkT2JqZWN0IGFzIGFueSkuYmluZGluZ1BhcnNlcihzVmFsdWUsIHVuZGVmaW5lZCwgZmFsc2UsIHRydWUpIHx8IFtdO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0YUNvbnRleHRzID0gW107XG5cdH1cblx0YUNvbnRleHRzID0gQXJyYXkuaXNBcnJheShhQ29udGV4dHMpID8gYUNvbnRleHRzIDogW2FDb250ZXh0c107XG5cdGFDb250ZXh0c1xuXHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdHJldHVybiBvQ29udGV4dC5wYXRoIHx8IG9Db250ZXh0LnBhcnRzO1xuXHRcdH0pXG5cdFx0LmZvckVhY2goZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdGNvbnN0IGFQYXJ0cyA9IG9Db250ZXh0LnBhcnRzIHx8IFtvQ29udGV4dF07XG5cdFx0XHRhUGFydHNcblx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBvQ29udGV4dC5wYXRoO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IChvQ29udGV4dHNbb0NvbnRleHQubW9kZWxdID0gb0NvbnRleHRzW29Db250ZXh0Lm1vZGVsXSB8fCB7fSk7XG5cdFx0XHRcdFx0Y29uc3Qgc1NpbXBsZVBhdGggPVxuXHRcdFx0XHRcdFx0b0NvbnRleHQucGF0aC5pbmRleE9mKFwiPlwiKSA8IDAgPyAob0NvbnRleHQubW9kZWwgJiYgb0NvbnRleHQubW9kZWwgKyBcIj5cIikgKyBvQ29udGV4dC5wYXRoIDogb0NvbnRleHQucGF0aDtcblx0XHRcdFx0XHRsZXQgb1JlYWxDb250ZXh0OiBhbnk7XG5cdFx0XHRcdFx0bGV0IGFQYXJ0cztcblxuXHRcdFx0XHRcdGlmICh0eXBlb2Ygb0NvbnRleHQubW9kZWwgPT09IFwidW5kZWZpbmVkXCIgJiYgc1NpbXBsZVBhdGguaW5kZXhPZihcIj5cIikgPiAtMSkge1xuXHRcdFx0XHRcdFx0YVBhcnRzID0gc1NpbXBsZVBhdGguc3BsaXQoXCI+XCIpO1xuXHRcdFx0XHRcdFx0b0NvbnRleHQubW9kZWwgPSBhUGFydHNbMF07XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5wYXRoID0gYVBhcnRzWzFdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0b1JlYWxDb250ZXh0ID0gb1Zpc2l0b3IuZ2V0Q29udGV4dChzU2ltcGxlUGF0aCk7XG5cdFx0XHRcdFx0XHRhUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdFx0b1Zpc2l0b3Jcblx0XHRcdFx0XHRcdFx0XHQuZ2V0UmVzdWx0KFwie1wiICsgc1NpbXBsZVBhdGggKyBcIn1cIiwgb05vZGUpXG5cdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9SZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9SZWFsQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC51aS5tb2RlbC5qc29uLkpTT05Nb2RlbFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghb1Jlc3VsdC5vTW9kZWwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvTW9kZWxbb0NvbnRleHQucGF0aF0gPSBvUmVzdWx0OyAvL29SZWFsQ29udGV4dC5nZXRPYmplY3Qob0NvbnRleHQucGF0aCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b01vZGVsW29Db250ZXh0LnBhdGhdID0gXCJDb250ZXh0IGZyb20gXCIgKyBvUmVzdWx0LmdldFBhdGgoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b01vZGVsW29Db250ZXh0LnBhdGhdID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhdGg6IG9SZWFsQ29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YTogdHlwZW9mIG9SZXN1bHQgPT09IFwib2JqZWN0XCIgPyBcIltjdHJsL2NtZC1jbGlja10gb24gcGF0aCB0byBzZWUgZGF0YVwiIDogb1Jlc3VsdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9Nb2RlbFtvQ29udGV4dC5wYXRoXSA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YmluZGluZ0ZvcjogXCJSdW50aW1lXCJcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXhjKSB7XG5cdFx0XHRcdFx0XHRvTW9kZWxbb0NvbnRleHQucGF0aF0gPSB7XG5cdFx0XHRcdFx0XHRcdGJpbmRpbmdGb3I6IFwiUnVudGltZVwiXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0fSk7XG5cdHJldHVybiBQcm9taXNlLmFsbChhUHJvbWlzZXMpO1xufVxuZnVuY3Rpb24gZmlsbEF0dHJpYnV0ZXMob1Jlc3VsdHM6IGFueSwgb0F0dHJpYnV0ZXM6IGFueSwgc05hbWU6IGFueSwgc1ZhbHVlOiBhbnkpIHtcblx0cmV0dXJuIG9SZXN1bHRzXG5cdFx0LnRoZW4oZnVuY3Rpb24gKHJlc3VsdDogYW55KSB7XG5cdFx0XHRvQXR0cmlidXRlc1tzTmFtZV0gPVxuXHRcdFx0XHRzVmFsdWUgIT09IHJlc3VsdFxuXHRcdFx0XHRcdD8ge1xuXHRcdFx0XHRcdFx0XHRvcmlnaW5hbFZhbHVlOiBzVmFsdWUsXG5cdFx0XHRcdFx0XHRcdHJlc29sdmVkVmFsdWU6IHJlc3VsdFxuXHRcdFx0XHRcdCAgfVxuXHRcdFx0XHRcdDogc1ZhbHVlO1xuXHRcdH0pXG5cdFx0LmNhdGNoKGZ1bmN0aW9uIChlOiBhbnkpIHtcblx0XHRcdG9BdHRyaWJ1dGVzW3NOYW1lXSA9IHtcblx0XHRcdFx0b3JpZ2luYWxWYWx1ZTogc1ZhbHVlLFxuXHRcdFx0XHRlcnJvcjogKGUuc3RhY2sgJiYgZS5zdGFjay50b1N0cmluZygpKSB8fCBlXG5cdFx0XHR9O1xuXHRcdH0pO1xufVxuZnVuY3Rpb24gY29sbGVjdEluZm8ob05vZGU6IGFueSwgb1Zpc2l0b3I6IGFueSkge1xuXHRjb25zdCBvQXR0cmlidXRlcyA9IHt9O1xuXHRjb25zdCBhUHJvbWlzZXMgPSBbXTtcblx0Y29uc3Qgb0NvbnRleHRzID0ge307XG5cdGxldCBvUmVzdWx0cztcblx0Zm9yIChsZXQgaSA9IG9Ob2RlLmF0dHJpYnV0ZXMubGVuZ3RoID4+PiAwOyBpLS07ICkge1xuXHRcdGNvbnN0IG9BdHRyaWJ1dGUgPSBvTm9kZS5hdHRyaWJ1dGVzW2ldLFxuXHRcdFx0c05hbWUgPSBvQXR0cmlidXRlLm5vZGVOYW1lLFxuXHRcdFx0c1ZhbHVlID0gb05vZGUuZ2V0QXR0cmlidXRlKHNOYW1lKTtcblx0XHRpZiAoIVtcImNvcmU6cmVxdWlyZVwiXS5pbmNsdWRlcyhzTmFtZSkpIHtcblx0XHRcdGFQcm9taXNlcy5wdXNoKGNvbGxlY3RDb250ZXh0SW5mbyhzVmFsdWUsIG9Db250ZXh0cywgb1Zpc2l0b3IsIG9Ob2RlKSk7XG5cdFx0XHRvUmVzdWx0cyA9IG9WaXNpdG9yLmdldFJlc3VsdChzVmFsdWUsIG9Ob2RlKTtcblx0XHRcdGlmIChvUmVzdWx0cykge1xuXHRcdFx0XHRhUHJvbWlzZXMucHVzaChmaWxsQXR0cmlidXRlcyhvUmVzdWx0cywgb0F0dHJpYnV0ZXMsIHNOYW1lLCBzVmFsdWUpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vV2hhdFxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5hbGwoYVByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4geyBwcm9wZXJ0aWVzOiBvQXR0cmlidXRlcywgY29udGV4dHM6IG9Db250ZXh0cyB9O1xuXHR9KTtcbn1cbmZ1bmN0aW9uIHJlc29sdmUob05vZGU6IGFueSwgb1Zpc2l0b3I6IGFueSkge1xuXHRjb25zdCBzQ29udHJvbE5hbWUgPSBvTm9kZS5ub2RlTmFtZS5zcGxpdChcIjpcIilbMV0gfHwgb05vZGUubm9kZU5hbWUsXG5cdFx0YklzQ29udHJvbCA9IC9eW0EtWl0vLnRlc3Qoc0NvbnRyb2xOYW1lKSxcblx0XHRvVHJhY2VNZXRhZGF0YUNvbnRleHQ6IGFueSA9IHtcblx0XHRcdGNvbnRyb2w6IG9Ob2RlLm5hbWVzcGFjZVVSSSArIFwiLlwiICsgKG9Ob2RlLm5vZGVOYW1lLnNwbGl0KFwiOlwiKVsxXSB8fCBvTm9kZS5ub2RlTmFtZSlcblx0XHR9O1xuXG5cdGlmIChiSXNDb250cm9sKSB7XG5cdFx0aWYgKCFvTm9kZS5vd25lckRvY3VtZW50LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwieG1sbnM6dHJhY2VcIikpIHtcblx0XHRcdG9Ob2RlLm93bmVyRG9jdW1lbnQuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGVOUyh4bWxucywgXCJ4bWxuczp0cmFjZVwiLCB0cmFjZU5hbWVzcGFjZSk7XG5cdFx0XHRvTm9kZS5vd25lckRvY3VtZW50LmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlTlModHJhY2VOYW1lc3BhY2UsIFwidHJhY2U6aXNcIiwgXCJvblwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbGxlY3RJbmZvKG9Ob2RlLCBvVmlzaXRvcilcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChyZXN1bHQ6IHsgcHJvcGVydGllczoge307IGNvbnRleHRzOiB7fSB9KSB7XG5cdFx0XHRcdGNvbnN0IGJSZWxldmFudCA9IE9iamVjdC5rZXlzKHJlc3VsdC5jb250ZXh0cykubGVuZ3RoID4gMDsgLy9JZiBubyBjb250ZXh0IHdhcyB1c2VkIGl0IGlzIG5vdCByZWxldmFudCBzbyB3ZSBpZ25vcmUgT2JqZWN0LmtleXMocmVzdWx0LnByb3BlcnRpZXMpLmxlbmd0aFxuXHRcdFx0XHRpZiAoYlJlbGV2YW50KSB7XG5cdFx0XHRcdFx0T2JqZWN0LmFzc2lnbihvVHJhY2VNZXRhZGF0YUNvbnRleHQsIHJlc3VsdCk7XG5cdFx0XHRcdFx0b1RyYWNlTWV0YWRhdGFDb250ZXh0LnZpZXdJbmZvID0gb1Zpc2l0b3IuZ2V0Vmlld0luZm8oKTtcblx0XHRcdFx0XHRvVHJhY2VNZXRhZGF0YUNvbnRleHQubWFjcm9JbmZvID0gb1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKVtcIl9tYWNyb0luZm9cIl07XG5cdFx0XHRcdFx0b1RyYWNlTWV0YWRhdGFDb250ZXh0LnRyYWNlSUQgPSBhVHJhY2VJbmZvLmxlbmd0aDtcblx0XHRcdFx0XHRvTm9kZS5zZXRBdHRyaWJ1dGVOUyh0cmFjZU5hbWVzcGFjZSwgXCJ0cmFjZTp0cmFjZUlEXCIsIG9UcmFjZU1ldGFkYXRhQ29udGV4dC50cmFjZUlEKTtcblx0XHRcdFx0XHRhVHJhY2VJbmZvLnB1c2gob1RyYWNlTWV0YWRhdGFDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gb1Zpc2l0b3IudmlzaXRBdHRyaWJ1dGVzKG9Ob2RlKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb1Zpc2l0b3IudmlzaXRDaGlsZE5vZGVzKG9Ob2RlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChleGM6IGFueSkge1xuXHRcdFx0XHRvVHJhY2VNZXRhZGF0YUNvbnRleHQuZXJyb3IgPSB7XG5cdFx0XHRcdFx0ZXhjZXB0aW9uOiBleGMsXG5cdFx0XHRcdFx0bm9kZTogbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhvTm9kZSlcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBvVmlzaXRvci52aXNpdEF0dHJpYnV0ZXMob05vZGUpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIG9WaXNpdG9yLnZpc2l0Q2hpbGROb2RlcyhvTm9kZSk7XG5cdFx0fSk7XG5cdH1cbn1cbi8qKlxuICogUmVnaXN0ZXIgcGF0aC10aHJvdWdoIFhNTFByZXByb2Nlc3NvciBwbHVnaW4gZm9yIGFsbCBuYW1lc3BhY2VzXG4gKiBnaXZlbiBhYm92ZSBpbiBhTmFtZXNwYWNlc1xuICovXG5pZiAodHJhY2VJc09uKSB7XG5cdGFOYW1lc3BhY2VzLmZvckVhY2goZnVuY3Rpb24gKG5hbWVzcGFjZTogc3RyaW5nKSB7XG5cdFx0b0NhbGxiYWNrc1tuYW1lc3BhY2VdID0gWE1MUHJlcHJvY2Vzc29yLnBsdWdJbihyZXNvbHZlLmJpbmQobmFtZXNwYWNlKSwgbmFtZXNwYWNlKTtcblx0fSk7XG59XG4vKipcbiAqIEFkZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2Nlc3Npbmcgb2Ygb25lIG1hY3JvIHRvIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIEBuYW1lIHNhcC5mZS5tYWNyb3MuVHJhY2VJbmZvLnRyYWNlTWFjcm9DYWxsc1xuICogQHBhcmFtIHtzdHJpbmd9IHNOYW1lIE1hY3JvIGNsYXNzIG5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvTWV0YWRhdGEgRGVmaW5pdGlvbiBmcm9tIChtYWNybykubWV0YWRhdGEuanNcbiAqIEBwYXJhbSB7b2JqZWN0fSBtQ29udGV4dHMgQXZhaWxhYmxlIG5hbWVkIGNvbnRleHRzXG4gKiBAcGFyYW0ge1hNTE5vZGV9IG9Ob2RlXG4gKiBAcGFyYW0ge29iamVjdH0gb1Zpc2l0b3JcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKiBAc3RhdGljXG4gKi9cbmZ1bmN0aW9uIHRyYWNlTWFjcm9DYWxscyhzTmFtZTogc3RyaW5nLCBvTWV0YWRhdGE6IGFueSwgbUNvbnRleHRzOiBhbnksIG9Ob2RlOiBhbnksIG9WaXNpdG9yOiBhbnkpIHtcblx0bGV0IGFNZXRhZGF0YUNvbnRleHRLZXlzID0gKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKSkgfHwgW107XG5cdGNvbnN0IGFQcm9wZXJ0aWVzID0gKG9NZXRhZGF0YS5wcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKSkgfHwgW107XG5cdGNvbnN0IG1hY3JvSW5mbyA9IGZuQ2xvbmUob1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKVtcIl9tYWNyb0luZm9cIl0gfHwge30pO1xuXHRjb25zdCBvVHJhY2VNZXRhZGF0YUNvbnRleHQ6IGFueSA9IHtcblx0XHRtYWNybzogc05hbWUsXG5cdFx0bWV0YURhdGFDb250ZXh0czogW10gYXMgYW55W10sXG5cdFx0cHJvcGVydGllczoge31cblx0fTtcblxuXHRpZiAoYU1ldGFkYXRhQ29udGV4dEtleXMubGVuZ3RoID09PSAwKSB7XG5cdFx0Ly9JbiBjYXNlIHRoZSBtYWNybyBoYXMgbm90IG1ldGFkYXRhLmpzIHdlIHRha2UgYWxsIG1ldGFkYXRhQ29udGV4dHMgZXhjZXB0IHRoaXNcblx0XHRhTWV0YWRhdGFDb250ZXh0S2V5cyA9IE9iamVjdC5rZXlzKG1Db250ZXh0cykuZmlsdGVyKGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBuYW1lICE9PSBcInRoaXNcIjtcblx0XHR9KTtcblx0fVxuXG5cdGlmICghb05vZGUuZ2V0QXR0cmlidXRlKFwieG1sbnM6dHJhY2VcIikpIHtcblx0XHRvTm9kZS5zZXRBdHRyaWJ1dGVOUyh4bWxucywgXCJ4bWxuczp0cmFjZVwiLCB0cmFjZU5hbWVzcGFjZSk7XG5cdH1cblxuXHRpZiAoYU1ldGFkYXRhQ29udGV4dEtleXMubGVuZ3RoID4gMCkge1xuXHRcdGFNZXRhZGF0YUNvbnRleHRLZXlzLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBtQ29udGV4dHNbc0tleV0sXG5cdFx0XHRcdG9NZXRhRGF0YUNvbnRleHQ6IGFueSA9IG9Db250ZXh0ICYmIHtcblx0XHRcdFx0XHRuYW1lOiBzS2V5LFxuXHRcdFx0XHRcdHBhdGg6IG9Db250ZXh0LmdldFBhdGgoKVxuXHRcdFx0XHRcdC8vZGF0YTogSlNPTi5zdHJpbmdpZnkob0NvbnRleHQuZ2V0T2JqZWN0KCksbnVsbCwyKVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRpZiAob01ldGFEYXRhQ29udGV4dCkge1xuXHRcdFx0XHRvVHJhY2VNZXRhZGF0YUNvbnRleHQubWV0YURhdGFDb250ZXh0cy5wdXNoKG9NZXRhRGF0YUNvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YVByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0XHRjb25zdCAvL29Qcm9wZXJ0eVNldHRpbmdzID0gb01ldGFkYXRhLnByb3BlcnRpZXNbc0tleV0sXG5cdFx0XHRcdG9Qcm9wZXJ0eSA9IG1Db250ZXh0cy50aGlzLmdldE9iamVjdChzS2V5KTtcblx0XHRcdC8vIChvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleSkgJiYgb05vZGUuZ2V0QXR0cmlidXRlKHNLZXkpKSB8fFxuXHRcdFx0Ly8gKG9Qcm9wZXJ0eVNldHRpbmdzLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpICYmIG9Qcm9wZXJ0eVNldHRpbmdzLmRlZmluZSkgfHxcblx0XHRcdC8vIGZhbHNlO1xuXG5cdFx0XHRpZiAob1Byb3BlcnR5KSB7XG5cdFx0XHRcdG9UcmFjZU1ldGFkYXRhQ29udGV4dC5wcm9wZXJ0aWVzW3NLZXldID0gb1Byb3BlcnR5O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG9UcmFjZU1ldGFkYXRhQ29udGV4dC52aWV3SW5mbyA9IG9WaXNpdG9yLmdldFZpZXdJbmZvKCk7XG5cdFx0b1RyYWNlTWV0YWRhdGFDb250ZXh0LnRyYWNlSUQgPSBhVHJhY2VJbmZvLmxlbmd0aDtcblx0XHRtYWNyb0luZm8ucGFyZW50TWFjcm9JRCA9IG1hY3JvSW5mby5tYWNyb0lEO1xuXHRcdG1hY3JvSW5mby5tYWNyb0lEID0gb1RyYWNlTWV0YWRhdGFDb250ZXh0LnRyYWNlSUQ7XG5cdFx0b1RyYWNlTWV0YWRhdGFDb250ZXh0Lm1hY3JvSW5mbyA9IG1hY3JvSW5mbztcblx0XHRvTm9kZS5zZXRBdHRyaWJ1dGVOUyh0cmFjZU5hbWVzcGFjZSwgXCJ0cmFjZTptYWNyb0lEXCIsIG9UcmFjZU1ldGFkYXRhQ29udGV4dC50cmFjZUlEKTtcblx0XHRhVHJhY2VJbmZvLnB1c2gob1RyYWNlTWV0YWRhdGFDb250ZXh0KTtcblx0XHRyZXR1cm4gb1RyYWNlTWV0YWRhdGFDb250ZXh0O1xuXHR9XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGdsb2JhbGx5IHN0b3JlZCB0cmFjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG1hY3JvIG9yXG4gKiBjb250cm9sIG1hcmtlZCB3aXRoIHRoZSBnaXZlbiBpZC5cbiAqXG4gKiBSZXR1cm5zIGFsbCB0cmFjZSBpbmZvcm1hdGlvbiBpZiBubyBpZCBpcyBzcGVjaWZpZWRcbiAqXG4gKlxuPHByZT5TdHJ1Y3R1cmUgZm9yIGEgbWFjcm9cbntcblx0bWFjcm86ICcnLCAvL25hbWUgb2YgbWFjcm9cblx0bWV0YURhdGFDb250ZXh0czogWyAvL1Byb3BlcnRpZXMgb2YgdHlwZSBzYXAudWkubW9kZWwuQ29udGV4dFxuXHRcdHtcblx0XHRcdG5hbWU6ICcnLCAvL2NvbnRleHQgcHJvcGVydHkgbmFtZSAvIGtleVxuXHRcdFx0cGF0aDogJycsIC8vZnJvbSBvQ29udGV4dC5nZXRQYXRoKClcblx0XHR9XG5cdF0sXG5cdHByb3BlcnRpZXM6IHsgLy8gT3RoZXIgcHJvcGVydGllcyB3aGljaCBiZWNvbWUgcGFydCBvZiB7dGhpcz59XG5cdFx0cHJvcGVydHkxOiB2YWx1ZSxcblx0XHRwcm9wZXJ0eTI6IHZhbHVlXG5cdH1cblx0dmlld0luZm86IHtcblx0XHR2aWV3SW5mbzoge30gLy8gQXMgc3BlY2lmaWVkIGluIHZpZXcgb3IgZnJhZ2VtZW50IGNyZWF0aW9uXG5cdH0sXG5cdHRyYWNlSUQ6IHRoaXMuaW5kZXgsIC8vSUQgZm9yIHRoaXMgdHJhY2UgaW5mb3JtYXRpb24sXG5cdG1hY3JvSW5mbzoge1xuXHRcdG1hY3JvSUQ6IGluZGV4LCAvLyB0cmFjZUlEIG9mIHRoaXMgbWFjcm8gKHJlZHVuZGFudCBmb3IgbWFjcm9zKVxuXHRcdHBhcmVudE1hY3JvSUQsIGluZGV4IC8vIHRyYWNlSUQgb2YgdGhlIHBhcmVudCBtYWNybyAoaWYgaXQgaGFzIGEgcGFyZW50KVxuXHR9XG59XG5TdHJ1Y3R1cmUgZm9yIGEgY29udHJvbFxue1xuXHRjb250cm9sOiAnJywgLy9jb250cm9sIGNsYXNzXG5cdHByb3BlcnRpZXM6IHsgLy8gT3RoZXIgcHJvcGVydGllcyB3aGljaCBiZWNvbWUgcGFydCBvZiB7dGhpcz59XG5cdFx0cHJvcGVydHkxOiB7XG5cdFx0XHRvcmlnaW5hbFZhbHVlOiAnJywgLy9WYWx1ZSBiZWZvcmUgdGVtcGxhdGluZ1xuXHRcdFx0cmVzb2x2ZWRWYWx1ZTogJycgLy9WYWx1ZSBhZnRlciB0ZW1wbGF0aW5nXG5cdFx0fVxuXHR9XG5cdGNvbnRleHRzOiB7IC8vTW9kZWxzIGFuZCBDb250ZXh0cyB1c2VkIGR1cmluZyB0ZW1wbGF0aW5nXG5cdFx0Ly8gTW9kZWwgb3IgY29udGV4dCBuYW1lIHVzZWQgZm9yIHRoaXMgY29udHJvbFxuXHRcdG1vZGVsTmFtZTE6IHsgLy8gRm9yIE9EYXRhTWV0YU1vZGVsXG5cdFx0XHRwYXRoMToge1xuXHRcdFx0XHRwYXRoOiAnJywgLy9hYnNvbHV0IHBhdGggd2l0aGluIG1ldGFtb2RlbFxuXHRcdFx0XHRkYXRhOiAnJywgLy9kYXRhIG9mIHBhdGggdW5sZXNzIHR5cGUgT2JqZWN0XG5cdFx0XHR9XG5cdFx0bW9kZWxOYW1lMjoge1xuXHRcdFx0Ly8gZm9yIG90aGVyIG1vZGVsIHR5cGVzXG5cdFx0XHR7XG5cdFx0XHRcdHByb3BlcnR5MTogdmFsdWUsXG5cdFx0XHRcdHByb3BlcnR5MjogdmFsdWVcblx0XHRcdH1cblx0XHRcdC8vIEluIGNhc2UgYmluZGluZyBjYW5ub3QgYmUgcmVzb2x2ZWQgLT4gbWFyayBhcyBydW50aW1lIGJpbmRpbmdcblx0XHRcdC8vIFRoaXMgaXMgbm90IGFsd2F5cyB0cnVlLCBlLmcuIGluIGNhc2UgdGhlIHBhdGggaXMgbWV0YW1vZGVscGF0aFxuXHRcdFx0e1xuXHRcdFx0XHRcImJpbmRpbmdGb3JcIjogXCJSdW50aW1lXCJcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdHZpZXdJbmZvOiB7XG5cdFx0dmlld0luZm86IHt9IC8vIEFzIHNwZWNpZmllZCBpbiB2aWV3IG9yIGZyYWdlbWVudCBjcmVhdGlvblxuXHR9LFxuXHRtYWNyb0luZm86IHtcblx0XHRtYWNyb0lEOiBpbmRleCwgLy8gdHJhY2VJRCBvZiB0aGUgbWFjcm8gdGhhdCBjcmVhdGVkIHRoaXMgY29udHJvbFxuXHRcdHBhcmVudE1hY3JvSUQsIGluZGV4IC8vIHRyYWNlSUQgb2YgdGhlIG1hY3JvJ3MgcGFyZW50IG1hY3JvXG5cdH0sXG5cdHRyYWNlSUQ6IHRoaXMuaW5kZXggLy9JRCBmb3IgdGhpcyB0cmFjZSBpbmZvcm1hdGlvblxufTwvcHJlPi5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5tYWNyb3MuVHJhY2VJbmZvLmdldFRyYWNlSW5mb1xuICogQHBhcmFtIHtudW1iZXJ9IGlkIFRyYWNlSW5mbyBpZFxuICogQHJldHVybnMge29iamVjdHxBcnJheX0gT2JqZWN0IC8gQXJyYXkgZm9yIFRyYWNlSW5mb1xuICogQHByaXZhdGVcbiAqIEBzdGF0aWNcbiAqL1xuZnVuY3Rpb24gZ2V0VHJhY2VJbmZvKGlkOiBudW1iZXIpIHtcblx0aWYgKGlkKSB7XG5cdFx0cmV0dXJuIGFUcmFjZUluZm9baWRdO1xuXHR9XG5cdGNvbnN0IGFFcnJvcnMgPSBhVHJhY2VJbmZvLmZpbHRlcihmdW5jdGlvbiAodHJhY2VJbmZvOiBhbnkpIHtcblx0XHRyZXR1cm4gdHJhY2VJbmZvLmVycm9yO1xuXHR9KTtcblx0cmV0dXJuIChhRXJyb3JzLmxlbmd0aCA+IDAgJiYgYUVycm9ycykgfHwgYVRyYWNlSW5mbztcbn1cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIFRyYWNlSW5mbyBpcyBhY3RpdmUuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBzYXAuZmUubWFjcm9zLlRyYWNlSW5mby5pc1RyYWNlSW5mb0FjdGl2ZVxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCB3aGVuIGFjdGl2ZVxuICogQHByaXZhdGVcbiAqIEBzdGF0aWNcbiAqL1xuZnVuY3Rpb24gaXNUcmFjZUluZm9BY3RpdmUoKSB7XG5cdHJldHVybiB0cmFjZUlzT247XG59XG4vKipcbiAqIEB0eXBlZGVmIHNhcC5mZS5tYWNyb3MuVHJhY2VJbmZvXG4gKiBUcmFjZUluZm8gZm9yIFNBUCBGaW9yaSBlbGVtZW50c1xuICpcbiAqIE9uY2UgdHJhY2VzIGlzIHN3aXRjaGVkLCBpbmZvcm1hdGlvbiBhYm91dCBtYWNyb3MgYW5kIGNvbnRyb2xzXG4gKiB0aGF0IGFyZSBwcm9jZXNzZWQgZHVyaW5nIHhtbCBwcmVwcm9jZXNzaW5nICggQHNlZSB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3J9KVxuICogd2lsbCBiZSBjb2xsZWN0ZWQgd2l0aGluIHRoaXMgc2luZ2xldG9uXG4gKiBAbmFtZXNwYWNlXG4gKiBAcHJpdmF0ZVxuICogQGdsb2JhbFxuICogQGV4cGVyaW1lbnRhbCBUaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBleHBlcmltZW50YWwgdXNlISA8YnIvPjxiPlRoaXMgaXMgb25seSBhIFBPQyBhbmQgbWF5YmUgZGVsZXRlZDwvYj5cbiAqIEBzaW5jZSAxLjc0LjBcbiAqL1xuZXhwb3J0IGRlZmF1bHQge1xuXHRpc1RyYWNlSW5mb0FjdGl2ZTogaXNUcmFjZUluZm9BY3RpdmUsXG5cdHRyYWNlTWFjcm9DYWxsczogdHJhY2VNYWNyb0NhbGxzLFxuXHRnZXRUcmFjZUluZm86IGdldFRyYWNlSW5mb1xufTtcbiJdfQ==