@sapui5/sap.fe.core 1.111.1 → 1.113.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 (579) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime-dbg.js +6 -5
  4. package/src/sap/fe/core/ActionRuntime.js +1 -1
  5. package/src/sap/fe/core/ActionRuntime.js.map +1 -1
  6. package/src/sap/fe/core/ActionRuntime.ts +12 -11
  7. package/src/sap/fe/core/AppComponent-dbg.js +35 -9
  8. package/src/sap/fe/core/AppComponent.js +1 -1
  9. package/src/sap/fe/core/AppComponent.js.map +1 -1
  10. package/src/sap/fe/core/AppComponent.ts +66 -9
  11. package/src/sap/fe/core/AppStateHandler-dbg.js +5 -2
  12. package/src/sap/fe/core/AppStateHandler.js +1 -1
  13. package/src/sap/fe/core/AppStateHandler.js.map +1 -1
  14. package/src/sap/fe/core/AppStateHandler.ts +10 -1
  15. package/src/sap/fe/core/BaseController-dbg.js +1 -1
  16. package/src/sap/fe/core/BaseController.ts +2 -1
  17. package/src/sap/fe/core/CommonUtils-dbg.js +202 -533
  18. package/src/sap/fe/core/CommonUtils.js +1 -1
  19. package/src/sap/fe/core/CommonUtils.js.map +1 -1
  20. package/src/sap/fe/core/CommonUtils.ts +260 -681
  21. package/src/sap/fe/core/ExtensionAPI-dbg.js +4 -1
  22. package/src/sap/fe/core/ExtensionAPI.js +1 -1
  23. package/src/sap/fe/core/ExtensionAPI.js.map +1 -1
  24. package/src/sap/fe/core/ExtensionAPI.ts +11 -1
  25. package/src/sap/fe/core/PageController-dbg.js +26 -31
  26. package/src/sap/fe/core/PageController.js +1 -1
  27. package/src/sap/fe/core/PageController.js.map +1 -1
  28. package/src/sap/fe/core/PageController.ts +17 -3
  29. package/src/sap/fe/core/ResourceModel-dbg.js +71 -0
  30. package/src/sap/fe/core/ResourceModel.js +6 -0
  31. package/src/sap/fe/core/ResourceModel.js.map +1 -0
  32. package/src/sap/fe/core/ResourceModel.ts +67 -0
  33. package/src/sap/fe/core/TemplateComponent-dbg.js +1 -1
  34. package/src/sap/fe/core/TemplateComponent.ts +1 -0
  35. package/src/sap/fe/core/TemplateModel-dbg.js +1 -1
  36. package/src/sap/fe/core/TemplateModel.ts +6 -1
  37. package/src/sap/fe/core/buildingBlocks/AttributeModel-dbg.js +5 -7
  38. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  39. package/src/sap/fe/core/buildingBlocks/AttributeModel.js.map +1 -1
  40. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +6 -5
  41. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase-dbg.js +164 -0
  42. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +6 -0
  43. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js.map +1 -0
  44. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +170 -0
  45. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport-dbg.js +88 -0
  46. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js +6 -0
  47. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js.map +1 -0
  48. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.ts +142 -0
  49. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor-dbg.js +913 -0
  50. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js +21 -0
  51. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js.map +1 -0
  52. package/src/sap/fe/core/buildingBlocks/{BuildingBlockRuntime.ts → BuildingBlockTemplateProcessor.ts} +313 -373
  53. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock-dbg.js +79 -0
  54. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js +15 -0
  55. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js.map +1 -0
  56. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.ts +68 -0
  57. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment-dbg.js +162 -0
  58. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js +6 -0
  59. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js.map +1 -0
  60. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.ts +183 -0
  61. package/src/sap/fe/core/buildingBlocks/TraceInfo-dbg.js +4 -2
  62. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +1 -1
  63. package/src/sap/fe/core/buildingBlocks/TraceInfo.js.map +1 -1
  64. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +5 -3
  65. package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +936 -231
  66. package/src/sap/fe/core/controllerextensions/EditFlow.js +1 -1
  67. package/src/sap/fe/core/controllerextensions/EditFlow.js.map +1 -1
  68. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1023 -255
  69. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +48 -98
  70. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
  71. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js.map +1 -1
  72. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +95 -129
  73. package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +14 -17
  74. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1 -1
  75. package/src/sap/fe/core/controllerextensions/InternalRouting.js.map +1 -1
  76. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +23 -17
  77. package/src/sap/fe/core/controllerextensions/KPIManagement-dbg.js +1 -1
  78. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -0
  79. package/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +3 -3
  80. package/src/sap/fe/core/controllerextensions/MassEdit.js +1 -1
  81. package/src/sap/fe/core/controllerextensions/MassEdit.js.map +1 -1
  82. package/src/sap/fe/core/controllerextensions/MassEdit.ts +2 -2
  83. package/src/sap/fe/core/controllerextensions/MessageHandler-dbg.js +2 -1
  84. package/src/sap/fe/core/controllerextensions/MessageHandler.js.map +1 -1
  85. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +2 -0
  86. package/src/sap/fe/core/controllerextensions/PageReady-dbg.js +3 -5
  87. package/src/sap/fe/core/controllerextensions/PageReady.js +1 -1
  88. package/src/sap/fe/core/controllerextensions/PageReady.js.map +1 -1
  89. package/src/sap/fe/core/controllerextensions/PageReady.ts +26 -4
  90. package/src/sap/fe/core/controllerextensions/Paginator-dbg.js +2 -1
  91. package/src/sap/fe/core/controllerextensions/Paginator.js.map +1 -1
  92. package/src/sap/fe/core/controllerextensions/Paginator.ts +7 -0
  93. package/src/sap/fe/core/controllerextensions/Placeholder-dbg.js +1 -1
  94. package/src/sap/fe/core/controllerextensions/Placeholder.ts +8 -0
  95. package/src/sap/fe/core/controllerextensions/Share-dbg.js +8 -1
  96. package/src/sap/fe/core/controllerextensions/Share.js.map +1 -1
  97. package/src/sap/fe/core/controllerextensions/Share.ts +11 -0
  98. package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +14 -13
  99. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  100. package/src/sap/fe/core/controllerextensions/SideEffects.js.map +1 -1
  101. package/src/sap/fe/core/controllerextensions/SideEffects.ts +27 -27
  102. package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +17 -8
  103. package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
  104. package/src/sap/fe/core/controllerextensions/ViewState.js.map +1 -1
  105. package/src/sap/fe/core/controllerextensions/ViewState.ts +35 -14
  106. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase-dbg.js +6 -5
  107. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -1
  108. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js.map +1 -1
  109. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +7 -4
  110. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +285 -82
  111. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +1 -1
  112. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js.map +1 -1
  113. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +326 -89
  114. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +23 -2
  115. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +1 -1
  116. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js.map +1 -1
  117. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +32 -3
  118. package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +4 -4
  119. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +1 -1
  120. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +1 -1
  121. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +4 -5
  122. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +17 -3
  123. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block-dbg.js +65 -34
  124. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +1 -1
  125. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js.map +1 -1
  126. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +33 -18
  127. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog-dbg.js +103 -0
  128. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +6 -0
  129. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js.map +1 -0
  130. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +124 -0
  131. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +78 -149
  132. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1 -1
  133. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -1
  134. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +85 -160
  135. package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +49 -49
  136. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -1
  137. package/src/sap/fe/core/controllerextensions/editFlow/draft.js.map +1 -1
  138. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +52 -63
  139. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -1
  140. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal-dbg.js +82 -0
  141. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +6 -0
  142. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js.map +1 -0
  143. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +123 -0
  144. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade-dbg.js +1508 -0
  145. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +6 -0
  146. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js.map +1 -0
  147. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +1993 -0
  148. package/src/sap/fe/core/controllerextensions/editFlow/operations-dbg.js +3 -1415
  149. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
  150. package/src/sap/fe/core/controllerextensions/editFlow/operations.js.map +1 -1
  151. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +2 -1921
  152. package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +10 -18
  153. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -1
  154. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -1
  155. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +9 -22
  156. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +53 -47
  157. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +1 -1
  158. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -1
  159. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +55 -61
  160. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher-dbg.js +12 -1
  161. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js.map +1 -1
  162. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +19 -0
  163. package/src/sap/fe/core/controllerextensions/routing/RouterProxy-dbg.js +78 -13
  164. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
  165. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js.map +1 -1
  166. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +100 -13
  167. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -1
  168. package/src/sap/fe/core/controls/CommandExecution-dbg.js +16 -5
  169. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  170. package/src/sap/fe/core/controls/CommandExecution.js.map +1 -1
  171. package/src/sap/fe/core/controls/CommandExecution.ts +15 -3
  172. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +3 -2
  173. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +1 -1
  174. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +1 -1
  175. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +4 -1
  176. package/src/sap/fe/core/controls/FilterBar-dbg.js +1 -1
  177. package/src/sap/fe/core/controls/FilterBar.ts +5 -0
  178. package/src/sap/fe/core/controls/FormElementWrapper-dbg.js +1 -1
  179. package/src/sap/fe/core/controls/FormElementWrapper.ts +3 -0
  180. package/src/sap/fe/core/controls/filterbar/FilterContainer-dbg.js +1 -1
  181. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +7 -0
  182. package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +1 -1
  183. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +4 -0
  184. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer-dbg.js +1 -1
  185. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +10 -0
  186. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +4 -3
  187. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
  188. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js.map +1 -1
  189. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -2
  190. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +0 -1
  191. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +2 -0
  192. package/src/sap/fe/core/controls/massEdit/MassEditHandlers-dbg.js +6 -1
  193. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +1 -1
  194. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js.map +1 -1
  195. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +5 -0
  196. package/src/sap/fe/core/converters/ConverterContext-dbg.js +3 -5
  197. package/src/sap/fe/core/converters/ConverterContext.js +1 -1
  198. package/src/sap/fe/core/converters/ConverterContext.js.map +1 -1
  199. package/src/sap/fe/core/converters/ConverterContext.ts +4 -6
  200. package/src/sap/fe/core/converters/ManifestSettings-dbg.js +1 -8
  201. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  202. package/src/sap/fe/core/converters/ManifestSettings.js.map +1 -1
  203. package/src/sap/fe/core/converters/ManifestSettings.ts +15 -6
  204. package/src/sap/fe/core/converters/ManifestWrapper-dbg.js +21 -3
  205. package/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
  206. package/src/sap/fe/core/converters/ManifestWrapper.js.map +1 -1
  207. package/src/sap/fe/core/converters/ManifestWrapper.ts +23 -1
  208. package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +67 -62
  209. package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  210. package/src/sap/fe/core/converters/MetaModelConverter.js.map +1 -1
  211. package/src/sap/fe/core/converters/MetaModelConverter.ts +75 -66
  212. package/src/sap/fe/core/converters/TemplateConverter-dbg.js +2 -1
  213. package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -1
  214. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  215. package/src/sap/fe/core/converters/annotations/DataField-dbg.js +81 -20
  216. package/src/sap/fe/core/converters/annotations/DataField.js +1 -1
  217. package/src/sap/fe/core/converters/annotations/DataField.js.map +1 -1
  218. package/src/sap/fe/core/converters/annotations/DataField.ts +76 -22
  219. package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +1027 -956
  220. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1 -1
  221. package/src/sap/fe/core/converters/common/AnnotationConverter.js.map +1 -1
  222. package/src/sap/fe/core/converters/controls/Common/Action-dbg.js +13 -19
  223. package/src/sap/fe/core/converters/controls/Common/Action.js +1 -1
  224. package/src/sap/fe/core/converters/controls/Common/Action.js.map +1 -1
  225. package/src/sap/fe/core/converters/controls/Common/Action.ts +37 -40
  226. package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +95 -33
  227. package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
  228. package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -1
  229. package/src/sap/fe/core/converters/controls/Common/Chart.ts +133 -49
  230. package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +99 -62
  231. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
  232. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -1
  233. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +140 -75
  234. package/src/sap/fe/core/converters/controls/Common/Form-dbg.js +7 -6
  235. package/src/sap/fe/core/converters/controls/Common/Form.js +1 -1
  236. package/src/sap/fe/core/converters/controls/Common/Form.js.map +1 -1
  237. package/src/sap/fe/core/converters/controls/Common/Form.ts +8 -14
  238. package/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +9 -9
  239. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  240. package/src/sap/fe/core/converters/controls/Common/KPI.js.map +1 -1
  241. package/src/sap/fe/core/converters/controls/Common/KPI.ts +17 -18
  242. package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +143 -93
  243. package/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
  244. package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -1
  245. package/src/sap/fe/core/converters/controls/Common/Table.ts +221 -177
  246. package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +23 -16
  247. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
  248. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -1
  249. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +27 -23
  250. package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +138 -75
  251. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
  252. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js.map +1 -1
  253. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +223 -110
  254. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +38 -28
  255. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -1
  256. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js.map +1 -1
  257. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +67 -47
  258. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar-dbg.js +1 -1
  259. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +1 -1
  260. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet-dbg.js +6 -6
  261. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
  262. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js.map +1 -1
  263. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +5 -8
  264. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +54 -24
  265. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -1
  266. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js.map +1 -1
  267. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +84 -37
  268. package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +12 -14
  269. package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
  270. package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -1
  271. package/src/sap/fe/core/converters/helpers/Aggregation.ts +16 -11
  272. package/src/sap/fe/core/converters/helpers/BindingHelper-dbg.js +8 -6
  273. package/src/sap/fe/core/converters/helpers/BindingHelper.js +1 -1
  274. package/src/sap/fe/core/converters/helpers/BindingHelper.js.map +1 -1
  275. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +8 -6
  276. package/src/sap/fe/core/converters/helpers/ConfigurableObject-dbg.js +7 -6
  277. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
  278. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js.map +1 -1
  279. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +19 -10
  280. package/src/sap/fe/core/converters/helpers/DataFieldHelper-dbg.js +1 -1
  281. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +7 -2
  282. package/src/sap/fe/core/converters/helpers/ID-dbg.js +1 -1
  283. package/src/sap/fe/core/converters/helpers/ID.ts +2 -1
  284. package/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +11 -9
  285. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  286. package/src/sap/fe/core/converters/helpers/IssueManager.js.map +1 -1
  287. package/src/sap/fe/core/converters/helpers/IssueManager.ts +10 -8
  288. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +22 -20
  289. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
  290. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js.map +1 -1
  291. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +19 -16
  292. package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +32 -35
  293. package/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
  294. package/src/sap/fe/core/converters/templates/ListReportConverter.js.map +1 -1
  295. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +42 -37
  296. package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +12 -5
  297. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
  298. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js.map +1 -1
  299. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +8 -2
  300. package/src/sap/fe/core/formatters/FPMFormatter-dbg.js +1 -1
  301. package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
  302. package/src/sap/fe/core/formatters/FiscalFormat-dbg.js +2 -2
  303. package/src/sap/fe/core/formatters/FiscalFormat.ts +6 -1
  304. package/src/sap/fe/core/formatters/TableFormatter-dbg.js +3 -7
  305. package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
  306. package/src/sap/fe/core/formatters/TableFormatter.js.map +1 -1
  307. package/src/sap/fe/core/formatters/TableFormatter.ts +2 -6
  308. package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +9 -5
  309. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  310. package/src/sap/fe/core/formatters/ValueFormatter.js.map +1 -1
  311. package/src/sap/fe/core/formatters/ValueFormatter.ts +11 -4
  312. package/src/sap/fe/core/fpm/Component-dbg.js +1 -1
  313. package/src/sap/fe/core/fpm/Component.ts +1 -0
  314. package/src/sap/fe/core/fpm/manifest.json +1 -1
  315. package/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +2 -2
  316. package/src/sap/fe/core/helpers/AppStartupHelper.js +1 -1
  317. package/src/sap/fe/core/helpers/AppStartupHelper.js.map +1 -1
  318. package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
  319. package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +7 -6
  320. package/src/sap/fe/core/helpers/BindingToolkit.js +1 -1
  321. package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -1
  322. package/src/sap/fe/core/helpers/BindingToolkit.ts +9 -9
  323. package/src/sap/fe/core/helpers/ClassSupport-dbg.js +1 -1
  324. package/src/sap/fe/core/helpers/ClassSupport.js.map +1 -1
  325. package/src/sap/fe/core/helpers/ClassSupport.ts +1 -0
  326. package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +93 -62
  327. package/src/sap/fe/core/helpers/DeleteHelper.js +1 -1
  328. package/src/sap/fe/core/helpers/DeleteHelper.js.map +1 -1
  329. package/src/sap/fe/core/helpers/DeleteHelper.ts +140 -185
  330. package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +23 -20
  331. package/src/sap/fe/core/helpers/MassEditHelper.js +1 -1
  332. package/src/sap/fe/core/helpers/MassEditHelper.js.map +1 -1
  333. package/src/sap/fe/core/helpers/MassEditHelper.ts +26 -28
  334. package/src/sap/fe/core/helpers/MessageStrip-dbg.js +9 -9
  335. package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
  336. package/src/sap/fe/core/helpers/MessageStrip.js.map +1 -1
  337. package/src/sap/fe/core/helpers/MessageStrip.ts +8 -8
  338. package/src/sap/fe/core/helpers/MetaModelFunction-dbg.js +517 -0
  339. package/src/sap/fe/core/helpers/MetaModelFunction.js +6 -0
  340. package/src/sap/fe/core/helpers/MetaModelFunction.js.map +1 -0
  341. package/src/sap/fe/core/helpers/MetaModelFunction.ts +610 -0
  342. package/src/sap/fe/core/helpers/ModelHelper-dbg.js +37 -73
  343. package/src/sap/fe/core/helpers/ModelHelper.js +1 -1
  344. package/src/sap/fe/core/helpers/ModelHelper.js.map +1 -1
  345. package/src/sap/fe/core/helpers/ModelHelper.ts +47 -74
  346. package/src/sap/fe/core/helpers/PasteHelper-dbg.js +5 -5
  347. package/src/sap/fe/core/helpers/PasteHelper.js +1 -1
  348. package/src/sap/fe/core/helpers/PasteHelper.js.map +1 -1
  349. package/src/sap/fe/core/helpers/PasteHelper.ts +6 -10
  350. package/src/sap/fe/core/helpers/ResourceModelHelper-dbg.js +39 -0
  351. package/src/sap/fe/core/helpers/ResourceModelHelper.js +6 -0
  352. package/src/sap/fe/core/helpers/ResourceModelHelper.js.map +1 -0
  353. package/src/sap/fe/core/helpers/ResourceModelHelper.ts +35 -0
  354. package/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +132 -23
  355. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  356. package/src/sap/fe/core/helpers/SemanticDateOperators.js.map +1 -1
  357. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +109 -22
  358. package/src/sap/fe/core/helpers/SemanticKeyHelper-dbg.js +2 -2
  359. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  360. package/src/sap/fe/core/helpers/SemanticKeyHelper.js.map +1 -1
  361. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
  362. package/src/sap/fe/core/helpers/SizeHelper-dbg.js +53 -0
  363. package/src/sap/fe/core/helpers/SizeHelper.js +6 -0
  364. package/src/sap/fe/core/helpers/SizeHelper.js.map +1 -0
  365. package/src/sap/fe/core/helpers/SizeHelper.ts +51 -0
  366. package/src/sap/fe/core/helpers/StableIdHelper-dbg.js +29 -25
  367. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  368. package/src/sap/fe/core/helpers/StableIdHelper.js.map +1 -1
  369. package/src/sap/fe/core/helpers/StableIdHelper.ts +26 -24
  370. package/src/sap/fe/core/helpers/Synchronization-dbg.js +1 -1
  371. package/src/sap/fe/core/helpers/Synchronization.ts +2 -0
  372. package/src/sap/fe/core/helpers/TypeGuards-dbg.js +151 -1
  373. package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
  374. package/src/sap/fe/core/helpers/TypeGuards.js.map +1 -1
  375. package/src/sap/fe/core/helpers/TypeGuards.ts +162 -1
  376. package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +2 -1
  377. package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -1
  378. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +6 -2
  379. package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +1 -1
  380. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +3 -1
  381. package/src/sap/fe/core/jsx-runtime/useMDXComponents-dbg.js +3 -3
  382. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +1 -1
  383. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -1
  384. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
  385. package/src/sap/fe/core/library-dbg.js +2 -2
  386. package/src/sap/fe/core/library-preload.js +156 -140
  387. package/src/sap/fe/core/library-preload.js.map +1 -1
  388. package/src/sap/fe/core/library.js +1 -1
  389. package/src/sap/fe/core/library.ts +7 -0
  390. package/src/sap/fe/core/manifest.json +1 -1
  391. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +67 -15
  392. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  393. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js.map +1 -1
  394. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -14
  395. package/src/sap/fe/core/messagebundle.properties +35 -0
  396. package/src/sap/fe/core/messagebundle_ar.properties +15 -12
  397. package/src/sap/fe/core/messagebundle_bg.properties +20 -17
  398. package/src/sap/fe/core/messagebundle_ca.properties +12 -9
  399. package/src/sap/fe/core/messagebundle_cs.properties +12 -9
  400. package/src/sap/fe/core/messagebundle_cy.properties +12 -9
  401. package/src/sap/fe/core/messagebundle_da.properties +12 -9
  402. package/src/sap/fe/core/messagebundle_de.properties +13 -10
  403. package/src/sap/fe/core/messagebundle_el.properties +14 -11
  404. package/src/sap/fe/core/messagebundle_en.properties +4 -1
  405. package/src/sap/fe/core/messagebundle_en_GB.properties +4 -1
  406. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +2 -0
  407. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +21 -0
  408. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +23 -3
  409. package/src/sap/fe/core/messagebundle_es.properties +12 -9
  410. package/src/sap/fe/core/messagebundle_es_MX.properties +12 -9
  411. package/src/sap/fe/core/messagebundle_et.properties +12 -9
  412. package/src/sap/fe/core/messagebundle_fi.properties +12 -9
  413. package/src/sap/fe/core/messagebundle_fr.properties +12 -9
  414. package/src/sap/fe/core/messagebundle_fr_CA.properties +13 -10
  415. package/src/sap/fe/core/messagebundle_hi.properties +12 -9
  416. package/src/sap/fe/core/messagebundle_hr.properties +12 -9
  417. package/src/sap/fe/core/messagebundle_hu.properties +12 -9
  418. package/src/sap/fe/core/messagebundle_id.properties +13 -10
  419. package/src/sap/fe/core/messagebundle_it.properties +12 -9
  420. package/src/sap/fe/core/messagebundle_iw.properties +12 -9
  421. package/src/sap/fe/core/messagebundle_ja.properties +13 -10
  422. package/src/sap/fe/core/messagebundle_kk.properties +12 -9
  423. package/src/sap/fe/core/messagebundle_ko.properties +12 -9
  424. package/src/sap/fe/core/messagebundle_lt.properties +12 -9
  425. package/src/sap/fe/core/messagebundle_lv.properties +12 -9
  426. package/src/sap/fe/core/messagebundle_ms.properties +13 -10
  427. package/src/sap/fe/core/messagebundle_nl.properties +13 -10
  428. package/src/sap/fe/core/messagebundle_no.properties +12 -9
  429. package/src/sap/fe/core/messagebundle_pl.properties +12 -9
  430. package/src/sap/fe/core/messagebundle_pt.properties +12 -9
  431. package/src/sap/fe/core/messagebundle_pt_PT.properties +12 -9
  432. package/src/sap/fe/core/messagebundle_ro.properties +16 -13
  433. package/src/sap/fe/core/messagebundle_ru.properties +13 -10
  434. package/src/sap/fe/core/messagebundle_sh.properties +12 -9
  435. package/src/sap/fe/core/messagebundle_sk.properties +12 -9
  436. package/src/sap/fe/core/messagebundle_sl.properties +12 -9
  437. package/src/sap/fe/core/messagebundle_sv.properties +12 -9
  438. package/src/sap/fe/core/messagebundle_th.properties +12 -9
  439. package/src/sap/fe/core/messagebundle_tr.properties +12 -9
  440. package/src/sap/fe/core/messagebundle_uk.properties +12 -9
  441. package/src/sap/fe/core/messagebundle_vi.properties +13 -10
  442. package/src/sap/fe/core/messagebundle_zh_CN.properties +12 -9
  443. package/src/sap/fe/core/messagebundle_zh_TW.properties +12 -9
  444. package/src/sap/fe/core/operationsHelper-dbg.js +70 -44
  445. package/src/sap/fe/core/operationsHelper.js +1 -1
  446. package/src/sap/fe/core/operationsHelper.js.map +1 -1
  447. package/src/sap/fe/core/operationsHelper.ts +88 -63
  448. package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +1 -1
  449. package/src/sap/fe/core/rootView/Fcl.controller.ts +10 -0
  450. package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +2 -2
  451. package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
  452. package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -1
  453. package/src/sap/fe/core/rootView/NavContainer.controller.ts +5 -3
  454. package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +10 -5
  455. package/src/sap/fe/core/rootView/RootViewBaseController.js +1 -1
  456. package/src/sap/fe/core/rootView/RootViewBaseController.js.map +1 -1
  457. package/src/sap/fe/core/rootView/RootViewBaseController.ts +22 -8
  458. package/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +1 -1
  459. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  460. package/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +1 -1
  461. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js.map +1 -1
  462. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +15 -1
  463. package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +1 -1
  464. package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -1
  465. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +4 -1
  466. package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +9 -1
  467. package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -1
  468. package/src/sap/fe/core/services/NavigationServiceFactory.ts +19 -1
  469. package/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +2 -2
  470. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  471. package/src/sap/fe/core/services/ResourceModelServiceFactory.js.map +1 -1
  472. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +10 -3
  473. package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +9 -3
  474. package/src/sap/fe/core/services/RoutingServiceFactory.js +1 -1
  475. package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -1
  476. package/src/sap/fe/core/services/RoutingServiceFactory.ts +35 -3
  477. package/src/sap/fe/core/services/ShellServicesFactory-dbg.js +7 -1
  478. package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
  479. package/src/sap/fe/core/services/ShellServicesFactory.js.map +1 -1
  480. package/src/sap/fe/core/services/ShellServicesFactory.ts +24 -2
  481. package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +448 -279
  482. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
  483. package/src/sap/fe/core/services/SideEffectsServiceFactory.js.map +1 -1
  484. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +497 -333
  485. package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +26 -6
  486. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
  487. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -1
  488. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +54 -13
  489. package/src/sap/fe/core/support/Diagnostics-dbg.js +1 -1
  490. package/src/sap/fe/core/support/Diagnostics.ts +5 -0
  491. package/src/sap/fe/core/templating/CommonFormatters-dbg.js +4 -3
  492. package/src/sap/fe/core/templating/CommonFormatters.js +1 -1
  493. package/src/sap/fe/core/templating/CommonFormatters.js.map +1 -1
  494. package/src/sap/fe/core/templating/CommonFormatters.ts +2 -2
  495. package/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +195 -95
  496. package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
  497. package/src/sap/fe/core/templating/DataModelPathHelper.js.map +1 -1
  498. package/src/sap/fe/core/templating/DataModelPathHelper.ts +210 -96
  499. package/src/sap/fe/core/templating/DisplayModeFormatter-dbg.js +5 -5
  500. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  501. package/src/sap/fe/core/templating/DisplayModeFormatter.js.map +1 -1
  502. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -2
  503. package/src/sap/fe/core/templating/EntitySetHelper-dbg.js +19 -29
  504. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -1
  505. package/src/sap/fe/core/templating/EntitySetHelper.js.map +1 -1
  506. package/src/sap/fe/core/templating/EntitySetHelper.ts +14 -26
  507. package/src/sap/fe/core/templating/EntityTypeHelper-dbg.js +48 -0
  508. package/src/sap/fe/core/templating/EntityTypeHelper.js +6 -0
  509. package/src/sap/fe/core/templating/EntityTypeHelper.js.map +1 -0
  510. package/src/sap/fe/core/templating/EntityTypeHelper.ts +37 -0
  511. package/src/sap/fe/core/templating/FilterHelper-dbg.js +3 -3
  512. package/src/sap/fe/core/templating/FilterHelper.js +1 -1
  513. package/src/sap/fe/core/templating/FilterHelper.js.map +1 -1
  514. package/src/sap/fe/core/templating/FilterHelper.ts +5 -3
  515. package/src/sap/fe/core/templating/FilterTemplating-dbg.js +7 -8
  516. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  517. package/src/sap/fe/core/templating/FilterTemplating.js.map +1 -1
  518. package/src/sap/fe/core/templating/FilterTemplating.ts +5 -8
  519. package/src/sap/fe/core/templating/PropertyFormatters-dbg.js +1 -6
  520. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  521. package/src/sap/fe/core/templating/PropertyFormatters.js.map +1 -1
  522. package/src/sap/fe/core/templating/PropertyFormatters.ts +0 -5
  523. package/src/sap/fe/core/templating/PropertyHelper-dbg.js +13 -46
  524. package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
  525. package/src/sap/fe/core/templating/PropertyHelper.js.map +1 -1
  526. package/src/sap/fe/core/templating/PropertyHelper.ts +14 -43
  527. package/src/sap/fe/core/templating/UIFormatters-dbg.js +32 -26
  528. package/src/sap/fe/core/templating/UIFormatters.js +1 -1
  529. package/src/sap/fe/core/templating/UIFormatters.js.map +1 -1
  530. package/src/sap/fe/core/templating/UIFormatters.ts +47 -32
  531. package/src/sap/fe/core/type/DateTimeWithTimezone-dbg.js +1 -1
  532. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -0
  533. package/src/sap/fe/core/type/FiscalDate-dbg.js +2 -2
  534. package/src/sap/fe/core/type/FiscalDate.js.map +1 -1
  535. package/src/sap/fe/core/type/FiscalDate.ts +2 -1
  536. package/src/sap/fe/core/type/TypeUtil-dbg.js +5 -10
  537. package/src/sap/fe/core/type/TypeUtil.js +1 -1
  538. package/src/sap/fe/core/type/TypeUtil.js.map +1 -1
  539. package/src/sap/fe/core/type/TypeUtil.ts +3 -6
  540. package/src/sap/fe/core/buildingBlocks/BuildingBlock-dbg.js +0 -410
  541. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +0 -15
  542. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js.map +0 -1
  543. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +0 -536
  544. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment-dbg.js +0 -44
  545. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +0 -6
  546. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js.map +0 -1
  547. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +0 -14
  548. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime-dbg.js +0 -948
  549. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +0 -19
  550. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js.map +0 -1
  551. package/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +0 -711
  552. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +0 -6
  553. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js.map +0 -1
  554. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +0 -863
  555. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +0 -91
  556. package/src/sap/fe/core/controls/ConditionalWrapper-dbg.js +0 -151
  557. package/src/sap/fe/core/controls/ConditionalWrapper.js +0 -6
  558. package/src/sap/fe/core/controls/ConditionalWrapper.js.map +0 -1
  559. package/src/sap/fe/core/controls/ConditionalWrapper.ts +0 -88
  560. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper-dbg.js +0 -330
  561. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +0 -6
  562. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js.map +0 -1
  563. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +0 -292
  564. package/src/sap/fe/core/controls/CustomQuickViewPage-dbg.js +0 -126
  565. package/src/sap/fe/core/controls/CustomQuickViewPage.js +0 -6
  566. package/src/sap/fe/core/controls/CustomQuickViewPage.js.map +0 -1
  567. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +0 -105
  568. package/src/sap/fe/core/controls/FieldWrapper-dbg.js +0 -194
  569. package/src/sap/fe/core/controls/FieldWrapper.js +0 -6
  570. package/src/sap/fe/core/controls/FieldWrapper.js.map +0 -1
  571. package/src/sap/fe/core/controls/FieldWrapper.ts +0 -121
  572. package/src/sap/fe/core/controls/FileWrapper-dbg.js +0 -280
  573. package/src/sap/fe/core/controls/FileWrapper.js +0 -6
  574. package/src/sap/fe/core/controls/FileWrapper.js.map +0 -1
  575. package/src/sap/fe/core/controls/FileWrapper.ts +0 -202
  576. package/src/sap/fe/core/helpers/SideEffectsHelper-dbg.js +0 -141
  577. package/src/sap/fe/core/helpers/SideEffectsHelper.js +0 -6
  578. package/src/sap/fe/core/helpers/SideEffectsHelper.js.map +0 -1
  579. package/src/sap/fe/core/helpers/SideEffectsHelper.ts +0 -129
@@ -57,6 +57,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
57
57
  await this._setInitialStatesForDeltaCompute(oVM);
58
58
  } catch (error) {
59
59
  Log.error(error);
60
+ this.invalidateInitialStateForApply.push(...oVM.getFor());
61
+ await this._setInitialStatesForDeltaCompute(oVM);
60
62
  }
61
63
  } else {
62
64
  this._setInitialStatesForDeltaCompute(oVM);
@@ -102,7 +104,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
102
104
  apply: async function (filterBar, controlState) {
103
105
  try {
104
106
  if (controlState) {
105
- if (controlState !== null && controlState !== void 0 && controlState.initialState && this.controlsVariantIdUnavailable.indexOf(filterBar.getId()) === -1) {
107
+ const isInitialStateApplicable = (controlState === null || controlState === void 0 ? void 0 : controlState.initialState) && this.invalidateInitialStateForApply.indexOf(filterBar.getId()) === -1 && this.controlsVariantIdUnavailable.indexOf(filterBar.getId()) === -1;
108
+ if (isInitialStateApplicable) {
106
109
  const diffState = await StateUtil.diffState(filterBar, controlState.initialState, controlState.fullState);
107
110
  return StateUtil.applyExternalState(filterBar, diffState);
108
111
  } else {
@@ -124,9 +127,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
124
127
  try {
125
128
  if (controlState) {
126
129
  // Extra condition added to apply the diff state logic for mdc control
127
- if (controlState !== null && controlState !== void 0 && controlState.initialState && this.controlsVariantIdUnavailable.indexOf(table.getId()) === -1) {
130
+ const isInitialStateApplicable = (controlState === null || controlState === void 0 ? void 0 : controlState.initialState) && this.invalidateInitialStateForApply.indexOf(table.getId()) === -1 && this.controlsVariantIdUnavailable.indexOf(table.getId()) === -1;
131
+ if (isInitialStateApplicable) {
128
132
  var _controlState$initial;
129
- if (!((_controlState$initial = controlState.initialState) !== null && _controlState$initial !== void 0 && _controlState$initial.supplementaryConfig)) {
133
+ if (controlState.initialState && !((_controlState$initial = controlState.initialState) !== null && _controlState$initial !== void 0 && _controlState$initial.supplementaryConfig)) {
130
134
  controlState.initialState.supplementaryConfig = {};
131
135
  }
132
136
  const oDiffState = await StateUtil.diffState(table, controlState.initialState, controlState.fullState);
@@ -183,7 +187,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
183
187
  try {
184
188
  if (controlState) {
185
189
  // Extra condition added to apply the diff state logic for mdc control
186
- if (controlState?.initialState && this.controlsVariantIdUnavailable.indexOf(chart.getId()) === -1) {
190
+ const isInitialStateApplicable = controlState?.initialState && this.invalidateInitialStateForApply.indexOf(chart.getId()) === -1 && this.controlsVariantIdUnavailable.indexOf(chart.getId()) === -1;
191
+ if (isInitialStateApplicable) {
187
192
  const diffState = await StateUtil.diffState(
188
193
  chart,
189
194
  controlState.initialState as object,
@@ -253,7 +258,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
253
258
  };
254
259
  },
255
260
  apply: function (oQuickFilter, oControlState) {
256
- if (oControlState) {
261
+ if (oControlState !== null && oControlState !== void 0 && oControlState.selectedKey) {
257
262
  oQuickFilter.setSelectorKey(oControlState.selectedKey);
258
263
  }
259
264
  }
@@ -265,7 +270,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
265
270
  };
266
271
  },
267
272
  apply: function (oSegmentedButton, oControlState) {
268
- if (oControlState) {
273
+ if (oControlState !== null && oControlState !== void 0 && oControlState.selectedKey) {
269
274
  oSegmentedButton.setSelectedKey(oControlState.selectedKey);
270
275
  }
271
276
  }
@@ -277,7 +282,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
277
282
  };
278
283
  },
279
284
  apply: function (oSelect, oControlState) {
280
- if (oControlState) {
285
+ if (oControlState !== null && oControlState !== void 0 && oControlState.selectedKey) {
281
286
  oSelect.setSelectedKey(oControlState.selectedKey);
282
287
  }
283
288
  }
@@ -350,6 +355,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
350
355
  _this = _ControllerExtension.call(this) || this;
351
356
  _this.initialControlStatesMapper = {};
352
357
  _this.controlsVariantIdUnavailable = [];
358
+ _this.invalidateInitialStateForApply = [];
353
359
  _this.viewStateControls = [];
354
360
  _this._setInitialStatesForDeltaCompute = async variantManagement => {
355
361
  try {
@@ -393,6 +399,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
393
399
  });
394
400
  return oPromiseChain;
395
401
  }
402
+
396
403
  /**
397
404
  * This function should add all controls relevant for refreshing to the provided control array.
398
405
  *
@@ -441,6 +448,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
441
448
  this.base.viewState.adaptBindingRefreshHandler(oControl, oRefreshBindingHandler);
442
449
  return oRefreshBindingHandler;
443
450
  }
451
+
444
452
  /**
445
453
  * Customize the <code>refreshBinding</code> function for a certain control.
446
454
  *
@@ -855,6 +863,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
855
863
  _proto.getInterface = function getInterface() {
856
864
  return this;
857
865
  }
866
+
858
867
  // method to get the control state for mdc controls applying the delta logic
859
868
  ;
860
869
  _proto._getControlState = function _getControlState(controlStateKey, controlState) {
@@ -900,4 +909,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
900
909
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "refreshViewBindings", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "refreshViewBindings"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptBindingRefreshControls", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptBindingRefreshControls"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "refreshControlBinding", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "refreshControlBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getControlRefreshBindingHandler", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "getControlRefreshBindingHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptBindingRefreshHandler", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptBindingRefreshHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onSuspend", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "onSuspend"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRestore", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onRestore"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "collectResults", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "collectResults"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptControlStateHandler", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptControlStateHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getControlStateHandler", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "getControlStateHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptStateControls", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptStateControls"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getStateKey", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "getStateKey"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveViewState", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveViewState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveAdditionalStates", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveAdditionalStates"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveControlState", [_dec30, _dec31], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveControlState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyInitialStateOnly", [_dec32, _dec33], Object.getOwnPropertyDescriptor(_class2.prototype, "applyInitialStateOnly"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyViewState", [_dec34, _dec35], Object.getOwnPropertyDescriptor(_class2.prototype, "applyViewState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_checkIfVariantIdIsAvailable", [_dec36], Object.getOwnPropertyDescriptor(_class2.prototype, "_checkIfVariantIdIsAvailable"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeStateApplied", [_dec37, _dec38], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeStateApplied"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterStateApplied", [_dec39, _dec40], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterStateApplied"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyAdditionalStates", [_dec41, _dec42], Object.getOwnPropertyDescriptor(_class2.prototype, "applyAdditionalStates"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_applyNavigationParametersToFilterbar", [_dec43], Object.getOwnPropertyDescriptor(_class2.prototype, "_applyNavigationParametersToFilterbar"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyNavigationParameters", [_dec44, _dec45], Object.getOwnPropertyDescriptor(_class2.prototype, "applyNavigationParameters"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyControlState", [_dec46, _dec47], Object.getOwnPropertyDescriptor(_class2.prototype, "applyControlState"), _class2.prototype)), _class2)) || _class);
901
910
  return ViewState;
902
911
  }, false);
903
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBRERJVElPTkFMX1NUQVRFU19LRVkiLCJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIl9tQ29udHJvbFN0YXRlSGFuZGxlck1hcCIsInJldHJpZXZlIiwib1ZNIiwidmFyaWFudElkIiwiZ2V0Q3VycmVudFZhcmlhbnRLZXkiLCJhcHBseSIsImNvbnRyb2xTdGF0ZSIsInVuZGVmaW5lZCIsImlzVmFyaWFudElkQXZhaWxhYmxlIiwiX2NoZWNrSWZWYXJpYW50SWRJc0F2YWlsYWJsZSIsInNWYXJpYW50UmVmZXJlbmNlIiwiZ2V0U3RhbmRhcmRWYXJpYW50S2V5IiwiY29udHJvbHNWYXJpYW50SWRVbmF2YWlsYWJsZSIsInB1c2giLCJnZXRGb3IiLCJDb250cm9sVmFyaWFudEFwcGx5QVBJIiwiYWN0aXZhdGVWYXJpYW50IiwiZWxlbWVudCIsInZhcmlhbnRSZWZlcmVuY2UiLCJfc2V0SW5pdGlhbFN0YXRlc0ZvckRlbHRhQ29tcHV0ZSIsImVycm9yIiwiTG9nIiwib1RhYkJhciIsInNlbGVjdGVkS2V5IiwiZ2V0U2VsZWN0ZWRLZXkiLCJvQ29udHJvbFN0YXRlIiwib1NlbGVjdGVkSXRlbSIsImdldEl0ZW1zIiwiZmluZCIsIm9JdGVtIiwiZ2V0S2V5Iiwic2V0U2VsZWN0ZWRJdGVtIiwiZmlsdGVyQmFyIiwiY29udHJvbFN0YXRlS2V5IiwiZ2V0U3RhdGVLZXkiLCJmaWx0ZXJCYXJTdGF0ZSIsIlN0YXRlVXRpbCIsInJldHJpZXZlRXh0ZXJuYWxTdGF0ZSIsInByb3BlcnRpZXNJbmZvIiwiZ2V0UHJvcGVydHlJbmZvU2V0IiwiZmlsdGVyIiwiUHJvcGVydHlJbmZvIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsInBhdGgiLCJyZW1vdmVGcm9tQXBwU3RhdGUiLCJmb3JFYWNoIiwiX2dldENvbnRyb2xTdGF0ZSIsImluaXRpYWxTdGF0ZSIsImluZGV4T2YiLCJnZXRJZCIsImRpZmZTdGF0ZSIsImZ1bGxTdGF0ZSIsImFwcGx5RXh0ZXJuYWxTdGF0ZSIsInRhYmxlIiwidGFibGVTdGF0ZSIsInN1cHBsZW1lbnRhcnlDb25maWciLCJvRGlmZlN0YXRlIiwicmVmcmVzaEJpbmRpbmciLCJvVGFibGUiLCJvVGFibGVCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsIm9Sb290QmluZGluZyIsImdldFJvb3RCaW5kaW5nIiwicmVmcmVzaCIsIm9IZWFkZXJDb250ZXh0IiwiZ2V0SGVhZGVyQ29udGV4dCIsInNHcm91cElkIiwiZ2V0R3JvdXBJZCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiaW5mbyIsIm9DaGFydCIsIm9PUExheW91dCIsInNlbGVjdGVkU2VjdGlvbiIsImdldFNlbGVjdGVkU2VjdGlvbiIsInNldFNlbGVjdGVkU2VjdGlvbiIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0JpbmRpbmciLCJnZXRCaW5kaW5nIiwic01ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJzU3RyYXRlZ3kiLCJLZWVwQWxpdmVIZWxwZXIiLCJnZXRDb250cm9sUmVmcmVzaFN0cmF0ZWd5Rm9yQ29udGV4dFBhdGgiLCJvTW9kZWwiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJvTmF2aWdhdGlvblByb3BlcnRpZXMiLCJDb21tb25VdGlscyIsImdldENvbnRleHRQYXRoUHJvcGVydGllcyIsIiRraW5kIiwiYU5hdlByb3BlcnRpZXNUb1JlcXVlc3QiLCJyZWR1Y2UiLCJhUHJldiIsInNOYXZQcm9wIiwiJGlzQ29sbGVjdGlvbiIsImFQcm9wZXJ0aWVzIiwiJFByb3BlcnR5UGF0aCIsImNvbmNhdCIsIm9RdWlja0ZpbHRlciIsImdldFNlbGVjdG9yS2V5Iiwic2V0U2VsZWN0b3JLZXkiLCJvU2VnbWVudGVkQnV0dG9uIiwic2V0U2VsZWN0ZWRLZXkiLCJvU2VsZWN0Iiwib0R5bmFtaWNQYWdlIiwiaGVhZGVyRXhwYW5kZWQiLCJnZXRIZWFkZXJFeHBhbmRlZCIsInNldEhlYWRlckV4cGFuZGVkIiwib1ZpZXciLCJvQ29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJ2aWV3U3RhdGUiLCJyZXRyaWV2ZVZpZXdTdGF0ZSIsIm9OYXZQYXJhbWV0ZXJzIiwiYXBwbHlWaWV3U3RhdGUiLCJyZWZyZXNoVmlld0JpbmRpbmdzIiwib0NvbXBvbmVudENvbnRhaW5lciIsIm9Db21wb25lbnQiLCJnZXRDb21wb25lbnRJbnN0YW5jZSIsInJldHJpZXZlQ29udHJvbFN0YXRlIiwiZ2V0Um9vdENvbnRyb2wiLCJhcHBseUNvbnRyb2xTdGF0ZSIsIlZpZXdTdGF0ZSIsImRlZmluZVVJNUNsYXNzIiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsInByaXZhdGVFeHRlbnNpb24iLCJJbnN0ZWFkIiwiaW5pdGlhbENvbnRyb2xTdGF0ZXNNYXBwZXIiLCJ2aWV3U3RhdGVDb250cm9scyIsInZhcmlhbnRNYW5hZ2VtZW50IiwiYWRhcHRDb250cm9scyIsImV4dGVybmFsU3RhdGVQcm9taXNlcyIsImluaXRpYWxDb250cm9sU3RhdGVzIiwidmFyaWFudENvbnRyb2xzIiwiY29udHJvbCIsImlzQSIsIl9hZGRFdmVudExpc3RlbmVyc1RvVmFyaWFudE1hbmFnZW1lbnQiLCJleHRlcm5hbFN0YXRlUHJvbWlzZSIsIlByb21pc2UiLCJhbGwiLCJpbml0aWFsQ29udHJvbFN0YXRlIiwiaSIsImUiLCJfaVJldHJpZXZpbmdTdGF0ZUNvdW50ZXIiLCJfcEluaXRpYWxTdGF0ZUFwcGxpZWQiLCJyZXNvbHZlIiwiX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZSIsImFDb250cm9scyIsImNvbGxlY3RSZXN1bHRzIiwiYmFzZSIsImFkYXB0QmluZGluZ1JlZnJlc2hDb250cm9scyIsIm9Qcm9taXNlQ2hhaW4iLCJvQ29udHJvbCIsInRoZW4iLCJyZWZyZXNoQ29udHJvbEJpbmRpbmciLCJiaW5kIiwiYUNvbGxlY3RlZENvbnRyb2xzIiwib0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIiLCJnZXRDb250cm9sUmVmcmVzaEJpbmRpbmdIYW5kbGVyIiwiZ2V0TWV0YWRhdGEiLCJnZXROYW1lIiwib1JlZnJlc2hCaW5kaW5nSGFuZGxlciIsInNUeXBlIiwiYWRhcHRCaW5kaW5nUmVmcmVzaEhhbmRsZXIiLCJvQ29udHJvbEhhbmRsZXIiLCJvblN1c3BlbmQiLCJvblJlc3RvcmUiLCJkZXN0cm95IiwiZm5DYWxsIiwiYVJlc3VsdHMiLCJhcmdzIiwiYWRhcHRDb250cm9sU3RhdGVIYW5kbGVyIiwiYUNvbnRyb2xIYW5kbGVyIiwiZ2V0Q29udHJvbFN0YXRlSGFuZGxlciIsImFJbnRlcm5hbENvbnRyb2xTdGF0ZUhhbmRsZXIiLCJhQ3VzdG9tQ29udHJvbFN0YXRlSGFuZGxlciIsImFzc2lnbiIsImFkYXB0U3RhdGVDb250cm9scyIsImdldFZpZXciLCJnZXRMb2NhbElkIiwib1ZpZXdTdGF0ZSIsImFSZXNvbHZlZFN0YXRlcyIsIm1hcCIsInZSZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsIm9TdGF0ZXMiLCJtU3RhdGUiLCJvQ3VycmVudFN0YXRlIiwibWVyZ2VPYmplY3RzIiwibUFkZGl0aW9uYWxTdGF0ZXMiLCJfcmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzIiwicmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzIiwiYUNvbnRyb2xTdGF0ZUhhbmRsZXJzIiwibUNvbnRyb2xTdGF0ZUhhbmRsZXIiLCJFcnJvciIsImNhbGwiLCJhU3RhdGVzIiwib0ZpbmFsU3RhdGUiLCJhcHBseUluaXRpYWxTdGF0ZU9ubHkiLCJvTmF2UGFyYW1ldGVyIiwiX2dldEluaXRpYWxTdGF0ZUFwcGxpZWQiLCJvbkJlZm9yZVN0YXRlQXBwbGllZCIsImhhc1ZhcmlhbnRNYW5hZ2VtZW50Iiwic29ydGVkQWRhcHRTdGF0ZUNvbnRyb2xzIiwibW9kaWZpZWRDb250cm9scyIsImlzVmFyaWFudE1hbmFnZW1lbnRDb250cm9sIiwic0tleSIsIm5hdmlnYXRpb25UeXBlIiwiaUFwcFN0YXRlIiwiYXBwbHlBZGRpdGlvbmFsU3RhdGVzIiwiYXBwbHlOYXZpZ2F0aW9uUGFyYW1ldGVycyIsIl9hcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzVG9GaWx0ZXJiYXIiLCJvbkFmdGVyU3RhdGVBcHBsaWVkIiwiX3NldEluaXRpYWxTdGF0ZUFwcGxpZWQiLCJzVmFyaWFudElkIiwiYVZhcmlhbnRzIiwiZ2V0VmFyaWFudHMiLCJiSXNDb250cm9sU3RhdGVWYXJpYW50QXZhaWxhYmxlIiwib1ZhcmlhbnQiLCJwSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUiLCJhUHJvbWlzZXMiLCJfb05hdlBhcmFtZXRlciIsIl9hUHJvbWlzZXMiLCJnZXRJbnRlcmZhY2UiLCJvUGF5bG9hZCIsInZhcmlhbnRNYW5hZ2VkQ29udHJvbHMiLCJmbkV2ZW50IiwiX3VwZGF0ZUluaXRpYWxTdGF0ZXNPblZhcmlhbnRDaGFuZ2UiLCJhdHRhY2hTYXZlIiwiYXR0YWNoU2VsZWN0Iiwidm1Bc3NvY2lhdGVkQ29udHJvbHNUb1Jlc2V0IiwiY29udHJvbEtleSIsInZtQXNzb2NpYXRlZGNvbnRyb2xLZXkiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJWaWV3U3RhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHByaXZhdGVFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEtlZXBBbGl2ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9LZWVwQWxpdmVIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgTmF2TGlicmFyeSBmcm9tIFwic2FwL2ZlL25hdmlnYXRpb24vbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgQ29udHJvbFZhcmlhbnRBcHBseUFQSSBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L2FwaS9Db250cm9sVmFyaWFudEFwcGx5QVBJXCI7XG4vLyBpbXBvcnQgQ2hhcnQgZnJvbSBcInNhcC91aS9tZGMvQ2hhcnRcIjtcbmltcG9ydCB0eXBlIEZpbHRlckJhciBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJCYXJcIjtcbmltcG9ydCB0eXBlIEZpbHRlckJhckJhc2UgZnJvbSBcInNhcC91aS9tZGMvZmlsdGVyYmFyL0ZpbHRlckJhckJhc2VcIjtcbmltcG9ydCBTdGF0ZVV0aWwgZnJvbSBcInNhcC91aS9tZGMvcDEzbi9TdGF0ZVV0aWxcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IFByb3BlcnR5SW5mbyB9IGZyb20gXCJzYXAvdWkvbWRjL3V0aWwvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsTmF2UHJvcGVydHksIFZhcmlhbnRNYW5hZ2VtZW50IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG4vLyBhZGRpdGlvbmFsU3RhdGVzIGFyZSBzdG9yZWQgbmV4dCB0byBjb250cm9sIElEcywgc28gbmFtZSBjbGFzaCBhdm9pZGFuY2UgbmVlZGVkLiBGb3J0dW5hdGVseSBJRHMgaGF2ZSByZXN0cmljdGlvbnM6XG4vLyBcIkFsbG93ZWQgaXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIChjYXBpdGFsL2xvd2VyY2FzZSksIGRpZ2l0cywgdW5kZXJzY29yZXMsIGRhc2hlcywgcG9pbnRzIGFuZC9vciBjb2xvbnMuXCJcbi8vIFRoZXJlZm9yZSBhZGRpbmcgYSBzeW1ib2wgbGlrZSAjIG9yIEBcbmNvbnN0IEFERElUSU9OQUxfU1RBVEVTX0tFWSA9IFwiI2FkZGl0aW9uYWxTdGF0ZXNcIixcblx0TmF2VHlwZSA9IE5hdkxpYnJhcnkuTmF2VHlwZTtcblxuLyoqXG4gKiBEZWZpbml0aW9uIG9mIGEgY3VzdG9tIGFjdGlvbiB0byBiZSB1c2VkIGluc2lkZSB0aGUgdGFibGUgdG9vbGJhclxuICpcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5OYXZpZ2F0aW9uUGFyYW1ldGVyXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIE5hdmlnYXRpb25QYXJhbWV0ZXIgPSB7XG5cdC8qKlxuXHQgKiAgVGhlIGFjdHVhbCBuYXZpZ2F0aW9uIHR5cGUuXG5cdCAqXG5cdCAqICBAcHVibGljXG5cdCAqL1xuXHRuYXZpZ2F0aW9uVHlwZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHNlbGVjdGlvblZhcmlhbnQgZnJvbSB0aGUgbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0c2VsZWN0aW9uVmFyaWFudD86IG9iamVjdDtcblx0LyoqXG5cdCAqIFRoZSBzZWxlY3Rpb25WYXJpYW50IGRlZmF1bHRzIGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICpcblx0ICogIEBwdWJsaWNcblx0ICovXG5cdHNlbGVjdGlvblZhcmlhbnREZWZhdWx0cz86IG9iamVjdDtcblx0LyoqXG5cdCAqIERlZmluZXMgd2hldGhlciB0aGUgc3RhbmRhcmQgdmFyaWFudCBtdXN0IGJlIHVzZWQgaW4gdmFyaWFudCBtYW5hZ2VtZW50XG5cdCAqXG5cdCAqICBAcHVibGljXG5cdCAqL1xuXHRyZXF1aXJlc1N0YW5kYXJkVmFyaWFudD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBDb250cm9sU3RhdGUgPVxuXHR8ICh7XG5cdFx0XHRpbml0aWFsU3RhdGU/OiB7XG5cdFx0XHRcdHN1cHBsZW1lbnRhcnlDb25maWc6IG9iamVjdDtcblx0XHRcdH07XG5cdFx0XHRmdWxsU3RhdGU/OiBvYmplY3Q7XG5cdCAgfSAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuXHR8IHVuZGVmaW5lZDtcblxuZXhwb3J0IHR5cGUgRmlsdGVyQmFyU3RhdGUgPSB7XG5cdGZpbHRlcj86IFJlY29yZDxzdHJpbmcsIEFycmF5PG9iamVjdD4+O1xufSAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBtZXRob2RzIHRvIHJldHJpZXZlICYgYXBwbHkgc3RhdGVzIGZvciB0aGUgZGlmZmVyZW50IGNvbnRyb2xzIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmNvbnN0IF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcblx0XCJzYXAudWkuZmwudmFyaWFudHMuVmFyaWFudE1hbmFnZW1lbnRcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1ZNOiBWYXJpYW50TWFuYWdlbWVudCk6IHsgdmFyaWFudElkOiBzdHJpbmcgfCBudWxsIH0ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dmFyaWFudElkOiBvVk0uZ2V0Q3VycmVudFZhcmlhbnRLZXkoKVxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBhc3luYyBmdW5jdGlvbiAob1ZNOiBWYXJpYW50TWFuYWdlbWVudCwgY29udHJvbFN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKGNvbnRyb2xTdGF0ZSAmJiBjb250cm9sU3RhdGUudmFyaWFudElkICE9PSB1bmRlZmluZWQgJiYgY29udHJvbFN0YXRlLnZhcmlhbnRJZCAhPT0gb1ZNLmdldEN1cnJlbnRWYXJpYW50S2V5KCkpIHtcblx0XHRcdFx0XHRjb25zdCBpc1ZhcmlhbnRJZEF2YWlsYWJsZSA9IHRoaXMuX2NoZWNrSWZWYXJpYW50SWRJc0F2YWlsYWJsZShvVk0sIGNvbnRyb2xTdGF0ZS52YXJpYW50SWQpO1xuXHRcdFx0XHRcdGxldCBzVmFyaWFudFJlZmVyZW5jZTtcblx0XHRcdFx0XHRpZiAoaXNWYXJpYW50SWRBdmFpbGFibGUpIHtcblx0XHRcdFx0XHRcdHNWYXJpYW50UmVmZXJlbmNlID0gY29udHJvbFN0YXRlLnZhcmlhbnRJZDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c1ZhcmlhbnRSZWZlcmVuY2UgPSBvVk0uZ2V0U3RhbmRhcmRWYXJpYW50S2V5KCk7XG5cdFx0XHRcdFx0XHR0aGlzLmNvbnRyb2xzVmFyaWFudElkVW5hdmFpbGFibGUucHVzaCguLi5vVk0uZ2V0Rm9yKCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgQ29udHJvbFZhcmlhbnRBcHBseUFQSS5hY3RpdmF0ZVZhcmlhbnQoe1xuXHRcdFx0XHRcdFx0XHRlbGVtZW50OiBvVk0sXG5cdFx0XHRcdFx0XHRcdHZhcmlhbnRSZWZlcmVuY2U6IHNWYXJpYW50UmVmZXJlbmNlIGFzIHN0cmluZ1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX3NldEluaXRpYWxTdGF0ZXNGb3JEZWx0YUNvbXB1dGUob1ZNKTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvciA6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuX3NldEluaXRpYWxTdGF0ZXNGb3JEZWx0YUNvbXB1dGUob1ZNKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC5tLkljb25UYWJCYXJcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1RhYkJhcjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1RhYkJhci5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvVGFiQmFyOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0aWYgKG9Db250cm9sU3RhdGUgJiYgb0NvbnRyb2xTdGF0ZS5zZWxlY3RlZEtleSkge1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0ZWRJdGVtID0gb1RhYkJhci5nZXRJdGVtcygpLmZpbmQoZnVuY3Rpb24gKG9JdGVtOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0l0ZW0uZ2V0S2V5KCkgPT09IG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob1NlbGVjdGVkSXRlbSkge1xuXHRcdFx0XHRcdG9UYWJCYXIuc2V0U2VsZWN0ZWRJdGVtKG9TZWxlY3RlZEl0ZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5tZGMuRmlsdGVyQmFyXCI6IHtcblx0XHRyZXRyaWV2ZTogYXN5bmMgZnVuY3Rpb24gKGZpbHRlckJhcjogRmlsdGVyQmFyQmFzZSkge1xuXHRcdFx0Y29uc3QgY29udHJvbFN0YXRlS2V5ID0gdGhpcy5nZXRTdGF0ZUtleShmaWx0ZXJCYXIpO1xuXHRcdFx0Y29uc3QgZmlsdGVyQmFyU3RhdGUgPSBhd2FpdCBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKGZpbHRlckJhcik7XG5cdFx0XHQvLyByZW1vdmUgc2Vuc2l0aXZlIG9yIHZpZXcgc3RhdGUgaXJyZWxldmFudCBmaWVsZHNcblx0XHRcdGNvbnN0IHByb3BlcnRpZXNJbmZvID0gZmlsdGVyQmFyLmdldFByb3BlcnR5SW5mb1NldCgpO1xuXHRcdFx0Y29uc3QgZmlsdGVyID0gZmlsdGVyQmFyU3RhdGUuZmlsdGVyIHx8IHt9O1xuXHRcdFx0cHJvcGVydGllc0luZm9cblx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAoUHJvcGVydHlJbmZvOiBQcm9wZXJ0eUluZm8pIHtcblx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0T2JqZWN0LmtleXMoZmlsdGVyKS5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0XHRQcm9wZXJ0eUluZm8ucGF0aCAmJlxuXHRcdFx0XHRcdFx0ZmlsdGVyW1Byb3BlcnR5SW5mby5wYXRoXSAmJlxuXHRcdFx0XHRcdFx0KFByb3BlcnR5SW5mby5yZW1vdmVGcm9tQXBwU3RhdGUgfHwgZmlsdGVyW1Byb3BlcnR5SW5mby5wYXRoXS5sZW5ndGggPT09IDApXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmZvckVhY2goZnVuY3Rpb24gKFByb3BlcnR5SW5mbzogUHJvcGVydHlJbmZvKSB7XG5cdFx0XHRcdFx0aWYgKFByb3BlcnR5SW5mby5wYXRoKSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgZmlsdGVyW1Byb3BlcnR5SW5mby5wYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldENvbnRyb2xTdGF0ZShjb250cm9sU3RhdGVLZXksIGZpbHRlckJhclN0YXRlKTtcblx0XHR9LFxuXHRcdGFwcGx5OiBhc3luYyBmdW5jdGlvbiAoZmlsdGVyQmFyOiBGaWx0ZXJCYXIsIGNvbnRyb2xTdGF0ZTogQ29udHJvbFN0YXRlKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoY29udHJvbFN0YXRlKSB7XG5cdFx0XHRcdFx0aWYgKGNvbnRyb2xTdGF0ZT8uaW5pdGlhbFN0YXRlICYmIHRoaXMuY29udHJvbHNWYXJpYW50SWRVbmF2YWlsYWJsZS5pbmRleE9mKGZpbHRlckJhci5nZXRJZCgpKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGRpZmZTdGF0ZTogb2JqZWN0ID0gYXdhaXQgU3RhdGVVdGlsLmRpZmZTdGF0ZShcblx0XHRcdFx0XHRcdFx0ZmlsdGVyQmFyLFxuXHRcdFx0XHRcdFx0XHRjb250cm9sU3RhdGUuaW5pdGlhbFN0YXRlIGFzIG9iamVjdCxcblx0XHRcdFx0XHRcdFx0Y29udHJvbFN0YXRlLmZ1bGxTdGF0ZSBhcyBvYmplY3Rcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gU3RhdGVVdGlsLmFwcGx5RXh0ZXJuYWxTdGF0ZShmaWx0ZXJCYXIsIGRpZmZTdGF0ZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKGZpbHRlckJhciwgY29udHJvbFN0YXRlPy5mdWxsU3RhdGUgPz8gY29udHJvbFN0YXRlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAudWkubWRjLlRhYmxlXCI6IHtcblx0XHRyZXRyaWV2ZTogYXN5bmMgZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSkge1xuXHRcdFx0Y29uc3QgY29udHJvbFN0YXRlS2V5ID0gdGhpcy5nZXRTdGF0ZUtleSh0YWJsZSk7XG5cdFx0XHRjb25zdCB0YWJsZVN0YXRlID0gYXdhaXQgU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZSh0YWJsZSk7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFN0YXRlKGNvbnRyb2xTdGF0ZUtleSwgdGFibGVTdGF0ZSk7XG5cdFx0fSxcblx0XHRhcHBseTogYXN5bmMgZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSwgY29udHJvbFN0YXRlOiBDb250cm9sU3RhdGUpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChjb250cm9sU3RhdGUpIHtcblx0XHRcdFx0XHQvLyBFeHRyYSBjb25kaXRpb24gYWRkZWQgdG8gYXBwbHkgdGhlIGRpZmYgc3RhdGUgbG9naWMgZm9yIG1kYyBjb250cm9sXG5cdFx0XHRcdFx0aWYgKGNvbnRyb2xTdGF0ZT8uaW5pdGlhbFN0YXRlICYmIHRoaXMuY29udHJvbHNWYXJpYW50SWRVbmF2YWlsYWJsZS5pbmRleE9mKHRhYmxlLmdldElkKCkpID09PSAtMSkge1xuXHRcdFx0XHRcdFx0aWYgKCFjb250cm9sU3RhdGUuaW5pdGlhbFN0YXRlPy5zdXBwbGVtZW50YXJ5Q29uZmlnKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRyb2xTdGF0ZS5pbml0aWFsU3RhdGUuc3VwcGxlbWVudGFyeUNvbmZpZyA9IHt9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y29uc3Qgb0RpZmZTdGF0ZSA9IGF3YWl0IFN0YXRlVXRpbC5kaWZmU3RhdGUoXG5cdFx0XHRcdFx0XHRcdHRhYmxlLFxuXHRcdFx0XHRcdFx0XHRjb250cm9sU3RhdGUuaW5pdGlhbFN0YXRlIGFzIG9iamVjdCxcblx0XHRcdFx0XHRcdFx0Y29udHJvbFN0YXRlLmZ1bGxTdGF0ZSBhcyBvYmplY3Rcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gU3RhdGVVdGlsLmFwcGx5RXh0ZXJuYWxTdGF0ZSh0YWJsZSwgb0RpZmZTdGF0ZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmICghY29udHJvbFN0YXRlLnN1cHBsZW1lbnRhcnlDb25maWcpIHtcblx0XHRcdFx0XHRcdFx0Y29udHJvbFN0YXRlLnN1cHBsZW1lbnRhcnlDb25maWcgPSB7fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKHRhYmxlLCBjb250cm9sU3RhdGU/LmZ1bGxTdGF0ZSA/PyBjb250cm9sU3RhdGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZWZyZXNoQmluZGluZzogZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRjb25zdCBvVGFibGVCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdGlmIChvVGFibGVCaW5kaW5nKSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290QmluZGluZyA9IG9UYWJsZUJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKTtcblx0XHRcdFx0aWYgKG9Sb290QmluZGluZyA9PT0gb1RhYmxlQmluZGluZykge1xuXHRcdFx0XHRcdC8vIGFic29sdXRlIGJpbmRpbmdcblx0XHRcdFx0XHRvVGFibGVCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyByZWxhdGl2ZSBiaW5kaW5nXG5cdFx0XHRcdFx0Y29uc3Qgb0hlYWRlckNvbnRleHQgPSBvVGFibGVCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdFx0XHRjb25zdCBzR3JvdXBJZCA9IG9UYWJsZUJpbmRpbmcuZ2V0R3JvdXBJZCgpO1xuXG5cdFx0XHRcdFx0aWYgKG9IZWFkZXJDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRvSGVhZGVyQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCIgfV0sIHNHcm91cElkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy5pbmZvKGBUYWJsZTogJHtvVGFibGUuZ2V0SWQoKX0gd2FzIG5vdCByZWZyZXNoZWQuIE5vIGJpbmRpbmcgZm91bmQhYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5tZGMuQ2hhcnRcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob0NoYXJ0OiBhbnkpIHtcblx0XHRcdHJldHVybiBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKG9DaGFydCk7XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9DaGFydDogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKG9DaGFydCwgb0NvbnRyb2xTdGF0ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIFRPRE86IHVuY29tbWVudCBhZnRlciBtZGMgZml4IGlzIG1lcmdlZFxuXHRcdC8qIHJldHJpZXZlOiBhc3luYyBmdW5jdGlvbiAoY2hhcnQ6IENoYXJ0KSB7XG5cdFx0XHRjb25zdCBjb250cm9sU3RhdGVLZXkgPSB0aGlzLmdldFN0YXRlS2V5KGNoYXJ0KTtcblx0XHRcdGNvbnN0IGNoYXJ0U3RhdGUgPSBhd2FpdCBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKGNoYXJ0KTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX2dldENvbnRyb2xTdGF0ZShjb250cm9sU3RhdGVLZXksIGNoYXJ0U3RhdGUpO1xuXHRcdH0sXG5cdFx0YXBwbHk6IGFzeW5jIGZ1bmN0aW9uIChjaGFydDogQ2hhcnQsIGNvbnRyb2xTdGF0ZTogQ29udHJvbFN0YXRlKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoY29udHJvbFN0YXRlKSB7XG5cdFx0XHRcdFx0Ly8gRXh0cmEgY29uZGl0aW9uIGFkZGVkIHRvIGFwcGx5IHRoZSBkaWZmIHN0YXRlIGxvZ2ljIGZvciBtZGMgY29udHJvbFxuXHRcdFx0XHRcdGlmIChjb250cm9sU3RhdGU/LmluaXRpYWxTdGF0ZSAmJiB0aGlzLmNvbnRyb2xzVmFyaWFudElkVW5hdmFpbGFibGUuaW5kZXhPZihjaGFydC5nZXRJZCgpKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGRpZmZTdGF0ZSA9IGF3YWl0IFN0YXRlVXRpbC5kaWZmU3RhdGUoXG5cdFx0XHRcdFx0XHRcdGNoYXJ0LFxuXHRcdFx0XHRcdFx0XHRjb250cm9sU3RhdGUuaW5pdGlhbFN0YXRlIGFzIG9iamVjdCxcblx0XHRcdFx0XHRcdFx0Y29udHJvbFN0YXRlLmZ1bGxTdGF0ZSBhcyBvYmplY3Rcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYXdhaXQgU3RhdGVVdGlsLmFwcGx5RXh0ZXJuYWxTdGF0ZShjaGFydCwgZGlmZlN0YXRlKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGF3YWl0IFN0YXRlVXRpbC5hcHBseUV4dGVybmFsU3RhdGUoY2hhcnQsIGNvbnRyb2xTdGF0ZT8uZnVsbFN0YXRlID8/IGNvbnRyb2xTdGF0ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9ICovXG5cdH0sXG5cdFwic2FwLnV4YXAuT2JqZWN0UGFnZUxheW91dFwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uIChvT1BMYXlvdXQ6IGFueSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2VsZWN0ZWRTZWN0aW9uOiBvT1BMYXlvdXQuZ2V0U2VsZWN0ZWRTZWN0aW9uKClcblx0XHRcdH07XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9PUExheW91dDogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlKSB7XG5cdFx0XHRcdG9PUExheW91dC5zZXRTZWxlY3RlZFNlY3Rpb24ob0NvbnRyb2xTdGF0ZS5zZWxlY3RlZFNlY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0cmVmcmVzaEJpbmRpbmc6IGZ1bmN0aW9uIChvT1BMYXlvdXQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb09QTGF5b3V0LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRjb25zdCBvQmluZGluZyA9IG9CaW5kaW5nQ29udGV4dCAmJiBvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0aWYgKG9CaW5kaW5nKSB7XG5cdFx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRjb25zdCBzU3RyYXRlZ3kgPSBLZWVwQWxpdmVIZWxwZXIuZ2V0Q29udHJvbFJlZnJlc2hTdHJhdGVneUZvckNvbnRleHRQYXRoKG9PUExheW91dCwgc01ldGFQYXRoKTtcblx0XHRcdFx0aWYgKHNTdHJhdGVneSA9PT0gXCJzZWxmXCIpIHtcblx0XHRcdFx0XHQvLyBSZWZyZXNoIG1haW4gY29udGV4dCBhbmQgMS0xIG5hdmlnYXRpb24gcHJvcGVydGllcyBvciBPUFxuXHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsTmF2UHJvcGVydHk+ID1cblx0XHRcdFx0XHRcdFx0KENvbW1vblV0aWxzLmdldENvbnRleHRQYXRoUHJvcGVydGllcyhvTWV0YU1vZGVsLCBzTWV0YVBhdGgsIHtcblx0XHRcdFx0XHRcdFx0XHQka2luZDogXCJOYXZpZ2F0aW9uUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0XHR9KSBhcyBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxOYXZQcm9wZXJ0eT4pIHx8IHt9LFxuXHRcdFx0XHRcdFx0YU5hdlByb3BlcnRpZXNUb1JlcXVlc3QgPSBPYmplY3Qua2V5cyhvTmF2aWdhdGlvblByb3BlcnRpZXMpLnJlZHVjZShmdW5jdGlvbiAoYVByZXY6IGFueVtdLCBzTmF2UHJvcDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvTmF2aWdhdGlvblByb3BlcnRpZXNbc05hdlByb3BdLiRpc0NvbGxlY3Rpb24gIT09IHRydWUpIHtcblx0XHRcdFx0XHRcdFx0XHRhUHJldi5wdXNoKHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHNOYXZQcm9wIH0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhUHJldjtcblx0XHRcdFx0XHRcdH0sIFtdKSxcblx0XHRcdFx0XHRcdGFQcm9wZXJ0aWVzID0gW3sgJFByb3BlcnR5UGF0aDogXCIqXCIgfV0sXG5cdFx0XHRcdFx0XHRzR3JvdXBJZCA9IG9CaW5kaW5nLmdldEdyb3VwSWQoKTtcblxuXHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoYVByb3BlcnRpZXMuY29uY2F0KGFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0KSwgc0dyb3VwSWQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNTdHJhdGVneSA9PT0gXCJpbmNsdWRpbmdEZXBlbmRlbnRzXCIpIHtcblx0XHRcdFx0XHQvLyBDb21wbGV0ZSByZWZyZXNoXG5cdFx0XHRcdFx0b0JpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRMb2cuaW5mbyhgT2JqZWN0UGFnZTogJHtvT1BMYXlvdXQuZ2V0SWQoKX0gd2FzIG5vdCByZWZyZXNoZWQuIE5vIGJpbmRpbmcgZm91bmQhYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC5mZS5tYWNyb3MudGFibGUuUXVpY2tGaWx0ZXJDb250YWluZXJcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1F1aWNrRmlsdGVyOiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNlbGVjdGVkS2V5OiBvUXVpY2tGaWx0ZXIuZ2V0U2VsZWN0b3JLZXkoKVxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbiAob1F1aWNrRmlsdGVyOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0aWYgKG9Db250cm9sU3RhdGUpIHtcblx0XHRcdFx0b1F1aWNrRmlsdGVyLnNldFNlbGVjdG9yS2V5KG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAubS5TZWdtZW50ZWRCdXR0b25cIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1NlZ21lbnRlZEJ1dHRvbjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1NlZ21lbnRlZEJ1dHRvbi5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvU2VnbWVudGVkQnV0dG9uOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0aWYgKG9Db250cm9sU3RhdGUpIHtcblx0XHRcdFx0b1NlZ21lbnRlZEJ1dHRvbi5zZXRTZWxlY3RlZEtleShvQ29udHJvbFN0YXRlLnNlbGVjdGVkS2V5KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdFwic2FwLm0uU2VsZWN0XCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9TZWxlY3Q6IGFueSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2VsZWN0ZWRLZXk6IG9TZWxlY3QuZ2V0U2VsZWN0ZWRLZXkoKVxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbiAob1NlbGVjdDogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlKSB7XG5cdFx0XHRcdG9TZWxlY3Quc2V0U2VsZWN0ZWRLZXkob0NvbnRyb2xTdGF0ZS5zZWxlY3RlZEtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC5mLkR5bmFtaWNQYWdlXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9EeW5hbWljUGFnZTogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRoZWFkZXJFeHBhbmRlZDogb0R5bmFtaWNQYWdlLmdldEhlYWRlckV4cGFuZGVkKClcblx0XHRcdH07XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9EeW5hbWljUGFnZTogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlKSB7XG5cdFx0XHRcdG9EeW5hbWljUGFnZS5zZXRIZWFkZXJFeHBhbmRlZChvQ29udHJvbFN0YXRlLmhlYWRlckV4cGFuZGVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdFwic2FwLnVpLmNvcmUubXZjLlZpZXdcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1ZpZXc6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRpZiAob0NvbnRyb2xsZXIgJiYgb0NvbnRyb2xsZXIudmlld1N0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udHJvbGxlci52aWV3U3RhdGUucmV0cmlldmVWaWV3U3RhdGUob0NvbnRyb2xsZXIudmlld1N0YXRlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB7fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbiAob1ZpZXc6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55LCBvTmF2UGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKTtcblx0XHRcdGlmIChvQ29udHJvbGxlciAmJiBvQ29udHJvbGxlci52aWV3U3RhdGUpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnZpZXdTdGF0ZS5hcHBseVZpZXdTdGF0ZShvQ29udHJvbFN0YXRlLCBvTmF2UGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZWZyZXNoQmluZGluZzogZnVuY3Rpb24gKG9WaWV3OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0aWYgKG9Db250cm9sbGVyICYmIG9Db250cm9sbGVyLnZpZXdTdGF0ZSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIudmlld1N0YXRlLnJlZnJlc2hWaWV3QmluZGluZ3MoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdFwic2FwLnVpLmNvcmUuQ29tcG9uZW50Q29udGFpbmVyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9Db21wb25lbnRDb250YWluZXI6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db21wb25lbnRDb250YWluZXIuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTtcblx0XHRcdGlmIChvQ29tcG9uZW50KSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJldHJpZXZlQ29udHJvbFN0YXRlKG9Db21wb25lbnQuZ2V0Um9vdENvbnRyb2woKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9Db21wb25lbnRDb250YWluZXI6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55LCBvTmF2UGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbXBvbmVudENvbnRhaW5lci5nZXRDb21wb25lbnRJbnN0YW5jZSgpO1xuXHRcdFx0aWYgKG9Db21wb25lbnQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlDb250cm9sU3RhdGUob0NvbXBvbmVudC5nZXRSb290Q29udHJvbCgpLCBvQ29udHJvbFN0YXRlLCBvTmF2UGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGZvciBzdGF0ZSBoYW5kbGluZ1xuICpcbiAqIElmIHlvdSBuZWVkIHRvIG1haW50YWluIGEgc3BlY2lmaWMgc3RhdGUgZm9yIHlvdXIgYXBwbGljYXRpb24sIHlvdSBjYW4gdXNlIHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbi5cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS44NS4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZVwiKVxuY2xhc3MgVmlld1N0YXRlIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyOiBudW1iZXI7XG5cblx0cHJpdmF0ZSBfcEluaXRpYWxTdGF0ZUFwcGxpZWQ6IFByb21pc2U8dW5rbm93bj47XG5cblx0cHJpdmF0ZSBfcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0aW5pdGlhbENvbnRyb2xTdGF0ZXNNYXBwZXI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cblx0Y29udHJvbHNWYXJpYW50SWRVbmF2YWlsYWJsZTogc3RyaW5nW10gPSBbXTtcblxuXHR2aWV3U3RhdGVDb250cm9sczogKE1hbmFnZWRPYmplY3QpW10gPSBbXTtcblxuXHQvKipcblx0ICogQ29uc3RydWN0b3IuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyID0gMDtcblx0XHR0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHR0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUgPSByZXNvbHZlO1xuXHRcdH0pO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHJlZnJlc2hWaWV3QmluZGluZ3MoKSB7XG5cdFx0Y29uc3QgYUNvbnRyb2xzID0gYXdhaXQgdGhpcy5jb2xsZWN0UmVzdWx0cyh0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0QmluZGluZ1JlZnJlc2hDb250cm9scyk7XG5cdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRhQ29udHJvbHNcblx0XHRcdC5maWx0ZXIoKG9Db250cm9sOiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpO1xuXHRcdFx0fSlcblx0XHRcdC5mb3JFYWNoKChvQ29udHJvbDogYW55KSA9PiB7XG5cdFx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4odGhpcy5yZWZyZXNoQ29udHJvbEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdFx0fSk7XG5cdFx0cmV0dXJuIG9Qcm9taXNlQ2hhaW47XG5cdH1cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGFkZCBhbGwgY29udHJvbHMgcmVsZXZhbnQgZm9yIHJlZnJlc2hpbmcgdG8gdGhlIHByb3ZpZGVkIGNvbnRyb2wgYXJyYXkuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBhQ29sbGVjdGVkQ29udHJvbHMgVGhlIGNvbGxlY3RlZCBjb250cm9sc1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FkYXB0QmluZGluZ1JlZnJlc2hDb250cm9sc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzKGFDb2xsZWN0ZWRDb250cm9sczogTWFuYWdlZE9iamVjdFtdKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHJlZnJlc2hDb250cm9sQmluZGluZyhvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3Qgb0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIgPSB0aGlzLmdldENvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIob0NvbnRyb2wpO1xuXHRcdGxldCBvUHJvbWlzZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKHR5cGVvZiBvQ29udHJvbFJlZnJlc2hCaW5kaW5nSGFuZGxlci5yZWZyZXNoQmluZGluZyAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRMb2cuaW5mbyhgcmVmcmVzaEJpbmRpbmcgaGFuZGxlciBmb3IgY29udHJvbDogJHtvQ29udHJvbC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKX0gaXMgbm90IHByb3ZpZGVkYCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4ob0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIucmVmcmVzaEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2VDaGFpbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgbWFwIG9mIDxjb2RlPnJlZnJlc2hCaW5kaW5nPC9jb2RlPiBmdW5jdGlvbiBmb3IgYSBjZXJ0YWluIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdH0gb0NvbnRyb2wgVGhlIGNvbnRyb2wgdG8gZ2V0IHN0YXRlIGhhbmRsZXIgZm9yXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEEgcGxhaW4gb2JqZWN0IHdpdGggb25lIGZ1bmN0aW9uOiA8Y29kZT5yZWZyZXNoQmluZGluZzwvY29kZT5cblx0ICovXG5cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRDb250cm9sUmVmcmVzaEJpbmRpbmdIYW5kbGVyKG9Db250cm9sOiBhbnkpOiBhbnkge1xuXHRcdGNvbnN0IG9SZWZyZXNoQmluZGluZ0hhbmRsZXI6IGFueSA9IHt9O1xuXHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0Zm9yIChjb25zdCBzVHlwZSBpbiBfbUNvbnRyb2xTdGF0ZUhhbmRsZXJNYXApIHtcblx0XHRcdFx0aWYgKG9Db250cm9sLmlzQShzVHlwZSkpIHtcblx0XHRcdFx0XHQvLyBwYXNzIG9ubHkgdGhlIHJlZnJlc2hCaW5kaW5nIGhhbmRsZXIgaW4gYW4gb2JqZWN0IHNvIHRoYXQgOlxuXHRcdFx0XHRcdC8vIDEuIEFwcGxpY2F0aW9uIGhhcyBhY2Nlc3Mgb25seSB0byByZWZyZXNoQmluZGluZyBhbmQgbm90IGFwcGx5IGFuZCByZXRlcml2ZSBhdCB0aGlzIHN0YWdlXG5cdFx0XHRcdFx0Ly8gMi4gQXBwbGljYXRpb24gbW9kaWZpY2F0aW9ucyB0byB0aGUgb2JqZWN0IHdpbGwgYmUgcmVmbGVjdGVkIGhlcmUgKGFzIHdlIHBhc3MgYnkgcmVmZXJlbmNlKVxuXHRcdFx0XHRcdG9SZWZyZXNoQmluZGluZ0hhbmRsZXJbXCJyZWZyZXNoQmluZGluZ1wiXSA9IF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcFtzVHlwZV0ucmVmcmVzaEJpbmRpbmcgfHwge307XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5iYXNlLnZpZXdTdGF0ZS5hZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlcihvQ29udHJvbCwgb1JlZnJlc2hCaW5kaW5nSGFuZGxlcik7XG5cdFx0cmV0dXJuIG9SZWZyZXNoQmluZGluZ0hhbmRsZXI7XG5cdH1cblx0LyoqXG5cdCAqIEN1c3RvbWl6ZSB0aGUgPGNvZGU+cmVmcmVzaEJpbmRpbmc8L2NvZGU+IGZ1bmN0aW9uIGZvciBhIGNlcnRhaW4gY29udHJvbC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIG9Db250cm9sIFRoZSBjb250cm9sIGZvciB3aGljaCB0aGUgcmVmcmVzaCBoYW5kbGVyIGlzIGFkYXB0ZWQuXG5cdCAqIEBwYXJhbSBvQ29udHJvbEhhbmRsZXIgQSBwbGFpbiBvYmplY3Qgd2hpY2ggY2FuIGhhdmUgb25lIGZ1bmN0aW9uOiA8Y29kZT5yZWZyZXNoQmluZGluZzwvY29kZT5cblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlclxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0YWRhcHRCaW5kaW5nUmVmcmVzaEhhbmRsZXIob0NvbnRyb2w6IE1hbmFnZWRPYmplY3QsIG9Db250cm9sSGFuZGxlcjogYW55W10pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgc3VzcGVuZGVkIGR1ZSB0byBrZWVwLWFsaXZlIG1vZGUuXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjb25TdXNwZW5kXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25TdXNwZW5kKCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyByZXN0b3JlZCBkdWUgdG8ga2VlcC1hbGl2ZSBtb2RlLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uUmVzdG9yZVxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUmVzdG9yZSgpIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBEZXN0cnVjdG9yIG1ldGhvZCBmb3Igb2JqZWN0cy5cblx0ICovXG5cdGRlc3Ryb3koKSB7XG5cdFx0ZGVsZXRlIHRoaXMuX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZTtcblx0XHRzdXBlci5kZXN0cm95KCk7XG5cdH1cblxuXHQvKipcblx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIGVuYWJsZSBtdWx0aSBvdmVycmlkZS4gSXQgaXMgYWRkaW5nIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIChhcnJheSkgdG8gdGhlIHByb3ZpZGVkXG5cdCAqIGZ1bmN0aW9uIChhbmQgaXRzIHBhcmFtZXRlcnMpLCB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIHZpYSA8Y29kZT5Qcm9taXNlLmFsbDwvY29kZT4uXG5cdCAqXG5cdCAqIEBwYXJhbSBmbkNhbGwgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gYXJnc1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IG9mIGFsbCBvdmVycmlkZXNcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Y29sbGVjdFJlc3VsdHMoZm5DYWxsOiBGdW5jdGlvbiwgLi4uYXJnczogYW55W10pIHtcblx0XHRjb25zdCBhUmVzdWx0czogYW55W10gPSBbXTtcblx0XHRhcmdzLnB1c2goYVJlc3VsdHMpO1xuXHRcdGZuQ2FsbC5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVJlc3VsdHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEN1c3RvbWl6ZSB0aGUgPGNvZGU+cmV0cmlldmU8L2NvZGU+IGFuZCA8Y29kZT5hcHBseTwvY29kZT4gZnVuY3Rpb25zIGZvciBhIGNlcnRhaW4gY29udHJvbC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIG9Db250cm9sIFRoZSBjb250cm9sIHRvIGdldCBzdGF0ZSBoYW5kbGVyIGZvclxuXHQgKiBAcGFyYW0gYUNvbnRyb2xIYW5kbGVyIEEgbGlzdCBvZiBwbGFpbiBvYmplY3RzIHdpdGggdHdvIGZ1bmN0aW9uczogPGNvZGU+cmV0cmlldmU8L2NvZGU+IGFuZCA8Y29kZT5hcHBseTwvY29kZT5cblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhZGFwdENvbnRyb2xTdGF0ZUhhbmRsZXJcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFkYXB0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbDogTWFuYWdlZE9iamVjdCwgYUNvbnRyb2xIYW5kbGVyOiBvYmplY3RbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG1hcCBvZiA8Y29kZT5yZXRyaWV2ZTwvY29kZT4gYW5kIDxjb2RlPmFwcGx5PC9jb2RlPiBmdW5jdGlvbnMgZm9yIGEgY2VydGFpbiBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRyb2wgVGhlIGNvbnRyb2wgdG8gZ2V0IHN0YXRlIGhhbmRsZXIgZm9yXG5cdCAqIEByZXR1cm5zIEEgcGxhaW4gb2JqZWN0IHdpdGggdHdvIGZ1bmN0aW9uczogPGNvZGU+cmV0cmlldmU8L2NvZGU+IGFuZCA8Y29kZT5hcHBseTwvY29kZT5cblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3QgYUludGVybmFsQ29udHJvbFN0YXRlSGFuZGxlciA9IFtdLFxuXHRcdFx0YUN1c3RvbUNvbnRyb2xTdGF0ZUhhbmRsZXI6IGFueVtdID0gW107XG5cdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNUeXBlIGluIF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcCkge1xuXHRcdFx0XHRpZiAob0NvbnRyb2wuaXNBKHNUeXBlKSkge1xuXHRcdFx0XHRcdC8vIGF2b2lkIGRpcmVjdCBtYW5pcHVsYXRpb24gb2YgaW50ZXJuYWwgX21Db250cm9sU3RhdGVIYW5kbGVyTWFwXG5cdFx0XHRcdFx0YUludGVybmFsQ29udHJvbFN0YXRlSGFuZGxlci5wdXNoKE9iamVjdC5hc3NpZ24oe30sIF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcFtzVHlwZV0pKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbCwgYUN1c3RvbUNvbnRyb2xTdGF0ZUhhbmRsZXIpO1xuXHRcdHJldHVybiBhSW50ZXJuYWxDb250cm9sU3RhdGVIYW5kbGVyLmNvbmNhdChhQ3VzdG9tQ29udHJvbFN0YXRlSGFuZGxlcik7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYWRkIGFsbCBjb250cm9scyBmb3IgZ2l2ZW4gdmlldyB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciB0aGUgc3RhdGUgaGFuZGxpbmcgdG8gdGhlIHByb3ZpZGVkIGNvbnRyb2wgYXJyYXkuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBhQ29sbGVjdGVkQ29udHJvbHMgVGhlIGNvbGxlY3RlZCBjb250cm9sc1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FkYXB0U3RhdGVDb250cm9sc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0YWRhcHRTdGF0ZUNvbnRyb2xzKGFDb2xsZWN0ZWRDb250cm9sczogTWFuYWdlZE9iamVjdFtdKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWRcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBrZXkgdG8gYmUgdXNlZCBmb3IgZ2l2ZW4gY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250cm9sIFRoZSBjb250cm9sIHRvIGdldCBzdGF0ZSBrZXkgZm9yXG5cdCAqIEByZXR1cm5zIFRoZSBrZXkgdG8gYmUgdXNlZCBmb3Igc3RvcmluZyB0aGUgY29udHJvbHMgc3RhdGVcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRTdGF0ZUtleShvQ29udHJvbDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldExvY2FsSWQob0NvbnRyb2wuZ2V0SWQoKSkgfHwgb0NvbnRyb2wuZ2V0SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgdmlldyBzdGF0ZSBvZiB0aGlzIGV4dGVuc2lvbnMgdmlldy5cblx0ICogV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBiZWZvcmUgZmluaXNoaW5nLCBhbGwgYnV0IHRoZSBmaW5hbCByZXNwb25zZSB3aWxsIHJlc29sdmUgdG8gPGNvZGU+dW5kZWZpbmVkPC9jb2RlPi5cblx0ICpcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmluZyB0aGUgdmlldyBzdGF0ZVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI3JldHJpZXZlVmlld1N0YXRlXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyByZXRyaWV2ZVZpZXdTdGF0ZSgpIHtcblx0XHQrK3RoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyO1xuXHRcdGxldCBvVmlld1N0YXRlOiBhbnk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWQ7XG5cdFx0XHRjb25zdCBhQ29udHJvbHM6IChNYW5hZ2VkT2JqZWN0IHwgdW5kZWZpbmVkKVtdID0gYXdhaXQgdGhpcy5jb2xsZWN0UmVzdWx0cyh0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0U3RhdGVDb250cm9scyk7XG5cdFx0XHRjb25zdCBhUmVzb2x2ZWRTdGF0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdFx0YUNvbnRyb2xzXG5cdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob0NvbnRyb2w6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0Lm1hcCgob0NvbnRyb2w6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMucmV0cmlldmVDb250cm9sU3RhdGUob0NvbnRyb2wpLnRoZW4oKHZSZXN1bHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdGtleTogdGhpcy5nZXRTdGF0ZUtleShvQ29udHJvbCksXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHZSZXN1bHRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdFx0b1ZpZXdTdGF0ZSA9IGFSZXNvbHZlZFN0YXRlcy5yZWR1Y2UoZnVuY3Rpb24gKG9TdGF0ZXM6IGFueSwgbVN0YXRlOiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb0N1cnJlbnRTdGF0ZTogYW55ID0ge307XG5cdFx0XHRcdG9DdXJyZW50U3RhdGVbbVN0YXRlLmtleV0gPSBtU3RhdGUudmFsdWU7XG5cdFx0XHRcdHJldHVybiBtZXJnZU9iamVjdHMob1N0YXRlcywgb0N1cnJlbnRTdGF0ZSk7XG5cdFx0XHR9LCB7fSk7XG5cdFx0XHRjb25zdCBtQWRkaXRpb25hbFN0YXRlcyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZSh0aGlzLl9yZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXMoKSk7XG5cdFx0XHRpZiAobUFkZGl0aW9uYWxTdGF0ZXMgJiYgT2JqZWN0LmtleXMobUFkZGl0aW9uYWxTdGF0ZXMpLmxlbmd0aCkge1xuXHRcdFx0XHRvVmlld1N0YXRlW0FERElUSU9OQUxfU1RBVEVTX0tFWV0gPSBtQWRkaXRpb25hbFN0YXRlcztcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0LS10aGlzLl9pUmV0cmlldmluZ1N0YXRlQ291bnRlcjtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5faVJldHJpZXZpbmdTdGF0ZUNvdW50ZXIgPT09IDAgPyBvVmlld1N0YXRlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4dGVuZCB0aGUgbWFwIG9mIGFkZGl0aW9uYWwgc3RhdGVzIChub3QgY29udHJvbCBib3VuZCkgdG8gYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgdmlldyBzdGF0ZSBvZiB0aGUgZ2l2ZW4gdmlldy5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIG1BZGRpdGlvbmFsU3RhdGVzIFRoZSBhZGRpdGlvbmFsIHN0YXRlXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjcmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRyZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXMobUFkZGl0aW9uYWxTdGF0ZXM6IG9iamVjdCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG1hcCBvZiBhZGRpdGlvbmFsIHN0YXRlcyAobm90IGNvbnRyb2wgYm91bmQpIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUgb2YgdGhlIGdpdmVuIHZpZXcuXG5cdCAqXG5cdCAqIEByZXR1cm5zIEFkZGl0aW9uYWwgdmlldyBzdGF0ZXNcblx0ICovXG5cdF9yZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXMoKSB7XG5cdFx0Y29uc3QgbUFkZGl0aW9uYWxTdGF0ZXMgPSB7fTtcblx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLnJldHJpZXZlQWRkaXRpb25hbFN0YXRlcyhtQWRkaXRpb25hbFN0YXRlcyk7XG5cdFx0cmV0dXJuIG1BZGRpdGlvbmFsU3RhdGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIHRoZSBnaXZlbiBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRyb2wgVGhlIG9iamVjdCB0byBnZXQgdGhlIHN0YXRlIGZvclxuXHQgKiBAcmV0dXJucyBUaGUgc3RhdGUgZm9yIHRoZSBnaXZlbiBjb250cm9sXG5cdCAqL1xuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHJldHJpZXZlQ29udHJvbFN0YXRlKG9Db250cm9sOiBhbnkpIHtcblx0XHRjb25zdCBhQ29udHJvbFN0YXRlSGFuZGxlcnMgPSB0aGlzLmdldENvbnRyb2xTdGF0ZUhhbmRsZXIob0NvbnRyb2wpO1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdGFDb250cm9sU3RhdGVIYW5kbGVycy5tYXAoKG1Db250cm9sU3RhdGVIYW5kbGVyOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHR5cGVvZiBtQ29udHJvbFN0YXRlSGFuZGxlci5yZXRyaWV2ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBjb250cm9sU3RhdGVIYW5kbGVyLnJldHJpZXZlIGlzIG5vdCBhIGZ1bmN0aW9uIGZvciBjb250cm9sOiAke29Db250cm9sLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpfWApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtQ29udHJvbFN0YXRlSGFuZGxlci5yZXRyaWV2ZS5jYWxsKHRoaXMsIG9Db250cm9sKTtcblx0XHRcdH0pXG5cdFx0KS50aGVuKChhU3RhdGVzOiBhbnlbXSkgPT4ge1xuXHRcdFx0cmV0dXJuIGFTdGF0ZXMucmVkdWNlKGZ1bmN0aW9uIChvRmluYWxTdGF0ZTogYW55LCBvQ3VycmVudFN0YXRlOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG1lcmdlT2JqZWN0cyhvRmluYWxTdGF0ZSwgb0N1cnJlbnRTdGF0ZSk7XG5cdFx0XHR9LCB7fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSB2aWV3IHN0YXRlIHNob3VsZCBvbmx5IGJlIGFwcGxpZWQgb25jZSBpbml0aWFsbHkuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkfS5cblx0ICpcblx0ICogSW1wb3J0YW50OlxuXHQgKiBZb3Ugc2hvdWxkIG9ubHkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGN1c3RvbSBwYWdlcyBhbmQgbm90IGZvciB0aGUgc3RhbmRhcmQgTGlzdFJlcG9ydFBhZ2UgYW5kIE9iamVjdFBhZ2UhXG5cdCAqXG5cdCAqIEByZXR1cm5zIElmIDxjb2RlPnRydWU8L2NvZGU+LCBvbmx5IHRoZSBpbml0aWFsIHZpZXcgc3RhdGUgaXMgYXBwbGllZCBvbmNlLFxuXHQgKiBlbHNlIGFueSBuZXcgdmlldyBzdGF0ZSBpcyBhbHNvIGFwcGxpZWQgb24gZm9sbG93LXVwIGNhbGxzIChkZWZhdWx0KVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FwcGx5SW5pdGlhbFN0YXRlT25seVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZClcblx0YXBwbHlJbml0aWFsU3RhdGVPbmx5KCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGxpZXMgdGhlIGdpdmVuIHZpZXcgc3RhdGUgdG8gdGhpcyBleHRlbnNpb25zIHZpZXcuXG5cdCAqXG5cdCAqIEBwYXJhbSBvVmlld1N0YXRlIFRoZSB2aWV3IHN0YXRlIHRvIGFwcGx5IChjYW4gYmUgdW5kZWZpbmVkKVxuXHQgKiBAcGFyYW0gb05hdlBhcmFtZXRlciBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gb05hdlBhcmFtZXRlci5uYXZpZ2F0aW9uVHlwZSBUaGUgYWN0dWFsIG5hdmlnYXRpb24gdHlwZVxuXHQgKiBAcGFyYW0gb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50IFRoZSBzZWxlY3Rpb25WYXJpYW50IGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIG9OYXZQYXJhbWV0ZXIuc2VsZWN0aW9uVmFyaWFudERlZmF1bHRzIFRoZSBzZWxlY3Rpb25WYXJpYW50IGRlZmF1bHRzIGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIG9OYXZQYXJhbWV0ZXIucmVxdWlyZXNTdGFuZGFyZFZhcmlhbnQgRGVmaW5lcyB3aGV0aGVyIHRoZSBzdGFuZGFyZCB2YXJpYW50IG11c3QgYmUgdXNlZCBpbiB2YXJpYW50IG1hbmFnZW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSBmb3IgYXN5bmMgc3RhdGUgaGFuZGxpbmdcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseVZpZXdTdGF0ZVxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgYXBwbHlWaWV3U3RhdGUob1ZpZXdTdGF0ZTogYW55LCBvTmF2UGFyYW1ldGVyOiBOYXZpZ2F0aW9uUGFyYW1ldGVyKTogUHJvbWlzZTxhbnk+IHtcblx0XHRpZiAodGhpcy5iYXNlLnZpZXdTdGF0ZS5hcHBseUluaXRpYWxTdGF0ZU9ubHkoKSAmJiB0aGlzLl9nZXRJbml0aWFsU3RhdGVBcHBsaWVkKCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5jb2xsZWN0UmVzdWx0cyh0aGlzLmJhc2Uudmlld1N0YXRlLm9uQmVmb3JlU3RhdGVBcHBsaWVkKTtcblx0XHRcdGNvbnN0IGFDb250cm9sczogTWFuYWdlZE9iamVjdFtdID0gYXdhaXQgdGhpcy5jb2xsZWN0UmVzdWx0cyh0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0U3RhdGVDb250cm9scyk7XG5cdFx0XHR0aGlzLnZpZXdTdGF0ZUNvbnRyb2xzID0gYUNvbnRyb2xzO1xuXHRcdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdGxldCBoYXNWYXJpYW50TWFuYWdlbWVudCA9IGZhbHNlO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiB0aGlzIGVuc3VyZXMgdGhhdCB2YXJpYW50TWFuYWdlbWVudCBjb250cm9sIGlzIGFwcGxpZWQgZmlyc3QgdG8gY2FsY3VsYXRlIGluaXRpYWwgc3RhdGUgZm9yIGRlbHRhIGxvZ2ljXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IHNvcnRlZEFkYXB0U3RhdGVDb250cm9scyA9IGFDb250cm9scy5yZWR1Y2UoKG1vZGlmaWVkQ29udHJvbHM6IE1hbmFnZWRPYmplY3RbXSwgY29udHJvbCkgPT4ge1xuXHRcdFx0XHRpZiAoIWNvbnRyb2wpIHtcblx0XHRcdFx0XHRyZXR1cm4gbW9kaWZpZWRDb250cm9scztcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBpc1ZhcmlhbnRNYW5hZ2VtZW50Q29udHJvbCA9IGNvbnRyb2wuaXNBKFwic2FwLnVpLmZsLnZhcmlhbnRzLlZhcmlhbnRNYW5hZ2VtZW50XCIpO1xuXHRcdFx0XHRpZiAoIWhhc1ZhcmlhbnRNYW5hZ2VtZW50KSB7XG5cdFx0XHRcdFx0aGFzVmFyaWFudE1hbmFnZW1lbnQgPSBpc1ZhcmlhbnRNYW5hZ2VtZW50Q29udHJvbDtcblx0XHRcdFx0fVxuXHRcdFx0XHRtb2RpZmllZENvbnRyb2xzID0gaXNWYXJpYW50TWFuYWdlbWVudENvbnRyb2wgPyBbY29udHJvbCwgLi4ubW9kaWZpZWRDb250cm9sc10gOiBbLi4ubW9kaWZpZWRDb250cm9scywgY29udHJvbF07XG5cdFx0XHRcdHJldHVybiBtb2RpZmllZENvbnRyb2xzO1xuXHRcdFx0fSwgW10pO1xuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIG5vIFZhcmlhbnQgTWFuYWdlbWVudCwgdGhpcyBlbnN1cmVzIHRoYXQgaW5pdGlhbCBzdGF0ZXMgaXMgc2V0XG5cdFx0XHRpZiAoIWhhc1ZhcmlhbnRNYW5hZ2VtZW50KSB7XG5cdFx0XHRcdHRoaXMuX3NldEluaXRpYWxTdGF0ZXNGb3JEZWx0YUNvbXB1dGUoKTtcblx0XHRcdH1cblxuXHRcdFx0c29ydGVkQWRhcHRTdGF0ZUNvbnRyb2xzXG5cdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9Db250cm9sKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sLmlzQShcInNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3RcIik7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5mb3JFYWNoKChvQ29udHJvbCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHNLZXkgPSB0aGlzLmdldFN0YXRlS2V5KG9Db250cm9sKTtcblx0XHRcdFx0XHRvUHJvbWlzZUNoYWluID0gb1Byb21pc2VDaGFpbi50aGVuKFxuXHRcdFx0XHRcdFx0dGhpcy5hcHBseUNvbnRyb2xTdGF0ZS5iaW5kKHRoaXMsIG9Db250cm9sLCBvVmlld1N0YXRlID8gb1ZpZXdTdGF0ZVtzS2V5XSA6IHVuZGVmaW5lZCwgb05hdlBhcmFtZXRlcilcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0YXdhaXQgb1Byb21pc2VDaGFpbjtcblx0XHRcdGlmIChvTmF2UGFyYW1ldGVyLm5hdmlnYXRpb25UeXBlID09PSBOYXZUeXBlLmlBcHBTdGF0ZSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmNvbGxlY3RSZXN1bHRzKFxuXHRcdFx0XHRcdHRoaXMuYmFzZS52aWV3U3RhdGUuYXBwbHlBZGRpdGlvbmFsU3RhdGVzLFxuXHRcdFx0XHRcdG9WaWV3U3RhdGUgPyBvVmlld1N0YXRlW0FERElUSU9OQUxfU1RBVEVTX0tFWV0gOiB1bmRlZmluZWRcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuY29sbGVjdFJlc3VsdHModGhpcy5iYXNlLnZpZXdTdGF0ZS5hcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzLCBvTmF2UGFyYW1ldGVyKTtcblx0XHRcdFx0YXdhaXQgdGhpcy5jb2xsZWN0UmVzdWx0cyh0aGlzLmJhc2Uudmlld1N0YXRlLl9hcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzVG9GaWx0ZXJiYXIsIG9OYXZQYXJhbWV0ZXIpO1xuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUub25BZnRlclN0YXRlQXBwbGllZCk7XG5cdFx0XHRcdHRoaXMuX3NldEluaXRpYWxTdGF0ZUFwcGxpZWQoKTtcblx0XHRcdH0gY2F0Y2ggKGU6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRfY2hlY2tJZlZhcmlhbnRJZElzQXZhaWxhYmxlKG9WTTogYW55LCBzVmFyaWFudElkOiBhbnkpIHtcblx0XHRjb25zdCBhVmFyaWFudHMgPSBvVk0uZ2V0VmFyaWFudHMoKTtcblx0XHRsZXQgYklzQ29udHJvbFN0YXRlVmFyaWFudEF2YWlsYWJsZSA9IGZhbHNlO1xuXHRcdGFWYXJpYW50cy5mb3JFYWNoKGZ1bmN0aW9uIChvVmFyaWFudDogYW55KSB7XG5cdFx0XHRpZiAob1ZhcmlhbnQua2V5ID09PSBzVmFyaWFudElkKSB7XG5cdFx0XHRcdGJJc0NvbnRyb2xTdGF0ZVZhcmlhbnRBdmFpbGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBiSXNDb250cm9sU3RhdGVWYXJpYW50QXZhaWxhYmxlO1xuXHR9XG5cblx0X3NldEluaXRpYWxTdGF0ZUFwcGxpZWQoKSB7XG5cdFx0aWYgKHRoaXMuX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZSkge1xuXHRcdFx0Y29uc3QgcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlID0gdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHRcdFx0ZGVsZXRlIHRoaXMuX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZTtcblx0XHRcdHBJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXHRfZ2V0SW5pdGlhbFN0YXRlQXBwbGllZCgpIHtcblx0XHRyZXR1cm4gIXRoaXMuX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIb29rIHRvIHJlYWN0IGJlZm9yZSBhIHN0YXRlIGZvciBnaXZlbiB2aWV3IGlzIGFwcGxpZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uQmVmb3JlU3RhdGVBcHBsaWVkXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZVN0YXRlQXBwbGllZChhUHJvbWlzZXM6IFByb21pc2U8YW55Pikge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgdG8gcmVhY3Qgd2hlbiBzdGF0ZSBmb3IgZ2l2ZW4gdmlldyB3YXMgYXBwbGllZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIGFQcm9taXNlcyBFeHRlbnNpYmxlIGFycmF5IG9mIHByb21pc2VzIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjb25BZnRlclN0YXRlQXBwbGllZFxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25BZnRlclN0YXRlQXBwbGllZChhUHJvbWlzZXM6IFByb21pc2U8YW55Pikge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGx5aW5nIGFkZGl0aW9uYWwsIG5vdCBjb250cm9sIHJlbGF0ZWQsIHN0YXRlcyAtIGlzIGNhbGxlZCBvbmx5IGlmIG5hdmlnYXRpb24gdHlwZSBpcyBpQXBwU3RhdGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvVmlld1N0YXRlIFRoZSBjdXJyZW50IHZpZXcgc3RhdGVcblx0ICogQHBhcmFtIGFQcm9taXNlcyBFeHRlbnNpYmxlIGFycmF5IG9mIHByb21pc2VzIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYXBwbHlBZGRpdGlvbmFsU3RhdGVzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRhcHBseUFkZGl0aW9uYWxTdGF0ZXMob1ZpZXdTdGF0ZTogb2JqZWN0LCBhUHJvbWlzZXM6IFByb21pc2U8YW55Pikge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdF9hcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzVG9GaWx0ZXJiYXIoXG5cdFx0X29OYXZQYXJhbWV0ZXI6IHtcblx0XHRcdG5hdmlnYXRpb25UeXBlOiBhbnk7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50Pzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudERlZmF1bHRzPzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0cmVxdWlyZXNTdGFuZGFyZFZhcmlhbnQ/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdH0sXG5cdFx0X2FQcm9taXNlczogUHJvbWlzZTxhbnk+XG5cdCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogQXBwbHkgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGlzIG5vdCBjYWxsZWQgaWYgdGhlIG5hdmlnYXRpb24gdHlwZSBpcyBpQXBwU3RhdGVcblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIG9OYXZQYXJhbWV0ZXIgVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIG9OYXZQYXJhbWV0ZXIubmF2aWdhdGlvblR5cGUgVGhlIGFjdHVhbCBuYXZpZ2F0aW9uIHR5cGVcblx0ICogQHBhcmFtIFtvTmF2UGFyYW1ldGVyLnNlbGVjdGlvblZhcmlhbnRdIFRoZSBzZWxlY3Rpb25WYXJpYW50IGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIFtvTmF2UGFyYW1ldGVyLnNlbGVjdGlvblZhcmlhbnREZWZhdWx0c10gVGhlIHNlbGVjdGlvblZhcmlhbnQgZGVmYXVsdHMgZnJvbSB0aGUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gW29OYXZQYXJhbWV0ZXIucmVxdWlyZXNTdGFuZGFyZFZhcmlhbnRdIERlZmluZXMgd2hldGhlciB0aGUgc3RhbmRhcmQgdmFyaWFudCBtdXN0IGJlIHVzZWQgaW4gdmFyaWFudCBtYW5hZ2VtZW50XG5cdCAqIEBwYXJhbSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FwcGx5TmF2aWdhdGlvblBhcmFtZXRlcnNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzKFxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0XHRvTmF2UGFyYW1ldGVyOiB7XG5cdFx0XHRuYXZpZ2F0aW9uVHlwZTogYW55O1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudD86IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnREZWZhdWx0cz86IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHRcdHJlcXVpcmVzU3RhbmRhcmRWYXJpYW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0XHR9LFxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0XHRhUHJvbWlzZXM6IFByb21pc2U8YW55PlxuXHQpIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuIGlmIG5lZWRlZFxuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGx5aW5nIHRoZSBnaXZlbiBzdGF0ZSB0byB0aGUgZ2l2ZW4gY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250cm9sIFRoZSBvYmplY3QgdG8gYXBwbHkgdGhlIGdpdmVuIHN0YXRlXG5cdCAqIEBwYXJhbSBvQ29udHJvbFN0YXRlIFRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIGNvbnRyb2xcblx0ICogQHBhcmFtIFtvTmF2UGFyYW1ldGVyc10gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFJldHVybiBhIHByb21pc2UgZm9yIGFzeW5jIHN0YXRlIGhhbmRsaW5nXG5cdCAqL1xuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFwcGx5Q29udHJvbFN0YXRlKG9Db250cm9sOiBhbnksIG9Db250cm9sU3RhdGU6IG9iamVjdCwgb05hdlBhcmFtZXRlcnM/OiBvYmplY3QpIHtcblx0XHRjb25zdCBhQ29udHJvbFN0YXRlSGFuZGxlcnMgPSB0aGlzLmdldENvbnRyb2xTdGF0ZUhhbmRsZXIob0NvbnRyb2wpO1xuXHRcdGxldCBvUHJvbWlzZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0YUNvbnRyb2xTdGF0ZUhhbmRsZXJzLmZvckVhY2goKG1Db250cm9sU3RhdGVIYW5kbGVyOiBhbnkpID0+IHtcblx0XHRcdGlmICh0eXBlb2YgbUNvbnRyb2xTdGF0ZUhhbmRsZXIuYXBwbHkgIT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYGNvbnRyb2xTdGF0ZUhhbmRsZXIuYXBwbHkgaXMgbm90IGEgZnVuY3Rpb24gZm9yIGNvbnRyb2w6ICR7b0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCl9YCk7XG5cdFx0XHR9XG5cdFx0XHRvUHJvbWlzZUNoYWluID0gb1Byb21pc2VDaGFpbi50aGVuKG1Db250cm9sU3RhdGVIYW5kbGVyLmFwcGx5LmJpbmQodGhpcywgb0NvbnRyb2wsIG9Db250cm9sU3RhdGUsIG9OYXZQYXJhbWV0ZXJzKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG9Qcm9taXNlQ2hhaW47XG5cdH1cblx0Z2V0SW50ZXJmYWNlKCkge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8vIG1ldGhvZCB0byBnZXQgdGhlIGNvbnRyb2wgc3RhdGUgZm9yIG1kYyBjb250cm9scyBhcHBseWluZyB0aGUgZGVsdGEgbG9naWNcblx0X2dldENvbnRyb2xTdGF0ZShjb250cm9sU3RhdGVLZXk6IHN0cmluZywgY29udHJvbFN0YXRlOiBDb250cm9sU3RhdGUpIHtcblx0XHRjb25zdCBpbml0aWFsQ29udHJvbFN0YXRlc01hcHBlciA9IHRoaXMuaW5pdGlhbENvbnRyb2xTdGF0ZXNNYXBwZXI7XG5cdFx0aWYgKE9iamVjdC5rZXlzKGluaXRpYWxDb250cm9sU3RhdGVzTWFwcGVyKS5sZW5ndGggPiAwICYmIGluaXRpYWxDb250cm9sU3RhdGVzTWFwcGVyW2NvbnRyb2xTdGF0ZUtleV0pIHtcblx0XHRcdGlmIChPYmplY3Qua2V5cyhpbml0aWFsQ29udHJvbFN0YXRlc01hcHBlcltjb250cm9sU3RhdGVLZXldIGFzIG9iamVjdCkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGluaXRpYWxDb250cm9sU3RhdGVzTWFwcGVyW2NvbnRyb2xTdGF0ZUtleV0gPSB7IC4uLmNvbnRyb2xTdGF0ZSB9O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHsgZnVsbFN0YXRlOiBjb250cm9sU3RhdGUsIGluaXRpYWxTdGF0ZTogaW5pdGlhbENvbnRyb2xTdGF0ZXNNYXBwZXJbY29udHJvbFN0YXRlS2V5XSB9O1xuXHRcdH1cblx0XHRyZXR1cm4gY29udHJvbFN0YXRlO1xuXHR9XG5cblx0Ly9tZXRob2QgdG8gc3RvcmUgdGhlIGluaXRpYWwgc3RhdGVzIGZvciBkZWx0YSBjb21wdXRhdGlvbiBvZiBtZGMgY29udHJvbHNcblx0X3NldEluaXRpYWxTdGF0ZXNGb3JEZWx0YUNvbXB1dGUgPSBhc3luYyAodmFyaWFudE1hbmFnZW1lbnQ/OiBWYXJpYW50TWFuYWdlbWVudCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBhZGFwdENvbnRyb2xzID0gdGhpcy52aWV3U3RhdGVDb250cm9scztcblxuXHRcdFx0Y29uc3QgZXh0ZXJuYWxTdGF0ZVByb21pc2VzOiBQcm9taXNlPG9iamVjdD5bXSA9IFtdO1xuXHRcdFx0Y29uc3QgY29udHJvbFN0YXRlS2V5OiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0bGV0IGluaXRpYWxDb250cm9sU3RhdGVzOiBvYmplY3RbXSA9IFtdO1xuXHRcdFx0Y29uc3QgdmFyaWFudENvbnRyb2xzOiBzdHJpbmdbXSA9IHZhcmlhbnRNYW5hZ2VtZW50Py5nZXRGb3IoKSA/PyBbXTtcblxuXHRcdFx0YWRhcHRDb250cm9sc1xuXHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChjb250cm9sKSB7XG5cdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdGNvbnRyb2wgJiZcblx0XHRcdFx0XHRcdCghdmFyaWFudE1hbmFnZW1lbnQgfHwgdmFyaWFudENvbnRyb2xzLmluZGV4T2YoY29udHJvbC5nZXRJZCgpKSA+IC0xKSAmJlxuXHRcdFx0XHRcdFx0KGNvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSB8fFxuXHRcdFx0XHRcdFx0XHQoY29udHJvbCBhcyBCYXNlT2JqZWN0KS5pc0EoXCJzYXAudWkubWRjLkZpbHRlckJhclwiKSB8fFxuXHRcdFx0XHRcdFx0XHQoY29udHJvbCBhcyBCYXNlT2JqZWN0KS5pc0EoXCJzYXAudWkubWRjLkNoYXJ0XCIpKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5mb3JFYWNoKChjb250cm9sKSA9PiB7XG5cdFx0XHRcdFx0aWYgKHZhcmlhbnRNYW5hZ2VtZW50KSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRFdmVudExpc3RlbmVyc1RvVmFyaWFudE1hbmFnZW1lbnQodmFyaWFudE1hbmFnZW1lbnQsIHZhcmlhbnRDb250cm9scyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxTdGF0ZVByb21pc2UgPSBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKGNvbnRyb2wgYXMgb2JqZWN0KTtcblx0XHRcdFx0XHRleHRlcm5hbFN0YXRlUHJvbWlzZXMucHVzaChleHRlcm5hbFN0YXRlUHJvbWlzZSk7XG5cdFx0XHRcdFx0Y29udHJvbFN0YXRlS2V5LnB1c2godGhpcy5nZXRTdGF0ZUtleShjb250cm9sKSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRpbml0aWFsQ29udHJvbFN0YXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKGV4dGVybmFsU3RhdGVQcm9taXNlcyk7XG5cdFx0XHRpbml0aWFsQ29udHJvbFN0YXRlcy5mb3JFYWNoKChpbml0aWFsQ29udHJvbFN0YXRlOiBvYmplY3QsIGk6IG51bWJlcikgPT4ge1xuXHRcdFx0XHR0aGlzLmluaXRpYWxDb250cm9sU3RhdGVzTWFwcGVyW2NvbnRyb2xTdGF0ZUtleVtpXV0gPSBpbml0aWFsQ29udHJvbFN0YXRlO1xuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCAoZTogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKGUgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH07XG5cblx0Ly8gQXR0YWNoIGV2ZW50IHRvIHNhdmUgYW5kIHNlbGVjdCBvZiBWYXJpYW50IE1hbmFnZW1lbnQgdG8gdXBkYXRlIHRoZSBpbml0aWFsIENvbnRyb2wgU3RhdGVzIG9uIHZhcmlhbnQgY2hhbmdlXG5cdF9hZGRFdmVudExpc3RlbmVyc1RvVmFyaWFudE1hbmFnZW1lbnQodmFyaWFudE1hbmFnZW1lbnQ6IFZhcmlhbnRNYW5hZ2VtZW50LCB2YXJpYW50Q29udHJvbHM6IHN0cmluZ1tdKSB7XG5cdFx0Y29uc3Qgb1BheWxvYWQgPSB7IHZhcmlhbnRNYW5hZ2VkQ29udHJvbHM6IHZhcmlhbnRDb250cm9scyB9O1xuXHRcdGNvbnN0IGZuRXZlbnQgPSAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUluaXRpYWxTdGF0ZXNPblZhcmlhbnRDaGFuZ2UodmFyaWFudENvbnRyb2xzKTtcblx0XHR9O1xuXHRcdHZhcmlhbnRNYW5hZ2VtZW50LmF0dGFjaFNhdmUob1BheWxvYWQsIGZuRXZlbnQsIHt9KTtcblx0XHR2YXJpYW50TWFuYWdlbWVudC5hdHRhY2hTZWxlY3Qob1BheWxvYWQsIGZuRXZlbnQsIHt9KTtcblx0fVxuXG5cdF91cGRhdGVJbml0aWFsU3RhdGVzT25WYXJpYW50Q2hhbmdlKHZtQXNzb2NpYXRlZENvbnRyb2xzVG9SZXNldDogc3RyaW5nW10pIHtcblx0XHRjb25zdCBpbml0aWFsQ29udHJvbFN0YXRlc01hcHBlciA9IHRoaXMuaW5pdGlhbENvbnRyb2xTdGF0ZXNNYXBwZXI7XG5cdFx0T2JqZWN0LmtleXMoaW5pdGlhbENvbnRyb2xTdGF0ZXNNYXBwZXIpLmZvckVhY2goKGNvbnRyb2xLZXkpID0+IHtcblx0XHRcdGZvciAoY29uc3Qgdm1Bc3NvY2lhdGVkY29udHJvbEtleSBvZiB2bUFzc29jaWF0ZWRDb250cm9sc1RvUmVzZXQpIHtcblx0XHRcdFx0aWYgKHZtQXNzb2NpYXRlZGNvbnRyb2xLZXkuaW5kZXhPZihjb250cm9sS2V5KSA+IC0xKSB7XG5cdFx0XHRcdFx0aW5pdGlhbENvbnRyb2xTdGF0ZXNNYXBwZXJbY29udHJvbEtleV0gPSB7fTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZpZXdTdGF0ZTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7OztFQXFCQTtFQUNBO0VBQ0E7RUFDQSxNQUFNQSxxQkFBcUIsR0FBRyxtQkFBbUI7SUFDaERDLE9BQU8sR0FBR0MsVUFBVSxDQUFDRCxPQUFPOztFQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0VBeUNBO0VBQ0E7RUFDQTs7RUFFQSxNQUFNRSx3QkFBNkMsR0FBRztJQUNyRCxzQ0FBc0MsRUFBRTtNQUN2Q0MsUUFBUSxFQUFFLFVBQVVDLEdBQXNCLEVBQWdDO1FBQ3pFLE9BQU87VUFDTkMsU0FBUyxFQUFFRCxHQUFHLENBQUNFLG9CQUFvQjtRQUNwQyxDQUFDO01BQ0YsQ0FBQztNQUNEQyxLQUFLLEVBQUUsZ0JBQWdCSCxHQUFzQixFQUFFSSxZQUFpRCxFQUFpQjtRQUNoSCxJQUFJO1VBQ0gsSUFBSUEsWUFBWSxJQUFJQSxZQUFZLENBQUNILFNBQVMsS0FBS0ksU0FBUyxJQUFJRCxZQUFZLENBQUNILFNBQVMsS0FBS0QsR0FBRyxDQUFDRSxvQkFBb0IsRUFBRSxFQUFFO1lBQ2xILE1BQU1JLG9CQUFvQixHQUFHLElBQUksQ0FBQ0MsNEJBQTRCLENBQUNQLEdBQUcsRUFBRUksWUFBWSxDQUFDSCxTQUFTLENBQUM7WUFDM0YsSUFBSU8saUJBQWlCO1lBQ3JCLElBQUlGLG9CQUFvQixFQUFFO2NBQ3pCRSxpQkFBaUIsR0FBR0osWUFBWSxDQUFDSCxTQUFTO1lBQzNDLENBQUMsTUFBTTtjQUNOTyxpQkFBaUIsR0FBR1IsR0FBRyxDQUFDUyxxQkFBcUIsRUFBRTtjQUMvQyxJQUFJLENBQUNDLDRCQUE0QixDQUFDQyxJQUFJLENBQUMsR0FBR1gsR0FBRyxDQUFDWSxNQUFNLEVBQUUsQ0FBQztZQUN4RDtZQUNBLElBQUk7Y0FDSCxNQUFNQyxzQkFBc0IsQ0FBQ0MsZUFBZSxDQUFDO2dCQUM1Q0MsT0FBTyxFQUFFZixHQUFHO2dCQUNaZ0IsZ0JBQWdCLEVBQUVSO2NBQ25CLENBQUMsQ0FBQztjQUNGLE1BQU0sSUFBSSxDQUFDUyxnQ0FBZ0MsQ0FBQ2pCLEdBQUcsQ0FBQztZQUNqRCxDQUFDLENBQUMsT0FBT2tCLEtBQWUsRUFBRTtjQUN6QkMsR0FBRyxDQUFDRCxLQUFLLENBQUNBLEtBQUssQ0FBVztZQUMzQjtVQUVELENBQUMsTUFBTTtZQUNOLElBQUksQ0FBQ0QsZ0NBQWdDLENBQUNqQixHQUFHLENBQUM7VUFDM0M7UUFDRCxDQUFDLENBQUMsT0FBT2tCLEtBQWMsRUFBRTtVQUN4QkMsR0FBRyxDQUFDRCxLQUFLLENBQUNBLEtBQUssQ0FBVztRQUMzQjtNQUNEO0lBQ0QsQ0FBQztJQUNELGtCQUFrQixFQUFFO01BQ25CbkIsUUFBUSxFQUFFLFVBQVVxQixPQUFZLEVBQUU7UUFDakMsT0FBTztVQUNOQyxXQUFXLEVBQUVELE9BQU8sQ0FBQ0UsY0FBYztRQUNwQyxDQUFDO01BQ0YsQ0FBQztNQUNEbkIsS0FBSyxFQUFFLFVBQVVpQixPQUFZLEVBQUVHLGFBQWtCLEVBQUU7UUFDbEQsSUFBSUEsYUFBYSxJQUFJQSxhQUFhLENBQUNGLFdBQVcsRUFBRTtVQUMvQyxNQUFNRyxhQUFhLEdBQUdKLE9BQU8sQ0FBQ0ssUUFBUSxFQUFFLENBQUNDLElBQUksQ0FBQyxVQUFVQyxLQUFVLEVBQUU7WUFDbkUsT0FBT0EsS0FBSyxDQUFDQyxNQUFNLEVBQUUsS0FBS0wsYUFBYSxDQUFDRixXQUFXO1VBQ3BELENBQUMsQ0FBQztVQUNGLElBQUlHLGFBQWEsRUFBRTtZQUNsQkosT0FBTyxDQUFDUyxlQUFlLENBQUNMLGFBQWEsQ0FBQztVQUN2QztRQUNEO01BQ0Q7SUFDRCxDQUFDO0lBQ0Qsc0JBQXNCLEVBQUU7TUFDdkJ6QixRQUFRLEVBQUUsZ0JBQWdCK0IsU0FBd0IsRUFBRTtRQUNuRCxNQUFNQyxlQUFlLEdBQUcsSUFBSSxDQUFDQyxXQUFXLENBQUNGLFNBQVMsQ0FBQztRQUNuRCxNQUFNRyxjQUFjLEdBQUcsTUFBTUMsU0FBUyxDQUFDQyxxQkFBcUIsQ0FBQ0wsU0FBUyxDQUFDO1FBQ3ZFO1FBQ0EsTUFBTU0sY0FBYyxHQUFHTixTQUFTLENBQUNPLGtCQUFrQixFQUFFO1FBQ3JELE1BQU1DLE1BQU0sR0FBR0wsY0FBYyxDQUFDSyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQzFDRixjQUFjLENBQ1pFLE1BQU0sQ0FBQyxVQUFVQyxZQUEwQixFQUFFO1VBQzdDLE9BQ0NDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDSCxNQUFNLENBQUMsQ0FBQ0ksTUFBTSxHQUFHLENBQUMsSUFDOUJILFlBQVksQ0FBQ0ksSUFBSSxJQUNqQkwsTUFBTSxDQUFDQyxZQUFZLENBQUNJLElBQUksQ0FBQyxLQUN4QkosWUFBWSxDQUFDSyxrQkFBa0IsSUFBSU4sTUFBTSxDQUFDQyxZQUFZLENBQUNJLElBQUksQ0FBQyxDQUFDRCxNQUFNLEtBQUssQ0FBQyxDQUFDO1FBRTdFLENBQUMsQ0FBQyxDQUNERyxPQUFPLENBQUMsVUFBVU4sWUFBMEIsRUFBRTtVQUM5QyxJQUFJQSxZQUFZLENBQUNJLElBQUksRUFBRTtZQUN0QixPQUFPTCxNQUFNLENBQUNDLFlBQVksQ0FBQ0ksSUFBSSxDQUFDO1VBQ2pDO1FBQ0QsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUNHLGdCQUFnQixDQUFDZixlQUFlLEVBQUVFLGNBQWMsQ0FBQztNQUM5RCxDQUFDO01BQ0Q5QixLQUFLLEVBQUUsZ0JBQWdCMkIsU0FBb0IsRUFBRTFCLFlBQTBCLEVBQUU7UUFDeEUsSUFBSTtVQUNILElBQUlBLFlBQVksRUFBRTtZQUNqQixJQUFJQSxZQUFZLGFBQVpBLFlBQVksZUFBWkEsWUFBWSxDQUFFMkMsWUFBWSxJQUFJLElBQUksQ0FBQ3JDLDRCQUE0QixDQUFDc0MsT0FBTyxDQUFDbEIsU0FBUyxDQUFDbUIsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtjQUN0RyxNQUFNQyxTQUFpQixHQUFHLE1BQU1oQixTQUFTLENBQUNnQixTQUFTLENBQ2xEcEIsU0FBUyxFQUNUMUIsWUFBWSxDQUFDMkMsWUFBWSxFQUN6QjNDLFlBQVksQ0FBQytDLFNBQVMsQ0FDdEI7Y0FDRCxPQUFPakIsU0FBUyxDQUFDa0Isa0JBQWtCLENBQUN0QixTQUFTLEVBQUVvQixTQUFTLENBQUM7WUFDMUQsQ0FBQyxNQUFNO2NBQ04sT0FBT2hCLFNBQVMsQ0FBQ2tCLGtCQUFrQixDQUFDdEIsU0FBUyxFQUFFLENBQUExQixZQUFZLGFBQVpBLFlBQVksdUJBQVpBLFlBQVksQ0FBRStDLFNBQVMsS0FBSS9DLFlBQVksQ0FBQztZQUN4RjtVQUNEO1FBQ0QsQ0FBQyxDQUFDLE9BQU9jLEtBQWMsRUFBRTtVQUN4QkMsR0FBRyxDQUFDRCxLQUFLLENBQUNBLEtBQUssQ0FBVztRQUMzQjtNQUNEO0lBQ0QsQ0FBQztJQUNELGtCQUFrQixFQUFFO01BQ25CbkIsUUFBUSxFQUFFLGdCQUFnQnNELEtBQVksRUFBRTtRQUN2QyxNQUFNdEIsZUFBZSxHQUFHLElBQUksQ0FBQ0MsV0FBVyxDQUFDcUIsS0FBSyxDQUFDO1FBQy9DLE1BQU1DLFVBQVUsR0FBRyxNQUFNcEIsU0FBUyxDQUFDQyxxQkFBcUIsQ0FBQ2tCLEtBQUssQ0FBQztRQUMvRCxPQUFPLElBQUksQ0FBQ1AsZ0JBQWdCLENBQUNmLGVBQWUsRUFBRXVCLFVBQVUsQ0FBQztNQUMxRCxDQUFDO01BQ0RuRCxLQUFLLEVBQUUsZ0JBQWdCa0QsS0FBWSxFQUFFakQsWUFBMEIsRUFBRTtRQUNoRSxJQUFJO1VBQ0gsSUFBSUEsWUFBWSxFQUFFO1lBQ2pCO1lBQ0EsSUFBSUEsWUFBWSxhQUFaQSxZQUFZLGVBQVpBLFlBQVksQ0FBRTJDLFlBQVksSUFBSSxJQUFJLENBQUNyQyw0QkFBNEIsQ0FBQ3NDLE9BQU8sQ0FBQ0ssS0FBSyxDQUFDSixLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2NBQUE7Y0FDbEcsSUFBSSwyQkFBQzdDLFlBQVksQ0FBQzJDLFlBQVksa0RBQXpCLHNCQUEyQlEsbUJBQW1CLEdBQUU7Z0JBQ3BEbkQsWUFBWSxDQUFDMkMsWUFBWSxDQUFDUSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7Y0FDbkQ7Y0FDQSxNQUFNQyxVQUFVLEdBQUcsTUFBTXRCLFNBQVMsQ0FBQ2dCLFNBQVMsQ0FDM0NHLEtBQUssRUFDTGpELFlBQVksQ0FBQzJDLFlBQVksRUFDekIzQyxZQUFZLENBQUMrQyxTQUFTLENBQ3RCO2NBQ0QsT0FBT2pCLFNBQVMsQ0FBQ2tCLGtCQUFrQixDQUFDQyxLQUFLLEVBQUVHLFVBQVUsQ0FBQztZQUN2RCxDQUFDLE1BQU07Y0FDTixJQUFJLENBQUNwRCxZQUFZLENBQUNtRCxtQkFBbUIsRUFBRTtnQkFDdENuRCxZQUFZLENBQUNtRCxtQkFBbUIsR0FBRyxDQUFDLENBQUM7Y0FDdEM7Y0FDQSxPQUFPckIsU0FBUyxDQUFDa0Isa0JBQWtCLENBQUNDLEtBQUssRUFBRSxDQUFBakQsWUFBWSxhQUFaQSxZQUFZLHVCQUFaQSxZQUFZLENBQUUrQyxTQUFTLEtBQUkvQyxZQUFZLENBQUM7WUFDcEY7VUFDRDtRQUNELENBQUMsQ0FBQyxPQUFPYyxLQUFLLEVBQUU7VUFDZkMsR0FBRyxDQUFDRCxLQUFLLENBQUNBLEtBQUssQ0FBVztRQUMzQjtNQUNELENBQUM7TUFDRHVDLGNBQWMsRUFBRSxVQUFVQyxNQUFXLEVBQUU7UUFDdEMsTUFBTUMsYUFBYSxHQUFHRCxNQUFNLENBQUNFLGFBQWEsRUFBRTtRQUM1QyxJQUFJRCxhQUFhLEVBQUU7VUFDbEIsTUFBTUUsWUFBWSxHQUFHRixhQUFhLENBQUNHLGNBQWMsRUFBRTtVQUNuRCxJQUFJRCxZQUFZLEtBQUtGLGFBQWEsRUFBRTtZQUNuQztZQUNBQSxhQUFhLENBQUNJLE9BQU8sRUFBRTtVQUN4QixDQUFDLE1BQU07WUFDTjtZQUNBLE1BQU1DLGNBQWMsR0FBR0wsYUFBYSxDQUFDTSxnQkFBZ0IsRUFBRTtZQUN2RCxNQUFNQyxRQUFRLEdBQUdQLGFBQWEsQ0FBQ1EsVUFBVSxFQUFFO1lBRTNDLElBQUlILGNBQWMsRUFBRTtjQUNuQkEsY0FBYyxDQUFDSSxrQkFBa0IsQ0FBQyxDQUFDO2dCQUFFQyx1QkFBdUIsRUFBRTtjQUFHLENBQUMsQ0FBQyxFQUFFSCxRQUFRLENBQUM7WUFDL0U7VUFDRDtRQUNELENBQUMsTUFBTTtVQUNOL0MsR0FBRyxDQUFDbUQsSUFBSSxDQUFFLFVBQVNaLE1BQU0sQ0FBQ1QsS0FBSyxFQUFHLHVDQUFzQyxDQUFDO1FBQzFFO01BQ0Q7SUFDRCxDQUFDO0lBQ0Qsa0JBQWtCLEVBQUU7TUFDbkJsRCxRQUFRLEVBQUUsVUFBVXdFLE1BQVcsRUFBRTtRQUNoQyxPQUFPckMsU0FBUyxDQUFDQyxxQkFBcUIsQ0FBQ29DLE1BQU0sQ0FBQztNQUMvQyxDQUFDO01BQ0RwRSxLQUFLLEVBQUUsVUFBVW9FLE1BQVcsRUFBRWhELGFBQWtCLEVBQUU7UUFDakQsSUFBSUEsYUFBYSxFQUFFO1VBQ2xCLE9BQU9XLFNBQVMsQ0FBQ2tCLGtCQUFrQixDQUFDbUIsTUFBTSxFQUFFaEQsYUFBYSxDQUFDO1FBQzNEO01BQ0Q7TUFDQTtNQUNBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUVDLENBQUM7O0lBQ0QsMkJBQTJCLEVBQUU7TUFDNUJ4QixRQUFRLEVBQUUsVUFBVXlFLFNBQWMsRUFBRTtRQUNuQyxPQUFPO1VBQ05DLGVBQWUsRUFBRUQsU0FBUyxDQUFDRSxrQkFBa0I7UUFDOUMsQ0FBQztNQUNGLENBQUM7TUFDRHZFLEtBQUssRUFBRSxVQUFVcUUsU0FBYyxFQUFFakQsYUFBa0IsRUFBRTtRQUNwRCxJQUFJQSxhQUFhLEVBQUU7VUFDbEJpRCxTQUFTLENBQUNHLGtCQUFrQixDQUFDcEQsYUFBYSxDQUFDa0QsZUFBZSxDQUFDO1FBQzVEO01BQ0QsQ0FBQztNQUNEaEIsY0FBYyxFQUFFLFVBQVVlLFNBQWMsRUFBRTtRQUN6QyxNQUFNSSxlQUFlLEdBQUdKLFNBQVMsQ0FBQ0ssaUJBQWlCLEVBQUU7UUFDckQsTUFBTUMsUUFBUSxHQUFHRixlQUFlLElBQUlBLGVBQWUsQ0FBQ0csVUFBVSxFQUFFO1FBQ2hFLElBQUlELFFBQVEsRUFBRTtVQUNiLE1BQU1FLFNBQVMsR0FBR0MsV0FBVyxDQUFDQyxxQkFBcUIsQ0FBQ04sZUFBZSxDQUFDO1VBQ3BFLE1BQU1PLFNBQVMsR0FBR0MsZUFBZSxDQUFDQyx1Q0FBdUMsQ0FBQ2IsU0FBUyxFQUFFUSxTQUFTLENBQUM7VUFDL0YsSUFBSUcsU0FBUyxLQUFLLE1BQU0sRUFBRTtZQUN6QjtZQUNBLE1BQU1HLE1BQU0sR0FBR1YsZUFBZSxDQUFDVyxRQUFRLEVBQUU7Y0FDeENDLFVBQVUsR0FBR0YsTUFBTSxDQUFDRyxZQUFZLEVBQUU7Y0FDbENDLHFCQUEyRCxHQUN6REMsV0FBVyxDQUFDQyx3QkFBd0IsQ0FBQ0osVUFBVSxFQUFFUixTQUFTLEVBQUU7Z0JBQzVEYSxLQUFLLEVBQUU7Y0FDUixDQUFDLENBQUMsSUFBNkMsQ0FBQyxDQUFDO2NBQ2xEQyx1QkFBdUIsR0FBR3RELE1BQU0sQ0FBQ0MsSUFBSSxDQUFDaUQscUJBQXFCLENBQUMsQ0FBQ0ssTUFBTSxDQUFDLFVBQVVDLEtBQVksRUFBRUMsUUFBZ0IsRUFBRTtnQkFDN0csSUFBSVAscUJBQXFCLENBQUNPLFFBQVEsQ0FBQyxDQUFDQyxhQUFhLEtBQUssSUFBSSxFQUFFO2tCQUMzREYsS0FBSyxDQUFDckYsSUFBSSxDQUFDO29CQUFFMEQsdUJBQXVCLEVBQUU0QjtrQkFBUyxDQUFDLENBQUM7Z0JBQ2xEO2dCQUNBLE9BQU9ELEtBQUs7Y0FDYixDQUFDLEVBQUUsRUFBRSxDQUFDO2NBQ05HLFdBQVcsR0FBRyxDQUFDO2dCQUFFQyxhQUFhLEVBQUU7Y0FBSSxDQUFDLENBQUM7Y0FDdENsQyxRQUFRLEdBQUdZLFFBQVEsQ0FBQ1gsVUFBVSxFQUFFO1lBRWpDUyxlQUFlLENBQUNSLGtCQUFrQixDQUFDK0IsV0FBVyxDQUFDRSxNQUFNLENBQUNQLHVCQUF1QixDQUFDLEVBQUU1QixRQUFRLENBQUM7VUFDMUYsQ0FBQyxNQUFNLElBQUlpQixTQUFTLEtBQUsscUJBQXFCLEVBQUU7WUFDL0M7WUFDQUwsUUFBUSxDQUFDZixPQUFPLEVBQUU7VUFDbkI7UUFDRCxDQUFDLE1BQU07VUFDTjVDLEdBQUcsQ0FBQ21ELElBQUksQ0FBRSxlQUFjRSxTQUFTLENBQUN2QixLQUFLLEVBQUcsdUNBQXNDLENBQUM7UUFDbEY7TUFDRDtJQUNELENBQUM7SUFDRCwwQ0FBMEMsRUFBRTtNQUMzQ2xELFFBQVEsRUFBRSxVQUFVdUcsWUFBaUIsRUFBRTtRQUN0QyxPQUFPO1VBQ05qRixXQUFXLEVBQUVpRixZQUFZLENBQUNDLGNBQWM7UUFDekMsQ0FBQztNQUNGLENBQUM7TUFDRHBHLEtBQUssRUFBRSxVQUFVbUcsWUFBaUIsRUFBRS9FLGFBQWtCLEVBQUU7UUFDdkQsSUFBSUEsYUFBYSxFQUFFO1VBQ2xCK0UsWUFBWSxDQUFDRSxjQUFjLENBQUNqRixhQUFhLENBQUNGLFdBQVcsQ0FBQztRQUN2RDtNQUNEO0lBQ0QsQ0FBQztJQUNELHVCQUF1QixFQUFFO01BQ3hCdEIsUUFBUSxFQUFFLFVBQVUwRyxnQkFBcUIsRUFBRTtRQUMxQyxPQUFPO1VBQ05wRixXQUFXLEVBQUVvRixnQkFBZ0IsQ0FBQ25GLGNBQWM7UUFDN0MsQ0FBQztNQUNGLENBQUM7TUFDRG5CLEtBQUssRUFBRSxVQUFVc0csZ0JBQXFCLEVBQUVsRixhQUFrQixFQUFFO1FBQzNELElBQUlBLGFBQWEsRUFBRTtVQUNsQmtGLGdCQUFnQixDQUFDQyxjQUFjLENBQUNuRixhQUFhLENBQUNGLFdBQVcsQ0FBQztRQUMzRDtNQUNEO0lBQ0QsQ0FBQztJQUNELGNBQWMsRUFBRTtNQUNmdEIsUUFBUSxFQUFFLFVBQVU0RyxPQUFZLEVBQUU7UUFDakMsT0FBTztVQUNOdEYsV0FBVyxFQUFFc0YsT0FBTyxDQUFDckYsY0FBYztRQUNwQyxDQUFDO01BQ0YsQ0FBQztNQUNEbkIsS0FBSyxFQUFFLFVBQVV3RyxPQUFZLEVBQUVwRixhQUFrQixFQUFFO1FBQ2xELElBQUlBLGFBQWEsRUFBRTtVQUNsQm9GLE9BQU8sQ0FBQ0QsY0FBYyxDQUFDbkYsYUFBYSxDQUFDRixXQUFXLENBQUM7UUFDbEQ7TUFDRDtJQUNELENBQUM7SUFDRCxtQkFBbUIsRUFBRTtNQUNwQnRCLFFBQVEsRUFBRSxVQUFVNkcsWUFBaUIsRUFBRTtRQUN0QyxPQUFPO1VBQ05DLGNBQWMsRUFBRUQsWUFBWSxDQUFDRSxpQkFBaUI7UUFDL0MsQ0FBQztNQUNGLENBQUM7TUFDRDNHLEtBQUssRUFBRSxVQUFVeUcsWUFBaUIsRUFBRXJGLGFBQWtCLEVBQUU7UUFDdkQsSUFBSUEsYUFBYSxFQUFFO1VBQ2xCcUYsWUFBWSxDQUFDRyxpQkFBaUIsQ0FBQ3hGLGFBQWEsQ0FBQ3NGLGNBQWMsQ0FBQztRQUM3RDtNQUNEO0lBQ0QsQ0FBQztJQUNELHNCQUFzQixFQUFFO01BQ3ZCOUcsUUFBUSxFQUFFLFVBQVVpSCxLQUFVLEVBQUU7UUFDL0IsTUFBTUMsV0FBVyxHQUFHRCxLQUFLLENBQUNFLGFBQWEsRUFBRTtRQUN6QyxJQUFJRCxXQUFXLElBQUlBLFdBQVcsQ0FBQ0UsU0FBUyxFQUFFO1VBQ3pDLE9BQU9GLFdBQVcsQ0FBQ0UsU0FBUyxDQUFDQyxpQkFBaUIsQ0FBQ0gsV0FBVyxDQUFDRSxTQUFTLENBQUM7UUFDdEU7UUFDQSxPQUFPLENBQUMsQ0FBQztNQUNWLENBQUM7TUFDRGhILEtBQUssRUFBRSxVQUFVNkcsS0FBVSxFQUFFekYsYUFBa0IsRUFBRThGLGNBQW1CLEVBQUU7UUFDckUsTUFBTUosV0FBVyxHQUFHRCxLQUFLLENBQUNFLGFBQWEsRUFBRTtRQUN6QyxJQUFJRCxXQUFXLElBQUlBLFdBQVcsQ0FBQ0UsU0FBUyxFQUFFO1VBQ3pDLE9BQU9GLFdBQVcsQ0FBQ0UsU0FBUyxDQUFDRyxjQUFjLENBQUMvRixhQUFhLEVBQUU4RixjQUFjLENBQUM7UUFDM0U7TUFDRCxDQUFDO01BQ0Q1RCxjQUFjLEVBQUUsVUFBVXVELEtBQVUsRUFBRTtRQUNyQyxNQUFNQyxXQUFXLEdBQUdELEtBQUssQ0FBQ0UsYUFBYSxFQUFFO1FBQ3pDLElBQUlELFdBQVcsSUFBSUEsV0FBVyxDQUFDRSxTQUFTLEVBQUU7VUFDekMsT0FBT0YsV0FBVyxDQUFDRSxTQUFTLENBQUNJLG1CQUFtQixFQUFFO1FBQ25EO01BQ0Q7SUFDRCxDQUFDO0lBQ0QsZ0NBQWdDLEVBQUU7TUFDakN4SCxRQUFRLEVBQUUsVUFBVXlILG1CQUF3QixFQUFFO1FBQzdDLE1BQU1DLFVBQVUsR0FBR0QsbUJBQW1CLENBQUNFLG9CQUFvQixFQUFFO1FBQzdELElBQUlELFVBQVUsRUFBRTtVQUNmLE9BQU8sSUFBSSxDQUFDRSxvQkFBb0IsQ0FBQ0YsVUFBVSxDQUFDRyxjQUFjLEVBQUUsQ0FBQztRQUM5RDtRQUNBLE9BQU8sQ0FBQyxDQUFDO01BQ1YsQ0FBQztNQUNEekgsS0FBSyxFQUFFLFVBQVVxSCxtQkFBd0IsRUFBRWpHLGFBQWtCLEVBQUU4RixjQUFtQixFQUFFO1FBQ25GLE1BQU1JLFVBQVUsR0FBR0QsbUJBQW1CLENBQUNFLG9CQUFvQixFQUFFO1FBQzdELElBQUlELFVBQVUsRUFBRTtVQUNmLE9BQU8sSUFBSSxDQUFDSSxpQkFBaUIsQ0FBQ0osVUFBVSxDQUFDRyxjQUFjLEVBQUUsRUFBRXJHLGFBQWEsRUFBRThGLGNBQWMsQ0FBQztRQUMxRjtNQUNEO0lBQ0Q7RUFDRCxDQUFDO0VBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUkEsSUFVTVMsU0FBUyxXQURkQyxjQUFjLENBQUMsNENBQTRDLENBQUMsVUEyQjNEQyxlQUFlLEVBQUUsVUFDakJDLGNBQWMsRUFBRSxVQXVCaEJELGVBQWUsRUFBRSxVQUNqQkUsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFVBTW5DQyxnQkFBZ0IsRUFBRSxVQUNsQkosY0FBYyxFQUFFLFVBbUJoQkksZ0JBQWdCLEVBQUUsVUFDbEJKLGNBQWMsRUFBRSxXQTRCaEJELGVBQWUsRUFBRSxXQUNqQkUsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFdBWW5DSixlQUFlLEVBQUUsV0FDakJFLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxXQVduQ0osZUFBZSxFQUFFLFdBQ2pCRSxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0FxQm5DQyxnQkFBZ0IsRUFBRSxXQUNsQkosY0FBYyxFQUFFLFdBbUJoQkQsZUFBZSxFQUFFLFdBQ2pCRSxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0FZbkNDLGdCQUFnQixFQUFFLFdBQ2xCSixjQUFjLEVBQUUsV0EyQmhCRCxlQUFlLEVBQUUsV0FDakJFLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxXQVluQ0osZUFBZSxFQUFFLFdBQ2pCQyxjQUFjLEVBQUUsV0FhaEJELGVBQWUsRUFBRSxXQUNqQkMsY0FBYyxFQUFFLFdBZ0RoQkQsZUFBZSxFQUFFLFdBQ2pCRSxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0F1Qm5DQyxnQkFBZ0IsRUFBRSxXQUNsQkosY0FBYyxFQUFFLFdBK0JoQkQsZUFBZSxFQUFFLFdBQ2pCRSxVQUFVLENBQUNDLGlCQUFpQixDQUFDRyxPQUFPLENBQUMsV0FrQnJDTixlQUFlLEVBQUUsV0FDakJDLGNBQWMsRUFBRSxXQStEaEJJLGdCQUFnQixFQUFFLFdBaUNsQkwsZUFBZSxFQUFFLFdBQ2pCRSxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0FnQm5DSixlQUFlLEVBQUUsV0FDakJFLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxXQWlCbkNKLGVBQWUsRUFBRSxXQUNqQkUsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFdBTW5DQyxnQkFBZ0IsRUFBRSxXQTRCbEJMLGVBQWUsRUFBRSxXQUNqQkUsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFdBdUJuQ0MsZ0JBQWdCLEVBQUUsV0FDbEJKLGNBQWMsRUFBRTtJQUFBO0lBOWhCakI7QUFDRDtBQUNBO0lBQ0MscUJBQWM7TUFBQTtNQUNiLHVDQUFPO01BQUMsTUFWVE0sMEJBQTBCLEdBQTRCLENBQUMsQ0FBQztNQUFBLE1BRXhEN0gsNEJBQTRCLEdBQWEsRUFBRTtNQUFBLE1BRTNDOEgsaUJBQWlCLEdBQXNCLEVBQUU7TUFBQSxNQTRqQnpDdkgsZ0NBQWdDLEdBQUcsTUFBT3dILGlCQUFxQyxJQUFLO1FBQ25GLElBQUk7VUFDSCxNQUFNQyxhQUFhLEdBQUcsTUFBS0YsaUJBQWlCO1VBRTVDLE1BQU1HLHFCQUF3QyxHQUFHLEVBQUU7VUFDbkQsTUFBTTVHLGVBQXlCLEdBQUcsRUFBRTtVQUNwQyxJQUFJNkcsb0JBQThCLEdBQUcsRUFBRTtVQUN2QyxNQUFNQyxlQUF5QixHQUFHLENBQUFKLGlCQUFpQixhQUFqQkEsaUJBQWlCLHVCQUFqQkEsaUJBQWlCLENBQUU3SCxNQUFNLEVBQUUsS0FBSSxFQUFFO1VBRW5FOEgsYUFBYSxDQUNYcEcsTUFBTSxDQUFDLFVBQVV3RyxPQUFPLEVBQUU7WUFDMUIsT0FDQ0EsT0FBTyxLQUNOLENBQUNMLGlCQUFpQixJQUFJSSxlQUFlLENBQUM3RixPQUFPLENBQUM4RixPQUFPLENBQUM3RixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQ3BFNkYsT0FBTyxDQUFDQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsSUFDOUJELE9BQU8sQ0FBZ0JDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUNsREQsT0FBTyxDQUFnQkMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7VUFFbkQsQ0FBQyxDQUFDLENBQ0RsRyxPQUFPLENBQUVpRyxPQUFPLElBQUs7WUFDckIsSUFBSUwsaUJBQWlCLEVBQUU7Y0FDdEIsTUFBS08scUNBQXFDLENBQUNQLGlCQUFpQixFQUFFSSxlQUFlLENBQUM7WUFDL0U7WUFFQSxNQUFNSSxvQkFBb0IsR0FBRy9HLFNBQVMsQ0FBQ0MscUJBQXFCLENBQUMyRyxPQUFPLENBQVc7WUFDL0VILHFCQUFxQixDQUFDaEksSUFBSSxDQUFDc0ksb0JBQW9CLENBQUM7WUFDaERsSCxlQUFlLENBQUNwQixJQUFJLENBQUMsTUFBS3FCLFdBQVcsQ0FBQzhHLE9BQU8sQ0FBQyxDQUFDO1VBQ2hELENBQUMsQ0FBQztVQUVIRixvQkFBb0IsR0FBRyxNQUFNTSxPQUFPLENBQUNDLEdBQUcsQ0FBQ1IscUJBQXFCLENBQUM7VUFDL0RDLG9CQUFvQixDQUFDL0YsT0FBTyxDQUFDLENBQUN1RyxtQkFBMkIsRUFBRUMsQ0FBUyxLQUFLO1lBQ3hFLE1BQUtkLDBCQUEwQixDQUFDeEcsZUFBZSxDQUFDc0gsQ0FBQyxDQUFDLENBQUMsR0FBR0QsbUJBQW1CO1VBQzFFLENBQUMsQ0FBQztRQUNILENBQUMsQ0FBQyxPQUFPRSxDQUFVLEVBQUU7VUFDcEJuSSxHQUFHLENBQUNELEtBQUssQ0FBQ29JLENBQUMsQ0FBVztRQUN2QjtNQUNELENBQUM7TUF6bEJBLE1BQUtDLHdCQUF3QixHQUFHLENBQUM7TUFDakMsTUFBS0MscUJBQXFCLEdBQUcsSUFBSU4sT0FBTyxDQUFFTyxPQUFPLElBQUs7UUFDckQsTUFBS0MsNEJBQTRCLEdBQUdELE9BQU87TUFDNUMsQ0FBQyxDQUFDO01BQUM7SUFDSjtJQUFDO0lBQUEsT0FJS2xDLG1CQUFtQixHQUZ6QixxQ0FFNEI7TUFDM0IsTUFBTW9DLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQ0MsY0FBYyxDQUFDLElBQUksQ0FBQ0MsSUFBSSxDQUFDMUMsU0FBUyxDQUFDMkMsMkJBQTJCLENBQUM7TUFDNUYsSUFBSUMsYUFBYSxHQUFHYixPQUFPLENBQUNPLE9BQU8sRUFBRTtNQUNyQ0UsU0FBUyxDQUNQckgsTUFBTSxDQUFFMEgsUUFBYSxJQUFLO1FBQzFCLE9BQU9BLFFBQVEsSUFBSUEsUUFBUSxDQUFDakIsR0FBRyxJQUFJaUIsUUFBUSxDQUFDakIsR0FBRyxDQUFDLDJCQUEyQixDQUFDO01BQzdFLENBQUMsQ0FBQyxDQUNEbEcsT0FBTyxDQUFFbUgsUUFBYSxJQUFLO1FBQzNCRCxhQUFhLEdBQUdBLGFBQWEsQ0FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQ0MscUJBQXFCLENBQUNDLElBQUksQ0FBQyxJQUFJLEVBQUVILFFBQVEsQ0FBQyxDQUFDO01BQ3BGLENBQUMsQ0FBQztNQUNILE9BQU9ELGFBQWE7SUFDckI7SUFDQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVRDO0lBQUE7SUFZQTtJQUNBRCwyQkFBMkIsR0FIM0IscUNBRzRCTSxrQkFBbUMsRUFBRTtNQUNoRTtJQUFBLENBQ0E7SUFBQSxPQUlERixxQkFBcUIsR0FGckIsK0JBRXNCRixRQUFhLEVBQUU7TUFDcEMsTUFBTUssNkJBQTZCLEdBQUcsSUFBSSxDQUFDQywrQkFBK0IsQ0FBQ04sUUFBUSxDQUFDO01BQ3BGLElBQUlELGFBQWEsR0FBR2IsT0FBTyxDQUFDTyxPQUFPLEVBQUU7TUFDckMsSUFBSSxPQUFPWSw2QkFBNkIsQ0FBQzVHLGNBQWMsS0FBSyxVQUFVLEVBQUU7UUFDdkV0QyxHQUFHLENBQUNtRCxJQUFJLENBQUUsdUNBQXNDMEYsUUFBUSxDQUFDTyxXQUFXLEVBQUUsQ0FBQ0MsT0FBTyxFQUFHLGtCQUFpQixDQUFDO01BQ3BHLENBQUMsTUFBTTtRQUNOVCxhQUFhLEdBQUdBLGFBQWEsQ0FBQ0UsSUFBSSxDQUFDSSw2QkFBNkIsQ0FBQzVHLGNBQWMsQ0FBQzBHLElBQUksQ0FBQyxJQUFJLEVBQUVILFFBQVEsQ0FBQyxDQUFDO01BQ3RHO01BQ0EsT0FBT0QsYUFBYTtJQUNyQjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FMQztJQUFBLE9BU0FPLCtCQUErQixHQUYvQix5Q0FFZ0NOLFFBQWEsRUFBTztNQUNuRCxNQUFNUyxzQkFBMkIsR0FBRyxDQUFDLENBQUM7TUFDdEMsSUFBSVQsUUFBUSxFQUFFO1FBQ2IsS0FBSyxNQUFNVSxLQUFLLElBQUk1Syx3QkFBd0IsRUFBRTtVQUM3QyxJQUFJa0ssUUFBUSxDQUFDakIsR0FBRyxDQUFDMkIsS0FBSyxDQUFDLEVBQUU7WUFDeEI7WUFDQTtZQUNBO1lBQ0FELHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLEdBQUczSyx3QkFBd0IsQ0FBQzRLLEtBQUssQ0FBQyxDQUFDakgsY0FBYyxJQUFJLENBQUMsQ0FBQztZQUMvRjtVQUNEO1FBQ0Q7TUFDRDtNQUNBLElBQUksQ0FBQ29HLElBQUksQ0FBQzFDLFNBQVMsQ0FBQ3dELDBCQUEwQixDQUFDWCxRQUFRLEVBQUVTLHNCQUFzQixDQUFDO01BQ2hGLE9BQU9BLHNCQUFzQjtJQUM5QjtJQUNBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FWQztJQUFBO0lBYUE7SUFDQUUsMEJBQTBCLEdBSDFCLG9DQUcyQlgsUUFBdUIsRUFBRVksZUFBc0IsRUFBRTtNQUMzRTtJQUFBOztJQUdEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUxDO0lBQUEsT0FRQUMsU0FBUyxHQUZULHFCQUVZO01BQ1g7SUFBQTs7SUFHRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FMQztJQUFBLE9BUUFDLFNBQVMsR0FGVCxxQkFFWTtNQUNYO0lBQUE7O0lBR0Q7QUFDRDtBQUNBLE9BRkM7SUFBQSxPQUdBQyxPQUFPLEdBQVAsbUJBQVU7TUFDVCxPQUFPLElBQUksQ0FBQ3JCLDRCQUE0QjtNQUN4QywrQkFBTXFCLE9BQU87SUFDZDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BUEM7SUFBQSxPQVVBbkIsY0FBYyxHQUZkLHdCQUVlb0IsTUFBZ0IsRUFBa0I7TUFDaEQsTUFBTUMsUUFBZSxHQUFHLEVBQUU7TUFBQyxrQ0FEUUMsSUFBSTtRQUFKQSxJQUFJO01BQUE7TUFFdkNBLElBQUksQ0FBQ3ZLLElBQUksQ0FBQ3NLLFFBQVEsQ0FBQztNQUNuQkQsTUFBTSxDQUFDN0ssS0FBSyxDQUFDLElBQUksRUFBRStLLElBQUksQ0FBQztNQUN4QixPQUFPaEMsT0FBTyxDQUFDQyxHQUFHLENBQUM4QixRQUFRLENBQUM7SUFDN0I7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVZDO0lBQUE7SUFhQTtJQUNBRSx3QkFBd0IsR0FIeEIsa0NBR3lCbkIsUUFBdUIsRUFBRW9CLGVBQXlCLEVBQUU7TUFDNUU7SUFBQTs7SUFHRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FMQztJQUFBLE9BUUFDLHNCQUFzQixHQUZ0QixnQ0FFdUJyQixRQUFhLEVBQUU7TUFDckMsTUFBTXNCLDRCQUE0QixHQUFHLEVBQUU7UUFDdENDLDBCQUFpQyxHQUFHLEVBQUU7TUFDdkMsSUFBSXZCLFFBQVEsRUFBRTtRQUNiLEtBQUssTUFBTVUsS0FBSyxJQUFJNUssd0JBQXdCLEVBQUU7VUFDN0MsSUFBSWtLLFFBQVEsQ0FBQ2pCLEdBQUcsQ0FBQzJCLEtBQUssQ0FBQyxFQUFFO1lBQ3hCO1lBQ0FZLDRCQUE0QixDQUFDM0ssSUFBSSxDQUFDNkIsTUFBTSxDQUFDZ0osTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFMUwsd0JBQXdCLENBQUM0SyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3JGO1VBQ0Q7UUFDRDtNQUNEO01BQ0EsSUFBSSxDQUFDYixJQUFJLENBQUMxQyxTQUFTLENBQUNnRSx3QkFBd0IsQ0FBQ25CLFFBQVEsRUFBRXVCLDBCQUEwQixDQUFDO01BQ2xGLE9BQU9ELDRCQUE0QixDQUFDakYsTUFBTSxDQUFDa0YsMEJBQTBCLENBQUM7SUFDdkU7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FUQztJQUFBO0lBWUE7SUFDQUUsa0JBQWtCLEdBSGxCLDRCQUdtQnJCLGtCQUFtQyxFQUFFO01BQ3ZEO0lBQUE7O0lBR0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTEM7SUFBQSxPQVFBcEksV0FBVyxHQUZYLHFCQUVZZ0ksUUFBYSxFQUFFO01BQzFCLE9BQU8sSUFBSSxDQUFDMEIsT0FBTyxFQUFFLENBQUNDLFVBQVUsQ0FBQzNCLFFBQVEsQ0FBQy9HLEtBQUssRUFBRSxDQUFDLElBQUkrRyxRQUFRLENBQUMvRyxLQUFLLEVBQUU7SUFDdkU7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVBDO0lBQUEsT0FVTW1FLGlCQUFpQixHQUZ2QixtQ0FFMEI7TUFDekIsRUFBRSxJQUFJLENBQUNtQyx3QkFBd0I7TUFDL0IsSUFBSXFDLFVBQWU7TUFFbkIsSUFBSTtRQUNILE1BQU0sSUFBSSxDQUFDcEMscUJBQXFCO1FBQ2hDLE1BQU1HLFNBQXdDLEdBQUcsTUFBTSxJQUFJLENBQUNDLGNBQWMsQ0FBQyxJQUFJLENBQUNDLElBQUksQ0FBQzFDLFNBQVMsQ0FBQ3NFLGtCQUFrQixDQUFDO1FBQ2xILE1BQU1JLGVBQWUsR0FBRyxNQUFNM0MsT0FBTyxDQUFDQyxHQUFHLENBQ3hDUSxTQUFTLENBQ1BySCxNQUFNLENBQUMsVUFBVTBILFFBQWEsRUFBRTtVQUNoQyxPQUFPQSxRQUFRLElBQUlBLFFBQVEsQ0FBQ2pCLEdBQUcsSUFBSWlCLFFBQVEsQ0FBQ2pCLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQztRQUM3RSxDQUFDLENBQUMsQ0FDRCtDLEdBQUcsQ0FBRTlCLFFBQWEsSUFBSztVQUN2QixPQUFPLElBQUksQ0FBQ3JDLG9CQUFvQixDQUFDcUMsUUFBUSxDQUFDLENBQUNDLElBQUksQ0FBRThCLE9BQVksSUFBSztZQUNqRSxPQUFPO2NBQ05DLEdBQUcsRUFBRSxJQUFJLENBQUNoSyxXQUFXLENBQUNnSSxRQUFRLENBQUM7Y0FDL0JpQyxLQUFLLEVBQUVGO1lBQ1IsQ0FBQztVQUNGLENBQUMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUNIO1FBQ0RILFVBQVUsR0FBR0MsZUFBZSxDQUFDOUYsTUFBTSxDQUFDLFVBQVVtRyxPQUFZLEVBQUVDLE1BQVcsRUFBRTtVQUN4RSxNQUFNQyxhQUFrQixHQUFHLENBQUMsQ0FBQztVQUM3QkEsYUFBYSxDQUFDRCxNQUFNLENBQUNILEdBQUcsQ0FBQyxHQUFHRyxNQUFNLENBQUNGLEtBQUs7VUFDeEMsT0FBT0ksWUFBWSxDQUFDSCxPQUFPLEVBQUVFLGFBQWEsQ0FBQztRQUM1QyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDTixNQUFNRSxpQkFBaUIsR0FBRyxNQUFNcEQsT0FBTyxDQUFDTyxPQUFPLENBQUMsSUFBSSxDQUFDOEMseUJBQXlCLEVBQUUsQ0FBQztRQUNqRixJQUFJRCxpQkFBaUIsSUFBSTlKLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDNkosaUJBQWlCLENBQUMsQ0FBQzVKLE1BQU0sRUFBRTtVQUMvRGtKLFVBQVUsQ0FBQ2pNLHFCQUFxQixDQUFDLEdBQUcyTSxpQkFBaUI7UUFDdEQ7TUFDRCxDQUFDLFNBQVM7UUFDVCxFQUFFLElBQUksQ0FBQy9DLHdCQUF3QjtNQUNoQztNQUVBLE9BQU8sSUFBSSxDQUFDQSx3QkFBd0IsS0FBSyxDQUFDLEdBQUdxQyxVQUFVLEdBQUd2TCxTQUFTO0lBQ3BFOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BVEM7SUFBQTtJQVlBO0lBQ0FtTSx3QkFBd0IsR0FIeEIsa0NBR3lCRixpQkFBeUIsRUFBRTtNQUNuRDtJQUFBOztJQUdEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsT0FKQztJQUFBLE9BS0FDLHlCQUF5QixHQUF6QixxQ0FBNEI7TUFDM0IsTUFBTUQsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO01BQzVCLElBQUksQ0FBQ3pDLElBQUksQ0FBQzFDLFNBQVMsQ0FBQ3FGLHdCQUF3QixDQUFDRixpQkFBaUIsQ0FBQztNQUMvRCxPQUFPQSxpQkFBaUI7SUFDekI7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTEM7SUFBQSxPQVFBM0Usb0JBQW9CLEdBRnBCLDhCQUVxQnFDLFFBQWEsRUFBRTtNQUNuQyxNQUFNeUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDcEIsc0JBQXNCLENBQUNyQixRQUFRLENBQUM7TUFDbkUsT0FBT2QsT0FBTyxDQUFDQyxHQUFHLENBQ2pCc0QscUJBQXFCLENBQUNYLEdBQUcsQ0FBRVksb0JBQXlCLElBQUs7UUFDeEQsSUFBSSxPQUFPQSxvQkFBb0IsQ0FBQzNNLFFBQVEsS0FBSyxVQUFVLEVBQUU7VUFDeEQsTUFBTSxJQUFJNE0sS0FBSyxDQUFFLCtEQUE4RDNDLFFBQVEsQ0FBQ08sV0FBVyxFQUFFLENBQUNDLE9BQU8sRUFBRyxFQUFDLENBQUM7UUFDbkg7UUFDQSxPQUFPa0Msb0JBQW9CLENBQUMzTSxRQUFRLENBQUM2TSxJQUFJLENBQUMsSUFBSSxFQUFFNUMsUUFBUSxDQUFDO01BQzFELENBQUMsQ0FBQyxDQUNGLENBQUNDLElBQUksQ0FBRTRDLE9BQWMsSUFBSztRQUMxQixPQUFPQSxPQUFPLENBQUM5RyxNQUFNLENBQUMsVUFBVStHLFdBQWdCLEVBQUVWLGFBQWtCLEVBQUU7VUFDckUsT0FBT0MsWUFBWSxDQUFDUyxXQUFXLEVBQUVWLGFBQWEsQ0FBQztRQUNoRCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDUCxDQUFDLENBQUM7SUFDSDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BYkM7SUFBQSxPQWdCQVcscUJBQXFCLEdBRnJCLGlDQUV3QjtNQUN2QixPQUFPLElBQUk7SUFDWjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVpDO0lBQUEsT0FlTXpGLGNBQWMsR0FGcEIsOEJBRXFCc0UsVUFBZSxFQUFFb0IsYUFBa0MsRUFBZ0I7TUFDdkYsSUFBSSxJQUFJLENBQUNuRCxJQUFJLENBQUMxQyxTQUFTLENBQUM0RixxQkFBcUIsRUFBRSxJQUFJLElBQUksQ0FBQ0UsdUJBQXVCLEVBQUUsRUFBRTtRQUNsRjtNQUNEO01BRUEsSUFBSTtRQUNILE1BQU0sSUFBSSxDQUFDckQsY0FBYyxDQUFDLElBQUksQ0FBQ0MsSUFBSSxDQUFDMUMsU0FBUyxDQUFDK0Ysb0JBQW9CLENBQUM7UUFDbkUsTUFBTXZELFNBQTBCLEdBQUcsTUFBTSxJQUFJLENBQUNDLGNBQWMsQ0FBQyxJQUFJLENBQUNDLElBQUksQ0FBQzFDLFNBQVMsQ0FBQ3NFLGtCQUFrQixDQUFDO1FBQ3BHLElBQUksQ0FBQ2pELGlCQUFpQixHQUFHbUIsU0FBUztRQUNsQyxJQUFJSSxhQUFhLEdBQUdiLE9BQU8sQ0FBQ08sT0FBTyxFQUFFO1FBQ3JDLElBQUkwRCxvQkFBb0IsR0FBRyxLQUFLO1FBQ2hDO0FBQ0g7QUFDQTtRQUNHLE1BQU1DLHdCQUF3QixHQUFHekQsU0FBUyxDQUFDNUQsTUFBTSxDQUFDLENBQUNzSCxnQkFBaUMsRUFBRXZFLE9BQU8sS0FBSztVQUNqRyxJQUFJLENBQUNBLE9BQU8sRUFBRTtZQUNiLE9BQU91RSxnQkFBZ0I7VUFDeEI7VUFDQSxNQUFNQywwQkFBMEIsR0FBR3hFLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLHNDQUFzQyxDQUFDO1VBQ3RGLElBQUksQ0FBQ29FLG9CQUFvQixFQUFFO1lBQzFCQSxvQkFBb0IsR0FBR0csMEJBQTBCO1VBQ2xEO1VBQ0FELGdCQUFnQixHQUFHQywwQkFBMEIsR0FBRyxDQUFDeEUsT0FBTyxFQUFFLEdBQUd1RSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBR0EsZ0JBQWdCLEVBQUV2RSxPQUFPLENBQUM7VUFDL0csT0FBT3VFLGdCQUFnQjtRQUN4QixDQUFDLEVBQUUsRUFBRSxDQUFDOztRQUVOO1FBQ0EsSUFBSSxDQUFDRixvQkFBb0IsRUFBRTtVQUMxQixJQUFJLENBQUNsTSxnQ0FBZ0MsRUFBRTtRQUN4QztRQUVBbU0sd0JBQXdCLENBQ3RCOUssTUFBTSxDQUFDLFVBQVUwSCxRQUFRLEVBQUU7VUFDM0IsT0FBT0EsUUFBUSxDQUFDakIsR0FBRyxDQUFDLDJCQUEyQixDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUNEbEcsT0FBTyxDQUFFbUgsUUFBUSxJQUFLO1VBQ3RCLE1BQU11RCxJQUFJLEdBQUcsSUFBSSxDQUFDdkwsV0FBVyxDQUFDZ0ksUUFBUSxDQUFDO1VBQ3ZDRCxhQUFhLEdBQUdBLGFBQWEsQ0FBQ0UsSUFBSSxDQUNqQyxJQUFJLENBQUNwQyxpQkFBaUIsQ0FBQ3NDLElBQUksQ0FBQyxJQUFJLEVBQUVILFFBQVEsRUFBRTRCLFVBQVUsR0FBR0EsVUFBVSxDQUFDMkIsSUFBSSxDQUFDLEdBQUdsTixTQUFTLEVBQUUyTSxhQUFhLENBQUMsQ0FDckc7UUFDRixDQUFDLENBQUM7UUFFSCxNQUFNakQsYUFBYTtRQUNuQixJQUFJaUQsYUFBYSxDQUFDUSxjQUFjLEtBQUs1TixPQUFPLENBQUM2TixTQUFTLEVBQUU7VUFDdkQsTUFBTSxJQUFJLENBQUM3RCxjQUFjLENBQ3hCLElBQUksQ0FBQ0MsSUFBSSxDQUFDMUMsU0FBUyxDQUFDdUcscUJBQXFCLEVBQ3pDOUIsVUFBVSxHQUFHQSxVQUFVLENBQUNqTSxxQkFBcUIsQ0FBQyxHQUFHVSxTQUFTLENBQzFEO1FBQ0YsQ0FBQyxNQUFNO1VBQ04sTUFBTSxJQUFJLENBQUN1SixjQUFjLENBQUMsSUFBSSxDQUFDQyxJQUFJLENBQUMxQyxTQUFTLENBQUN3Ryx5QkFBeUIsRUFBRVgsYUFBYSxDQUFDO1VBQ3ZGLE1BQU0sSUFBSSxDQUFDcEQsY0FBYyxDQUFDLElBQUksQ0FBQ0MsSUFBSSxDQUFDMUMsU0FBUyxDQUFDeUcscUNBQXFDLEVBQUVaLGFBQWEsQ0FBQztRQUNwRztNQUNELENBQUMsU0FBUztRQUNULElBQUk7VUFDSCxNQUFNLElBQUksQ0FBQ3BELGNBQWMsQ0FBQyxJQUFJLENBQUNDLElBQUksQ0FBQzFDLFNBQVMsQ0FBQzBHLG1CQUFtQixDQUFDO1VBQ2xFLElBQUksQ0FBQ0MsdUJBQXVCLEVBQUU7UUFDL0IsQ0FBQyxDQUFDLE9BQU94RSxDQUFNLEVBQUU7VUFDaEJuSSxHQUFHLENBQUNELEtBQUssQ0FBQ29JLENBQUMsQ0FBQztRQUNiO01BQ0Q7SUFDRCxDQUFDO0lBQUEsT0FHRC9JLDRCQUE0QixHQUQ1QixzQ0FDNkJQLEdBQVEsRUFBRStOLFVBQWUsRUFBRTtNQUN2RCxNQUFNQyxTQUFTLEdBQUdoTyxHQUFHLENBQUNpTyxXQUFXLEVBQUU7TUFDbkMsSUFBSUMsK0JBQStCLEdBQUcsS0FBSztNQUMzQ0YsU0FBUyxDQUFDbkwsT0FBTyxDQUFDLFVBQVVzTCxRQUFhLEVBQUU7UUFDMUMsSUFBSUEsUUFBUSxDQUFDbkMsR0FBRyxLQUFLK0IsVUFBVSxFQUFFO1VBQ2hDRywrQkFBK0IsR0FBRyxJQUFJO1FBQ3ZDO01BQ0QsQ0FBQyxDQUFDO01BQ0YsT0FBT0EsK0JBQStCO0lBQ3ZDLENBQUM7SUFBQSxPQUVESix1QkFBdUIsR0FBdkIsbUNBQTBCO01BQ3pCLElBQUksSUFBSSxDQUFDcEUsNEJBQTRCLEVBQUU7UUFDdEMsTUFBTTBFLDJCQUEyQixHQUFHLElBQUksQ0FBQzFFLDRCQUE0QjtRQUNyRSxPQUFPLElBQUksQ0FBQ0EsNEJBQTRCO1FBQ3hDMEUsMkJBQTJCLEVBQUU7TUFDOUI7SUFDRCxDQUFDO0lBQUEsT0FDRG5CLHVCQUF1QixHQUF2QixtQ0FBMEI7TUFDekIsT0FBTyxDQUFDLElBQUksQ0FBQ3ZELDRCQUE0QjtJQUMxQzs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVRDO0lBQUE7SUFZQTtJQUNBd0Qsb0JBQW9CLEdBSHBCLDhCQUdxQm1CLFNBQXVCLEVBQUU7TUFDN0M7SUFBQTs7SUFHRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVRDO0lBQUE7SUFZQTtJQUNBUixtQkFBbUIsR0FIbkIsNkJBR29CUSxTQUF1QixFQUFFO01BQzVDO0lBQUE7O0lBR0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVZDO0lBQUE7SUFhQTtJQUNBWCxxQkFBcUIsR0FIckIsK0JBR3NCOUIsVUFBa0IsRUFBRXlDLFNBQXVCLEVBQUU7TUFDbEU7SUFBQSxDQUNBO0lBQUEsT0FHRFQscUNBQXFDLEdBRHJDLCtDQUVDVSxjQUtDLEVBQ0RDLFVBQXdCLEVBQ3ZCO01BQ0Q7SUFBQTs7SUFHRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FkQztJQUFBLE9BaUJBWix5QkFBeUIsR0FGekI7SUFHQztJQUNBWCxhQUtDO0lBQ0Q7SUFDQXFCLFNBQXVCLEVBQ3RCO01BQ0Q7SUFBQTs7SUFHRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BUEM7SUFBQSxPQVVBeEcsaUJBQWlCLEdBRmpCLDJCQUVrQm1DLFFBQWEsRUFBRXpJLGFBQXFCLEVBQUU4RixjQUF1QixFQUFFO01BQ2hGLE1BQU1vRixxQkFBcUIsR0FBRyxJQUFJLENBQUNwQixzQkFBc0IsQ0FBQ3JCLFFBQVEsQ0FBQztNQUNuRSxJQUFJRCxhQUFhLEdBQUdiLE9BQU8sQ0FBQ08sT0FBTyxFQUFFO01BQ3JDZ0QscUJBQXFCLENBQUM1SixPQUFPLENBQUU2SixvQkFBeUIsSUFBSztRQUM1RCxJQUFJLE9BQU9BLG9CQUFvQixDQUFDdk0sS0FBSyxLQUFLLFVBQVUsRUFBRTtVQUNyRCxNQUFNLElBQUl3TSxLQUFLLENBQUUsNERBQTJEM0MsUUFBUSxDQUFDTyxXQUFXLEVBQUUsQ0FBQ0MsT0FBTyxFQUFHLEVBQUMsQ0FBQztRQUNoSDtRQUNBVCxhQUFhLEdBQUdBLGFBQWEsQ0FBQ0UsSUFBSSxDQUFDeUMsb0JBQW9CLENBQUN2TSxLQUFLLENBQUNnSyxJQUFJLENBQUMsSUFBSSxFQUFFSCxRQUFRLEVBQUV6SSxhQUFhLEVBQUU4RixjQUFjLENBQUMsQ0FBQztNQUNuSCxDQUFDLENBQUM7TUFDRixPQUFPMEMsYUFBYTtJQUNyQixDQUFDO0lBQUEsT0FDRHlFLFlBQVksR0FBWix3QkFBZTtNQUNkLE9BQU8sSUFBSTtJQUNaO0lBQ0E7SUFBQTtJQUFBLE9BQ0ExTCxnQkFBZ0IsR0FBaEIsMEJBQWlCZixlQUF1QixFQUFFM0IsWUFBMEIsRUFBRTtNQUNyRSxNQUFNbUksMEJBQTBCLEdBQUcsSUFBSSxDQUFDQSwwQkFBMEI7TUFDbEUsSUFBSS9GLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDOEYsMEJBQTBCLENBQUMsQ0FBQzdGLE1BQU0sR0FBRyxDQUFDLElBQUk2RiwwQkFBMEIsQ0FBQ3hHLGVBQWUsQ0FBQyxFQUFFO1FBQ3RHLElBQUlTLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDOEYsMEJBQTBCLENBQUN4RyxlQUFlLENBQUMsQ0FBVyxDQUFDVyxNQUFNLEtBQUssQ0FBQyxFQUFFO1VBQ3BGNkYsMEJBQTBCLENBQUN4RyxlQUFlLENBQUMsR0FBRztZQUFFLEdBQUczQjtVQUFhLENBQUM7UUFDbEU7UUFDQSxPQUFPO1VBQUUrQyxTQUFTLEVBQUUvQyxZQUFZO1VBQUUyQyxZQUFZLEVBQUV3RiwwQkFBMEIsQ0FBQ3hHLGVBQWU7UUFBRSxDQUFDO01BQzlGO01BQ0EsT0FBTzNCLFlBQVk7SUFDcEI7O0lBRUE7SUFBQTtJQXVDQTtJQUFBLE9BQ0E0SSxxQ0FBcUMsR0FBckMsK0NBQXNDUCxpQkFBb0MsRUFBRUksZUFBeUIsRUFBRTtNQUN0RyxNQUFNNEYsUUFBUSxHQUFHO1FBQUVDLHNCQUFzQixFQUFFN0Y7TUFBZ0IsQ0FBQztNQUM1RCxNQUFNOEYsT0FBTyxHQUFHLE1BQU07UUFDcEIsSUFBSSxDQUFDQyxtQ0FBbUMsQ0FBQy9GLGVBQWUsQ0FBQztNQUMzRCxDQUFDO01BQ0RKLGlCQUFpQixDQUFDb0csVUFBVSxDQUFDSixRQUFRLEVBQUVFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztNQUNuRGxHLGlCQUFpQixDQUFDcUcsWUFBWSxDQUFDTCxRQUFRLEVBQUVFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQUEsT0FFREMsbUNBQW1DLEdBQW5DLDZDQUFvQ0csMkJBQXFDLEVBQUU7TUFDMUUsTUFBTXhHLDBCQUEwQixHQUFHLElBQUksQ0FBQ0EsMEJBQTBCO01BQ2xFL0YsTUFBTSxDQUFDQyxJQUFJLENBQUM4RiwwQkFBMEIsQ0FBQyxDQUFDMUYsT0FBTyxDQUFFbU0sVUFBVSxJQUFLO1FBQy9ELEtBQUssTUFBTUMsc0JBQXNCLElBQUlGLDJCQUEyQixFQUFFO1VBQ2pFLElBQUlFLHNCQUFzQixDQUFDak0sT0FBTyxDQUFDZ00sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDcER6RywwQkFBMEIsQ0FBQ3lHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztVQUM1QztRQUNEO01BQ0QsQ0FBQyxDQUFDO0lBQ0gsQ0FBQztJQUFBO0VBQUEsRUFsb0JzQkUsbUJBQW1CO0VBQUEsT0Fxb0I1QnBILFNBQVM7QUFBQSJ9
912
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBRERJVElPTkFMX1NUQVRFU19LRVkiLCJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIl9tQ29udHJvbFN0YXRlSGFuZGxlck1hcCIsInJldHJpZXZlIiwib1ZNIiwidmFyaWFudElkIiwiZ2V0Q3VycmVudFZhcmlhbnRLZXkiLCJhcHBseSIsImNvbnRyb2xTdGF0ZSIsInVuZGVmaW5lZCIsImlzVmFyaWFudElkQXZhaWxhYmxlIiwiX2NoZWNrSWZWYXJpYW50SWRJc0F2YWlsYWJsZSIsInNWYXJpYW50UmVmZXJlbmNlIiwiZ2V0U3RhbmRhcmRWYXJpYW50S2V5IiwiY29udHJvbHNWYXJpYW50SWRVbmF2YWlsYWJsZSIsInB1c2giLCJnZXRGb3IiLCJDb250cm9sVmFyaWFudEFwcGx5QVBJIiwiYWN0aXZhdGVWYXJpYW50IiwiZWxlbWVudCIsInZhcmlhbnRSZWZlcmVuY2UiLCJfc2V0SW5pdGlhbFN0YXRlc0ZvckRlbHRhQ29tcHV0ZSIsImVycm9yIiwiTG9nIiwiaW52YWxpZGF0ZUluaXRpYWxTdGF0ZUZvckFwcGx5Iiwib1RhYkJhciIsInNlbGVjdGVkS2V5IiwiZ2V0U2VsZWN0ZWRLZXkiLCJvQ29udHJvbFN0YXRlIiwib1NlbGVjdGVkSXRlbSIsImdldEl0ZW1zIiwiZmluZCIsIm9JdGVtIiwiZ2V0S2V5Iiwic2V0U2VsZWN0ZWRJdGVtIiwiZmlsdGVyQmFyIiwiY29udHJvbFN0YXRlS2V5IiwiZ2V0U3RhdGVLZXkiLCJmaWx0ZXJCYXJTdGF0ZSIsIlN0YXRlVXRpbCIsInJldHJpZXZlRXh0ZXJuYWxTdGF0ZSIsInByb3BlcnRpZXNJbmZvIiwiZ2V0UHJvcGVydHlJbmZvU2V0IiwiZmlsdGVyIiwiUHJvcGVydHlJbmZvIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsInBhdGgiLCJyZW1vdmVGcm9tQXBwU3RhdGUiLCJmb3JFYWNoIiwiX2dldENvbnRyb2xTdGF0ZSIsImlzSW5pdGlhbFN0YXRlQXBwbGljYWJsZSIsImluaXRpYWxTdGF0ZSIsImluZGV4T2YiLCJnZXRJZCIsImRpZmZTdGF0ZSIsImZ1bGxTdGF0ZSIsImFwcGx5RXh0ZXJuYWxTdGF0ZSIsInRhYmxlIiwidGFibGVTdGF0ZSIsInN1cHBsZW1lbnRhcnlDb25maWciLCJvRGlmZlN0YXRlIiwicmVmcmVzaEJpbmRpbmciLCJvVGFibGUiLCJvVGFibGVCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsIm9Sb290QmluZGluZyIsImdldFJvb3RCaW5kaW5nIiwicmVmcmVzaCIsIm9IZWFkZXJDb250ZXh0IiwiZ2V0SGVhZGVyQ29udGV4dCIsInNHcm91cElkIiwiZ2V0R3JvdXBJZCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiaW5mbyIsIm9DaGFydCIsIm9PUExheW91dCIsInNlbGVjdGVkU2VjdGlvbiIsImdldFNlbGVjdGVkU2VjdGlvbiIsInNldFNlbGVjdGVkU2VjdGlvbiIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0JpbmRpbmciLCJnZXRCaW5kaW5nIiwic01ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJzU3RyYXRlZ3kiLCJLZWVwQWxpdmVIZWxwZXIiLCJnZXRDb250cm9sUmVmcmVzaFN0cmF0ZWd5Rm9yQ29udGV4dFBhdGgiLCJvTW9kZWwiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJvTmF2aWdhdGlvblByb3BlcnRpZXMiLCJDb21tb25VdGlscyIsImdldENvbnRleHRQYXRoUHJvcGVydGllcyIsIiRraW5kIiwiYU5hdlByb3BlcnRpZXNUb1JlcXVlc3QiLCJyZWR1Y2UiLCJhUHJldiIsInNOYXZQcm9wIiwiJGlzQ29sbGVjdGlvbiIsImFQcm9wZXJ0aWVzIiwiJFByb3BlcnR5UGF0aCIsImNvbmNhdCIsIm9RdWlja0ZpbHRlciIsImdldFNlbGVjdG9yS2V5Iiwic2V0U2VsZWN0b3JLZXkiLCJvU2VnbWVudGVkQnV0dG9uIiwic2V0U2VsZWN0ZWRLZXkiLCJvU2VsZWN0Iiwib0R5bmFtaWNQYWdlIiwiaGVhZGVyRXhwYW5kZWQiLCJnZXRIZWFkZXJFeHBhbmRlZCIsInNldEhlYWRlckV4cGFuZGVkIiwib1ZpZXciLCJvQ29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJ2aWV3U3RhdGUiLCJyZXRyaWV2ZVZpZXdTdGF0ZSIsIm9OYXZQYXJhbWV0ZXJzIiwiYXBwbHlWaWV3U3RhdGUiLCJyZWZyZXNoVmlld0JpbmRpbmdzIiwib0NvbXBvbmVudENvbnRhaW5lciIsIm9Db21wb25lbnQiLCJnZXRDb21wb25lbnRJbnN0YW5jZSIsInJldHJpZXZlQ29udHJvbFN0YXRlIiwiZ2V0Um9vdENvbnRyb2wiLCJhcHBseUNvbnRyb2xTdGF0ZSIsIlZpZXdTdGF0ZSIsImRlZmluZVVJNUNsYXNzIiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsInByaXZhdGVFeHRlbnNpb24iLCJJbnN0ZWFkIiwiaW5pdGlhbENvbnRyb2xTdGF0ZXNNYXBwZXIiLCJ2aWV3U3RhdGVDb250cm9scyIsInZhcmlhbnRNYW5hZ2VtZW50IiwiYWRhcHRDb250cm9scyIsImV4dGVybmFsU3RhdGVQcm9taXNlcyIsImluaXRpYWxDb250cm9sU3RhdGVzIiwidmFyaWFudENvbnRyb2xzIiwiY29udHJvbCIsImlzQSIsIl9hZGRFdmVudExpc3RlbmVyc1RvVmFyaWFudE1hbmFnZW1lbnQiLCJleHRlcm5hbFN0YXRlUHJvbWlzZSIsIlByb21pc2UiLCJhbGwiLCJpbml0aWFsQ29udHJvbFN0YXRlIiwiaSIsImUiLCJfaVJldHJpZXZpbmdTdGF0ZUNvdW50ZXIiLCJfcEluaXRpYWxTdGF0ZUFwcGxpZWQiLCJyZXNvbHZlIiwiX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZSIsImFDb250cm9scyIsImNvbGxlY3RSZXN1bHRzIiwiYmFzZSIsImFkYXB0QmluZGluZ1JlZnJlc2hDb250cm9scyIsIm9Qcm9taXNlQ2hhaW4iLCJvQ29udHJvbCIsInRoZW4iLCJyZWZyZXNoQ29udHJvbEJpbmRpbmciLCJiaW5kIiwiYUNvbGxlY3RlZENvbnRyb2xzIiwib0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIiLCJnZXRDb250cm9sUmVmcmVzaEJpbmRpbmdIYW5kbGVyIiwiZ2V0TWV0YWRhdGEiLCJnZXROYW1lIiwib1JlZnJlc2hCaW5kaW5nSGFuZGxlciIsInNUeXBlIiwiYWRhcHRCaW5kaW5nUmVmcmVzaEhhbmRsZXIiLCJvQ29udHJvbEhhbmRsZXIiLCJvblN1c3BlbmQiLCJvblJlc3RvcmUiLCJkZXN0cm95IiwiZm5DYWxsIiwiYVJlc3VsdHMiLCJhcmdzIiwiYWRhcHRDb250cm9sU3RhdGVIYW5kbGVyIiwiYUNvbnRyb2xIYW5kbGVyIiwiZ2V0Q29udHJvbFN0YXRlSGFuZGxlciIsImFJbnRlcm5hbENvbnRyb2xTdGF0ZUhhbmRsZXIiLCJhQ3VzdG9tQ29udHJvbFN0YXRlSGFuZGxlciIsImFzc2lnbiIsImFkYXB0U3RhdGVDb250cm9scyIsImdldFZpZXciLCJnZXRMb2NhbElkIiwib1ZpZXdTdGF0ZSIsImFSZXNvbHZlZFN0YXRlcyIsIm1hcCIsInZSZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsIm9TdGF0ZXMiLCJtU3RhdGUiLCJvQ3VycmVudFN0YXRlIiwibWVyZ2VPYmplY3RzIiwibUFkZGl0aW9uYWxTdGF0ZXMiLCJfcmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzIiwicmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzIiwiYUNvbnRyb2xTdGF0ZUhhbmRsZXJzIiwibUNvbnRyb2xTdGF0ZUhhbmRsZXIiLCJFcnJvciIsImNhbGwiLCJhU3RhdGVzIiwib0ZpbmFsU3RhdGUiLCJhcHBseUluaXRpYWxTdGF0ZU9ubHkiLCJvTmF2UGFyYW1ldGVyIiwiX2dldEluaXRpYWxTdGF0ZUFwcGxpZWQiLCJvbkJlZm9yZVN0YXRlQXBwbGllZCIsImhhc1ZhcmlhbnRNYW5hZ2VtZW50Iiwic29ydGVkQWRhcHRTdGF0ZUNvbnRyb2xzIiwibW9kaWZpZWRDb250cm9scyIsImlzVmFyaWFudE1hbmFnZW1lbnRDb250cm9sIiwic0tleSIsIm5hdmlnYXRpb25UeXBlIiwiaUFwcFN0YXRlIiwiYXBwbHlBZGRpdGlvbmFsU3RhdGVzIiwiYXBwbHlOYXZpZ2F0aW9uUGFyYW1ldGVycyIsIl9hcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzVG9GaWx0ZXJiYXIiLCJvbkFmdGVyU3RhdGVBcHBsaWVkIiwiX3NldEluaXRpYWxTdGF0ZUFwcGxpZWQiLCJzVmFyaWFudElkIiwiYVZhcmlhbnRzIiwiZ2V0VmFyaWFudHMiLCJiSXNDb250cm9sU3RhdGVWYXJpYW50QXZhaWxhYmxlIiwib1ZhcmlhbnQiLCJwSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUiLCJhUHJvbWlzZXMiLCJfb05hdlBhcmFtZXRlciIsIl9hUHJvbWlzZXMiLCJnZXRJbnRlcmZhY2UiLCJvUGF5bG9hZCIsInZhcmlhbnRNYW5hZ2VkQ29udHJvbHMiLCJmbkV2ZW50IiwiX3VwZGF0ZUluaXRpYWxTdGF0ZXNPblZhcmlhbnRDaGFuZ2UiLCJhdHRhY2hTYXZlIiwiYXR0YWNoU2VsZWN0Iiwidm1Bc3NvY2lhdGVkQ29udHJvbHNUb1Jlc2V0IiwiY29udHJvbEtleSIsInZtQXNzb2NpYXRlZGNvbnRyb2xLZXkiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJWaWV3U3RhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHByaXZhdGVFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEtlZXBBbGl2ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9LZWVwQWxpdmVIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgTmF2TGlicmFyeSBmcm9tIFwic2FwL2ZlL25hdmlnYXRpb24vbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgQ29udHJvbFZhcmlhbnRBcHBseUFQSSBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L2FwaS9Db250cm9sVmFyaWFudEFwcGx5QVBJXCI7XG5pbXBvcnQgVmFyaWFudE1hbmFnZW1lbnQgZnJvbSBcInNhcC91aS9mbC92YXJpYW50cy9WYXJpYW50TWFuYWdlbWVudFwiO1xuLy8gaW1wb3J0IENoYXJ0IGZyb20gXCJzYXAvdWkvbWRjL0NoYXJ0XCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXIgZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyQmFyXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXJCYXNlIGZyb20gXCJzYXAvdWkvbWRjL2ZpbHRlcmJhci9GaWx0ZXJCYXJCYXNlXCI7XG5pbXBvcnQgU3RhdGVVdGlsIGZyb20gXCJzYXAvdWkvbWRjL3AxM24vU3RhdGVVdGlsXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eUluZm8gfSBmcm9tIFwic2FwL3VpL21kYy91dGlsL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbE5hdlByb3BlcnR5IH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuXG4vLyBhZGRpdGlvbmFsU3RhdGVzIGFyZSBzdG9yZWQgbmV4dCB0byBjb250cm9sIElEcywgc28gbmFtZSBjbGFzaCBhdm9pZGFuY2UgbmVlZGVkLiBGb3J0dW5hdGVseSBJRHMgaGF2ZSByZXN0cmljdGlvbnM6XG4vLyBcIkFsbG93ZWQgaXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIChjYXBpdGFsL2xvd2VyY2FzZSksIGRpZ2l0cywgdW5kZXJzY29yZXMsIGRhc2hlcywgcG9pbnRzIGFuZC9vciBjb2xvbnMuXCJcbi8vIFRoZXJlZm9yZSBhZGRpbmcgYSBzeW1ib2wgbGlrZSAjIG9yIEBcbmNvbnN0IEFERElUSU9OQUxfU1RBVEVTX0tFWSA9IFwiI2FkZGl0aW9uYWxTdGF0ZXNcIixcblx0TmF2VHlwZSA9IE5hdkxpYnJhcnkuTmF2VHlwZTtcblxuLyoqXG4gKiBEZWZpbml0aW9uIG9mIGEgY3VzdG9tIGFjdGlvbiB0byBiZSB1c2VkIGluc2lkZSB0aGUgdGFibGUgdG9vbGJhclxuICpcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5OYXZpZ2F0aW9uUGFyYW1ldGVyXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIE5hdmlnYXRpb25QYXJhbWV0ZXIgPSB7XG5cdC8qKlxuXHQgKiAgVGhlIGFjdHVhbCBuYXZpZ2F0aW9uIHR5cGUuXG5cdCAqXG5cdCAqICBAcHVibGljXG5cdCAqL1xuXHRuYXZpZ2F0aW9uVHlwZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHNlbGVjdGlvblZhcmlhbnQgZnJvbSB0aGUgbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0c2VsZWN0aW9uVmFyaWFudD86IG9iamVjdDtcblx0LyoqXG5cdCAqIFRoZSBzZWxlY3Rpb25WYXJpYW50IGRlZmF1bHRzIGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICpcblx0ICogIEBwdWJsaWNcblx0ICovXG5cdHNlbGVjdGlvblZhcmlhbnREZWZhdWx0cz86IG9iamVjdDtcblx0LyoqXG5cdCAqIERlZmluZXMgd2hldGhlciB0aGUgc3RhbmRhcmQgdmFyaWFudCBtdXN0IGJlIHVzZWQgaW4gdmFyaWFudCBtYW5hZ2VtZW50XG5cdCAqXG5cdCAqICBAcHVibGljXG5cdCAqL1xuXHRyZXF1aXJlc1N0YW5kYXJkVmFyaWFudD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBDb250cm9sU3RhdGUgPVxuXHR8ICh7XG5cdFx0XHRpbml0aWFsU3RhdGU/OiB7XG5cdFx0XHRcdHN1cHBsZW1lbnRhcnlDb25maWc6IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHRcdH07XG5cdFx0XHRmdWxsU3RhdGU/OiBvYmplY3Q7XG5cdCAgfSAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuXHR8IHVuZGVmaW5lZDtcblxuZXhwb3J0IHR5cGUgRmlsdGVyQmFyU3RhdGUgPSB7XG5cdGZpbHRlcj86IFJlY29yZDxzdHJpbmcsIEFycmF5PG9iamVjdD4+O1xufSAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBtZXRob2RzIHRvIHJldHJpZXZlICYgYXBwbHkgc3RhdGVzIGZvciB0aGUgZGlmZmVyZW50IGNvbnRyb2xzIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmNvbnN0IF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcblx0XCJzYXAudWkuZmwudmFyaWFudHMuVmFyaWFudE1hbmFnZW1lbnRcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1ZNOiBWYXJpYW50TWFuYWdlbWVudCk6IHsgdmFyaWFudElkOiBzdHJpbmcgfCBudWxsIH0ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dmFyaWFudElkOiBvVk0uZ2V0Q3VycmVudFZhcmlhbnRLZXkoKVxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBhc3luYyBmdW5jdGlvbiAob1ZNOiBWYXJpYW50TWFuYWdlbWVudCwgY29udHJvbFN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKGNvbnRyb2xTdGF0ZSAmJiBjb250cm9sU3RhdGUudmFyaWFudElkICE9PSB1bmRlZmluZWQgJiYgY29udHJvbFN0YXRlLnZhcmlhbnRJZCAhPT0gb1ZNLmdldEN1cnJlbnRWYXJpYW50S2V5KCkpIHtcblx0XHRcdFx0XHRjb25zdCBpc1ZhcmlhbnRJZEF2YWlsYWJsZSA9IHRoaXMuX2NoZWNrSWZWYXJpYW50SWRJc0F2YWlsYWJsZShvVk0sIGNvbnRyb2xTdGF0ZS52YXJpYW50SWQpO1xuXHRcdFx0XHRcdGxldCBzVmFyaWFudFJlZmVyZW5jZTtcblx0XHRcdFx0XHRpZiAoaXNWYXJpYW50SWRBdmFpbGFibGUpIHtcblx0XHRcdFx0XHRcdHNWYXJpYW50UmVmZXJlbmNlID0gY29udHJvbFN0YXRlLnZhcmlhbnRJZDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c1ZhcmlhbnRSZWZlcmVuY2UgPSBvVk0uZ2V0U3RhbmRhcmRWYXJpYW50S2V5KCk7XG5cdFx0XHRcdFx0XHR0aGlzLmNvbnRyb2xzVmFyaWFudElkVW5hdmFpbGFibGUucHVzaCguLi5vVk0uZ2V0Rm9yKCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgQ29udHJvbFZhcmlhbnRBcHBseUFQSS5hY3RpdmF0ZVZhcmlhbnQoe1xuXHRcdFx0XHRcdFx0XHRlbGVtZW50OiBvVk0sXG5cdFx0XHRcdFx0XHRcdHZhcmlhbnRSZWZlcmVuY2U6IHNWYXJpYW50UmVmZXJlbmNlIGFzIHN0cmluZ1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9zZXRJbml0aWFsU3RhdGVzRm9yRGVsdGFDb21wdXRlKG9WTSk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0dGhpcy5pbnZhbGlkYXRlSW5pdGlhbFN0YXRlRm9yQXBwbHkucHVzaCguLi5vVk0uZ2V0Rm9yKCkpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5fc2V0SW5pdGlhbFN0YXRlc0ZvckRlbHRhQ29tcHV0ZShvVk0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLl9zZXRJbml0aWFsU3RhdGVzRm9yRGVsdGFDb21wdXRlKG9WTSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAubS5JY29uVGFiQmFyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9UYWJCYXI6IGFueSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2VsZWN0ZWRLZXk6IG9UYWJCYXIuZ2V0U2VsZWN0ZWRLZXkoKVxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbiAob1RhYkJhcjogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlICYmIG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpIHtcblx0XHRcdFx0Y29uc3Qgb1NlbGVjdGVkSXRlbSA9IG9UYWJCYXIuZ2V0SXRlbXMoKS5maW5kKGZ1bmN0aW9uIChvSXRlbTogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9JdGVtLmdldEtleSgpID09PSBvQ29udHJvbFN0YXRlLnNlbGVjdGVkS2V5O1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKG9TZWxlY3RlZEl0ZW0pIHtcblx0XHRcdFx0XHRvVGFiQmFyLnNldFNlbGVjdGVkSXRlbShvU2VsZWN0ZWRJdGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAudWkubWRjLkZpbHRlckJhclwiOiB7XG5cdFx0cmV0cmlldmU6IGFzeW5jIGZ1bmN0aW9uIChmaWx0ZXJCYXI6IEZpbHRlckJhckJhc2UpIHtcblx0XHRcdGNvbnN0IGNvbnRyb2xTdGF0ZUtleSA9IHRoaXMuZ2V0U3RhdGVLZXkoZmlsdGVyQmFyKTtcblx0XHRcdGNvbnN0IGZpbHRlckJhclN0YXRlID0gYXdhaXQgU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShmaWx0ZXJCYXIpO1xuXHRcdFx0Ly8gcmVtb3ZlIHNlbnNpdGl2ZSBvciB2aWV3IHN0YXRlIGlycmVsZXZhbnQgZmllbGRzXG5cdFx0XHRjb25zdCBwcm9wZXJ0aWVzSW5mbyA9IGZpbHRlckJhci5nZXRQcm9wZXJ0eUluZm9TZXQoKTtcblx0XHRcdGNvbnN0IGZpbHRlciA9IGZpbHRlckJhclN0YXRlLmZpbHRlciB8fCB7fTtcblx0XHRcdHByb3BlcnRpZXNJbmZvXG5cdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKFByb3BlcnR5SW5mbzogUHJvcGVydHlJbmZvKSB7XG5cdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKGZpbHRlcikubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdFx0UHJvcGVydHlJbmZvLnBhdGggJiZcblx0XHRcdFx0XHRcdGZpbHRlcltQcm9wZXJ0eUluZm8ucGF0aF0gJiZcblx0XHRcdFx0XHRcdChQcm9wZXJ0eUluZm8ucmVtb3ZlRnJvbUFwcFN0YXRlIHx8IGZpbHRlcltQcm9wZXJ0eUluZm8ucGF0aF0ubGVuZ3RoID09PSAwKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChQcm9wZXJ0eUluZm86IFByb3BlcnR5SW5mbykge1xuXHRcdFx0XHRcdGlmIChQcm9wZXJ0eUluZm8ucGF0aCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIGZpbHRlcltQcm9wZXJ0eUluZm8ucGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdHJldHVybiB0aGlzLl9nZXRDb250cm9sU3RhdGUoY29udHJvbFN0YXRlS2V5LCBmaWx0ZXJCYXJTdGF0ZSk7XG5cdFx0fSxcblx0XHRhcHBseTogYXN5bmMgZnVuY3Rpb24gKGZpbHRlckJhcjogRmlsdGVyQmFyLCBjb250cm9sU3RhdGU6IENvbnRyb2xTdGF0ZSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKGNvbnRyb2xTdGF0ZSkge1xuXHRcdFx0XHRcdGNvbnN0IGlzSW5pdGlhbFN0YXRlQXBwbGljYWJsZSA9XG5cdFx0XHRcdFx0XHRjb250cm9sU3RhdGU/LmluaXRpYWxTdGF0ZSAmJlxuXHRcdFx0XHRcdFx0dGhpcy5pbnZhbGlkYXRlSW5pdGlhbFN0YXRlRm9yQXBwbHkuaW5kZXhPZihmaWx0ZXJCYXIuZ2V0SWQoKSkgPT09IC0xICYmXG5cdFx0XHRcdFx0XHR0aGlzLmNvbnRyb2xzVmFyaWFudElkVW5hdmFpbGFibGUuaW5kZXhPZihmaWx0ZXJCYXIuZ2V0SWQoKSkgPT09IC0xO1xuXG5cdFx0XHRcdFx0aWYgKGlzSW5pdGlhbFN0YXRlQXBwbGljYWJsZSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGlmZlN0YXRlOiBvYmplY3QgPSBhd2FpdCBTdGF0ZVV0aWwuZGlmZlN0YXRlKFxuXHRcdFx0XHRcdFx0XHRmaWx0ZXJCYXIsXG5cdFx0XHRcdFx0XHRcdGNvbnRyb2xTdGF0ZS5pbml0aWFsU3RhdGUgYXMgb2JqZWN0LFxuXHRcdFx0XHRcdFx0XHRjb250cm9sU3RhdGUuZnVsbFN0YXRlIGFzIG9iamVjdFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKGZpbHRlckJhciwgZGlmZlN0YXRlKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFN0YXRlVXRpbC5hcHBseUV4dGVybmFsU3RhdGUoZmlsdGVyQmFyLCBjb250cm9sU3RhdGU/LmZ1bGxTdGF0ZSA/PyBjb250cm9sU3RhdGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5tZGMuVGFibGVcIjoge1xuXHRcdHJldHJpZXZlOiBhc3luYyBmdW5jdGlvbiAodGFibGU6IFRhYmxlKSB7XG5cdFx0XHRjb25zdCBjb250cm9sU3RhdGVLZXkgPSB0aGlzLmdldFN0YXRlS2V5KHRhYmxlKTtcblx0XHRcdGNvbnN0IHRhYmxlU3RhdGUgPSBhd2FpdCBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKHRhYmxlKTtcblx0XHRcdHJldHVybiB0aGlzLl9nZXRDb250cm9sU3RhdGUoY29udHJvbFN0YXRlS2V5LCB0YWJsZVN0YXRlKTtcblx0XHR9LFxuXHRcdGFwcGx5OiBhc3luYyBmdW5jdGlvbiAodGFibGU6IFRhYmxlLCBjb250cm9sU3RhdGU6IENvbnRyb2xTdGF0ZSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKGNvbnRyb2xTdGF0ZSkge1xuXHRcdFx0XHRcdC8vIEV4dHJhIGNvbmRpdGlvbiBhZGRlZCB0byBhcHBseSB0aGUgZGlmZiBzdGF0ZSBsb2dpYyBmb3IgbWRjIGNvbnRyb2xcblx0XHRcdFx0XHRjb25zdCBpc0luaXRpYWxTdGF0ZUFwcGxpY2FibGUgPVxuXHRcdFx0XHRcdFx0Y29udHJvbFN0YXRlPy5pbml0aWFsU3RhdGUgJiZcblx0XHRcdFx0XHRcdHRoaXMuaW52YWxpZGF0ZUluaXRpYWxTdGF0ZUZvckFwcGx5LmluZGV4T2YodGFibGUuZ2V0SWQoKSkgPT09IC0xICYmXG5cdFx0XHRcdFx0XHR0aGlzLmNvbnRyb2xzVmFyaWFudElkVW5hdmFpbGFibGUuaW5kZXhPZih0YWJsZS5nZXRJZCgpKSA9PT0gLTE7XG5cblx0XHRcdFx0XHRpZiAoaXNJbml0aWFsU3RhdGVBcHBsaWNhYmxlKSB7XG5cdFx0XHRcdFx0XHRpZiAoY29udHJvbFN0YXRlLmluaXRpYWxTdGF0ZSAmJiAhY29udHJvbFN0YXRlLmluaXRpYWxTdGF0ZT8uc3VwcGxlbWVudGFyeUNvbmZpZykge1xuXHRcdFx0XHRcdFx0XHRjb250cm9sU3RhdGUuaW5pdGlhbFN0YXRlLnN1cHBsZW1lbnRhcnlDb25maWcgPSB7fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNvbnN0IG9EaWZmU3RhdGUgPSBhd2FpdCBTdGF0ZVV0aWwuZGlmZlN0YXRlKFxuXHRcdFx0XHRcdFx0XHR0YWJsZSxcblx0XHRcdFx0XHRcdFx0Y29udHJvbFN0YXRlLmluaXRpYWxTdGF0ZSBhcyBvYmplY3QsXG5cdFx0XHRcdFx0XHRcdGNvbnRyb2xTdGF0ZS5mdWxsU3RhdGUgYXMgb2JqZWN0XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIFN0YXRlVXRpbC5hcHBseUV4dGVybmFsU3RhdGUodGFibGUsIG9EaWZmU3RhdGUpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAoIWNvbnRyb2xTdGF0ZS5zdXBwbGVtZW50YXJ5Q29uZmlnKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRyb2xTdGF0ZS5zdXBwbGVtZW50YXJ5Q29uZmlnID0ge307XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gU3RhdGVVdGlsLmFwcGx5RXh0ZXJuYWxTdGF0ZSh0YWJsZSwgY29udHJvbFN0YXRlPy5mdWxsU3RhdGUgPz8gY29udHJvbFN0YXRlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdExvZy5lcnJvcihlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0cmVmcmVzaEJpbmRpbmc6IGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1RhYmxlQmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0XHRpZiAob1RhYmxlQmluZGluZykge1xuXHRcdFx0XHRjb25zdCBvUm9vdEJpbmRpbmcgPSBvVGFibGVCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChvUm9vdEJpbmRpbmcgPT09IG9UYWJsZUJpbmRpbmcpIHtcblx0XHRcdFx0XHQvLyBhYnNvbHV0ZSBiaW5kaW5nXG5cdFx0XHRcdFx0b1RhYmxlQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gcmVsYXRpdmUgYmluZGluZ1xuXHRcdFx0XHRcdGNvbnN0IG9IZWFkZXJDb250ZXh0ID0gb1RhYmxlQmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0dyb3VwSWQgPSBvVGFibGVCaW5kaW5nLmdldEdyb3VwSWQoKTtcblxuXHRcdFx0XHRcdGlmIChvSGVhZGVyQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0b0hlYWRlckNvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBcIlwiIH1dLCBzR3JvdXBJZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRMb2cuaW5mbyhgVGFibGU6ICR7b1RhYmxlLmdldElkKCl9IHdhcyBub3QgcmVmcmVzaGVkLiBObyBiaW5kaW5nIGZvdW5kIWApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAudWkubWRjLkNoYXJ0XCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9DaGFydDogYW55KSB7XG5cdFx0XHRyZXR1cm4gU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShvQ2hhcnQpO1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvQ2hhcnQ6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZSkge1xuXHRcdFx0XHRyZXR1cm4gU3RhdGVVdGlsLmFwcGx5RXh0ZXJuYWxTdGF0ZShvQ2hhcnQsIG9Db250cm9sU3RhdGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBUT0RPOiB1bmNvbW1lbnQgYWZ0ZXIgbWRjIGZpeCBpcyBtZXJnZWRcblx0XHQvKiByZXRyaWV2ZTogYXN5bmMgZnVuY3Rpb24gKGNoYXJ0OiBDaGFydCkge1xuXHRcdFx0Y29uc3QgY29udHJvbFN0YXRlS2V5ID0gdGhpcy5nZXRTdGF0ZUtleShjaGFydCk7XG5cdFx0XHRjb25zdCBjaGFydFN0YXRlID0gYXdhaXQgU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShjaGFydCk7XG5cblx0XHRcdHJldHVybiB0aGlzLl9nZXRDb250cm9sU3RhdGUoY29udHJvbFN0YXRlS2V5LCBjaGFydFN0YXRlKTtcblx0XHR9LFxuXHRcdGFwcGx5OiBhc3luYyBmdW5jdGlvbiAoY2hhcnQ6IENoYXJ0LCBjb250cm9sU3RhdGU6IENvbnRyb2xTdGF0ZSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKGNvbnRyb2xTdGF0ZSkge1xuXHRcdFx0XHRcdC8vIEV4dHJhIGNvbmRpdGlvbiBhZGRlZCB0byBhcHBseSB0aGUgZGlmZiBzdGF0ZSBsb2dpYyBmb3IgbWRjIGNvbnRyb2xcblx0XHRcdFx0XHRjb25zdCBpc0luaXRpYWxTdGF0ZUFwcGxpY2FibGUgPSBjb250cm9sU3RhdGU/LmluaXRpYWxTdGF0ZSAmJiB0aGlzLmludmFsaWRhdGVJbml0aWFsU3RhdGVGb3JBcHBseS5pbmRleE9mKGNoYXJ0LmdldElkKCkpID09PSAtMSAmJiB0aGlzLmNvbnRyb2xzVmFyaWFudElkVW5hdmFpbGFibGUuaW5kZXhPZihjaGFydC5nZXRJZCgpKSA9PT0gLTE7XG5cblx0XHRcdFx0XHRpZiAoaXNJbml0aWFsU3RhdGVBcHBsaWNhYmxlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBkaWZmU3RhdGUgPSBhd2FpdCBTdGF0ZVV0aWwuZGlmZlN0YXRlKFxuXHRcdFx0XHRcdFx0XHRjaGFydCxcblx0XHRcdFx0XHRcdFx0Y29udHJvbFN0YXRlLmluaXRpYWxTdGF0ZSBhcyBvYmplY3QsXG5cdFx0XHRcdFx0XHRcdGNvbnRyb2xTdGF0ZS5mdWxsU3RhdGUgYXMgb2JqZWN0XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGF3YWl0IFN0YXRlVXRpbC5hcHBseUV4dGVybmFsU3RhdGUoY2hhcnQsIGRpZmZTdGF0ZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBhd2FpdCBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKGNoYXJ0LCBjb250cm9sU3RhdGU/LmZ1bGxTdGF0ZSA/PyBjb250cm9sU3RhdGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0fSAqL1xuXHR9LFxuXHRcInNhcC51eGFwLk9iamVjdFBhZ2VMYXlvdXRcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob09QTGF5b3V0OiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNlbGVjdGVkU2VjdGlvbjogb09QTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvT1BMYXlvdXQ6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZSkge1xuXHRcdFx0XHRvT1BMYXlvdXQuc2V0U2VsZWN0ZWRTZWN0aW9uKG9Db250cm9sU3RhdGUuc2VsZWN0ZWRTZWN0aW9uKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHJlZnJlc2hCaW5kaW5nOiBmdW5jdGlvbiAob09QTGF5b3V0OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9PUExheW91dC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSBvQmluZGluZ0NvbnRleHQgJiYgb0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdGlmIChvQmluZGluZykge1xuXHRcdFx0XHRjb25zdCBzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0Y29uc3Qgc1N0cmF0ZWd5ID0gS2VlcEFsaXZlSGVscGVyLmdldENvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JDb250ZXh0UGF0aChvT1BMYXlvdXQsIHNNZXRhUGF0aCk7XG5cdFx0XHRcdGlmIChzU3RyYXRlZ3kgPT09IFwic2VsZlwiKSB7XG5cdFx0XHRcdFx0Ly8gUmVmcmVzaCBtYWluIGNvbnRleHQgYW5kIDEtMSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgb3IgT1Bcblx0XHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRvTmF2aWdhdGlvblByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIE1ldGFNb2RlbE5hdlByb3BlcnR5PiA9XG5cdFx0XHRcdFx0XHRcdChDb21tb25VdGlscy5nZXRDb250ZXh0UGF0aFByb3BlcnRpZXMob01ldGFNb2RlbCwgc01ldGFQYXRoLCB7XG5cdFx0XHRcdFx0XHRcdFx0JGtpbmQ6IFwiTmF2aWdhdGlvblByb3BlcnR5XCJcblx0XHRcdFx0XHRcdFx0fSkgYXMgUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsTmF2UHJvcGVydHk+KSB8fCB7fSxcblx0XHRcdFx0XHRcdGFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gT2JqZWN0LmtleXMob05hdmlnYXRpb25Qcm9wZXJ0aWVzKS5yZWR1Y2UoZnVuY3Rpb24gKGFQcmV2OiBhbnlbXSwgc05hdlByb3A6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRpZiAob05hdmlnYXRpb25Qcm9wZXJ0aWVzW3NOYXZQcm9wXS4kaXNDb2xsZWN0aW9uICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0YVByZXYucHVzaCh7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzTmF2UHJvcCB9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYVByZXY7XG5cdFx0XHRcdFx0XHR9LCBbXSksXG5cdFx0XHRcdFx0XHRhUHJvcGVydGllcyA9IFt7ICRQcm9wZXJ0eVBhdGg6IFwiKlwiIH1dLFxuXHRcdFx0XHRcdFx0c0dyb3VwSWQgPSBvQmluZGluZy5nZXRHcm91cElkKCk7XG5cblx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKGFQcm9wZXJ0aWVzLmNvbmNhdChhTmF2UHJvcGVydGllc1RvUmVxdWVzdCksIHNHcm91cElkKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzU3RyYXRlZ3kgPT09IFwiaW5jbHVkaW5nRGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdFx0Ly8gQ29tcGxldGUgcmVmcmVzaFxuXHRcdFx0XHRcdG9CaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TG9nLmluZm8oYE9iamVjdFBhZ2U6ICR7b09QTGF5b3V0LmdldElkKCl9IHdhcyBub3QgcmVmcmVzaGVkLiBObyBiaW5kaW5nIGZvdW5kIWApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAuZmUubWFjcm9zLnRhYmxlLlF1aWNrRmlsdGVyQ29udGFpbmVyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9RdWlja0ZpbHRlcjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1F1aWNrRmlsdGVyLmdldFNlbGVjdG9yS2V5KClcblx0XHRcdH07XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9RdWlja0ZpbHRlcjogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlPy5zZWxlY3RlZEtleSkge1xuXHRcdFx0XHRvUXVpY2tGaWx0ZXIuc2V0U2VsZWN0b3JLZXkob0NvbnRyb2xTdGF0ZS5zZWxlY3RlZEtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC5tLlNlZ21lbnRlZEJ1dHRvblwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uIChvU2VnbWVudGVkQnV0dG9uOiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNlbGVjdGVkS2V5OiBvU2VnbWVudGVkQnV0dG9uLmdldFNlbGVjdGVkS2V5KClcblx0XHRcdH07XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9TZWdtZW50ZWRCdXR0b246IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZT8uc2VsZWN0ZWRLZXkpIHtcblx0XHRcdFx0b1NlZ21lbnRlZEJ1dHRvbi5zZXRTZWxlY3RlZEtleShvQ29udHJvbFN0YXRlLnNlbGVjdGVkS2V5KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdFwic2FwLm0uU2VsZWN0XCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9TZWxlY3Q6IGFueSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2VsZWN0ZWRLZXk6IG9TZWxlY3QuZ2V0U2VsZWN0ZWRLZXkoKVxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbiAob1NlbGVjdDogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlPy5zZWxlY3RlZEtleSkge1xuXHRcdFx0XHRvU2VsZWN0LnNldFNlbGVjdGVkS2V5KG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAuZi5EeW5hbWljUGFnZVwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uIChvRHluYW1pY1BhZ2U6IGFueSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aGVhZGVyRXhwYW5kZWQ6IG9EeW5hbWljUGFnZS5nZXRIZWFkZXJFeHBhbmRlZCgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvRHluYW1pY1BhZ2U6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZSkge1xuXHRcdFx0XHRvRHluYW1pY1BhZ2Uuc2V0SGVhZGVyRXhwYW5kZWQob0NvbnRyb2xTdGF0ZS5oZWFkZXJFeHBhbmRlZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5jb3JlLm12Yy5WaWV3XCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9WaWV3OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0aWYgKG9Db250cm9sbGVyICYmIG9Db250cm9sbGVyLnZpZXdTdGF0ZSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIudmlld1N0YXRlLnJldHJpZXZlVmlld1N0YXRlKG9Db250cm9sbGVyLnZpZXdTdGF0ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9WaWV3OiBhbnksIG9Db250cm9sU3RhdGU6IGFueSwgb05hdlBhcmFtZXRlcnM6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRpZiAob0NvbnRyb2xsZXIgJiYgb0NvbnRyb2xsZXIudmlld1N0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udHJvbGxlci52aWV3U3RhdGUuYXBwbHlWaWV3U3RhdGUob0NvbnRyb2xTdGF0ZSwgb05hdlBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0cmVmcmVzaEJpbmRpbmc6IGZ1bmN0aW9uIChvVmlldzogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKTtcblx0XHRcdGlmIChvQ29udHJvbGxlciAmJiBvQ29udHJvbGxlci52aWV3U3RhdGUpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnZpZXdTdGF0ZS5yZWZyZXNoVmlld0JpbmRpbmdzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5jb3JlLkNvbXBvbmVudENvbnRhaW5lclwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uIChvQ29tcG9uZW50Q29udGFpbmVyOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29tcG9uZW50Q29udGFpbmVyLmdldENvbXBvbmVudEluc3RhbmNlKCk7XG5cdFx0XHRpZiAob0NvbXBvbmVudCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5yZXRyaWV2ZUNvbnRyb2xTdGF0ZShvQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvQ29tcG9uZW50Q29udGFpbmVyOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSwgb05hdlBhcmFtZXRlcnM6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db21wb25lbnRDb250YWluZXIuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTtcblx0XHRcdGlmIChvQ29tcG9uZW50KSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmFwcGx5Q29udHJvbFN0YXRlKG9Db21wb25lbnQuZ2V0Um9vdENvbnRyb2woKSwgb0NvbnRyb2xTdGF0ZSwgb05hdlBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcbi8qKlxuICogQSBjb250cm9sbGVyIGV4dGVuc2lvbiBvZmZlcmluZyBob29rcyBmb3Igc3RhdGUgaGFuZGxpbmdcbiAqXG4gKiBJZiB5b3UgbmVlZCB0byBtYWludGFpbiBhIHNwZWNpZmljIHN0YXRlIGZvciB5b3VyIGFwcGxpY2F0aW9uLCB5b3UgY2FuIHVzZSB0aGUgY29udHJvbGxlciBleHRlbnNpb24uXG4gKlxuICogQGhpZGVjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICogQHNpbmNlIDEuODUuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGVcIilcbmNsYXNzIFZpZXdTdGF0ZSBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIF9pUmV0cmlldmluZ1N0YXRlQ291bnRlcjogbnVtYmVyO1xuXG5cdHByaXZhdGUgX3BJbml0aWFsU3RhdGVBcHBsaWVkOiBQcm9taXNlPHVua25vd24+O1xuXG5cdHByaXZhdGUgX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZT86IEZ1bmN0aW9uO1xuXG5cdHByaXZhdGUgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdGluaXRpYWxDb250cm9sU3RhdGVzTWFwcGVyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG5cdGNvbnRyb2xzVmFyaWFudElkVW5hdmFpbGFibGU6IHN0cmluZ1tdID0gW107XG5cblx0aW52YWxpZGF0ZUluaXRpYWxTdGF0ZUZvckFwcGx5OiBzdHJpbmdbXSA9IFtdO1xuXG5cdHZpZXdTdGF0ZUNvbnRyb2xzOiBNYW5hZ2VkT2JqZWN0W10gPSBbXTtcblxuXHQvKipcblx0ICogQ29uc3RydWN0b3IuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyID0gMDtcblx0XHR0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHR0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUgPSByZXNvbHZlO1xuXHRcdH0pO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHJlZnJlc2hWaWV3QmluZGluZ3MoKSB7XG5cdFx0Y29uc3QgYUNvbnRyb2xzID0gYXdhaXQgdGhpcy5jb2xsZWN0UmVzdWx0cyh0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0QmluZGluZ1JlZnJlc2hDb250cm9scyk7XG5cdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRhQ29udHJvbHNcblx0XHRcdC5maWx0ZXIoKG9Db250cm9sOiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpO1xuXHRcdFx0fSlcblx0XHRcdC5mb3JFYWNoKChvQ29udHJvbDogYW55KSA9PiB7XG5cdFx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4odGhpcy5yZWZyZXNoQ29udHJvbEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdFx0fSk7XG5cdFx0cmV0dXJuIG9Qcm9taXNlQ2hhaW47XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYWRkIGFsbCBjb250cm9scyByZWxldmFudCBmb3IgcmVmcmVzaGluZyB0byB0aGUgcHJvdmlkZWQgY29udHJvbCBhcnJheS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIGFDb2xsZWN0ZWRDb250cm9scyBUaGUgY29sbGVjdGVkIGNvbnRyb2xzXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRhZGFwdEJpbmRpbmdSZWZyZXNoQ29udHJvbHMoYUNvbGxlY3RlZENvbnRyb2xzOiBNYW5hZ2VkT2JqZWN0W10pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZW5cblx0fVxuXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cmVmcmVzaENvbnRyb2xCaW5kaW5nKG9Db250cm9sOiBhbnkpIHtcblx0XHRjb25zdCBvQ29udHJvbFJlZnJlc2hCaW5kaW5nSGFuZGxlciA9IHRoaXMuZ2V0Q29udHJvbFJlZnJlc2hCaW5kaW5nSGFuZGxlcihvQ29udHJvbCk7XG5cdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRpZiAodHlwZW9mIG9Db250cm9sUmVmcmVzaEJpbmRpbmdIYW5kbGVyLnJlZnJlc2hCaW5kaW5nICE9PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdExvZy5pbmZvKGByZWZyZXNoQmluZGluZyBoYW5kbGVyIGZvciBjb250cm9sOiAke29Db250cm9sLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpfSBpcyBub3QgcHJvdmlkZWRgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1Byb21pc2VDaGFpbiA9IG9Qcm9taXNlQ2hhaW4udGhlbihvQ29udHJvbFJlZnJlc2hCaW5kaW5nSGFuZGxlci5yZWZyZXNoQmluZGluZy5iaW5kKHRoaXMsIG9Db250cm9sKSk7XG5cdFx0fVxuXHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBtYXAgb2YgPGNvZGU+cmVmcmVzaEJpbmRpbmc8L2NvZGU+IGZ1bmN0aW9uIGZvciBhIGNlcnRhaW4gY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0fSBvQ29udHJvbCBUaGUgY29udHJvbCB0byBnZXQgc3RhdGUgaGFuZGxlciBmb3Jcblx0ICogQHJldHVybnMge29iamVjdH0gQSBwbGFpbiBvYmplY3Qgd2l0aCBvbmUgZnVuY3Rpb246IDxjb2RlPnJlZnJlc2hCaW5kaW5nPC9jb2RlPlxuXHQgKi9cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldENvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIob0NvbnRyb2w6IGFueSk6IGFueSB7XG5cdFx0Y29uc3Qgb1JlZnJlc2hCaW5kaW5nSGFuZGxlcjogYW55ID0ge307XG5cdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNUeXBlIGluIF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcCkge1xuXHRcdFx0XHRpZiAob0NvbnRyb2wuaXNBKHNUeXBlKSkge1xuXHRcdFx0XHRcdC8vIHBhc3Mgb25seSB0aGUgcmVmcmVzaEJpbmRpbmcgaGFuZGxlciBpbiBhbiBvYmplY3Qgc28gdGhhdCA6XG5cdFx0XHRcdFx0Ly8gMS4gQXBwbGljYXRpb24gaGFzIGFjY2VzcyBvbmx5IHRvIHJlZnJlc2hCaW5kaW5nIGFuZCBub3QgYXBwbHkgYW5kIHJldGVyaXZlIGF0IHRoaXMgc3RhZ2Vcblx0XHRcdFx0XHQvLyAyLiBBcHBsaWNhdGlvbiBtb2RpZmljYXRpb25zIHRvIHRoZSBvYmplY3Qgd2lsbCBiZSByZWZsZWN0ZWQgaGVyZSAoYXMgd2UgcGFzcyBieSByZWZlcmVuY2UpXG5cdFx0XHRcdFx0b1JlZnJlc2hCaW5kaW5nSGFuZGxlcltcInJlZnJlc2hCaW5kaW5nXCJdID0gX21Db250cm9sU3RhdGVIYW5kbGVyTWFwW3NUeXBlXS5yZWZyZXNoQmluZGluZyB8fCB7fTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyKG9Db250cm9sLCBvUmVmcmVzaEJpbmRpbmdIYW5kbGVyKTtcblx0XHRyZXR1cm4gb1JlZnJlc2hCaW5kaW5nSGFuZGxlcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDdXN0b21pemUgdGhlIDxjb2RlPnJlZnJlc2hCaW5kaW5nPC9jb2RlPiBmdW5jdGlvbiBmb3IgYSBjZXJ0YWluIGNvbnRyb2wuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udHJvbCBUaGUgY29udHJvbCBmb3Igd2hpY2ggdGhlIHJlZnJlc2ggaGFuZGxlciBpcyBhZGFwdGVkLlxuXHQgKiBAcGFyYW0gb0NvbnRyb2xIYW5kbGVyIEEgcGxhaW4gb2JqZWN0IHdoaWNoIGNhbiBoYXZlIG9uZSBmdW5jdGlvbjogPGNvZGU+cmVmcmVzaEJpbmRpbmc8L2NvZGU+XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYWRhcHRCaW5kaW5nUmVmcmVzaEhhbmRsZXJcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyKG9Db250cm9sOiBNYW5hZ2VkT2JqZWN0LCBvQ29udHJvbEhhbmRsZXI6IGFueVtdKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIHN1c3BlbmRlZCBkdWUgdG8ga2VlcC1hbGl2ZSBtb2RlLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uU3VzcGVuZFxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uU3VzcGVuZCgpIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgcmVzdG9yZWQgZHVlIHRvIGtlZXAtYWxpdmUgbW9kZS5cblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNvblJlc3RvcmVcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJlc3RvcmUoKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHQvKipcblx0ICogRGVzdHJ1Y3RvciBtZXRob2QgZm9yIG9iamVjdHMuXG5cdCAqL1xuXHRkZXN0cm95KCkge1xuXHRcdGRlbGV0ZSB0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmU7XG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhlbHBlciBmdW5jdGlvbiB0byBlbmFibGUgbXVsdGkgb3ZlcnJpZGUuIEl0IGlzIGFkZGluZyBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciAoYXJyYXkpIHRvIHRoZSBwcm92aWRlZFxuXHQgKiBmdW5jdGlvbiAoYW5kIGl0cyBwYXJhbWV0ZXJzKSwgdGhhdCB3aWxsIGJlIGV2YWx1YXRlZCB2aWEgPGNvZGU+UHJvbWlzZS5hbGw8L2NvZGU+LlxuXHQgKlxuXHQgKiBAcGFyYW0gZm5DYWxsIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIGFyZ3Ncblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdCBvZiBhbGwgb3ZlcnJpZGVzXG5cdCAqL1xuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGNvbGxlY3RSZXN1bHRzKGZuQ2FsbDogRnVuY3Rpb24sIC4uLmFyZ3M6IGFueVtdKSB7XG5cdFx0Y29uc3QgYVJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0YXJncy5wdXNoKGFSZXN1bHRzKTtcblx0XHRmbkNhbGwuYXBwbHkodGhpcywgYXJncyk7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXN1bHRzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDdXN0b21pemUgdGhlIDxjb2RlPnJldHJpZXZlPC9jb2RlPiBhbmQgPGNvZGU+YXBwbHk8L2NvZGU+IGZ1bmN0aW9ucyBmb3IgYSBjZXJ0YWluIGNvbnRyb2wuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udHJvbCBUaGUgY29udHJvbCB0byBnZXQgc3RhdGUgaGFuZGxlciBmb3Jcblx0ICogQHBhcmFtIGFDb250cm9sSGFuZGxlciBBIGxpc3Qgb2YgcGxhaW4gb2JqZWN0cyB3aXRoIHR3byBmdW5jdGlvbnM6IDxjb2RlPnJldHJpZXZlPC9jb2RlPiBhbmQgPGNvZGU+YXBwbHk8L2NvZGU+XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYWRhcHRDb250cm9sU3RhdGVIYW5kbGVyXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRhZGFwdENvbnRyb2xTdGF0ZUhhbmRsZXIob0NvbnRyb2w6IE1hbmFnZWRPYmplY3QsIGFDb250cm9sSGFuZGxlcjogb2JqZWN0W10pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuIGlmIG5lZWRlZFxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBtYXAgb2YgPGNvZGU+cmV0cmlldmU8L2NvZGU+IGFuZCA8Y29kZT5hcHBseTwvY29kZT4gZnVuY3Rpb25zIGZvciBhIGNlcnRhaW4gY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250cm9sIFRoZSBjb250cm9sIHRvIGdldCBzdGF0ZSBoYW5kbGVyIGZvclxuXHQgKiBAcmV0dXJucyBBIHBsYWluIG9iamVjdCB3aXRoIHR3byBmdW5jdGlvbnM6IDxjb2RlPnJldHJpZXZlPC9jb2RlPiBhbmQgPGNvZGU+YXBwbHk8L2NvZGU+XG5cdCAqL1xuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldENvbnRyb2xTdGF0ZUhhbmRsZXIob0NvbnRyb2w6IGFueSkge1xuXHRcdGNvbnN0IGFJbnRlcm5hbENvbnRyb2xTdGF0ZUhhbmRsZXIgPSBbXSxcblx0XHRcdGFDdXN0b21Db250cm9sU3RhdGVIYW5kbGVyOiBhbnlbXSA9IFtdO1xuXHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0Zm9yIChjb25zdCBzVHlwZSBpbiBfbUNvbnRyb2xTdGF0ZUhhbmRsZXJNYXApIHtcblx0XHRcdFx0aWYgKG9Db250cm9sLmlzQShzVHlwZSkpIHtcblx0XHRcdFx0XHQvLyBhdm9pZCBkaXJlY3QgbWFuaXB1bGF0aW9uIG9mIGludGVybmFsIF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcFxuXHRcdFx0XHRcdGFJbnRlcm5hbENvbnRyb2xTdGF0ZUhhbmRsZXIucHVzaChPYmplY3QuYXNzaWduKHt9LCBfbUNvbnRyb2xTdGF0ZUhhbmRsZXJNYXBbc1R5cGVdKSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5iYXNlLnZpZXdTdGF0ZS5hZGFwdENvbnRyb2xTdGF0ZUhhbmRsZXIob0NvbnRyb2wsIGFDdXN0b21Db250cm9sU3RhdGVIYW5kbGVyKTtcblx0XHRyZXR1cm4gYUludGVybmFsQ29udHJvbFN0YXRlSGFuZGxlci5jb25jYXQoYUN1c3RvbUNvbnRyb2xTdGF0ZUhhbmRsZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGFkZCBhbGwgY29udHJvbHMgZm9yIGdpdmVuIHZpZXcgdGhhdCBzaG91bGQgYmUgY29uc2lkZXJlZCBmb3IgdGhlIHN0YXRlIGhhbmRsaW5nIHRvIHRoZSBwcm92aWRlZCBjb250cm9sIGFycmF5LlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gYUNvbGxlY3RlZENvbnRyb2xzIFRoZSBjb2xsZWN0ZWQgY29udHJvbHNcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhZGFwdFN0YXRlQ29udHJvbHNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFkYXB0U3RhdGVDb250cm9scyhhQ29sbGVjdGVkQ29udHJvbHM6IE1hbmFnZWRPYmplY3RbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUga2V5IHRvIGJlIHVzZWQgZm9yIGdpdmVuIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udHJvbCBUaGUgY29udHJvbCB0byBnZXQgc3RhdGUga2V5IGZvclxuXHQgKiBAcmV0dXJucyBUaGUga2V5IHRvIGJlIHVzZWQgZm9yIHN0b3JpbmcgdGhlIGNvbnRyb2xzIHN0YXRlXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0U3RhdGVLZXkob0NvbnRyb2w6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRMb2NhbElkKG9Db250cm9sLmdldElkKCkpIHx8IG9Db250cm9sLmdldElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIHZpZXcgc3RhdGUgb2YgdGhpcyBleHRlbnNpb25zIHZpZXcuXG5cdCAqIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgYmVmb3JlIGZpbmlzaGluZywgYWxsIGJ1dCB0aGUgZmluYWwgcmVzcG9uc2Ugd2lsbCByZXNvbHZlIHRvIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4uXG5cdCAqXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSByZXNvbHZpbmcgdGhlIHZpZXcgc3RhdGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNyZXRyaWV2ZVZpZXdTdGF0ZVxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgcmV0cmlldmVWaWV3U3RhdGUoKSB7XG5cdFx0Kyt0aGlzLl9pUmV0cmlldmluZ1N0YXRlQ291bnRlcjtcblx0XHRsZXQgb1ZpZXdTdGF0ZTogYW55O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuX3BJbml0aWFsU3RhdGVBcHBsaWVkO1xuXHRcdFx0Y29uc3QgYUNvbnRyb2xzOiAoTWFuYWdlZE9iamVjdCB8IHVuZGVmaW5lZClbXSA9IGF3YWl0IHRoaXMuY29sbGVjdFJlc3VsdHModGhpcy5iYXNlLnZpZXdTdGF0ZS5hZGFwdFN0YXRlQ29udHJvbHMpO1xuXHRcdFx0Y29uc3QgYVJlc29sdmVkU3RhdGVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdGFDb250cm9sc1xuXHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9Db250cm9sOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29udHJvbCAmJiBvQ29udHJvbC5pc0EgJiYgb0NvbnRyb2wuaXNBKFwic2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdFwiKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5tYXAoKG9Db250cm9sOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnJldHJpZXZlQ29udHJvbFN0YXRlKG9Db250cm9sKS50aGVuKCh2UmVzdWx0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRrZXk6IHRoaXMuZ2V0U3RhdGVLZXkob0NvbnRyb2wpLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiB2UmVzdWx0XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHRcdG9WaWV3U3RhdGUgPSBhUmVzb2x2ZWRTdGF0ZXMucmVkdWNlKGZ1bmN0aW9uIChvU3RhdGVzOiBhbnksIG1TdGF0ZTogYW55KSB7XG5cdFx0XHRcdGNvbnN0IG9DdXJyZW50U3RhdGU6IGFueSA9IHt9O1xuXHRcdFx0XHRvQ3VycmVudFN0YXRlW21TdGF0ZS5rZXldID0gbVN0YXRlLnZhbHVlO1xuXHRcdFx0XHRyZXR1cm4gbWVyZ2VPYmplY3RzKG9TdGF0ZXMsIG9DdXJyZW50U3RhdGUpO1xuXHRcdFx0fSwge30pO1xuXHRcdFx0Y29uc3QgbUFkZGl0aW9uYWxTdGF0ZXMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUodGhpcy5fcmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzKCkpO1xuXHRcdFx0aWYgKG1BZGRpdGlvbmFsU3RhdGVzICYmIE9iamVjdC5rZXlzKG1BZGRpdGlvbmFsU3RhdGVzKS5sZW5ndGgpIHtcblx0XHRcdFx0b1ZpZXdTdGF0ZVtBRERJVElPTkFMX1NUQVRFU19LRVldID0gbUFkZGl0aW9uYWxTdGF0ZXM7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdC0tdGhpcy5faVJldHJpZXZpbmdTdGF0ZUNvdW50ZXI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyID09PSAwID8gb1ZpZXdTdGF0ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeHRlbmQgdGhlIG1hcCBvZiBhZGRpdGlvbmFsIHN0YXRlcyAobm90IGNvbnRyb2wgYm91bmQpIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUgb2YgdGhlIGdpdmVuIHZpZXcuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBtQWRkaXRpb25hbFN0YXRlcyBUaGUgYWRkaXRpb25hbCBzdGF0ZVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI3JldHJpZXZlQWRkaXRpb25hbFN0YXRlc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzKG1BZGRpdGlvbmFsU3RhdGVzOiBvYmplY3QpIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuIGlmIG5lZWRlZFxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBtYXAgb2YgYWRkaXRpb25hbCBzdGF0ZXMgKG5vdCBjb250cm9sIGJvdW5kKSB0byBiZSBhZGRlZCB0byB0aGUgY3VycmVudCB2aWV3IHN0YXRlIG9mIHRoZSBnaXZlbiB2aWV3LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBBZGRpdGlvbmFsIHZpZXcgc3RhdGVzXG5cdCAqL1xuXHRfcmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzKCkge1xuXHRcdGNvbnN0IG1BZGRpdGlvbmFsU3RhdGVzID0ge307XG5cdFx0dGhpcy5iYXNlLnZpZXdTdGF0ZS5yZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXMobUFkZGl0aW9uYWxTdGF0ZXMpO1xuXHRcdHJldHVybiBtQWRkaXRpb25hbFN0YXRlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIGZvciB0aGUgZ2l2ZW4gY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250cm9sIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBzdGF0ZSBmb3Jcblx0ICogQHJldHVybnMgVGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gY29udHJvbFxuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRyZXRyaWV2ZUNvbnRyb2xTdGF0ZShvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3QgYUNvbnRyb2xTdGF0ZUhhbmRsZXJzID0gdGhpcy5nZXRDb250cm9sU3RhdGVIYW5kbGVyKG9Db250cm9sKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRhQ29udHJvbFN0YXRlSGFuZGxlcnMubWFwKChtQ29udHJvbFN0YXRlSGFuZGxlcjogYW55KSA9PiB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbUNvbnRyb2xTdGF0ZUhhbmRsZXIucmV0cmlldmUgIT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgY29udHJvbFN0YXRlSGFuZGxlci5yZXRyaWV2ZSBpcyBub3QgYSBmdW5jdGlvbiBmb3IgY29udHJvbDogJHtvQ29udHJvbC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKX1gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbUNvbnRyb2xTdGF0ZUhhbmRsZXIucmV0cmlldmUuY2FsbCh0aGlzLCBvQ29udHJvbCk7XG5cdFx0XHR9KVxuXHRcdCkudGhlbigoYVN0YXRlczogYW55W10pID0+IHtcblx0XHRcdHJldHVybiBhU3RhdGVzLnJlZHVjZShmdW5jdGlvbiAob0ZpbmFsU3RhdGU6IGFueSwgb0N1cnJlbnRTdGF0ZTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBtZXJnZU9iamVjdHMob0ZpbmFsU3RhdGUsIG9DdXJyZW50U3RhdGUpO1xuXHRcdFx0fSwge30pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgd2hldGhlciB0aGUgdmlldyBzdGF0ZSBzaG91bGQgb25seSBiZSBhcHBsaWVkIG9uY2UgaW5pdGlhbGx5LlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZH0uXG5cdCAqXG5cdCAqIEltcG9ydGFudDpcblx0ICogWW91IHNob3VsZCBvbmx5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBjdXN0b20gcGFnZXMgYW5kIG5vdCBmb3IgdGhlIHN0YW5kYXJkIExpc3RSZXBvcnRQYWdlIGFuZCBPYmplY3RQYWdlIVxuXHQgKlxuXHQgKiBAcmV0dXJucyBJZiA8Y29kZT50cnVlPC9jb2RlPiwgb25seSB0aGUgaW5pdGlhbCB2aWV3IHN0YXRlIGlzIGFwcGxpZWQgb25jZSxcblx0ICogZWxzZSBhbnkgbmV3IHZpZXcgc3RhdGUgaXMgYWxzbyBhcHBsaWVkIG9uIGZvbGxvdy11cCBjYWxscyAoZGVmYXVsdClcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseUluaXRpYWxTdGF0ZU9ubHlcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdGFwcGx5SW5pdGlhbFN0YXRlT25seSgpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBsaWVzIHRoZSBnaXZlbiB2aWV3IHN0YXRlIHRvIHRoaXMgZXh0ZW5zaW9ucyB2aWV3LlxuXHQgKlxuXHQgKiBAcGFyYW0gb1ZpZXdTdGF0ZSBUaGUgdmlldyBzdGF0ZSB0byBhcHBseSAoY2FuIGJlIHVuZGVmaW5lZClcblx0ICogQHBhcmFtIG9OYXZQYXJhbWV0ZXIgVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIG9OYXZQYXJhbWV0ZXIubmF2aWdhdGlvblR5cGUgVGhlIGFjdHVhbCBuYXZpZ2F0aW9uIHR5cGVcblx0ICogQHBhcmFtIG9OYXZQYXJhbWV0ZXIuc2VsZWN0aW9uVmFyaWFudCBUaGUgc2VsZWN0aW9uVmFyaWFudCBmcm9tIHRoZSBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBvTmF2UGFyYW1ldGVyLnNlbGVjdGlvblZhcmlhbnREZWZhdWx0cyBUaGUgc2VsZWN0aW9uVmFyaWFudCBkZWZhdWx0cyBmcm9tIHRoZSBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBvTmF2UGFyYW1ldGVyLnJlcXVpcmVzU3RhbmRhcmRWYXJpYW50IERlZmluZXMgd2hldGhlciB0aGUgc3RhbmRhcmQgdmFyaWFudCBtdXN0IGJlIHVzZWQgaW4gdmFyaWFudCBtYW5hZ2VtZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgZm9yIGFzeW5jIHN0YXRlIGhhbmRsaW5nXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYXBwbHlWaWV3U3RhdGVcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGFwcGx5Vmlld1N0YXRlKG9WaWV3U3RhdGU6IGFueSwgb05hdlBhcmFtZXRlcjogTmF2aWdhdGlvblBhcmFtZXRlcik6IFByb21pc2U8YW55PiB7XG5cdFx0aWYgKHRoaXMuYmFzZS52aWV3U3RhdGUuYXBwbHlJbml0aWFsU3RhdGVPbmx5KCkgJiYgdGhpcy5fZ2V0SW5pdGlhbFN0YXRlQXBwbGllZCgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuY29sbGVjdFJlc3VsdHModGhpcy5iYXNlLnZpZXdTdGF0ZS5vbkJlZm9yZVN0YXRlQXBwbGllZCk7XG5cdFx0XHRjb25zdCBhQ29udHJvbHM6IE1hbmFnZWRPYmplY3RbXSA9IGF3YWl0IHRoaXMuY29sbGVjdFJlc3VsdHModGhpcy5iYXNlLnZpZXdTdGF0ZS5hZGFwdFN0YXRlQ29udHJvbHMpO1xuXHRcdFx0dGhpcy52aWV3U3RhdGVDb250cm9scyA9IGFDb250cm9scztcblx0XHRcdGxldCBvUHJvbWlzZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRsZXQgaGFzVmFyaWFudE1hbmFnZW1lbnQgPSBmYWxzZTtcblx0XHRcdC8qKlxuXHRcdFx0ICogdGhpcyBlbnN1cmVzIHRoYXQgdmFyaWFudE1hbmFnZW1lbnQgY29udHJvbCBpcyBhcHBsaWVkIGZpcnN0IHRvIGNhbGN1bGF0ZSBpbml0aWFsIHN0YXRlIGZvciBkZWx0YSBsb2dpY1xuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBzb3J0ZWRBZGFwdFN0YXRlQ29udHJvbHMgPSBhQ29udHJvbHMucmVkdWNlKChtb2RpZmllZENvbnRyb2xzOiBNYW5hZ2VkT2JqZWN0W10sIGNvbnRyb2wpID0+IHtcblx0XHRcdFx0aWYgKCFjb250cm9sKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG1vZGlmaWVkQ29udHJvbHM7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgaXNWYXJpYW50TWFuYWdlbWVudENvbnRyb2wgPSBjb250cm9sLmlzQShcInNhcC51aS5mbC52YXJpYW50cy5WYXJpYW50TWFuYWdlbWVudFwiKTtcblx0XHRcdFx0aWYgKCFoYXNWYXJpYW50TWFuYWdlbWVudCkge1xuXHRcdFx0XHRcdGhhc1ZhcmlhbnRNYW5hZ2VtZW50ID0gaXNWYXJpYW50TWFuYWdlbWVudENvbnRyb2w7XG5cdFx0XHRcdH1cblx0XHRcdFx0bW9kaWZpZWRDb250cm9scyA9IGlzVmFyaWFudE1hbmFnZW1lbnRDb250cm9sID8gW2NvbnRyb2wsIC4uLm1vZGlmaWVkQ29udHJvbHNdIDogWy4uLm1vZGlmaWVkQ29udHJvbHMsIGNvbnRyb2xdO1xuXHRcdFx0XHRyZXR1cm4gbW9kaWZpZWRDb250cm9scztcblx0XHRcdH0sIFtdKTtcblxuXHRcdFx0Ly8gSW4gY2FzZSBvZiBubyBWYXJpYW50IE1hbmFnZW1lbnQsIHRoaXMgZW5zdXJlcyB0aGF0IGluaXRpYWwgc3RhdGVzIGlzIHNldFxuXHRcdFx0aWYgKCFoYXNWYXJpYW50TWFuYWdlbWVudCkge1xuXHRcdFx0XHR0aGlzLl9zZXRJbml0aWFsU3RhdGVzRm9yRGVsdGFDb21wdXRlKCk7XG5cdFx0XHR9XG5cblx0XHRcdHNvcnRlZEFkYXB0U3RhdGVDb250cm9sc1xuXHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvQ29udHJvbCkge1xuXHRcdFx0XHRcdHJldHVybiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZm9yRWFjaCgob0NvbnRyb2wpID0+IHtcblx0XHRcdFx0XHRjb25zdCBzS2V5ID0gdGhpcy5nZXRTdGF0ZUtleShvQ29udHJvbCk7XG5cdFx0XHRcdFx0b1Byb21pc2VDaGFpbiA9IG9Qcm9taXNlQ2hhaW4udGhlbihcblx0XHRcdFx0XHRcdHRoaXMuYXBwbHlDb250cm9sU3RhdGUuYmluZCh0aGlzLCBvQ29udHJvbCwgb1ZpZXdTdGF0ZSA/IG9WaWV3U3RhdGVbc0tleV0gOiB1bmRlZmluZWQsIG9OYXZQYXJhbWV0ZXIpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdGF3YWl0IG9Qcm9taXNlQ2hhaW47XG5cdFx0XHRpZiAob05hdlBhcmFtZXRlci5uYXZpZ2F0aW9uVHlwZSA9PT0gTmF2VHlwZS5pQXBwU3RhdGUpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5jb2xsZWN0UmVzdWx0cyhcblx0XHRcdFx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLmFwcGx5QWRkaXRpb25hbFN0YXRlcyxcblx0XHRcdFx0XHRvVmlld1N0YXRlID8gb1ZpZXdTdGF0ZVtBRERJVElPTkFMX1NUQVRFU19LRVldIDogdW5kZWZpbmVkXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYXBwbHlOYXZpZ2F0aW9uUGFyYW1ldGVycywgb05hdlBhcmFtZXRlcik7XG5cdFx0XHRcdGF3YWl0IHRoaXMuY29sbGVjdFJlc3VsdHModGhpcy5iYXNlLnZpZXdTdGF0ZS5fYXBwbHlOYXZpZ2F0aW9uUGFyYW1ldGVyc1RvRmlsdGVyYmFyLCBvTmF2UGFyYW1ldGVyKTtcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5jb2xsZWN0UmVzdWx0cyh0aGlzLmJhc2Uudmlld1N0YXRlLm9uQWZ0ZXJTdGF0ZUFwcGxpZWQpO1xuXHRcdFx0XHR0aGlzLl9zZXRJbml0aWFsU3RhdGVBcHBsaWVkKCk7XG5cdFx0XHR9IGNhdGNoIChlOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0X2NoZWNrSWZWYXJpYW50SWRJc0F2YWlsYWJsZShvVk06IGFueSwgc1ZhcmlhbnRJZDogYW55KSB7XG5cdFx0Y29uc3QgYVZhcmlhbnRzID0gb1ZNLmdldFZhcmlhbnRzKCk7XG5cdFx0bGV0IGJJc0NvbnRyb2xTdGF0ZVZhcmlhbnRBdmFpbGFibGUgPSBmYWxzZTtcblx0XHRhVmFyaWFudHMuZm9yRWFjaChmdW5jdGlvbiAob1ZhcmlhbnQ6IGFueSkge1xuXHRcdFx0aWYgKG9WYXJpYW50LmtleSA9PT0gc1ZhcmlhbnRJZCkge1xuXHRcdFx0XHRiSXNDb250cm9sU3RhdGVWYXJpYW50QXZhaWxhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gYklzQ29udHJvbFN0YXRlVmFyaWFudEF2YWlsYWJsZTtcblx0fVxuXG5cdF9zZXRJbml0aWFsU3RhdGVBcHBsaWVkKCkge1xuXHRcdGlmICh0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUpIHtcblx0XHRcdGNvbnN0IHBJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZSA9IHRoaXMuX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZTtcblx0XHRcdGRlbGV0ZSB0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmU7XG5cdFx0XHRwSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0SW5pdGlhbFN0YXRlQXBwbGllZCgpIHtcblx0XHRyZXR1cm4gIXRoaXMuX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIb29rIHRvIHJlYWN0IGJlZm9yZSBhIHN0YXRlIGZvciBnaXZlbiB2aWV3IGlzIGFwcGxpZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uQmVmb3JlU3RhdGVBcHBsaWVkXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZVN0YXRlQXBwbGllZChhUHJvbWlzZXM6IFByb21pc2U8YW55Pikge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgdG8gcmVhY3Qgd2hlbiBzdGF0ZSBmb3IgZ2l2ZW4gdmlldyB3YXMgYXBwbGllZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIGFQcm9taXNlcyBFeHRlbnNpYmxlIGFycmF5IG9mIHByb21pc2VzIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjb25BZnRlclN0YXRlQXBwbGllZFxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25BZnRlclN0YXRlQXBwbGllZChhUHJvbWlzZXM6IFByb21pc2U8YW55Pikge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGx5aW5nIGFkZGl0aW9uYWwsIG5vdCBjb250cm9sIHJlbGF0ZWQsIHN0YXRlcyAtIGlzIGNhbGxlZCBvbmx5IGlmIG5hdmlnYXRpb24gdHlwZSBpcyBpQXBwU3RhdGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvVmlld1N0YXRlIFRoZSBjdXJyZW50IHZpZXcgc3RhdGVcblx0ICogQHBhcmFtIGFQcm9taXNlcyBFeHRlbnNpYmxlIGFycmF5IG9mIHByb21pc2VzIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYXBwbHlBZGRpdGlvbmFsU3RhdGVzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRhcHBseUFkZGl0aW9uYWxTdGF0ZXMob1ZpZXdTdGF0ZTogb2JqZWN0LCBhUHJvbWlzZXM6IFByb21pc2U8YW55Pikge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdF9hcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzVG9GaWx0ZXJiYXIoXG5cdFx0X29OYXZQYXJhbWV0ZXI6IHtcblx0XHRcdG5hdmlnYXRpb25UeXBlOiBhbnk7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50Pzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudERlZmF1bHRzPzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0cmVxdWlyZXNTdGFuZGFyZFZhcmlhbnQ/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdH0sXG5cdFx0X2FQcm9taXNlczogUHJvbWlzZTxhbnk+XG5cdCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogQXBwbHkgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGlzIG5vdCBjYWxsZWQgaWYgdGhlIG5hdmlnYXRpb24gdHlwZSBpcyBpQXBwU3RhdGVcblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIG9OYXZQYXJhbWV0ZXIgVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIG9OYXZQYXJhbWV0ZXIubmF2aWdhdGlvblR5cGUgVGhlIGFjdHVhbCBuYXZpZ2F0aW9uIHR5cGVcblx0ICogQHBhcmFtIFtvTmF2UGFyYW1ldGVyLnNlbGVjdGlvblZhcmlhbnRdIFRoZSBzZWxlY3Rpb25WYXJpYW50IGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIFtvTmF2UGFyYW1ldGVyLnNlbGVjdGlvblZhcmlhbnREZWZhdWx0c10gVGhlIHNlbGVjdGlvblZhcmlhbnQgZGVmYXVsdHMgZnJvbSB0aGUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gW29OYXZQYXJhbWV0ZXIucmVxdWlyZXNTdGFuZGFyZFZhcmlhbnRdIERlZmluZXMgd2hldGhlciB0aGUgc3RhbmRhcmQgdmFyaWFudCBtdXN0IGJlIHVzZWQgaW4gdmFyaWFudCBtYW5hZ2VtZW50XG5cdCAqIEBwYXJhbSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FwcGx5TmF2aWdhdGlvblBhcmFtZXRlcnNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzKFxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0XHRvTmF2UGFyYW1ldGVyOiB7XG5cdFx0XHRuYXZpZ2F0aW9uVHlwZTogYW55O1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudD86IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnREZWZhdWx0cz86IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHRcdHJlcXVpcmVzU3RhbmRhcmRWYXJpYW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0XHR9LFxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0XHRhUHJvbWlzZXM6IFByb21pc2U8YW55PlxuXHQpIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuIGlmIG5lZWRlZFxuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGx5aW5nIHRoZSBnaXZlbiBzdGF0ZSB0byB0aGUgZ2l2ZW4gY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250cm9sIFRoZSBvYmplY3QgdG8gYXBwbHkgdGhlIGdpdmVuIHN0YXRlXG5cdCAqIEBwYXJhbSBvQ29udHJvbFN0YXRlIFRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIGNvbnRyb2xcblx0ICogQHBhcmFtIFtvTmF2UGFyYW1ldGVyc10gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFJldHVybiBhIHByb21pc2UgZm9yIGFzeW5jIHN0YXRlIGhhbmRsaW5nXG5cdCAqL1xuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFwcGx5Q29udHJvbFN0YXRlKG9Db250cm9sOiBhbnksIG9Db250cm9sU3RhdGU6IG9iamVjdCwgb05hdlBhcmFtZXRlcnM/OiBvYmplY3QpIHtcblx0XHRjb25zdCBhQ29udHJvbFN0YXRlSGFuZGxlcnMgPSB0aGlzLmdldENvbnRyb2xTdGF0ZUhhbmRsZXIob0NvbnRyb2wpO1xuXHRcdGxldCBvUHJvbWlzZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0YUNvbnRyb2xTdGF0ZUhhbmRsZXJzLmZvckVhY2goKG1Db250cm9sU3RhdGVIYW5kbGVyOiBhbnkpID0+IHtcblx0XHRcdGlmICh0eXBlb2YgbUNvbnRyb2xTdGF0ZUhhbmRsZXIuYXBwbHkgIT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYGNvbnRyb2xTdGF0ZUhhbmRsZXIuYXBwbHkgaXMgbm90IGEgZnVuY3Rpb24gZm9yIGNvbnRyb2w6ICR7b0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCl9YCk7XG5cdFx0XHR9XG5cdFx0XHRvUHJvbWlzZUNoYWluID0gb1Byb21pc2VDaGFpbi50aGVuKG1Db250cm9sU3RhdGVIYW5kbGVyLmFwcGx5LmJpbmQodGhpcywgb0NvbnRyb2wsIG9Db250cm9sU3RhdGUsIG9OYXZQYXJhbWV0ZXJzKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG9Qcm9taXNlQ2hhaW47XG5cdH1cblxuXHRnZXRJbnRlcmZhY2UoKSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvLyBtZXRob2QgdG8gZ2V0IHRoZSBjb250cm9sIHN0YXRlIGZvciBtZGMgY29udHJvbHMgYXBwbHlpbmcgdGhlIGRlbHRhIGxvZ2ljXG5cdF9nZXRDb250cm9sU3RhdGUoY29udHJvbFN0YXRlS2V5OiBzdHJpbmcsIGNvbnRyb2xTdGF0ZTogQ29udHJvbFN0YXRlKSB7XG5cdFx0Y29uc3QgaW5pdGlhbENvbnRyb2xTdGF0ZXNNYXBwZXIgPSB0aGlzLmluaXRpYWxDb250cm9sU3RhdGVzTWFwcGVyO1xuXHRcdGlmIChPYmplY3Qua2V5cyhpbml0aWFsQ29udHJvbFN0YXRlc01hcHBlcikubGVuZ3RoID4gMCAmJiBpbml0aWFsQ29udHJvbFN0YXRlc01hcHBlcltjb250cm9sU3RhdGVLZXldKSB7XG5cdFx0XHRpZiAoT2JqZWN0LmtleXMoaW5pdGlhbENvbnRyb2xTdGF0ZXNNYXBwZXJbY29udHJvbFN0YXRlS2V5XSBhcyBvYmplY3QpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRpbml0aWFsQ29udHJvbFN0YXRlc01hcHBlcltjb250cm9sU3RhdGVLZXldID0geyAuLi5jb250cm9sU3RhdGUgfTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB7IGZ1bGxTdGF0ZTogY29udHJvbFN0YXRlLCBpbml0aWFsU3RhdGU6IGluaXRpYWxDb250cm9sU3RhdGVzTWFwcGVyW2NvbnRyb2xTdGF0ZUtleV0gfTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbnRyb2xTdGF0ZTtcblx0fVxuXG5cdC8vbWV0aG9kIHRvIHN0b3JlIHRoZSBpbml0aWFsIHN0YXRlcyBmb3IgZGVsdGEgY29tcHV0YXRpb24gb2YgbWRjIGNvbnRyb2xzXG5cdF9zZXRJbml0aWFsU3RhdGVzRm9yRGVsdGFDb21wdXRlID0gYXN5bmMgKHZhcmlhbnRNYW5hZ2VtZW50PzogVmFyaWFudE1hbmFnZW1lbnQpID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgYWRhcHRDb250cm9scyA9IHRoaXMudmlld1N0YXRlQ29udHJvbHM7XG5cblx0XHRcdGNvbnN0IGV4dGVybmFsU3RhdGVQcm9taXNlczogUHJvbWlzZTxvYmplY3Q+W10gPSBbXTtcblx0XHRcdGNvbnN0IGNvbnRyb2xTdGF0ZUtleTogc3RyaW5nW10gPSBbXTtcblx0XHRcdGxldCBpbml0aWFsQ29udHJvbFN0YXRlczogb2JqZWN0W10gPSBbXTtcblx0XHRcdGNvbnN0IHZhcmlhbnRDb250cm9sczogc3RyaW5nW10gPSB2YXJpYW50TWFuYWdlbWVudD8uZ2V0Rm9yKCkgPz8gW107XG5cblx0XHRcdGFkYXB0Q29udHJvbHNcblx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAoY29udHJvbCkge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRjb250cm9sICYmXG5cdFx0XHRcdFx0XHQoIXZhcmlhbnRNYW5hZ2VtZW50IHx8IHZhcmlhbnRDb250cm9scy5pbmRleE9mKGNvbnRyb2wuZ2V0SWQoKSkgPiAtMSkgJiZcblx0XHRcdFx0XHRcdChjb250cm9sLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikgfHxcblx0XHRcdFx0XHRcdFx0KGNvbnRyb2wgYXMgQmFzZU9iamVjdCkuaXNBKFwic2FwLnVpLm1kYy5GaWx0ZXJCYXJcIikgfHxcblx0XHRcdFx0XHRcdFx0KGNvbnRyb2wgYXMgQmFzZU9iamVjdCkuaXNBKFwic2FwLnVpLm1kYy5DaGFydFwiKSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuXHRcdFx0XHRcdGlmICh2YXJpYW50TWFuYWdlbWVudCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnNUb1ZhcmlhbnRNYW5hZ2VtZW50KHZhcmlhbnRNYW5hZ2VtZW50LCB2YXJpYW50Q29udHJvbHMpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGV4dGVybmFsU3RhdGVQcm9taXNlID0gU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShjb250cm9sIGFzIG9iamVjdCk7XG5cdFx0XHRcdFx0ZXh0ZXJuYWxTdGF0ZVByb21pc2VzLnB1c2goZXh0ZXJuYWxTdGF0ZVByb21pc2UpO1xuXHRcdFx0XHRcdGNvbnRyb2xTdGF0ZUtleS5wdXNoKHRoaXMuZ2V0U3RhdGVLZXkoY29udHJvbCkpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0aW5pdGlhbENvbnRyb2xTdGF0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChleHRlcm5hbFN0YXRlUHJvbWlzZXMpO1xuXHRcdFx0aW5pdGlhbENvbnRyb2xTdGF0ZXMuZm9yRWFjaCgoaW5pdGlhbENvbnRyb2xTdGF0ZTogb2JqZWN0LCBpOiBudW1iZXIpID0+IHtcblx0XHRcdFx0dGhpcy5pbml0aWFsQ29udHJvbFN0YXRlc01hcHBlcltjb250cm9sU3RhdGVLZXlbaV1dID0gaW5pdGlhbENvbnRyb2xTdGF0ZTtcblx0XHRcdH0pO1xuXHRcdH0gY2F0Y2ggKGU6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihlIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIEF0dGFjaCBldmVudCB0byBzYXZlIGFuZCBzZWxlY3Qgb2YgVmFyaWFudCBNYW5hZ2VtZW50IHRvIHVwZGF0ZSB0aGUgaW5pdGlhbCBDb250cm9sIFN0YXRlcyBvbiB2YXJpYW50IGNoYW5nZVxuXHRfYWRkRXZlbnRMaXN0ZW5lcnNUb1ZhcmlhbnRNYW5hZ2VtZW50KHZhcmlhbnRNYW5hZ2VtZW50OiBWYXJpYW50TWFuYWdlbWVudCwgdmFyaWFudENvbnRyb2xzOiBzdHJpbmdbXSkge1xuXHRcdGNvbnN0IG9QYXlsb2FkID0geyB2YXJpYW50TWFuYWdlZENvbnRyb2xzOiB2YXJpYW50Q29udHJvbHMgfTtcblx0XHRjb25zdCBmbkV2ZW50ID0gKCkgPT4ge1xuXHRcdFx0dGhpcy5fdXBkYXRlSW5pdGlhbFN0YXRlc09uVmFyaWFudENoYW5nZSh2YXJpYW50Q29udHJvbHMpO1xuXHRcdH07XG5cdFx0dmFyaWFudE1hbmFnZW1lbnQuYXR0YWNoU2F2ZShvUGF5bG9hZCwgZm5FdmVudCwge30pO1xuXHRcdHZhcmlhbnRNYW5hZ2VtZW50LmF0dGFjaFNlbGVjdChvUGF5bG9hZCwgZm5FdmVudCwge30pO1xuXHR9XG5cblx0X3VwZGF0ZUluaXRpYWxTdGF0ZXNPblZhcmlhbnRDaGFuZ2Uodm1Bc3NvY2lhdGVkQ29udHJvbHNUb1Jlc2V0OiBzdHJpbmdbXSkge1xuXHRcdGNvbnN0IGluaXRpYWxDb250cm9sU3RhdGVzTWFwcGVyID0gdGhpcy5pbml0aWFsQ29udHJvbFN0YXRlc01hcHBlcjtcblx0XHRPYmplY3Qua2V5cyhpbml0aWFsQ29udHJvbFN0YXRlc01hcHBlcikuZm9yRWFjaCgoY29udHJvbEtleSkgPT4ge1xuXHRcdFx0Zm9yIChjb25zdCB2bUFzc29jaWF0ZWRjb250cm9sS2V5IG9mIHZtQXNzb2NpYXRlZENvbnRyb2xzVG9SZXNldCkge1xuXHRcdFx0XHRpZiAodm1Bc3NvY2lhdGVkY29udHJvbEtleS5pbmRleE9mKGNvbnRyb2xLZXkpID4gLTEpIHtcblx0XHRcdFx0XHRpbml0aWFsQ29udHJvbFN0YXRlc01hcHBlcltjb250cm9sS2V5XSA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVmlld1N0YXRlO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7O0VBc0JBO0VBQ0E7RUFDQTtFQUNBLE1BQU1BLHFCQUFxQixHQUFHLG1CQUFtQjtJQUNoREMsT0FBTyxHQUFHQyxVQUFVLENBQUNELE9BQU87O0VBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7RUF5Q0E7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