@scion/workbench 17.0.0-beta.7 → 17.0.0-beta.9

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 (304) hide show
  1. package/README.md +1 -1
  2. package/esm2022/lib/activation-instant.provider.mjs +3 -3
  3. package/esm2022/lib/common/asserts.util.mjs +2 -2
  4. package/esm2022/lib/common/coerce-observable.pipe.mjs +3 -3
  5. package/esm2022/lib/common/filter-by-predicate.pipe.mjs +3 -3
  6. package/esm2022/lib/common/filter-by-text.pipe.mjs +3 -3
  7. package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +6 -6
  8. package/esm2022/lib/common/instanceof.pipe.mjs +3 -3
  9. package/esm2022/lib/common/map-coerce.pipe.mjs +3 -3
  10. package/esm2022/lib/common/null-if-empty.pipe.mjs +3 -3
  11. package/esm2022/lib/common/objects.util.mjs +34 -0
  12. package/esm2022/lib/common/typeof.pipe.mjs +3 -3
  13. package/esm2022/lib/common/uuid.util.mjs +17 -0
  14. package/esm2022/lib/content-projection/content-as-overlay.component.mjs +3 -3
  15. package/esm2022/lib/content-projection/content-projection.directive.mjs +3 -3
  16. package/esm2022/lib/dialog/dialog-footer/dialog-action-filter.pipe.mjs +3 -3
  17. package/esm2022/lib/dialog/dialog-footer/dialog-footer.component.mjs +3 -3
  18. package/esm2022/lib/dialog/dialog-footer/workbench-dialog-action.directive.mjs +9 -6
  19. package/esm2022/lib/dialog/dialog-footer/workbench-dialog-footer.directive.mjs +9 -6
  20. package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +3 -3
  21. package/esm2022/lib/dialog/dialog-header/workbench-dialog-header.directive.mjs +9 -6
  22. package/esm2022/lib/dialog/movable.directive.mjs +3 -3
  23. package/esm2022/lib/dialog/resizable.directive.mjs +3 -3
  24. package/esm2022/lib/dialog/workbench-dialog.component.mjs +53 -24
  25. package/esm2022/lib/dialog/workbench-dialog.mjs +1 -1
  26. package/esm2022/lib/dialog/workbench-dialog.options.mjs +1 -1
  27. package/esm2022/lib/dialog/workbench-dialog.registry.mjs +4 -4
  28. package/esm2022/lib/dialog/workbench-dialog.service.mjs +5 -5
  29. package/esm2022/lib/dialog//311/265workbench-dialog.mjs +7 -7
  30. package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +3 -3
  31. package/esm2022/lib/executor/single-task-executor.mjs +26 -7
  32. package/esm2022/lib/filter-field/filter-field.component.mjs +6 -6
  33. package/esm2022/lib/glass-pane/glass-pane.directive.mjs +15 -7
  34. package/esm2022/lib/layout/grid-element/grid-element.component.mjs +10 -10
  35. package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +6 -4
  36. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v1.model.mjs +11 -0
  37. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v2.model.mjs +11 -0
  38. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v3.model.mjs +11 -0
  39. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v4.model.mjs +11 -0
  40. package/esm2022/lib/layout/migration/workbench-layout-migration-v2.service.mjs +59 -0
  41. package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +117 -0
  42. package/esm2022/lib/layout/migration/workbench-layout-migration-v4.service.mjs +57 -0
  43. package/esm2022/lib/layout/workbench-layout.component.mjs +6 -4
  44. package/esm2022/lib/layout/workbench-layout.factory.mjs +4 -4
  45. package/esm2022/lib/layout/workbench-layout.mjs +1 -1
  46. package/esm2022/lib/layout/workbench-layout.model.mjs +5 -6
  47. package/esm2022/lib/layout/workbench-layout.service.mjs +3 -3
  48. package/esm2022/lib/layout/workbench-layouts.util.mjs +37 -1
  49. package/esm2022/lib/layout/workench-layout-serializer.service.mjs +53 -21
  50. package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +8 -5
  51. package/esm2022/lib/layout//311/265workbench-layout.mjs +382 -195
  52. package/esm2022/lib/logging/console-appender.service.mjs +3 -3
  53. package/esm2022/lib/logging/logger.mjs +3 -3
  54. package/esm2022/lib/logging/logging-support.mjs +4 -4
  55. package/esm2022/lib/logging/logging.model.mjs +3 -3
  56. package/esm2022/lib/logging//311/265logger.mjs +3 -3
  57. package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +18 -20
  58. package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +3 -3
  59. package/esm2022/lib/message-box/workbench-message-box.component.mjs +15 -6
  60. package/esm2022/lib/message-box/workbench-message-box.options.mjs +1 -1
  61. package/esm2022/lib/message-box/workbench-message-box.service.mjs +5 -5
  62. package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +5 -5
  63. package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +26 -13
  64. package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +3 -3
  65. package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +25 -13
  66. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +3 -3
  67. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +11 -11
  68. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +5 -5
  69. package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +11 -9
  70. package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +112 -0
  71. package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +43 -0
  72. package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +16 -13
  73. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +34 -0
  74. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.interceptor.mjs +88 -0
  75. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-legacy-intent-translator.interceptor.mjs +32 -0
  76. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +121 -0
  77. package/esm2022/lib/microfrontend-platform/microfrontend-notification/microfrontend-notification-intent-handler.service.mjs +3 -3
  78. package/esm2022/lib/microfrontend-platform/microfrontend-platform-config-loader.mjs +3 -3
  79. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +3 -3
  80. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +9 -6
  81. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +9 -15
  82. package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +3 -3
  83. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +4 -4
  84. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +37 -32
  85. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.mjs +3 -3
  86. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +3 -3
  87. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +13 -11
  88. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +14 -9
  89. package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +54 -23
  90. package/esm2022/lib/migration/workbench-migration.mjs +11 -0
  91. package/esm2022/lib/migration/workbench-migrator.mjs +38 -0
  92. package/esm2022/lib/notification/notification-css-classes.pipe.mjs +3 -3
  93. package/esm2022/lib/notification/notification-list.component.mjs +3 -3
  94. package/esm2022/lib/notification/notification.component.mjs +3 -3
  95. package/esm2022/lib/notification/notification.config.mjs +1 -1
  96. package/esm2022/lib/notification/notification.mjs +1 -1
  97. package/esm2022/lib/notification/notification.service.mjs +9 -9
  98. package/esm2022/lib/notification/text-notification.component.mjs +3 -3
  99. package/esm2022/lib/page-not-found/format-url.pipe.mjs +26 -0
  100. package/esm2022/lib/page-not-found/page-not-found.component.mjs +28 -0
  101. package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +3 -3
  102. package/esm2022/lib/part/part-action-bar/part-action-filter.pipe.mjs +3 -3
  103. package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +4 -4
  104. package/esm2022/lib/part/part-bar/part-bar.component.mjs +10 -8
  105. package/esm2022/lib/part/part-portal.pipe.mjs +3 -3
  106. package/esm2022/lib/part/part.component.mjs +6 -4
  107. package/esm2022/lib/part/view-context-menu/accelerator-format.pipe.mjs +3 -3
  108. package/esm2022/lib/part/view-context-menu/text.component.mjs +3 -3
  109. package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +3 -3
  110. package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +4 -4
  111. package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +18 -18
  112. package/esm2022/lib/part/view-list/view-list.component.mjs +3 -3
  113. package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +3 -3
  114. package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +9 -9
  115. package/esm2022/lib/part/view-tab/view-tab.component.mjs +13 -11
  116. package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +5 -5
  117. package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +9 -9
  118. package/esm2022/lib/part/workbench-part-action.registry.mjs +3 -3
  119. package/esm2022/lib/part/workbench-part.model.mjs +1 -1
  120. package/esm2022/lib/part/workbench-part.registry.mjs +3 -3
  121. package/esm2022/lib/part//311/265workbench-part.model.mjs +3 -3
  122. package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v1.model.mjs +11 -0
  123. package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v2.model.mjs +11 -0
  124. package/esm2022/lib/perspective/migration/workbench-perspective-migration-v2.service.mjs +57 -0
  125. package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +19 -51
  126. package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +23 -18
  127. package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +27 -42
  128. package/esm2022/lib/perspective/workbench-perspective.model.mjs +1 -1
  129. package/esm2022/lib/perspective/workbench-perspective.registry.mjs +3 -3
  130. package/esm2022/lib/perspective/workbench-perspective.service.mjs +15 -10
  131. package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +62 -0
  132. package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +98 -78
  133. package/esm2022/lib/popup/popup.component.mjs +22 -10
  134. package/esm2022/lib/popup/popup.config.mjs +3 -1
  135. package/esm2022/lib/popup/popup.service.mjs +4 -4
  136. package/esm2022/lib/portal/workbench-portal-outlet.directive.mjs +6 -6
  137. package/esm2022/lib/public_api.mjs +3 -2
  138. package/esm2022/lib/registry/workbench-object-registry.mjs +3 -3
  139. package/esm2022/lib/routing/empty-outlet/empty-outlet.component.mjs +31 -0
  140. package/esm2022/lib/routing/public_api.mjs +1 -1
  141. package/esm2022/lib/routing/router.util.mjs +89 -35
  142. package/esm2022/lib/routing/routing.model.mjs +1 -1
  143. package/esm2022/lib/routing/url-segment-matcher.mjs +46 -0
  144. package/esm2022/lib/routing/workbench-auxiliary-routes-registrator.service.mjs +58 -49
  145. package/esm2022/lib/routing/workbench-dialog-differ.mjs +6 -6
  146. package/esm2022/lib/routing/workbench-layout-differ.mjs +14 -17
  147. package/esm2022/lib/routing/workbench-message-box-differ.mjs +51 -0
  148. package/esm2022/lib/routing/workbench-navigational-states.mjs +4 -28
  149. package/esm2022/lib/routing/workbench-popup-differ.mjs +6 -6
  150. package/esm2022/lib/routing/workbench-route-data.mjs +14 -4
  151. package/esm2022/lib/routing/workbench-router-link.directive.mjs +24 -32
  152. package/esm2022/lib/routing/workbench-router.service.mjs +13 -378
  153. package/esm2022/lib/routing/workbench-url-observer.service.mjs +69 -82
  154. package/esm2022/lib/routing//311/265location.mjs +3 -3
  155. package/esm2022/lib/routing//311/265workbench-router.service.mjs +314 -0
  156. package/esm2022/lib/startup/splash/splash.component.mjs +3 -3
  157. package/esm2022/lib/startup/workbench-launcher.service.mjs +11 -11
  158. package/esm2022/lib/storage/workbench-storage.mjs +3 -3
  159. package/esm2022/lib/testing/public_api.mjs +2 -1
  160. package/esm2022/lib/testing/workbench-testing.module.mjs +13 -39
  161. package/esm2022/lib/testing/workbench.provider.mjs +60 -0
  162. package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +3 -3
  163. package/esm2022/lib/view/public_api.mjs +2 -1
  164. package/esm2022/lib/view/view-move-handler.service.mjs +42 -62
  165. package/esm2022/lib/view/view-portal.pipe.mjs +4 -4
  166. package/esm2022/lib/view/view.component.mjs +20 -40
  167. package/esm2022/lib/view/workbench-view-route-guards.mjs +47 -0
  168. package/esm2022/lib/view/workbench-view.model.mjs +6 -4
  169. package/esm2022/lib/view/workbench-view.registry.mjs +4 -4
  170. package/esm2022/lib/view//311/265workbench-view.model.mjs +106 -27
  171. package/esm2022/lib/view-dnd/requires-drop-zone.pipe.mjs +7 -7
  172. package/esm2022/lib/view-dnd/view-drag.service.mjs +6 -6
  173. package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +3 -3
  174. package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +4 -4
  175. package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +6 -4
  176. package/esm2022/lib/workbench-config.mjs +15 -0
  177. package/esm2022/lib/workbench-id.mjs +3 -3
  178. package/esm2022/lib/workbench.component.mjs +20 -12
  179. package/esm2022/lib/workbench.constants.mjs +7 -9
  180. package/esm2022/lib/workbench.model.mjs +1 -1
  181. package/esm2022/lib/workbench.module.mjs +15 -86
  182. package/esm2022/lib/workbench.provider.mjs +117 -0
  183. package/esm2022/lib/workbench.service.mjs +5 -5
  184. package/esm2022/lib//311/265workbench.service.mjs +15 -21
  185. package/fesm2022/scion-workbench.mjs +5490 -4166
  186. package/fesm2022/scion-workbench.mjs.map +1 -1
  187. package/lib/common/objects.util.d.ts +17 -0
  188. package/lib/common/uuid.util.d.ts +8 -0
  189. package/lib/dialog/workbench-dialog.component.d.ts +16 -7
  190. package/lib/dialog/workbench-dialog.d.ts +1 -1
  191. package/lib/dialog/workbench-dialog.options.d.ts +4 -3
  192. package/lib/dialog/workbench-dialog.registry.d.ts +4 -3
  193. package/lib/dialog/workbench-dialog.service.d.ts +1 -1
  194. package/lib/dialog//311/265workbench-dialog.d.ts +2 -2
  195. package/lib/executor/single-task-executor.d.ts +6 -1
  196. package/lib/filter-field/filter-field.component.d.ts +1 -1
  197. package/lib/glass-pane/glass-pane.directive.d.ts +21 -0
  198. package/lib/layout/grid-element/grid-element.component.d.ts +2 -2
  199. package/lib/layout/migration/model/workbench-layout-migration-v1.model.d.ts +16 -0
  200. package/lib/layout/migration/model/workbench-layout-migration-v2.model.d.ts +22 -0
  201. package/lib/layout/migration/model/workbench-layout-migration-v3.model.d.ts +30 -0
  202. package/lib/layout/migration/model/workbench-layout-migration-v4.model.d.ts +31 -0
  203. package/lib/layout/migration/workbench-layout-migration-v2.service.d.ts +13 -0
  204. package/lib/layout/migration/workbench-layout-migration-v3.service.d.ts +16 -0
  205. package/lib/layout/migration/workbench-layout-migration-v4.service.d.ts +12 -0
  206. package/lib/layout/workbench-layout.d.ts +61 -7
  207. package/lib/layout/workbench-layout.factory.d.ts +1 -1
  208. package/lib/layout/workbench-layout.model.d.ts +19 -9
  209. package/lib/layout/workbench-layouts.util.d.ts +18 -0
  210. package/lib/layout/workench-layout-serializer.service.d.ts +28 -7
  211. package/lib/layout//311/265workbench-layout.d.ts +172 -98
  212. package/lib/layout//311/265workbench-layout.factory.d.ts +4 -0
  213. package/lib/logging/logging-support.d.ts +2 -2
  214. package/lib/message-box/workbench-message-box.component.d.ts +3 -0
  215. package/lib/message-box/workbench-message-box.options.d.ts +4 -3
  216. package/lib/message-box/workbench-message-box.service.d.ts +1 -1
  217. package/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.d.ts +7 -1
  218. package/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.d.ts +1 -0
  219. package/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.d.ts +39 -0
  220. package/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.d.ts +25 -0
  221. package/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.d.ts +4 -2
  222. package/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.d.ts +10 -0
  223. package/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.interceptor.d.ts +28 -0
  224. package/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-legacy-intent-translator.interceptor.d.ts +11 -0
  225. package/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.d.ts +48 -0
  226. package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.d.ts +3 -7
  227. package/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.d.ts +4 -9
  228. package/lib/microfrontend-platform/workbench-microfrontend-support.d.ts +3 -3
  229. package/lib/migration/workbench-migration.d.ts +9 -0
  230. package/lib/migration/workbench-migrator.d.ts +18 -0
  231. package/lib/notification/notification.config.d.ts +1 -1
  232. package/lib/notification/notification.d.ts +1 -3
  233. package/lib/page-not-found/format-url.pipe.d.ts +11 -0
  234. package/lib/page-not-found/page-not-found.component.d.ts +8 -0
  235. package/lib/part/part-action-bar/part-action.directive.d.ts +1 -1
  236. package/lib/part/part-bar/part-bar.component.d.ts +4 -3
  237. package/lib/part/view-context-menu/view-menu.directive.d.ts +1 -1
  238. package/lib/part/view-context-menu/view-menu.service.d.ts +5 -4
  239. package/lib/part/view-list-item/view-list-item.component.d.ts +5 -4
  240. package/lib/part/view-tab/view-tab.component.d.ts +6 -5
  241. package/lib/part/view-tab-drag-image/view-tab-drag-image.component.d.ts +3 -3
  242. package/lib/part/workbench-part.model.d.ts +5 -4
  243. package/lib/part//311/265workbench-part.model.d.ts +5 -4
  244. package/lib/perspective/migration/model/workbench-perspective-migration-v1.model.d.ts +8 -0
  245. package/lib/perspective/migration/model/workbench-perspective-migration-v2.model.d.ts +10 -0
  246. package/lib/perspective/migration/workbench-perspective-migration-v2.service.d.ts +13 -0
  247. package/lib/perspective/workbench-grid-merger.service.d.ts +9 -16
  248. package/lib/perspective/workbench-perspective-storage.service.d.ts +10 -28
  249. package/lib/perspective/workbench-perspective-view-conflict-resolver.service.d.ts +8 -25
  250. package/lib/perspective/workbench-perspective.model.d.ts +123 -14
  251. package/lib/perspective/workbench-perspective.service.d.ts +10 -3
  252. package/lib/perspective/workench-perspective-serializer.service.d.ts +26 -0
  253. package/lib/perspective//311/265workbench-perspective.model.d.ts +16 -14
  254. package/lib/popup/popup.component.d.ts +1 -0
  255. package/lib/popup/popup.config.d.ts +4 -3
  256. package/lib/portal/workbench-portal-outlet.directive.d.ts +2 -2
  257. package/lib/public_api.d.ts +4 -3
  258. package/lib/registry/workbench-object-registry.d.ts +2 -2
  259. package/lib/routing/empty-outlet/empty-outlet.component.d.ts +15 -0
  260. package/lib/routing/public_api.d.ts +2 -2
  261. package/lib/routing/router.util.d.ts +45 -19
  262. package/lib/routing/routing.model.d.ts +107 -8
  263. package/lib/routing/url-segment-matcher.d.ts +20 -0
  264. package/lib/routing/workbench-auxiliary-routes-registrator.service.d.ts +25 -15
  265. package/lib/routing/workbench-layout-differ.d.ts +4 -7
  266. package/lib/routing/workbench-message-box-differ.d.ts +25 -0
  267. package/lib/routing/workbench-navigational-states.d.ts +6 -19
  268. package/lib/routing/workbench-route-data.d.ts +13 -3
  269. package/lib/routing/workbench-router-link.directive.d.ts +22 -7
  270. package/lib/routing/workbench-router.service.d.ts +42 -142
  271. package/lib/routing/workbench-url-observer.service.d.ts +10 -28
  272. package/lib/routing//311/265workbench-router.service.d.ts +74 -0
  273. package/lib/startup/workbench-launcher.service.d.ts +4 -4
  274. package/lib/testing/public_api.d.ts +1 -0
  275. package/lib/testing/workbench-testing.module.d.ts +7 -6
  276. package/lib/testing/workbench.provider.d.ts +29 -0
  277. package/lib/view/public_api.d.ts +2 -1
  278. package/lib/view/view-move-handler.service.d.ts +2 -4
  279. package/lib/view/view-portal.pipe.d.ts +2 -1
  280. package/lib/view/view.component.d.ts +1 -11
  281. package/lib/view/workbench-view-route-guards.d.ts +36 -0
  282. package/lib/view/workbench-view.model.d.ts +37 -5
  283. package/lib/view/workbench-view.registry.d.ts +4 -3
  284. package/lib/view//311/265workbench-view.model.d.ts +61 -15
  285. package/lib/view-dnd/view-drag.service.d.ts +9 -4
  286. package/lib/view-dnd/view-drop-zone.directive.d.ts +1 -1
  287. package/lib/{workbench-module-config.d.ts → workbench-config.d.ts} +29 -71
  288. package/lib/workbench.component.d.ts +2 -2
  289. package/lib/workbench.constants.d.ts +6 -8
  290. package/lib/workbench.model.d.ts +20 -8
  291. package/lib/workbench.module.d.ts +12 -7
  292. package/lib/workbench.provider.d.ts +38 -0
  293. package/lib/workbench.service.d.ts +32 -8
  294. package/lib//311/265workbench.service.d.ts +9 -3
  295. package/package.json +8 -8
  296. package/esm2022/lib/layout/migration/workbench-layout-migrator.service.mjs +0 -38
  297. package/esm2022/lib/layout/migration/workbench-layout-v1-migrator.service.mjs +0 -59
  298. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.service.mjs +0 -46
  299. package/esm2022/lib/view/workbench-view-pre-destroy.guard.mjs +0 -36
  300. package/esm2022/lib/workbench-module-config.mjs +0 -15
  301. package/lib/layout/migration/workbench-layout-migrator.service.d.ts +0 -15
  302. package/lib/layout/migration/workbench-layout-v1-migrator.service.d.ts +0 -12
  303. package/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.service.d.ts +0 -17
  304. package/lib/view/workbench-view-pre-destroy.guard.d.ts +0 -5
@@ -1,384 +1,19 @@
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 { PRIMARY_OUTLET, UrlSegment } from '@angular/router';
11
- import { Defined, Dictionaries } from '@scion/toolkit/util';
12
- import { Injectable, NgZone } from '@angular/core';
13
- import { MAIN_AREA_LAYOUT_QUERY_PARAM } from '../workbench.constants';
14
- import { SingleTaskExecutor } from '../executor/single-task-executor';
15
- import { firstValueFrom } from 'rxjs';
16
- import { WorkbenchNavigationalStates, WorkbenchNavigationalViewStates } from './workbench-navigational-states';
17
- import { ɵWorkbenchLayout } from '../layout/ɵworkbench-layout';
1
+ import { Injectable } from '@angular/core';
2
+ import { ɵWorkbenchRouter } from './ɵworkbench-router.service';
18
3
  import * as i0 from "@angular/core";
19
- import * as i1 from "@angular/router";
20
- import * as i2 from "../view/workbench-view.registry";
21
- import * as i3 from "../layout/workbench-layout.service";
22
4
  /**
23
- * Provides workbench view navigation capabilities based on Angular Router.
5
+ * Enables navigation of workbench views and modification of the workbench layout.
6
+ *
7
+ * A view is a visual workbench element for displaying content side-by-side or stacked. A view can be navigated to any route.
8
+ *
9
+ * A view can inject `ActivatedRoute` to obtain parameters passed to the navigation and/or read data associated with the route.
24
10
  */
25
11
  export class WorkbenchRouter {
26
- constructor(_router, _viewRegistry, _workbenchLayoutService, _zone) {
27
- this._router = _router;
28
- this._viewRegistry = _viewRegistry;
29
- this._workbenchLayoutService = _workbenchLayoutService;
30
- this._zone = _zone;
31
- this._singleTaskExecutor = new SingleTaskExecutor();
32
- /**
33
- * Holds the current navigational context during a workbench navigation, or `null` if no navigation is in progress.
34
- */
35
- this._currentNavigationContext = null;
36
- // Instruct the Angular router to process navigations that do not change the current URL, i.e., when only updating navigation state.
37
- // For example, the workbench grid is passed to the navigation as state, not as a query parameter. Without this flag set, changes to
38
- // the workbench grid would not be added to the browsing history stack.
39
- // Although the `onSameUrlNavigation` flag can be set per navigation via the navigation extras, this is not sufficient because the
40
- // Angular router ignores it when navigating back and forth in the browsing history.
41
- // See Angular router.ts#setUpLocationChangeListener and router.ts#navigateToSyncWithBrowser
42
- this._router.onSameUrlNavigation = 'reload';
43
- }
44
- /**
45
- * Navigates based on the provided array of commands, and is like 'Router.navigate(...)' but with a workbench view as the router outlet target.
46
- * Navigation is absolute unless providing a `relativeTo` route in navigational extras.
47
- *
48
- * By passing navigation extras, you can control navigation. By default, the router opens a new view tab if no view is found that matches the
49
- * specified path. Matrix parameters do not affect view resolution. If one (or more) view(s) match the specified path, they are navigated
50
- * instead of opening the view in a new view tab, e.g., to update matrix parameters.
51
- *
52
- * The router supports for closing views matching the routing commands by setting `close` in navigational extras.
53
- *
54
- * ### Commands
55
- * - Multiple static segments can be merged into one, e.g. `['/team/11/user', userName, {details: true}]`
56
- * - The first segment name can be prepended with `/`, `./`, or `../`
57
- * - Matrix parameters can be used to associate optional data with the URL, e.g. `['user', userName, {details: true}]`
58
- * Matrix parameters are like regular URL parameters, but do not affect route and view resolution. Unlike query parameters, matrix parameters
59
- * are not global but part of the routing path, which makes them suitable for auxiliary routes.
60
- *
61
- * ### Usage
62
- *
63
- * ```
64
- * router.navigate(['team', 33, 'user', 11]);
65
- * router.navigate(['team/11/user', userName, {details: true}]); // multiple static segments can be merged into one
66
- * router.navigate(['teams', {selection: 33'}]); // matrix parameter 'selection' with the value '33'.
67
- * ```
68
- *
69
- * @see WorkbenchRouterLinkDirective
70
- */
71
- navigate(commands, extras = {}) {
72
- // Ensure to run in Angular zone.
73
- if (!NgZone.isInAngularZone()) {
74
- return this._zone.run(() => this.navigate(commands, extras));
75
- }
76
- if (extras.close) {
77
- return this.ɵnavigate((layout) => {
78
- if (extras.target) {
79
- const viewId = extras.target;
80
- if (commands.length) {
81
- throw Error(`[WorkbenchRouterError][IllegalArgumentError] The commands must be empty if closing a view by viewId [commands=${commands}]`);
82
- }
83
- if (!layout.views().some(view => view.id === viewId)) {
84
- return null;
85
- }
86
- return removeView(viewId, layout);
87
- }
88
- const viewIds = this.resolvePresentViewIds(commands, { relativeTo: extras.relativeTo, matchWildcardSegments: true });
89
- return viewIds.reduce((navigation, viewId) => removeView(viewId, navigation), { layout });
90
- });
91
- }
92
- return this.ɵnavigate((layout) => {
93
- switch (extras.target ?? 'auto') {
94
- case 'blank': {
95
- return addView(layout.computeNextViewId(), layout);
96
- }
97
- case 'auto': {
98
- const viewIds = this.resolvePresentViewIds(commands, { relativeTo: extras.relativeTo });
99
- if (viewIds.length) {
100
- return viewIds.reduce((navigation, viewId) => updateView(viewId, navigation), { layout });
101
- }
102
- else {
103
- return addView(layout.computeNextViewId(), layout);
104
- }
105
- }
106
- default: {
107
- const viewId = extras.target;
108
- if (layout.views().some(view => view.id === viewId)) {
109
- return updateView(viewId, layout);
110
- }
111
- else {
112
- return addView(viewId, layout);
113
- }
114
- }
115
- }
116
- }, extras);
117
- /**
118
- * Creates the navigation for adding the specified view to the workbench layout.
119
- */
120
- function addView(viewId, layout) {
121
- const partId = (() => {
122
- if (extras.blankPartId && layout.hasPart(extras.blankPartId)) {
123
- return extras.blankPartId;
124
- }
125
- return layout.activePart({ grid: 'mainArea' })?.id ?? layout.activePart({ grid: 'workbench' }).id;
126
- })();
127
- return {
128
- layout: layout.addView(viewId, {
129
- partId,
130
- position: extras.blankInsertionIndex ?? 'after-active-view',
131
- activateView: extras.activate ?? true,
132
- }),
133
- viewOutlets: commands.length ? { [viewId]: commands } : {},
134
- viewStates: { [viewId]: Dictionaries.withoutUndefinedEntries({ [WorkbenchNavigationalViewStates.cssClass]: extras.cssClass }) },
135
- };
136
- }
137
- /**
138
- * Creates the navigation for updating the path of the specified view.
139
- */
140
- function updateView(viewId, layout) {
141
- const navigation = coerceNavigation(layout);
142
- const activateView = extras.activate ?? true;
143
- return {
144
- layout: activateView ? navigation.layout.activateView(viewId) : navigation.layout,
145
- viewOutlets: { ...navigation.viewOutlets, ...(commands.length ? { [viewId]: commands } : {}) },
146
- viewStates: { ...navigation.viewStates, [viewId]: Dictionaries.withoutUndefinedEntries({ [WorkbenchNavigationalViewStates.cssClass]: extras.cssClass }) },
147
- };
148
- }
149
- /**
150
- * Creates the navigation for removing the specified view from the workbench layout.
151
- */
152
- function removeView(viewId, layout) {
153
- const navigation = coerceNavigation(layout);
154
- return {
155
- layout: navigation.layout.removeView(viewId),
156
- viewOutlets: { ...navigation.viewOutlets, [viewId]: null },
157
- viewStates: navigation.viewStates,
158
- };
159
- }
160
- }
161
- /**
162
- * Experimental API for modifying the workbench layout.
163
- *
164
- * @param onNavigate - Callback to modify the current layout.
165
- * The callback is passed the current layout which can be modified and returned for navigation. Returning `null` does not perform the navigation.
166
- * @param extras - Controls how to perform the navigation.
167
- */
168
- ɵnavigate(onNavigate, extras) {
169
- // Ensure to run in Angular zone.
170
- if (!NgZone.isInAngularZone()) {
171
- return this._zone.run(() => this.ɵnavigate(onNavigate, extras));
172
- }
173
- // Serialize navigation requests to prevent race conditions when modifying the currently active workbench layout.
174
- return this._singleTaskExecutor.submit(async () => {
175
- // Wait until the initial layout is available, i.e., after completion of Angular's initial navigation.
176
- // Otherwise, this navigation would override the initial layout as given in the URL.
177
- if (!this._workbenchLayoutService.layout) {
178
- await this.waitForInitialLayout();
179
- }
180
- // Pass control to the navigator to compute the new workbench layout.
181
- const navigation = coerceNavigation(await onNavigate(this._workbenchLayoutService.layout));
182
- if (!navigation) {
183
- return true;
184
- }
185
- // Add user-defined state from navigation extras to the view state.
186
- // NOTE: We must ensure that a view state object is associated for each outlet to be navigated.
187
- // Otherwise, if the state object were `null` or `undefined`, {@link NavigationStateResolver} would restore the state of the previously activated route.
188
- const viewStates = Object.keys(navigation.viewOutlets || {}).reduce((viewStates, viewId) => {
189
- viewStates[viewId] = { ...viewStates[viewId], ...extras?.state };
190
- return viewStates;
191
- }, navigation.viewStates || {});
192
- // Instruct the 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.
193
- extras = { ...extras, onSameUrlNavigation: 'reload' };
194
- // Serialize the layout.
195
- const serializedLayout = navigation.layout.serialize();
196
- // Associate workbench-specific state with the navigation.
197
- WorkbenchNavigationalStates.addToNavigationExtras(extras, {
198
- workbenchGrid: serializedLayout.workbenchGrid,
199
- maximized: navigation.layout.maximized,
200
- viewStates,
201
- });
202
- // Compute the new URL tree.
203
- const urlTree = this.__createUrlTree(navigation.viewOutlets, serializedLayout.mainAreaGrid, extras);
204
- // Perform the navigation.
205
- if (!(await this._router.navigateByUrl(urlTree, extras))) {
206
- return false;
207
- }
208
- // Block subsequent navigation(s) until Angular has flushed the changed layout to the DOM.
209
- await firstValueFrom(this._zone.onStable);
210
- return true;
211
- });
212
- }
213
- /**
214
- * Experimental API to replace {@link WorkbenchRouter#navigate} for navigating views and modifying the layout.
215
- *
216
- * @param onNavigate - Computes the new workbench layout.
217
- * The callback is passed the current workbench layout which the caller can modify and return.
218
- * In the callback, it is safe to access currently activated routes or the current router url.
219
- * @param extras - Options to control navigation.
220
- *
221
- * @internal
222
- */
223
- async createUrlTree(onNavigate, extras) {
224
- // Ensure to run in Angular zone.
225
- if (!NgZone.isInAngularZone()) {
226
- return this._zone.run(() => this.createUrlTree(onNavigate, extras));
227
- }
228
- return this._singleTaskExecutor.submit(async () => {
229
- // Wait until the initial layout is available, i.e., after completion of Angular's initial navigation.
230
- // Otherwise, would override the initial layout as given in the URL.
231
- if (!this._workbenchLayoutService.layout) {
232
- await this.waitForInitialLayout();
233
- }
234
- // Pass control to the navigator to compute the new workbench layout.
235
- const navigation = coerceNavigation(await onNavigate(this._workbenchLayoutService.layout));
236
- // create the URL tree.
237
- return this.__createUrlTree(navigation.viewOutlets, navigation.layout.serialize().mainAreaGrid, extras);
238
- });
239
- }
240
- /**
241
- * This method name begins with underscores to indicate that it must only be invoked from within {@link SingleTaskExecutor}.
242
- */
243
- __createUrlTree(viewOutlets, serializedMainAreaGrid, extras) {
244
- // Normalize commands of the outlets to their absolute form and resolve relative navigational symbols.
245
- const normalizedViewOutlets = this.normalizeOutletCommands(viewOutlets, extras?.relativeTo);
246
- // Add view outlets as 'outlets' fragment to be interpreted by Angular.
247
- const commands = normalizedViewOutlets ? [{ outlets: normalizedViewOutlets }] : [];
248
- // Let Angular Router construct the URL tree.
249
- return this._router.createUrlTree(commands, {
250
- ...extras,
251
- queryParams: { ...extras?.queryParams, [MAIN_AREA_LAYOUT_QUERY_PARAM]: serializedMainAreaGrid },
252
- // Merge with existing query params unless specified an explicit strategy, e.g., for migrating an outdated layout URL.
253
- // Note that `null` is a valid strategy for clearing existing query params, so do not use the nullish coalescing operator (??).
254
- queryParamsHandling: Defined.orElse(extras?.queryParamsHandling, 'merge'),
255
- relativeTo: null, // commands are normalized to their absolute form
256
- });
257
- }
258
- /**
259
- * @see normalizeCommands
260
- */
261
- normalizeOutletCommands(outlets, relativeTo) {
262
- if (!outlets || !Object.keys(outlets).length) {
263
- return null;
264
- }
265
- return Object.entries(outlets).reduce((acc, [outletName, commands]) => {
266
- return {
267
- ...acc,
268
- [outletName]: commands ? this.normalizeCommands(commands, relativeTo) : null, // `null` to remove an outlet
269
- };
270
- }, {});
271
- }
272
- /**
273
- * Normalizes commands to their absolute form.
274
- *
275
- * ---
276
- * As of Angular 6.x, commands which target a named outlet (auxiliary route) are not normalized, meaning that
277
- * relative navigational symbols like `/`, `./`, or `../` are not resolved (see `create_url_tree.ts` method: `computeNavigation`).
278
- *
279
- * Example: router.navigate([{outlets: {[outlet]: commands}}])
280
- *
281
- * To bypass that restriction, we first create a URL tree without specifying the target outlet. As expected, this translates into a
282
- * URL with all navigational symbols resolved. Then, we extract the URL segments of the resolved route and convert it back into commands.
283
- * The resulting commands are in their absolute form and may be used for the effective navigation to target a named router outlet.
284
- */
285
- normalizeCommands(commands, relativeTo) {
286
- if (!commands.length) {
287
- return [];
288
- }
289
- // Ensure to run in Angular zone.
290
- if (!NgZone.isInAngularZone()) {
291
- return this._zone.run(() => this.normalizeCommands(commands, relativeTo));
292
- }
293
- const normalizeFn = (outlet, extras) => {
294
- return this._router.createUrlTree(commands, extras)
295
- .root.children[outlet].segments
296
- .reduce((acc, p) => [...acc, p.path, ...(Object.keys(p.parameters).length ? [p.parameters] : [])], []);
297
- };
298
- if (!relativeTo) {
299
- return normalizeFn(PRIMARY_OUTLET);
300
- }
301
- const targetOutlet = relativeTo.pathFromRoot[1]?.outlet;
302
- if (!targetOutlet) {
303
- return normalizeFn(PRIMARY_OUTLET);
304
- }
305
- return normalizeFn(targetOutlet, { relativeTo });
306
- }
307
- /**
308
- * Resolves present views which match the given commands.
309
- *
310
- * Allows matching wildcard segments by setting the option `matchWildcardSegments` to `true`.
311
- *
312
- * @internal
313
- */
314
- resolvePresentViewIds(commandList, options) {
315
- const commands = this.normalizeCommands(commandList, options?.relativeTo);
316
- const commandPath = this.serializeCommands(commands, { skipMatrixParams: true });
317
- const matchWildcardSegments = options?.matchWildcardSegments ?? false;
318
- return this._viewRegistry.views
319
- .filter(view => {
320
- const viewPath = view.urlSegments.map(segment => segment.path);
321
- if (commandPath.length !== viewPath.length) {
322
- return false;
323
- }
324
- return commandPath.every((commandSegment, index) => (matchWildcardSegments && commandSegment === '*') || commandSegment === viewPath[index]);
325
- })
326
- .map(view => view.id);
327
- }
328
- /**
329
- * Returns the context of the current workbench navigation, when being invoked during navigation, or throws an error otherwise.
330
- *
331
- * @internal
332
- */
333
- getCurrentNavigationContext() {
334
- if (!this._currentNavigationContext) {
335
- throw Error('[WorkbenchRouterError] Navigation context not available as no navigation is in progress.');
336
- }
337
- return this._currentNavigationContext;
338
- }
339
- /**
340
- * Sets navigational contextual data.
341
- *
342
- * @internal
343
- */
344
- setCurrentNavigationContext(context) {
345
- this._currentNavigationContext = context;
346
- }
347
- /**
348
- * Blocks until the initial layout is available, i.e. after completion of Angular's initial navigation.
349
- */
350
- async waitForInitialLayout() {
351
- await firstValueFrom(this._workbenchLayoutService.layout$);
352
- }
353
- /**
354
- * Serializes given commands into valid URL segments.
355
- */
356
- serializeCommands(commands, options) {
357
- const serializedCommands = [];
358
- const skipMatrixParams = options?.skipMatrixParams ?? false;
359
- commands.forEach(cmd => {
360
- // if matrix param, append it to the last segment
361
- const isMatrixParam = typeof cmd === 'object';
362
- if (!isMatrixParam) {
363
- serializedCommands.push(encodeURIComponent(cmd));
364
- }
365
- else if (!skipMatrixParams) {
366
- serializedCommands.push(new UrlSegment(serializedCommands.pop(), cmd).toString());
367
- }
368
- });
369
- return serializedCommands;
370
- }
371
- ngOnDestroy() {
372
- this._singleTaskExecutor.destroy();
373
- }
374
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: WorkbenchRouter, deps: [{ token: i1.Router }, { token: i2.WorkbenchViewRegistry }, { token: i3.WorkbenchLayoutService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
375
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: WorkbenchRouter, providedIn: 'root' }); }
12
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: WorkbenchRouter, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
13
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: WorkbenchRouter, providedIn: 'root', useExisting: ɵWorkbenchRouter }); }
376
14
  }
377
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: WorkbenchRouter, decorators: [{
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: WorkbenchRouter, decorators: [{
378
16
  type: Injectable,
379
- args: [{ providedIn: 'root' }]
380
- }], ctorParameters: () => [{ type: i1.Router }, { type: i2.WorkbenchViewRegistry }, { type: i3.WorkbenchLayoutService }, { type: i0.NgZone }] });
381
- function coerceNavigation(navigation) {
382
- return navigation instanceof ɵWorkbenchLayout ? ({ layout: navigation }) : navigation;
383
- }
384
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvcm91dGluZy93b3JrYmVuY2gtcm91dGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQW1DLGNBQWMsRUFBVSxVQUFVLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RyxPQUFPLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBRTVELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBR3BFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFDLDJCQUEyQixFQUFFLCtCQUErQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFFN0csT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7Ozs7O0FBSTdEOztHQUVHO0FBRUgsTUFBTSxPQUFPLGVBQWU7SUFTMUIsWUFBb0IsT0FBZSxFQUNmLGFBQW9DLEVBQ3BDLHVCQUErQyxFQUMvQyxLQUFhO1FBSGIsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLGtCQUFhLEdBQWIsYUFBYSxDQUF1QjtRQUNwQyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXdCO1FBQy9DLFVBQUssR0FBTCxLQUFLLENBQVE7UUFWekIsd0JBQW1CLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBRXZEOztXQUVHO1FBQ0ssOEJBQXlCLEdBQXNDLElBQUksQ0FBQztRQU0xRSxvSUFBb0k7UUFDcEksb0lBQW9J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RUFBRSxnQkFBZ0IsSUFBSSxLQUFLLENBQUM7UUFDNUQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNyQixpREFBaUQ7WUFDakQsTUFBTSxhQUFhLEdBQUcsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDO1lBRTlDLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ2xCLGtCQUFrQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2xEO2lCQUNJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDMUIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7YUFDcEY7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sa0JBQWtCLENBQUM7SUFDNUIsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JDLENBQUM7OEdBdllVLGVBQWU7a0hBQWYsZUFBZSxjQURILE1BQU07OzJGQUNsQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7QUEyWWhDLFNBQVMsZ0JBQWdCLENBQUMsVUFBeUQ7SUFDakYsT0FBTyxVQUFVLFlBQVksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQ3RGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FeHRyYXMsIFBSSU1BUllfT1VUTEVULCBSb3V0ZXIsIFVybFNlZ21lbnQsIFVybFRyZWV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0RlZmluZWQsIERpY3Rpb25hcmllc30gZnJvbSAnQHNjaW9uL3Rvb2xraXQvdXRpbCc7XG5pbXBvcnQge0luamVjdGFibGUsIE5nWm9uZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7V29ya2JlbmNoTGF5b3V0U2VydmljZX0gZnJvbSAnLi4vbGF5b3V0L3dvcmtiZW5jaC1sYXlvdXQuc2VydmljZSc7XG5pbXBvcnQge01BSU5fQVJFQV9MQVlPVVRfUVVFUllfUEFSQU19IGZyb20gJy4uL3dvcmtiZW5jaC5jb25zdGFudHMnO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXREaWZmfSBmcm9tICcuL3dvcmtiZW5jaC1sYXlvdXQtZGlmZmVyJztcbmltcG9ydCB7V29ya2JlbmNoUG9wdXBEaWZmfSBmcm9tICcuL3dvcmtiZW5jaC1wb3B1cC1kaWZmZXInO1xuaW1wb3J0IHtTaW5nbGVUYXNrRXhlY3V0b3J9IGZyb20gJy4uL2V4ZWN1dG9yL3NpbmdsZS10YXNrLWV4ZWN1dG9yJztcbmltcG9ydCB7Zmlyc3RWYWx1ZUZyb219IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtXb3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZXMsIFdvcmtiZW5jaE5hdmlnYXRpb25hbFZpZXdTdGF0ZXN9IGZyb20gJy4vd29ya2JlbmNoLW5hdmlnYXRpb25hbC1zdGF0ZXMnO1xuaW1wb3J0IHtXb3JrYmVuY2hWaWV3UmVnaXN0cnl9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcucmVnaXN0cnknO1xuaW1wb3J0IHvJtVdvcmtiZW5jaExheW91dH0gZnJvbSAnLi4vbGF5b3V0L8m1d29ya2JlbmNoLWxheW91dCc7XG5pbXBvcnQge0NvbW1hbmRzLCBWaWV3U3RhdGUsIFZpZXdTdGF0ZXN9IGZyb20gJy4vcm91dGluZy5tb2RlbCc7XG5pbXBvcnQge1dvcmtiZW5jaERpYWxvZ0RpZmZ9IGZyb20gJy4vd29ya2JlbmNoLWRpYWxvZy1kaWZmZXInO1xuXG4vKipcbiAqIFByb3ZpZGVzIHdvcmtiZW5jaCB2aWV3IG5hdmlnYXRpb24gY2FwYWJpbGl0aWVzIGJhc2VkIG9uIEFuZ3VsYXIgUm91dGVyLlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBXb3JrYmVuY2hSb3V0ZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgX3NpbmdsZVRhc2tFeGVjdXRvciA9IG5ldyBTaW5nbGVUYXNrRXhlY3V0b3IoKTtcblxuICAvKipcbiAgICogSG9sZHMgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbmFsIGNvbnRleHQgZHVyaW5nIGEgd29ya2JlbmNoIG5hdmlnYXRpb24sIG9yIGBudWxsYCBpZiBubyBuYXZpZ2F0aW9uIGlzIGluIHByb2dyZXNzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3VycmVudE5hdmlnYXRpb25Db250ZXh0OiBXb3JrYmVuY2hOYXZpZ2F0aW9uQ29udGV4dCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JvdXRlcjogUm91dGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF92aWV3UmVnaXN0cnk6IFdvcmtiZW5jaFZpZXdSZWdpc3RyeSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoTGF5b3V0U2VydmljZTogV29ya2JlbmNoTGF5b3V0U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfem9uZTogTmdab25lKSB7XG4gICAgLy8gSW5zdHJ1Y3QgdGhlIEFuZ3VsYXIgcm91dGVyIHRvIHByb2Nlc3MgbmF2aWdhdGlvbnMgdGhhdCBkbyBub3QgY2hhbmdlIHRoZSBjdXJyZW50IFVSTCwgaS5lLiwgd2hlbiBvbmx5IHVwZGF0aW5nIG5hdmlnYXRpb24gc3RhdGUuXG4gICAgLy8gRm9yIGV4YW1wbGUsIHRoZSB3b3JrYmVuY2ggZ3JpZCBpcyBwYXNzZWQgdG8gdGhlIG5hdmlnYXRpb24gYXMgc3RhdGUsIG5vdCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gV2l0aG91dCB0aGlzIGZsYWcgc2V0LCBjaGFuZ2VzIHRvXG4gICAgLy8gdGhlIHdvcmtiZW5jaCBncmlkIHdvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgYnJvd3NpbmcgaGlzdG9yeSBzdGFjay5cbiAgICAvLyBBbHRob3VnaCB0aGUgYG9uU2FtZVVybE5hdmlnYXRpb25gIGZsYWcgY2FuIGJlIHNldCBwZXIgbmF2aWdhdGlvbiB2aWEgdGhlIG5hdmlnYXRpb24gZXh0cmFzLCB0aGlzIGlzIG5vdCBzdWZmaWNpZW50IGJlY2F1c2UgdGhlXG4gICAgLy8gQW5ndWxhciByb3V0ZXIgaWdub3JlcyBpdCB3aGVuIG5hdmlnYXRpbmcgYmFjayBhbmQgZm9ydGggaW4gdGhlIGJyb3dzaW5nIGhpc3RvcnkuXG4gICAgLy8gU2VlIEFuZ3VsYXIgcm91dGVyLnRzI3NldFVwTG9jYXRpb25DaGFuZ2VMaXN0ZW5lciBhbmQgcm91dGVyLnRzI25hdmlnYXRlVG9TeW5jV2l0aEJyb3dzZXJcbiAgICB0aGlzLl9yb3V0ZXIub25TYW1lVXJsTmF2aWdhdGlvbiA9ICdyZWxvYWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYXJyYXkgb2YgY29tbWFuZHMsIGFuZCBpcyBsaWtlICdSb3V0ZXIubmF2aWdhdGUoLi4uKScgYnV0IHdpdGggYSB3b3JrYmVuY2ggdmlldyBhcyB0aGUgcm91dGVyIG91dGxldCB0YXJnZXQuXG4gICAqIE5hdmlnYXRpb24gaXMgYWJzb2x1dGUgdW5sZXNzIHByb3ZpZGluZyBhIGByZWxhdGl2ZVRvYCByb3V0ZSBpbiBuYXZpZ2F0aW9uYWwgZXh0cmFzLlxuICAgKlxuICAgKiBCeSBwYXNzaW5nIG5hdmlnYXRpb24gZXh0cmFzLCB5b3UgY2FuIGNvbnRyb2wgbmF2aWdhdGlvbi4gQnkgZGVmYXVsdCwgdGhlIHJvdXRlciBvcGVucyBhIG5ldyB2aWV3IHRhYiBpZiBubyB2aWV3IGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGVcbiAgICogc3BlY2lmaWVkIHBhdGguIE1hdHJpeCBwYXJhbWV0ZXJzIGRvIG5vdCBhZmZlY3QgdmlldyByZXNvbHV0aW9uLiBJZiBvbmUgKG9yIG1vcmUpIHZpZXcocykgbWF0Y2ggdGhlIHNwZWNpZmllZCBwYXRoLCB0aGV5IGFyZSBuYXZpZ2F0ZWRcbiAgICogaW5zdGVhZCBvZiBvcGVuaW5nIHRoZSB2aWV3IGluIGEgbmV3IHZpZXcgdGFiLCBlLmcuLCB0byB1cGRhdGUgbWF0cml4IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIFRoZSByb3V0ZXIgc3VwcG9ydHMgZm9yIGNsb3Npbmcgdmlld3MgbWF0Y2hpbmcgdGhlIHJvdXRpbmcgY29tbWFuZHMgYnkgc2V0dGluZyBgY2xvc2VgIGluIG5hdmlnYXRpb25hbCBleHRyYXMuXG4gICAqXG4gICAqICMjIyBDb21tYW5kc1xuICAgKiAtIE11bHRpcGxlIHN0YXRpYyBzZWdtZW50cyBjYW4gYmUgbWVyZ2VkIGludG8gb25lLCBlLmcuIGBbJy90ZWFtLzExL3VzZXInLCB1c2VyTmFtZSwge2RldGFpbHM6IHRydWV9XWBcbiAgICogLSBUaGUgZmlyc3Qgc2VnbWVudCBuYW1lIGNhbiBiZSBwcmVwZW5kZWQgd2l0aCBgL2AsIGAuL2AsIG9yIGAuLi9gXG4gICAqIC0gTWF0cml4IHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgdG8gYXNzb2NpYXRlIG9wdGlvbmFsIGRhdGEgd2l0aCB0aGUgVVJMLCBlLmcuIGBbJ3VzZXInLCB1c2VyTmFtZSwge2RldGFpbHM6IHRydWV9XWBcbiAgICogICBNYXRyaXggcGFyYW1ldGVycyBhcmUgbGlrZSByZWd1bGFyIFVSTCBwYXJhbWV0ZXJzLCBidXQgZG8gbm90IGFmZmVjdCByb3V0ZSBhbmQgdmlldyByZXNvbHV0aW9uLiBVbmxpa2UgcXVlcnkgcGFyYW1ldGVycywgbWF0cml4IHBhcmFtZXRlcnNcbiAgICogICBhcmUgbm90IGdsb2JhbCBidXQgcGFydCBvZiB0aGUgcm91dGluZyBwYXRoLCB3aGljaCBtYWtlcyB0aGVtIHN1aXRhYmxlIGZvciBhdXhpbGlhcnkgcm91dGVzLlxuICAgKlxuICAgKiAjIyMgVXNhZ2VcbiAgICpcbiAgICogYGBgXG4gICAqIHJvdXRlci5uYXZpZ2F0ZShbJ3RlYW0nLCAzMywgJ3VzZXInLCAxMV0pO1xuICAgKiByb3V0ZXIubmF2aWdhdGUoWyd0ZWFtLzExL3VzZXInLCB1c2VyTmFtZSwge2RldGFpbHM6IHRydWV9XSk7IC8vIG11bHRpcGxlIHN0YXRpYyBzZWdtZW50cyBjYW4gYmUgbWVyZ2VkIGludG8gb25lXG4gICAqIHJvdXRlci5uYXZpZ2F0ZShbJ3RlYW1zJywge3NlbGVjdGlvbjogMzMnfV0pOyAvLyBtYXRyaXggcGFyYW1ldGVyICdzZWxlY3Rpb24nIHdpdGggdGhlIHZhbHVlICczMycuXG4gICAqIGBgYFxuICAgKlxuICAgKiBAc2VlIFdvcmtiZW5jaFJvdXRlckxpbmtEaXJlY3RpdmVcbiAgICovXG4gIHB1YmxpYyBuYXZpZ2F0ZShjb21tYW5kczogQ29tbWFuZHMsIGV4dHJhczogV29ya2JlbmNoTmF2aWdhdGlvbkV4dHJhcyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gRW5zdXJlIHRvIHJ1biBpbiBBbmd1bGFyIHpvbmUuXG4gICAgaWYgKCFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl96b25lLnJ1bigoKSA9PiB0aGlzLm5hdmlnYXRlKGNvbW1hbmRzLCBleHRyYXMpKTtcbiAgICB9XG5cbiAgICBpZiAoZXh0cmFzLmNsb3NlKSB7XG4gICAgICByZXR1cm4gdGhpcy7JtW5hdmlnYXRlKChsYXlvdXQ6IMm1V29ya2JlbmNoTGF5b3V0KTogV29ya2JlbmNoTmF2aWdhdGlvbiB8IMm1V29ya2JlbmNoTGF5b3V0IHwgbnVsbCA9PiB7XG4gICAgICAgIGlmIChleHRyYXMudGFyZ2V0KSB7XG4gICAgICAgICAgY29uc3Qgdmlld0lkID0gZXh0cmFzLnRhcmdldDtcbiAgICAgICAgICBpZiAoY29tbWFuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgW1dvcmtiZW5jaFJvdXRlckVycm9yXVtJbGxlZ2FsQXJndW1lbnRFcnJvcl0gVGhlIGNvbW1hbmRzIG11c3QgYmUgZW1wdHkgaWYgY2xvc2luZyBhIHZpZXcgYnkgdmlld0lkIFtjb21tYW5kcz0ke2NvbW1hbmRzfV1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFsYXlvdXQudmlld3MoKS5zb21lKHZpZXcgPT4gdmlldy5pZCA9PT0gdmlld0lkKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZW1vdmVWaWV3KHZpZXdJZCwgbGF5b3V0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2aWV3SWRzID0gdGhpcy5yZXNvbHZlUHJlc2VudFZpZXdJZHMoY29tbWFuZHMsIHtyZWxhdGl2ZVRvOiBleHRyYXMucmVsYXRpdmVUbywgbWF0Y2hXaWxkY2FyZFNlZ21lbnRzOiB0cnVlfSk7XG4gICAgICAgIHJldHVybiB2aWV3SWRzLnJlZHVjZSgobmF2aWdhdGlvbiwgdmlld0lkKSA9PiByZW1vdmVWaWV3KHZpZXdJZCwgbmF2aWdhdGlvbiksIHtsYXlvdXR9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLsm1bmF2aWdhdGUoKGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiBXb3JrYmVuY2hOYXZpZ2F0aW9uIHwgybVXb3JrYmVuY2hMYXlvdXQgfCBudWxsID0+IHtcbiAgICAgIHN3aXRjaCAoZXh0cmFzLnRhcmdldCA/PyAnYXV0bycpIHtcbiAgICAgICAgY2FzZSAnYmxhbmsnOiB7XG4gICAgICAgICAgcmV0dXJuIGFkZFZpZXcobGF5b3V0LmNvbXB1dGVOZXh0Vmlld0lkKCksIGxheW91dCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYXV0byc6IHtcbiAgICAgICAgICBjb25zdCB2aWV3SWRzID0gdGhpcy5yZXNvbHZlUHJlc2VudFZpZXdJZHMoY29tbWFuZHMsIHtyZWxhdGl2ZVRvOiBleHRyYXMucmVsYXRpdmVUb30pO1xuICAgICAgICAgIGlmICh2aWV3SWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHZpZXdJZHMucmVkdWNlKChuYXZpZ2F0aW9uLCB2aWV3SWQpID0+IHVwZGF0ZVZpZXcodmlld0lkLCBuYXZpZ2F0aW9uKSwge2xheW91dH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhZGRWaWV3KGxheW91dC5jb21wdXRlTmV4dFZpZXdJZCgpLCBsYXlvdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3Qgdmlld0lkID0gZXh0cmFzLnRhcmdldCE7XG4gICAgICAgICAgaWYgKGxheW91dC52aWV3cygpLnNvbWUodmlldyA9PiB2aWV3LmlkID09PSB2aWV3SWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlVmlldyh2aWV3SWQsIGxheW91dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGFkZFZpZXcodmlld0lkLCBsYXlvdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIGV4dHJhcyk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBuYXZpZ2F0aW9uIGZvciBhZGRpbmcgdGhlIHNwZWNpZmllZCB2aWV3IHRvIHRoZSB3b3JrYmVuY2ggbGF5b3V0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFkZFZpZXcodmlld0lkOiBzdHJpbmcsIGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiBXb3JrYmVuY2hOYXZpZ2F0aW9uIHtcbiAgICAgIGNvbnN0IHBhcnRJZCA9ICgoKTogc3RyaW5nID0+IHtcbiAgICAgICAgaWYgKGV4dHJhcy5ibGFua1BhcnRJZCAmJiBsYXlvdXQuaGFzUGFydChleHRyYXMuYmxhbmtQYXJ0SWQpKSB7XG4gICAgICAgICAgcmV0dXJuIGV4dHJhcy5ibGFua1BhcnRJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5b3V0LmFjdGl2ZVBhcnQoe2dyaWQ6ICdtYWluQXJlYSd9KT8uaWQgPz8gbGF5b3V0LmFjdGl2ZVBhcnQoe2dyaWQ6ICd3b3JrYmVuY2gnfSkuaWQ7XG4gICAgICB9KSgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYXlvdXQ6IGxheW91dC5hZGRWaWV3KHZpZXdJZCwge1xuICAgICAgICAgIHBhcnRJZCxcbiAgICAgICAgICBwb3NpdGlvbjogZXh0cmFzLmJsYW5rSW5zZXJ0aW9uSW5kZXggPz8gJ2FmdGVyLWFjdGl2ZS12aWV3JyxcbiAgICAgICAgICBhY3RpdmF0ZVZpZXc6IGV4dHJhcy5hY3RpdmF0ZSA/PyB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgICAgdmlld091dGxldHM6IGNvbW1hbmRzLmxlbmd0aCA/IHtbdmlld0lkXTogY29tbWFuZHN9IDoge30sXG4gICAgICAgIHZpZXdTdGF0ZXM6IHtbdmlld0lkXTogRGljdGlvbmFyaWVzLndpdGhvdXRVbmRlZmluZWRFbnRyaWVzKHtbV29ya2JlbmNoTmF2aWdhdGlvbmFsVmlld1N0YXRlcy5jc3NDbGFzc106IGV4dHJhcy5jc3NDbGFzc30pfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgbmF2aWdhdGlvbiBmb3IgdXBkYXRpbmcgdGhlIHBhdGggb2YgdGhlIHNwZWNpZmllZCB2aWV3LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVZpZXcodmlld0lkOiBzdHJpbmcsIGxheW91dDogV29ya2JlbmNoTmF2aWdhdGlvbiB8IMm1V29ya2JlbmNoTGF5b3V0KTogV29ya2JlbmNoTmF2aWdhdGlvbiB7XG4gICAgICBjb25zdCBuYXZpZ2F0aW9uID0gY29lcmNlTmF2aWdhdGlvbihsYXlvdXQpITtcbiAgICAgIGNvbnN0IGFjdGl2YXRlVmlldyA9IGV4dHJhcy5hY3RpdmF0ZSA/PyB0cnVlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGF5b3V0OiBhY3RpdmF0ZVZpZXcgPyBuYXZpZ2F0aW9uLmxheW91dC5hY3RpdmF0ZVZpZXcodmlld0lkKSA6IG5hdmlnYXRpb24ubGF5b3V0LFxuICAgICAgICB2aWV3T3V0bGV0czogey4uLm5hdmlnYXRpb24udmlld091dGxldHMsIC4uLihjb21tYW5kcy5sZW5ndGggPyB7W3ZpZXdJZF06IGNvbW1hbmRzfSA6IHt9KX0sXG4gICAgICAgIHZpZXdTdGF0ZXM6IHsuLi5uYXZpZ2F0aW9uLnZpZXdTdGF0ZXMsIFt2aWV3SWRdOiBEaWN0aW9uYXJpZXMud2l0aG91dFVuZGVmaW5lZEVudHJpZXMoe1tXb3JrYmVuY2hOYXZpZ2F0aW9uYWxWaWV3U3RhdGVzLmNzc0NsYXNzXTogZXh0cmFzLmNzc0NsYXNzfSl9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBuYXZpZ2F0aW9uIGZvciByZW1vdmluZyB0aGUgc3BlY2lmaWVkIHZpZXcgZnJvbSB0aGUgd29ya2JlbmNoIGxheW91dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZW1vdmVWaWV3KHZpZXdJZDogc3RyaW5nLCBsYXlvdXQ6IFdvcmtiZW5jaE5hdmlnYXRpb24gfCDJtVdvcmtiZW5jaExheW91dCk6IFdvcmtiZW5jaE5hdmlnYXRpb24ge1xuICAgICAgY29uc3QgbmF2aWdhdGlvbiA9IGNvZXJjZU5hdmlnYXRpb24obGF5b3V0KSE7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYXlvdXQ6IG5hdmlnYXRpb24ubGF5b3V0LnJlbW92ZVZpZXcodmlld0lkKSxcbiAgICAgICAgdmlld091dGxldHM6IHsuLi5uYXZpZ2F0aW9uLnZpZXdPdXRsZXRzLCBbdmlld0lkXTogbnVsbH0sXG4gICAgICAgIHZpZXdTdGF0ZXM6IG5hdmlnYXRpb24udmlld1N0YXRlcyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGVyaW1lbnRhbCBBUEkgZm9yIG1vZGlmeWluZyB0aGUgd29ya2JlbmNoIGxheW91dC5cbiAgICpcbiAgICogQHBhcmFtIG9uTmF2aWdhdGUgLSBDYWxsYmFjayB0byBtb2RpZnkgdGhlIGN1cnJlbnQgbGF5b3V0LlxuICAgKiAgICAgICAgVGhlIGNhbGxiYWNrIGlzIHBhc3NlZCB0aGUgY3VycmVudCBsYXlvdXQgd2hpY2ggY2FuIGJlIG1vZGlmaWVkIGFuZCByZXR1cm5lZCBmb3IgbmF2aWdhdGlvbi4gUmV0dXJuaW5nIGBudWxsYCBkb2VzIG5vdCBwZXJmb3JtIHRoZSBuYXZpZ2F0aW9uLlxuICAgKiBAcGFyYW0gZXh0cmFzIC0gQ29udHJvbHMgaG93IHRvIHBlcmZvcm0gdGhlIG5hdmlnYXRpb24uXG4gICAqL1xuICBwdWJsaWMgybVuYXZpZ2F0ZShvbk5hdmlnYXRlOiAobGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCkgPT4gUHJvbWlzZTzJtVdvcmtiZW5jaExheW91dCB8IFdvcmtiZW5jaE5hdmlnYXRpb24gfCBudWxsPiB8IMm1V29ya2JlbmNoTGF5b3V0IHwgV29ya2JlbmNoTmF2aWdhdGlvbiB8IG51bGwsIGV4dHJhcz86IE5hdmlnYXRpb25FeHRyYXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBFbnN1cmUgdG8gcnVuIGluIEFuZ3VsYXIgem9uZS5cbiAgICBpZiAoIU5nWm9uZS5pc0luQW5ndWxhclpvbmUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3pvbmUucnVuKCgpID0+IHRoaXMuybVuYXZpZ2F0ZShvbk5hdmlnYXRlLCBleHRyYXMpKTtcbiAgICB9XG5cbiAgICAvLyBTZXJpYWxpemUgbmF2aWdhdGlvbiByZXF1ZXN0cyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aGVuIG1vZGlmeWluZyB0aGUgY3VycmVudGx5IGFjdGl2ZSB3b3JrYmVuY2ggbGF5b3V0LlxuICAgIHJldHVybiB0aGlzLl9zaW5nbGVUYXNrRXhlY3V0b3Iuc3VibWl0KGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFdhaXQgdW50aWwgdGhlIGluaXRpYWwgbGF5b3V0IGlzIGF2YWlsYWJsZSwgaS5lLiwgYWZ0ZXIgY29tcGxldGlvbiBvZiBBbmd1bGFyJ3MgaW5pdGlhbCBuYXZpZ2F0aW9uLlxuICAgICAgLy8gT3RoZXJ3aXNlLCB0aGlzIG5hdmlnYXRpb24gd291bGQgb3ZlcnJpZGUgdGhlIGluaXRpYWwgbGF5b3V0IGFzIGdpdmVuIGluIHRoZSBVUkwuXG4gICAgICBpZiAoIXRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckluaXRpYWxMYXlvdXQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGFzcyBjb250cm9sIHRvIHRoZSBuYXZpZ2F0b3IgdG8gY29tcHV0ZSB0aGUgbmV3IHdvcmtiZW5jaCBsYXlvdXQuXG4gICAgICBjb25zdCBuYXZpZ2F0aW9uOiBXb3JrYmVuY2hOYXZpZ2F0aW9uIHwgbnVsbCA9IGNvZXJjZU5hdmlnYXRpb24oYXdhaXQgb25OYXZpZ2F0ZSh0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dCEpKTtcbiAgICAgIGlmICghbmF2aWdhdGlvbikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHVzZXItZGVmaW5lZCBzdGF0ZSBmcm9tIG5hdmlnYXRpb24gZXh0cmFzIHRvIHRoZSB2aWV3IHN0YXRlLlxuICAgICAgLy8gTk9URTogV2UgbXVzdCBlbnN1cmUgdGhhdCBhIHZpZXcgc3RhdGUgb2JqZWN0IGlzIGFzc29jaWF0ZWQgZm9yIGVhY2ggb3V0bGV0IHRvIGJlIG5hdmlnYXRlZC5cbiAgICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIHN0YXRlIG9iamVjdCB3ZXJlIGBudWxsYCBvciBgdW5kZWZpbmVkYCwge0BsaW5rIE5hdmlnYXRpb25TdGF0ZVJlc29sdmVyfSB3b3VsZCByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgcHJldmlvdXNseSBhY3RpdmF0ZWQgcm91dGUuXG4gICAgICBjb25zdCB2aWV3U3RhdGVzID0gT2JqZWN0LmtleXMobmF2aWdhdGlvbi52aWV3T3V0bGV0cyB8fCB7fSkucmVkdWNlKCh2aWV3U3RhdGVzLCB2aWV3SWQpID0+IHtcbiAgICAgICAgdmlld1N0YXRlc1t2aWV3SWRdID0gey4uLnZpZXdTdGF0ZXNbdmlld0lkXSwgLi4uZXh0cmFzPy5zdGF0ZX07XG4gICAgICAgIHJldHVybiB2aWV3U3RhdGVzO1xuICAgICAgfSwgbmF2aWdhdGlvbi52aWV3U3RhdGVzIHx8IHt9KTtcblxuICAgICAgLy8gSW5zdHJ1Y3QgdGhlIHJvdXRlciB0byBwcm9jZXNzIHRoZSBuYXZpZ2F0aW9uIGV2ZW4gaWYgdGhlIFVSTCBkb2VzIG5vdCBjaGFuZ2UsIGUuZy4sIHdoZW4gY2hhbmdpbmcgdGhlIHdvcmtiZW5jaCBncmlkIHdoaWNoIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIFVSTC5cbiAgICAgIGV4dHJhcyA9IHsuLi5leHRyYXMsIG9uU2FtZVVybE5hdmlnYXRpb246ICdyZWxvYWQnfTtcblxuICAgICAgLy8gU2VyaWFsaXplIHRoZSBsYXlvdXQuXG4gICAgICBjb25zdCBzZXJpYWxpemVkTGF5b3V0ID0gbmF2aWdhdGlvbi5sYXlvdXQuc2VyaWFsaXplKCk7XG5cbiAgICAgIC8vIEFzc29jaWF0ZSB3b3JrYmVuY2gtc3BlY2lmaWMgc3RhdGUgd2l0aCB0aGUgbmF2aWdhdGlvbi5cbiAgICAgIFdvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlcy5hZGRUb05hdmlnYXRpb25FeHRyYXMoZXh0cmFzLCB7XG4gICAgICAgIHdvcmtiZW5jaEdyaWQ6IHNlcmlhbGl6ZWRMYXlvdXQud29ya2JlbmNoR3JpZCxcbiAgICAgICAgbWF4aW1pemVkOiBuYXZpZ2F0aW9uLmxheW91dC5tYXhpbWl6ZWQsXG4gICAgICAgIHZpZXdTdGF0ZXMsXG4gICAgICB9KTtcblxuICAgICAgLy8gQ29tcHV0ZSB0aGUgbmV3IFVSTCB0cmVlLlxuICAgICAgY29uc3QgdXJsVHJlZSA9IHRoaXMuX19jcmVhdGVVcmxUcmVlKG5hdmlnYXRpb24udmlld091dGxldHMsIHNlcmlhbGl6ZWRMYXlvdXQubWFpbkFyZWFHcmlkLCBleHRyYXMpO1xuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBuYXZpZ2F0aW9uLlxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5fcm91dGVyLm5hdmlnYXRlQnlVcmwodXJsVHJlZSwgZXh0cmFzKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBCbG9jayBzdWJzZXF1ZW50IG5hdmlnYXRpb24ocykgdW50aWwgQW5ndWxhciBoYXMgZmx1c2hlZCB0aGUgY2hhbmdlZCBsYXlvdXQgdG8gdGhlIERPTS5cbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuX3pvbmUub25TdGFibGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwZXJpbWVudGFsIEFQSSB0byByZXBsYWNlIHtAbGluayBXb3JrYmVuY2hSb3V0ZXIjbmF2aWdhdGV9IGZvciBuYXZpZ2F0aW5nIHZpZXdzIGFuZCBtb2RpZnlpbmcgdGhlIGxheW91dC5cbiAgICpcbiAgICogQHBhcmFtIG9uTmF2aWdhdGUgLSBDb21wdXRlcyB0aGUgbmV3IHdvcmtiZW5jaCBsYXlvdXQuXG4gICAqICAgICAgICBUaGUgY2FsbGJhY2sgaXMgcGFzc2VkIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBsYXlvdXQgd2hpY2ggdGhlIGNhbGxlciBjYW4gbW9kaWZ5IGFuZCByZXR1cm4uXG4gICAqICAgICAgICBJbiB0aGUgY2FsbGJhY2ssIGl0IGlzIHNhZmUgdG8gYWNjZXNzIGN1cnJlbnRseSBhY3RpdmF0ZWQgcm91dGVzIG9yIHRoZSBjdXJyZW50IHJvdXRlciB1cmwuXG4gICAqIEBwYXJhbSBleHRyYXMgLSBPcHRpb25zIHRvIGNvbnRyb2wgbmF2aWdhdGlvbi5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlVXJsVHJlZShvbk5hdmlnYXRlOiAobGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCkgPT4gUHJvbWlzZTzJtVdvcmtiZW5jaExheW91dCB8IFdvcmtiZW5jaE5hdmlnYXRpb24+IHwgybVXb3JrYmVuY2hMYXlvdXQgfCBXb3JrYmVuY2hOYXZpZ2F0aW9uLCBleHRyYXM/OiBOYXZpZ2F0aW9uRXh0cmFzKTogUHJvbWlzZTxVcmxUcmVlPiB7XG4gICAgLy8gRW5zdXJlIHRvIHJ1biBpbiBBbmd1bGFyIHpvbmUuXG4gICAgaWYgKCFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl96b25lLnJ1bigoKSA9PiB0aGlzLmNyZWF0ZVVybFRyZWUob25OYXZpZ2F0ZSwgZXh0cmFzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3NpbmdsZVRhc2tFeGVjdXRvci5zdWJtaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgaW5pdGlhbCBsYXlvdXQgaXMgYXZhaWxhYmxlLCBpLmUuLCBhZnRlciBjb21wbGV0aW9uIG9mIEFuZ3VsYXIncyBpbml0aWFsIG5hdmlnYXRpb24uXG4gICAgICAvLyBPdGhlcndpc2UsIHdvdWxkIG92ZXJyaWRlIHRoZSBpbml0aWFsIGxheW91dCBhcyBnaXZlbiBpbiB0aGUgVVJMLlxuICAgICAgaWYgKCF0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dCkge1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JJbml0aWFsTGF5b3V0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhc3MgY29udHJvbCB0byB0aGUgbmF2aWdhdG9yIHRvIGNvbXB1dGUgdGhlIG5ldyB3b3JrYmVuY2ggbGF5b3V0LlxuICAgICAgY29uc3QgbmF2aWdhdGlvbjogV29ya2JlbmNoTmF2aWdhdGlvbiA9IGNvZXJjZU5hdmlnYXRpb24oYXdhaXQgb25OYXZpZ2F0ZSh0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dCEpKSE7XG5cbiAgICAgIC8vIGNyZWF0ZSB0aGUgVVJMIHRyZWUuXG4gICAgICByZXR1cm4gdGhpcy5fX2NyZWF0ZVVybFRyZWUobmF2aWdhdGlvbi52aWV3T3V0bGV0cywgbmF2aWdhdGlvbi5sYXlvdXQuc2VyaWFsaXplKCkubWFpbkFyZWFHcmlkLCBleHRyYXMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIG5hbWUgYmVnaW5zIHdpdGggdW5kZXJzY29yZXMgdG8gaW5kaWNhdGUgdGhhdCBpdCBtdXN0IG9ubHkgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB7QGxpbmsgU2luZ2xlVGFza0V4ZWN1dG9yfS5cbiAgICovXG4gIHByaXZhdGUgX19jcmVhdGVVcmxUcmVlKHZpZXdPdXRsZXRzOiB7W291dGxldDogc3RyaW5nXTogQ29tbWFuZHMgfCBudWxsfSB8IHVuZGVmaW5lZCwgc2VyaWFsaXplZE1haW5BcmVhR3JpZDogc3RyaW5nIHwgbnVsbCwgZXh0cmFzPzogTmF2aWdhdGlvbkV4dHJhcyk6IFVybFRyZWUge1xuICAgIC8vIE5vcm1hbGl6ZSBjb21tYW5kcyBvZiB0aGUgb3V0bGV0cyB0byB0aGVpciBhYnNvbHV0ZSBmb3JtIGFuZCByZXNvbHZlIHJlbGF0aXZlIG5hdmlnYXRpb25hbCBzeW1ib2xzLlxuICAgIGNvbnN0IG5vcm1hbGl6ZWRWaWV3T3V0bGV0cyA9IHRoaXMubm9ybWFsaXplT3V0bGV0Q29tbWFuZHModmlld091dGxldHMsIGV4dHJhcz8ucmVsYXRpdmVUbyk7XG5cbiAgICAvLyBBZGQgdmlldyBvdXRsZXRzIGFzICdvdXRsZXRzJyBmcmFnbWVudCB0byBiZSBpbnRlcnByZXRlZCBieSBBbmd1bGFyLlxuICAgIGNvbnN0IGNvbW1hbmRzOiBDb21tYW5kcyA9IG5vcm1hbGl6ZWRWaWV3T3V0bGV0cyA/IFt7b3V0bGV0czogbm9ybWFsaXplZFZpZXdPdXRsZXRzfV0gOiBbXTtcblxuICAgIC8vIExldCBBbmd1bGFyIFJvdXRlciBjb25zdHJ1Y3QgdGhlIFVSTCB0cmVlLlxuICAgIHJldHVybiB0aGlzLl9yb3V0ZXIuY3JlYXRlVXJsVHJlZShjb21tYW5kcywge1xuICAgICAgLi4uZXh0cmFzLFxuICAgICAgcXVlcnlQYXJhbXM6IHsuLi5leHRyYXM/LnF1ZXJ5UGFyYW1zLCBbTUFJTl9BUkVBX0xBWU9VVF9RVUVSWV9QQVJBTV06IHNlcmlhbGl6ZWRNYWluQXJlYUdyaWR9LFxuICAgICAgLy8gTWVyZ2Ugd2l0aCBleGlzdGluZyBxdWVyeSBwYXJhbXMgdW5sZXNzIHNwZWNpZmllZCBhbiBleHBsaWNpdCBzdHJhdGVneSwgZS5nLiwgZm9yIG1pZ3JhdGluZyBhbiBvdXRkYXRlZCBsYXlvdXQgVVJMLlxuICAgICAgLy8gTm90ZSB0aGF0IGBudWxsYCBpcyBhIHZhbGlkIHN0cmF0ZWd5IGZvciBjbGVhcmluZyBleGlzdGluZyBxdWVyeSBwYXJhbXMsIHNvIGRvIG5vdCB1c2UgdGhlIG51bGxpc2ggY29hbGVzY2luZyBvcGVyYXRvciAoPz8pLlxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogRGVmaW5lZC5vckVsc2UoZXh0cmFzPy5xdWVyeVBhcmFtc0hhbmRsaW5nLCAnbWVyZ2UnKSxcbiAgICAgIHJlbGF0aXZlVG86IG51bGwsIC8vIGNvbW1hbmRzIGFyZSBub3JtYWxpemVkIHRvIHRoZWlyIGFic29sdXRlIGZvcm1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIG5vcm1hbGl6ZUNvbW1hbmRzXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZU91dGxldENvbW1hbmRzKG91dGxldHM/OiB7W291dGxldDogc3RyaW5nXTogQ29tbWFuZHMgfCBudWxsfSwgcmVsYXRpdmVUbz86IEFjdGl2YXRlZFJvdXRlIHwgbnVsbCk6IHtbb3V0bGV0OiBzdHJpbmddOiBDb21tYW5kcyB8IG51bGx9IHwgbnVsbCB7XG4gICAgaWYgKCFvdXRsZXRzIHx8ICFPYmplY3Qua2V5cyhvdXRsZXRzKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhvdXRsZXRzKS5yZWR1Y2UoKGFjYywgW291dGxldE5hbWUsIGNvbW1hbmRzXSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYWNjLFxuICAgICAgICBbb3V0bGV0TmFtZV06IGNvbW1hbmRzID8gdGhpcy5ub3JtYWxpemVDb21tYW5kcyhjb21tYW5kcywgcmVsYXRpdmVUbykgOiBudWxsLCAvLyBgbnVsbGAgdG8gcmVtb3ZlIGFuIG91dGxldFxuICAgICAgfTtcbiAgICB9LCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBjb21tYW5kcyB0byB0aGVpciBhYnNvbHV0ZSBmb3JtLlxuICAgKlxuICAgKiAtLS1cbiAgICogQXMgb2YgQW5ndWxhciA2LngsIGNvbW1hbmRzIHdoaWNoIHRhcmdldCBhIG5hbWVkIG91dGxldCAoYXV4aWxpYXJ5IHJvdXRlKSBhcmUgbm90IG5vcm1hbGl6ZWQsIG1lYW5pbmcgdGhhdFxuICAgKiByZWxhdGl2ZSBuYXZpZ2F0aW9uYWwgc3ltYm9scyBsaWtlIGAvYCwgYC4vYCwgb3IgYC4uL2AgYXJlIG5vdCByZXNvbHZlZCAoc2VlIGBjcmVhdGVfdXJsX3RyZWUudHNgIG1ldGhvZDogYGNvbXB1dGVOYXZpZ2F0aW9uYCkuXG4gICAqXG4gICAqIEV4YW1wbGU6IHJvdXRlci5uYXZpZ2F0ZShbe291dGxldHM6IHtbb3V0bGV0XTogY29tbWFuZHN9fV0pXG4gICAqXG4gICAqIFRvIGJ5cGFzcyB0aGF0IHJlc3RyaWN0aW9uLCB3ZSBmaXJzdCBjcmVhdGUgYSBVUkwgdHJlZSB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIHRhcmdldCBvdXRsZXQuIEFzIGV4cGVjdGVkLCB0aGlzIHRyYW5zbGF0ZXMgaW50byBhXG4gICAqIFVSTCB3aXRoIGFsbCBuYXZpZ2F0aW9uYWwgc3ltYm9scyByZXNvbHZlZC4gVGhlbiwgd2UgZXh0cmFjdCB0aGUgVVJMIHNlZ21lbnRzIG9mIHRoZSByZXNvbHZlZCByb3V0ZSBhbmQgY29udmVydCBpdCBiYWNrIGludG8gY29tbWFuZHMuXG4gICAqIFRoZSByZXN1bHRpbmcgY29tbWFuZHMgYXJlIGluIHRoZWlyIGFic29sdXRlIGZvcm0gYW5kIG1heSBiZSB1c2VkIGZvciB0aGUgZWZmZWN0aXZlIG5hdmlnYXRpb24gdG8gdGFyZ2V0IGEgbmFtZWQgcm91dGVyIG91dGxldC5cbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplQ29tbWFuZHMoY29tbWFuZHM6IENvbW1hbmRzLCByZWxhdGl2ZVRvPzogQWN0aXZhdGVkUm91dGUgfCBudWxsKTogQ29tbWFuZHMge1xuICAgIGlmICghY29tbWFuZHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHRvIHJ1biBpbiBBbmd1bGFyIHpvbmUuXG4gICAgaWYgKCFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl96b25lLnJ1bigoKSA9PiB0aGlzLm5vcm1hbGl6ZUNvbW1hbmRzKGNvbW1hbmRzLCByZWxhdGl2ZVRvKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplRm4gPSAob3V0bGV0OiBzdHJpbmcsIGV4dHJhcz86IE5hdmlnYXRpb25FeHRyYXMpOiBDb21tYW5kcyA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5fcm91dGVyLmNyZWF0ZVVybFRyZWUoY29tbWFuZHMsIGV4dHJhcylcbiAgICAgICAgLnJvb3QuY2hpbGRyZW5bb3V0bGV0XS5zZWdtZW50c1xuICAgICAgICAucmVkdWNlPENvbW1hbmRzPigoYWNjLCBwKSA9PiBbLi4uYWNjLCBwLnBhdGgsIC4uLihPYmplY3Qua2V5cyhwLnBhcmFtZXRlcnMpLmxlbmd0aCA/IFtwLnBhcmFtZXRlcnNdIDogW10pXSwgW10pO1xuICAgIH07XG5cbiAgICBpZiAoIXJlbGF0aXZlVG8pIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVGbihQUklNQVJZX09VVExFVCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0T3V0bGV0ID0gcmVsYXRpdmVUby5wYXRoRnJvbVJvb3RbMV0/Lm91dGxldDtcbiAgICBpZiAoIXRhcmdldE91dGxldCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZUZuKFBSSU1BUllfT1VUTEVUKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplRm4odGFyZ2V0T3V0bGV0LCB7cmVsYXRpdmVUb30pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHByZXNlbnQgdmlld3Mgd2hpY2ggbWF0Y2ggdGhlIGdpdmVuIGNvbW1hbmRzLlxuICAgKlxuICAgKiBBbGxvd3MgbWF0Y2hpbmcgd2lsZGNhcmQgc2VnbWVudHMgYnkgc2V0dGluZyB0aGUgb3B0aW9uIGBtYXRjaFdpbGRjYXJkU2VnbWVudHNgIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZVByZXNlbnRWaWV3SWRzKGNvbW1hbmRMaXN0OiBDb21tYW5kcywgb3B0aW9ucz86IHtyZWxhdGl2ZVRvPzogQWN0aXZhdGVkUm91dGUgfCBudWxsOyBtYXRjaFdpbGRjYXJkU2VnbWVudHM/OiBib29sZWFufSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IHRoaXMubm9ybWFsaXplQ29tbWFuZHMoY29tbWFuZExpc3QsIG9wdGlvbnM/LnJlbGF0aXZlVG8pO1xuICAgIGNvbnN0IGNvbW1hbmRQYXRoID0gdGhpcy5zZXJpYWxpemVDb21tYW5kcyhjb21tYW5kcywge3NraXBNYXRyaXhQYXJhbXM6IHRydWV9KTtcbiAgICBjb25zdCBtYXRjaFdpbGRjYXJkU2VnbWVudHMgPSBvcHRpb25zPy5tYXRjaFdpbGRjYXJkU2VnbWVudHMgPz8gZmFsc2U7XG5cbiAgICByZXR1cm4gdGhpcy5fdmlld1JlZ2lzdHJ5LnZpZXdzXG4gICAgICAuZmlsdGVyKHZpZXcgPT4ge1xuICAgICAgICBjb25zdCB2aWV3UGF0aCA9IHZpZXcudXJsU2VnbWVudHMubWFwKHNlZ21lbnQgPT4gc2VnbWVudC5wYXRoKTtcbiAgICAgICAgaWYgKGNvbW1hbmRQYXRoLmxlbmd0aCAhPT0gdmlld1BhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21tYW5kUGF0aC5ldmVyeSgoY29tbWFuZFNlZ21lbnQsIGluZGV4KSA9PiAobWF0Y2hXaWxkY2FyZFNlZ21lbnRzICYmIGNvbW1hbmRTZWdtZW50ID09PSAnKicpIHx8IGNvbW1hbmRTZWdtZW50ID09PSB2aWV3UGF0aFtpbmRleF0pO1xuICAgICAgfSlcbiAgICAgIC5tYXAodmlldyA9PiB2aWV3LmlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBuYXZpZ2F0aW9uLCB3aGVuIGJlaW5nIGludm9rZWQgZHVyaW5nIG5hdmlnYXRpb24sIG9yIHRocm93cyBhbiBlcnJvciBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpOiBXb3JrYmVuY2hOYXZpZ2F0aW9uQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLl9jdXJyZW50TmF2aWdhdGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IEVycm9yKCdbV29ya2JlbmNoUm91dGVyRXJyb3JdIE5hdmlnYXRpb24gY29udGV4dCBub3QgYXZhaWxhYmxlIGFzIG5vIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3MuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbkNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBuYXZpZ2F0aW9uYWwgY29udGV4dHVhbCBkYXRhLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBzZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoY29udGV4dDogV29ya2JlbmNoTmF2aWdhdGlvbkNvbnRleHQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fY3VycmVudE5hdmlnYXRpb25Db250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCbG9ja3MgdW50aWwgdGhlIGluaXRpYWwgbGF5b3V0IGlzIGF2YWlsYWJsZSwgaS5lLiBhZnRlciBjb21wbGV0aW9uIG9mIEFuZ3VsYXIncyBpbml0aWFsIG5hdmlnYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JJbml0aWFsTGF5b3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0JCk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBnaXZlbiBjb21tYW5kcyBpbnRvIHZhbGlkIFVSTCBzZWdtZW50cy5cbiAgICovXG4gIHByaXZhdGUgc2VyaWFsaXplQ29tbWFuZHMoY29tbWFuZHM6IENvbW1hbmRzLCBvcHRpb25zPzoge3NraXBNYXRyaXhQYXJhbXM/OiBib29sZWFufSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzZXJpYWxpemVkQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc2tpcE1hdHJpeFBhcmFtcyA9IG9wdGlvbnM/LnNraXBNYXRyaXhQYXJhbXMgPz8gZmFsc2U7XG4gICAgY29tbWFuZHMuZm9yRWFjaChjbWQgPT4ge1xuICAgICAgLy8gaWYgbWF0cml4IHBhcmFtLCBhcHBlbmQgaXQgdG8gdGhlIGxhc3Qgc2VnbWVudFxuICAgICAgY29uc3QgaXNNYXRyaXhQYXJhbSA9IHR5cGVvZiBjbWQgPT09ICdvYmplY3QnO1xuXG4gICAgICBpZiAoIWlzTWF0cml4UGFyYW0pIHtcbiAgICAgICAgc2VyaWFsaXplZENvbW1hbmRzLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGNtZCkpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIXNraXBNYXRyaXhQYXJhbXMpIHtcbiAgICAgICAgc2VyaWFsaXplZENvbW1hbmRzLnB1c2gobmV3IFVybFNlZ21lbnQoc2VyaWFsaXplZENvbW1hbmRzLnBvcCgpISwgY21kKS50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzZXJpYWxpemVkQ29tbWFuZHM7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fc2luZ2xlVGFza0V4ZWN1dG9yLmRlc3Ryb3koKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2VyY2VOYXZpZ2F0aW9uKG5hdmlnYXRpb246IMm1V29ya2JlbmNoTGF5b3V0IHwgV29ya2JlbmNoTmF2aWdhdGlvbiB8IG51bGwpOiBXb3JrYmVuY2hOYXZpZ2F0aW9uIHwgbnVsbCB7XG4gIHJldHVybiBuYXZpZ2F0aW9uIGluc3RhbmNlb2YgybVXb3JrYmVuY2hMYXlvdXQgPyAoe2xheW91dDogbmF2aWdhdGlvbn0pIDogbmF2aWdhdGlvbjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBleHRyYSBvcHRpb25zIHVzZWQgZHVyaW5nIG5hdmlnYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2JlbmNoTmF2aWdhdGlvbkV4dHJhcyBleHRlbmRzIE5hdmlnYXRpb25FeHRyYXMge1xuICAvKipcbiAgICogSW5zdHJ1Y3RzIHRoZSByb3V0ZXIgdG8gYWN0aXZhdGUgdGhlIHZpZXcuIERlZmF1bHRzIHRvIGB0cnVlYCBpZiBub3Qgc3BlY2lmaWVkLlxuICAgKi9cbiAgYWN0aXZhdGU/OiBib29sZWFuO1xuICAvKipcbiAgICogQ2xvc2VzIHRoZSB2aWV3KHMpIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBwYXRoLiBNYXRyaXggcGFyYW1ldGVycyBkbyBub3QgYWZmZWN0IHZpZXcgcmVzb2x1dGlvbi5cbiAgICogVGhlIHBhdGggc3VwcG9ydHMgdGhlIGFzdGVyaXNrIHdpbGRjYXJkIHNlZ21lbnQgKGAqYCkgdG8gbWF0Y2ggdmlldyhzKSB3aXRoIGFueSB2YWx1ZSBpbiB0aGF0IHNlZ21lbnQuXG4gICAqIFRvIGNsb3NlIGEgc3BlY2lmaWMgdmlldywgc2V0IGEgdmlldyB0YXJnZXQgaW5zdGVhZCBvZiBhIHBhdGguXG4gICAqL1xuICBjbG9zZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDb250cm9scyB3aGVyZSB0byBvcGVuIHRoZSB2aWV3LlxuICAgKlxuICAgKiBPbmUgb2Y6XG4gICAqIC0gJ2F1dG8nOiAgICBPcGVucyB0aGUgdmlldyBpbiBhIG5ldyB2aWV3IHRhYiBpZiBubyB2aWV3IGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHBhdGguIE1hdHJpeCBwYXJhbWV0ZXJzIGRvIG5vdCBhZmZlY3RcbiAgICogICAgICAgICAgICAgIHZpZXcgcmVzb2x1dGlvbi4gSWYgb25lIChvciBtb3JlKSB2aWV3KHMpIG1hdGNoIHRoZSBzcGVjaWZpZWQgcGF0aCwgdGhleSBhcmUgbmF2aWdhdGVkIGluc3RlYWQgb2Ygb3BlbmluZyB0aGUgdmlld1xuICAgKiAgICAgICAgICAgICAgaW4gYSBuZXcgdmlldyB0YWIsIGUuZy4sIHRvIHVwZGF0ZSBtYXRyaXggcGFyYW1ldGVycy4gVGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpZiBub3Qgc2V0LlxuICAgKiAtICdibGFuayc6ICAgT3BlbnMgdGhlIHZpZXcgaW4gYSBuZXcgdmlldyB0YWIuXG4gICAqIC0gPHZpZXcuaWQ+OiBOYXZpZ2F0ZXMgdGhlIHNwZWNpZmllZCB2aWV3LiBJZiBhbHJlYWR5IG9wZW5lZCwgcmVwbGFjZXMgaXQsIG9yIG9wZW5zIHRoZSB2aWV3IGluIGEgbmV3IHZpZXcgdGFiIG90aGVyd2lzZS5cbiAgICogICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgcGFzc2VkIHZpZXcgaWRlbnRpZmllciBtdXN0IHN0YXJ0IHdpdGggYHZpZXcuYCwgZS5nLiwgYHZpZXcuNWAuXG4gICAqXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIGBhdXRvYC5cbiAgICovXG4gIHRhcmdldD86IHN0cmluZyB8ICdibGFuaycgfCAnYXV0byc7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaW4gd2hpY2ggcGFydCB0byBvcGVuIHRoZSB2aWV3LiBCeSBkZWZhdWx0LCBpZiBub3Qgc3BlY2lmaWVkLCBvcGVucyB0aGUgdmlldyBpbiB0aGUgYWN0aXZlIHBhcnQgb2YgdGhlIG1haW4gYXJlYSxcbiAgICogaWYgdGhlIGxheW91dCBoYXMgb25lLCBvdGhlcndpc2UgaW4gdGhlIGFjdGl2ZSBwYXJ0IG9mIHRoZSBsYXlvdXQuXG4gICAqL1xuICBibGFua1BhcnRJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgcG9zaXRpb24gd2hlcmUgdG8gaW5zZXJ0IHRoZSB2aWV3IGludG8gdGhlIHRhYiBiYXIgd2hlbiB1c2luZyAnYmxhbmsnIHZpZXcgdGFyZ2V0IHN0cmF0ZWd5LlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgdmlldyBpcyBpbnNlcnRlZCBhZnRlciB0aGUgYWN0aXZlIHZpZXcuIFNldCB0aGUgaW5kZXggdG8gJ3N0YXJ0JyBvciAnZW5kJyBmb3IgaW5zZXJ0aW5nXG4gICAqIHRoZSB2aWV3IGF0IHRoZSBiZWdpbm5pbmcgb3IgYXQgdGhlIGVuZC5cbiAgICovXG4gIGJsYW5rSW5zZXJ0aW9uSW5kZXg/OiBudW1iZXIgfCAnc3RhcnQnIHwgJ2VuZCc7XG4gIC8qKlxuICAgKiBBc3NvY2lhdGVzIHN0YXRlIHdpdGggYSB2aWV3IG5hdmlnYXRpb24uXG4gICAqXG4gICAqIFN0YXRlIGlzIHdyaXR0ZW4gdG8gdGhlIGJyb3dzZXIgc2Vzc2lvbiBoaXN0b3J5LCBub3QgdG8gdGhlIFVSTCwgc28gd2lsbCBiZSBsb3N0IG9uIHBhZ2UgcmVsb2FkLlxuICAgKlxuICAgKiBTdGF0ZSBjYW4gYmUgcmVhZCBmcm9tIHtAbGluayBXb3JrYmVuY2hWaWV3LnN0YXRlfSwgb3IgdGhlIGJyb3dzZXIncyBzZXNzaW9uIGhpc3RvcnkgdmlhIGBoaXN0b3J5LnN0YXRlYC5cbiAgICovXG4gIHN0YXRlPzogVmlld1N0YXRlO1xuICAvKipcbiAgICogU3BlY2lmaWVzIENTUyBjbGFzcyhlcykgdG8gYmUgYWRkZWQgdG8gdGhlIHZpZXcsIHVzZWZ1bCBpbiBlbmQtdG8tZW5kIHRlc3RzIGZvciBsb2NhdGluZyB2aWV3IGFuZCB2aWV3IHRhYi5cbiAgICogQ1NTIGNsYXNzKGVzKSB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgYnJvd3NlciBVUkwsIGNvbnNlcXVlbnRseSB3aWxsIG5vdCBzdXJ2aXZlIGEgcGFnZSByZWxvYWQuXG4gICAqL1xuICBjc3NDbGFzcz86IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnRleHR1YWwgZGF0YSBvZiBhIHdvcmtiZW5jaCBuYXZpZ2F0aW9uIGF2YWlsYWJsZSBvbiB0aGUgcm91dGVyIGR1cmluZyBuYXZpZ2F0aW9uLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHNlZSBXb3JrYmVuY2hVcmxPYnNlcnZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0IHtcbiAgLyoqXG4gICAqIExheW91dCB0byBiZSBhcHBsaWVkIGFmdGVyIHN1Y2Nlc3NmdWwgbmF2aWdhdGlvbi5cbiAgICovXG4gIGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQ7XG4gIC8qKlxuICAgKiBXb3JrYmVuY2ggbGF5b3V0IGVsZW1lbnRzIGFkZGVkIG9yIHJlbW92ZWQgYnkgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbi5cbiAgICovXG4gIGxheW91dERpZmY6IFdvcmtiZW5jaExheW91dERpZmY7XG4gIC8qKlxuICAgKiBQb3B1cHMgYWRkZWQgb3IgcmVtb3ZlZCBieSB0aGUgY3VycmVudCBuYXZpZ2F0aW9uLlxuICAgKi9cbiAgcG9wdXBEaWZmOiBXb3JrYmVuY2hQb3B1cERpZmY7XG4gIC8qKlxuICAgKiBEaWFsb2dzIGFkZGVkIG9yIHJlbW92ZWQgYnkgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbi5cbiAgICovXG4gIGRpYWxvZ0RpZmY6IFdvcmtiZW5jaERpYWxvZ0RpZmY7XG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYSB3b3JrYmVuY2ggbmF2aWdhdGlvbiBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2JlbmNoTmF2aWdhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IGxheW91dCB0byBhcHBseS5cbiAgICovXG4gIGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQ7XG4gIC8qKlxuICAgKiBWaWV3IG91dGxldCBkZWx0YSB0byBhcHBseSB0byB0aGUgY3VycmVudCBVUkwuIEZvciBlYWNoIG91dGxldCB0byBhZGQsIHJlbW92ZSwgb3IgY2hhbmdlLFxuICAgKiBhZGQgYSBwcm9wZXJ0eSB0byB0aGlzIGRpY3Rpb25hcnkgYW5kIHNldCB0aGUgY29tbWFuZHMgdG8gY29uc3RydWN0IHRoZSBvdXRsZXQgVVJMLlxuICAgKiBUbyByZW1vdmUgYW4gb3V0bGV0IGZyb20gdGhlIFVSTCwgc2V0IGl0cyBjb21tYW5kcyB0byBgbnVsbGAuXG4gICAqL1xuICB2aWV3T3V0bGV0cz86IHtbb3V0bGV0OiBzdHJpbmddOiBDb21tYW5kcyB8IG51bGx9O1xuICAvKipcbiAgICogVmlldyBzdGF0ZXMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYXZpZ2F0aW9uLlxuICAgKi9cbiAgdmlld1N0YXRlcz86IFZpZXdTdGF0ZXM7XG59XG4iXX0=
17
+ args: [{ providedIn: 'root', useExisting: ɵWorkbenchRouter }]
18
+ }] });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvcm91dGluZy93b3JrYmVuY2gtcm91dGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQzs7QUFFN0Q7Ozs7OztHQU1HO0FBRUgsTUFBTSxPQUFnQixlQUFlOzhHQUFmLGVBQWU7a0hBQWYsZUFBZSxjQURaLE1BQU0sZUFBZSxnQkFBZ0I7OzJGQUN4QyxlQUFlO2tCQURwQyxVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7TmF2aWdhdGlvbkV4dHJhc30gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbW1hbmRzLCBOYXZpZ2F0ZUZuLCBXb3JrYmVuY2hOYXZpZ2F0aW9uRXh0cmFzfSBmcm9tICcuL3JvdXRpbmcubW9kZWwnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFJvdXRlcn0gZnJvbSAnLi/JtXdvcmtiZW5jaC1yb3V0ZXIuc2VydmljZSc7XG5cbi8qKlxuICogRW5hYmxlcyBuYXZpZ2F0aW9uIG9mIHdvcmtiZW5jaCB2aWV3cyBhbmQgbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrYmVuY2ggbGF5b3V0LlxuICpcbiAqIEEgdmlldyBpcyBhIHZpc3VhbCB3b3JrYmVuY2ggZWxlbWVudCBmb3IgZGlzcGxheWluZyBjb250ZW50IHNpZGUtYnktc2lkZSBvciBzdGFja2VkLiBBIHZpZXcgY2FuIGJlIG5hdmlnYXRlZCB0byBhbnkgcm91dGUuXG4gKlxuICogQSB2aWV3IGNhbiBpbmplY3QgYEFjdGl2YXRlZFJvdXRlYCB0byBvYnRhaW4gcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIG5hdmlnYXRpb24gYW5kL29yIHJlYWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHJvdXRlLlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnLCB1c2VFeGlzdGluZzogybVXb3JrYmVuY2hSb3V0ZXJ9KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFdvcmtiZW5jaFJvdXRlciB7XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYXJyYXkgb2YgY29tbWFuZHMgYW5kIGV4dHJhcy4gVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byBBbmd1bGFyJ3MgYFJvdXRlci5uYXZpZ2F0ZSguLi4pYCwgYnV0IHdpdGggYSB2aWV3IGFzIHRoZSBuYXZpZ2F0aW9uIHRhcmdldC5cbiAgICpcbiAgICogQSBjb21tYW5kIGNhbiBiZSBhIHN0cmluZyBvciBhbiBvYmplY3QgbGl0ZXJhbC4gQSBzdHJpbmcgcmVwcmVzZW50cyBhIHBhdGggc2VnbWVudCwgYW4gb2JqZWN0IGxpdGVyYWwgYXNzb2NpYXRlcyBtYXRyaXggcGFyYW1ldGVycyB3aXRoIHRoZSBwcmVjZWRpbmcgc2VnbWVudC5cbiAgICogTXVsdGlwbGUgc2VnbWVudHMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgY29tbWFuZCwgc2VwYXJhdGVkIGJ5IGEgZm9yd2FyZCBzbGFzaC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgbmF2aWdhdGVzIGV4aXN0aW5nIHZpZXdzIHRoYXQgbWF0Y2ggdGhlIHBhdGgsIG9yIG9wZW5zIGEgbmV3IHZpZXcgb3RoZXJ3aXNlLiBNYXRyaXggcGFyYW1zIGRvIG5vdCBhZmZlY3QgdmlldyByZXNvbHV0aW9uLlxuICAgKiBUaGlzIGJlaGF2aW9yIGNhbiBiZSBjaGFuZ2VkIGJ5IHNldHRpbmcgYW4gZXhwbGljaXQgbmF2aWdhdGlvbiB0YXJnZXQgaW4gbmF2aWdhdGlvbiBleHRyYXMuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIG5hdmlnYXRpb24gaXMgYWJzb2x1dGUuIFNldCBgcmVsYXRpdmVUb2AgaW4gZXh0cmFzIGZvciByZWxhdGl2ZSBuYXZpZ2F0aW9uLlxuICAgKlxuICAgKiBUaGUgcm91dGVyIHN1cHBvcnRzIGZvciBjbG9zaW5nIHZpZXdzIG1hdGNoaW5nIHRoZSByb3V0aW5nIGNvbW1hbmRzIGJ5IHNldHRpbmcgYGNsb3NlYCBpbiBuYXZpZ2F0aW9uIGV4dHJhcy5cbiAgICpcbiAgICogIyMjIFVzYWdlXG4gICAqIGBgYFxuICAgKiBpbmplY3QoV29ya2JlbmNoUm91dGVyKS5uYXZpZ2F0ZShbJ3RlYW0nLCAzMywgJ3VzZXInLCAxMV0pO1xuICAgKiBpbmplY3QoV29ya2JlbmNoUm91dGVyKS5uYXZpZ2F0ZShbJ3RlYW0vMTEvdXNlcicsIHVzZXJOYW1lLCB7ZGV0YWlsczogdHJ1ZX1dKTsgLy8gbXVsdGlwbGUgc3RhdGljIHNlZ21lbnRzIGNhbiBiZSBtZXJnZWQgaW50byBvbmVcbiAgICogaW5qZWN0KFdvcmtiZW5jaFJvdXRlcikubmF2aWdhdGUoWyd0ZWFtcycsIHtzZWxlY3Rpb246IDMzJ31dKTsgLy8gbWF0cml4IHBhcmFtZXRlciBgc2VsZWN0aW9uYCB3aXRoIHRoZSB2YWx1ZSBgMzNgLlxuICAgKiBgYGBcbiAgICpcbiAgICogQHNlZSBXb3JrYmVuY2hSb3V0ZXJMaW5rRGlyZWN0aXZlXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgbmF2aWdhdGUoY29tbWFuZHM6IENvbW1hbmRzLCBleHRyYXM/OiBXb3JrYmVuY2hOYXZpZ2F0aW9uRXh0cmFzKTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogUGVyZm9ybXMgY2hhbmdlcyB0byB0aGUgY3VycmVudCB3b3JrYmVuY2ggbGF5b3V0LlxuICAgKlxuICAgKiBUaGUgcm91dGVyIHdpbGwgaW52b2tlIHRoZSBwYXNzZWQgZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCB3b3JrYmVuY2ggbGF5b3V0LiBUaGUgbGF5b3V0IGhhcyBtZXRob2RzIGZvciBtb2RpZnlpbmcgaXQuXG4gICAqIFRoZSBsYXlvdXQgaXMgaW1tdXRhYmxlLCBzbyBlYWNoIG1vZGlmaWNhdGlvbiBjcmVhdGVzIGEgbmV3IGluc3RhbmNlLiBVc2UgdGhlIGluc3RhbmNlIGZvciBmdXJ0aGVyIG1vZGlmaWNhdGlvbnMgYW5kIGZpbmFsbHkgcmV0dXJuIGl0LlxuICAgKlxuICAgKiBUaGUgZnVuY3Rpb24gY2FuIGNhbGwgYGluamVjdGAgdG8gZ2V0IGFueSByZXF1aXJlZCBkZXBlbmRlbmNpZXMuXG4gICAqXG4gICAqICMjIFdvcmtiZW5jaCBMYXlvdXRcbiAgICogVGhlIHdvcmtiZW5jaCBsYXlvdXQgaXMgYSBncmlkIG9mIHBhcnRzLiBQYXJ0cyBhcmUgYWxpZ25lZCByZWxhdGl2ZSB0byBlYWNoIG90aGVyLiBBIHBhcnQgaXMgYSBzdGFjayBvZiB2aWV3cy4gQ29udGVudCBpcyBkaXNwbGF5ZWQgaW4gdmlld3MuXG4gICAqXG4gICAqICMjIEV4YW1wbGVcbiAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGFkZHMgYSBwYXJ0IHRvIHRoZSBsZWZ0IG9mIHRoZSBtYWluIGFyZWEsIGluc2VydHMgYSB2aWV3IGFuZCBuYXZpZ2F0ZXMgaXQuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGluamVjdChXb3JrYmVuY2hSb3V0ZXIpLm5hdmlnYXRlKGxheW91dCA9PiBsYXlvdXRcbiAgICogICAuYWRkUGFydCgnbGVmdCcsIHtyZWxhdGl2ZVRvOiBNQUlOX0FSRUEsIGFsaWduOiAnbGVmdCd9KVxuICAgKiAgIC5hZGRWaWV3KCduYXZpZ2F0b3InLCB7cGFydElkOiAnbGVmdCd9KVxuICAgKiAgIC5uYXZpZ2F0ZVZpZXcoJ25hdmlnYXRvcicsIFsncGF0aC90by92aWV3J10pXG4gICAqICAgLmFjdGl2YXRlVmlldygnbmF2aWdhdG9yJylcbiAgICogKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBvbk5hdmlnYXRlIC0gU3BlY2lmaWVzIHRoZSBjYWxsYmFjayB0byBtb2RpZnkgdGhlIGxheW91dC5cbiAgICogQHBhcmFtIGV4dHJhcyAtIENvbnRyb2xzIGhvdyB0byBwZXJmb3JtIHRoZSBuYXZpZ2F0aW9uLlxuICAgKiBAc2VlIE5hdmlnYXRlRm5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBuYXZpZ2F0ZShvbk5hdmlnYXRlOiBOYXZpZ2F0ZUZuLCBleHRyYXM/OiBPbWl0PE5hdmlnYXRpb25FeHRyYXMsICdyZWxhdGl2ZVRvJyB8ICdzdGF0ZSc+KTogUHJvbWlzZTxib29sZWFuPjtcbn1cbiJdfQ==