@scion/workbench 17.0.0-beta.9 → 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 (328) 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/activation-instant.provider.mjs +3 -3
  7. package/esm2022/lib/common/asserts.util.mjs +1 -1
  8. package/esm2022/lib/common/class-list.mjs +67 -29
  9. package/esm2022/lib/common/coerce-observable.pipe.mjs +3 -3
  10. package/esm2022/lib/common/dom.util.mjs +1 -1
  11. package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +4 -4
  12. package/esm2022/lib/common/instanceof.pipe.mjs +3 -3
  13. package/esm2022/lib/common/map-coerce.pipe.mjs +3 -3
  14. package/esm2022/lib/common/math.util.mjs +16 -0
  15. package/esm2022/lib/common/null-if-empty.pipe.mjs +4 -4
  16. package/esm2022/lib/common/objects.util.mjs +7 -1
  17. package/esm2022/lib/common/observables.mjs +1 -1
  18. package/esm2022/lib/common/operators.mjs +1 -12
  19. package/esm2022/lib/common/stringify-error.util.mjs +1 -1
  20. package/esm2022/lib/common/typeof.pipe.mjs +3 -3
  21. package/esm2022/lib/common/uid.util.mjs +22 -0
  22. package/esm2022/lib/common//311/265destroy-ref.mjs +1 -1
  23. package/esm2022/lib/content-projection/content-as-overlay.component.mjs +87 -30
  24. package/esm2022/lib/content-projection/workbench-element-references.mjs +32 -0
  25. package/esm2022/lib/dialog/dialog-footer/dialog-action-filter.pipe.mjs +3 -3
  26. package/esm2022/lib/dialog/dialog-footer/dialog-footer.component.mjs +3 -3
  27. package/esm2022/lib/dialog/dialog-footer/workbench-dialog-action.directive.mjs +3 -3
  28. package/esm2022/lib/dialog/dialog-footer/workbench-dialog-footer.directive.mjs +3 -3
  29. package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +5 -10
  30. package/esm2022/lib/dialog/dialog-header/workbench-dialog-header.directive.mjs +3 -3
  31. package/esm2022/lib/dialog/movable.directive.mjs +6 -6
  32. package/esm2022/lib/dialog/resizable.directive.mjs +6 -6
  33. package/esm2022/lib/dialog/workbench-dialog.component.mjs +27 -25
  34. package/esm2022/lib/dialog/workbench-dialog.mjs +61 -1
  35. package/esm2022/lib/dialog/workbench-dialog.registry.mjs +4 -4
  36. package/esm2022/lib/dialog/workbench-dialog.service.mjs +3 -3
  37. package/esm2022/lib/dialog//311/265workbench-dialog.mjs +99 -61
  38. package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +28 -25
  39. package/esm2022/lib/executor/latest-task-executor.mjs +55 -0
  40. package/esm2022/lib/executor/single-task-executor.mjs +9 -19
  41. package/esm2022/lib/filter-field/filter-field.component.mjs +8 -8
  42. package/esm2022/lib/glass-pane/glass-pane.directive.mjs +4 -4
  43. package/esm2022/lib/layout/grid-element/grid-element.component.mjs +10 -20
  44. package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +19 -22
  45. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v5.model.mjs +11 -0
  46. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v6.model.mjs +11 -0
  47. package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +7 -7
  48. package/esm2022/lib/layout/migration/workbench-layout-migration-v4.service.mjs +4 -4
  49. package/esm2022/lib/layout/migration/workbench-layout-migration-v5.service.mjs +67 -0
  50. package/esm2022/lib/layout/migration/workbench-layout-migration-v6.service.mjs +59 -0
  51. package/esm2022/lib/layout/stringifier.mjs +70 -0
  52. package/esm2022/lib/layout/workbench-layout.component.mjs +19 -23
  53. package/esm2022/lib/layout/workbench-layout.factory.mjs +3 -3
  54. package/esm2022/lib/layout/workbench-layout.mjs +1 -1
  55. package/esm2022/lib/layout/workbench-layout.model.mjs +1 -1
  56. package/esm2022/lib/layout/workbench-layout.service.mjs +28 -26
  57. package/esm2022/lib/layout/workbench-layouts.util.mjs +1 -9
  58. package/esm2022/lib/layout/workench-layout-serializer.service.mjs +22 -32
  59. package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +6 -5
  60. package/esm2022/lib/layout//311/265workbench-layout.mjs +77 -66
  61. package/esm2022/lib/logging/console-appender.service.mjs +4 -4
  62. package/esm2022/lib/logging/logger.mjs +3 -3
  63. package/esm2022/lib/logging/logging-support.mjs +7 -13
  64. package/esm2022/lib/logging/logging.model.mjs +3 -3
  65. package/esm2022/lib/logging//311/265logger.mjs +12 -12
  66. package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +9 -8
  67. package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +5 -5
  68. package/esm2022/lib/message-box/workbench-message-box.component.mjs +5 -5
  69. package/esm2022/lib/message-box/workbench-message-box.service.mjs +3 -3
  70. package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +6 -5
  71. package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +22 -6
  72. package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +29 -22
  73. package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +6 -6
  74. package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +14 -4
  75. package/esm2022/lib/microfrontend-platform/manifest-object-cache.service.mjs +63 -0
  76. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +8 -7
  77. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +4 -4
  78. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +8 -12
  79. package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +21 -12
  80. package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +10 -9
  81. package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +6 -6
  82. package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +17 -15
  83. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +6 -5
  84. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.interceptor.mjs +4 -4
  85. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-legacy-intent-translator.interceptor.mjs +4 -4
  86. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +10 -15
  87. package/esm2022/lib/microfrontend-platform/microfrontend-notification/microfrontend-notification-intent-handler.service.mjs +3 -3
  88. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.mjs +39 -0
  89. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.mjs +120 -0
  90. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.mjs +55 -0
  91. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.mjs +19 -0
  92. package/esm2022/lib/microfrontend-platform/microfrontend-platform-config-loader.mjs +3 -3
  93. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +7 -6
  94. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +13 -14
  95. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +14 -30
  96. package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +5 -5
  97. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +13 -29
  98. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +92 -72
  99. package/esm2022/lib/microfrontend-platform/public_api.mjs +2 -1
  100. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +8 -7
  101. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +20 -18
  102. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +30 -8
  103. package/esm2022/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.mjs +32 -0
  104. package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +29 -11
  105. package/esm2022/lib/migration/workbench-migrator.mjs +1 -1
  106. package/esm2022/lib/notification/notification-css-classes.pipe.mjs +3 -3
  107. package/esm2022/lib/notification/notification-list.component.mjs +6 -10
  108. package/esm2022/lib/notification/notification.component.mjs +6 -7
  109. package/esm2022/lib/notification/notification.service.mjs +8 -7
  110. package/esm2022/lib/notification/text-notification.component.mjs +3 -3
  111. package/esm2022/lib/notification//311/265notification.mjs +1 -1
  112. package/esm2022/lib/page-not-found/page-not-found.component.mjs +7 -9
  113. package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +12 -20
  114. package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +7 -7
  115. package/esm2022/lib/part/part-bar/part-bar.component.mjs +334 -265
  116. package/esm2022/lib/part/part-portal.pipe.mjs +10 -10
  117. package/esm2022/lib/part/part.component.mjs +34 -43
  118. package/esm2022/lib/part/view-context-menu/accelerator-format.pipe.mjs +4 -4
  119. package/esm2022/lib/part/view-context-menu/text.component.mjs +17 -13
  120. package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +6 -8
  121. package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +5 -5
  122. package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +50 -51
  123. package/esm2022/lib/part/view-list/view-list.component.mjs +42 -49
  124. package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +23 -27
  125. package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +16 -18
  126. package/esm2022/lib/part/view-tab/view-tab.component.mjs +100 -111
  127. package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +5 -6
  128. package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +17 -18
  129. package/esm2022/lib/part/workbench-part-action.registry.mjs +18 -42
  130. package/esm2022/lib/part/workbench-part.model.mjs +10 -1
  131. package/esm2022/lib/part/workbench-part.registry.mjs +11 -45
  132. package/esm2022/lib/part//311/265workbench-part.model.mjs +71 -55
  133. package/esm2022/lib/perspective/migration/workbench-perspective-migration-v2.service.mjs +4 -4
  134. package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +6 -6
  135. package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +4 -4
  136. package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +4 -4
  137. package/esm2022/lib/perspective/workbench-perspective.model.mjs +1 -1
  138. package/esm2022/lib/perspective/workbench-perspective.registry.mjs +11 -43
  139. package/esm2022/lib/perspective/workbench-perspective.service.mjs +73 -64
  140. package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +5 -5
  141. package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +62 -47
  142. package/esm2022/lib/popup/popup.component.mjs +6 -6
  143. package/esm2022/lib/popup/popup.config.mjs +27 -25
  144. package/esm2022/lib/popup/popup.service.mjs +171 -176
  145. package/esm2022/lib/portal/wb-component-portal.mjs +18 -17
  146. package/esm2022/lib/portal/workbench-portal-outlet.directive.mjs +4 -4
  147. package/esm2022/lib/public_api.mjs +1 -1
  148. package/esm2022/lib/registry/workbench-object-registry.mjs +38 -17
  149. package/esm2022/lib/routing/empty-outlet/empty-outlet.component.mjs +3 -3
  150. package/esm2022/lib/routing/public_api.mjs +2 -2
  151. package/esm2022/lib/routing/routing.model.mjs +1 -1
  152. package/esm2022/lib/routing/routing.util.mjs +215 -0
  153. package/esm2022/lib/routing/url-segment-matcher.mjs +1 -1
  154. package/esm2022/lib/routing/workbench-auxiliary-route-installer.service.mjs +110 -0
  155. package/esm2022/lib/routing/workbench-dialog-differ.mjs +6 -6
  156. package/esm2022/lib/routing/workbench-layout-differ.mjs +6 -13
  157. package/esm2022/lib/routing/workbench-message-box-differ.mjs +6 -6
  158. package/esm2022/lib/routing/workbench-navigational-states.mjs +2 -2
  159. package/esm2022/lib/routing/workbench-popup-differ.mjs +6 -6
  160. package/esm2022/lib/routing/workbench-route-guards.mjs +57 -0
  161. package/esm2022/lib/routing/workbench-router-link.directive.mjs +5 -5
  162. package/esm2022/lib/routing/workbench-router.service.mjs +3 -3
  163. package/esm2022/lib/routing/workbench-url-observer.service.mjs +143 -151
  164. package/esm2022/lib/routing/workbench-view-outlet-differ.mjs +58 -0
  165. package/esm2022/lib/routing//311/265location.mjs +3 -3
  166. package/esm2022/lib/routing//311/265workbench-router.service.mjs +121 -76
  167. package/esm2022/lib/startup/splash/splash.component.mjs +5 -5
  168. package/esm2022/lib/startup/workbench-initializer.mjs +1 -1
  169. package/esm2022/lib/startup/workbench-launcher.service.mjs +28 -16
  170. package/esm2022/lib/storage/workbench-storage.mjs +3 -3
  171. package/esm2022/lib/testing/workbench-testing.module.mjs +4 -4
  172. package/esm2022/lib/testing/workbench.provider.mjs +5 -5
  173. package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +18 -22
  174. package/esm2022/lib/view/public_api.mjs +1 -2
  175. package/esm2022/lib/view/view-move-handler.service.mjs +73 -58
  176. package/esm2022/lib/view/view-portal.pipe.mjs +9 -9
  177. package/esm2022/lib/view/view.component.mjs +55 -43
  178. package/esm2022/lib/view/workbench-view.model.mjs +1 -1
  179. package/esm2022/lib/view/workbench-view.registry.mjs +11 -45
  180. package/esm2022/lib/view//311/265workbench-view.model.mjs +183 -153
  181. package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +2 -2
  182. package/esm2022/lib/view-dnd/requires-drop-zone.pipe.mjs +4 -4
  183. package/esm2022/lib/view-dnd/view-drag.service.mjs +89 -73
  184. package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +9 -9
  185. package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +9 -9
  186. package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +45 -58
  187. package/esm2022/lib/workbench-config.mjs +2 -2
  188. package/esm2022/lib/workbench-id.mjs +3 -3
  189. package/esm2022/lib/workbench.component.mjs +67 -55
  190. package/esm2022/lib/workbench.constants.mjs +1 -5
  191. package/esm2022/lib/workbench.model.mjs +1 -1
  192. package/esm2022/lib/workbench.module.mjs +4 -4
  193. package/esm2022/lib/workbench.provider.mjs +3 -9
  194. package/esm2022/lib/workbench.service.mjs +4 -4
  195. package/esm2022/lib//311/265workbench.service.mjs +40 -44
  196. package/fesm2022/scion-workbench.mjs +4348 -3628
  197. package/fesm2022/scion-workbench.mjs.map +1 -1
  198. package/lib/common/class-list.d.ts +35 -22
  199. package/lib/common/math.util.d.ts +7 -0
  200. package/lib/common/objects.util.d.ts +6 -2
  201. package/lib/common/operators.d.ts +1 -6
  202. package/lib/common/uid.util.d.ts +9 -0
  203. package/lib/content-projection/content-as-overlay.component.d.ts +39 -22
  204. package/lib/content-projection/workbench-element-references.d.ts +13 -0
  205. package/lib/dialog/workbench-dialog.component.d.ts +3 -2
  206. package/lib/dialog/workbench-dialog.d.ts +57 -13
  207. package/lib/dialog//311/265workbench-dialog.d.ts +38 -24
  208. package/lib/dialog//311/265workbench-dialog.service.d.ts +10 -11
  209. package/lib/executor/latest-task-executor.d.ts +26 -0
  210. package/lib/executor/single-task-executor.d.ts +5 -8
  211. package/lib/filter-field/filter-field.component.d.ts +1 -1
  212. package/lib/layout/grid-element/grid-element.component.d.ts +1 -8
  213. package/lib/layout/main-area-layout/main-area-layout.component.d.ts +0 -4
  214. package/lib/layout/migration/model/workbench-layout-migration-v5.model.d.ts +36 -0
  215. package/lib/layout/migration/model/workbench-layout-migration-v6.model.d.ts +35 -0
  216. package/lib/layout/migration/{workbench-layout-migration-v2.service.d.ts → workbench-layout-migration-v5.service.d.ts} +4 -5
  217. package/lib/layout/migration/workbench-layout-migration-v6.service.d.ts +12 -0
  218. package/lib/layout/stringifier.d.ts +26 -0
  219. package/lib/layout/workbench-layout.component.d.ts +4 -5
  220. package/lib/layout/workbench-layout.d.ts +9 -6
  221. package/lib/layout/workbench-layout.model.d.ts +4 -3
  222. package/lib/layout/workbench-layout.service.d.ts +14 -16
  223. package/lib/layout/workbench-layouts.util.d.ts +0 -6
  224. package/lib/layout/workench-layout-serializer.service.d.ts +13 -16
  225. package/lib/layout//311/265workbench-layout.d.ts +18 -19
  226. package/lib/layout//311/265workbench-layout.factory.d.ts +3 -2
  227. package/lib/logging//311/265logger.d.ts +2 -3
  228. package/lib/microfrontend-platform/common/microfrontend.util.d.ts +5 -1
  229. package/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.d.ts +7 -3
  230. package/lib/microfrontend-platform/manifest-object-cache.service.d.ts +33 -0
  231. package/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.d.ts +3 -6
  232. package/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.d.ts +2 -1
  233. package/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.d.ts +1 -1
  234. package/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.d.ts +2 -1
  235. package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.d.ts +10 -0
  236. package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.d.ts +24 -0
  237. package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.d.ts +20 -0
  238. package/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.d.ts +9 -0
  239. package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.d.ts +4 -8
  240. package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.d.ts +0 -4
  241. package/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.d.ts +5 -12
  242. package/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.d.ts +23 -33
  243. package/lib/microfrontend-platform/public_api.d.ts +1 -0
  244. package/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.d.ts +1 -1
  245. package/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.d.ts +3 -7
  246. package/lib/microfrontend-platform/routing/microfrontend-view-routes.d.ts +9 -2
  247. package/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.d.ts +11 -0
  248. package/lib/notification/notification-list.component.d.ts +0 -2
  249. package/lib/page-not-found/page-not-found.component.d.ts +1 -0
  250. package/lib/part/part-action-bar/part-action-bar.component.d.ts +3 -4
  251. package/lib/part/part-action-bar/part-action.directive.d.ts +2 -2
  252. package/lib/part/part-bar/part-bar.component.d.ts +73 -63
  253. package/lib/part/part-portal.pipe.d.ts +3 -5
  254. package/lib/part/part.component.d.ts +9 -12
  255. package/lib/part/view-context-menu/text.component.d.ts +3 -4
  256. package/lib/part/view-context-menu/view-menu.directive.d.ts +1 -1
  257. package/lib/part/view-context-menu/view-menu.service.d.ts +13 -17
  258. package/lib/part/view-list/view-list.component.d.ts +8 -21
  259. package/lib/part/view-list-button/view-list-button.component.d.ts +8 -11
  260. package/lib/part/view-list-item/view-list-item.component.d.ts +3 -7
  261. package/lib/part/view-tab/view-tab.component.d.ts +19 -29
  262. package/lib/part/view-tab-drag-image/view-tab-drag-image.component.d.ts +4 -4
  263. package/lib/part/workbench-part-action.registry.d.ts +3 -23
  264. package/lib/part/workbench-part.model.d.ts +8 -27
  265. package/lib/part/workbench-part.registry.d.ts +3 -26
  266. package/lib/part//311/265workbench-part.model.d.ts +23 -17
  267. package/lib/perspective/workbench-perspective.model.d.ts +18 -25
  268. package/lib/perspective/workbench-perspective.registry.d.ts +3 -26
  269. package/lib/perspective/workbench-perspective.service.d.ts +16 -14
  270. package/lib/perspective/workench-perspective-serializer.service.d.ts +1 -1
  271. package/lib/perspective//311/265workbench-perspective.model.d.ts +30 -21
  272. package/lib/popup/popup.config.d.ts +11 -10
  273. package/lib/popup/popup.service.d.ts +15 -28
  274. package/lib/portal/wb-component-portal.d.ts +21 -5
  275. package/lib/public_api.d.ts +1 -1
  276. package/lib/registry/workbench-object-registry.d.ts +10 -6
  277. package/lib/routing/public_api.d.ts +2 -2
  278. package/lib/routing/routing.model.d.ts +25 -13
  279. package/lib/routing/{router.util.d.ts → routing.util.d.ts} +28 -1
  280. package/lib/routing/{workbench-auxiliary-routes-registrator.service.d.ts → workbench-auxiliary-route-installer.service.d.ts} +10 -3
  281. package/lib/routing/workbench-layout-differ.d.ts +1 -2
  282. package/lib/routing/workbench-navigational-states.d.ts +8 -4
  283. package/lib/{view/workbench-view-route-guards.d.ts → routing/workbench-route-guards.d.ts} +8 -2
  284. package/lib/routing/workbench-url-observer.service.d.ts +31 -55
  285. package/lib/routing/workbench-view-outlet-differ.d.ts +32 -0
  286. package/lib/routing//311/265workbench-router.service.d.ts +22 -18
  287. package/lib/startup/workbench-launcher.service.d.ts +4 -5
  288. package/lib/testing/workbench.provider.d.ts +3 -1
  289. package/lib/theme/workbench-theme-switcher.service.d.ts +4 -6
  290. package/lib/view/public_api.d.ts +0 -1
  291. package/lib/view/view-move-handler.service.d.ts +16 -14
  292. package/lib/view/view-portal.pipe.d.ts +1 -3
  293. package/lib/view/view.component.d.ts +21 -12
  294. package/lib/view/workbench-view.model.d.ts +88 -36
  295. package/lib/view/workbench-view.registry.d.ts +3 -27
  296. package/lib/view//311/265workbench-view.model.d.ts +62 -71
  297. package/lib/view-dnd/view-drag.service.d.ts +79 -49
  298. package/lib/view-dnd/view-drop-placeholder-renderer.service.d.ts +1 -1
  299. package/lib/view-dnd/view-tab-drag-image-renderer.service.d.ts +12 -36
  300. package/lib/workbench-config.d.ts +19 -7
  301. package/lib/workbench.component.d.ts +16 -30
  302. package/lib/workbench.constants.d.ts +0 -5
  303. package/lib/workbench.model.d.ts +31 -3
  304. package/lib/workbench.service.d.ts +58 -56
  305. package/lib//311/265workbench.service.d.ts +18 -31
  306. package/package.json +12 -12
  307. package/esm2022/lib/common/filter-by-predicate.pipe.mjs +0 -27
  308. package/esm2022/lib/common/filter-by-text.pipe.mjs +0 -39
  309. package/esm2022/lib/common/uuid.util.mjs +0 -17
  310. package/esm2022/lib/content-projection/content-projection.directive.mjs +0 -101
  311. package/esm2022/lib/content-projection/view-container.reference.mjs +0 -68
  312. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v1.model.mjs +0 -11
  313. package/esm2022/lib/layout/migration/workbench-layout-migration-v2.service.mjs +0 -59
  314. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.mjs +0 -41
  315. package/esm2022/lib/page-not-found/format-url.pipe.mjs +0 -26
  316. package/esm2022/lib/part/part-action-bar/part-action-filter.pipe.mjs +0 -26
  317. package/esm2022/lib/routing/router.util.mjs +0 -126
  318. package/esm2022/lib/routing/workbench-auxiliary-routes-registrator.service.mjs +0 -94
  319. package/esm2022/lib/view/workbench-view-route-guards.mjs +0 -47
  320. package/lib/common/filter-by-predicate.pipe.d.ts +0 -10
  321. package/lib/common/filter-by-text.pipe.d.ts +0 -12
  322. package/lib/common/uuid.util.d.ts +0 -8
  323. package/lib/content-projection/content-projection.directive.d.ts +0 -30
  324. package/lib/content-projection/view-container.reference.d.ts +0 -42
  325. package/lib/layout/migration/model/workbench-layout-migration-v1.model.d.ts +0 -16
  326. package/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.d.ts +0 -10
  327. package/lib/page-not-found/format-url.pipe.d.ts +0 -11
  328. package/lib/part/part-action-bar/part-action-filter.pipe.d.ts +0 -11
@@ -7,22 +7,21 @@
7
7
  *
8
8
  * SPDX-License-Identifier: EPL-2.0
9
9
  */
10
- import { Injectable, Injector, runInInjectionContext } from '@angular/core';
11
- import { OverlayConfig, OverlayRef } from '@angular/cdk/overlay';
10
+ import { inject, Injectable, Injector, NgZone, runInInjectionContext } from '@angular/core';
11
+ import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';
12
12
  import { ComponentPortal } from '@angular/cdk/portal';
13
13
  import { ViewMenuComponent } from './view-menu.component';
14
+ import { WORKBENCH_VIEW_REGISTRY } from '../../view/workbench-view.registry';
14
15
  import { filter, map, switchMap, takeUntil } from 'rxjs/operators';
15
16
  import { firstValueFrom, fromEvent, Observable, Subject } from 'rxjs';
16
17
  import { coerceElement } from '@angular/cdk/coercion';
17
18
  import { TEXT, TextComponent } from '../view-context-menu/text.component';
18
- import { filterArray, observeInside, subscribeInside } from '@scion/toolkit/operators';
19
+ import { WorkbenchConfig } from '../../workbench-config';
20
+ import { WorkbenchService } from '../../workbench.service';
21
+ import { filterArray, observeIn } from '@scion/toolkit/operators';
19
22
  import { provideViewContext } from '../../view/view-context-provider';
20
23
  import { Arrays } from '@scion/toolkit/util';
21
24
  import * as i0 from "@angular/core";
22
- import * as i1 from "@angular/cdk/overlay";
23
- import * as i2 from "../../view/workbench-view.registry";
24
- import * as i3 from "../../workbench.service";
25
- import * as i4 from "../../workbench-config";
26
25
  /**
27
26
  * Shows menu items of a {@link WorkbenchView} in a menu.
28
27
  */
@@ -31,19 +30,19 @@ export class ViewMenuService {
31
30
  static { this.TOP_RIGHT = { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top' }; }
32
31
  static { this.BOTTOM_LEFT = { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' }; }
33
32
  static { this.BOTTOM_RIGHT = { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'bottom' }; }
34
- constructor(_overlay, _injector, _zone, _viewRegistry, _workbenchService, _workbenchConfig) {
35
- this._overlay = _overlay;
36
- this._injector = _injector;
37
- this._zone = _zone;
38
- this._viewRegistry = _viewRegistry;
39
- this._workbenchService = _workbenchService;
40
- this._workbenchConfig = _workbenchConfig;
33
+ constructor() {
34
+ this._overlay = inject(Overlay);
35
+ this._injector = inject(Injector);
36
+ this._zone = inject(NgZone);
37
+ this._viewRegistry = inject(WORKBENCH_VIEW_REGISTRY);
38
+ this._workbenchService = inject(WorkbenchService);
39
+ this._workbenchConfig = inject(WorkbenchConfig);
41
40
  // Registers built-in menu items added to the context menu of every view tab.
42
- this.registerCloseViewMenuItem();
43
- this.registerCloseOtherViewsMenuItem();
44
- this.registerCloseAllViewsMenuItem();
45
- this.registerCloseViewsToTheRightMenuItem();
46
- this.registerCloseViewsToTheLeftMenuItem();
41
+ this.registerCloseMenuItem();
42
+ this.registerCloseOtherTabsMenuItem();
43
+ this.registerCloseAllTabsMenuItem();
44
+ this.registerCloseRightTabsMenuItem();
45
+ this.registerCloseLeftTabsMenuItem();
47
46
  this.registerMoveRightMenuItem();
48
47
  this.registerMoveLeftMenuItem();
49
48
  this.registerMoveUpMenuItem();
@@ -89,7 +88,7 @@ export class ViewMenuService {
89
88
  return new Observable(() => {
90
89
  const unsubscribe$ = new Subject();
91
90
  view.menuItems$
92
- .pipe(
91
+ .pipe(observeIn(fn => this._zone.runOutsideAngular(fn)),
93
92
  // Skip menu items which have no accelerator configured.
94
93
  filterArray((menuItem) => !!menuItem.accelerator?.length), filter(menuItems => menuItems.length > 0),
95
94
  // Subscribe for keyboard events.
@@ -113,7 +112,7 @@ export class ViewMenuService {
113
112
  }
114
113
  return true;
115
114
  }),
116
- })), filter(({ menuItems }) => menuItems.length > 0), subscribeInside(fn => this._zone.runOutsideAngular(fn)), observeInside(fn => this._zone.run(fn)), takeUntil(unsubscribe$))
115
+ })), filter(({ menuItems }) => menuItems.length > 0), observeIn(fn => this._zone.run(fn)), takeUntil(unsubscribe$))
117
116
  .subscribe(({ event, menuItems }) => {
118
117
  event.preventDefault();
119
118
  event.stopPropagation();
@@ -124,8 +123,8 @@ export class ViewMenuService {
124
123
  return () => unsubscribe$.next();
125
124
  });
126
125
  }
127
- registerCloseViewMenuItem() {
128
- const defaults = { visible: true, text: 'Close tab', group: 'close', accelerator: ['ctrl', 'k'], cssClass: 'e2e-close-tab' };
126
+ registerCloseMenuItem() {
127
+ const defaults = { visible: true, text: 'Close', group: 'close', accelerator: ['ctrl', 'k'], cssClass: 'e2e-close' };
129
128
  const appConfig = this._workbenchConfig.viewMenuItems?.close;
130
129
  const config = { ...defaults, ...appConfig };
131
130
  config.visible && this._workbenchService.registerViewMenuItem((view) => {
@@ -138,13 +137,13 @@ export class ViewMenuService {
138
137
  accelerator: config.accelerator,
139
138
  group: config.group,
140
139
  cssClass: config.cssClass,
141
- isDisabled: () => !view.closable,
140
+ isDisabled: () => !view.closable(),
142
141
  onAction: () => void view.close().then(),
143
142
  });
144
143
  });
145
144
  }
146
- registerCloseOtherViewsMenuItem() {
147
- const defaults = { visible: true, text: 'Close other tabs', group: 'close', accelerator: ['ctrl', 'shift', 'k'] };
145
+ registerCloseOtherTabsMenuItem() {
146
+ const defaults = { visible: true, text: 'Close other tabs', group: 'close', accelerator: ['ctrl', 'shift', 'k'], cssClass: ' e2e-close-other-tabs' };
148
147
  const appConfig = this._workbenchConfig.viewMenuItems?.closeOthers;
149
148
  const config = { ...defaults, ...appConfig };
150
149
  config.visible && this._workbenchService.registerViewMenuItem((view) => {
@@ -157,12 +156,12 @@ export class ViewMenuService {
157
156
  accelerator: config.accelerator,
158
157
  group: config.group,
159
158
  cssClass: config.cssClass,
160
- isDisabled: () => view.first && view.last,
159
+ isDisabled: () => view.first() && view.last(),
161
160
  onAction: () => void view.close('other-views').then(),
162
161
  });
163
162
  });
164
163
  }
165
- registerCloseAllViewsMenuItem() {
164
+ registerCloseAllTabsMenuItem() {
166
165
  const defaults = { visible: true, text: 'Close all tabs', group: 'close', accelerator: ['ctrl', 'shift', 'alt', 'k'], cssClass: 'e2e-close-all-tabs' };
167
166
  const appConfig = this._workbenchConfig.viewMenuItems?.closeAll;
168
167
  const config = { ...defaults, ...appConfig };
@@ -180,8 +179,8 @@ export class ViewMenuService {
180
179
  });
181
180
  });
182
181
  }
183
- registerCloseViewsToTheRightMenuItem() {
184
- const defaults = { visible: true, text: 'Close tabs to the right', group: 'close' };
182
+ registerCloseRightTabsMenuItem() {
183
+ const defaults = { visible: true, text: 'Close tabs to the right', group: 'close', cssClass: 'e2e-close-right-tabs' };
185
184
  const appConfig = this._workbenchConfig.viewMenuItems?.closeToTheRight;
186
185
  const config = { ...defaults, ...appConfig };
187
186
  config.visible && this._workbenchService.registerViewMenuItem((view) => {
@@ -194,13 +193,13 @@ export class ViewMenuService {
194
193
  accelerator: config.accelerator,
195
194
  group: config.group,
196
195
  cssClass: config.cssClass,
197
- isDisabled: () => view.last,
196
+ isDisabled: () => view.last(),
198
197
  onAction: () => void view.close('views-to-the-right').then(),
199
198
  };
200
199
  });
201
200
  }
202
- registerCloseViewsToTheLeftMenuItem() {
203
- const defaults = { visible: true, text: 'Close tabs to the left', group: 'close' };
201
+ registerCloseLeftTabsMenuItem() {
202
+ const defaults = { visible: true, text: 'Close tabs to the left', group: 'close', cssClass: 'e2e-close-left-tabs' };
204
203
  const appConfig = this._workbenchConfig.viewMenuItems?.closeToTheLeft;
205
204
  const config = { ...defaults, ...appConfig };
206
205
  config.visible && this._workbenchService.registerViewMenuItem((view) => {
@@ -213,13 +212,13 @@ export class ViewMenuService {
213
212
  accelerator: config.accelerator,
214
213
  group: config.group,
215
214
  cssClass: config.cssClass,
216
- isDisabled: () => view.first,
215
+ isDisabled: () => view.first(),
217
216
  onAction: () => void view.close('views-to-the-left').then(),
218
217
  };
219
218
  });
220
219
  }
221
220
  registerMoveRightMenuItem() {
222
- const defaults = { visible: true, text: 'Move right', group: 'move', accelerator: ['ctrl', 'alt', 'end'] };
221
+ const defaults = { visible: true, text: 'Move right', group: 'move', accelerator: ['ctrl', 'alt', 'end'], cssClass: 'e2e-move-right' };
223
222
  const appConfig = this._workbenchConfig.viewMenuItems?.moveRight;
224
223
  const config = { ...defaults, ...appConfig };
225
224
  config.visible && this._workbenchService.registerViewMenuItem((view) => {
@@ -232,13 +231,13 @@ export class ViewMenuService {
232
231
  accelerator: config.accelerator,
233
232
  group: config.group,
234
233
  cssClass: config.cssClass,
235
- isDisabled: () => view.first && view.last,
236
- onAction: () => view.move(view.part.id, { region: 'east' }),
234
+ isDisabled: () => view.first() && view.last(),
235
+ onAction: () => view.move(view.part().id, { region: 'east' }),
237
236
  };
238
237
  });
239
238
  }
240
239
  registerMoveLeftMenuItem() {
241
- const defaults = { visible: true, text: 'Move left', group: 'move' };
240
+ const defaults = { visible: true, text: 'Move left', group: 'move', cssClass: 'e2e-move-left' };
242
241
  const appConfig = this._workbenchConfig.viewMenuItems?.moveLeft;
243
242
  const config = { ...defaults, ...appConfig };
244
243
  config.visible && this._workbenchService.registerViewMenuItem((view) => {
@@ -251,13 +250,13 @@ export class ViewMenuService {
251
250
  accelerator: config.accelerator,
252
251
  group: config.group,
253
252
  cssClass: config.cssClass,
254
- isDisabled: () => view.first && view.last,
255
- onAction: () => view.move(view.part.id, { region: 'west' }),
253
+ isDisabled: () => view.first() && view.last(),
254
+ onAction: () => view.move(view.part().id, { region: 'west' }),
256
255
  };
257
256
  });
258
257
  }
259
258
  registerMoveUpMenuItem() {
260
- const defaults = { visible: true, text: 'Move up', group: 'move' };
259
+ const defaults = { visible: true, text: 'Move up', group: 'move', cssClass: 'e2e-move-up' };
261
260
  const appConfig = this._workbenchConfig.viewMenuItems?.moveUp;
262
261
  const config = { ...defaults, ...appConfig };
263
262
  config.visible && this._workbenchService.registerViewMenuItem((view) => {
@@ -270,13 +269,13 @@ export class ViewMenuService {
270
269
  accelerator: config.accelerator,
271
270
  group: config.group,
272
271
  cssClass: config.cssClass,
273
- isDisabled: () => view.first && view.last,
274
- onAction: () => view.move(view.part.id, { region: 'north' }),
272
+ isDisabled: () => view.first() && view.last(),
273
+ onAction: () => view.move(view.part().id, { region: 'north' }),
275
274
  };
276
275
  });
277
276
  }
278
277
  registerMoveDownMenuItem() {
279
- const defaults = { visible: true, text: 'Move down', group: 'move' };
278
+ const defaults = { visible: true, text: 'Move down', group: 'move', cssClass: 'e2e-move-down' };
280
279
  const appConfig = this._workbenchConfig.viewMenuItems?.moveDown;
281
280
  const config = { ...defaults, ...appConfig };
282
281
  config.visible && this._workbenchService.registerViewMenuItem((view) => {
@@ -289,8 +288,8 @@ export class ViewMenuService {
289
288
  accelerator: config.accelerator,
290
289
  group: config.group,
291
290
  cssClass: config.cssClass,
292
- isDisabled: () => view.first && view.last,
293
- onAction: () => view.move(view.part.id, { region: 'south' }),
291
+ isDisabled: () => view.first() && view.last(),
292
+ onAction: () => view.move(view.part().id, { region: 'south' }),
294
293
  };
295
294
  });
296
295
  }
@@ -312,13 +311,13 @@ export class ViewMenuService {
312
311
  };
313
312
  });
314
313
  }
315
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ViewMenuService, deps: [{ token: i1.Overlay }, { token: i0.Injector }, { token: i0.NgZone }, { token: i2.WorkbenchViewRegistry }, { token: i3.WorkbenchService }, { token: i4.WorkbenchConfig }], target: i0.ɵɵFactoryTarget.Injectable }); }
316
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ViewMenuService, providedIn: 'root' }); }
314
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewMenuService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
315
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewMenuService, providedIn: 'root' }); }
317
316
  }
318
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ViewMenuService, decorators: [{
317
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewMenuService, decorators: [{
319
318
  type: Injectable,
320
319
  args: [{ providedIn: 'root' }]
321
- }], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.Injector }, { type: i0.NgZone }, { type: i2.WorkbenchViewRegistry }, { type: i3.WorkbenchService }, { type: i4.WorkbenchConfig }] });
320
+ }], ctorParameters: () => [] });
322
321
  /**
323
322
  * Returns the pressed modifier keys (ctrl, shift, alt, meta) as array items.
324
323
  */
@@ -338,4 +337,4 @@ function getModifierState(event) {
338
337
  }
339
338
  return modifierState;
340
339
  }
341
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy1tZW51LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9wYXJ0L3ZpZXctY29udGV4dC1tZW51L3ZpZXctbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFhLFVBQVUsRUFBRSxRQUFRLEVBQVUscUJBQXFCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUE2QixhQUFhLEVBQUUsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDM0YsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3hELE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNuRixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFDLElBQUksRUFBRSxhQUFhLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUd4RSxPQUFPLEVBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUdyRixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7Ozs7OztBQUUzQzs7R0FFRztBQUVILE1BQU0sT0FBTyxlQUFlO2FBRUYsYUFBUSxHQUFzQixFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUss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QUFhLEdBQWEsRUFBRSxDQUFDO0lBQ25DLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtRQUNqQixhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO1FBQ2xCLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDN0I7SUFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFDaEIsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUMzQjtJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtRQUNqQixhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsT0FBTyxhQUFhLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMiBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBJbmplY3RvciwgTmdab25lLCBydW5JbkluamVjdGlvbkNvbnRleHR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb25uZWN0ZWRQb3NpdGlvbiwgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHtDb21wb25lbnRQb3J0YWx9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHtWaWV3TWVudUNvbXBvbmVudH0gZnJvbSAnLi92aWV3LW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7V29ya2JlbmNoTWVudUl0ZW19IGZyb20gJy4uLy4uL3dvcmtiZW5jaC5tb2RlbCc7XG5pbXBvcnQge1dvcmtiZW5jaFZpZXdSZWdpc3RyeX0gZnJvbSAnLi4vLi4vdmlldy93b3JrYmVuY2gtdmlldy5yZWdpc3RyeSc7XG5pbXBvcnQge2ZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtmaXJzdFZhbHVlRnJvbSwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBUZWFyZG93bkxvZ2ljfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Y29lcmNlRWxlbWVudH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7VEVYVCwgVGV4dENvbXBvbmVudH0gZnJvbSAnLi4vdmlldy1jb250ZXh0LW1lbnUvdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHtNZW51SXRlbUNvbmZpZywgV29ya2JlbmNoQ29uZmlnfSBmcm9tICcuLi8uLi93b3JrYmVuY2gtY29uZmlnJztcbmltcG9ydCB7V29ya2JlbmNoU2VydmljZX0gZnJvbSAnLi4vLi4vd29ya2JlbmNoLnNlcnZpY2UnO1xuaW1wb3J0IHtmaWx0ZXJBcnJheSwgb2JzZXJ2ZUluc2lkZSwgc3Vic2NyaWJlSW5zaWRlfSBmcm9tICdAc2Npb24vdG9vbGtpdC9vcGVyYXRvcnMnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFZpZXd9IGZyb20gJy4uLy4uL3ZpZXcvybV3b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge1ZpZXdJZCwgV29ya2JlbmNoVmlld30gZnJvbSAnLi4vLi4vdmlldy93b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge3Byb3ZpZGVWaWV3Q29udGV4dH0gZnJvbSAnLi4vLi4vdmlldy92aWV3LWNvbnRleHQtcHJvdmlkZXInO1xuaW1wb3J0IHtBcnJheXN9IGZyb20gJ0BzY2lvbi90b29sa2l0L3V0aWwnO1xuXG4vKipcbiAqIFNob3dzIG1lbnUgaXRlbXMgb2YgYSB7QGxpbmsgV29ya2JlbmNoVmlld30gaW4gYSBtZW51LlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBWaWV3TWVudVNlcnZpY2Uge1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRPUF9MRUZUOiBDb25uZWN0ZWRQb3NpdGlvbiA9IHtvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJ307XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRPUF9SSUdIVDogQ29ubmVjdGVkUG9zaXRpb24gPSB7b3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICd0b3AnfTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQk9UVE9NX0xFRlQ6IENvbm5lY3RlZFBvc2l0aW9uID0ge29yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nfTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQk9UVE9NX1JJR0hUOiBDb25uZWN0ZWRQb3NpdGlvbiA9IHtvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2JvdHRvbSd9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX292ZXJsYXk6IE92ZXJsYXksXG4gICAgICAgICAgICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfem9uZTogTmdab25lLFxuICAgICAgICAgICAgICBwcml2YXRlIF92aWV3UmVnaXN0cnk6IFdvcmtiZW5jaFZpZXdSZWdpc3RyeSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoU2VydmljZTogV29ya2JlbmNoU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoQ29uZmlnOiBXb3JrYmVuY2hDb25maWcpIHtcbiAgICAvLyBSZWdpc3RlcnMgYnVpbHQtaW4gbWVudSBpdGVtcyBhZGRlZCB0byB0aGUgY29udGV4dCBtZW51IG9mIGV2ZXJ5IHZpZXcgdGFiLlxuICAgIHRoaXMucmVnaXN0ZXJDbG9zZVZpZXdNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJDbG9zZU90aGVyVmlld3NNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJDbG9zZUFsbFZpZXdzTWVudUl0ZW0oKTtcbiAgICB0aGlzLnJlZ2lzdGVyQ2xvc2VWaWV3c1RvVGhlUmlnaHRNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJDbG9zZVZpZXdzVG9UaGVMZWZ0TWVudUl0ZW0oKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW92ZVJpZ2h0TWVudUl0ZW0oKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW92ZUxlZnRNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJNb3ZlVXBNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJNb3ZlRG93bk1lbnVJdGVtKCk7XG4gICAgdGhpcy5yZWdpc3Rlck1vdmVUb05ld1dpbmRvd01lbnVJdGVtKCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZW51IHdpdGggbWVudSBpdGVtcyByZWdpc3RlcmVkIGluIGdpdmVuIHtAbGluayBXb3JrYmVuY2hWaWV3fS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgV29ya2JlbmNoVmlldy5yZWdpc3RlclZpZXdNZW51SXRlbX1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzaG93TWVudShsb2NhdGlvbjogUG9pbnQsIHZpZXdJZDogVmlld0lkKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuX3ZpZXdSZWdpc3RyeS5nZXQodmlld0lkKTtcbiAgICBjb25zdCBtZW51SXRlbXMgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh2aWV3Lm1lbnVJdGVtcyQpO1xuXG4gICAgLy8gRG8gbm90IHNob3cgdGhlIG1lbnUgaWYgdGhlcmUgYXJlIG5vIG1lbnUgaXRlbXMgcmVnaXN0ZXJlZC5cbiAgICBpZiAobWVudUl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgYW5kIGRpc3BsYXkgdGhlIG1lbnUgb3ZlcmxheS5cbiAgICBjb25zdCBjb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5fb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLm5vb3AoKSxcbiAgICAgIGRpc3Bvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKClcbiAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8obG9jYXRpb24pXG4gICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxuICAgICAgICAud2l0aFBvc2l0aW9ucyhbVmlld01lbnVTZXJ2aWNlLlRPUF9MRUZULCBWaWV3TWVudVNlcnZpY2UuVE9QX1JJR0hULCBWaWV3TWVudVNlcnZpY2UuQk9UVE9NX0xFRlQsIFZpZXdNZW51U2VydmljZS5CT1RUT01fUklHSFRdKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZShjb25maWcpO1xuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHBhcmVudDogdGhpcy5faW5qZWN0b3IsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge3Byb3ZpZGU6IE92ZXJsYXlSZWYsIHVzZVZhbHVlOiBvdmVybGF5UmVmfSxcbiAgICAgICAgcHJvdmlkZVZpZXdDb250ZXh0KHZpZXcpLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBvdmVybGF5UmVmLmF0dGFjaChuZXcgQ29tcG9uZW50UG9ydGFsKFZpZXdNZW51Q29tcG9uZW50LCBudWxsLCBpbmplY3RvcikpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwb24gc3Vic2NyaXB0aW9uLCBpbnN0YWxscyBrZXlib2FyZCBhY2NlbGVyYXRvcnMgb2YgdGhlIG1lbnUgaXRlbXMgcmVnaXN0ZXJlZCBpbiB7QGxpbmsgV29ya2JlbmNoVmlld30uXG4gICAqL1xuICBwdWJsaWMgaW5zdGFsbE1lbnVJdGVtQWNjZWxlcmF0b3JzJCh0YXJnZXQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgSFRNTEVsZW1lbnQsIHZpZXc6IMm1V29ya2JlbmNoVmlldyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoKTogVGVhcmRvd25Mb2dpYyA9PiB7XG4gICAgICBjb25zdCB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgICB2aWV3Lm1lbnVJdGVtcyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gU2tpcCBtZW51IGl0ZW1zIHdoaWNoIGhhdmUgbm8gYWNjZWxlcmF0b3IgY29uZmlndXJlZC5cbiAgICAgICAgICBmaWx0ZXJBcnJheSgobWVudUl0ZW06IFdvcmtiZW5jaE1lbnVJdGVtKSA9PiAhIW1lbnVJdGVtLmFjY2VsZXJhdG9yPy5sZW5ndGgpLFxuICAgICAgICAgIGZpbHRlcihtZW51SXRlbXMgPT4gbWVudUl0ZW1zLmxlbmd0aCA+IDApLFxuICAgICAgICAgIC8vIFN1YnNjcmliZSBmb3Iga2V5Ym9hcmQgZXZlbnRzLlxuICAgICAgICAgIHN3aXRjaE1hcCgobWVudUl0ZW1zOiBXb3JrYmVuY2hNZW51SXRlbVtdKTogT2JzZXJ2YWJsZTx7ZXZlbnQ6IEtleWJvYXJkRXZlbnQ7IG1lbnVJdGVtczogV29ya2JlbmNoTWVudUl0ZW1bXX0+ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oY29lcmNlRWxlbWVudCh0YXJnZXQpLCAna2V5ZG93bicpLnBpcGUobWFwKGV2ZW50ID0+ICh7ZXZlbnQsIG1lbnVJdGVtc30pKSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgbWFwKCh7ZXZlbnQsIG1lbnVJdGVtc30pID0+ICh7XG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIG1lbnVJdGVtczogbWVudUl0ZW1zXG4gICAgICAgICAgICAgIC5maWx0ZXIobWVudUl0ZW0gPT4gIW1lbnVJdGVtLmlzRGlzYWJsZWQ/LigpKVxuICAgICAgICAgICAgICAuZmlsdGVyKG1lbnVJdGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY2NlbGVyYXRvciA9IG1lbnVJdGVtLmFjY2VsZXJhdG9yITtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBhY2NlbGVyYXRvci5hdCgtMSkhO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVyS2V5cyA9IGFjY2VsZXJhdG9yLnNsaWNlKDAsIC0xKTtcblxuICAgICAgICAgICAgICAgIC8vIENvbXBhcmUga2V5LlxuICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXk/LnRvTG93ZXJDYXNlKCkgIT09IGtleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENvbXBhcmUgbW9kaWZpZXJzLlxuICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmlzRXF1YWwobW9kaWZpZXJLZXlzLCBnZXRNb2RpZmllclN0YXRlKGV2ZW50KSwge2V4YWN0T3JkZXI6IGZhbHNlfSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBmaWx0ZXIoKHttZW51SXRlbXN9KSA9PiBtZW51SXRlbXMubGVuZ3RoID4gMCksXG4gICAgICAgICAgc3Vic2NyaWJlSW5zaWRlKGZuID0+IHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgICBvYnNlcnZlSW5zaWRlKGZuID0+IHRoaXMuX3pvbmUucnVuKGZuKSksXG4gICAgICAgICAgdGFrZVVudGlsKHVuc3Vic2NyaWJlJCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoe2V2ZW50LCBtZW51SXRlbXN9KSA9PiB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5faW5qZWN0b3IsICgpID0+IHtcbiAgICAgICAgICAgIG1lbnVJdGVtcy5mb3JFYWNoKG1lbnVJdGVtID0+IG1lbnVJdGVtLm9uQWN0aW9uKCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuICgpOiB2b2lkID0+IHVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyQ2xvc2VWaWV3TWVudUl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdHM6IE1lbnVJdGVtQ29uZmlnID0ge3Zpc2libGU6IHRydWUsIHRleHQ6ICdDbG9zZSB0YWInLCBncm91cDogJ2Nsb3NlJywgYWNjZWxlcmF0b3I6IFsnY3RybCcsICdrJ10sIGNzc0NsYXNzOiAnZTJlLWNsb3NlLXRhYid9O1xuICAgIGNvbnN0IGFwcENvbmZpZzogTWVudUl0ZW1Db25maWcgfCB1bmRlZmluZWQgPSB0aGlzLl93b3JrYmVuY2hDb25maWcudmlld01lbnVJdGVtcz8uY2xvc2U7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoe1xuICAgICAgICBwb3J0YWw6IG5ldyBDb21wb25lbnRQb3J0YWwoVGV4dENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpLFxuICAgICAgICBhY2NlbGVyYXRvcjogY29uZmlnLmFjY2VsZXJhdG9yLFxuICAgICAgICBncm91cDogY29uZmlnLmdyb3VwLFxuICAgICAgICBjc3NDbGFzczogY29uZmlnLmNzc0NsYXNzLFxuICAgICAgICBpc0Rpc2FibGVkOiAoKTogYm9vbGVhbiA9PiAhdmlldy5jbG9zYWJsZSxcbiAgICAgICAgb25BY3Rpb246ICgpOiB2b2lkID0+IHZvaWQgdmlldy5jbG9zZSgpLnRoZW4oKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckNsb3NlT3RoZXJWaWV3c01lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnQ2xvc2Ugb3RoZXIgdGFicycsIGdyb3VwOiAnY2xvc2UnLCBhY2NlbGVyYXRvcjogWydjdHJsJywgJ3NoaWZ0JywgJ2snXX07XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5jbG9zZU90aGVycztcbiAgICBjb25zdCBjb25maWcgPSB7Li4uZGVmYXVsdHMsIC4uLmFwcENvbmZpZ307XG5cbiAgICBjb25maWcudmlzaWJsZSAmJiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnJlZ2lzdGVyVmlld01lbnVJdGVtKCh2aWV3OiBXb3JrYmVuY2hWaWV3KTogV29ya2JlbmNoTWVudUl0ZW0gPT4ge1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICBwYXJlbnQ6IEluamVjdG9yLk5VTEwsXG4gICAgICAgIHByb3ZpZGVyczogW3twcm92aWRlOiBURVhULCB1c2VWYWx1ZTogY29uZmlnLnRleHR9XSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICh7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIGlzRGlzYWJsZWQ6ICgpOiBib29sZWFuID0+IHZpZXcuZmlyc3QgJiYgdmlldy5sYXN0LFxuICAgICAgICBvbkFjdGlvbjogKCk6IHZvaWQgPT4gdm9pZCB2aWV3LmNsb3NlKCdvdGhlci12aWV3cycpLnRoZW4oKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckNsb3NlQWxsVmlld3NNZW51SXRlbSgpOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0czogTWVudUl0ZW1Db25maWcgPSB7dmlzaWJsZTogdHJ1ZSwgdGV4dDogJ0Nsb3NlIGFsbCB0YWJzJywgZ3JvdXA6ICdjbG9zZScsIGFjY2VsZXJhdG9yOiBbJ2N0cmwnLCAnc2hpZnQnLCAnYWx0JywgJ2snXSwgY3NzQ2xhc3M6ICdlMmUtY2xvc2UtYWxsLXRhYnMnfTtcbiAgICBjb25zdCBhcHBDb25maWc6IE1lbnVJdGVtQ29uZmlnIHwgdW5kZWZpbmVkID0gdGhpcy5fd29ya2JlbmNoQ29uZmlnLnZpZXdNZW51SXRlbXM/LmNsb3NlQWxsO1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5kZWZhdWx0cywgLi4uYXBwQ29uZmlnfTtcblxuICAgIGNvbmZpZy52aXNpYmxlICYmIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UucmVnaXN0ZXJWaWV3TWVudUl0ZW0oKHZpZXc6IFdvcmtiZW5jaFZpZXcpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHBhcmVudDogSW5qZWN0b3IuTlVMTCxcbiAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRFWFQsIHVzZVZhbHVlOiBjb25maWcudGV4dH1dLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gKHtcbiAgICAgICAgcG9ydGFsOiBuZXcgQ29tcG9uZW50UG9ydGFsKFRleHRDb21wb25lbnQsIG51bGwsIGluamVjdG9yKSxcbiAgICAgICAgYWNjZWxlcmF0b3I6IGNvbmZpZy5hY2NlbGVyYXRvcixcbiAgICAgICAgZ3JvdXA6IGNvbmZpZy5ncm91cCxcbiAgICAgICAgY3NzQ2xhc3M6IGNvbmZpZy5jc3NDbGFzcyxcbiAgICAgICAgb25BY3Rpb246ICgpOiB2b2lkID0+IHZvaWQgdmlldy5jbG9zZSgnYWxsLXZpZXdzJykudGhlbigpLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyQ2xvc2VWaWV3c1RvVGhlUmlnaHRNZW51SXRlbSgpOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0czogTWVudUl0ZW1Db25maWcgPSB7dmlzaWJsZTogdHJ1ZSwgdGV4dDogJ0Nsb3NlIHRhYnMgdG8gdGhlIHJpZ2h0JywgZ3JvdXA6ICdjbG9zZSd9O1xuICAgIGNvbnN0IGFwcENvbmZpZzogTWVudUl0ZW1Db25maWcgfCB1bmRlZmluZWQgPSB0aGlzLl93b3JrYmVuY2hDb25maWcudmlld01lbnVJdGVtcz8uY2xvc2VUb1RoZVJpZ2h0O1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5kZWZhdWx0cywgLi4uYXBwQ29uZmlnfTtcblxuICAgIGNvbmZpZy52aXNpYmxlICYmIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UucmVnaXN0ZXJWaWV3TWVudUl0ZW0oKHZpZXc6IFdvcmtiZW5jaFZpZXcpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHBhcmVudDogSW5qZWN0b3IuTlVMTCxcbiAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRFWFQsIHVzZVZhbHVlOiBjb25maWcudGV4dH1dLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwb3J0YWw6IG5ldyBDb21wb25lbnRQb3J0YWwoVGV4dENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpLFxuICAgICAgICBhY2NlbGVyYXRvcjogY29uZmlnLmFjY2VsZXJhdG9yLFxuICAgICAgICBncm91cDogY29uZmlnLmdyb3VwLFxuICAgICAgICBjc3NDbGFzczogY29uZmlnLmNzc0NsYXNzLFxuICAgICAgICBpc0Rpc2FibGVkOiAoKTogYm9vbGVhbiA9PiB2aWV3Lmxhc3QsXG4gICAgICAgIG9uQWN0aW9uOiAoKTogdm9pZCA9PiB2b2lkIHZpZXcuY2xvc2UoJ3ZpZXdzLXRvLXRoZS1yaWdodCcpLnRoZW4oKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyQ2xvc2VWaWV3c1RvVGhlTGVmdE1lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnQ2xvc2UgdGFicyB0byB0aGUgbGVmdCcsIGdyb3VwOiAnY2xvc2UnfTtcbiAgICBjb25zdCBhcHBDb25maWc6IE1lbnVJdGVtQ29uZmlnIHwgdW5kZWZpbmVkID0gdGhpcy5fd29ya2JlbmNoQ29uZmlnLnZpZXdNZW51SXRlbXM/LmNsb3NlVG9UaGVMZWZ0O1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5kZWZhdWx0cywgLi4uYXBwQ29uZmlnfTtcblxuICAgIGNvbmZpZy52aXNpYmxlICYmIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UucmVnaXN0ZXJWaWV3TWVudUl0ZW0oKHZpZXc6IFdvcmtiZW5jaFZpZXcpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHBhcmVudDogSW5qZWN0b3IuTlVMTCxcbiAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRFWFQsIHVzZVZhbHVlOiBjb25maWcudGV4dH1dLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwb3J0YWw6IG5ldyBDb21wb25lbnRQb3J0YWwoVGV4dENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpLFxuICAgICAgICBhY2NlbGVyYXRvcjogY29uZmlnLmFjY2VsZXJhdG9yLFxuICAgICAgICBncm91cDogY29uZmlnLmdyb3VwLFxuICAgICAgICBjc3NDbGFzczogY29uZmlnLmNzc0NsYXNzLFxuICAgICAgICBpc0Rpc2FibGVkOiAoKTogYm9vbGVhbiA9PiB2aWV3LmZpcnN0LFxuICAgICAgICBvbkFjdGlvbjogKCk6IHZvaWQgPT4gdm9pZCB2aWV3LmNsb3NlKCd2aWV3cy10by10aGUtbGVmdCcpLnRoZW4oKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTW92ZVJpZ2h0TWVudUl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdHM6IE1lbnVJdGVtQ29uZmlnID0ge3Zpc2libGU6IHRydWUsIHRleHQ6ICdNb3ZlIHJpZ2h0JywgZ3JvdXA6ICdtb3ZlJywgYWNjZWxlcmF0b3I6IFsnY3RybCcsICdhbHQnLCAnZW5kJ119O1xuICAgIGNvbnN0IGFwcENvbmZpZzogTWVudUl0ZW1Db25maWcgfCB1bmRlZmluZWQgPSB0aGlzLl93b3JrYmVuY2hDb25maWcudmlld01lbnVJdGVtcz8ubW92ZVJpZ2h0O1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5kZWZhdWx0cywgLi4uYXBwQ29uZmlnfTtcblxuICAgIGNvbmZpZy52aXNpYmxlICYmIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UucmVnaXN0ZXJWaWV3TWVudUl0ZW0oKHZpZXc6IFdvcmtiZW5jaFZpZXcpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHBhcmVudDogSW5qZWN0b3IuTlVMTCxcbiAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRFWFQsIHVzZVZhbHVlOiBjb25maWcudGV4dH1dLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwb3J0YWw6IG5ldyBDb21wb25lbnRQb3J0YWwoVGV4dENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpLFxuICAgICAgICBhY2NlbGVyYXRvcjogY29uZmlnLmFjY2VsZXJhdG9yLFxuICAgICAgICBncm91cDogY29uZmlnLmdyb3VwLFxuICAgICAgICBjc3NDbGFzczogY29uZmlnLmNzc0NsYXNzLFxuICAgICAgICBpc0Rpc2FibGVkOiAoKSA9PiB2aWV3LmZpcnN0ICYmIHZpZXcubGFzdCxcbiAgICAgICAgb25BY3Rpb246ICgpID0+IHZpZXcubW92ZSh2aWV3LnBhcnQuaWQsIHtyZWdpb246ICdlYXN0J30pLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJNb3ZlTGVmdE1lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnTW92ZSBsZWZ0JywgZ3JvdXA6ICdtb3ZlJ307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlTGVmdDtcbiAgICBjb25zdCBjb25maWcgPSB7Li4uZGVmYXVsdHMsIC4uLmFwcENvbmZpZ307XG5cbiAgICBjb25maWcudmlzaWJsZSAmJiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnJlZ2lzdGVyVmlld01lbnVJdGVtKCh2aWV3OiBXb3JrYmVuY2hWaWV3KTogV29ya2JlbmNoTWVudUl0ZW0gPT4ge1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICBwYXJlbnQ6IEluamVjdG9yLk5VTEwsXG4gICAgICAgIHByb3ZpZGVyczogW3twcm92aWRlOiBURVhULCB1c2VWYWx1ZTogY29uZmlnLnRleHR9XSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcG9ydGFsOiBuZXcgQ29tcG9uZW50UG9ydGFsKFRleHRDb21wb25lbnQsIG51bGwsIGluamVjdG9yKSxcbiAgICAgICAgYWNjZWxlcmF0b3I6IGNvbmZpZy5hY2NlbGVyYXRvcixcbiAgICAgICAgZ3JvdXA6IGNvbmZpZy5ncm91cCxcbiAgICAgICAgY3NzQ2xhc3M6IGNvbmZpZy5jc3NDbGFzcyxcbiAgICAgICAgaXNEaXNhYmxlZDogKCkgPT4gdmlldy5maXJzdCAmJiB2aWV3Lmxhc3QsXG4gICAgICAgIG9uQWN0aW9uOiAoKSA9PiB2aWV3Lm1vdmUodmlldy5wYXJ0LmlkLCB7cmVnaW9uOiAnd2VzdCd9KSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTW92ZVVwTWVudUl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdHM6IE1lbnVJdGVtQ29uZmlnID0ge3Zpc2libGU6IHRydWUsIHRleHQ6ICdNb3ZlIHVwJywgZ3JvdXA6ICdtb3ZlJ307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlVXA7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIGlzRGlzYWJsZWQ6ICgpID0+IHZpZXcuZmlyc3QgJiYgdmlldy5sYXN0LFxuICAgICAgICBvbkFjdGlvbjogKCkgPT4gdmlldy5tb3ZlKHZpZXcucGFydC5pZCwge3JlZ2lvbjogJ25vcnRoJ30pLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJNb3ZlRG93bk1lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnTW92ZSBkb3duJywgZ3JvdXA6ICdtb3ZlJ307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlRG93bjtcbiAgICBjb25zdCBjb25maWcgPSB7Li4uZGVmYXVsdHMsIC4uLmFwcENvbmZpZ307XG5cbiAgICBjb25maWcudmlzaWJsZSAmJiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnJlZ2lzdGVyVmlld01lbnVJdGVtKCh2aWV3OiBXb3JrYmVuY2hWaWV3KTogV29ya2JlbmNoTWVudUl0ZW0gPT4ge1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICBwYXJlbnQ6IEluamVjdG9yLk5VTEwsXG4gICAgICAgIHByb3ZpZGVyczogW3twcm92aWRlOiBURVhULCB1c2VWYWx1ZTogY29uZmlnLnRleHR9XSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcG9ydGFsOiBuZXcgQ29tcG9uZW50UG9ydGFsKFRleHRDb21wb25lbnQsIG51bGwsIGluamVjdG9yKSxcbiAgICAgICAgYWNjZWxlcmF0b3I6IGNvbmZpZy5hY2NlbGVyYXRvcixcbiAgICAgICAgZ3JvdXA6IGNvbmZpZy5ncm91cCxcbiAgICAgICAgY3NzQ2xhc3M6IGNvbmZpZy5jc3NDbGFzcyxcbiAgICAgICAgaXNEaXNhYmxlZDogKCkgPT4gdmlldy5maXJzdCAmJiB2aWV3Lmxhc3QsXG4gICAgICAgIG9uQWN0aW9uOiAoKSA9PiB2aWV3Lm1vdmUodmlldy5wYXJ0LmlkLCB7cmVnaW9uOiAnc291dGgnfSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck1vdmVUb05ld1dpbmRvd01lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnTW92ZSB0byBuZXcgd2luZG93JywgZ3JvdXA6ICdvcGVuJywgY3NzQ2xhc3M6ICdlMmUtbW92ZS10by1uZXctd2luZG93J307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlVG9OZXdXaW5kb3c7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIG9uQWN0aW9uOiAoKSA9PiB2aWV3Lm1vdmUoJ25ldy13aW5kb3cnKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcmVzc2VkIG1vZGlmaWVyIGtleXMgKGN0cmwsIHNoaWZ0LCBhbHQsIG1ldGEpIGFzIGFycmF5IGl0ZW1zLlxuICovXG5mdW5jdGlvbiBnZXRNb2RpZmllclN0YXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogc3RyaW5nW10ge1xuICBjb25zdCBtb2RpZmllclN0YXRlOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoZXZlbnQuY3RybEtleSkge1xuICAgIG1vZGlmaWVyU3RhdGUucHVzaCgnY3RybCcpO1xuICB9XG4gIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgIG1vZGlmaWVyU3RhdGUucHVzaCgnc2hpZnQnKTtcbiAgfVxuICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgbW9kaWZpZXJTdGF0ZS5wdXNoKCdhbHQnKTtcbiAgfVxuICBpZiAoZXZlbnQubWV0YUtleSkge1xuICAgIG1vZGlmaWVyU3RhdGUucHVzaCgnbWV0YScpO1xuICB9XG4gIHJldHVybiBtb2RpZmllclN0YXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvaW50IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG59XG4iXX0=
340
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy1tZW51LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9wYXJ0L3ZpZXctY29udGV4dC1tZW51L3ZpZXctbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFhLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxxQkFBcUIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQW9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDM0YsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQzNFLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNuRixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFDLElBQUksRUFBRSxhQUFhLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUN4RSxPQUFPLEVBQWlCLGVBQWUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFHaEUsT0FBTyxFQUFDLGtCQUFrQixFQUFD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Q3BELENBQUMsQ0FBQztZQUNILE9BQU87Z0JBQ0wsTUFBTSxFQUFFLElBQUksZUFBZSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDO2dCQUMxRCxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7Z0JBQy9CLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztnQkFDbkIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2dCQUN6QixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7YUFDeEMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0FuVVUsZUFBZTtrSEFBZixlQUFlLGNBREgsTUFBTTs7MkZBQ2xCLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDOztBQXVVaEM7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEtBQW9CO0lBQzVDLE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQztJQUNuQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQixhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQixhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqQixhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQixhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLGFBQWEsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIyIFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge0VsZW1lbnRSZWYsIGluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE5nWm9uZSwgcnVuSW5JbmplY3Rpb25Db250ZXh0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29ubmVjdGVkUG9zaXRpb24sIE92ZXJsYXksIE92ZXJsYXlDb25maWcsIE92ZXJsYXlSZWZ9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7Q29tcG9uZW50UG9ydGFsfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7Vmlld01lbnVDb21wb25lbnR9IGZyb20gJy4vdmlldy1tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQge1dvcmtiZW5jaE1lbnVJdGVtfSBmcm9tICcuLi8uLi93b3JrYmVuY2gubW9kZWwnO1xuaW1wb3J0IHtXT1JLQkVOQ0hfVklFV19SRUdJU1RSWX0gZnJvbSAnLi4vLi4vdmlldy93b3JrYmVuY2gtdmlldy5yZWdpc3RyeSc7XG5pbXBvcnQge2ZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtmaXJzdFZhbHVlRnJvbSwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBUZWFyZG93bkxvZ2ljfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Y29lcmNlRWxlbWVudH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7VEVYVCwgVGV4dENvbXBvbmVudH0gZnJvbSAnLi4vdmlldy1jb250ZXh0LW1lbnUvdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHtNZW51SXRlbUNvbmZpZywgV29ya2JlbmNoQ29uZmlnfSBmcm9tICcuLi8uLi93b3JrYmVuY2gtY29uZmlnJztcbmltcG9ydCB7V29ya2JlbmNoU2VydmljZX0gZnJvbSAnLi4vLi4vd29ya2JlbmNoLnNlcnZpY2UnO1xuaW1wb3J0IHtmaWx0ZXJBcnJheSwgb2JzZXJ2ZUlufSBmcm9tICdAc2Npb24vdG9vbGtpdC9vcGVyYXRvcnMnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFZpZXd9IGZyb20gJy4uLy4uL3ZpZXcvybV3b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge1ZpZXdJZCwgV29ya2JlbmNoVmlld30gZnJvbSAnLi4vLi4vdmlldy93b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge3Byb3ZpZGVWaWV3Q29udGV4dH0gZnJvbSAnLi4vLi4vdmlldy92aWV3LWNvbnRleHQtcHJvdmlkZXInO1xuaW1wb3J0IHtBcnJheXN9IGZyb20gJ0BzY2lvbi90b29sa2l0L3V0aWwnO1xuXG4vKipcbiAqIFNob3dzIG1lbnUgaXRlbXMgb2YgYSB7QGxpbmsgV29ya2JlbmNoVmlld30gaW4gYSBtZW51LlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBWaWV3TWVudVNlcnZpY2Uge1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRPUF9MRUZUOiBDb25uZWN0ZWRQb3NpdGlvbiA9IHtvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJ307XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRPUF9SSUdIVDogQ29ubmVjdGVkUG9zaXRpb24gPSB7b3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICd0b3AnfTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQk9UVE9NX0xFRlQ6IENvbm5lY3RlZFBvc2l0aW9uID0ge29yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nfTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQk9UVE9NX1JJR0hUOiBDb25uZWN0ZWRQb3NpdGlvbiA9IHtvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2JvdHRvbSd9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX292ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF92aWV3UmVnaXN0cnkgPSBpbmplY3QoV09SS0JFTkNIX1ZJRVdfUkVHSVNUUlkpO1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hTZXJ2aWNlID0gaW5qZWN0KFdvcmtiZW5jaFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hDb25maWcgPSBpbmplY3QoV29ya2JlbmNoQ29uZmlnKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBSZWdpc3RlcnMgYnVpbHQtaW4gbWVudSBpdGVtcyBhZGRlZCB0byB0aGUgY29udGV4dCBtZW51IG9mIGV2ZXJ5IHZpZXcgdGFiLlxuICAgIHRoaXMucmVnaXN0ZXJDbG9zZU1lbnVJdGVtKCk7XG4gICAgdGhpcy5yZWdpc3RlckNsb3NlT3RoZXJUYWJzTWVudUl0ZW0oKTtcbiAgICB0aGlzLnJlZ2lzdGVyQ2xvc2VBbGxUYWJzTWVudUl0ZW0oKTtcbiAgICB0aGlzLnJlZ2lzdGVyQ2xvc2VSaWdodFRhYnNNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJDbG9zZUxlZnRUYWJzTWVudUl0ZW0oKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW92ZVJpZ2h0TWVudUl0ZW0oKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW92ZUxlZnRNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJNb3ZlVXBNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJNb3ZlRG93bk1lbnVJdGVtKCk7XG4gICAgdGhpcy5yZWdpc3Rlck1vdmVUb05ld1dpbmRvd01lbnVJdGVtKCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZW51IHdpdGggbWVudSBpdGVtcyByZWdpc3RlcmVkIGluIGdpdmVuIHtAbGluayBXb3JrYmVuY2hWaWV3fS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgV29ya2JlbmNoVmlldy5yZWdpc3RlclZpZXdNZW51SXRlbX1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzaG93TWVudShsb2NhdGlvbjogUG9pbnQsIHZpZXdJZDogVmlld0lkKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuX3ZpZXdSZWdpc3RyeS5nZXQodmlld0lkKTtcbiAgICBjb25zdCBtZW51SXRlbXMgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh2aWV3Lm1lbnVJdGVtcyQpO1xuXG4gICAgLy8gRG8gbm90IHNob3cgdGhlIG1lbnUgaWYgdGhlcmUgYXJlIG5vIG1lbnUgaXRlbXMgcmVnaXN0ZXJlZC5cbiAgICBpZiAobWVudUl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgYW5kIGRpc3BsYXkgdGhlIG1lbnUgb3ZlcmxheS5cbiAgICBjb25zdCBjb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5fb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLm5vb3AoKSxcbiAgICAgIGRpc3Bvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKClcbiAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8obG9jYXRpb24pXG4gICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxuICAgICAgICAud2l0aFBvc2l0aW9ucyhbVmlld01lbnVTZXJ2aWNlLlRPUF9MRUZULCBWaWV3TWVudVNlcnZpY2UuVE9QX1JJR0hULCBWaWV3TWVudVNlcnZpY2UuQk9UVE9NX0xFRlQsIFZpZXdNZW51U2VydmljZS5CT1RUT01fUklHSFRdKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZShjb25maWcpO1xuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHBhcmVudDogdGhpcy5faW5qZWN0b3IsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge3Byb3ZpZGU6IE92ZXJsYXlSZWYsIHVzZVZhbHVlOiBvdmVybGF5UmVmfSxcbiAgICAgICAgcHJvdmlkZVZpZXdDb250ZXh0KHZpZXcpLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBvdmVybGF5UmVmLmF0dGFjaChuZXcgQ29tcG9uZW50UG9ydGFsKFZpZXdNZW51Q29tcG9uZW50LCBudWxsLCBpbmplY3RvcikpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwb24gc3Vic2NyaXB0aW9uLCBpbnN0YWxscyBrZXlib2FyZCBhY2NlbGVyYXRvcnMgb2YgdGhlIG1lbnUgaXRlbXMgcmVnaXN0ZXJlZCBpbiB7QGxpbmsgV29ya2JlbmNoVmlld30uXG4gICAqL1xuICBwdWJsaWMgaW5zdGFsbE1lbnVJdGVtQWNjZWxlcmF0b3JzJCh0YXJnZXQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgSFRNTEVsZW1lbnQsIHZpZXc6IMm1V29ya2JlbmNoVmlldyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoKTogVGVhcmRvd25Mb2dpYyA9PiB7XG4gICAgICBjb25zdCB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgICB2aWV3Lm1lbnVJdGVtcyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgb2JzZXJ2ZUluKGZuID0+IHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgICAvLyBTa2lwIG1lbnUgaXRlbXMgd2hpY2ggaGF2ZSBubyBhY2NlbGVyYXRvciBjb25maWd1cmVkLlxuICAgICAgICAgIGZpbHRlckFycmF5KChtZW51SXRlbTogV29ya2JlbmNoTWVudUl0ZW0pID0+ICEhbWVudUl0ZW0uYWNjZWxlcmF0b3I/Lmxlbmd0aCksXG4gICAgICAgICAgZmlsdGVyKG1lbnVJdGVtcyA9PiBtZW51SXRlbXMubGVuZ3RoID4gMCksXG4gICAgICAgICAgLy8gU3Vic2NyaWJlIGZvciBrZXlib2FyZCBldmVudHMuXG4gICAgICAgICAgc3dpdGNoTWFwKChtZW51SXRlbXM6IFdvcmtiZW5jaE1lbnVJdGVtW10pOiBPYnNlcnZhYmxlPHtldmVudDogS2V5Ym9hcmRFdmVudDsgbWVudUl0ZW1zOiBXb3JrYmVuY2hNZW51SXRlbVtdfT4gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihjb2VyY2VFbGVtZW50KHRhcmdldCksICdrZXlkb3duJykucGlwZShtYXAoZXZlbnQgPT4gKHtldmVudCwgbWVudUl0ZW1zfSkpKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtYXAoKHtldmVudCwgbWVudUl0ZW1zfSkgPT4gKHtcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgbWVudUl0ZW1zOiBtZW51SXRlbXNcbiAgICAgICAgICAgICAgLmZpbHRlcihtZW51SXRlbSA9PiAhbWVudUl0ZW0uaXNEaXNhYmxlZD8uKCkpXG4gICAgICAgICAgICAgIC5maWx0ZXIobWVudUl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjY2VsZXJhdG9yID0gbWVudUl0ZW0uYWNjZWxlcmF0b3IhO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGFjY2VsZXJhdG9yLmF0KC0xKSE7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZXJLZXlzID0gYWNjZWxlcmF0b3Iuc2xpY2UoMCwgLTEpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ29tcGFyZSBrZXkuXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleT8udG9Mb3dlckNhc2UoKSAhPT0ga2V5LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29tcGFyZSBtb2RpZmllcnMuXG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuaXNFcXVhbChtb2RpZmllcktleXMsIGdldE1vZGlmaWVyU3RhdGUoZXZlbnQpLCB7ZXhhY3RPcmRlcjogZmFsc2V9KSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIGZpbHRlcigoe21lbnVJdGVtc30pID0+IG1lbnVJdGVtcy5sZW5ndGggPiAwKSxcbiAgICAgICAgICBvYnNlcnZlSW4oZm4gPT4gdGhpcy5fem9uZS5ydW4oZm4pKSxcbiAgICAgICAgICB0YWtlVW50aWwodW5zdWJzY3JpYmUkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh7ZXZlbnQsIG1lbnVJdGVtc30pID0+IHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLl9pbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgbWVudUl0ZW1zLmZvckVhY2gobWVudUl0ZW0gPT4gbWVudUl0ZW0ub25BY3Rpb24oKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gKCk6IHZvaWQgPT4gdW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJDbG9zZU1lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnQ2xvc2UnLCBncm91cDogJ2Nsb3NlJywgYWNjZWxlcmF0b3I6IFsnY3RybCcsICdrJ10sIGNzc0NsYXNzOiAnZTJlLWNsb3NlJ307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5jbG9zZTtcbiAgICBjb25zdCBjb25maWcgPSB7Li4uZGVmYXVsdHMsIC4uLmFwcENvbmZpZ307XG5cbiAgICBjb25maWcudmlzaWJsZSAmJiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnJlZ2lzdGVyVmlld01lbnVJdGVtKCh2aWV3OiBXb3JrYmVuY2hWaWV3KTogV29ya2JlbmNoTWVudUl0ZW0gPT4ge1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICBwYXJlbnQ6IEluamVjdG9yLk5VTEwsXG4gICAgICAgIHByb3ZpZGVyczogW3twcm92aWRlOiBURVhULCB1c2VWYWx1ZTogY29uZmlnLnRleHR9XSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICh7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIGlzRGlzYWJsZWQ6ICgpOiBib29sZWFuID0+ICF2aWV3LmNsb3NhYmxlKCksXG4gICAgICAgIG9uQWN0aW9uOiAoKTogdm9pZCA9PiB2b2lkIHZpZXcuY2xvc2UoKS50aGVuKCksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJDbG9zZU90aGVyVGFic01lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnQ2xvc2Ugb3RoZXIgdGFicycsIGdyb3VwOiAnY2xvc2UnLCBhY2NlbGVyYXRvcjogWydjdHJsJywgJ3NoaWZ0JywgJ2snXSwgY3NzQ2xhc3M6ICcgZTJlLWNsb3NlLW90aGVyLXRhYnMnfTtcbiAgICBjb25zdCBhcHBDb25maWc6IE1lbnVJdGVtQ29uZmlnIHwgdW5kZWZpbmVkID0gdGhpcy5fd29ya2JlbmNoQ29uZmlnLnZpZXdNZW51SXRlbXM/LmNsb3NlT3RoZXJzO1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5kZWZhdWx0cywgLi4uYXBwQ29uZmlnfTtcblxuICAgIGNvbmZpZy52aXNpYmxlICYmIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UucmVnaXN0ZXJWaWV3TWVudUl0ZW0oKHZpZXc6IFdvcmtiZW5jaFZpZXcpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHBhcmVudDogSW5qZWN0b3IuTlVMTCxcbiAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRFWFQsIHVzZVZhbHVlOiBjb25maWcudGV4dH1dLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gKHtcbiAgICAgICAgcG9ydGFsOiBuZXcgQ29tcG9uZW50UG9ydGFsKFRleHRDb21wb25lbnQsIG51bGwsIGluamVjdG9yKSxcbiAgICAgICAgYWNjZWxlcmF0b3I6IGNvbmZpZy5hY2NlbGVyYXRvcixcbiAgICAgICAgZ3JvdXA6IGNvbmZpZy5ncm91cCxcbiAgICAgICAgY3NzQ2xhc3M6IGNvbmZpZy5jc3NDbGFzcyxcbiAgICAgICAgaXNEaXNhYmxlZDogKCk6IGJvb2xlYW4gPT4gdmlldy5maXJzdCgpICYmIHZpZXcubGFzdCgpLFxuICAgICAgICBvbkFjdGlvbjogKCk6IHZvaWQgPT4gdm9pZCB2aWV3LmNsb3NlKCdvdGhlci12aWV3cycpLnRoZW4oKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckNsb3NlQWxsVGFic01lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnQ2xvc2UgYWxsIHRhYnMnLCBncm91cDogJ2Nsb3NlJywgYWNjZWxlcmF0b3I6IFsnY3RybCcsICdzaGlmdCcsICdhbHQnLCAnayddLCBjc3NDbGFzczogJ2UyZS1jbG9zZS1hbGwtdGFicyd9O1xuICAgIGNvbnN0IGFwcENvbmZpZzogTWVudUl0ZW1Db25maWcgfCB1bmRlZmluZWQgPSB0aGlzLl93b3JrYmVuY2hDb25maWcudmlld01lbnVJdGVtcz8uY2xvc2VBbGw7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoe1xuICAgICAgICBwb3J0YWw6IG5ldyBDb21wb25lbnRQb3J0YWwoVGV4dENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpLFxuICAgICAgICBhY2NlbGVyYXRvcjogY29uZmlnLmFjY2VsZXJhdG9yLFxuICAgICAgICBncm91cDogY29uZmlnLmdyb3VwLFxuICAgICAgICBjc3NDbGFzczogY29uZmlnLmNzc0NsYXNzLFxuICAgICAgICBvbkFjdGlvbjogKCk6IHZvaWQgPT4gdm9pZCB2aWV3LmNsb3NlKCdhbGwtdmlld3MnKS50aGVuKCksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJDbG9zZVJpZ2h0VGFic01lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnQ2xvc2UgdGFicyB0byB0aGUgcmlnaHQnLCBncm91cDogJ2Nsb3NlJywgY3NzQ2xhc3M6ICdlMmUtY2xvc2UtcmlnaHQtdGFicyd9O1xuICAgIGNvbnN0IGFwcENvbmZpZzogTWVudUl0ZW1Db25maWcgfCB1bmRlZmluZWQgPSB0aGlzLl93b3JrYmVuY2hDb25maWcudmlld01lbnVJdGVtcz8uY2xvc2VUb1RoZVJpZ2h0O1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5kZWZhdWx0cywgLi4uYXBwQ29uZmlnfTtcblxuICAgIGNvbmZpZy52aXNpYmxlICYmIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UucmVnaXN0ZXJWaWV3TWVudUl0ZW0oKHZpZXc6IFdvcmtiZW5jaFZpZXcpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHBhcmVudDogSW5qZWN0b3IuTlVMTCxcbiAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRFWFQsIHVzZVZhbHVlOiBjb25maWcudGV4dH1dLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwb3J0YWw6IG5ldyBDb21wb25lbnRQb3J0YWwoVGV4dENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpLFxuICAgICAgICBhY2NlbGVyYXRvcjogY29uZmlnLmFjY2VsZXJhdG9yLFxuICAgICAgICBncm91cDogY29uZmlnLmdyb3VwLFxuICAgICAgICBjc3NDbGFzczogY29uZmlnLmNzc0NsYXNzLFxuICAgICAgICBpc0Rpc2FibGVkOiAoKTogYm9vbGVhbiA9PiB2aWV3Lmxhc3QoKSxcbiAgICAgICAgb25BY3Rpb246ICgpOiB2b2lkID0+IHZvaWQgdmlldy5jbG9zZSgndmlld3MtdG8tdGhlLXJpZ2h0JykudGhlbigpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJDbG9zZUxlZnRUYWJzTWVudUl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdHM6IE1lbnVJdGVtQ29uZmlnID0ge3Zpc2libGU6IHRydWUsIHRleHQ6ICdDbG9zZSB0YWJzIHRvIHRoZSBsZWZ0JywgZ3JvdXA6ICdjbG9zZScsIGNzc0NsYXNzOiAnZTJlLWNsb3NlLWxlZnQtdGFicyd9O1xuICAgIGNvbnN0IGFwcENvbmZpZzogTWVudUl0ZW1Db25maWcgfCB1bmRlZmluZWQgPSB0aGlzLl93b3JrYmVuY2hDb25maWcudmlld01lbnVJdGVtcz8uY2xvc2VUb1RoZUxlZnQ7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIGlzRGlzYWJsZWQ6ICgpOiBib29sZWFuID0+IHZpZXcuZmlyc3QoKSxcbiAgICAgICAgb25BY3Rpb246ICgpOiB2b2lkID0+IHZvaWQgdmlldy5jbG9zZSgndmlld3MtdG8tdGhlLWxlZnQnKS50aGVuKCksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck1vdmVSaWdodE1lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnTW92ZSByaWdodCcsIGdyb3VwOiAnbW92ZScsIGFjY2VsZXJhdG9yOiBbJ2N0cmwnLCAnYWx0JywgJ2VuZCddLCBjc3NDbGFzczogJ2UyZS1tb3ZlLXJpZ2h0J307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlUmlnaHQ7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIGlzRGlzYWJsZWQ6ICgpID0+IHZpZXcuZmlyc3QoKSAmJiB2aWV3Lmxhc3QoKSxcbiAgICAgICAgb25BY3Rpb246ICgpID0+IHZpZXcubW92ZSh2aWV3LnBhcnQoKS5pZCwge3JlZ2lvbjogJ2Vhc3QnfSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck1vdmVMZWZ0TWVudUl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdHM6IE1lbnVJdGVtQ29uZmlnID0ge3Zpc2libGU6IHRydWUsIHRleHQ6ICdNb3ZlIGxlZnQnLCBncm91cDogJ21vdmUnLCBjc3NDbGFzczogJ2UyZS1tb3ZlLWxlZnQnfTtcbiAgICBjb25zdCBhcHBDb25maWc6IE1lbnVJdGVtQ29uZmlnIHwgdW5kZWZpbmVkID0gdGhpcy5fd29ya2JlbmNoQ29uZmlnLnZpZXdNZW51SXRlbXM/Lm1vdmVMZWZ0O1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5kZWZhdWx0cywgLi4uYXBwQ29uZmlnfTtcblxuICAgIGNvbmZpZy52aXNpYmxlICYmIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UucmVnaXN0ZXJWaWV3TWVudUl0ZW0oKHZpZXc6IFdvcmtiZW5jaFZpZXcpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHBhcmVudDogSW5qZWN0b3IuTlVMTCxcbiAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRFWFQsIHVzZVZhbHVlOiBjb25maWcudGV4dH1dLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwb3J0YWw6IG5ldyBDb21wb25lbnRQb3J0YWwoVGV4dENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpLFxuICAgICAgICBhY2NlbGVyYXRvcjogY29uZmlnLmFjY2VsZXJhdG9yLFxuICAgICAgICBncm91cDogY29uZmlnLmdyb3VwLFxuICAgICAgICBjc3NDbGFzczogY29uZmlnLmNzc0NsYXNzLFxuICAgICAgICBpc0Rpc2FibGVkOiAoKSA9PiB2aWV3LmZpcnN0KCkgJiYgdmlldy5sYXN0KCksXG4gICAgICAgIG9uQWN0aW9uOiAoKSA9PiB2aWV3Lm1vdmUodmlldy5wYXJ0KCkuaWQsIHtyZWdpb246ICd3ZXN0J30pLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJNb3ZlVXBNZW51SXRlbSgpOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0czogTWVudUl0ZW1Db25maWcgPSB7dmlzaWJsZTogdHJ1ZSwgdGV4dDogJ01vdmUgdXAnLCBncm91cDogJ21vdmUnLCBjc3NDbGFzczogJ2UyZS1tb3ZlLXVwJ307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlVXA7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIGlzRGlzYWJsZWQ6ICgpID0+IHZpZXcuZmlyc3QoKSAmJiB2aWV3Lmxhc3QoKSxcbiAgICAgICAgb25BY3Rpb246ICgpID0+IHZpZXcubW92ZSh2aWV3LnBhcnQoKS5pZCwge3JlZ2lvbjogJ25vcnRoJ30pLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJNb3ZlRG93bk1lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnTW92ZSBkb3duJywgZ3JvdXA6ICdtb3ZlJywgY3NzQ2xhc3M6ICdlMmUtbW92ZS1kb3duJ307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlRG93bjtcbiAgICBjb25zdCBjb25maWcgPSB7Li4uZGVmYXVsdHMsIC4uLmFwcENvbmZpZ307XG5cbiAgICBjb25maWcudmlzaWJsZSAmJiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnJlZ2lzdGVyVmlld01lbnVJdGVtKCh2aWV3OiBXb3JrYmVuY2hWaWV3KTogV29ya2JlbmNoTWVudUl0ZW0gPT4ge1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICBwYXJlbnQ6IEluamVjdG9yLk5VTEwsXG4gICAgICAgIHByb3ZpZGVyczogW3twcm92aWRlOiBURVhULCB1c2VWYWx1ZTogY29uZmlnLnRleHR9XSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcG9ydGFsOiBuZXcgQ29tcG9uZW50UG9ydGFsKFRleHRDb21wb25lbnQsIG51bGwsIGluamVjdG9yKSxcbiAgICAgICAgYWNjZWxlcmF0b3I6IGNvbmZpZy5hY2NlbGVyYXRvcixcbiAgICAgICAgZ3JvdXA6IGNvbmZpZy5ncm91cCxcbiAgICAgICAgY3NzQ2xhc3M6IGNvbmZpZy5jc3NDbGFzcyxcbiAgICAgICAgaXNEaXNhYmxlZDogKCkgPT4gdmlldy5maXJzdCgpICYmIHZpZXcubGFzdCgpLFxuICAgICAgICBvbkFjdGlvbjogKCkgPT4gdmlldy5tb3ZlKHZpZXcucGFydCgpLmlkLCB7cmVnaW9uOiAnc291dGgnfSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck1vdmVUb05ld1dpbmRvd01lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnTW92ZSB0byBuZXcgd2luZG93JywgZ3JvdXA6ICdvcGVuJywgY3NzQ2xhc3M6ICdlMmUtbW92ZS10by1uZXctd2luZG93J307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlVG9OZXdXaW5kb3c7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIG9uQWN0aW9uOiAoKSA9PiB2aWV3Lm1vdmUoJ25ldy13aW5kb3cnKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcmVzc2VkIG1vZGlmaWVyIGtleXMgKGN0cmwsIHNoaWZ0LCBhbHQsIG1ldGEpIGFzIGFycmF5IGl0ZW1zLlxuICovXG5mdW5jdGlvbiBnZXRNb2RpZmllclN0YXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogc3RyaW5nW10ge1xuICBjb25zdCBtb2RpZmllclN0YXRlOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoZXZlbnQuY3RybEtleSkge1xuICAgIG1vZGlmaWVyU3RhdGUucHVzaCgnY3RybCcpO1xuICB9XG4gIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgIG1vZGlmaWVyU3RhdGUucHVzaCgnc2hpZnQnKTtcbiAgfVxuICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgbW9kaWZpZXJTdGF0ZS5wdXNoKCdhbHQnKTtcbiAgfVxuICBpZiAoZXZlbnQubWV0YUtleSkge1xuICAgIG1vZGlmaWVyU3RhdGUucHVzaCgnbWV0YScpO1xuICB9XG4gIHJldHVybiBtb2RpZmllclN0YXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvaW50IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG59XG4iXX0=