@scion/workbench 18.0.0-beta.1 → 18.0.0-beta.10

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 (275) hide show
  1. package/_index.scss +7 -5
  2. package/design/_workbench-global-styles.scss +18 -0
  3. package/design/_workbench-icon-font.scss +1 -1
  4. package/design/_workbench-popup-global-styles.scss +1 -1
  5. package/design/{_workbench-view-drag-image-global-styles.scss → _workbench-view-global-styles.scss} +1 -2
  6. package/esm2022/lib/common/class-list.mjs +67 -29
  7. package/esm2022/lib/common/math.util.mjs +16 -0
  8. package/esm2022/lib/common/objects.util.mjs +7 -1
  9. package/esm2022/lib/common/operators.mjs +1 -12
  10. package/esm2022/lib/common/uid.util.mjs +22 -0
  11. package/esm2022/lib/content-projection/content-as-overlay.component.mjs +85 -28
  12. package/esm2022/lib/content-projection/workbench-element-references.mjs +32 -0
  13. package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +3 -8
  14. package/esm2022/lib/dialog/movable.directive.mjs +3 -3
  15. package/esm2022/lib/dialog/resizable.directive.mjs +3 -3
  16. package/esm2022/lib/dialog/workbench-dialog.component.mjs +25 -23
  17. package/esm2022/lib/dialog/workbench-dialog.mjs +61 -1
  18. package/esm2022/lib/dialog//311/265workbench-dialog.mjs +98 -60
  19. package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +26 -23
  20. package/esm2022/lib/executor/latest-task-executor.mjs +55 -0
  21. package/esm2022/lib/executor/single-task-executor.mjs +9 -19
  22. package/esm2022/lib/filter-field/filter-field.component.mjs +5 -5
  23. package/esm2022/lib/layout/grid-element/grid-element.component.mjs +8 -18
  24. package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +18 -21
  25. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v5.model.mjs +11 -0
  26. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v6.model.mjs +11 -0
  27. package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +4 -4
  28. package/esm2022/lib/layout/migration/workbench-layout-migration-v5.service.mjs +67 -0
  29. package/esm2022/lib/layout/migration/workbench-layout-migration-v6.service.mjs +59 -0
  30. package/esm2022/lib/layout/stringifier.mjs +70 -0
  31. package/esm2022/lib/layout/workbench-layout.component.mjs +18 -22
  32. package/esm2022/lib/layout/workbench-layout.mjs +1 -1
  33. package/esm2022/lib/layout/workbench-layout.model.mjs +1 -1
  34. package/esm2022/lib/layout/workbench-layout.service.mjs +26 -24
  35. package/esm2022/lib/layout/workbench-layouts.util.mjs +1 -9
  36. package/esm2022/lib/layout/workench-layout-serializer.service.mjs +19 -27
  37. package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +3 -2
  38. package/esm2022/lib/layout//311/265workbench-layout.mjs +73 -62
  39. package/esm2022/lib/logging/logging-support.mjs +7 -13
  40. package/esm2022/lib/logging//311/265logger.mjs +10 -10
  41. package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +7 -6
  42. package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +3 -3
  43. package/esm2022/lib/message-box/workbench-message-box.component.mjs +2 -2
  44. package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +3 -2
  45. package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +22 -6
  46. package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +28 -21
  47. package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +3 -3
  48. package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +11 -1
  49. package/esm2022/lib/microfrontend-platform/manifest-object-cache.service.mjs +63 -0
  50. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +5 -4
  51. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +6 -10
  52. package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +18 -9
  53. package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +7 -6
  54. package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +3 -3
  55. package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +15 -13
  56. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +3 -2
  57. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +6 -11
  58. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.mjs +39 -0
  59. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.mjs +120 -0
  60. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.mjs +55 -0
  61. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.mjs +19 -0
  62. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +4 -3
  63. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +11 -12
  64. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +12 -28
  65. package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +3 -3
  66. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +11 -27
  67. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +91 -71
  68. package/esm2022/lib/microfrontend-platform/public_api.mjs +2 -1
  69. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +5 -4
  70. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +18 -16
  71. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +30 -8
  72. package/esm2022/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.mjs +32 -0
  73. package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +26 -8
  74. package/esm2022/lib/notification/notification-list.component.mjs +4 -8
  75. package/esm2022/lib/notification/notification.component.mjs +4 -5
  76. package/esm2022/lib/notification/notification.service.mjs +5 -4
  77. package/esm2022/lib/page-not-found/page-not-found.component.mjs +5 -7
  78. package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +11 -19
  79. package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +4 -4
  80. package/esm2022/lib/part/part-bar/part-bar.component.mjs +333 -264
  81. package/esm2022/lib/part/part-portal.pipe.mjs +8 -8
  82. package/esm2022/lib/part/part.component.mjs +33 -42
  83. package/esm2022/lib/part/view-context-menu/text.component.mjs +16 -12
  84. package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +4 -6
  85. package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +2 -2
  86. package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +48 -49
  87. package/esm2022/lib/part/view-list/view-list.component.mjs +41 -48
  88. package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +22 -26
  89. package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +15 -17
  90. package/esm2022/lib/part/view-tab/view-tab.component.mjs +99 -110
  91. package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +3 -4
  92. package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +16 -17
  93. package/esm2022/lib/part/workbench-part-action.registry.mjs +18 -42
  94. package/esm2022/lib/part/workbench-part.model.mjs +10 -1
  95. package/esm2022/lib/part/workbench-part.registry.mjs +11 -45
  96. package/esm2022/lib/part//311/265workbench-part.model.mjs +71 -55
  97. package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +3 -3
  98. package/esm2022/lib/perspective/workbench-perspective.model.mjs +1 -1
  99. package/esm2022/lib/perspective/workbench-perspective.registry.mjs +11 -43
  100. package/esm2022/lib/perspective/workbench-perspective.service.mjs +71 -62
  101. package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +2 -2
  102. package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +62 -47
  103. package/esm2022/lib/popup/popup.component.mjs +3 -3
  104. package/esm2022/lib/popup/popup.config.mjs +27 -25
  105. package/esm2022/lib/popup/popup.service.mjs +169 -174
  106. package/esm2022/lib/portal/wb-component-portal.mjs +18 -17
  107. package/esm2022/lib/public_api.mjs +1 -1
  108. package/esm2022/lib/registry/workbench-object-registry.mjs +38 -17
  109. package/esm2022/lib/routing/public_api.mjs +2 -2
  110. package/esm2022/lib/routing/routing.model.mjs +1 -1
  111. package/esm2022/lib/routing/routing.util.mjs +215 -0
  112. package/esm2022/lib/routing/workbench-auxiliary-route-installer.service.mjs +110 -0
  113. package/esm2022/lib/routing/workbench-dialog-differ.mjs +3 -3
  114. package/esm2022/lib/routing/workbench-layout-differ.mjs +3 -10
  115. package/esm2022/lib/routing/workbench-message-box-differ.mjs +3 -3
  116. package/esm2022/lib/routing/workbench-navigational-states.mjs +2 -2
  117. package/esm2022/lib/routing/workbench-popup-differ.mjs +3 -3
  118. package/esm2022/lib/routing/workbench-route-guards.mjs +57 -0
  119. package/esm2022/lib/routing/workbench-url-observer.service.mjs +140 -148
  120. package/esm2022/lib/routing/workbench-view-outlet-differ.mjs +58 -0
  121. package/esm2022/lib/routing//311/265workbench-router.service.mjs +119 -74
  122. package/esm2022/lib/startup/splash/splash.component.mjs +3 -3
  123. package/esm2022/lib/startup/workbench-launcher.service.mjs +22 -10
  124. package/esm2022/lib/testing/workbench.provider.mjs +2 -2
  125. package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +15 -19
  126. package/esm2022/lib/view/public_api.mjs +1 -2
  127. package/esm2022/lib/view/view-move-handler.service.mjs +71 -56
  128. package/esm2022/lib/view/view-portal.pipe.mjs +7 -7
  129. package/esm2022/lib/view/view.component.mjs +54 -42
  130. package/esm2022/lib/view/workbench-view.model.mjs +1 -1
  131. package/esm2022/lib/view/workbench-view.registry.mjs +11 -45
  132. package/esm2022/lib/view//311/265workbench-view.model.mjs +183 -153
  133. package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +2 -2
  134. package/esm2022/lib/view-dnd/view-drag.service.mjs +87 -71
  135. package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +6 -6
  136. package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +6 -6
  137. package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +43 -56
  138. package/esm2022/lib/workbench-config.mjs +2 -2
  139. package/esm2022/lib/workbench-id.mjs +3 -3
  140. package/esm2022/lib/workbench.component.mjs +66 -54
  141. package/esm2022/lib/workbench.constants.mjs +1 -5
  142. package/esm2022/lib/workbench.model.mjs +1 -1
  143. package/esm2022/lib/workbench.provider.mjs +3 -9
  144. package/esm2022/lib/workbench.service.mjs +1 -1
  145. package/esm2022/lib//311/265workbench.service.mjs +38 -42
  146. package/fesm2022/scion-workbench.mjs +4054 -3276
  147. package/fesm2022/scion-workbench.mjs.map +1 -1
  148. package/lib/common/class-list.d.ts +35 -22
  149. package/lib/common/math.util.d.ts +7 -0
  150. package/lib/common/objects.util.d.ts +4 -0
  151. package/lib/common/operators.d.ts +1 -6
  152. package/lib/common/uid.util.d.ts +9 -0
  153. package/lib/content-projection/content-as-overlay.component.d.ts +39 -22
  154. package/lib/content-projection/workbench-element-references.d.ts +13 -0
  155. package/lib/dialog/workbench-dialog.component.d.ts +3 -2
  156. package/lib/dialog/workbench-dialog.d.ts +57 -13
  157. package/lib/dialog//311/265workbench-dialog.d.ts +38 -24
  158. package/lib/dialog//311/265workbench-dialog.service.d.ts +10 -11
  159. package/lib/executor/latest-task-executor.d.ts +26 -0
  160. package/lib/executor/single-task-executor.d.ts +5 -8
  161. package/lib/filter-field/filter-field.component.d.ts +1 -1
  162. package/lib/layout/grid-element/grid-element.component.d.ts +1 -8
  163. package/lib/layout/main-area-layout/main-area-layout.component.d.ts +0 -4
  164. package/lib/layout/migration/model/workbench-layout-migration-v5.model.d.ts +36 -0
  165. package/lib/layout/migration/model/workbench-layout-migration-v6.model.d.ts +35 -0
  166. package/lib/layout/migration/workbench-layout-migration-v5.service.d.ts +12 -0
  167. package/lib/layout/migration/workbench-layout-migration-v6.service.d.ts +12 -0
  168. package/lib/layout/stringifier.d.ts +26 -0
  169. package/lib/layout/workbench-layout.component.d.ts +4 -5
  170. package/lib/layout/workbench-layout.d.ts +9 -6
  171. package/lib/layout/workbench-layout.model.d.ts +4 -3
  172. package/lib/layout/workbench-layout.service.d.ts +14 -16
  173. package/lib/layout/workbench-layouts.util.d.ts +0 -6
  174. package/lib/layout/workench-layout-serializer.service.d.ts +13 -16
  175. package/lib/layout//311/265workbench-layout.d.ts +18 -19
  176. package/lib/layout//311/265workbench-layout.factory.d.ts +3 -2
  177. package/lib/logging//311/265logger.d.ts +2 -3
  178. package/lib/microfrontend-platform/common/microfrontend.util.d.ts +5 -1
  179. package/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.d.ts +7 -3
  180. package/lib/microfrontend-platform/manifest-object-cache.service.d.ts +33 -0
  181. package/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.d.ts +3 -6
  182. package/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.d.ts +2 -1
  183. package/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.d.ts +1 -1
  184. package/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.d.ts +2 -1
  185. package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.d.ts +10 -0
  186. package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.d.ts +24 -0
  187. package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.d.ts +20 -0
  188. package/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.d.ts +9 -0
  189. package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.d.ts +4 -8
  190. package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.d.ts +0 -4
  191. package/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.d.ts +5 -12
  192. package/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.d.ts +23 -33
  193. package/lib/microfrontend-platform/public_api.d.ts +1 -0
  194. package/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.d.ts +1 -1
  195. package/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.d.ts +3 -7
  196. package/lib/microfrontend-platform/routing/microfrontend-view-routes.d.ts +9 -2
  197. package/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.d.ts +11 -0
  198. package/lib/notification/notification-list.component.d.ts +0 -2
  199. package/lib/page-not-found/page-not-found.component.d.ts +1 -0
  200. package/lib/part/part-action-bar/part-action-bar.component.d.ts +3 -4
  201. package/lib/part/part-action-bar/part-action.directive.d.ts +2 -2
  202. package/lib/part/part-bar/part-bar.component.d.ts +73 -63
  203. package/lib/part/part-portal.pipe.d.ts +3 -5
  204. package/lib/part/part.component.d.ts +9 -12
  205. package/lib/part/view-context-menu/text.component.d.ts +3 -4
  206. package/lib/part/view-context-menu/view-menu.directive.d.ts +1 -1
  207. package/lib/part/view-context-menu/view-menu.service.d.ts +13 -17
  208. package/lib/part/view-list/view-list.component.d.ts +8 -21
  209. package/lib/part/view-list-button/view-list-button.component.d.ts +8 -11
  210. package/lib/part/view-list-item/view-list-item.component.d.ts +3 -7
  211. package/lib/part/view-tab/view-tab.component.d.ts +19 -29
  212. package/lib/part/view-tab-drag-image/view-tab-drag-image.component.d.ts +4 -4
  213. package/lib/part/workbench-part-action.registry.d.ts +3 -23
  214. package/lib/part/workbench-part.model.d.ts +8 -27
  215. package/lib/part/workbench-part.registry.d.ts +3 -26
  216. package/lib/part//311/265workbench-part.model.d.ts +23 -17
  217. package/lib/perspective/workbench-perspective.model.d.ts +18 -25
  218. package/lib/perspective/workbench-perspective.registry.d.ts +3 -26
  219. package/lib/perspective/workbench-perspective.service.d.ts +16 -14
  220. package/lib/perspective/workench-perspective-serializer.service.d.ts +1 -1
  221. package/lib/perspective//311/265workbench-perspective.model.d.ts +30 -21
  222. package/lib/popup/popup.config.d.ts +11 -10
  223. package/lib/popup/popup.service.d.ts +15 -28
  224. package/lib/portal/wb-component-portal.d.ts +21 -5
  225. package/lib/public_api.d.ts +1 -1
  226. package/lib/registry/workbench-object-registry.d.ts +10 -6
  227. package/lib/routing/public_api.d.ts +2 -2
  228. package/lib/routing/routing.model.d.ts +25 -13
  229. package/lib/routing/{router.util.d.ts → routing.util.d.ts} +28 -1
  230. package/lib/routing/{workbench-auxiliary-routes-registrator.service.d.ts → workbench-auxiliary-route-installer.service.d.ts} +10 -3
  231. package/lib/routing/workbench-layout-differ.d.ts +1 -2
  232. package/lib/routing/workbench-navigational-states.d.ts +8 -4
  233. package/lib/{view/workbench-view-route-guards.d.ts → routing/workbench-route-guards.d.ts} +8 -2
  234. package/lib/routing/workbench-url-observer.service.d.ts +31 -55
  235. package/lib/routing/workbench-view-outlet-differ.d.ts +32 -0
  236. package/lib/routing//311/265workbench-router.service.d.ts +22 -18
  237. package/lib/startup/workbench-launcher.service.d.ts +4 -5
  238. package/lib/testing/workbench.provider.d.ts +3 -1
  239. package/lib/theme/workbench-theme-switcher.service.d.ts +4 -6
  240. package/lib/view/public_api.d.ts +0 -1
  241. package/lib/view/view-move-handler.service.d.ts +16 -14
  242. package/lib/view/view-portal.pipe.d.ts +1 -3
  243. package/lib/view/view.component.d.ts +21 -12
  244. package/lib/view/workbench-view.model.d.ts +88 -36
  245. package/lib/view/workbench-view.registry.d.ts +3 -27
  246. package/lib/view//311/265workbench-view.model.d.ts +62 -71
  247. package/lib/view-dnd/view-drag.service.d.ts +79 -49
  248. package/lib/view-dnd/view-drop-placeholder-renderer.service.d.ts +1 -1
  249. package/lib/view-dnd/view-tab-drag-image-renderer.service.d.ts +12 -36
  250. package/lib/workbench-config.d.ts +19 -7
  251. package/lib/workbench.component.d.ts +16 -30
  252. package/lib/workbench.constants.d.ts +0 -5
  253. package/lib/workbench.model.d.ts +31 -3
  254. package/lib/workbench.service.d.ts +58 -56
  255. package/lib//311/265workbench.service.d.ts +18 -31
  256. package/package.json +5 -5
  257. package/esm2022/lib/common/filter-by-predicate.pipe.mjs +0 -27
  258. package/esm2022/lib/common/filter-by-text.pipe.mjs +0 -39
  259. package/esm2022/lib/common/uuid.util.mjs +0 -17
  260. package/esm2022/lib/content-projection/content-projection.directive.mjs +0 -101
  261. package/esm2022/lib/content-projection/view-container.reference.mjs +0 -68
  262. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.mjs +0 -41
  263. package/esm2022/lib/page-not-found/format-url.pipe.mjs +0 -26
  264. package/esm2022/lib/part/part-action-bar/part-action-filter.pipe.mjs +0 -26
  265. package/esm2022/lib/routing/router.util.mjs +0 -126
  266. package/esm2022/lib/routing/workbench-auxiliary-routes-registrator.service.mjs +0 -94
  267. package/esm2022/lib/view/workbench-view-route-guards.mjs +0 -47
  268. package/lib/common/filter-by-predicate.pipe.d.ts +0 -10
  269. package/lib/common/filter-by-text.pipe.d.ts +0 -12
  270. package/lib/common/uuid.util.d.ts +0 -8
  271. package/lib/content-projection/content-projection.directive.d.ts +0 -30
  272. package/lib/content-projection/view-container.reference.d.ts +0 -42
  273. package/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.d.ts +0 -10
  274. package/lib/page-not-found/format-url.pipe.d.ts +0 -11
  275. package/lib/part/part-action-bar/part-action-filter.pipe.d.ts +0 -11
@@ -0,0 +1,58 @@
1
+ /*
2
+ * Copyright (c) 2018-2023 Swiss Federal Railways
3
+ *
4
+ * This program and the accompanying materials are made
5
+ * available under the terms of the Eclipse Public License 2.0
6
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
7
+ *
8
+ * SPDX-License-Identifier: EPL-2.0
9
+ */
10
+ import { Injectable } from '@angular/core';
11
+ import { Routing } from './routing.util';
12
+ import * as i0 from "@angular/core";
13
+ /**
14
+ * Stateful differ to compute view outlets.
15
+ *
16
+ * Use this differ to register/unregister view auxiliary routes.
17
+ *
18
+ * Because the layout is not available during initial navigation and empty-path views do not have
19
+ * an outlet in the URL, this differ uses both, outlets in the URL and views in the layout.
20
+ */
21
+ export class WorkbenchViewOutletDiffer {
22
+ constructor(differs) {
23
+ this._differ = differs.find([]).create();
24
+ }
25
+ /**
26
+ * Computes differences since last time {@link WorkbenchViewOutletDiffer#diff} was invoked.
27
+ */
28
+ diff(workbenchLayout, urlTree) {
29
+ const views = workbenchLayout?.views().map(view => view.id) ?? [];
30
+ const viewOutlets = Routing.parseViewOutlets(urlTree).keys();
31
+ const changes = this._differ.diff(new Set([...viewOutlets, ...views]));
32
+ return new WorkbenchViewOutletDiff(changes);
33
+ }
34
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchViewOutletDiffer, deps: [{ token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Injectable }); }
35
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchViewOutletDiffer, providedIn: 'root' }); }
36
+ }
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchViewOutletDiffer, decorators: [{
38
+ type: Injectable,
39
+ args: [{ providedIn: 'root' }]
40
+ }], ctorParameters: () => [{ type: i0.IterableDiffers }] });
41
+ /**
42
+ * Lists the view outlets added/removed in the current navigation.
43
+ */
44
+ export class WorkbenchViewOutletDiff {
45
+ constructor(changes) {
46
+ this.addedViewOutlets = new Array();
47
+ this.removedViewOutlets = new Array();
48
+ changes?.forEachAddedItem(({ item }) => this.addedViewOutlets.push(item));
49
+ changes?.forEachRemovedItem(({ item }) => this.removedViewOutlets.push(item));
50
+ }
51
+ toString() {
52
+ return `${new Array()
53
+ .concat(this.addedViewOutlets.length ? `addedViewOutlets=[${this.addedViewOutlets}]` : [])
54
+ .concat(this.removedViewOutlets.length ? `removedViewOutlets=[${this.removedViewOutlets}]` : [])
55
+ .join(', ')}`;
56
+ }
57
+ }
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2JlbmNoLXZpZXctb3V0bGV0LWRpZmZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3JvdXRpbmcvd29ya2JlbmNoLXZpZXctb3V0bGV0LWRpZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQW1ELE1BQU0sZUFBZSxDQUFDO0FBRzNGLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFHdkM7Ozs7Ozs7R0FPRztBQUVILE1BQU0sT0FBTyx5QkFBeUI7SUFJcEMsWUFBWSxPQUF3QjtRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFVLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksSUFBSSxDQUFDLGVBQXdDLEVBQUUsT0FBZ0I7UUFDcEUsTUFBTSxLQUFLLEdBQUcsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkUsT0FBTyxJQUFJLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7OEdBaEJVLHlCQUF5QjtrSEFBekIseUJBQXlCLGNBRGIsTUFBTTs7MkZBQ2xCLHlCQUF5QjtrQkFEckMsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUM7O0FBb0JoQzs7R0FFRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUFLbEMsWUFBWSxPQUF1QztRQUhuQyxxQkFBZ0IsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ3ZDLHVCQUFrQixHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFHdkQsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sR0FBRyxJQUFJLEtBQUssRUFBVTthQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMscUJBQXFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDekYsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQy9GLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMyBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtJbmplY3RhYmxlLCBJdGVyYWJsZUNoYW5nZXMsIEl0ZXJhYmxlRGlmZmVyLCBJdGVyYWJsZURpZmZlcnN9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaExheW91dH0gZnJvbSAnLi4vbGF5b3V0L8m1d29ya2JlbmNoLWxheW91dCc7XG5pbXBvcnQge1VybFRyZWV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1JvdXRpbmd9IGZyb20gJy4vcm91dGluZy51dGlsJztcbmltcG9ydCB7Vmlld0lkfSBmcm9tICcuLi92aWV3L3dvcmtiZW5jaC12aWV3Lm1vZGVsJztcblxuLyoqXG4gKiBTdGF0ZWZ1bCBkaWZmZXIgdG8gY29tcHV0ZSB2aWV3IG91dGxldHMuXG4gKlxuICogVXNlIHRoaXMgZGlmZmVyIHRvIHJlZ2lzdGVyL3VucmVnaXN0ZXIgdmlldyBhdXhpbGlhcnkgcm91dGVzLlxuICpcbiAqIEJlY2F1c2UgdGhlIGxheW91dCBpcyBub3QgYXZhaWxhYmxlIGR1cmluZyBpbml0aWFsIG5hdmlnYXRpb24gYW5kIGVtcHR5LXBhdGggdmlld3MgZG8gbm90IGhhdmVcbiAqIGFuIG91dGxldCBpbiB0aGUgVVJMLCB0aGlzIGRpZmZlciB1c2VzIGJvdGgsIG91dGxldHMgaW4gdGhlIFVSTCBhbmQgdmlld3MgaW4gdGhlIGxheW91dC5cbiAqL1xuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgV29ya2JlbmNoVmlld091dGxldERpZmZlciB7XG5cbiAgcHJpdmF0ZSBfZGlmZmVyOiBJdGVyYWJsZURpZmZlcjxWaWV3SWQ+O1xuXG4gIGNvbnN0cnVjdG9yKGRpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycykge1xuICAgIHRoaXMuX2RpZmZlciA9IGRpZmZlcnMuZmluZChbXSkuY3JlYXRlPFZpZXdJZD4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBkaWZmZXJlbmNlcyBzaW5jZSBsYXN0IHRpbWUge0BsaW5rIFdvcmtiZW5jaFZpZXdPdXRsZXREaWZmZXIjZGlmZn0gd2FzIGludm9rZWQuXG4gICAqL1xuICBwdWJsaWMgZGlmZih3b3JrYmVuY2hMYXlvdXQ6IMm1V29ya2JlbmNoTGF5b3V0IHwgbnVsbCwgdXJsVHJlZTogVXJsVHJlZSk6IFdvcmtiZW5jaFZpZXdPdXRsZXREaWZmIHtcbiAgICBjb25zdCB2aWV3cyA9IHdvcmtiZW5jaExheW91dD8udmlld3MoKS5tYXAodmlldyA9PiB2aWV3LmlkKSA/PyBbXTtcbiAgICBjb25zdCB2aWV3T3V0bGV0cyA9IFJvdXRpbmcucGFyc2VWaWV3T3V0bGV0cyh1cmxUcmVlKS5rZXlzKCk7XG4gICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKG5ldyBTZXQoWy4uLnZpZXdPdXRsZXRzLCAuLi52aWV3c10pKTtcbiAgICByZXR1cm4gbmV3IFdvcmtiZW5jaFZpZXdPdXRsZXREaWZmKGNoYW5nZXMpO1xuICB9XG59XG5cbi8qKlxuICogTGlzdHMgdGhlIHZpZXcgb3V0bGV0cyBhZGRlZC9yZW1vdmVkIGluIHRoZSBjdXJyZW50IG5hdmlnYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrYmVuY2hWaWV3T3V0bGV0RGlmZiB7XG5cbiAgcHVibGljIHJlYWRvbmx5IGFkZGVkVmlld091dGxldHMgPSBuZXcgQXJyYXk8Vmlld0lkPigpO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVtb3ZlZFZpZXdPdXRsZXRzID0gbmV3IEFycmF5PFZpZXdJZD4oKTtcblxuICBjb25zdHJ1Y3RvcihjaGFuZ2VzOiBJdGVyYWJsZUNoYW5nZXM8Vmlld0lkPiB8IG51bGwpIHtcbiAgICBjaGFuZ2VzPy5mb3JFYWNoQWRkZWRJdGVtKCh7aXRlbX0pID0+IHRoaXMuYWRkZWRWaWV3T3V0bGV0cy5wdXNoKGl0ZW0pKTtcbiAgICBjaGFuZ2VzPy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHtpdGVtfSkgPT4gdGhpcy5yZW1vdmVkVmlld091dGxldHMucHVzaChpdGVtKSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7bmV3IEFycmF5PHN0cmluZz4oKVxuICAgICAgLmNvbmNhdCh0aGlzLmFkZGVkVmlld091dGxldHMubGVuZ3RoID8gYGFkZGVkVmlld091dGxldHM9WyR7dGhpcy5hZGRlZFZpZXdPdXRsZXRzfV1gIDogW10pXG4gICAgICAuY29uY2F0KHRoaXMucmVtb3ZlZFZpZXdPdXRsZXRzLmxlbmd0aCA/IGByZW1vdmVkVmlld091dGxldHM9WyR7dGhpcy5yZW1vdmVkVmlld091dGxldHN9XWAgOiBbXSlcbiAgICAgIC5qb2luKCcsICcpfWA7XG4gIH1cbn1cbiJdfQ==
@@ -1,30 +1,38 @@
1
- import { Defined, Observables } from '@scion/toolkit/util';
2
- import { inject, Injectable, NgZone, runInInjectionContext } from '@angular/core';
1
+ /*
2
+ * Copyright (c) 2018-2024 Swiss Federal Railways
3
+ *
4
+ * This program and the accompanying materials are made
5
+ * available under the terms of the Eclipse Public License 2.0
6
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
7
+ *
8
+ * SPDX-License-Identifier: EPL-2.0
9
+ */
10
+ import { Router } from '@angular/router';
11
+ import { Defined } from '@scion/toolkit/util';
12
+ import { assertNotInReactiveContext, inject, Injectable, Injector, NgZone, runInInjectionContext } from '@angular/core';
13
+ import { WorkbenchLayoutService } from '../layout/workbench-layout.service';
3
14
  import { MAIN_AREA_LAYOUT_QUERY_PARAM } from '../workbench.constants';
4
- import { SINGLE_NAVIGATION_EXECUTOR } from '../executor/single-task-executor';
15
+ import { ANGULAR_ROUTER_MUTEX, SingleTaskExecutor } from '../executor/single-task-executor';
5
16
  import { firstValueFrom } from 'rxjs';
6
17
  import { WorkbenchNavigationalStates } from './workbench-navigational-states';
7
- import { RouterUtils } from './router.util';
18
+ import { Routing } from './routing.util';
8
19
  import { UrlSegmentMatcher } from './url-segment-matcher';
9
20
  import { Objects } from '../common/objects.util';
21
+ import { WORKBENCH_VIEW_REGISTRY } from '../view/workbench-view.registry';
10
22
  import * as i0 from "@angular/core";
11
- import * as i1 from "@angular/router";
12
- import * as i2 from "../layout/workbench-layout.service";
13
- import * as i3 from "../view/workbench-view.registry";
14
- import * as i4 from "../logging";
15
23
  /** @inheritDoc */
16
24
  export class ɵWorkbenchRouter {
17
- constructor(_router, _workbenchLayoutService, _workbenchViewRegistry, _injector, _logger, _zone) {
18
- this._router = _router;
19
- this._workbenchLayoutService = _workbenchLayoutService;
20
- this._workbenchViewRegistry = _workbenchViewRegistry;
21
- this._injector = _injector;
22
- this._logger = _logger;
23
- this._zone = _zone;
24
- this._singleNavigationExecutor = inject(SINGLE_NAVIGATION_EXECUTOR);
25
- /**
26
- * Holds the current navigational context during a workbench navigation, or `null` if no navigation is in progress.
27
- */
25
+ constructor() {
26
+ this._router = inject(Router);
27
+ this._workbenchLayoutService = inject(WorkbenchLayoutService);
28
+ this._workbenchViewRegistry = inject(WORKBENCH_VIEW_REGISTRY);
29
+ this._injector = inject(Injector);
30
+ this._zone = inject(NgZone);
31
+ /** Mutex to serialize Workbench Router navigation requests, preventing race conditions when modifying the active workbench layout to operate on the most-recent layout. */
32
+ this._workbenchRouterMutex = new SingleTaskExecutor();
33
+ /** Mutex to serialize Angular Router navigation requests, preventing the cancellation of previously initiated asynchronous navigations. */
34
+ this._angularRouterMutex = inject(ANGULAR_ROUTER_MUTEX);
35
+ /** Holds the current navigational context during a workbench navigation, or `null` if no navigation is in progress. */
28
36
  this._currentNavigationContext = null;
29
37
  // Instruct the Angular router to process navigations that do not change the current URL, i.e., when only updating navigation state.
30
38
  // For example, the workbench grid is passed to the navigation as state, not as a query parameter. Without this flag set, changes to
@@ -34,40 +42,49 @@ export class ɵWorkbenchRouter {
34
42
  // See Angular router.ts#setUpLocationChangeListener and router.ts#navigateToSyncWithBrowser
35
43
  this._router.onSameUrlNavigation = 'reload';
36
44
  }
37
- navigate(commandsOrNavigateFn, extras) {
45
+ async navigate(commandsOrNavigateFn, extras) {
46
+ assertNotInReactiveContext(this.navigate, 'Call WorkbenchRouter.navigate() in a non-reactive (non-tracking) context, such as within the untracked() function.');
38
47
  // Ensure to run in Angular zone.
39
48
  if (!NgZone.isInAngularZone()) {
40
49
  return this._zone.run(() => this.navigate(commandsOrNavigateFn, extras));
41
50
  }
42
51
  const navigateFn = typeof commandsOrNavigateFn === 'function' ? commandsOrNavigateFn : createNavigationFromCommands(commandsOrNavigateFn, extras ?? {});
43
- // Serialize navigation requests to prevent race conditions when modifying the currently active workbench layout.
44
- return this._singleNavigationExecutor.submit(async () => {
52
+ // Serialize navigation requests to avoid race conditions when modifying the active workbench layout, ensuring layout operations are performed on the most-recent layout.
53
+ const newLayout = await this._workbenchRouterMutex.submit(async () => {
45
54
  // Wait until the initial layout is available, i.e., after completion of Angular's initial navigation.
46
55
  // Otherwise, this navigation would override the initial layout as given in the URL.
47
- if (!this._workbenchLayoutService.layout) {
56
+ if (!this._workbenchLayoutService.layout()) {
48
57
  await this.waitForInitialLayout();
49
58
  }
50
59
  // Let the navigator compute the new workbench layout.
51
- const currentLayout = this._workbenchLayoutService.layout;
60
+ const currentLayout = this._workbenchLayoutService.layout();
52
61
  let newLayout = await runInInjectionContext(this._injector, () => navigateFn(currentLayout));
53
62
  if (!newLayout) {
54
- return true;
63
+ return null;
64
+ }
65
+ // Remove views marked for removal that have no `CanClose` guard.
66
+ // Views with a `CanClose` guard are removed later, outside the navigation mutex, to avoid blocking the workbench router.
67
+ newLayout = this.removeViewsWithoutGuard(newLayout);
68
+ // Skip navigation if the layout has not changed, such as when only closing views with a `CanClose` guard.
69
+ if (newLayout.equals(currentLayout, { excludeViewMarkedForRemoval: true })) {
70
+ return newLayout;
55
71
  }
56
- // Remove views marked for removal, invoking `CanClose` guard if implemented.
57
- newLayout = await newLayout.removeViewsMarkedForRemoval(viewUid => this.canCloseView(viewUid));
58
72
  // Create extras with workbench navigation instructions.
59
- extras = createNavigationExtras(newLayout, extras);
60
- // Create the new URL tree.
61
- const commands = computeNavigationCommands(currentLayout.viewOutlets(), newLayout.viewOutlets());
62
- const urlTree = this._router.createUrlTree(commands, extras);
73
+ extras = createNavigationExtras({ newLayout, currentLayout }, extras);
63
74
  // Perform the navigation.
64
- if (!(await this._router.navigateByUrl(urlTree, extras))) {
65
- return false;
75
+ const commands = computeNavigationCommands(currentLayout.viewOutlets(), newLayout.viewOutlets());
76
+ if (!await this._angularRouterMutex.submit(() => this._router.navigate(commands, extras))) {
77
+ return null;
66
78
  }
67
79
  // Block subsequent navigation(s) until Angular has flushed the changed layout to the DOM.
68
80
  await firstValueFrom(this._zone.onStable);
69
- return true;
81
+ return newLayout;
70
82
  });
83
+ if (!newLayout) {
84
+ return false;
85
+ }
86
+ // Remove views marked for removal, confirming closing by calling each view's `CanClose` guard.
87
+ return this.scheduleViewRemoval(newLayout);
71
88
  }
72
89
  /**
73
90
  * Performs changes to the current workbench layout.
@@ -92,56 +109,76 @@ export class ɵWorkbenchRouter {
92
109
  * @see NavigateFn
93
110
  */
94
111
  async createUrlTree(onNavigate, extras) {
112
+ assertNotInReactiveContext(this.createUrlTree, 'Call WorkbenchRouter.createUrlTree() in a non-reactive (non-tracking) context, such as within the untracked() function.');
95
113
  // Ensure to run in Angular zone.
96
114
  if (!NgZone.isInAngularZone()) {
97
115
  return this._zone.run(() => this.createUrlTree(onNavigate, extras));
98
116
  }
99
- return this._singleNavigationExecutor.submit(async () => {
117
+ // Serialize navigation requests to avoid race conditions when modifying the active workbench layout, ensuring layout operations are performed on the most-recent layout.
118
+ return this._workbenchRouterMutex.submit(async () => {
100
119
  // Wait until the initial layout is available, i.e., after completion of Angular's initial navigation.
101
120
  // Otherwise, would override the initial layout as given in the URL.
102
- if (!this._workbenchLayoutService.layout) {
121
+ if (!this._workbenchLayoutService.layout()) {
103
122
  await this.waitForInitialLayout();
104
123
  }
105
124
  // Let the navigator compute the new workbench layout.
106
- const currentLayout = this._workbenchLayoutService.layout;
125
+ const currentLayout = this._workbenchLayoutService.layout();
107
126
  let newLayout = await runInInjectionContext(this._injector, () => onNavigate(currentLayout));
108
127
  if (!newLayout) {
109
128
  return null;
110
129
  }
111
130
  // Remove views marked for removal.
112
- newLayout = await newLayout.removeViewsMarkedForRemoval();
131
+ newLayout.views({ markedForRemoval: true }).forEach(view => {
132
+ newLayout = newLayout.removeView(view.id, { force: true });
133
+ });
113
134
  // Create extras with workbench navigation instructions.
114
- extras = createNavigationExtras(newLayout, extras);
135
+ extras = createNavigationExtras({ newLayout, currentLayout }, extras);
115
136
  // Create the new URL tree.
116
137
  const commands = computeNavigationCommands(currentLayout.viewOutlets(), newLayout.viewOutlets());
117
138
  return this._router.createUrlTree(commands, extras);
118
139
  });
119
140
  }
120
141
  /**
121
- * Decides if given view can be closed, invoking `CanClose` guard if implemented.
142
+ * Remove views marked for removal that have no `CanClose` guard.
122
143
  */
123
- async canCloseView(viewUid) {
124
- const view = this._workbenchViewRegistry.views.find(view => view.uid === viewUid);
125
- if (!view) {
126
- return true;
127
- }
128
- if (!view.closable) {
129
- return false;
130
- }
131
- // Test if the view implements `CanClose` guard.
132
- const component = view.getComponent();
133
- if (typeof component?.canClose !== 'function') {
134
- return true;
135
- }
136
- // Invoke `CanClose` guard to decide if to close the view.
137
- try {
138
- const canClose = runInInjectionContext(view.getComponentInjector(), () => component.canClose());
139
- return await firstValueFrom(Observables.coerce(canClose), { defaultValue: true });
140
- }
141
- catch (error) {
142
- this._logger.error(`Unhandled error while invoking 'CanClose' guard of view '${view.id}'.`, error);
143
- return true;
144
- }
144
+ removeViewsWithoutGuard(layout) {
145
+ return layout.views({ markedForRemoval: true }).reduce((layout, mView) => {
146
+ const view = this._workbenchViewRegistry.get(mView.id, { orElse: null });
147
+ if (!view || (view.closable() && !view.canCloseGuard)) {
148
+ return layout.removeView(mView.id, { force: true });
149
+ }
150
+ return layout;
151
+ }, layout);
152
+ }
153
+ /**
154
+ * Removes views marked for removal, confirming closing by calling each view's `CanClose` guard.
155
+ *
156
+ * Guards are executed in parallel, and views are removed in separate navigations.
157
+ *
158
+ * @return a Promise that resolves to `true` when all marked views were successfully closed or declined closing.
159
+ */
160
+ async scheduleViewRemoval(layout) {
161
+ const navigations = layout.views({ markedForRemoval: true })
162
+ .map(mView => this._workbenchViewRegistry.get(mView.id, { orElse: null }))
163
+ .filter((view) => !!view && view.closable())
164
+ .map(async (view) => {
165
+ // Capture current navigation id to not proceed closing if navigated in the meantime.
166
+ const navigationId = view.navigationId;
167
+ // Make view non-closable to prevent closing the view again while awaiting closing confirmation.
168
+ view.closable = false;
169
+ try {
170
+ const close = await view.canCloseGuard();
171
+ if (close && view.navigationId === navigationId) {
172
+ return this.navigate(layout => layout.removeView(view.id, { force: true }));
173
+ }
174
+ return true;
175
+ }
176
+ finally {
177
+ view.closable = true;
178
+ }
179
+ });
180
+ // Wait for all `CanClose` guards to resolve and subsequent navigations to complete.
181
+ return (await Promise.all(navigations)).every(Boolean);
145
182
  }
146
183
  /**
147
184
  * Returns the context of the current workbench navigation, when being invoked during navigation, or throws an error otherwise.
@@ -164,13 +201,13 @@ export class ɵWorkbenchRouter {
164
201
  async waitForInitialLayout() {
165
202
  await firstValueFrom(this._workbenchLayoutService.layout$);
166
203
  }
167
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵWorkbenchRouter, deps: [{ token: i1.Router }, { token: i2.WorkbenchLayoutService }, { token: i3.WorkbenchViewRegistry }, { token: i0.Injector }, { token: i4.Logger }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
204
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵWorkbenchRouter, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
168
205
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵWorkbenchRouter, providedIn: 'root' }); }
169
206
  }
170
207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵWorkbenchRouter, decorators: [{
171
208
  type: Injectable,
172
209
  args: [{ providedIn: 'root' }]
173
- }], ctorParameters: () => [{ type: i1.Router }, { type: i2.WorkbenchLayoutService }, { type: i3.WorkbenchViewRegistry }, { type: i0.Injector }, { type: i4.Logger }, { type: i0.NgZone }] });
210
+ }], ctorParameters: () => [] });
174
211
  /**
175
212
  * Creates a navigation to navigate view(s) based on the provided array of commands and extras.
176
213
  */
@@ -183,7 +220,7 @@ function createNavigationFromCommands(commands, extras) {
183
220
  }
184
221
  return layout.removeView(extras.target);
185
222
  }
186
- const urlSegments = RouterUtils.commandsToSegments(commands, { relativeTo: extras.relativeTo });
223
+ const urlSegments = Routing.commandsToSegments(commands, { relativeTo: extras.relativeTo });
187
224
  return layout
188
225
  .views({
189
226
  partId: extras.partId,
@@ -198,7 +235,7 @@ function createNavigationFromCommands(commands, extras) {
198
235
  return addView(layout.computeNextViewId(), layout);
199
236
  }
200
237
  case 'auto': {
201
- const urlSegments = RouterUtils.commandsToSegments(commands, { relativeTo: extras.relativeTo });
238
+ const urlSegments = Routing.commandsToSegments(commands, { relativeTo: extras.relativeTo });
202
239
  const views = layout.views({
203
240
  partId: extras.partId,
204
241
  segments: new UrlSegmentMatcher(urlSegments, { matchMatrixParams: false, matchWildcardPath: false }),
@@ -239,11 +276,13 @@ function createNavigationFromCommands(commands, extras) {
239
276
  partId: partId,
240
277
  position: extras.position ?? 'after-active-view',
241
278
  activateView: extras.activate ?? true,
279
+ activatePart: extras.activate ?? true,
242
280
  })
243
281
  .navigateView(viewId, commands, {
244
282
  relativeTo: extras.relativeTo,
245
283
  hint: extras.hint,
246
284
  cssClass: extras.cssClass,
285
+ data: extras.data,
247
286
  state: extras.state,
248
287
  });
249
288
  }
@@ -252,12 +291,13 @@ function createNavigationFromCommands(commands, extras) {
252
291
  */
253
292
  function updateView(viewId, layout) {
254
293
  if (extras.activate ?? true) {
255
- layout = layout.activateView(viewId);
294
+ layout = layout.activateView(viewId, { activatePart: true });
256
295
  }
257
296
  return layout.navigateView(viewId, commands, {
258
297
  relativeTo: extras.relativeTo,
259
298
  hint: extras.hint,
260
299
  cssClass: extras.cssClass,
300
+ data: extras.data,
261
301
  state: extras.state,
262
302
  });
263
303
  }
@@ -265,8 +305,10 @@ function createNavigationFromCommands(commands, extras) {
265
305
  /**
266
306
  * Creates navigation extras with workbench navigation instructions.
267
307
  */
268
- function createNavigationExtras(layout, extras) {
269
- const { workbenchGrid, mainAreaGrid } = layout.serialize();
308
+ function createNavigationExtras(layouts, extras) {
309
+ const { newLayout, currentLayout } = layouts;
310
+ const { workbenchGrid, mainAreaGrid } = newLayout.serialize({ excludeViewMarkedForRemoval: true });
311
+ // IMPORTANT: Update `ɵWorkbenchLayout.equals` function when adding new state properties.
270
312
  return {
271
313
  ...extras,
272
314
  // Instruct the Angular router to process the navigation even if the URL does not change, e.g., when changing the workbench grid which is not contained in the URL.
@@ -276,8 +318,11 @@ function createNavigationExtras(layout, extras) {
276
318
  // Associate workbench-specific state with the navigation.
277
319
  state: WorkbenchNavigationalStates.create({
278
320
  workbenchGrid: workbenchGrid,
279
- maximized: layout.maximized,
280
- viewStates: layout.viewStates(),
321
+ // Fall back to the current layout's perspective if not specified by the new layout,
322
+ // e.g., the navigator provides a new layout to replace the current layout.
323
+ perspectiveId: newLayout.perspectiveId ?? currentLayout?.perspectiveId,
324
+ maximized: newLayout.maximized,
325
+ navigationStates: newLayout.navigationStates(),
281
326
  }),
282
327
  // Add the main area as query parameter.
283
328
  queryParams: { ...extras?.queryParams, [MAIN_AREA_LAYOUT_QUERY_PARAM]: mainAreaGrid },
@@ -297,7 +342,7 @@ function computeNavigationCommands(previousViewOutlets, nextViewOutlets) {
297
342
  viewIds.forEach(viewId => {
298
343
  // Test if the view was added to the layout.
299
344
  if (!previousViewOutletMap.has(viewId)) {
300
- commands.set(viewId, RouterUtils.segmentsToCommands(nextViewOutletMap.get(viewId)));
345
+ commands.set(viewId, Routing.segmentsToCommands(nextViewOutletMap.get(viewId)));
301
346
  }
302
347
  // Test if the view was removed from the layout.
303
348
  else if (!nextViewOutletMap.has(viewId)) {
@@ -305,10 +350,10 @@ function computeNavigationCommands(previousViewOutlets, nextViewOutlets) {
305
350
  }
306
351
  // Test if the view was updated.
307
352
  else if (!new UrlSegmentMatcher(previousViewOutletMap.get(viewId), { matchMatrixParams: true, matchWildcardPath: false }).matches(nextViewOutletMap.get(viewId))) {
308
- commands.set(viewId, RouterUtils.segmentsToCommands(nextViewOutletMap.get(viewId)));
353
+ commands.set(viewId, Routing.segmentsToCommands(nextViewOutletMap.get(viewId)));
309
354
  }
310
355
  });
311
356
  // Add view commands to the 'outlets' property to be interpreted by the Angular router.
312
357
  return commands.size ? [{ outlets: Object.fromEntries(commands) }] : [];
313
358
  }
314
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiybV3b3JrYmVuY2gtcm91dGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9yb3V0aW5nL8m1d29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLE9BQU8sRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQVksTUFBTSxFQUFFLHFCQUFxQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTFGLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3BFLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQzVFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFFNUUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUcxQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7OztBQU0vQyxrQkFBa0I7QUFFbEIsTUFBTSxPQUFPLGdCQUFnQjtJQVMzQixZQUFvQixPQUFlLEVBQ2YsdUJBQStDLEVBQy9DLHNCQUE2QyxFQUM3QyxTQUFtQixFQUNuQixPQUFlLEVBQ2YsS0FBYTtRQUxiLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZiw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXdCO1FBQy9DLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBdUI7UUFDN0MsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQVp6Qiw4QkFBeUIsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUV2RTs7V0FFRztRQUNLLDhCQUF5QixHQUFzQyxJQUFJLENBQUM7UUFRMUUsb0lBQW9JO1FBQ3BJLG9JQUFvSTtRQUNwSSx1RUFBdUU7UUFDdkUsa0lBQWtJO1FBQ2xJLG9GQUFvRjtRQUNwRiw0RkFBNEY7UUFDNUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxRQUFRLENBQUM7SUFDOUMsQ0FBQztJQU1NLFFBQVEsQ0FBQyxvQkFBNEMsRUFBRSxNQUFtRjtRQUMvSSxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxPQUFPLG9CQUFvQixLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLG9CQUFvQixFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV4SixpSEFBaUg7UUFDakgsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3RELHNHQUFzRztZQUN0RyxvRkFBb0Y7WUFDcEYsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUNwQyxDQUFDO1lBRUQsc0RBQXNEO1lBQ3RELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFPLENBQUM7WUFDM0QsSUFBSSxTQUFTLEdBQTRCLE1BQU0scUJBQXFCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQXFCLENBQUM7WUFDMUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNmLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELDZFQUE2RTtZQUM3RSxTQUFTLEdBQUcsTUFBTSxTQUFTLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFFL0Ysd0RBQXdEO1lBQ3hELE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFbkQsMkJBQTJCO1lBQzNCLE1BQU0sUUFBUSxHQUFhLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUMzRyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFN0QsMEJBQTBCO1lBQzFCLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDekQsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsMEZBQTBGO1lBQzFGLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BcUJHO0lBQ0ksS0FBSyxDQUFDLGFBQWEsQ0FBQyxVQUFvRyxFQUFFLE1BQXVEO1FBQ3RMLGlDQUFpQztRQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDdEQsc0dBQXNHO1lBQ3RHLG9FQUFvRTtZQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN6QyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3BDLENBQUM7WUFFRCxzREFBc0Q7WUFDdEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU8sQ0FBQztZQUMzRCxJQUFJLFNBQVMsR0FBNEIsTUFBTSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ3RILElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxtQ0FBbUM7WUFDbkMsU0FBUyxHQUFHLE1BQU0sU0FBUyxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFFMUQsd0RBQXdEO1lBQ3hELE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFbkQsMkJBQTJCO1lBQzNCLE1BQU0sUUFBUSxHQUFhLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUMzRyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBYTtRQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBcUIsQ0FBQztRQUN6RCxJQUFJLE9BQU8sU0FBUyxFQUFFLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM5QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCwwREFBMEQ7UUFDMUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDakcsT0FBTyxNQUFNLGNBQWMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUMsWUFBWSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyw0REFBNEQsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25HLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLDJCQUEyQjtRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDcEMsTUFBTSxLQUFLLENBQUMsd0ZBQXdGLENBQUMsQ0FBQztRQUN4RyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksMkJBQTJCLENBQUMsT0FBMEM7UUFDM0UsSUFBSSxDQUFDLHlCQUF5QixHQUFHLE9BQU8sQ0FBQztJQUMzQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsb0JBQW9CO1FBQ2hDLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3RCxDQUFDOzhHQWpMVSxnQkFBZ0I7a0hBQWhCLGdCQUFnQixjQURKLE1BQU07OzJGQUNsQixnQkFBZ0I7a0JBRDVCLFVBQVU7bUJBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDOztBQXFMaEM7O0dBRUc7QUFDSCxTQUFTLDRCQUE0QixDQUFDLFFBQWtCLEVBQUUsTUFBaUM7SUFDekYsT0FBTyxDQUFDLE1BQXdCLEVBQTJCLEVBQUU7UUFDM0QsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN6RSxNQUFNLEtBQUssQ0FBQywrRkFBK0YsQ0FBQyxDQUFDO2dCQUMvRyxDQUFDO2dCQUNELE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsRUFBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBQyxDQUFDLENBQUM7WUFDOUYsT0FBTyxNQUFNO2lCQUNWLEtBQUssQ0FBQztnQkFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07Z0JBQ3JCLFFBQVEsRUFBRSxJQUFJLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxFQUFDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUMsQ0FBQztnQkFDakcsY0FBYyxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSTthQUNwQyxDQUFDO2lCQUNELE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xFLENBQUM7YUFDSSxDQUFDO1lBQ0osUUFBUSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNoQyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ2IsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3JELENBQUM7Z0JBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUNaLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsRUFBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBQyxDQUFDLENBQUM7b0JBQzlGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7d0JBQ3pCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTt3QkFDckIsUUFBUSxFQUFFLElBQUksaUJBQWlCLENBQUMsV0FBVyxFQUFFLEVBQUMsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBQyxDQUFDO3dCQUNsRyxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJO3FCQUNwQyxDQUFDLENBQUM7b0JBQ0gsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQ2pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUM3RSxDQUFDO3lCQUNJLENBQUM7d0JBQ0osT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ3JELENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNSLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFPLENBQUM7b0JBQzlCLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO3dCQUMzQixPQUFPLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ3BDLENBQUM7eUJBQ0ksQ0FBQzt3QkFDSixPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ2pDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUY7O09BRUc7SUFDSCxTQUFTLE9BQU8sQ0FBQyxNQUFjLEVBQUUsTUFBd0I7UUFDdkQsNkhBQTZIO1FBQzdILE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBVyxFQUFFO1lBQzNCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDdkIsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFTCxPQUFPLE1BQU07YUFDVixPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ2YsTUFBTSxFQUFFLE1BQU07WUFDZCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsSUFBSSxtQkFBbUI7WUFDaEQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSTtTQUN0QyxDQUFDO2FBQ0QsWUFBWSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUU7WUFDOUIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1NBQ3BCLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsVUFBVSxDQUFDLE1BQWMsRUFBRSxNQUF3QjtRQUMxRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7WUFDNUIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFO1lBQzNDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3pCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztTQUNwQixDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxNQUF3QixFQUFFLE1BQXVEO0lBQy9HLE1BQU0sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBRXpELE9BQU87UUFDTCxHQUFHLE1BQU07UUFDVCxtS0FBbUs7UUFDbkssbUJBQW1CLEVBQUUsUUFBUTtRQUM3QixxRkFBcUY7UUFDckYsVUFBVSxFQUFFLElBQUk7UUFDaEIsMERBQTBEO1FBQzFELEtBQUssRUFBRSwyQkFBMkIsQ0FBQyxNQUFNLENBQUM7WUFDeEMsYUFBYSxFQUFFLGFBQWE7WUFDNUIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQzNCLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFO1NBQ2hDLENBQUM7UUFDRix3Q0FBd0M7UUFDeEMsV0FBVyxFQUFFLEVBQUMsR0FBRyxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsNEJBQTRCLENBQUMsRUFBRSxZQUFZLEVBQUM7UUFDbkYsc0hBQXNIO1FBQ3RILCtIQUErSDtRQUMvSCxtQkFBbUIsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxPQUFPLENBQUM7S0FDMUUsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMseUJBQXlCLENBQUMsbUJBQWdDLEVBQUUsZUFBNEI7SUFDL0YsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBdUIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDbEcsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBdUIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBRTFGLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUEyQixDQUFDO0lBQ3BELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFTLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVoRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3ZCLDRDQUE0QztRQUM1QyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdkMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUNELGdEQUFnRDthQUMzQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDeEMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNELGdDQUFnQzthQUMzQixJQUFJLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFFLEVBQUUsRUFBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBRSxDQUFDLEVBQUUsQ0FBQztZQUNqSyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBRSxDQUFDLENBQUMsQ0FBQztRQUN2RixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCx1RkFBdUY7SUFDdkYsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDeEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyNCBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtOYXZpZ2F0aW9uRXh0cmFzLCBSb3V0ZXIsIFVybFNlZ21lbnQsIFVybFRyZWV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1dvcmtiZW5jaFJvdXRlcn0gZnJvbSAnLi93b3JrYmVuY2gtcm91dGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtEZWZpbmVkLCBPYnNlcnZhYmxlc30gZnJvbSAnQHNjaW9uL3Rvb2xraXQvdXRpbCc7XG5pbXBvcnQge2luamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE5nWm9uZSwgcnVuSW5JbmplY3Rpb25Db250ZXh0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7V29ya2JlbmNoTGF5b3V0U2VydmljZX0gZnJvbSAnLi4vbGF5b3V0L3dvcmtiZW5jaC1sYXlvdXQuc2VydmljZSc7XG5pbXBvcnQge01BSU5fQVJFQV9MQVlPVVRfUVVFUllfUEFSQU19IGZyb20gJy4uL3dvcmtiZW5jaC5jb25zdGFudHMnO1xuaW1wb3J0IHtTSU5HTEVfTkFWSUdBVElPTl9FWEVDVVRPUn0gZnJvbSAnLi4vZXhlY3V0b3Ivc2luZ2xlLXRhc2stZXhlY3V0b3InO1xuaW1wb3J0IHtmaXJzdFZhbHVlRnJvbX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1dvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlc30gZnJvbSAnLi93b3JrYmVuY2gtbmF2aWdhdGlvbmFsLXN0YXRlcyc7XG5pbXBvcnQge8m1V29ya2JlbmNoTGF5b3V0fSBmcm9tICcuLi9sYXlvdXQvybV3b3JrYmVuY2gtbGF5b3V0JztcbmltcG9ydCB7Um91dGVyVXRpbHN9IGZyb20gJy4vcm91dGVyLnV0aWwnO1xuaW1wb3J0IHtDb21tYW5kcywgVmlld091dGxldHMsIFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0LCBXb3JrYmVuY2hOYXZpZ2F0aW9uRXh0cmFzfSBmcm9tICcuL3JvdXRpbmcubW9kZWwnO1xuaW1wb3J0IHtWaWV3SWR9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcubW9kZWwnO1xuaW1wb3J0IHtVcmxTZWdtZW50TWF0Y2hlcn0gZnJvbSAnLi91cmwtc2VnbWVudC1tYXRjaGVyJztcbmltcG9ydCB7T2JqZWN0c30gZnJvbSAnLi4vY29tbW9uL29iamVjdHMudXRpbCc7XG5pbXBvcnQge1dvcmtiZW5jaFZpZXdSZWdpc3RyeX0gZnJvbSAnLi4vdmlldy93b3JrYmVuY2gtdmlldy5yZWdpc3RyeSc7XG5pbXBvcnQge0xvZ2dlcn0gZnJvbSAnLi4vbG9nZ2luZyc7XG5pbXBvcnQge0NhbkNsb3NlfSBmcm9tICcuLi93b3JrYmVuY2gubW9kZWwnO1xuaW1wb3J0IHtVVUlEfSBmcm9tICcuLi9jb21tb24vdXVpZC51dGlsJztcblxuLyoqIEBpbmhlcml0RG9jICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyDJtVdvcmtiZW5jaFJvdXRlciBpbXBsZW1lbnRzIFdvcmtiZW5jaFJvdXRlciB7XG5cbiAgcHJpdmF0ZSBfc2luZ2xlTmF2aWdhdGlvbkV4ZWN1dG9yID0gaW5qZWN0KFNJTkdMRV9OQVZJR0FUSU9OX0VYRUNVVE9SKTtcblxuICAvKipcbiAgICogSG9sZHMgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbmFsIGNvbnRleHQgZHVyaW5nIGEgd29ya2JlbmNoIG5hdmlnYXRpb24sIG9yIGBudWxsYCBpZiBubyBuYXZpZ2F0aW9uIGlzIGluIHByb2dyZXNzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3VycmVudE5hdmlnYXRpb25Db250ZXh0OiBXb3JrYmVuY2hOYXZpZ2F0aW9uQ29udGV4dCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JvdXRlcjogUm91dGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlOiBXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF93b3JrYmVuY2hWaWV3UmVnaXN0cnk6IFdvcmtiZW5jaFZpZXdSZWdpc3RyeSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICAgICAgICBwcml2YXRlIF9sb2dnZXI6IExvZ2dlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfem9uZTogTmdab25lKSB7XG4gICAgLy8gSW5zdHJ1Y3QgdGhlIEFuZ3VsYXIgcm91dGVyIHRvIHByb2Nlc3MgbmF2aWdhdGlvbnMgdGhhdCBkbyBub3QgY2hhbmdlIHRoZSBjdXJyZW50IFVSTCwgaS5lLiwgd2hlbiBvbmx5IHVwZGF0aW5nIG5hdmlnYXRpb24gc3RhdGUuXG4gICAgLy8gRm9yIGV4YW1wbGUsIHRoZSB3b3JrYmVuY2ggZ3JpZCBpcyBwYXNzZWQgdG8gdGhlIG5hdmlnYXRpb24gYXMgc3RhdGUsIG5vdCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gV2l0aG91dCB0aGlzIGZsYWcgc2V0LCBjaGFuZ2VzIHRvXG4gICAgLy8gdGhlIHdvcmtiZW5jaCBncmlkIHdvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgYnJvd3NpbmcgaGlzdG9yeSBzdGFjay5cbiAgICAvLyBBbHRob3VnaCB0aGUgYG9uU2FtZVVybE5hdmlnYXRpb25gIGZsYWcgY2FuIGJlIHNldCBwZXIgbmF2aWdhdGlvbiB2aWEgdGhlIG5hdmlnYXRpb24gZXh0cmFzLCB0aGlzIGlzIG5vdCBzdWZmaWNpZW50IGJlY2F1c2UgdGhlXG4gICAgLy8gQW5ndWxhciByb3V0ZXIgaWdub3JlcyBpdCB3aGVuIG5hdmlnYXRpbmcgYmFjayBhbmQgZm9ydGggaW4gdGhlIGJyb3dzaW5nIGhpc3RvcnkuXG4gICAgLy8gU2VlIEFuZ3VsYXIgcm91dGVyLnRzI3NldFVwTG9jYXRpb25DaGFuZ2VMaXN0ZW5lciBhbmQgcm91dGVyLnRzI25hdmlnYXRlVG9TeW5jV2l0aEJyb3dzZXJcbiAgICB0aGlzLl9yb3V0ZXIub25TYW1lVXJsTmF2aWdhdGlvbiA9ICdyZWxvYWQnO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBuYXZpZ2F0ZShjb21tYW5kczogQ29tbWFuZHMsIGV4dHJhcz86IFdvcmtiZW5jaE5hdmlnYXRpb25FeHRyYXMpOiBQcm9taXNlPGJvb2xlYW4+O1xuICBwdWJsaWMgbmF2aWdhdGUobmF2aWdhdGVGbjogybVOYXZpZ2F0ZUZuLCBleHRyYXM/OiBPbWl0PE5hdmlnYXRpb25FeHRyYXMsICdyZWxhdGl2ZVRvJyB8ICdzdGF0ZSc+KTogUHJvbWlzZTxib29sZWFuPjtcbiAgcHVibGljIG5hdmlnYXRlKGNvbW1hbmRzT3JOYXZpZ2F0ZUZuOiBDb21tYW5kcyB8IMm1TmF2aWdhdGVGbiwgZXh0cmFzPzogV29ya2JlbmNoTmF2aWdhdGlvbkV4dHJhcyB8IE9taXQ8TmF2aWdhdGlvbkV4dHJhcywgJ3JlbGF0aXZlVG8nIHwgJ3N0YXRlJz4pOiBQcm9taXNlPGJvb2xlYW4+O1xuICBwdWJsaWMgbmF2aWdhdGUoY29tbWFuZHNPck5hdmlnYXRlRm46IENvbW1hbmRzIHwgybVOYXZpZ2F0ZUZuLCBleHRyYXM/OiBXb3JrYmVuY2hOYXZpZ2F0aW9uRXh0cmFzIHwgT21pdDxOYXZpZ2F0aW9uRXh0cmFzLCAncmVsYXRpdmVUbycgfCAnc3RhdGUnPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIEVuc3VyZSB0byBydW4gaW4gQW5ndWxhciB6b25lLlxuICAgIGlmICghTmdab25lLmlzSW5Bbmd1bGFyWm9uZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fem9uZS5ydW4oKCkgPT4gdGhpcy5uYXZpZ2F0ZShjb21tYW5kc09yTmF2aWdhdGVGbiwgZXh0cmFzKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmF2aWdhdGVGbiA9IHR5cGVvZiBjb21tYW5kc09yTmF2aWdhdGVGbiA9PT0gJ2Z1bmN0aW9uJyA/IGNvbW1hbmRzT3JOYXZpZ2F0ZUZuIDogY3JlYXRlTmF2aWdhdGlvbkZyb21Db21tYW5kcyhjb21tYW5kc09yTmF2aWdhdGVGbiwgZXh0cmFzID8/IHt9KTtcblxuICAgIC8vIFNlcmlhbGl6ZSBuYXZpZ2F0aW9uIHJlcXVlc3RzIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdoZW4gbW9kaWZ5aW5nIHRoZSBjdXJyZW50bHkgYWN0aXZlIHdvcmtiZW5jaCBsYXlvdXQuXG4gICAgcmV0dXJuIHRoaXMuX3NpbmdsZU5hdmlnYXRpb25FeGVjdXRvci5zdWJtaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgaW5pdGlhbCBsYXlvdXQgaXMgYXZhaWxhYmxlLCBpLmUuLCBhZnRlciBjb21wbGV0aW9uIG9mIEFuZ3VsYXIncyBpbml0aWFsIG5hdmlnYXRpb24uXG4gICAgICAvLyBPdGhlcndpc2UsIHRoaXMgbmF2aWdhdGlvbiB3b3VsZCBvdmVycmlkZSB0aGUgaW5pdGlhbCBsYXlvdXQgYXMgZ2l2ZW4gaW4gdGhlIFVSTC5cbiAgICAgIGlmICghdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9ySW5pdGlhbExheW91dCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBMZXQgdGhlIG5hdmlnYXRvciBjb21wdXRlIHRoZSBuZXcgd29ya2JlbmNoIGxheW91dC5cbiAgICAgIGNvbnN0IGN1cnJlbnRMYXlvdXQgPSB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dCE7XG4gICAgICBsZXQgbmV3TGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCB8IG51bGwgPSBhd2FpdCBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5faW5qZWN0b3IsICgpID0+IG5hdmlnYXRlRm4oY3VycmVudExheW91dCkpIGFzIMm1V29ya2JlbmNoTGF5b3V0O1xuICAgICAgaWYgKCFuZXdMYXlvdXQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSB2aWV3cyBtYXJrZWQgZm9yIHJlbW92YWwsIGludm9raW5nIGBDYW5DbG9zZWAgZ3VhcmQgaWYgaW1wbGVtZW50ZWQuXG4gICAgICBuZXdMYXlvdXQgPSBhd2FpdCBuZXdMYXlvdXQucmVtb3ZlVmlld3NNYXJrZWRGb3JSZW1vdmFsKHZpZXdVaWQgPT4gdGhpcy5jYW5DbG9zZVZpZXcodmlld1VpZCkpO1xuXG4gICAgICAvLyBDcmVhdGUgZXh0cmFzIHdpdGggd29ya2JlbmNoIG5hdmlnYXRpb24gaW5zdHJ1Y3Rpb25zLlxuICAgICAgZXh0cmFzID0gY3JlYXRlTmF2aWdhdGlvbkV4dHJhcyhuZXdMYXlvdXQsIGV4dHJhcyk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IFVSTCB0cmVlLlxuICAgICAgY29uc3QgY29tbWFuZHM6IENvbW1hbmRzID0gY29tcHV0ZU5hdmlnYXRpb25Db21tYW5kcyhjdXJyZW50TGF5b3V0LnZpZXdPdXRsZXRzKCksIG5ld0xheW91dC52aWV3T3V0bGV0cygpKTtcbiAgICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLl9yb3V0ZXIuY3JlYXRlVXJsVHJlZShjb21tYW5kcywgZXh0cmFzKTtcblxuICAgICAgLy8gUGVyZm9ybSB0aGUgbmF2aWdhdGlvbi5cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuX3JvdXRlci5uYXZpZ2F0ZUJ5VXJsKHVybFRyZWUsIGV4dHJhcykpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQmxvY2sgc3Vic2VxdWVudCBuYXZpZ2F0aW9uKHMpIHVudGlsIEFuZ3VsYXIgaGFzIGZsdXNoZWQgdGhlIGNoYW5nZWQgbGF5b3V0IHRvIHRoZSBET00uXG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl96b25lLm9uU3RhYmxlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGNoYW5nZXMgdG8gdGhlIGN1cnJlbnQgd29ya2JlbmNoIGxheW91dC5cbiAgICpcbiAgICogVW5saWtlIHtAbGluayBuYXZpZ2F0ZX0sIGRvZXMgbm90IHBlcmZvcm0gdGhlIG5hdmlnYXRpb24gYnV0IHJldHVybnMgdGhlIFVSTCB0cmVlIGluc3RlYWQuXG4gICAqXG4gICAqIFRoZSByb3V0ZXIgd2lsbCBpbnZva2UgdGhlIGNhbGxiYWNrIGFuZCBwYXNzIHRoZSBjdXJyZW50IGxheW91dCBmb3IgbW9kaWZpY2F0aW9uLiBUaGUgY2FsbGJhY2sgY2FuIGNhbGwgYGluamVjdGAgdG8gZ2V0IGFueSByZXF1aXJlZCBkZXBlbmRlbmNpZXMuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBhZGRzIGEgcGFydCB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiBhcmVhLCBpbnNlcnRzIGEgdmlldyBhbmQgbmF2aWdhdGVzIGl0LlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBpbmplY3QoV29ya2JlbmNoUm91dGVyKS5jcmVhdGVVcmxUcmVlKGxheW91dCA9PiBsYXlvdXRcbiAgICogICAuYWRkUGFydCgnbGVmdCcsIHtyZWxhdGl2ZVRvOiBNQUlOX0FSRUEsIGFsaWduOiAnbGVmdCd9KVxuICAgKiAgIC5hZGRWaWV3KCduYXZpZ2F0b3InLCB7cGFydElkOiAnbGVmdCd9KVxuICAgKiAgIC5uYXZpZ2F0ZVZpZXcoJ25hdmlnYXRvcicsIFsncGF0aC90by92aWV3J10pXG4gICAqICAgLmFjdGl2YXRlVmlldygnbmF2aWdhdG9yJyksXG4gICAqICk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gb25OYXZpZ2F0ZSAtIFNwZWNpZmllcyB0aGUgY2FsbGJhY2sgdG8gbW9kaWZ5IHRoZSBsYXlvdXQuXG4gICAqIEBwYXJhbSBleHRyYXMgLSBDb250cm9scyBob3cgdG8gcGVyZm9ybSB0aGUgbmF2aWdhdGlvbi5cbiAgICogQHNlZSBOYXZpZ2F0ZUZuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlVXJsVHJlZShvbk5hdmlnYXRlOiAobGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCkgPT4gUHJvbWlzZTzJtVdvcmtiZW5jaExheW91dCB8IG51bGw+IHwgybVXb3JrYmVuY2hMYXlvdXQgfCBudWxsLCBleHRyYXM/OiBPbWl0PE5hdmlnYXRpb25FeHRyYXMsICdyZWxhdGl2ZVRvJyB8ICdzdGF0ZSc+KTogUHJvbWlzZTxVcmxUcmVlIHwgbnVsbD4ge1xuICAgIC8vIEVuc3VyZSB0byBydW4gaW4gQW5ndWxhciB6b25lLlxuICAgIGlmICghTmdab25lLmlzSW5Bbmd1bGFyWm9uZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fem9uZS5ydW4oKCkgPT4gdGhpcy5jcmVhdGVVcmxUcmVlKG9uTmF2aWdhdGUsIGV4dHJhcykpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zaW5nbGVOYXZpZ2F0aW9uRXhlY3V0b3Iuc3VibWl0KGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFdhaXQgdW50aWwgdGhlIGluaXRpYWwgbGF5b3V0IGlzIGF2YWlsYWJsZSwgaS5lLiwgYWZ0ZXIgY29tcGxldGlvbiBvZiBBbmd1bGFyJ3MgaW5pdGlhbCBuYXZpZ2F0aW9uLlxuICAgICAgLy8gT3RoZXJ3aXNlLCB3b3VsZCBvdmVycmlkZSB0aGUgaW5pdGlhbCBsYXlvdXQgYXMgZ2l2ZW4gaW4gdGhlIFVSTC5cbiAgICAgIGlmICghdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9ySW5pdGlhbExheW91dCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBMZXQgdGhlIG5hdmlnYXRvciBjb21wdXRlIHRoZSBuZXcgd29ya2JlbmNoIGxheW91dC5cbiAgICAgIGNvbnN0IGN1cnJlbnRMYXlvdXQgPSB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dCE7XG4gICAgICBsZXQgbmV3TGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCB8IG51bGwgPSBhd2FpdCBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5faW5qZWN0b3IsICgpID0+IG9uTmF2aWdhdGUoY3VycmVudExheW91dCkpO1xuICAgICAgaWYgKCFuZXdMYXlvdXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSB2aWV3cyBtYXJrZWQgZm9yIHJlbW92YWwuXG4gICAgICBuZXdMYXlvdXQgPSBhd2FpdCBuZXdMYXlvdXQucmVtb3ZlVmlld3NNYXJrZWRGb3JSZW1vdmFsKCk7XG5cbiAgICAgIC8vIENyZWF0ZSBleHRyYXMgd2l0aCB3b3JrYmVuY2ggbmF2aWdhdGlvbiBpbnN0cnVjdGlvbnMuXG4gICAgICBleHRyYXMgPSBjcmVhdGVOYXZpZ2F0aW9uRXh0cmFzKG5ld0xheW91dCwgZXh0cmFzKTtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBuZXcgVVJMIHRyZWUuXG4gICAgICBjb25zdCBjb21tYW5kczogQ29tbWFuZHMgPSBjb21wdXRlTmF2aWdhdGlvbkNvbW1hbmRzKGN1cnJlbnRMYXlvdXQudmlld091dGxldHMoKSwgbmV3TGF5b3V0LnZpZXdPdXRsZXRzKCkpO1xuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlci5jcmVhdGVVcmxUcmVlKGNvbW1hbmRzLCBleHRyYXMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgaWYgZ2l2ZW4gdmlldyBjYW4gYmUgY2xvc2VkLCBpbnZva2luZyBgQ2FuQ2xvc2VgIGd1YXJkIGlmIGltcGxlbWVudGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjYW5DbG9zZVZpZXcodmlld1VpZDogVVVJRCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLl93b3JrYmVuY2hWaWV3UmVnaXN0cnkudmlld3MuZmluZCh2aWV3ID0+IHZpZXcudWlkID09PSB2aWV3VWlkKTtcbiAgICBpZiAoIXZpZXcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXZpZXcuY2xvc2FibGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUZXN0IGlmIHRoZSB2aWV3IGltcGxlbWVudHMgYENhbkNsb3NlYCBndWFyZC5cbiAgICBjb25zdCBjb21wb25lbnQgPSB2aWV3LmdldENvbXBvbmVudCgpIGFzIENhbkNsb3NlIHwgbnVsbDtcbiAgICBpZiAodHlwZW9mIGNvbXBvbmVudD8uY2FuQ2xvc2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEludm9rZSBgQ2FuQ2xvc2VgIGd1YXJkIHRvIGRlY2lkZSBpZiB0byBjbG9zZSB0aGUgdmlldy5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FuQ2xvc2UgPSBydW5JbkluamVjdGlvbkNvbnRleHQodmlldy5nZXRDb21wb25lbnRJbmplY3RvcigpISwgKCkgPT4gY29tcG9uZW50LmNhbkNsb3NlKCkpO1xuICAgICAgcmV0dXJuIGF3YWl0IGZpcnN0VmFsdWVGcm9tKE9ic2VydmFibGVzLmNvZXJjZShjYW5DbG9zZSksIHtkZWZhdWx0VmFsdWU6IHRydWV9KTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoYFVuaGFuZGxlZCBlcnJvciB3aGlsZSBpbnZva2luZyAnQ2FuQ2xvc2UnIGd1YXJkIG9mIHZpZXcgJyR7dmlldy5pZH0nLmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBuYXZpZ2F0aW9uLCB3aGVuIGJlaW5nIGludm9rZWQgZHVyaW5nIG5hdmlnYXRpb24sIG9yIHRocm93cyBhbiBlcnJvciBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk6IFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0IHtcbiAgICBpZiAoIXRoaXMuX2N1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1tOYXZpZ2F0ZUVycm9yXSBOYXZpZ2F0aW9uIGNvbnRleHQgbm90IGF2YWlsYWJsZSBiZWNhdXNlIG5vIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3MuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbkNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBuYXZpZ2F0aW9uYWwgY29udGV4dHVhbCBkYXRhLlxuICAgKi9cbiAgcHVibGljIHNldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dChjb250ZXh0OiBXb3JrYmVuY2hOYXZpZ2F0aW9uQ29udGV4dCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbkNvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEJsb2NrcyB1bnRpbCB0aGUgaW5pdGlhbCBsYXlvdXQgaXMgYXZhaWxhYmxlLCBpLmUuIGFmdGVyIGNvbXBsZXRpb24gb2YgQW5ndWxhcidzIGluaXRpYWwgbmF2aWdhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckluaXRpYWxMYXlvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQkKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuYXZpZ2F0aW9uIHRvIG5hdmlnYXRlIHZpZXcocykgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGFycmF5IG9mIGNvbW1hbmRzIGFuZCBleHRyYXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU5hdmlnYXRpb25Gcm9tQ29tbWFuZHMoY29tbWFuZHM6IENvbW1hbmRzLCBleHRyYXM6IFdvcmtiZW5jaE5hdmlnYXRpb25FeHRyYXMpOiDJtU5hdmlnYXRlRm4ge1xuICByZXR1cm4gKGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiDJtVdvcmtiZW5jaExheW91dCB8IG51bGwgPT4ge1xuICAgIGlmIChleHRyYXMuY2xvc2UpIHtcbiAgICAgIGlmIChleHRyYXMudGFyZ2V0KSB7XG4gICAgICAgIGlmIChjb21tYW5kcy5sZW5ndGggfHwgZXh0cmFzLmhpbnQgfHwgZXh0cmFzLnBhcnRJZCB8fCBleHRyYXMucmVsYXRpdmVUbykge1xuICAgICAgICAgIHRocm93IEVycm9yKCdbTmF2aWdhdGVFcnJvcl0gQ29tbWFuZHMsIGhpbnQsIHBhcnQgb3IgcmVsYXRpdmVUbyBtdXN0IG5vdCBiZSBzZXQgd2hlbiBjbG9zaW5nIGEgdmlldyBieSBpZC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5b3V0LnJlbW92ZVZpZXcoZXh0cmFzLnRhcmdldCk7XG4gICAgICB9XG4gICAgICBjb25zdCB1cmxTZWdtZW50cyA9IFJvdXRlclV0aWxzLmNvbW1hbmRzVG9TZWdtZW50cyhjb21tYW5kcywge3JlbGF0aXZlVG86IGV4dHJhcy5yZWxhdGl2ZVRvfSk7XG4gICAgICByZXR1cm4gbGF5b3V0XG4gICAgICAgIC52aWV3cyh7XG4gICAgICAgICAgcGFydElkOiBleHRyYXMucGFydElkLFxuICAgICAgICAgIHNlZ21lbnRzOiBuZXcgVXJsU2VnbWVudE1hdGNoZXIodXJsU2VnbWVudHMsIHttYXRjaE1hdHJpeFBhcmFtczogZmFsc2UsIG1hdGNoV2lsZGNhcmRQYXRoOiB0cnVlfSksXG4gICAgICAgICAgbmF2aWdhdGlvbkhpbnQ6IGV4dHJhcy5oaW50ID8/IG51bGwsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZWR1Y2UoKGxheW91dCwgdmlldykgPT4gbGF5b3V0LnJlbW92ZVZpZXcodmlldy5pZCksIGxheW91dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3dpdGNoIChleHRyYXMudGFyZ2V0ID8/ICdhdXRvJykge1xuICAgICAgICBjYXNlICdibGFuayc6IHtcbiAgICAgICAgICByZXR1cm4gYWRkVmlldyhsYXlvdXQuY29tcHV0ZU5leHRWaWV3SWQoKSwgbGF5b3V0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdhdXRvJzoge1xuICAgICAgICAgIGNvbnN0IHVybFNlZ21lbnRzID0gUm91dGVyVXRpbHMuY29tbWFuZHNUb1NlZ21lbnRzKGNvbW1hbmRzLCB7cmVsYXRpdmVUbzogZXh0cmFzLnJlbGF0aXZlVG99KTtcbiAgICAgICAgICBjb25zdCB2aWV3cyA9IGxheW91dC52aWV3cyh7XG4gICAgICAgICAgICBwYXJ0SWQ6IGV4dHJhcy5wYXJ0SWQsXG4gICAgICAgICAgICBzZWdtZW50czogbmV3IFVybFNlZ21lbnRNYXRjaGVyKHVybFNlZ21lbnRzLCB7bWF0Y2hNYXRyaXhQYXJhbXM6IGZhbHNlLCBtYXRjaFdpbGRjYXJkUGF0aDogZmFsc2V9KSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25IaW50OiBleHRyYXMuaGludCA/PyBudWxsLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh2aWV3cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB2aWV3cy5yZWR1Y2UoKGxheW91dCwgdmlldykgPT4gdXBkYXRlVmlldyh2aWV3LmlkLCBsYXlvdXQpLCBsYXlvdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhZGRWaWV3KGxheW91dC5jb21wdXRlTmV4dFZpZXdJZCgpLCBsYXlvdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3Qgdmlld0lkID0gZXh0cmFzLnRhcmdldCE7XG4gICAgICAgICAgaWYgKGxheW91dC5oYXNWaWV3KHZpZXdJZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVWaWV3KHZpZXdJZCwgbGF5b3V0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYWRkVmlldyh2aWV3SWQsIGxheW91dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgdmlldyB0byB0aGUgbGF5b3V0LlxuICAgKi9cbiAgZnVuY3Rpb24gYWRkVmlldyh2aWV3SWQ6IHN0cmluZywgbGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCk6IMm1V29ya2JlbmNoTGF5b3V0IHtcbiAgICAvLyBEZWZhdWx0IHRvIHRoZSBhY3RpdmUgcGFydCBpZiBub3Qgc3BlY2lmaWVkIG9yIG5vdCBpbiB0aGUgbGF5b3V0LCB3aXRoIHRoZSBhY3RpdmUgcGFydCBvZiB0aGUgbWFpbiBhcmVhIHRha2luZyBwcmVjZWRlbmNlLlxuICAgIGNvbnN0IHBhcnRJZCA9ICgoKTogc3RyaW5nID0+IHtcbiAgICAgIGlmIChleHRyYXMucGFydElkICYmIGxheW91dC5oYXNQYXJ0KGV4dHJhcy5wYXJ0SWQpKSB7XG4gICAgICAgIHJldHVybiBleHRyYXMucGFydElkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxheW91dC5hY3RpdmVQYXJ0KHtncmlkOiAnbWFpbkFyZWEnfSk/LmlkID8/IGxheW91dC5hY3RpdmVQYXJ0KHtncmlkOiAnd29ya2JlbmNoJ30pLmlkO1xuICAgIH0pKCk7XG5cbiAgICByZXR1cm4gbGF5b3V0XG4gICAgICAuYWRkVmlldyh2aWV3SWQsIHtcbiAgICAgICAgcGFydElkOiBwYXJ0SWQsXG4gICAgICAgIHBvc2l0aW9uOiBleHRyYXMucG9zaXRpb24gPz8gJ2FmdGVyLWFjdGl2ZS12aWV3JyxcbiAgICAgICAgYWN0aXZhdGVWaWV3OiBleHRyYXMuYWN0aXZhdGUgPz8gdHJ1ZSxcbiAgICAgIH0pXG4gICAgICAubmF2aWdhdGVWaWV3KHZpZXdJZCwgY29tbWFuZHMsIHtcbiAgICAgICAgcmVsYXRpdmVUbzogZXh0cmFzLnJlbGF0aXZlVG8sXG4gICAgICAgIGhpbnQ6IGV4dHJhcy5oaW50LFxuICAgICAgICBjc3NDbGFzczogZXh0cmFzLmNzc0NsYXNzLFxuICAgICAgICBzdGF0ZTogZXh0cmFzLnN0YXRlLFxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgc3BlY2lmaWVkIHZpZXcuXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVWaWV3KHZpZXdJZDogc3RyaW5nLCBsYXlvdXQ6IMm1V29ya2JlbmNoTGF5b3V0KTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIGlmIChleHRyYXMuYWN0aXZhdGUgPz8gdHJ1ZSkge1xuICAgICAgbGF5b3V0ID0gbGF5b3V0LmFjdGl2YXRlVmlldyh2aWV3SWQpO1xuICAgIH1cblxuICAgIHJldHVybiBsYXlvdXQubmF2aWdhdGVWaWV3KHZpZXdJZCwgY29tbWFuZHMsIHtcbiAgICAgIHJlbGF0aXZlVG86IGV4dHJhcy5yZWxhdGl2ZVRvLFxuICAgICAgaGludDogZXh0cmFzLmhpbnQsXG4gICAgICBjc3NDbGFzczogZXh0cmFzLmNzc0NsYXNzLFxuICAgICAgc3RhdGU6IGV4dHJhcy5zdGF0ZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgbmF2aWdhdGlvbiBleHRyYXMgd2l0aCB3b3JrYmVuY2ggbmF2aWdhdGlvbiBpbnN0cnVjdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU5hdmlnYXRpb25FeHRyYXMobGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCwgZXh0cmFzPzogT21pdDxOYXZpZ2F0aW9uRXh0cmFzLCAncmVsYXRpdmVUbycgfCAnc3RhdGUnPik6IE5hdmlnYXRpb25FeHRyYXMge1xuICBjb25zdCB7d29ya2JlbmNoR3JpZCwgbWFpbkFyZWFHcmlkfSA9IGxheW91dC5zZXJpYWxpemUoKTtcblxuICByZXR1cm4ge1xuICAgIC4uLmV4dHJhcyxcbiAgICAvLyBJbnN0cnVjdCB0aGUgQW5ndWxhciByb3V0ZXIgdG8gcHJvY2VzcyB0aGUgbmF2aWdhdGlvbiBldmVuIGlmIHRoZSBVUkwgZG9lcyBub3QgY2hhbmdlLCBlLmcuLCB3aGVuIGNoYW5naW5nIHRoZSB3b3JrYmVuY2ggZ3JpZCB3aGljaCBpcyBub3QgY29udGFpbmVkIGluIHRoZSBVUkwuXG4gICAgb25TYW1lVXJsTmF2aWdhdGlvbjogJ3JlbG9hZCcsXG4gICAgLy8gVW5zZXQgYHJlbGF0aXZlVG9gIGJlY2F1c2UgY29tbWFuZHMgYXJlIGFscmVhZHkgbm9ybWFsaXplZCB0byB0aGVpciBhYnNvbHV0ZSBmb3JtLlxuICAgIHJlbGF0aXZlVG86IG51bGwsXG4gICAgLy8gQXNzb2NpYXRlIHdvcmtiZW5jaC1zcGVjaWZpYyBzdGF0ZSB3aXRoIHRoZSBuYXZpZ2F0aW9uLlxuICAgIHN0YXRlOiBXb3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZXMuY3JlYXRlKHtcbiAgICAgIHdvcmtiZW5jaEdyaWQ6IHdvcmtiZW5jaEdyaWQsXG4gICAgICBtYXhpbWl6ZWQ6IGxheW91dC5tYXhpbWl6ZWQsXG4gICAgICB2aWV3U3RhdGVzOiBsYXlvdXQudmlld1N0YXRlcygpLFxuICAgIH0pLFxuICAgIC8vIEFkZCB0aGUgbWFpbiBhcmVhIGFzIHF1ZXJ5IHBhcmFtZXRlci5cbiAgICBxdWVyeVBhcmFtczogey4uLmV4dHJhcz8ucXVlcnlQYXJhbXMsIFtNQUlOX0FSRUFfTEFZT1VUX1FVRVJZX1BBUkFNXTogbWFpbkFyZWFHcmlkfSxcbiAgICAvLyBNZXJnZSB3aXRoIGV4aXN0aW5nIHF1ZXJ5IHBhcmFtcyB1bmxlc3Mgc3BlY2lmaWVkIGFuIGV4cGxpY2l0IHN0cmF0ZWd5LCBlLmcuLCBmb3IgbWlncmF0aW5nIGFuIG91dGRhdGVkIGxheW91dCBVUkwuXG4gICAgLy8gTm90ZSB0aGF0IGBudWxsYCBpcyBhIHZhbGlkIHN0cmF0ZWd5IGZvciBjbGVhcmluZyBleGlzdGluZyBxdWVyeSBwYXJhbXMsIHNvIGRvIG5vdCB1c2UgdGhlIG51bGxpc2ggY29hbGVzY2luZyBvcGVyYXRvciAoPz8pLlxuICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IERlZmluZWQub3JFbHNlKGV4dHJhcz8ucXVlcnlQYXJhbXNIYW5kbGluZywgJ21lcmdlJyksXG4gIH07XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgY29tbWFuZHMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBBbmd1bGFyIHJvdXRlciB0byBuYXZpZ2F0ZSB2aWV3IG91dGxldHMgYW5kIHRvIHJlbW92ZSB2aWV3IG91dGxldHMgb2YgcmVtb3ZlZCB2aWV3cy5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZU5hdmlnYXRpb25Db21tYW5kcyhwcmV2aW91c1ZpZXdPdXRsZXRzOiBWaWV3T3V0bGV0cywgbmV4dFZpZXdPdXRsZXRzOiBWaWV3T3V0bGV0cyk6IFt7b3V0bGV0czoge1tvdXRsZXQ6IFZpZXdJZF06IENvbW1hbmRzIHwgbnVsbH19XSB8IFtdIHtcbiAgY29uc3QgcHJldmlvdXNWaWV3T3V0bGV0TWFwID0gbmV3IE1hcDxWaWV3SWQsIFVybFNlZ21lbnRbXT4oT2JqZWN0cy5lbnRyaWVzKHByZXZpb3VzVmlld091dGxldHMpKTtcbiAgY29uc3QgbmV4dFZpZXdPdXRsZXRNYXAgPSBuZXcgTWFwPFZpZXdJZCwgVXJsU2VnbWVudFtdPihPYmplY3RzLmVudHJpZXMobmV4dFZpZXdPdXRsZXRzKSk7XG5cbiAgY29uc3QgY29tbWFuZHMgPSBuZXcgTWFwPFZpZXdJZCwgQ29tbWFuZHMgfCBudWxsPigpO1xuICBjb25zdCB2aWV3SWRzID0gbmV3IFNldDxWaWV3SWQ+KFsuLi5wcmV2aW91c1ZpZXdPdXRsZXRNYXAua2V5cygpLCAuLi5uZXh0Vmlld091dGxldE1hcC5rZXlzKCldKTtcblxuICB2aWV3SWRzLmZvckVhY2godmlld0lkID0+IHtcbiAgICAvLyBUZXN0IGlmIHRoZSB2aWV3IHdhcyBhZGRlZCB0byB0aGUgbGF5b3V0LlxuICAgIGlmICghcHJldmlvdXNWaWV3T3V0bGV0TWFwLmhhcyh2aWV3SWQpKSB7XG4gICAgICBjb21tYW5kcy5zZXQodmlld0lkLCBSb3V0ZXJVdGlscy5zZWdtZW50c1RvQ29tbWFuZHMobmV4dFZpZXdPdXRsZXRNYXAuZ2V0KHZpZXdJZCkhKSk7XG4gICAgfVxuICAgIC8vIFRlc3QgaWYgdGhlIHZpZXcgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbGF5b3V0LlxuICAgIGVsc2UgaWYgKCFuZXh0Vmlld091dGxldE1hcC5oYXModmlld0lkKSkge1xuICAgICAgY29tbWFuZHMuc2V0KHZpZXdJZCwgbnVsbCk7XG4gICAgfVxuICAgIC8vIFRlc3QgaWYgdGhlIHZpZXcgd2FzIHVwZGF0ZWQuXG4gICAgZWxzZSBpZiAoIW5ldyBVcmxTZWdtZW50TWF0Y2hlcihwcmV2aW91c1ZpZXdPdXRsZXRNYXAuZ2V0KHZpZXdJZCkhLCB7bWF0Y2hNYXRyaXhQYXJhbXM6IHRydWUsIG1hdGNoV2lsZGNhcmRQYXRoOiBmYWxzZX0pLm1hdGNoZXMobmV4dFZpZXdPdXRsZXRNYXAuZ2V0KHZpZXdJZCkhKSkge1xuICAgICAgY29tbWFuZHMuc2V0KHZpZXdJZCwgUm91dGVyVXRpbHMuc2VnbWVudHNUb0NvbW1hbmRzKG5leHRWaWV3T3V0bGV0TWFwLmdldCh2aWV3SWQpISkpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWRkIHZpZXcgY29tbWFuZHMgdG8gdGhlICdvdXRsZXRzJyBwcm9wZXJ0eSB0byBiZSBpbnRlcnByZXRlZCBieSB0aGUgQW5ndWxhciByb3V0ZXIuXG4gIHJldHVybiBjb21tYW5kcy5zaXplID8gW3tvdXRsZXRzOiBPYmplY3QuZnJvbUVudHJpZXMoY29tbWFuZHMpfV0gOiBbXTtcbn1cblxuLyoqXG4gKiBAaW5oZXJpdERvY1xuICogQHNlZSBOYXZpZ2F0ZUZuXG4gKi9cbmV4cG9ydCB0eXBlIMm1TmF2aWdhdGVGbiA9IChsYXlvdXQ6IMm1V29ya2JlbmNoTGF5b3V0KSA9PiBQcm9taXNlPMm1V29ya2JlbmNoTGF5b3V0IHwgbnVsbD4gfCDJtVdvcmtiZW5jaExheW91dCB8IG51bGw7XG4iXX0=
359
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiybV3b3JrYmVuY2gtcm91dGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9yb3V0aW5nL8m1d29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFtQixNQUFNLEVBQXNCLE1BQU0saUJBQWlCLENBQUM7QUFFOUUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFBQywwQkFBMEIsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUscUJBQXFCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEgsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDMUUsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDcEUsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGtCQUFrQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDMUYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUU1RSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHdkMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDOztBQUd4RSxrQkFBa0I7QUFFbEIsTUFBTSxPQUFPLGdCQUFnQjtJQWMzQjtRQVppQixZQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pCLDRCQUF1QixH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QUFDLE1BQU0sQ0FBRSxFQUFFLEVBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakssUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkYsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsdUZBQXVGO0lBQ3ZGLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7TmF2aWdhdGlvbkV4dHJhcywgUm91dGVyLCBVcmxTZWdtZW50LCBVcmxUcmVlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtXb3JrYmVuY2hSb3V0ZXJ9IGZyb20gJy4vd29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlJztcbmltcG9ydCB7RGVmaW5lZH0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvdXRpbCc7XG5pbXBvcnQge2Fzc2VydE5vdEluUmVhY3RpdmVDb250ZXh0LCBpbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yLCBOZ1pvbmUsIHJ1bkluSW5qZWN0aW9uQ29udGV4dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1dvcmtiZW5jaExheW91dFNlcnZpY2V9IGZyb20gJy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHtNQUlOX0FSRUFfTEFZT1VUX1FVRVJZX1BBUkFNfSBmcm9tICcuLi93b3JrYmVuY2guY29uc3RhbnRzJztcbmltcG9ydCB7QU5HVUxBUl9ST1VURVJfTVVURVgsIFNpbmdsZVRhc2tFeGVjdXRvcn0gZnJvbSAnLi4vZXhlY3V0b3Ivc2luZ2xlLXRhc2stZXhlY3V0b3InO1xuaW1wb3J0IHtmaXJzdFZhbHVlRnJvbX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1dvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlc30gZnJvbSAnLi93b3JrYmVuY2gtbmF2aWdhdGlvbmFsLXN0YXRlcyc7XG5pbXBvcnQge8m1V29ya2JlbmNoTGF5b3V0fSBmcm9tICcuLi9sYXlvdXQvybV3b3JrYmVuY2gtbGF5b3V0JztcbmltcG9ydCB7Um91dGluZ30gZnJvbSAnLi9yb3V0aW5nLnV0aWwnO1xuaW1wb3J0IHtDb21tYW5kcywgVmlld091dGxldHMsIFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0LCBXb3JrYmVuY2hOYXZpZ2F0aW9uRXh0cmFzfSBmcm9tICcuL3JvdXRpbmcubW9kZWwnO1xuaW1wb3J0IHtWaWV3SWR9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcubW9kZWwnO1xuaW1wb3J0IHtVcmxTZWdtZW50TWF0Y2hlcn0gZnJvbSAnLi91cmwtc2VnbWVudC1tYXRjaGVyJztcbmltcG9ydCB7T2JqZWN0c30gZnJvbSAnLi4vY29tbW9uL29iamVjdHMudXRpbCc7XG5pbXBvcnQge1dPUktCRU5DSF9WSUVXX1JFR0lTVFJZfSBmcm9tICcuLi92aWV3L3dvcmtiZW5jaC12aWV3LnJlZ2lzdHJ5JztcbmltcG9ydCB7ybVXb3JrYmVuY2hWaWV3fSBmcm9tICcuLi92aWV3L8m1d29ya2JlbmNoLXZpZXcubW9kZWwnO1xuXG4vKiogQGluaGVyaXREb2MgKi9cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIMm1V29ya2JlbmNoUm91dGVyIGltcGxlbWVudHMgV29ya2JlbmNoUm91dGVyIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9yb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoTGF5b3V0U2VydmljZSA9IGluamVjdChXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoVmlld1JlZ2lzdHJ5ID0gaW5qZWN0KFdPUktCRU5DSF9WSUVXX1JFR0lTVFJZKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBwcml2YXRlIHJlYWRvbmx5IF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIC8qKiBNdXRleCB0byBzZXJpYWxpemUgV29ya2JlbmNoIFJvdXRlciBuYXZpZ2F0aW9uIHJlcXVlc3RzLCBwcmV2ZW50aW5nIHJhY2UgY29uZGl0aW9ucyB3aGVuIG1vZGlmeWluZyB0aGUgYWN0aXZlIHdvcmtiZW5jaCBsYXlvdXQgdG8gb3BlcmF0ZSBvbiB0aGUgbW9zdC1yZWNlbnQgbGF5b3V0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hSb3V0ZXJNdXRleCA9IG5ldyBTaW5nbGVUYXNrRXhlY3V0b3IoKTtcbiAgLyoqIE11dGV4IHRvIHNlcmlhbGl6ZSBBbmd1bGFyIFJvdXRlciBuYXZpZ2F0aW9uIHJlcXVlc3RzLCBwcmV2ZW50aW5nIHRoZSBjYW5jZWxsYXRpb24gb2YgcHJldmlvdXNseSBpbml0aWF0ZWQgYXN5bmNocm9ub3VzIG5hdmlnYXRpb25zLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9hbmd1bGFyUm91dGVyTXV0ZXggPSBpbmplY3QoQU5HVUxBUl9ST1VURVJfTVVURVgpO1xuICAvKiogSG9sZHMgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbmFsIGNvbnRleHQgZHVyaW5nIGEgd29ya2JlbmNoIG5hdmlnYXRpb24sIG9yIGBudWxsYCBpZiBubyBuYXZpZ2F0aW9uIGlzIGluIHByb2dyZXNzLiAqL1xuICBwcml2YXRlIF9jdXJyZW50TmF2aWdhdGlvbkNvbnRleHQ6IFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5zdHJ1Y3QgdGhlIEFuZ3VsYXIgcm91dGVyIHRvIHByb2Nlc3MgbmF2aWdhdGlvbnMgdGhhdCBkbyBub3QgY2hhbmdlIHRoZSBjdXJyZW50IFVSTCwgaS5lLiwgd2hlbiBvbmx5IHVwZGF0aW5nIG5hdmlnYXRpb24gc3RhdGUuXG4gICAgLy8gRm9yIGV4YW1wbGUsIHRoZSB3b3JrYmVuY2ggZ3JpZCBpcyBwYXNzZWQgdG8gdGhlIG5hdmlnYXRpb24gYXMgc3RhdGUsIG5vdCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gV2l0aG91dCB0aGlzIGZsYWcgc2V0LCBjaGFuZ2VzIHRvXG4gICAgLy8gdGhlIHdvcmtiZW5jaCBncmlkIHdvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgYnJvd3NpbmcgaGlzdG9yeSBzdGFjay5cbiAgICAvLyBBbHRob3VnaCB0aGUgYG9uU2FtZVVybE5hdmlnYXRpb25gIGZsYWcgY2FuIGJlIHNldCBwZXIgbmF2aWdhdGlvbiB2aWEgdGhlIG5hdmlnYXRpb24gZXh0cmFzLCB0aGlzIGlzIG5vdCBzdWZmaWNpZW50IGJlY2F1c2UgdGhlXG4gICAgLy8gQW5ndWxhciByb3V0ZXIgaWdub3JlcyBpdCB3aGVuIG5hdmlnYXRpbmcgYmFjayBhbmQgZm9ydGggaW4gdGhlIGJyb3dzaW5nIGhpc3RvcnkuXG4gICAgLy8gU2VlIEFuZ3VsYXIgcm91dGVyLnRzI3NldFVwTG9jYXRpb25DaGFuZ2VMaXN0ZW5lciBhbmQgcm91dGVyLnRzI25hdmlnYXRlVG9TeW5jV2l0aEJyb3dzZXJcbiAgICB0aGlzLl9yb3V0ZXIub25TYW1lVXJsTmF2aWdhdGlvbiA9ICdyZWxvYWQnO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBuYXZpZ2F0ZShjb21tYW5kczogQ29tbWFuZHMsIGV4dHJhcz86IFdvcmtiZW5jaE5hdmlnYXRpb25FeHRyYXMpOiBQcm9taXNlPGJvb2xlYW4+O1xuICBwdWJsaWMgbmF2aWdhdGUobmF2aWdhdGVGbjogybVOYXZpZ2F0ZUZuLCBleHRyYXM/OiBPbWl0PE5hdmlnYXRpb25FeHRyYXMsICdyZWxhdGl2ZVRvJyB8ICdzdGF0ZSc+KTogUHJvbWlzZTxib29sZWFuPjtcbiAgcHVibGljIG5hdmlnYXRlKGNvbW1hbmRzT3JOYXZpZ2F0ZUZuOiBDb21tYW5kcyB8IMm1TmF2aWdhdGVGbiwgZXh0cmFzPzogV29ya2JlbmNoTmF2aWdhdGlvbkV4dHJhcyB8IE9taXQ8TmF2aWdhdGlvbkV4dHJhcywgJ3JlbGF0aXZlVG8nIHwgJ3N0YXRlJz4pOiBQcm9taXNlPGJvb2xlYW4+O1xuICBwdWJsaWMgYXN5bmMgbmF2aWdhdGUoY29tbWFuZHNPck5hdmlnYXRlRm46IENvbW1hbmRzIHwgybVOYXZpZ2F0ZUZuLCBleHRyYXM/OiBXb3JrYmVuY2hOYXZpZ2F0aW9uRXh0cmFzIHwgT21pdDxOYXZpZ2F0aW9uRXh0cmFzLCAncmVsYXRpdmVUbycgfCAnc3RhdGUnPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGFzc2VydE5vdEluUmVhY3RpdmVDb250ZXh0KHRoaXMubmF2aWdhdGUsICdDYWxsIFdvcmtiZW5jaFJvdXRlci5uYXZpZ2F0ZSgpIGluIGEgbm9uLXJlYWN0aXZlIChub24tdHJhY2tpbmcpIGNvbnRleHQsIHN1Y2ggYXMgd2l0aGluIHRoZSB1bnRyYWNrZWQoKSBmdW5jdGlvbi4nKTtcblxuICAgIC8vIEVuc3VyZSB0byBydW4gaW4gQW5ndWxhciB6b25lLlxuICAgIGlmICghTmdab25lLmlzSW5Bbmd1bGFyWm9uZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fem9uZS5ydW4oKCkgPT4gdGhpcy5uYXZpZ2F0ZShjb21tYW5kc09yTmF2aWdhdGVGbiwgZXh0cmFzKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmF2aWdhdGVGbiA9IHR5cGVvZiBjb21tYW5kc09yTmF2aWdhdGVGbiA9PT0gJ2Z1bmN0aW9uJyA/IGNvbW1hbmRzT3JOYXZpZ2F0ZUZuIDogY3JlYXRlTmF2aWdhdGlvbkZyb21Db21tYW5kcyhjb21tYW5kc09yTmF2aWdhdGVGbiwgZXh0cmFzID8/IHt9KTtcblxuICAgIC8vIFNlcmlhbGl6ZSBuYXZpZ2F0aW9uIHJlcXVlc3RzIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aGVuIG1vZGlmeWluZyB0aGUgYWN0aXZlIHdvcmtiZW5jaCBsYXlvdXQsIGVuc3VyaW5nIGxheW91dCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgb24gdGhlIG1vc3QtcmVjZW50IGxheW91dC5cbiAgICBjb25zdCBuZXdMYXlvdXQgPSBhd2FpdCB0aGlzLl93b3JrYmVuY2hSb3V0ZXJNdXRleC5zdWJtaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgaW5pdGlhbCBsYXlvdXQgaXMgYXZhaWxhYmxlLCBpLmUuLCBhZnRlciBjb21wbGV0aW9uIG9mIEFuZ3VsYXIncyBpbml0aWFsIG5hdmlnYXRpb24uXG4gICAgICAvLyBPdGhlcndpc2UsIHRoaXMgbmF2aWdhdGlvbiB3b3VsZCBvdmVycmlkZSB0aGUgaW5pdGlhbCBsYXlvdXQgYXMgZ2l2ZW4gaW4gdGhlIFVSTC5cbiAgICAgIGlmICghdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JJbml0aWFsTGF5b3V0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIExldCB0aGUgbmF2aWdhdG9yIGNvbXB1dGUgdGhlIG5ldyB3b3JrYmVuY2ggbGF5b3V0LlxuICAgICAgY29uc3QgY3VycmVudExheW91dCA9IHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0KCkhO1xuICAgICAgbGV0IG5ld0xheW91dDogybVXb3JrYmVuY2hMYXlvdXQgfCBudWxsID0gYXdhaXQgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuX2luamVjdG9yLCAoKSA9PiBuYXZpZ2F0ZUZuKGN1cnJlbnRMYXlvdXQpKSBhcyDJtVdvcmtiZW5jaExheW91dDtcbiAgICAgIGlmICghbmV3TGF5b3V0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgdmlld3MgbWFya2VkIGZvciByZW1vdmFsIHRoYXQgaGF2ZSBubyBgQ2FuQ2xvc2VgIGd1YXJkLlxuICAgICAgLy8gVmlld3Mgd2l0aCBhIGBDYW5DbG9zZWAgZ3VhcmQgYXJlIHJlbW92ZWQgbGF0ZXIsIG91dHNpZGUgdGhlIG5hdmlnYXRpb24gbXV0ZXgsIHRvIGF2b2lkIGJsb2NraW5nIHRoZSB3b3JrYmVuY2ggcm91dGVyLlxuICAgICAgbmV3TGF5b3V0ID0gdGhpcy5yZW1vdmVWaWV3c1dpdGhvdXRHdWFyZChuZXdMYXlvdXQpO1xuXG4gICAgICAvLyBTa2lwIG5hdmlnYXRpb24gaWYgdGhlIGxheW91dCBoYXMgbm90IGNoYW5nZWQsIHN1Y2ggYXMgd2hlbiBvbmx5IGNsb3Npbmcgdmlld3Mgd2l0aCBhIGBDYW5DbG9zZWAgZ3VhcmQuXG4gICAgICBpZiAobmV3TGF5b3V0LmVxdWFscyhjdXJyZW50TGF5b3V0LCB7ZXhjbHVkZVZpZXdNYXJrZWRGb3JSZW1vdmFsOiB0cnVlfSkpIHtcbiAgICAgICAgcmV0dXJuIG5ld0xheW91dDtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGV4dHJhcyB3aXRoIHdvcmtiZW5jaCBuYXZpZ2F0aW9uIGluc3RydWN0aW9ucy5cbiAgICAgIGV4dHJhcyA9IGNyZWF0ZU5hdmlnYXRpb25FeHRyYXMoe25ld0xheW91dCwgY3VycmVudExheW91dH0sIGV4dHJhcyk7XG5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIG5hdmlnYXRpb24uXG4gICAgICBjb25zdCBjb21tYW5kczogQ29tbWFuZHMgPSBjb21wdXRlTmF2aWdhdGlvbkNvbW1hbmRzKGN1cnJlbnRMYXlvdXQudmlld091dGxldHMoKSwgbmV3TGF5b3V0LnZpZXdPdXRsZXRzKCkpO1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLl9hbmd1bGFyUm91dGVyTXV0ZXguc3VibWl0KCgpID0+IHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShjb21tYW5kcywgZXh0cmFzKSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIEJsb2NrIHN1YnNlcXVlbnQgbmF2aWdhdGlvbihzKSB1bnRpbCBBbmd1bGFyIGhhcyBmbHVzaGVkIHRoZSBjaGFuZ2VkIGxheW91dCB0byB0aGUgRE9NLlxuICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fem9uZS5vblN0YWJsZSk7XG4gICAgICByZXR1cm4gbmV3TGF5b3V0O1xuICAgIH0pO1xuXG4gICAgaWYgKCFuZXdMYXlvdXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgdmlld3MgbWFya2VkIGZvciByZW1vdmFsLCBjb25maXJtaW5nIGNsb3NpbmcgYnkgY2FsbGluZyBlYWNoIHZpZXcncyBgQ2FuQ2xvc2VgIGd1YXJkLlxuICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVmlld1JlbW92YWwobmV3TGF5b3V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBsYXlvdXQuXG4gICAqXG4gICAqIFVubGlrZSB7QGxpbmsgbmF2aWdhdGV9LCBkb2VzIG5vdCBwZXJmb3JtIHRoZSBuYXZpZ2F0aW9uIGJ1dCByZXR1cm5zIHRoZSBVUkwgdHJlZSBpbnN0ZWFkLlxuICAgKlxuICAgKiBUaGUgcm91dGVyIHdpbGwgaW52b2tlIHRoZSBjYWxsYmFjayBhbmQgcGFzcyB0aGUgY3VycmVudCBsYXlvdXQgZm9yIG1vZGlmaWNhdGlvbi4gVGhlIGNhbGxiYWNrIGNhbiBjYWxsIGBpbmplY3RgIHRvIGdldCBhbnkgcmVxdWlyZWQgZGVwZW5kZW5jaWVzLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgYWRkcyBhIHBhcnQgdG8gdGhlIGxlZnQgb2YgdGhlIG1haW4gYXJlYSwgaW5zZXJ0cyBhIHZpZXcgYW5kIG5hdmlnYXRlcyBpdC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogaW5qZWN0KFdvcmtiZW5jaFJvdXRlcikuY3JlYXRlVXJsVHJlZShsYXlvdXQgPT4gbGF5b3V0XG4gICAqICAgLmFkZFBhcnQoJ2xlZnQnLCB7cmVsYXRpdmVUbzogTUFJTl9BUkVBLCBhbGlnbjogJ2xlZnQnfSlcbiAgICogICAuYWRkVmlldygnbmF2aWdhdG9yJywge3BhcnRJZDogJ2xlZnQnfSlcbiAgICogICAubmF2aWdhdGVWaWV3KCduYXZpZ2F0b3InLCBbJ3BhdGgvdG8vdmlldyddKVxuICAgKiAgIC5hY3RpdmF0ZVZpZXcoJ25hdmlnYXRvcicpLFxuICAgKiApO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIG9uTmF2aWdhdGUgLSBTcGVjaWZpZXMgdGhlIGNhbGxiYWNrIHRvIG1vZGlmeSB0aGUgbGF5b3V0LlxuICAgKiBAcGFyYW0gZXh0cmFzIC0gQ29udHJvbHMgaG93IHRvIHBlcmZvcm0gdGhlIG5hdmlnYXRpb24uXG4gICAqIEBzZWUgTmF2aWdhdGVGblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZVVybFRyZWUob25OYXZpZ2F0ZTogKGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpID0+IFByb21pc2U8ybVXb3JrYmVuY2hMYXlvdXQgfCBudWxsPiB8IMm1V29ya2JlbmNoTGF5b3V0IHwgbnVsbCwgZXh0cmFzPzogT21pdDxOYXZpZ2F0aW9uRXh0cmFzLCAncmVsYXRpdmVUbycgfCAnc3RhdGUnPik6IFByb21pc2U8VXJsVHJlZSB8IG51bGw+IHtcbiAgICBhc3NlcnROb3RJblJlYWN0aXZlQ29udGV4dCh0aGlzLmNyZWF0ZVVybFRyZWUsICdDYWxsIFdvcmtiZW5jaFJvdXRlci5jcmVhdGVVcmxUcmVlKCkgaW4gYSBub24tcmVhY3RpdmUgKG5vbi10cmFja2luZykgY29udGV4dCwgc3VjaCBhcyB3aXRoaW4gdGhlIHVudHJhY2tlZCgpIGZ1bmN0aW9uLicpO1xuXG4gICAgLy8gRW5zdXJlIHRvIHJ1biBpbiBBbmd1bGFyIHpvbmUuXG4gICAgaWYgKCFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl96b25lLnJ1bigoKSA9PiB0aGlzLmNyZWF0ZVVybFRyZWUob25OYXZpZ2F0ZSwgZXh0cmFzKSk7XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIG5hdmlnYXRpb24gcmVxdWVzdHMgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdoZW4gbW9kaWZ5aW5nIHRoZSBhY3RpdmUgd29ya2JlbmNoIGxheW91dCwgZW5zdXJpbmcgbGF5b3V0IG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgbW9zdC1yZWNlbnQgbGF5b3V0LlxuICAgIHJldHVybiB0aGlzLl93b3JrYmVuY2hSb3V0ZXJNdXRleC5zdWJtaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgaW5pdGlhbCBsYXlvdXQgaXMgYXZhaWxhYmxlLCBpLmUuLCBhZnRlciBjb21wbGV0aW9uIG9mIEFuZ3VsYXIncyBpbml0aWFsIG5hdmlnYXRpb24uXG4gICAgICAvLyBPdGhlcndpc2UsIHdvdWxkIG92ZXJyaWRlIHRoZSBpbml0aWFsIGxheW91dCBhcyBnaXZlbiBpbiB0aGUgVVJMLlxuICAgICAgaWYgKCF0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dCgpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckluaXRpYWxMYXlvdXQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gTGV0IHRoZSBuYXZpZ2F0b3IgY29tcHV0ZSB0aGUgbmV3IHdvcmtiZW5jaCBsYXlvdXQuXG4gICAgICBjb25zdCBjdXJyZW50TGF5b3V0ID0gdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQoKSE7XG4gICAgICBsZXQgbmV3TGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCB8IG51bGwgPSBhd2FpdCBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5faW5qZWN0b3IsICgpID0+IG9uTmF2aWdhdGUoY3VycmVudExheW91dCkpO1xuICAgICAgaWYgKCFuZXdMYXlvdXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSB2aWV3cyBtYXJrZWQgZm9yIHJlbW92YWwuXG4gICAgICBuZXdMYXlvdXQudmlld3Moe21hcmtlZEZvclJlbW92YWw6IHRydWV9KS5mb3JFYWNoKHZpZXcgPT4ge1xuICAgICAgICBuZXdMYXlvdXQgPSBuZXdMYXlvdXQhLnJlbW92ZVZpZXcodmlldy5pZCwge2ZvcmNlOiB0cnVlfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQ3JlYXRlIGV4dHJhcyB3aXRoIHdvcmtiZW5jaCBuYXZpZ2F0aW9uIGluc3RydWN0aW9ucy5cbiAgICAgIGV4dHJhcyA9IGNyZWF0ZU5hdmlnYXRpb25FeHRyYXMoe25ld0xheW91dCwgY3VycmVudExheW91dH0sIGV4dHJhcyk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IFVSTCB0cmVlLlxuICAgICAgY29uc3QgY29tbWFuZHM6IENvbW1hbmRzID0gY29tcHV0ZU5hdmlnYXRpb25Db21tYW5kcyhjdXJyZW50TGF5b3V0LnZpZXdPdXRsZXRzKCksIG5ld0xheW91dC52aWV3T3V0bGV0cygpKTtcbiAgICAgIHJldHVybiB0aGlzLl9yb3V0ZXIuY3JlYXRlVXJsVHJlZShjb21tYW5kcywgZXh0cmFzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdmlld3MgbWFya2VkIGZvciByZW1vdmFsIHRoYXQgaGF2ZSBubyBgQ2FuQ2xvc2VgIGd1YXJkLlxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVWaWV3c1dpdGhvdXRHdWFyZChsYXlvdXQ6IMm1V29ya2JlbmNoTGF5b3V0KTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIHJldHVybiBsYXlvdXQudmlld3Moe21hcmtlZEZvclJlbW92YWw6IHRydWV9KS5yZWR1Y2UoKGxheW91dCwgbVZpZXcpID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLl93b3JrYmVuY2hWaWV3UmVnaXN0cnkuZ2V0KG1WaWV3LmlkLCB7b3JFbHNlOiBudWxsfSk7XG4gICAgICBpZiAoIXZpZXcgfHwgKHZpZXcuY2xvc2FibGUoKSAmJiAhdmlldy5jYW5DbG9zZUd1YXJkKSkge1xuICAgICAgICByZXR1cm4gbGF5b3V0LnJlbW92ZVZpZXcobVZpZXcuaWQsIHtmb3JjZTogdHJ1ZX0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxheW91dDtcbiAgICB9LCBsYXlvdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdmlld3MgbWFya2VkIGZvciByZW1vdmFsLCBjb25maXJtaW5nIGNsb3NpbmcgYnkgY2FsbGluZyBlYWNoIHZpZXcncyBgQ2FuQ2xvc2VgIGd1YXJkLlxuICAgKlxuICAgKiBHdWFyZHMgYXJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLCBhbmQgdmlld3MgYXJlIHJlbW92ZWQgaW4gc2VwYXJhdGUgbmF2aWdhdGlvbnMuXG4gICAqXG4gICAqIEByZXR1cm4gYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYHRydWVgIHdoZW4gYWxsIG1hcmtlZCB2aWV3cyB3ZXJlIHN1Y2Nlc3NmdWxseSBjbG9zZWQgb3IgZGVjbGluZWQgY2xvc2luZy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2NoZWR1bGVWaWV3UmVtb3ZhbChsYXlvdXQ6IMm1V29ya2JlbmNoTGF5b3V0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbmF2aWdhdGlvbnMgPSBsYXlvdXQudmlld3Moe21hcmtlZEZvclJlbW92YWw6IHRydWV9KVxuICAgICAgLm1hcChtVmlldyA9PiB0aGlzLl93b3JrYmVuY2hWaWV3UmVnaXN0cnkuZ2V0KG1WaWV3LmlkLCB7b3JFbHNlOiBudWxsfSkpXG4gICAgICAuZmlsdGVyKCh2aWV3KTogdmlldyBpcyDJtVdvcmtiZW5jaFZpZXcgPT4gISF2aWV3ICYmIHZpZXcuY2xvc2FibGUoKSlcbiAgICAgIC5tYXAoYXN5bmMgdmlldyA9PiB7XG4gICAgICAgIC8vIENhcHR1cmUgY3VycmVudCBuYXZpZ2F0aW9uIGlkIHRvIG5vdCBwcm9jZWVkIGNsb3NpbmcgaWYgbmF2aWdhdGVkIGluIHRoZSBtZWFudGltZS5cbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbklkID0gdmlldy5uYXZpZ2F0aW9uSWQ7XG4gICAgICAgIC8vIE1ha2UgdmlldyBub24tY2xvc2FibGUgdG8gcHJldmVudCBjbG9zaW5nIHRoZSB2aWV3IGFnYWluIHdoaWxlIGF3YWl0aW5nIGNsb3NpbmcgY29uZmlybWF0aW9uLlxuICAgICAgICB2aWV3LmNsb3NhYmxlID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY2xvc2UgPSBhd2FpdCB2aWV3LmNhbkNsb3NlR3VhcmQhKCk7XG4gICAgICAgICAgaWYgKGNsb3NlICYmIHZpZXcubmF2aWdhdGlvbklkID09PSBuYXZpZ2F0aW9uSWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRlKGxheW91dCA9PiBsYXlvdXQucmVtb3ZlVmlldyh2aWV3LmlkLCB7Zm9yY2U6IHRydWV9KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgIHZpZXcuY2xvc2FibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIFdhaXQgZm9yIGFsbCBgQ2FuQ2xvc2VgIGd1YXJkcyB0byByZXNvbHZlIGFuZCBzdWJzZXF1ZW50IG5hdmlnYXRpb25zIHRvIGNvbXBsZXRlLlxuICAgIHJldHVybiAoYXdhaXQgUHJvbWlzZS5hbGwobmF2aWdhdGlvbnMpKS5ldmVyeShCb29sZWFuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBuYXZpZ2F0aW9uLCB3aGVuIGJlaW5nIGludm9rZWQgZHVyaW5nIG5hdmlnYXRpb24sIG9yIHRocm93cyBhbiBlcnJvciBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk6IFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0IHtcbiAgICBpZiAoIXRoaXMuX2N1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1tOYXZpZ2F0ZUVycm9yXSBOYXZpZ2F0aW9uIGNvbnRleHQgbm90IGF2YWlsYWJsZSBiZWNhdXNlIG5vIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3MuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbkNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBuYXZpZ2F0aW9uYWwgY29udGV4dHVhbCBkYXRhLlxuICAgKi9cbiAgcHVibGljIHNldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dChjb250ZXh0OiBXb3JrYmVuY2hOYXZpZ2F0aW9uQ29udGV4dCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbkNvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEJsb2NrcyB1bnRpbCB0aGUgaW5pdGlhbCBsYXlvdXQgaXMgYXZhaWxhYmxlLCBpLmUuIGFmdGVyIGNvbXBsZXRpb24gb2YgQW5ndWxhcidzIGluaXRpYWwgbmF2aWdhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckluaXRpYWxMYXlvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQkKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuYXZpZ2F0aW9uIHRvIG5hdmlnYXRlIHZpZXcocykgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGFycmF5IG9mIGNvbW1hbmRzIGFuZCBleHRyYXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU5hdmlnYXRpb25Gcm9tQ29tbWFuZHMoY29tbWFuZHM6IENvbW1hbmRzLCBleHRyYXM6IFdvcmtiZW5jaE5hdmlnYXRpb25FeHRyYXMpOiDJtU5hdmlnYXRlRm4ge1xuICByZXR1cm4gKGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiDJtVdvcmtiZW5jaExheW91dCB8IG51bGwgPT4ge1xuICAgIGlmIChleHRyYXMuY2xvc2UpIHtcbiAgICAgIGlmIChleHRyYXMudGFyZ2V0KSB7XG4gICAgICAgIGlmIChjb21tYW5kcy5sZW5ndGggfHwgZXh0cmFzLmhpbnQgfHwgZXh0cmFzLnBhcnRJZCB8fCBleHRyYXMucmVsYXRpdmVUbykge1xuICAgICAgICAgIHRocm93IEVycm9yKCdbTmF2aWdhdGVFcnJvcl0gQ29tbWFuZHMsIGhpbnQsIHBhcnQgb3IgcmVsYXRpdmVUbyBtdXN0IG5vdCBiZSBzZXQgd2hlbiBjbG9zaW5nIGEgdmlldyBieSBpZC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5b3V0LnJlbW92ZVZpZXcoZXh0cmFzLnRhcmdldCk7XG4gICAgICB9XG4gICAgICBjb25zdCB1cmxTZWdtZW50cyA9IFJvdXRpbmcuY29tbWFuZHNUb1NlZ21lbnRzKGNvbW1hbmRzLCB7cmVsYXRpdmVUbzogZXh0cmFzLnJlbGF0aXZlVG99KTtcbiAgICAgIHJldHVybiBsYXlvdXRcbiAgICAgICAgLnZpZXdzKHtcbiAgICAgICAgICBwYXJ0SWQ6IGV4dHJhcy5wYXJ0SWQsXG4gICAgICAgICAgc2VnbWVudHM6IG5ldyBVcmxTZWdtZW50TWF0Y2hlcih1cmxTZWdtZW50cywge21hdGNoTWF0cml4UGFyYW1zOiBmYWxzZSwgbWF0Y2hXaWxkY2FyZFBhdGg6IHRydWV9KSxcbiAgICAgICAgICBuYXZpZ2F0aW9uSGludDogZXh0cmFzLmhpbnQgPz8gbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlZHVjZSgobGF5b3V0LCB2aWV3KSA9PiBsYXlvdXQucmVtb3ZlVmlldyh2aWV3LmlkKSwgbGF5b3V0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzd2l0Y2ggKGV4dHJhcy50YXJnZXQgPz8gJ2F1dG8nKSB7XG4gICAgICAgIGNhc2UgJ2JsYW5rJzoge1xuICAgICAgICAgIHJldHVybiBhZGRWaWV3KGxheW91dC5jb21wdXRlTmV4dFZpZXdJZCgpLCBsYXlvdXQpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2F1dG8nOiB7XG4gICAgICAgICAgY29uc3QgdXJsU2VnbWVudHMgPSBSb3V0aW5nLmNvbW1hbmRzVG9TZWdtZW50cyhjb21tYW5kcywge3JlbGF0aXZlVG86IGV4dHJhcy5yZWxhdGl2ZVRvfSk7XG4gICAgICAgICAgY29uc3Qgdmlld3MgPSBsYXlvdXQudmlld3Moe1xuICAgICAgICAgICAgcGFydElkOiBleHRyYXMucGFydElkLFxuICAgICAgICAgICAgc2VnbWVudHM6IG5ldyBVcmxTZWdtZW50TWF0Y2hlcih1cmxTZWdtZW50cywge21hdGNoTWF0cml4UGFyYW1zOiBmYWxzZSwgbWF0Y2hXaWxkY2FyZFBhdGg6IGZhbHNlfSksXG4gICAgICAgICAgICBuYXZpZ2F0aW9uSGludDogZXh0cmFzLmhpbnQgPz8gbnVsbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodmlld3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlld3MucmVkdWNlKChsYXlvdXQsIHZpZXcpID0+IHVwZGF0ZVZpZXcodmlldy5pZCwgbGF5b3V0KSwgbGF5b3V0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYWRkVmlldyhsYXlvdXQuY29tcHV0ZU5leHRWaWV3SWQoKSwgbGF5b3V0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IHZpZXdJZCA9IGV4dHJhcy50YXJnZXQhO1xuICAgICAgICAgIGlmIChsYXlvdXQuaGFzVmlldyh2aWV3SWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlVmlldyh2aWV3SWQsIGxheW91dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGFkZFZpZXcodmlld0lkLCBsYXlvdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQWRkcyB0aGUgc3BlY2lmaWVkIHZpZXcgdG8gdGhlIGxheW91dC5cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFZpZXcodmlld0lkOiBzdHJpbmcsIGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiDJtVdvcmtiZW5jaExheW91dCB7XG4gICAgLy8gRGVmYXVsdCB0byB0aGUgYWN0aXZlIHBhcnQgaWYgbm90IHNwZWNpZmllZCBvciBub3QgaW4gdGhlIGxheW91dCwgd2l0aCB0aGUgYWN0aXZlIHBhcnQgb2YgdGhlIG1haW4gYXJlYSB0YWtpbmcgcHJlY2VkZW5jZS5cbiAgICBjb25zdCBwYXJ0SWQgPSAoKCk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAoZXh0cmFzLnBhcnRJZCAmJiBsYXlvdXQuaGFzUGFydChleHRyYXMucGFydElkKSkge1xuICAgICAgICByZXR1cm4gZXh0cmFzLnBhcnRJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYXlvdXQuYWN0aXZlUGFydCh7Z3JpZDogJ21haW5BcmVhJ30pPy5pZCA/PyBsYXlvdXQuYWN0aXZlUGFydCh7Z3JpZDogJ3dvcmtiZW5jaCd9KS5pZDtcbiAgICB9KSgpO1xuXG4gICAgcmV0dXJuIGxheW91dFxuICAgICAgLmFkZFZpZXcodmlld0lkLCB7XG4gICAgICAgIHBhcnRJZDogcGFydElkLFxuICAgICAgICBwb3NpdGlvbjogZXh0cmFzLnBvc2l0aW9uID8/ICdhZnRlci1hY3RpdmUtdmlldycsXG4gICAgICAgIGFjdGl2YXRlVmlldzogZXh0cmFzLmFjdGl2YXRlID8/IHRydWUsXG4gICAgICAgIGFjdGl2YXRlUGFydDogZXh0cmFzLmFjdGl2YXRlID8/IHRydWUsXG4gICAgICB9KVxuICAgICAgLm5hdmlnYXRlVmlldyh2aWV3SWQsIGNvbW1hbmRzLCB7XG4gICAgICAgIHJlbGF0aXZlVG86IGV4dHJhcy5yZWxhdGl2ZVRvLFxuICAgICAgICBoaW50OiBleHRyYXMuaGludCxcbiAgICAgICAgY3NzQ2xhc3M6IGV4dHJhcy5jc3NDbGFzcyxcbiAgICAgICAgZGF0YTogZXh0cmFzLmRhdGEsXG4gICAgICAgIHN0YXRlOiBleHRyYXMuc3RhdGUsXG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBzcGVjaWZpZWQgdmlldy5cbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVZpZXcodmlld0lkOiBzdHJpbmcsIGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiDJtVdvcmtiZW5jaExheW91dCB7XG4gICAgaWYgKGV4dHJhcy5hY3RpdmF0ZSA/PyB0cnVlKSB7XG4gICAgICBsYXlvdXQgPSBsYXlvdXQuYWN0aXZhdGVWaWV3KHZpZXdJZCwge2FjdGl2YXRlUGFydDogdHJ1ZX0pO1xuICAgIH1cblxuICAgIHJldHVybiBsYXlvdXQubmF2aWdhdGVWaWV3KHZpZXdJZCwgY29tbWFuZHMsIHtcbiAgICAgIHJlbGF0aXZlVG86IGV4dHJhcy5yZWxhdGl2ZVRvLFxuICAgICAgaGludDogZXh0cmFzLmhpbnQsXG4gICAgICBjc3NDbGFzczogZXh0cmFzLmNzc0NsYXNzLFxuICAgICAgZGF0YTogZXh0cmFzLmRhdGEsXG4gICAgICBzdGF0ZTogZXh0cmFzLnN0YXRlLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBuYXZpZ2F0aW9uIGV4dHJhcyB3aXRoIHdvcmtiZW5jaCBuYXZpZ2F0aW9uIGluc3RydWN0aW9ucy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTmF2aWdhdGlvbkV4dHJhcyhsYXlvdXRzOiB7bmV3TGF5b3V0OiDJtVdvcmtiZW5jaExheW91dDsgY3VycmVudExheW91dD86IMm1V29ya2JlbmNoTGF5b3V0IHwgdW5kZWZpbmVkfSwgZXh0cmFzPzogT21pdDxOYXZpZ2F0aW9uRXh0cmFzLCAncmVsYXRpdmVUbycgfCAnc3RhdGUnPik6IE5hdmlnYXRpb25FeHRyYXMge1xuICBjb25zdCB7bmV3TGF5b3V0LCBjdXJyZW50TGF5b3V0fSA9IGxheW91dHM7XG4gIGNvbnN0IHt3b3JrYmVuY2hHcmlkLCBtYWluQXJlYUdyaWR9ID0gbmV3TGF5b3V0LnNlcmlhbGl6ZSh7ZXhjbHVkZVZpZXdNYXJrZWRGb3JSZW1vdmFsOiB0cnVlfSk7XG5cbiAgLy8gSU1QT1JUQU5UOiBVcGRhdGUgYMm1V29ya2JlbmNoTGF5b3V0LmVxdWFsc2AgZnVuY3Rpb24gd2hlbiBhZGRpbmcgbmV3IHN0YXRlIHByb3BlcnRpZXMuXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5leHRyYXMsXG4gICAgLy8gSW5zdHJ1Y3QgdGhlIEFuZ3VsYXIgcm91dGVyIHRvIHByb2Nlc3MgdGhlIG5hdmlnYXRpb24gZXZlbiBpZiB0aGUgVVJMIGRvZXMgbm90IGNoYW5nZSwgZS5nLiwgd2hlbiBjaGFuZ2luZyB0aGUgd29ya2JlbmNoIGdyaWQgd2hpY2ggaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUgVVJMLlxuICAgIG9uU2FtZVVybE5hdmlnYXRpb246ICdyZWxvYWQnLFxuICAgIC8vIFVuc2V0IGByZWxhdGl2ZVRvYCBiZWNhdXNlIGNvbW1hbmRzIGFyZSBhbHJlYWR5IG5vcm1hbGl6ZWQgdG8gdGhlaXIgYWJzb2x1dGUgZm9ybS5cbiAgICByZWxhdGl2ZVRvOiBudWxsLFxuICAgIC8vIEFzc29jaWF0ZSB3b3JrYmVuY2gtc3BlY2lmaWMgc3RhdGUgd2l0aCB0aGUgbmF2aWdhdGlvbi5cbiAgICBzdGF0ZTogV29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGVzLmNyZWF0ZSh7XG4gICAgICB3b3JrYmVuY2hHcmlkOiB3b3JrYmVuY2hHcmlkLFxuICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGxheW91dCdzIHBlcnNwZWN0aXZlIGlmIG5vdCBzcGVjaWZpZWQgYnkgdGhlIG5ldyBsYXlvdXQsXG4gICAgICAvLyBlLmcuLCB0aGUgbmF2aWdhdG9yIHByb3ZpZGVzIGEgbmV3IGxheW91dCB0byByZXBsYWNlIHRoZSBjdXJyZW50IGxheW91dC5cbiAgICAgIHBlcnNwZWN0aXZlSWQ6IG5ld0xheW91dC5wZXJzcGVjdGl2ZUlkID8/IGN1cnJlbnRMYXlvdXQ/LnBlcnNwZWN0aXZlSWQsXG4gICAgICBtYXhpbWl6ZWQ6IG5ld0xheW91dC5tYXhpbWl6ZWQsXG4gICAgICBuYXZpZ2F0aW9uU3RhdGVzOiBuZXdMYXlvdXQubmF2aWdhdGlvblN0YXRlcygpLFxuICAgIH0pLFxuICAgIC8vIEFkZCB0aGUgbWFpbiBhcmVhIGFzIHF1ZXJ5IHBhcmFtZXRlci5cbiAgICBxdWVyeVBhcmFtczogey4uLmV4dHJhcz8ucXVlcnlQYXJhbXMsIFtNQUlOX0FSRUFfTEFZT1VUX1FVRVJZX1BBUkFNXTogbWFpbkFyZWFHcmlkfSxcbiAgICAvLyBNZXJnZSB3aXRoIGV4aXN0aW5nIHF1ZXJ5IHBhcmFtcyB1bmxlc3Mgc3BlY2lmaWVkIGFuIGV4cGxpY2l0IHN0cmF0ZWd5LCBlLmcuLCBmb3IgbWlncmF0aW5nIGFuIG91dGRhdGVkIGxheW91dCBVUkwuXG4gICAgLy8gTm90ZSB0aGF0IGBudWxsYCBpcyBhIHZhbGlkIHN0cmF0ZWd5IGZvciBjbGVhcmluZyBleGlzdGluZyBxdWVyeSBwYXJhbXMsIHNvIGRvIG5vdCB1c2UgdGhlIG51bGxpc2ggY29hbGVzY2luZyBvcGVyYXRvciAoPz8pLlxuICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IERlZmluZWQub3JFbHNlKGV4dHJhcz8ucXVlcnlQYXJhbXNIYW5kbGluZywgJ21lcmdlJyksXG4gIH07XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgY29tbWFuZHMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBBbmd1bGFyIHJvdXRlciB0byBuYXZpZ2F0ZSB2aWV3IG91dGxldHMgYW5kIHRvIHJlbW92ZSB2aWV3IG91dGxldHMgb2YgcmVtb3ZlZCB2aWV3cy5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZU5hdmlnYXRpb25Db21tYW5kcyhwcmV2aW91c1ZpZXdPdXRsZXRzOiBWaWV3T3V0bGV0cywgbmV4dFZpZXdPdXRsZXRzOiBWaWV3T3V0bGV0cyk6IFt7b3V0bGV0czoge1tvdXRsZXQ6IFZpZXdJZF06IENvbW1hbmRzIHwgbnVsbH19XSB8IFtdIHtcbiAgY29uc3QgcHJldmlvdXNWaWV3T3V0bGV0TWFwID0gbmV3IE1hcDxWaWV3SWQsIFVybFNlZ21lbnRbXT4oT2JqZWN0cy5lbnRyaWVzKHByZXZpb3VzVmlld091dGxldHMpKTtcbiAgY29uc3QgbmV4dFZpZXdPdXRsZXRNYXAgPSBuZXcgTWFwPFZpZXdJZCwgVXJsU2VnbWVudFtdPihPYmplY3RzLmVudHJpZXMobmV4dFZpZXdPdXRsZXRzKSk7XG5cbiAgY29uc3QgY29tbWFuZHMgPSBuZXcgTWFwPFZpZXdJZCwgQ29tbWFuZHMgfCBudWxsPigpO1xuICBjb25zdCB2aWV3SWRzID0gbmV3IFNldDxWaWV3SWQ+KFsuLi5wcmV2aW91c1ZpZXdPdXRsZXRNYXAua2V5cygpLCAuLi5uZXh0Vmlld091dGxldE1hcC5rZXlzKCldKTtcblxuICB2aWV3SWRzLmZvckVhY2godmlld0lkID0+IHtcbiAgICAvLyBUZXN0IGlmIHRoZSB2aWV3IHdhcyBhZGRlZCB0byB0aGUgbGF5b3V0LlxuICAgIGlmICghcHJldmlvdXNWaWV3T3V0bGV0TWFwLmhhcyh2aWV3SWQpKSB7XG4gICAgICBjb21tYW5kcy5zZXQodmlld0lkLCBSb3V0aW5nLnNlZ21lbnRzVG9Db21tYW5kcyhuZXh0Vmlld091dGxldE1hcC5nZXQodmlld0lkKSEpKTtcbiAgICB9XG4gICAgLy8gVGVzdCBpZiB0aGUgdmlldyB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBsYXlvdXQuXG4gICAgZWxzZSBpZiAoIW5leHRWaWV3T3V0bGV0TWFwLmhhcyh2aWV3SWQpKSB7XG4gICAgICBjb21tYW5kcy5zZXQodmlld0lkLCBudWxsKTtcbiAgICB9XG4gICAgLy8gVGVzdCBpZiB0aGUgdmlldyB3YXMgdXBkYXRlZC5cbiAgICBlbHNlIGlmICghbmV3IFVybFNlZ21lbnRNYXRjaGVyKHByZXZpb3VzVmlld091dGxldE1hcC5nZXQodmlld0lkKSEsIHttYXRjaE1hdHJpeFBhcmFtczogdHJ1ZSwgbWF0Y2hXaWxkY2FyZFBhdGg6IGZhbHNlfSkubWF0Y2hlcyhuZXh0Vmlld091dGxldE1hcC5nZXQodmlld0lkKSEpKSB7XG4gICAgICBjb21tYW5kcy5zZXQodmlld0lkLCBSb3V0aW5nLnNlZ21lbnRzVG9Db21tYW5kcyhuZXh0Vmlld091dGxldE1hcC5nZXQodmlld0lkKSEpKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFkZCB2aWV3IGNvbW1hbmRzIHRvIHRoZSAnb3V0bGV0cycgcHJvcGVydHkgdG8gYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIEFuZ3VsYXIgcm91dGVyLlxuICByZXR1cm4gY29tbWFuZHMuc2l6ZSA/IFt7b3V0bGV0czogT2JqZWN0LmZyb21FbnRyaWVzKGNvbW1hbmRzKX1dIDogW107XG59XG5cbi8qKlxuICogQGluaGVyaXREb2NcbiAqIEBzZWUgTmF2aWdhdGVGblxuICovXG5leHBvcnQgdHlwZSDJtU5hdmlnYXRlRm4gPSAobGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCkgPT4gUHJvbWlzZTzJtVdvcmtiZW5jaExheW91dCB8IG51bGw+IHwgybVXb3JrYmVuY2hMYXlvdXQgfCBudWxsO1xuIl19
@@ -15,10 +15,10 @@ import * as i0 from "@angular/core";
15
15
  */
16
16
  export class SplashComponent {
17
17
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: SplashComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: SplashComponent, isStandalone: true, selector: "wb-splash", ngImport: i0, template: "<sci-throbber type=\"ellipsis\"></sci-throbber>\n", styles: [":host{display:grid;justify-content:center;margin-top:3em}:host>sci-throbber{--sci-throbber-size: 80px}\n"], dependencies: [{ kind: "component", type: SciThrobberComponent, selector: "sci-throbber", inputs: ["type"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
18
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: SplashComponent, isStandalone: true, selector: "wb-splash", ngImport: i0, template: "<sci-throbber type=\"ellipsis\"/>\n", styles: [":host{display:grid;justify-content:center;margin-top:3em}:host>sci-throbber{--sci-throbber-size: 80px}\n"], dependencies: [{ kind: "component", type: SciThrobberComponent, selector: "sci-throbber", inputs: ["type"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
19
19
  }
20
20
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: SplashComponent, decorators: [{
21
21
  type: Component,
22
- args: [{ selector: 'wb-splash', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [SciThrobberComponent], template: "<sci-throbber type=\"ellipsis\"></sci-throbber>\n", styles: [":host{display:grid;justify-content:center;margin-top:3em}:host>sci-throbber{--sci-throbber-size: 80px}\n"] }]
22
+ args: [{ selector: 'wb-splash', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [SciThrobberComponent], template: "<sci-throbber type=\"ellipsis\"/>\n", styles: [":host{display:grid;justify-content:center;margin-top:3em}:host>sci-throbber{--sci-throbber-size: 80px}\n"] }]
23
23
  }] });
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsYXNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3N0YXJ0dXAvc3BsYXNoL3NwbGFzaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9zdGFydHVwL3NwbGFzaC9zcGxhc2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDOztBQUVoRTs7R0FFRztBQVNILE1BQU0sT0FBTyxlQUFlOzhHQUFmLGVBQWU7a0dBQWYsZUFBZSxxRUN4QjVCLG1EQUNBLGtLRHFCWSxvQkFBb0I7OzJGQUVuQixlQUFlO2tCQVIzQixTQUFTOytCQUNFLFdBQVcsbUJBR0osdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1AsQ0FBQyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMiBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U2NpVGhyb2JiZXJDb21wb25lbnR9IGZyb20gJ0BzY2lvbi9jb21wb25lbnRzL3Rocm9iYmVyJztcblxuLyoqXG4gKiBEZWZhdWx0IHNwbGFzaCBkaXNwbGF5ZWQgd2hpbGUgc3RhcnRpbmcgdGhlIHdvcmtiZW5jaC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd2Itc3BsYXNoJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NwbGFzaC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwbGFzaC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1NjaVRocm9iYmVyQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgU3BsYXNoQ29tcG9uZW50IHtcbn1cbiIsIjxzY2ktdGhyb2JiZXIgdHlwZT1cImVsbGlwc2lzXCI+PC9zY2ktdGhyb2JiZXI+XG4iXX0=
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsYXNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3N0YXJ0dXAvc3BsYXNoL3NwbGFzaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9zdGFydHVwL3NwbGFzaC9zcGxhc2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDOztBQUVoRTs7R0FFRztBQVNILE1BQU0sT0FBTyxlQUFlOzhHQUFmLGVBQWU7a0dBQWYsZUFBZSxxRUN4QjVCLHFDQUNBLGtLRHFCWSxvQkFBb0I7OzJGQUVuQixlQUFlO2tCQVIzQixTQUFTOytCQUNFLFdBQVcsbUJBR0osdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1AsQ0FBQyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMiBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U2NpVGhyb2JiZXJDb21wb25lbnR9IGZyb20gJ0BzY2lvbi9jb21wb25lbnRzL3Rocm9iYmVyJztcblxuLyoqXG4gKiBEZWZhdWx0IHNwbGFzaCBkaXNwbGF5ZWQgd2hpbGUgc3RhcnRpbmcgdGhlIHdvcmtiZW5jaC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd2Itc3BsYXNoJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NwbGFzaC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwbGFzaC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1NjaVRocm9iYmVyQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgU3BsYXNoQ29tcG9uZW50IHtcbn1cbiIsIjxzY2ktdGhyb2JiZXIgdHlwZT1cImVsbGlwc2lzXCIvPlxuIl19