@alfresco/aca-content 4.0.0-4895233349

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 (264) hide show
  1. package/README.md +24 -0
  2. package/about/about.component.d.ts +45 -0
  3. package/about/aca-about.module.d.ts +39 -0
  4. package/about/dev-mode.tokens.d.ts +25 -0
  5. package/about/index.d.ts +5 -0
  6. package/about/package-json.token.d.ts +25 -0
  7. package/about/public-api.d.ts +27 -0
  8. package/assets/app.extensions.json +2626 -0
  9. package/assets/i18n/ar.json +660 -0
  10. package/assets/i18n/cs.json +660 -0
  11. package/assets/i18n/da.json +660 -0
  12. package/assets/i18n/de.json +660 -0
  13. package/assets/i18n/en.json +660 -0
  14. package/assets/i18n/es.json +660 -0
  15. package/assets/i18n/fi.json +660 -0
  16. package/assets/i18n/fr.json +660 -0
  17. package/assets/i18n/it.json +660 -0
  18. package/assets/i18n/ja.json +660 -0
  19. package/assets/i18n/nb.json +660 -0
  20. package/assets/i18n/nl.json +660 -0
  21. package/assets/i18n/pl.json +660 -0
  22. package/assets/i18n/pt-BR.json +660 -0
  23. package/assets/i18n/ru.json +660 -0
  24. package/assets/i18n/sv.json +660 -0
  25. package/assets/i18n/zh-CN.json +660 -0
  26. package/assets/images/Wallpaper-BG-generic.svg +39 -0
  27. package/assets/images/adf-move-file-24px.svg +1 -0
  28. package/assets/images/baseline-library_books-24px.svg +2 -0
  29. package/assets/images/baseline-lock-24px.svg +1 -0
  30. package/assets/images/join-library.svg +32 -0
  31. package/esm2020/about/about.component.mjs +77 -0
  32. package/esm2020/about/aca-about.module.mjs +67 -0
  33. package/esm2020/about/alfresco-aca-content-about.mjs +5 -0
  34. package/esm2020/about/dev-mode.tokens.mjs +26 -0
  35. package/esm2020/about/package-json.token.mjs +26 -0
  36. package/esm2020/about/public-api.mjs +28 -0
  37. package/esm2020/alfresco-aca-content.mjs +5 -0
  38. package/esm2020/lib/aca-content.module.mjs +365 -0
  39. package/esm2020/lib/aca-content.routes.mjs +581 -0
  40. package/esm2020/lib/components/common/common.module.mjs +67 -0
  41. package/esm2020/lib/components/common/language-picker/language-picker.component.mjs +57 -0
  42. package/esm2020/lib/components/common/location-link/location-link.component.mjs +177 -0
  43. package/esm2020/lib/components/common/logout/logout.component.mjs +60 -0
  44. package/esm2020/lib/components/common/toggle-shared/toggle-shared.component.mjs +65 -0
  45. package/esm2020/lib/components/common/user-info/user-info.component.mjs +86 -0
  46. package/esm2020/lib/components/context-menu/context-menu-item.component.mjs +58 -0
  47. package/esm2020/lib/components/context-menu/context-menu-outside-event.directive.mjs +65 -0
  48. package/esm2020/lib/components/context-menu/context-menu-overlay.mjs +32 -0
  49. package/esm2020/lib/components/context-menu/context-menu.component.mjs +102 -0
  50. package/esm2020/lib/components/context-menu/context-menu.module.mjs +76 -0
  51. package/esm2020/lib/components/context-menu/context-menu.service.mjs +103 -0
  52. package/esm2020/lib/components/context-menu/direction.token.mjs +29 -0
  53. package/esm2020/lib/components/context-menu/interfaces.mjs +25 -0
  54. package/esm2020/lib/components/create-menu/create-menu.component.mjs +73 -0
  55. package/esm2020/lib/components/create-menu/create-menu.module.mjs +44 -0
  56. package/esm2020/lib/components/details/details.component.mjs +99 -0
  57. package/esm2020/lib/components/dl-custom-components/document-list-custom-components.module.mjs +49 -0
  58. package/esm2020/lib/components/dl-custom-components/name-column/name-column.component.mjs +90 -0
  59. package/esm2020/lib/components/dl-custom-components/tags-column/tags-column.component.mjs +31 -0
  60. package/esm2020/lib/components/dl-custom-components/thumbnail-column/thumbnail-column.component.mjs +51 -0
  61. package/esm2020/lib/components/favorite-libraries/favorite-libraries.component.mjs +113 -0
  62. package/esm2020/lib/components/favorites/favorites.component.mjs +98 -0
  63. package/esm2020/lib/components/files/files.component.mjs +312 -0
  64. package/esm2020/lib/components/home/home.component.mjs +49 -0
  65. package/esm2020/lib/components/info-drawer/comments-tab/comments-tab.component.mjs +56 -0
  66. package/esm2020/lib/components/info-drawer/info.drawer.module.mjs +92 -0
  67. package/esm2020/lib/components/info-drawer/library-metadata-tab/library-metadata-form.component.mjs +143 -0
  68. package/esm2020/lib/components/info-drawer/library-metadata-tab/library-metadata-tab.component.mjs +42 -0
  69. package/esm2020/lib/components/info-drawer/metadata-tab/metadata-tab.component.mjs +88 -0
  70. package/esm2020/lib/components/info-drawer/versions-tab/versions-tab.component.mjs +95 -0
  71. package/esm2020/lib/components/libraries/libraries.component.mjs +70 -0
  72. package/esm2020/lib/components/node-version/node-version-form.component.mjs +70 -0
  73. package/esm2020/lib/components/node-version/node-version.module.mjs +78 -0
  74. package/esm2020/lib/components/recent-files/recent-files.component.mjs +81 -0
  75. package/esm2020/lib/components/search/search-action-menu/search-action-menu.component.mjs +59 -0
  76. package/esm2020/lib/components/search/search-input/search-input.component.mjs +275 -0
  77. package/esm2020/lib/components/search/search-input-control/search-input-control.component.mjs +87 -0
  78. package/esm2020/lib/components/search/search-input.module.mjs +47 -0
  79. package/esm2020/lib/components/search/search-libraries-results/search-libraries-query-builder.service.mjs +91 -0
  80. package/esm2020/lib/components/search/search-libraries-results/search-libraries-results.component.mjs +142 -0
  81. package/esm2020/lib/components/search/search-navigation.service.mjs +60 -0
  82. package/esm2020/lib/components/search/search-results/search-results.component.mjs +221 -0
  83. package/esm2020/lib/components/search/search-results-row/search-results-row.component.mjs +101 -0
  84. package/esm2020/lib/components/search/search-results.module.mjs +88 -0
  85. package/esm2020/lib/components/shared-files/shared-files.component.mjs +78 -0
  86. package/esm2020/lib/components/shared-link-view/shared-link-view.component.mjs +81 -0
  87. package/esm2020/lib/components/shared-link-view/shared-link-view.module.mjs +69 -0
  88. package/esm2020/lib/components/sidenav/components/button-menu.component.mjs +57 -0
  89. package/esm2020/lib/components/sidenav/components/expand-menu.component.mjs +53 -0
  90. package/esm2020/lib/components/sidenav/components/sidenav-header.component.mjs +74 -0
  91. package/esm2020/lib/components/sidenav/directives/action.directive.mjs +74 -0
  92. package/esm2020/lib/components/sidenav/directives/active-link.directive.mjs +92 -0
  93. package/esm2020/lib/components/sidenav/directives/expansion-panel.directive.mjs +101 -0
  94. package/esm2020/lib/components/sidenav/directives/menu-panel.directive.mjs +98 -0
  95. package/esm2020/lib/components/sidenav/sidenav.component.mjs +83 -0
  96. package/esm2020/lib/components/sidenav/sidenav.module.mjs +84 -0
  97. package/esm2020/lib/components/toolbar/document-display-mode/document-display-mode.component.mjs +84 -0
  98. package/esm2020/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.mjs +150 -0
  99. package/esm2020/lib/components/toolbar/toggle-favorite/toggle-favorite.component.mjs +79 -0
  100. package/esm2020/lib/components/toolbar/toggle-favorite-library/toggle-favorite-library.component.mjs +101 -0
  101. package/esm2020/lib/components/toolbar/toggle-info-drawer/toggle-info-drawer.component.mjs +75 -0
  102. package/esm2020/lib/components/toolbar/toggle-join-library/toggle-join-library-button.component.mjs +98 -0
  103. package/esm2020/lib/components/toolbar/toggle-join-library/toggle-join-library-menu.component.mjs +80 -0
  104. package/esm2020/lib/components/toolbar/toolbar.module.mjs +88 -0
  105. package/esm2020/lib/components/toolbar/view-node/view-node.component.mjs +109 -0
  106. package/esm2020/lib/components/trashcan/trashcan.component.mjs +63 -0
  107. package/esm2020/lib/components/trashcan/trashcan.module.mjs +74 -0
  108. package/esm2020/lib/components/upload-files-dialog/upload-files-dialog.component.mjs +50 -0
  109. package/esm2020/lib/components/view-profile/view-profile.component.mjs +174 -0
  110. package/esm2020/lib/components/view-profile/view-profile.guard.mjs +47 -0
  111. package/esm2020/lib/components/view-profile/view-profile.module.mjs +42 -0
  112. package/esm2020/lib/dialogs/node-template/create-from-template.dialog.mjs +119 -0
  113. package/esm2020/lib/directives/directives.module.mjs +42 -0
  114. package/esm2020/lib/directives/document-list.directive.mjs +141 -0
  115. package/esm2020/lib/extensions/core.extensions.module.mjs +64 -0
  116. package/esm2020/lib/material.module.mjs +57 -0
  117. package/esm2020/lib/services/content-management.service.mjs +870 -0
  118. package/esm2020/lib/services/content-service-extension.service.mjs +63 -0
  119. package/esm2020/lib/services/content-url.service.mjs +72 -0
  120. package/esm2020/lib/services/node-actions.service.mjs +600 -0
  121. package/esm2020/lib/services/node-template.service.mjs +149 -0
  122. package/esm2020/lib/store/app-store.module.mjs +95 -0
  123. package/esm2020/lib/store/effects/app.effects.mjs +61 -0
  124. package/esm2020/lib/store/effects/contextmenu.effects.mjs +55 -0
  125. package/esm2020/lib/store/effects/download.effects.mjs +159 -0
  126. package/esm2020/lib/store/effects/favorite.effects.mjs +76 -0
  127. package/esm2020/lib/store/effects/library.effects.mjs +111 -0
  128. package/esm2020/lib/store/effects/node.effects.mjs +309 -0
  129. package/esm2020/lib/store/effects/search.effects.mjs +60 -0
  130. package/esm2020/lib/store/effects/template.effects.mjs +121 -0
  131. package/esm2020/lib/store/effects/upload.effects.mjs +169 -0
  132. package/esm2020/lib/store/effects/viewer.effects.mjs +175 -0
  133. package/esm2020/lib/store/effects.mjs +35 -0
  134. package/esm2020/lib/store/initial-state.mjs +62 -0
  135. package/esm2020/lib/store/reducers/app.reducer.mjs +211 -0
  136. package/esm2020/public-api.mjs +32 -0
  137. package/fesm2015/alfresco-aca-content-about.mjs +216 -0
  138. package/fesm2015/alfresco-aca-content-about.mjs.map +1 -0
  139. package/fesm2015/alfresco-aca-content.mjs +9771 -0
  140. package/fesm2015/alfresco-aca-content.mjs.map +1 -0
  141. package/fesm2020/alfresco-aca-content-about.mjs +214 -0
  142. package/fesm2020/alfresco-aca-content-about.mjs.map +1 -0
  143. package/fesm2020/alfresco-aca-content.mjs +9915 -0
  144. package/fesm2020/alfresco-aca-content.mjs.map +1 -0
  145. package/index.d.ts +5 -0
  146. package/lib/aca-content.module.d.ts +47 -0
  147. package/lib/aca-content.routes.d.ts +27 -0
  148. package/lib/components/common/common.module.d.ts +17 -0
  149. package/lib/components/common/language-picker/language-picker.component.d.ts +5 -0
  150. package/lib/components/common/location-link/location-link.component.d.ts +48 -0
  151. package/lib/components/common/logout/logout.component.d.ts +10 -0
  152. package/lib/components/common/toggle-shared/toggle-shared.component.d.ts +43 -0
  153. package/lib/components/common/user-info/user-info.component.d.ts +44 -0
  154. package/lib/components/context-menu/context-menu-item.component.d.ts +13 -0
  155. package/lib/components/context-menu/context-menu-outside-event.directive.d.ts +35 -0
  156. package/lib/components/context-menu/context-menu-overlay.d.ts +29 -0
  157. package/lib/components/context-menu/context-menu.component.d.ts +48 -0
  158. package/lib/components/context-menu/context-menu.module.d.ts +18 -0
  159. package/lib/components/context-menu/context-menu.service.d.ts +43 -0
  160. package/lib/components/context-menu/direction.token.d.ts +25 -0
  161. package/lib/components/context-menu/interfaces.d.ts +30 -0
  162. package/lib/components/create-menu/create-menu.component.d.ts +42 -0
  163. package/lib/components/create-menu/create-menu.module.d.ts +10 -0
  164. package/lib/components/details/details.component.d.ts +46 -0
  165. package/lib/components/dl-custom-components/document-list-custom-components.module.d.ts +14 -0
  166. package/lib/components/dl-custom-components/name-column/name-column.component.d.ts +41 -0
  167. package/lib/components/dl-custom-components/tags-column/tags-column.component.d.ts +35 -0
  168. package/lib/components/dl-custom-components/thumbnail-column/thumbnail-column.component.d.ts +17 -0
  169. package/lib/components/favorite-libraries/favorite-libraries.component.d.ts +54 -0
  170. package/lib/components/favorites/favorites.component.d.ts +49 -0
  171. package/lib/components/files/files.component.d.ts +55 -0
  172. package/lib/components/home/home.component.d.ts +36 -0
  173. package/lib/components/info-drawer/comments-tab/comments-tab.component.d.ts +11 -0
  174. package/lib/components/info-drawer/info.drawer.module.d.ts +19 -0
  175. package/lib/components/info-drawer/library-metadata-tab/library-metadata-form.component.d.ts +64 -0
  176. package/lib/components/info-drawer/library-metadata-tab/library-metadata-tab.component.d.ts +7 -0
  177. package/lib/components/info-drawer/metadata-tab/metadata-tab.component.d.ts +49 -0
  178. package/lib/components/info-drawer/versions-tab/versions-tab.component.d.ts +35 -0
  179. package/lib/components/libraries/libraries.component.d.ts +44 -0
  180. package/lib/components/node-version/node-version-form.component.d.ts +46 -0
  181. package/lib/components/node-version/node-version.module.d.ts +16 -0
  182. package/lib/components/recent-files/recent-files.component.d.ts +48 -0
  183. package/lib/components/search/search-action-menu/search-action-menu.component.d.ts +38 -0
  184. package/lib/components/search/search-input/search-input.component.d.ts +85 -0
  185. package/lib/components/search/search-input-control/search-input-control.component.d.ts +50 -0
  186. package/lib/components/search/search-input.module.d.ts +12 -0
  187. package/lib/components/search/search-libraries-results/search-libraries-query-builder.service.d.ts +56 -0
  188. package/lib/components/search/search-libraries-results/search-libraries-results.component.d.ts +58 -0
  189. package/lib/components/search/search-navigation.service.d.ts +13 -0
  190. package/lib/components/search/search-results/search-results.component.d.ts +69 -0
  191. package/lib/components/search/search-results-row/search-results-row.component.d.ts +50 -0
  192. package/lib/components/search/search-results.module.d.ts +21 -0
  193. package/lib/components/shared-files/shared-files.component.d.ts +47 -0
  194. package/lib/components/shared-link-view/shared-link-view.component.d.ts +47 -0
  195. package/lib/components/shared-link-view/shared-link-view.module.d.ts +15 -0
  196. package/lib/components/sidenav/components/button-menu.component.d.ts +37 -0
  197. package/lib/components/sidenav/components/expand-menu.component.d.ts +35 -0
  198. package/lib/components/sidenav/components/sidenav-header.component.d.ts +48 -0
  199. package/lib/components/sidenav/directives/action.directive.d.ts +14 -0
  200. package/lib/components/sidenav/directives/active-link.directive.d.ts +45 -0
  201. package/lib/components/sidenav/directives/expansion-panel.directive.d.ts +44 -0
  202. package/lib/components/sidenav/directives/menu-panel.directive.d.ts +42 -0
  203. package/lib/components/sidenav/sidenav.component.d.ts +50 -0
  204. package/lib/components/sidenav/sidenav.module.d.ts +19 -0
  205. package/lib/components/toolbar/document-display-mode/document-display-mode.component.d.ts +13 -0
  206. package/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.d.ts +47 -0
  207. package/lib/components/toolbar/toggle-favorite/toggle-favorite.component.d.ts +42 -0
  208. package/lib/components/toolbar/toggle-favorite-library/toggle-favorite-library.component.d.ts +42 -0
  209. package/lib/components/toolbar/toggle-info-drawer/toggle-info-drawer.component.d.ts +11 -0
  210. package/lib/components/toolbar/toggle-join-library/toggle-join-library-button.component.d.ts +41 -0
  211. package/lib/components/toolbar/toggle-join-library/toggle-join-library-menu.component.d.ts +10 -0
  212. package/lib/components/toolbar/toolbar.module.d.ts +20 -0
  213. package/lib/components/toolbar/view-node/view-node.component.d.ts +19 -0
  214. package/lib/components/trashcan/trashcan.component.d.ts +42 -0
  215. package/lib/components/trashcan/trashcan.module.d.ts +16 -0
  216. package/lib/components/upload-files-dialog/upload-files-dialog.component.d.ts +37 -0
  217. package/lib/components/view-profile/view-profile.component.d.ts +59 -0
  218. package/lib/components/view-profile/view-profile.guard.d.ts +12 -0
  219. package/lib/components/view-profile/view-profile.module.d.ts +9 -0
  220. package/lib/dialogs/node-template/create-from-template.dialog.d.ts +49 -0
  221. package/lib/directives/directives.module.d.ts +9 -0
  222. package/lib/directives/document-list.directive.d.ts +56 -0
  223. package/lib/extensions/core.extensions.module.d.ts +14 -0
  224. package/lib/material.module.d.ts +14 -0
  225. package/lib/services/content-management.service.d.ts +100 -0
  226. package/lib/services/content-service-extension.service.d.ts +11 -0
  227. package/lib/services/content-url.service.d.ts +17 -0
  228. package/lib/services/node-actions.service.d.ts +93 -0
  229. package/lib/services/node-template.service.d.ts +34 -0
  230. package/lib/store/app-store.module.d.ts +10 -0
  231. package/lib/store/effects/app.effects.d.ts +41 -0
  232. package/lib/store/effects/contextmenu.effects.d.ts +12 -0
  233. package/lib/store/effects/download.effects.d.ts +49 -0
  234. package/lib/store/effects/favorite.effects.d.ts +38 -0
  235. package/lib/store/effects/library.effects.d.ts +43 -0
  236. package/lib/store/effects/node.effects.d.ts +56 -0
  237. package/lib/store/effects/search.effects.d.ts +37 -0
  238. package/lib/store/effects/template.effects.d.ts +54 -0
  239. package/lib/store/effects/upload.effects.d.ts +52 -0
  240. package/lib/store/effects/viewer.effects.d.ts +55 -0
  241. package/lib/store/effects.d.ts +34 -0
  242. package/lib/store/initial-state.d.ts +26 -0
  243. package/lib/store/reducers/app.reducer.d.ts +26 -0
  244. package/package.json +47 -0
  245. package/public-api.d.ts +28 -0
  246. package/ui/application.scss +53 -0
  247. package/ui/colors.scss +96 -0
  248. package/ui/custom-theme.scss +34 -0
  249. package/ui/dynamic-theme/custom-background-color.scss +14 -0
  250. package/ui/dynamic-theme/custom-palette-creator.scss +132 -0
  251. package/ui/dynamic-theme/custom-text-color.scss +8 -0
  252. package/ui/dynamic-theme/custom-theme-palettes.scss +33 -0
  253. package/ui/dynamic-theme/custom-theme.scss.tpl +72 -0
  254. package/ui/dynamic-theme/index.scss +1 -0
  255. package/ui/dynamic-theme/theme-configuration.scss.tpl +14 -0
  256. package/ui/dynamic-theme/typography.scss +94 -0
  257. package/ui/mixins.scss +26 -0
  258. package/ui/overrides/adf-about.theme.scss +38 -0
  259. package/ui/overrides/adf-pagination.theme.scss +46 -0
  260. package/ui/overrides/adf-style-fixes.theme.scss +18 -0
  261. package/ui/overrides/ay11.scss +232 -0
  262. package/ui/theme.scss +55 -0
  263. package/ui/variables/font-family.scss +1 -0
  264. package/ui/variables/variables.scss +92 -0
@@ -0,0 +1,870 @@
1
+ /*!
2
+ * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
3
+ *
4
+ * Alfresco Example Content Application
5
+ *
6
+ * This file is part of the Alfresco Example Content Application.
7
+ * If the software was purchased under a paid Alfresco license, the terms of
8
+ * the paid license agreement will prevail. Otherwise, the software is
9
+ * provided under the following open source license terms:
10
+ *
11
+ * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
12
+ * it under the terms of the GNU Lesser General Public License as published by
13
+ * the Free Software Foundation, either version 3 of the License, or
14
+ * (at your option) any later version.
15
+ *
16
+ * The Alfresco Example Content Application is distributed in the hope that it will be useful,
17
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ * GNU Lesser General Public License for more details.
20
+ *
21
+ * You should have received a copy of the GNU Lesser General Public License
22
+ * from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
23
+ */
24
+ import { AppHookService, ContentApiService, NodePermissionService } from '@alfresco/aca-shared';
25
+ import { getAppSelection, getSharedUrl, NavigateRouteAction, NavigateToParentFolder, ReloadDocumentListAction, SetSelectedNodesAction, ShowLoaderAction, SnackbarErrorAction, SnackbarInfoAction, SnackbarUserAction, SnackbarWarningAction, UndoDeleteNodesAction, UnlockWriteAction, ViewNodeVersionAction } from '@alfresco/aca-shared/store';
26
+ import { ConfirmDialogComponent, FolderDialogComponent, LibraryDialogComponent, ShareDialogComponent, NodeAspectService, NewVersionUploaderService, NewVersionUploaderDataAction, NodesApiService } from '@alfresco/adf-content-services';
27
+ import { TranslationService, NotificationService } from '@alfresco/adf-core';
28
+ import { Injectable } from '@angular/core';
29
+ import { MatDialog } from '@angular/material/dialog';
30
+ import { Store } from '@ngrx/store';
31
+ import { forkJoin, of, zip } from 'rxjs';
32
+ import { catchError, map, mergeMap, take, tap } from 'rxjs/operators';
33
+ import { NodeActionsService } from './node-actions.service';
34
+ import { Router } from '@angular/router';
35
+ import * as i0 from "@angular/core";
36
+ import * as i1 from "@alfresco/adf-content-services";
37
+ import * as i2 from "@ngrx/store";
38
+ import * as i3 from "@alfresco/aca-shared";
39
+ import * as i4 from "@angular/material/dialog";
40
+ import * as i5 from "./node-actions.service";
41
+ import * as i6 from "@alfresco/adf-core";
42
+ import * as i7 from "@angular/router";
43
+ export class ContentManagementService {
44
+ constructor(nodesApiService, store, contentApi, permission, dialogRef, nodeActionsService, translation, notificationService, nodeAspectService, appHookService, newVersionUploaderService, router) {
45
+ this.nodesApiService = nodesApiService;
46
+ this.store = store;
47
+ this.contentApi = contentApi;
48
+ this.permission = permission;
49
+ this.dialogRef = dialogRef;
50
+ this.nodeActionsService = nodeActionsService;
51
+ this.translation = translation;
52
+ this.notificationService = notificationService;
53
+ this.nodeAspectService = nodeAspectService;
54
+ this.appHookService = appHookService;
55
+ this.newVersionUploaderService = newVersionUploaderService;
56
+ this.router = router;
57
+ this.createMenuButtonSelector = 'app-toolbar-menu button[id="app.toolbar.create"]';
58
+ }
59
+ addFavorite(nodes) {
60
+ if (nodes && nodes.length > 0) {
61
+ this.contentApi.addFavorite(nodes).subscribe(() => {
62
+ const favoriteNodes = nodes.map((node) => {
63
+ const newNode = JSON.parse(JSON.stringify(node));
64
+ newNode.entry.isFavorite = true;
65
+ return newNode;
66
+ });
67
+ this.store.dispatch(new SetSelectedNodesAction(favoriteNodes));
68
+ });
69
+ }
70
+ }
71
+ removeFavorite(nodes) {
72
+ if (nodes && nodes.length > 0) {
73
+ this.contentApi.removeFavorite(nodes).subscribe(() => {
74
+ const favoriteNodes = nodes.map((node) => {
75
+ const newNode = JSON.parse(JSON.stringify(node));
76
+ newNode.entry.isFavorite = false;
77
+ return newNode;
78
+ });
79
+ this.store.dispatch(new SetSelectedNodesAction(favoriteNodes));
80
+ });
81
+ }
82
+ }
83
+ manageVersions(node, focusedElementOnCloseSelector) {
84
+ if (node && node.entry) {
85
+ // shared and favorite
86
+ const id = node.entry.nodeId || node.entry.guid;
87
+ if (id) {
88
+ this.contentApi.getNodeInfo(id).subscribe((entry) => {
89
+ this.openVersionManagerDialog(entry, focusedElementOnCloseSelector);
90
+ });
91
+ }
92
+ else {
93
+ this.openVersionManagerDialog(node.entry, focusedElementOnCloseSelector);
94
+ }
95
+ }
96
+ }
97
+ manageAspects(node, focusedElementOnCloseSelector) {
98
+ if (node && node.entry) {
99
+ // shared and favorite
100
+ const id = node.entry.nodeId || node.entry.guid;
101
+ if (id) {
102
+ this.contentApi.getNodeInfo(id).subscribe((entry) => {
103
+ this.openAspectListDialog(entry, focusedElementOnCloseSelector);
104
+ });
105
+ }
106
+ else {
107
+ this.openAspectListDialog(node.entry, focusedElementOnCloseSelector);
108
+ }
109
+ }
110
+ }
111
+ versionUpdateDialog(node, file) {
112
+ this.contentApi.getNodeVersions(node.id).subscribe(({ list }) => {
113
+ const newVersionUploaderDialogData = {
114
+ node,
115
+ file,
116
+ currentVersion: list.entries[0].entry,
117
+ title: 'VERSION.DIALOG.TITLE'
118
+ };
119
+ const dialogConfig = { width: '600px' };
120
+ this.newVersionUploaderService.openUploadNewVersionDialog(newVersionUploaderDialogData, dialogConfig).subscribe((data) => {
121
+ if (data.action === NewVersionUploaderDataAction.upload) {
122
+ if (data.newVersion.value.entry.properties['cm:lockType'] === 'WRITE_LOCK') {
123
+ this.store.dispatch(new UnlockWriteAction(data.newVersion.value));
124
+ }
125
+ }
126
+ }, (error) => this.store.dispatch(new SnackbarErrorAction(error)));
127
+ });
128
+ }
129
+ shareNode(node, focusedElementOnCloseSelector) {
130
+ if (node && node.entry) {
131
+ // shared and favorite
132
+ const id = node.entry.nodeId || node.entry.guid;
133
+ if (id) {
134
+ this.contentApi.getNodeInfo(id).subscribe((entry) => {
135
+ this.openShareLinkDialog({ entry }, focusedElementOnCloseSelector);
136
+ });
137
+ }
138
+ else {
139
+ this.openShareLinkDialog(node, focusedElementOnCloseSelector);
140
+ }
141
+ }
142
+ }
143
+ openShareLinkDialog(node, focusedElementOnCloseSelector) {
144
+ this.store
145
+ .select(getSharedUrl)
146
+ .pipe(take(1))
147
+ .subscribe((baseShareUrl) => {
148
+ this.dialogRef
149
+ .open(ShareDialogComponent, {
150
+ restoreFocus: true,
151
+ width: '600px',
152
+ panelClass: 'adf-share-link-dialog',
153
+ data: {
154
+ node,
155
+ baseShareUrl
156
+ }
157
+ })
158
+ .afterClosed()
159
+ .subscribe(() => {
160
+ this.store.dispatch(new SetSelectedNodesAction([node]));
161
+ this.appHookService.linksUnshared.next();
162
+ this.focusAfterClose(focusedElementOnCloseSelector);
163
+ });
164
+ });
165
+ }
166
+ createFolder(parentNodeId) {
167
+ const dialogInstance = this.dialogRef.open(FolderDialogComponent, {
168
+ data: {
169
+ parentNodeId,
170
+ createTitle: undefined,
171
+ nodeType: 'cm:folder'
172
+ },
173
+ width: '400px',
174
+ role: 'dialog'
175
+ });
176
+ dialogInstance.componentInstance.error.subscribe((message) => {
177
+ this.store.dispatch(new SnackbarErrorAction(message));
178
+ });
179
+ dialogInstance.afterClosed().subscribe((node) => {
180
+ if (node) {
181
+ this.store.dispatch(new ReloadDocumentListAction());
182
+ }
183
+ this.focusAfterClose(this.createMenuButtonSelector);
184
+ });
185
+ }
186
+ editFolder(folder, focusedElementOnCloseSelector) {
187
+ if (!folder) {
188
+ return;
189
+ }
190
+ const dialog = this.dialogRef.open(FolderDialogComponent, {
191
+ data: {
192
+ folder: folder.entry
193
+ },
194
+ width: '400px'
195
+ });
196
+ dialog.componentInstance.error.subscribe((message) => {
197
+ this.store.dispatch(new SnackbarErrorAction(message));
198
+ });
199
+ dialog.afterClosed().subscribe((node) => {
200
+ if (node) {
201
+ this.nodesApiService.nodeUpdated.next(node);
202
+ }
203
+ this.focusAfterClose(focusedElementOnCloseSelector);
204
+ });
205
+ }
206
+ createLibrary() {
207
+ const dialogInstance = this.dialogRef.open(LibraryDialogComponent, {
208
+ width: '400px'
209
+ });
210
+ dialogInstance.componentInstance.error.subscribe((message) => {
211
+ this.store.dispatch(new SnackbarErrorAction(message));
212
+ });
213
+ return dialogInstance.afterClosed().pipe(tap((node) => {
214
+ if (node) {
215
+ this.appHookService.libraryCreated.next(node);
216
+ }
217
+ this.focusAfterClose(this.createMenuButtonSelector);
218
+ }), map((node) => {
219
+ if (node && node.entry && node.entry.guid) {
220
+ return node.entry.guid;
221
+ }
222
+ return null;
223
+ }));
224
+ }
225
+ deleteLibrary(id) {
226
+ this.contentApi.deleteSite(id).subscribe(() => {
227
+ this.appHookService.libraryDeleted.next(id);
228
+ this.store.dispatch(new SnackbarInfoAction('APP.MESSAGES.INFO.LIBRARY_DELETED'));
229
+ }, () => {
230
+ this.store.dispatch(new SnackbarErrorAction('APP.MESSAGES.ERRORS.DELETE_LIBRARY_FAILED'));
231
+ });
232
+ }
233
+ leaveLibrary(siteId, focusedElementOnCloseSelector) {
234
+ const dialogRef = this.dialogRef.open(ConfirmDialogComponent, {
235
+ data: {
236
+ title: 'APP.DIALOGS.CONFIRM_LEAVE.TITLE',
237
+ message: 'APP.DIALOGS.CONFIRM_LEAVE.MESSAGE',
238
+ yesLabel: 'APP.DIALOGS.CONFIRM_LEAVE.YES_LABEL',
239
+ noLabel: 'APP.DIALOGS.CONFIRM_LEAVE.NO_LABEL'
240
+ },
241
+ minWidth: '250px'
242
+ });
243
+ dialogRef.afterClosed().subscribe((result) => {
244
+ if (result === true) {
245
+ this.contentApi.leaveSite(siteId).subscribe(() => {
246
+ this.appHookService.libraryLeft.next(siteId);
247
+ this.store.dispatch(new SnackbarInfoAction('APP.MESSAGES.INFO.LEFT_LIBRARY'));
248
+ }, () => {
249
+ this.store.dispatch(new SnackbarErrorAction('APP.MESSAGES.ERRORS.LEAVE_LIBRARY_FAILED'));
250
+ });
251
+ }
252
+ this.focusAfterClose(focusedElementOnCloseSelector);
253
+ });
254
+ }
255
+ updateLibrary(siteId, siteBody) {
256
+ this.contentApi.updateLibrary(siteId, siteBody).subscribe((siteEntry) => {
257
+ this.appHookService.libraryUpdated.next(siteEntry);
258
+ this.store.dispatch(new SnackbarInfoAction('LIBRARY.SUCCESS.LIBRARY_UPDATED'));
259
+ }, () => {
260
+ this.store.dispatch(new SnackbarErrorAction('LIBRARY.ERRORS.LIBRARY_UPDATE_ERROR'));
261
+ });
262
+ }
263
+ async unshareNodes(links) {
264
+ const promises = links.map((link) => this.contentApi.deleteSharedLink(link.entry.id).toPromise());
265
+ await Promise.all(promises);
266
+ this.appHookService.linksUnshared.next();
267
+ }
268
+ canUpdateNode(node) {
269
+ return this.permission.check(node, ['update']);
270
+ }
271
+ canUploadContent(folderNode) {
272
+ return this.permission.check(folderNode, ['create']);
273
+ }
274
+ purgeDeletedNodes(nodes) {
275
+ if (!nodes || nodes.length === 0) {
276
+ return;
277
+ }
278
+ const dialogRef = this.dialogRef.open(ConfirmDialogComponent, {
279
+ data: {
280
+ title: 'APP.DIALOGS.CONFIRM_PURGE.TITLE',
281
+ message: 'APP.DIALOGS.CONFIRM_PURGE.MESSAGE',
282
+ yesLabel: 'APP.DIALOGS.CONFIRM_PURGE.YES_LABEL',
283
+ noLabel: 'APP.DIALOGS.CONFIRM_PURGE.NO_LABEL'
284
+ },
285
+ minWidth: '250px'
286
+ });
287
+ dialogRef.afterClosed().subscribe((result) => {
288
+ if (result === true) {
289
+ const nodesToDelete = nodes.map((node) => {
290
+ const { name } = node.entry;
291
+ const id = node.entry.nodeId || node.entry.id;
292
+ return {
293
+ id,
294
+ name
295
+ };
296
+ });
297
+ this.purgeNodes(nodesToDelete);
298
+ }
299
+ });
300
+ }
301
+ restoreDeletedNodes(selection = []) {
302
+ if (!selection.length) {
303
+ return;
304
+ }
305
+ const nodesWithPath = selection.filter((node) => node.entry.path);
306
+ if (selection.length && !nodesWithPath.length) {
307
+ const failedStatus = this.processStatus([]);
308
+ failedStatus.fail.push(...selection);
309
+ this.showRestoreNotification(failedStatus);
310
+ this.store.dispatch(new ReloadDocumentListAction());
311
+ return;
312
+ }
313
+ let status;
314
+ forkJoin(nodesWithPath.map((node) => this.restoreNode(node)))
315
+ .pipe(tap((restoredNodes) => {
316
+ status = this.processStatus(restoredNodes);
317
+ }), mergeMap(() => this.contentApi.getDeletedNodes()))
318
+ .subscribe((nodes) => {
319
+ const selectedNodes = this.diff(status.fail, selection, false);
320
+ const remainingNodes = this.diff(selectedNodes, nodes.list.entries);
321
+ if (!remainingNodes.length) {
322
+ this.showRestoreNotification(status);
323
+ this.store.dispatch(new ReloadDocumentListAction());
324
+ }
325
+ else {
326
+ this.restoreDeletedNodes(remainingNodes);
327
+ }
328
+ });
329
+ }
330
+ copyNodes(nodes, focusedElementOnCloseSelector) {
331
+ zip(this.nodeActionsService.copyNodes(nodes, undefined, focusedElementOnCloseSelector), this.nodeActionsService.contentCopied).subscribe((result) => {
332
+ const [operationResult, newItems] = result;
333
+ this.showCopyMessage(operationResult, nodes, newItems);
334
+ }, (error) => {
335
+ this.showCopyMessage(error, nodes);
336
+ });
337
+ }
338
+ moveNodes(nodes, focusedElementOnCloseSelector) {
339
+ const permissionForMove = '!';
340
+ zip(this.nodeActionsService.moveNodes(nodes, permissionForMove, focusedElementOnCloseSelector), this.nodeActionsService.contentMoved).subscribe((result) => {
341
+ const [operationResult, moveResponse] = result;
342
+ this.showMoveMessage(nodes, operationResult, moveResponse);
343
+ this.store.dispatch(new ReloadDocumentListAction());
344
+ }, (error) => {
345
+ this.showMoveMessage(nodes, error);
346
+ });
347
+ }
348
+ getErrorMessage(errorObject) {
349
+ let i18nMessageString = 'APP.MESSAGES.ERRORS.GENERIC';
350
+ try {
351
+ const { error: { statusCode } } = JSON.parse(errorObject.message);
352
+ if (statusCode === 409) {
353
+ i18nMessageString = 'APP.MESSAGES.ERRORS.NODE_MOVE';
354
+ }
355
+ else if (statusCode === 403) {
356
+ i18nMessageString = 'APP.MESSAGES.ERRORS.PERMISSION';
357
+ }
358
+ }
359
+ catch (err) {
360
+ /* Do nothing, keep the original message */
361
+ }
362
+ return i18nMessageString;
363
+ }
364
+ getNodeInfo() {
365
+ return this.store.select(getAppSelection).pipe(take(1), mergeMap(({ file }) => {
366
+ const id = file.entry.nodeId || file.entry.guid;
367
+ if (!id) {
368
+ return of(file.entry);
369
+ }
370
+ else {
371
+ return this.contentApi.getNodeInfo(id);
372
+ }
373
+ }));
374
+ }
375
+ unlockNode(node) {
376
+ return this.contentApi.unlockNode(node.entry.id).catch(() => {
377
+ this.store.dispatch(new SnackbarErrorAction('APP.MESSAGES.ERRORS.UNLOCK_NODE', {
378
+ fileName: node.entry.name
379
+ }));
380
+ });
381
+ }
382
+ showCopyMessage(info, nodes, newItems) {
383
+ const numberOfCopiedItems = newItems ? newItems.length : 0;
384
+ const failedItems = nodes.length - numberOfCopiedItems;
385
+ let i18nMessageString = 'APP.MESSAGES.ERRORS.GENERIC';
386
+ if (typeof info === 'string') {
387
+ if (info.toLowerCase().indexOf('succes') !== -1) {
388
+ let i18MessageSuffix;
389
+ if (failedItems) {
390
+ if (numberOfCopiedItems) {
391
+ i18MessageSuffix = numberOfCopiedItems === 1 ? 'PARTIAL_SINGULAR' : 'PARTIAL_PLURAL';
392
+ }
393
+ else {
394
+ i18MessageSuffix = failedItems === 1 ? 'FAIL_SINGULAR' : 'FAIL_PLURAL';
395
+ }
396
+ }
397
+ else {
398
+ i18MessageSuffix = numberOfCopiedItems === 1 ? 'SINGULAR' : 'PLURAL';
399
+ }
400
+ i18nMessageString = `APP.MESSAGES.INFO.NODE_COPY.${i18MessageSuffix}`;
401
+ }
402
+ }
403
+ else {
404
+ try {
405
+ const { error: { statusCode } } = JSON.parse(info.message);
406
+ if (statusCode === 403) {
407
+ i18nMessageString = 'APP.MESSAGES.ERRORS.PERMISSION';
408
+ }
409
+ }
410
+ catch { }
411
+ }
412
+ const undo = numberOfCopiedItems > 0 ? this.translation.instant('APP.ACTIONS.UNDO') : '';
413
+ const message = this.translation.instant(i18nMessageString, {
414
+ success: numberOfCopiedItems,
415
+ failed: failedItems
416
+ });
417
+ this.notificationService
418
+ .openSnackMessageAction(message, undo, {
419
+ panelClass: 'info-snackbar'
420
+ })
421
+ .onAction()
422
+ .subscribe(() => this.undoCopyNodes(newItems));
423
+ }
424
+ undoCopyNodes(nodes) {
425
+ const batch = this.nodeActionsService
426
+ .flatten(nodes)
427
+ .filter((item) => item.entry)
428
+ .map((item) => this.contentApi.deleteNode(item.entry.id, { permanent: true }));
429
+ forkJoin(...batch).subscribe(() => {
430
+ this.appHookService.nodesDeleted.next(null);
431
+ this.store.dispatch(new ReloadDocumentListAction());
432
+ }, (error) => {
433
+ let i18nMessageString = 'APP.MESSAGES.ERRORS.GENERIC';
434
+ let errorJson = null;
435
+ try {
436
+ errorJson = JSON.parse(error.message);
437
+ }
438
+ catch { }
439
+ if (errorJson && errorJson.error && errorJson.error.statusCode === 403) {
440
+ i18nMessageString = 'APP.MESSAGES.ERRORS.PERMISSION';
441
+ }
442
+ this.store.dispatch(new SnackbarErrorAction(i18nMessageString));
443
+ });
444
+ }
445
+ openVersionManagerDialog(node, focusedElementOnCloseSelector) {
446
+ // workaround Shared
447
+ if (node.isFile || node.nodeId) {
448
+ const newVersionUploaderDialogData = {
449
+ node,
450
+ showVersionsOnly: true,
451
+ title: 'VERSION.DIALOG.TITLE'
452
+ };
453
+ this.newVersionUploaderService
454
+ .openUploadNewVersionDialog(newVersionUploaderDialogData, { width: '630px', role: 'dialog' }, focusedElementOnCloseSelector)
455
+ .subscribe({
456
+ next: (newVersionUploaderData) => {
457
+ switch (newVersionUploaderData.action) {
458
+ case NewVersionUploaderDataAction.refresh:
459
+ this.store.dispatch(new ReloadDocumentListAction());
460
+ break;
461
+ case NewVersionUploaderDataAction.view:
462
+ this.store.dispatch(new ViewNodeVersionAction(node.id, newVersionUploaderData.versionId, {
463
+ location: this.router.url
464
+ }));
465
+ break;
466
+ default:
467
+ break;
468
+ }
469
+ }
470
+ });
471
+ }
472
+ else {
473
+ this.store.dispatch(new SnackbarErrorAction('APP.MESSAGES.ERRORS.PERMISSION'));
474
+ }
475
+ }
476
+ openAspectListDialog(node, focusedElementOnCloseSelector) {
477
+ // workaround Shared
478
+ if (node.isFile || node.id) {
479
+ this.nodeAspectService.updateNodeAspects(node.id, focusedElementOnCloseSelector);
480
+ }
481
+ else {
482
+ this.store.dispatch(new SnackbarErrorAction('APP.MESSAGES.ERRORS.PERMISSION'));
483
+ }
484
+ }
485
+ undoMoveNodes(moveResponse, selectionParentId) {
486
+ const movedNodes = moveResponse && moveResponse['succeeded'] ? moveResponse['succeeded'] : [];
487
+ const partiallyMovedNodes = moveResponse && moveResponse['partiallySucceeded'] ? moveResponse['partiallySucceeded'] : [];
488
+ const restoreDeletedNodesBatch = this.nodeActionsService.moveDeletedEntries.map((folderEntry) => this.contentApi.restoreNode(folderEntry.nodeId || folderEntry.id).pipe(map((node) => node.entry)));
489
+ zip(...restoreDeletedNodesBatch, of(null))
490
+ .pipe(mergeMap(() => {
491
+ const nodesToBeMovedBack = [...partiallyMovedNodes, ...movedNodes];
492
+ const revertMoveBatch = this.nodeActionsService
493
+ .flatten(nodesToBeMovedBack)
494
+ .filter((node) => node.entry || (node.itemMoved && node.itemMoved.entry))
495
+ .map((node) => {
496
+ if (node.itemMoved) {
497
+ return this.nodeActionsService.moveNodeAction(node.itemMoved.entry, node.initialParentId);
498
+ }
499
+ else {
500
+ return this.nodeActionsService.moveNodeAction(node.entry, selectionParentId);
501
+ }
502
+ });
503
+ return zip(...revertMoveBatch, of(null));
504
+ }))
505
+ .subscribe(() => {
506
+ this.store.dispatch(new ReloadDocumentListAction());
507
+ }, (error) => {
508
+ let message = 'APP.MESSAGES.ERRORS.GENERIC';
509
+ let errorJson = null;
510
+ try {
511
+ errorJson = JSON.parse(error.message);
512
+ }
513
+ catch { }
514
+ if (errorJson && errorJson.error && errorJson.error.statusCode === 403) {
515
+ message = 'APP.MESSAGES.ERRORS.PERMISSION';
516
+ }
517
+ this.store.dispatch(new SnackbarErrorAction(message));
518
+ });
519
+ }
520
+ deleteNodes(items) {
521
+ const batch = [];
522
+ items.forEach((node) => {
523
+ batch.push(this.deleteNode(node));
524
+ });
525
+ forkJoin(...batch).subscribe((data) => {
526
+ const status = this.processStatus(data);
527
+ const message = this.getDeleteMessage(status);
528
+ if (message && status.someSucceeded) {
529
+ message.userAction = new SnackbarUserAction('APP.ACTIONS.UNDO', new UndoDeleteNodesAction([...status.success]));
530
+ }
531
+ this.store.dispatch(message);
532
+ if (status.someSucceeded) {
533
+ this.appHookService.nodesDeleted.next();
534
+ this.store.dispatch(new ReloadDocumentListAction());
535
+ }
536
+ this.store.dispatch(new ShowLoaderAction(false));
537
+ });
538
+ }
539
+ undoDeleteNodes(items) {
540
+ const batch = [];
541
+ items.forEach((item) => {
542
+ batch.push(this.undoDeleteNode(item));
543
+ });
544
+ forkJoin(...batch).subscribe((data) => {
545
+ const processedData = this.processStatus(data);
546
+ if (processedData.fail.length) {
547
+ const message = this.getUndoDeleteMessage(processedData);
548
+ this.store.dispatch(message);
549
+ }
550
+ if (processedData.someSucceeded) {
551
+ this.store.dispatch(new ReloadDocumentListAction());
552
+ }
553
+ });
554
+ }
555
+ undoDeleteNode(item) {
556
+ const { id, name } = item;
557
+ return this.contentApi.restoreNode(id).pipe(map(() => ({
558
+ id,
559
+ name,
560
+ status: 1
561
+ })), catchError(() => of({
562
+ id,
563
+ name,
564
+ status: 0
565
+ })));
566
+ }
567
+ getUndoDeleteMessage(status) {
568
+ if (status.someFailed && !status.oneFailed) {
569
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_RESTORE_PLURAL', { number: status.fail.length });
570
+ }
571
+ if (status.oneFailed) {
572
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_RESTORE', {
573
+ name: status.fail[0].name
574
+ });
575
+ }
576
+ return null;
577
+ }
578
+ restoreNode(node) {
579
+ const { entry } = node;
580
+ return this.contentApi.restoreNode(entry.id).pipe(map(() => ({
581
+ status: 1,
582
+ entry
583
+ })), catchError((error) => {
584
+ const { statusCode } = JSON.parse(error.message).error;
585
+ return of({
586
+ status: 0,
587
+ statusCode,
588
+ entry
589
+ });
590
+ }));
591
+ }
592
+ purgeNodes(selection = []) {
593
+ if (!selection.length) {
594
+ return;
595
+ }
596
+ const batch = selection.map((node) => this.purgeDeletedNode(node));
597
+ forkJoin(batch).subscribe((purgedNodes) => {
598
+ const status = this.processStatus(purgedNodes);
599
+ if (status.success.length) {
600
+ this.store.dispatch(new ReloadDocumentListAction());
601
+ }
602
+ const message = this.getPurgeMessage(status);
603
+ if (message) {
604
+ this.store.dispatch(message);
605
+ }
606
+ });
607
+ }
608
+ purgeDeletedNode(node) {
609
+ const { id, name } = node;
610
+ return this.contentApi.purgeDeletedNode(id).pipe(map(() => ({
611
+ status: 1,
612
+ id,
613
+ name
614
+ })), catchError(() => of({
615
+ status: 0,
616
+ id,
617
+ name
618
+ })));
619
+ }
620
+ processStatus(data = []) {
621
+ const status = {
622
+ fail: [],
623
+ success: [],
624
+ get someFailed() {
625
+ return !!this.fail.length;
626
+ },
627
+ get someSucceeded() {
628
+ return !!this.success.length;
629
+ },
630
+ get oneFailed() {
631
+ return this.fail.length === 1;
632
+ },
633
+ get oneSucceeded() {
634
+ return this.success.length === 1;
635
+ },
636
+ get allSucceeded() {
637
+ return this.someSucceeded && !this.someFailed;
638
+ },
639
+ get allFailed() {
640
+ return this.someFailed && !this.someSucceeded;
641
+ },
642
+ reset() {
643
+ this.fail = [];
644
+ this.success = [];
645
+ }
646
+ };
647
+ return data.reduce((acc, node) => {
648
+ if (node.status) {
649
+ acc.success.push(node);
650
+ }
651
+ else {
652
+ acc.fail.push(node);
653
+ }
654
+ return acc;
655
+ }, status);
656
+ }
657
+ getPurgeMessage(status) {
658
+ if (status.oneSucceeded && status.someFailed && !status.oneFailed) {
659
+ return new SnackbarWarningAction('APP.MESSAGES.INFO.TRASH.NODES_PURGE.PARTIAL_SINGULAR', {
660
+ name: status.success[0].name,
661
+ failed: status.fail.length
662
+ });
663
+ }
664
+ if (status.someSucceeded && !status.oneSucceeded && status.someFailed) {
665
+ return new SnackbarWarningAction('APP.MESSAGES.INFO.TRASH.NODES_PURGE.PARTIAL_PLURAL', {
666
+ number: status.success.length,
667
+ failed: status.fail.length
668
+ });
669
+ }
670
+ if (status.oneSucceeded) {
671
+ return new SnackbarInfoAction('APP.MESSAGES.INFO.TRASH.NODES_PURGE.SINGULAR', { name: status.success[0].name });
672
+ }
673
+ if (status.oneFailed) {
674
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_PURGE.SINGULAR', { name: status.fail[0].name });
675
+ }
676
+ if (status.allSucceeded) {
677
+ return new SnackbarInfoAction('APP.MESSAGES.INFO.TRASH.NODES_PURGE.PLURAL', { number: status.success.length });
678
+ }
679
+ if (status.allFailed) {
680
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_PURGE.PLURAL', { number: status.fail.length });
681
+ }
682
+ return null;
683
+ }
684
+ showRestoreNotification(status) {
685
+ const message = this.getRestoreMessage(status);
686
+ if (message) {
687
+ if (status.oneSucceeded && !status.someFailed) {
688
+ const isSite = this.isSite(status.success[0].entry);
689
+ const path = status.success[0].entry.path;
690
+ const parent = path.elements[path.elements.length - 1];
691
+ const route = isSite ? ['/libraries', parent.id] : ['/personal-files', parent.id];
692
+ let navigate;
693
+ if (this.isLibraryContent(path)) {
694
+ navigate = new NavigateToParentFolder(status.success[0]);
695
+ }
696
+ else {
697
+ navigate = new NavigateRouteAction(route);
698
+ }
699
+ message.userAction = new SnackbarUserAction('APP.ACTIONS.VIEW', navigate);
700
+ }
701
+ this.store.dispatch(message);
702
+ }
703
+ }
704
+ isSite(entry) {
705
+ return entry.nodeType === 'st:site';
706
+ }
707
+ isLibraryContent(path) {
708
+ return path && path.elements.length >= 2 && path.elements[1].name === 'Sites';
709
+ }
710
+ getRestoreMessage(status) {
711
+ if (status.someFailed && !status.oneFailed) {
712
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.PARTIAL_PLURAL', {
713
+ number: status.fail.length
714
+ });
715
+ }
716
+ if (status.oneFailed && status.fail[0].statusCode) {
717
+ if (status.fail[0].statusCode === 409) {
718
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.NODE_EXISTS', {
719
+ name: status.fail[0].entry.name
720
+ });
721
+ }
722
+ else {
723
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.GENERIC', {
724
+ name: status.fail[0].entry.name
725
+ });
726
+ }
727
+ }
728
+ if (status.oneFailed && !status.fail[0].statusCode) {
729
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.LOCATION_MISSING', {
730
+ name: status.fail[0].entry.name
731
+ });
732
+ }
733
+ if (status.allSucceeded && !status.oneSucceeded) {
734
+ return new SnackbarInfoAction('APP.MESSAGES.INFO.TRASH.NODES_RESTORE.PLURAL');
735
+ }
736
+ if (status.allSucceeded && status.oneSucceeded) {
737
+ return new SnackbarInfoAction('APP.MESSAGES.INFO.TRASH.NODES_RESTORE.SINGULAR', {
738
+ name: status.success[0].entry.name
739
+ });
740
+ }
741
+ return null;
742
+ }
743
+ diff(selection, list, fromList = true) {
744
+ const ids = selection.map((item) => item.entry.id);
745
+ return list.filter((item) => {
746
+ if (fromList) {
747
+ return ids.includes(item.entry.id) ? item : null;
748
+ }
749
+ else {
750
+ return !ids.includes(item.entry.id) ? item : null;
751
+ }
752
+ });
753
+ }
754
+ deleteNode(node) {
755
+ const { name } = node.entry;
756
+ const id = node.entry.nodeId || node.entry.id;
757
+ return this.contentApi.deleteNode(id).pipe(map(() => ({
758
+ id,
759
+ name,
760
+ status: 1
761
+ })), catchError(() => of({
762
+ id,
763
+ name,
764
+ status: 0
765
+ })));
766
+ }
767
+ getDeleteMessage(status) {
768
+ if (status.allFailed && !status.oneFailed) {
769
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_DELETION_PLURAL', { number: status.fail.length });
770
+ }
771
+ if (status.allSucceeded && !status.oneSucceeded) {
772
+ return new SnackbarInfoAction('APP.MESSAGES.INFO.NODE_DELETION.PLURAL', {
773
+ number: status.success.length
774
+ });
775
+ }
776
+ if (status.someFailed && status.someSucceeded && !status.oneSucceeded) {
777
+ return new SnackbarWarningAction('APP.MESSAGES.INFO.NODE_DELETION.PARTIAL_PLURAL', {
778
+ success: status.success.length,
779
+ failed: status.fail.length
780
+ });
781
+ }
782
+ if (status.someFailed && status.oneSucceeded) {
783
+ return new SnackbarWarningAction('APP.MESSAGES.INFO.NODE_DELETION.PARTIAL_SINGULAR', {
784
+ success: status.success.length,
785
+ failed: status.fail.length
786
+ });
787
+ }
788
+ if (status.oneFailed && !status.someSucceeded) {
789
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_DELETION', {
790
+ name: status.fail[0].name
791
+ });
792
+ }
793
+ if (status.oneSucceeded && !status.someFailed) {
794
+ return new SnackbarInfoAction('APP.MESSAGES.INFO.NODE_DELETION.SINGULAR', { name: status.success[0].name });
795
+ }
796
+ return null;
797
+ }
798
+ showMoveMessage(nodes, info, moveResponse) {
799
+ const succeeded = moveResponse && moveResponse['succeeded'] ? moveResponse['succeeded'].length : 0;
800
+ const partiallySucceeded = moveResponse && moveResponse['partiallySucceeded'] ? moveResponse['partiallySucceeded'].length : 0;
801
+ const failures = moveResponse && moveResponse['failed'] ? moveResponse['failed'].length : 0;
802
+ let successMessage = '';
803
+ let partialSuccessMessage = '';
804
+ let failedMessage = '';
805
+ let errorMessage = '';
806
+ if (typeof info === 'string') {
807
+ // in case of success
808
+ if (info.toLowerCase().indexOf('succes') !== -1) {
809
+ const i18nMessageString = 'APP.MESSAGES.INFO.NODE_MOVE.';
810
+ let i18MessageSuffix = '';
811
+ if (succeeded) {
812
+ i18MessageSuffix = succeeded === 1 ? 'SINGULAR' : 'PLURAL';
813
+ successMessage = `${i18nMessageString}${i18MessageSuffix}`;
814
+ }
815
+ if (partiallySucceeded) {
816
+ i18MessageSuffix = partiallySucceeded === 1 ? 'PARTIAL.SINGULAR' : 'PARTIAL.PLURAL';
817
+ partialSuccessMessage = `${i18nMessageString}${i18MessageSuffix}`;
818
+ }
819
+ if (failures) {
820
+ // if moving failed for ALL nodes, emit error
821
+ if (failures === nodes.length) {
822
+ const errors = this.nodeActionsService.flatten(moveResponse['failed']);
823
+ errorMessage = this.getErrorMessage(errors[0]);
824
+ }
825
+ else {
826
+ i18MessageSuffix = 'PARTIAL.FAIL';
827
+ failedMessage = `${i18nMessageString}${i18MessageSuffix}`;
828
+ }
829
+ }
830
+ }
831
+ else {
832
+ errorMessage = 'APP.MESSAGES.ERRORS.GENERIC';
833
+ }
834
+ }
835
+ else {
836
+ errorMessage = this.getErrorMessage(info);
837
+ }
838
+ const undo = succeeded + partiallySucceeded > 0 ? this.translation.instant('APP.ACTIONS.UNDO') : '';
839
+ failedMessage = errorMessage ? errorMessage : failedMessage;
840
+ const beforePartialSuccessMessage = successMessage && partialSuccessMessage ? ' ' : '';
841
+ const beforeFailedMessage = (successMessage || partialSuccessMessage) && failedMessage ? ' ' : '';
842
+ const initialParentId = this.nodeActionsService.getEntryParentId(nodes[0].entry);
843
+ const messages = this.translation.instant([successMessage, partialSuccessMessage, failedMessage], {
844
+ success: succeeded,
845
+ failed: failures,
846
+ partially: partiallySucceeded
847
+ });
848
+ // TODO: review in terms of i18n
849
+ this.notificationService
850
+ .openSnackMessageAction(messages[successMessage] + beforePartialSuccessMessage + messages[partialSuccessMessage] + beforeFailedMessage + messages[failedMessage], undo, {
851
+ panelClass: 'info-snackbar'
852
+ })
853
+ .onAction()
854
+ .subscribe(() => this.undoMoveNodes(moveResponse, initialParentId));
855
+ }
856
+ focusAfterClose(focusedElementSelector) {
857
+ if (focusedElementSelector) {
858
+ document.querySelector(focusedElementSelector)?.focus();
859
+ }
860
+ }
861
+ }
862
+ ContentManagementService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: ContentManagementService, deps: [{ token: i1.NodesApiService }, { token: i2.Store }, { token: i3.ContentApiService }, { token: i3.NodePermissionService }, { token: i4.MatDialog }, { token: i5.NodeActionsService }, { token: i6.TranslationService }, { token: i6.NotificationService }, { token: i1.NodeAspectService }, { token: i3.AppHookService }, { token: i1.NewVersionUploaderService }, { token: i7.Router }], target: i0.ɵɵFactoryTarget.Injectable });
863
+ ContentManagementService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: ContentManagementService, providedIn: 'root' });
864
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: ContentManagementService, decorators: [{
865
+ type: Injectable,
866
+ args: [{
867
+ providedIn: 'root'
868
+ }]
869
+ }], ctorParameters: function () { return [{ type: i1.NodesApiService }, { type: i2.Store }, { type: i3.ContentApiService }, { type: i3.NodePermissionService }, { type: i4.MatDialog }, { type: i5.NodeActionsService }, { type: i6.TranslationService }, { type: i6.NotificationService }, { type: i1.NodeAspectService }, { type: i3.AppHookService }, { type: i1.NewVersionUploaderService }, { type: i7.Router }]; } });
870
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1tYW5hZ2VtZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY2EtY29udGVudC9zcmMvbGliL3NlcnZpY2VzL2NvbnRlbnQtbWFuYWdlbWVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hHLE9BQU8sRUFJTCxlQUFlLEVBQ2YsWUFBWSxFQUNaLG1CQUFtQixFQUNuQixzQkFBc0IsRUFFdEIsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFFaEIsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3RCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixpQkFBaUIsRUFDakIseUJBQXlCLEVBR3pCLDRCQUE0QixFQUM1QixlQUFlLEVBQ2hCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFXN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFtQixNQUFNLDBCQUEwQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVB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QXNCLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUN0RTtJQUNILENBQUM7O3FIQS8rQlUsd0JBQXdCO3lIQUF4Qix3QkFBd0IsY0FGdkIsTUFBTTsyRkFFUCx3QkFBd0I7a0JBSHBDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDIzIEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFsZnJlc2NvIEV4YW1wbGUgQ29udGVudCBBcHBsaWNhdGlvbi5cbiAqIElmIHRoZSBzb2Z0d2FyZSB3YXMgcHVyY2hhc2VkIHVuZGVyIGEgcGFpZCBBbGZyZXNjbyBsaWNlbnNlLCB0aGUgdGVybXMgb2ZcbiAqIHRoZSBwYWlkIGxpY2Vuc2UgYWdyZWVtZW50IHdpbGwgcHJldmFpbC4gT3RoZXJ3aXNlLCB0aGUgc29mdHdhcmUgaXNcbiAqIHByb3ZpZGVkIHVuZGVyIHRoZSBmb2xsb3dpbmcgb3BlbiBzb3VyY2UgbGljZW5zZSB0ZXJtczpcbiAqXG4gKiBUaGUgQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhlIEFsZnJlc2NvIEV4YW1wbGUgQ29udGVudCBBcHBsaWNhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBmcm9tIEh5bGFuZCBTb2Z0d2FyZS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LlxuICovXG5cbmltcG9ydCB7IEFwcEhvb2tTZXJ2aWNlLCBDb250ZW50QXBpU2VydmljZSwgTm9kZVBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSAnQGFsZnJlc2NvL2FjYS1zaGFyZWQnO1xuaW1wb3J0IHtcbiAgQXBwU3RvcmUsXG4gIERlbGV0ZWROb2RlSW5mbyxcbiAgRGVsZXRlU3RhdHVzLFxuICBnZXRBcHBTZWxlY3Rpb24sXG4gIGdldFNoYXJlZFVybCxcbiAgTmF2aWdhdGVSb3V0ZUFjdGlvbixcbiAgTmF2aWdhdGVUb1BhcmVudEZvbGRlcixcbiAgTm9kZUluZm8sXG4gIFJlbG9hZERvY3VtZW50TGlzdEFjdGlvbixcbiAgU2V0U2VsZWN0ZWROb2Rlc0FjdGlvbixcbiAgU2hvd0xvYWRlckFjdGlvbixcbiAgU25hY2tiYXJBY3Rpb24sXG4gIFNuYWNrYmFyRXJyb3JBY3Rpb24sXG4gIFNuYWNrYmFySW5mb0FjdGlvbixcbiAgU25hY2tiYXJVc2VyQWN0aW9uLFxuICBTbmFja2Jhcldhcm5pbmdBY3Rpb24sXG4gIFVuZG9EZWxldGVOb2Rlc0FjdGlvbixcbiAgVW5sb2NrV3JpdGVBY3Rpb24sXG4gIFZpZXdOb2RlVmVyc2lvbkFjdGlvblxufSBmcm9tICdAYWxmcmVzY28vYWNhLXNoYXJlZC9zdG9yZSc7XG5pbXBvcnQge1xuICBDb25maXJtRGlhbG9nQ29tcG9uZW50LFxuICBGb2xkZXJEaWFsb2dDb21wb25lbnQsXG4gIExpYnJhcnlEaWFsb2dDb21wb25lbnQsXG4gIFNoYXJlRGlhbG9nQ29tcG9uZW50LFxuICBOb2RlQXNwZWN0U2VydmljZSxcbiAgTmV3VmVyc2lvblVwbG9hZGVyU2VydmljZSxcbiAgTmV3VmVyc2lvblVwbG9hZGVyRGlhbG9nRGF0YSxcbiAgTmV3VmVyc2lvblVwbG9hZGVyRGF0YSxcbiAgTmV3VmVyc2lvblVwbG9hZGVyRGF0YUFjdGlvbixcbiAgTm9kZXNBcGlTZXJ2aWNlXG59IGZyb20gJ0BhbGZyZXNjby9hZGYtY29udGVudC1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvblNlcnZpY2UsIE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAYWxmcmVzY28vYWRmLWNvcmUnO1xuaW1wb3J0IHtcbiAgRGVsZXRlZE5vZGVzUGFnaW5nLFxuICBNaW5pbWFsTm9kZUVudGl0eSxcbiAgTWluaW1hbE5vZGVFbnRyeUVudGl0eSxcbiAgTm9kZSxcbiAgTm9kZUVudHJ5LFxuICBQYXRoSW5mb0VudGl0eSxcbiAgU2l0ZUJvZHksXG4gIFNpdGVFbnRyeVxufSBmcm9tICdAYWxmcmVzY28vanMtYXBpJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nQ29uZmlnIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCB6aXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgbWVyZ2VNYXAsIHRha2UsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE5vZGVBY3Rpb25zU2VydmljZSB9IGZyb20gJy4vbm9kZS1hY3Rpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW50ZXJmYWNlIFJlc3RvcmVkTm9kZSB7XG4gIHN0YXR1czogbnVtYmVyO1xuICBlbnRyeTogTWluaW1hbE5vZGVFbnRyeUVudGl0eTtcbiAgc3RhdHVzQ29kZT86IG51bWJlcjtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ29udGVudE1hbmFnZW1lbnRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVNZW51QnV0dG9uU2VsZWN0b3IgPSAnYXBwLXRvb2xiYXItbWVudSBidXR0b25baWQ9XCJhcHAudG9vbGJhci5jcmVhdGVcIl0nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbm9kZXNBcGlTZXJ2aWNlOiBOb2Rlc0FwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmU8QXBwU3RvcmU+LFxuICAgIHByaXZhdGUgY29udGVudEFwaTogQ29udGVudEFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwZXJtaXNzaW9uOiBOb2RlUGVybWlzc2lvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2dSZWY6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIG5vZGVBY3Rpb25zU2VydmljZTogTm9kZUFjdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb246IFRyYW5zbGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBub2RlQXNwZWN0U2VydmljZTogTm9kZUFzcGVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcHBIb29rU2VydmljZTogQXBwSG9va1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZXdWZXJzaW9uVXBsb2FkZXJTZXJ2aWNlOiBOZXdWZXJzaW9uVXBsb2FkZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcbiAgKSB7fVxuXG4gIGFkZEZhdm9yaXRlKG5vZGVzOiBBcnJheTxNaW5pbWFsTm9kZUVudGl0eT4pIHtcbiAgICBpZiAobm9kZXMgJiYgbm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb250ZW50QXBpLmFkZEZhdm9yaXRlKG5vZGVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBmYXZvcml0ZU5vZGVzID0gbm9kZXMubWFwKChub2RlKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3Tm9kZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobm9kZSkpO1xuICAgICAgICAgIG5ld05vZGUuZW50cnkuaXNGYXZvcml0ZSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIG5ld05vZGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNldFNlbGVjdGVkTm9kZXNBY3Rpb24oZmF2b3JpdGVOb2RlcykpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlRmF2b3JpdGUobm9kZXM6IEFycmF5PE1pbmltYWxOb2RlRW50aXR5Pikge1xuICAgIGlmIChub2RlcyAmJiBub2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvbnRlbnRBcGkucmVtb3ZlRmF2b3JpdGUobm9kZXMpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZhdm9yaXRlTm9kZXMgPSBub2Rlcy5tYXAoKG5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdOb2RlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShub2RlKSk7XG4gICAgICAgICAgbmV3Tm9kZS5lbnRyeS5pc0Zhdm9yaXRlID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5ld05vZGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNldFNlbGVjdGVkTm9kZXNBY3Rpb24oZmF2b3JpdGVOb2RlcykpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbWFuYWdlVmVyc2lvbnMobm9kZTogYW55LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcj86IHN0cmluZykge1xuICAgIGlmIChub2RlICYmIG5vZGUuZW50cnkpIHtcbiAgICAgIC8vIHNoYXJlZCBhbmQgZmF2b3JpdGVcbiAgICAgIGNvbnN0IGlkID0gbm9kZS5lbnRyeS5ub2RlSWQgfHwgKG5vZGUgYXMgYW55KS5lbnRyeS5ndWlkO1xuXG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXBpLmdldE5vZGVJbmZvKGlkKS5zdWJzY3JpYmUoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgdGhpcy5vcGVuVmVyc2lvbk1hbmFnZXJEaWFsb2coZW50cnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wZW5WZXJzaW9uTWFuYWdlckRpYWxvZyhub2RlLmVudHJ5LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbWFuYWdlQXNwZWN0cyhub2RlOiBhbnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgaWYgKG5vZGUgJiYgbm9kZS5lbnRyeSkge1xuICAgICAgLy8gc2hhcmVkIGFuZCBmYXZvcml0ZVxuICAgICAgY29uc3QgaWQgPSBub2RlLmVudHJ5Lm5vZGVJZCB8fCAobm9kZSBhcyBhbnkpLmVudHJ5Lmd1aWQ7XG5cbiAgICAgIGlmIChpZCkge1xuICAgICAgICB0aGlzLmNvbnRlbnRBcGkuZ2V0Tm9kZUluZm8oaWQpLnN1YnNjcmliZSgoZW50cnkpID0+IHtcbiAgICAgICAgICB0aGlzLm9wZW5Bc3BlY3RMaXN0RGlhbG9nKGVudHJ5LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcGVuQXNwZWN0TGlzdERpYWxvZyhub2RlLmVudHJ5LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmVyc2lvblVwZGF0ZURpYWxvZyhub2RlLCBmaWxlKSB7XG4gICAgdGhpcy5jb250ZW50QXBpLmdldE5vZGVWZXJzaW9ucyhub2RlLmlkKS5zdWJzY3JpYmUoKHsgbGlzdCB9KSA9PiB7XG4gICAgICBjb25zdCBuZXdWZXJzaW9uVXBsb2FkZXJEaWFsb2dEYXRhOiBOZXdWZXJzaW9uVXBsb2FkZXJEaWFsb2dEYXRhID0ge1xuICAgICAgICBub2RlLFxuICAgICAgICBmaWxlLFxuICAgICAgICBjdXJyZW50VmVyc2lvbjogbGlzdC5lbnRyaWVzWzBdLmVudHJ5LFxuICAgICAgICB0aXRsZTogJ1ZFUlNJT04uRElBTE9HLlRJVExFJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGRpYWxvZ0NvbmZpZzogTWF0RGlhbG9nQ29uZmlnID0geyB3aWR0aDogJzYwMHB4JyB9O1xuICAgICAgdGhpcy5uZXdWZXJzaW9uVXBsb2FkZXJTZXJ2aWNlLm9wZW5VcGxvYWROZXdWZXJzaW9uRGlhbG9nKG5ld1ZlcnNpb25VcGxvYWRlckRpYWxvZ0RhdGEsIGRpYWxvZ0NvbmZpZykuc3Vic2NyaWJlKFxuICAgICAgICAoZGF0YTogTmV3VmVyc2lvblVwbG9hZGVyRGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhLmFjdGlvbiA9PT0gTmV3VmVyc2lvblVwbG9hZGVyRGF0YUFjdGlvbi51cGxvYWQpIHtcbiAgICAgICAgICAgIGlmIChkYXRhLm5ld1ZlcnNpb24udmFsdWUuZW50cnkucHJvcGVydGllc1snY206bG9ja1R5cGUnXSA9PT0gJ1dSSVRFX0xPQ0snKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFVubG9ja1dyaXRlQWN0aW9uKGRhdGEubmV3VmVyc2lvbi52YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBTbmFja2JhckVycm9yQWN0aW9uKGVycm9yKSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBzaGFyZU5vZGUobm9kZTogYW55LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcj86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChub2RlICYmIG5vZGUuZW50cnkpIHtcbiAgICAgIC8vIHNoYXJlZCBhbmQgZmF2b3JpdGVcbiAgICAgIGNvbnN0IGlkID0gbm9kZS5lbnRyeS5ub2RlSWQgfHwgKG5vZGUgYXMgYW55KS5lbnRyeS5ndWlkO1xuXG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXBpLmdldE5vZGVJbmZvKGlkKS5zdWJzY3JpYmUoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgdGhpcy5vcGVuU2hhcmVMaW5rRGlhbG9nKHsgZW50cnkgfSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3BlblNoYXJlTGlua0RpYWxvZyhub2RlLCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3BlblNoYXJlTGlua0RpYWxvZyhub2RlLCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcj86IHN0cmluZykge1xuICAgIHRoaXMuc3RvcmVcbiAgICAgIC5zZWxlY3QoZ2V0U2hhcmVkVXJsKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKGJhc2VTaGFyZVVybCkgPT4ge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZlxuICAgICAgICAgIC5vcGVuKFNoYXJlRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICByZXN0b3JlRm9jdXM6IHRydWUsXG4gICAgICAgICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6ICdhZGYtc2hhcmUtbGluay1kaWFsb2cnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICBiYXNlU2hhcmVVcmxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5hZnRlckNsb3NlZCgpXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBTZXRTZWxlY3RlZE5vZGVzQWN0aW9uKFtub2RlXSkpO1xuICAgICAgICAgICAgdGhpcy5hcHBIb29rU2VydmljZS5saW5rc1Vuc2hhcmVkLm5leHQoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNBZnRlckNsb3NlKGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlRm9sZGVyKHBhcmVudE5vZGVJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgZGlhbG9nSW5zdGFuY2UgPSB0aGlzLmRpYWxvZ1JlZi5vcGVuKEZvbGRlckRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgZGF0YToge1xuICAgICAgICBwYXJlbnROb2RlSWQsXG4gICAgICAgIGNyZWF0ZVRpdGxlOiB1bmRlZmluZWQsXG4gICAgICAgIG5vZGVUeXBlOiAnY206Zm9sZGVyJ1xuICAgICAgfSxcbiAgICAgIHdpZHRoOiAnNDAwcHgnLFxuICAgICAgcm9sZTogJ2RpYWxvZydcbiAgICB9KTtcblxuICAgIGRpYWxvZ0luc3RhbmNlLmNvbXBvbmVudEluc3RhbmNlLmVycm9yLnN1YnNjcmliZSgobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBTbmFja2JhckVycm9yQWN0aW9uKG1lc3NhZ2UpKTtcbiAgICB9KTtcblxuICAgIGRpYWxvZ0luc3RhbmNlLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSZWxvYWREb2N1bWVudExpc3RBY3Rpb24oKSk7XG4gICAgICB9XG4gICAgICB0aGlzLmZvY3VzQWZ0ZXJDbG9zZSh0aGlzLmNyZWF0ZU1lbnVCdXR0b25TZWxlY3Rvcik7XG4gICAgfSk7XG4gIH1cblxuICBlZGl0Rm9sZGVyKGZvbGRlcjogTWluaW1hbE5vZGVFbnRpdHksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgaWYgKCFmb2xkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkaWFsb2cgPSB0aGlzLmRpYWxvZ1JlZi5vcGVuKEZvbGRlckRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgZGF0YToge1xuICAgICAgICBmb2xkZXI6IGZvbGRlci5lbnRyeVxuICAgICAgfSxcbiAgICAgIHdpZHRoOiAnNDAwcHgnXG4gICAgfSk7XG5cbiAgICBkaWFsb2cuY29tcG9uZW50SW5zdGFuY2UuZXJyb3Iuc3Vic2NyaWJlKChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24obWVzc2FnZSkpO1xuICAgIH0pO1xuXG4gICAgZGlhbG9nLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICB0aGlzLm5vZGVzQXBpU2VydmljZS5ub2RlVXBkYXRlZC5uZXh0KG5vZGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlTGlicmFyeSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IGRpYWxvZ0luc3RhbmNlID0gdGhpcy5kaWFsb2dSZWYub3BlbihMaWJyYXJ5RGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzQwMHB4J1xuICAgIH0pO1xuXG4gICAgZGlhbG9nSW5zdGFuY2UuY29tcG9uZW50SW5zdGFuY2UuZXJyb3Iuc3Vic2NyaWJlKChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24obWVzc2FnZSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRpYWxvZ0luc3RhbmNlLmFmdGVyQ2xvc2VkKCkucGlwZShcbiAgICAgIHRhcCgobm9kZSkgPT4ge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgIHRoaXMuYXBwSG9va1NlcnZpY2UubGlicmFyeUNyZWF0ZWQubmV4dChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvY3VzQWZ0ZXJDbG9zZSh0aGlzLmNyZWF0ZU1lbnVCdXR0b25TZWxlY3Rvcik7XG4gICAgICB9KSxcbiAgICAgIG1hcCgobm9kZTogU2l0ZUVudHJ5KSA9PiB7XG4gICAgICAgIGlmIChub2RlICYmIG5vZGUuZW50cnkgJiYgbm9kZS5lbnRyeS5ndWlkKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUuZW50cnkuZ3VpZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUxpYnJhcnkoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29udGVudEFwaS5kZWxldGVTaXRlKGlkKS5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwSG9va1NlcnZpY2UubGlicmFyeURlbGV0ZWQubmV4dChpZCk7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNuYWNrYmFySW5mb0FjdGlvbignQVBQLk1FU1NBR0VTLklORk8uTElCUkFSWV9ERUxFVEVEJykpO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5ERUxFVEVfTElCUkFSWV9GQUlMRUQnKSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGxlYXZlTGlicmFyeShzaXRlSWQ6IHN0cmluZywgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1JlZi5vcGVuKENvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdGl0bGU6ICdBUFAuRElBTE9HUy5DT05GSVJNX0xFQVZFLlRJVExFJyxcbiAgICAgICAgbWVzc2FnZTogJ0FQUC5ESUFMT0dTLkNPTkZJUk1fTEVBVkUuTUVTU0FHRScsXG4gICAgICAgIHllc0xhYmVsOiAnQVBQLkRJQUxPR1MuQ09ORklSTV9MRUFWRS5ZRVNfTEFCRUwnLFxuICAgICAgICBub0xhYmVsOiAnQVBQLkRJQUxPR1MuQ09ORklSTV9MRUFWRS5OT19MQUJFTCdcbiAgICAgIH0sXG4gICAgICBtaW5XaWR0aDogJzI1MHB4J1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXBpLmxlYXZlU2l0ZShzaXRlSWQpLnN1YnNjcmliZShcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFwcEhvb2tTZXJ2aWNlLmxpYnJhcnlMZWZ0Lm5leHQoc2l0ZUlkKTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNuYWNrYmFySW5mb0FjdGlvbignQVBQLk1FU1NBR0VTLklORk8uTEVGVF9MSUJSQVJZJykpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5MRUFWRV9MSUJSQVJZX0ZBSUxFRCcpKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmZvY3VzQWZ0ZXJDbG9zZShmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVMaWJyYXJ5KHNpdGVJZDogc3RyaW5nLCBzaXRlQm9keTogU2l0ZUJvZHkpIHtcbiAgICB0aGlzLmNvbnRlbnRBcGkudXBkYXRlTGlicmFyeShzaXRlSWQsIHNpdGVCb2R5KS5zdWJzY3JpYmUoXG4gICAgICAoc2l0ZUVudHJ5OiBTaXRlRW50cnkpID0+IHtcbiAgICAgICAgdGhpcy5hcHBIb29rU2VydmljZS5saWJyYXJ5VXBkYXRlZC5uZXh0KHNpdGVFbnRyeSk7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNuYWNrYmFySW5mb0FjdGlvbignTElCUkFSWS5TVUNDRVNTLkxJQlJBUllfVVBEQVRFRCcpKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oJ0xJQlJBUlkuRVJST1JTLkxJQlJBUllfVVBEQVRFX0VSUk9SJykpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBhc3luYyB1bnNoYXJlTm9kZXMobGlua3M6IEFycmF5PE1pbmltYWxOb2RlRW50aXR5Pikge1xuICAgIGNvbnN0IHByb21pc2VzID0gbGlua3MubWFwKChsaW5rKSA9PiB0aGlzLmNvbnRlbnRBcGkuZGVsZXRlU2hhcmVkTGluayhsaW5rLmVudHJ5LmlkKS50b1Byb21pc2UoKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIHRoaXMuYXBwSG9va1NlcnZpY2UubGlua3NVbnNoYXJlZC5uZXh0KCk7XG4gIH1cblxuICBjYW5VcGRhdGVOb2RlKG5vZGU6IE1pbmltYWxOb2RlRW50aXR5IHwgTm9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb24uY2hlY2sobm9kZSwgWyd1cGRhdGUnXSk7XG4gIH1cblxuICBjYW5VcGxvYWRDb250ZW50KGZvbGRlck5vZGU6IE1pbmltYWxOb2RlRW50aXR5IHwgTm9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb24uY2hlY2soZm9sZGVyTm9kZSwgWydjcmVhdGUnXSk7XG4gIH1cblxuICBwdXJnZURlbGV0ZWROb2Rlcyhub2RlczogTWluaW1hbE5vZGVFbnRpdHlbXSkge1xuICAgIGlmICghbm9kZXMgfHwgbm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dSZWYub3BlbihDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHRpdGxlOiAnQVBQLkRJQUxPR1MuQ09ORklSTV9QVVJHRS5USVRMRScsXG4gICAgICAgIG1lc3NhZ2U6ICdBUFAuRElBTE9HUy5DT05GSVJNX1BVUkdFLk1FU1NBR0UnLFxuICAgICAgICB5ZXNMYWJlbDogJ0FQUC5ESUFMT0dTLkNPTkZJUk1fUFVSR0UuWUVTX0xBQkVMJyxcbiAgICAgICAgbm9MYWJlbDogJ0FQUC5ESUFMT0dTLkNPTkZJUk1fUFVSR0UuTk9fTEFCRUwnXG4gICAgICB9LFxuICAgICAgbWluV2lkdGg6ICcyNTBweCdcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IG5vZGVzVG9EZWxldGU6IE5vZGVJbmZvW10gPSBub2Rlcy5tYXAoKG5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IG5vZGUuZW50cnk7XG4gICAgICAgICAgY29uc3QgaWQgPSAobm9kZSBhcyBhbnkpLmVudHJ5Lm5vZGVJZCB8fCBub2RlLmVudHJ5LmlkO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnB1cmdlTm9kZXMobm9kZXNUb0RlbGV0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXN0b3JlRGVsZXRlZE5vZGVzKHNlbGVjdGlvbjogTWluaW1hbE5vZGVFbnRpdHlbXSA9IFtdKSB7XG4gICAgaWYgKCFzZWxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZXNXaXRoUGF0aCA9IHNlbGVjdGlvbi5maWx0ZXIoKG5vZGUpID0+IG5vZGUuZW50cnkucGF0aCk7XG5cbiAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCAmJiAhbm9kZXNXaXRoUGF0aC5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGZhaWxlZFN0YXR1cyA9IHRoaXMucHJvY2Vzc1N0YXR1cyhbXSk7XG4gICAgICBmYWlsZWRTdGF0dXMuZmFpbC5wdXNoKC4uLnNlbGVjdGlvbik7XG4gICAgICB0aGlzLnNob3dSZXN0b3JlTm90aWZpY2F0aW9uKGZhaWxlZFN0YXR1cyk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSZWxvYWREb2N1bWVudExpc3RBY3Rpb24oKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHN0YXR1czogRGVsZXRlU3RhdHVzO1xuXG4gICAgZm9ya0pvaW4obm9kZXNXaXRoUGF0aC5tYXAoKG5vZGUpID0+IHRoaXMucmVzdG9yZU5vZGUobm9kZSkpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgocmVzdG9yZWROb2RlcykgPT4ge1xuICAgICAgICAgIHN0YXR1cyA9IHRoaXMucHJvY2Vzc1N0YXR1cyhyZXN0b3JlZE5vZGVzKTtcbiAgICAgICAgfSksXG4gICAgICAgIG1lcmdlTWFwKCgpID0+IHRoaXMuY29udGVudEFwaS5nZXREZWxldGVkTm9kZXMoKSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKG5vZGVzOiBEZWxldGVkTm9kZXNQYWdpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWROb2RlcyA9IHRoaXMuZGlmZihzdGF0dXMuZmFpbCwgc2VsZWN0aW9uLCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ05vZGVzID0gdGhpcy5kaWZmKHNlbGVjdGVkTm9kZXMsIG5vZGVzLmxpc3QuZW50cmllcyk7XG5cbiAgICAgICAgaWYgKCFyZW1haW5pbmdOb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnNob3dSZXN0b3JlTm90aWZpY2F0aW9uKHN0YXR1cyk7XG4gICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUmVsb2FkRG9jdW1lbnRMaXN0QWN0aW9uKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVzdG9yZURlbGV0ZWROb2RlcyhyZW1haW5pbmdOb2Rlcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgY29weU5vZGVzKG5vZGVzOiBBcnJheTxNaW5pbWFsTm9kZUVudGl0eT4sIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgemlwKHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlLmNvcHlOb2Rlcyhub2RlcywgdW5kZWZpbmVkLCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3RvciksIHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlLmNvbnRlbnRDb3BpZWQpLnN1YnNjcmliZShcbiAgICAgIChyZXN1bHQpID0+IHtcbiAgICAgICAgY29uc3QgW29wZXJhdGlvblJlc3VsdCwgbmV3SXRlbXNdID0gcmVzdWx0O1xuICAgICAgICB0aGlzLnNob3dDb3B5TWVzc2FnZShvcGVyYXRpb25SZXN1bHQsIG5vZGVzLCBuZXdJdGVtcyk7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd0NvcHlNZXNzYWdlKGVycm9yLCBub2Rlcyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIG1vdmVOb2Rlcyhub2RlczogQXJyYXk8TWluaW1hbE5vZGVFbnRpdHk+LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcj86IHN0cmluZykge1xuICAgIGNvbnN0IHBlcm1pc3Npb25Gb3JNb3ZlID0gJyEnO1xuXG4gICAgemlwKHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlLm1vdmVOb2Rlcyhub2RlcywgcGVybWlzc2lvbkZvck1vdmUsIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKSwgdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UuY29udGVudE1vdmVkKS5zdWJzY3JpYmUoXG4gICAgICAocmVzdWx0KSA9PiB7XG4gICAgICAgIGNvbnN0IFtvcGVyYXRpb25SZXN1bHQsIG1vdmVSZXNwb25zZV0gPSByZXN1bHQ7XG4gICAgICAgIHRoaXMuc2hvd01vdmVNZXNzYWdlKG5vZGVzLCBvcGVyYXRpb25SZXN1bHQsIG1vdmVSZXNwb25zZSk7XG5cbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUmVsb2FkRG9jdW1lbnRMaXN0QWN0aW9uKCkpO1xuICAgICAgfSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnNob3dNb3ZlTWVzc2FnZShub2RlcywgZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBnZXRFcnJvck1lc3NhZ2UoZXJyb3JPYmplY3Q6IHsgbWVzc2FnZTogYW55IH0pOiBzdHJpbmcge1xuICAgIGxldCBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLkdFTkVSSUMnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZXJyb3I6IHsgc3RhdHVzQ29kZSB9XG4gICAgICB9ID0gSlNPTi5wYXJzZShlcnJvck9iamVjdC5tZXNzYWdlKTtcblxuICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwOSkge1xuICAgICAgICBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLk5PREVfTU9WRSc7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLlBFUk1JU1NJT04nO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyogRG8gbm90aGluZywga2VlcCB0aGUgb3JpZ2luYWwgbWVzc2FnZSAqL1xuICAgIH1cblxuICAgIHJldHVybiBpMThuTWVzc2FnZVN0cmluZztcbiAgfVxuXG4gIGdldE5vZGVJbmZvKCk6IE9ic2VydmFibGU8TWluaW1hbE5vZGVFbnRyeUVudGl0eT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLnNlbGVjdChnZXRBcHBTZWxlY3Rpb24pLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgbWVyZ2VNYXAoKHsgZmlsZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gKGZpbGUgYXMgYW55KS5lbnRyeS5ub2RlSWQgfHwgKGZpbGUgYXMgYW55KS5lbnRyeS5ndWlkO1xuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKGZpbGUuZW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkuZ2V0Tm9kZUluZm8oaWQpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICB1bmxvY2tOb2RlKG5vZGU6IE5vZGVFbnRyeSk6IFByb21pc2U8dm9pZCB8IE5vZGVFbnRyeT4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkudW5sb2NrTm9kZShub2RlLmVudHJ5LmlkKS5jYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICBuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5VTkxPQ0tfTk9ERScsIHtcbiAgICAgICAgICBmaWxlTmFtZTogbm9kZS5lbnRyeS5uYW1lXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93Q29weU1lc3NhZ2UoaW5mbzogYW55LCBub2RlczogQXJyYXk8TWluaW1hbE5vZGVFbnRpdHk+LCBuZXdJdGVtcz86IEFycmF5PE1pbmltYWxOb2RlRW50aXR5Pikge1xuICAgIGNvbnN0IG51bWJlck9mQ29waWVkSXRlbXMgPSBuZXdJdGVtcyA/IG5ld0l0ZW1zLmxlbmd0aCA6IDA7XG4gICAgY29uc3QgZmFpbGVkSXRlbXMgPSBub2Rlcy5sZW5ndGggLSBudW1iZXJPZkNvcGllZEl0ZW1zO1xuXG4gICAgbGV0IGkxOG5NZXNzYWdlU3RyaW5nID0gJ0FQUC5NRVNTQUdFUy5FUlJPUlMuR0VORVJJQyc7XG5cbiAgICBpZiAodHlwZW9mIGluZm8gPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoaW5mby50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3N1Y2NlcycpICE9PSAtMSkge1xuICAgICAgICBsZXQgaTE4TWVzc2FnZVN1ZmZpeDtcblxuICAgICAgICBpZiAoZmFpbGVkSXRlbXMpIHtcbiAgICAgICAgICBpZiAobnVtYmVyT2ZDb3BpZWRJdGVtcykge1xuICAgICAgICAgICAgaTE4TWVzc2FnZVN1ZmZpeCA9IG51bWJlck9mQ29waWVkSXRlbXMgPT09IDEgPyAnUEFSVElBTF9TSU5HVUxBUicgOiAnUEFSVElBTF9QTFVSQUwnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpMThNZXNzYWdlU3VmZml4ID0gZmFpbGVkSXRlbXMgPT09IDEgPyAnRkFJTF9TSU5HVUxBUicgOiAnRkFJTF9QTFVSQUwnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpMThNZXNzYWdlU3VmZml4ID0gbnVtYmVyT2ZDb3BpZWRJdGVtcyA9PT0gMSA/ICdTSU5HVUxBUicgOiAnUExVUkFMJztcbiAgICAgICAgfVxuXG4gICAgICAgIGkxOG5NZXNzYWdlU3RyaW5nID0gYEFQUC5NRVNTQUdFUy5JTkZPLk5PREVfQ09QWS4ke2kxOE1lc3NhZ2VTdWZmaXh9YDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGVycm9yOiB7IHN0YXR1c0NvZGUgfVxuICAgICAgICB9ID0gSlNPTi5wYXJzZShpbmZvLm1lc3NhZ2UpO1xuXG4gICAgICAgIGlmIChzdGF0dXNDb2RlID09PSA0MDMpIHtcbiAgICAgICAgICBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLlBFUk1JU1NJT04nO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuXG4gICAgY29uc3QgdW5kbyA9IG51bWJlck9mQ29waWVkSXRlbXMgPiAwID8gdGhpcy50cmFuc2xhdGlvbi5pbnN0YW50KCdBUFAuQUNUSU9OUy5VTkRPJykgOiAnJztcblxuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoaTE4bk1lc3NhZ2VTdHJpbmcsIHtcbiAgICAgIHN1Y2Nlc3M6IG51bWJlck9mQ29waWVkSXRlbXMsXG4gICAgICBmYWlsZWQ6IGZhaWxlZEl0ZW1zXG4gICAgfSk7XG5cbiAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2VcbiAgICAgIC5vcGVuU25hY2tNZXNzYWdlQWN0aW9uKG1lc3NhZ2UsIHVuZG8sIHtcbiAgICAgICAgcGFuZWxDbGFzczogJ2luZm8tc25hY2tiYXInXG4gICAgICB9KVxuICAgICAgLm9uQWN0aW9uKClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy51bmRvQ29weU5vZGVzKG5ld0l0ZW1zKSk7XG4gIH1cblxuICBwcml2YXRlIHVuZG9Db3B5Tm9kZXMobm9kZXM6IE1pbmltYWxOb2RlRW50aXR5W10pIHtcbiAgICBjb25zdCBiYXRjaCA9IHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlXG4gICAgICAuZmxhdHRlbihub2RlcylcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZW50cnkpXG4gICAgICAubWFwKChpdGVtKSA9PiB0aGlzLmNvbnRlbnRBcGkuZGVsZXRlTm9kZShpdGVtLmVudHJ5LmlkLCB7IHBlcm1hbmVudDogdHJ1ZSB9KSk7XG5cbiAgICBmb3JrSm9pbiguLi5iYXRjaCkuc3Vic2NyaWJlKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmFwcEhvb2tTZXJ2aWNlLm5vZGVzRGVsZXRlZC5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSZWxvYWREb2N1bWVudExpc3RBY3Rpb24oKSk7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGxldCBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLkdFTkVSSUMnO1xuXG4gICAgICAgIGxldCBlcnJvckpzb24gPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGVycm9ySnNvbiA9IEpTT04ucGFyc2UoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICBpZiAoZXJyb3JKc29uICYmIGVycm9ySnNvbi5lcnJvciAmJiBlcnJvckpzb24uZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDAzKSB7XG4gICAgICAgICAgaTE4bk1lc3NhZ2VTdHJpbmcgPSAnQVBQLk1FU1NBR0VTLkVSUk9SUy5QRVJNSVNTSU9OJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oaTE4bk1lc3NhZ2VTdHJpbmcpKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuVmVyc2lvbk1hbmFnZXJEaWFsb2cobm9kZTogYW55LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcj86IHN0cmluZykge1xuICAgIC8vIHdvcmthcm91bmQgU2hhcmVkXG4gICAgaWYgKG5vZGUuaXNGaWxlIHx8IG5vZGUubm9kZUlkKSB7XG4gICAgICBjb25zdCBuZXdWZXJzaW9uVXBsb2FkZXJEaWFsb2dEYXRhOiBOZXdWZXJzaW9uVXBsb2FkZXJEaWFsb2dEYXRhID0ge1xuICAgICAgICBub2RlLFxuICAgICAgICBzaG93VmVyc2lvbnNPbmx5OiB0cnVlLFxuICAgICAgICB0aXRsZTogJ1ZFUlNJT04uRElBTE9HLlRJVExFJ1xuICAgICAgfTtcbiAgICAgIHRoaXMubmV3VmVyc2lvblVwbG9hZGVyU2VydmljZVxuICAgICAgICAub3BlblVwbG9hZE5ld1ZlcnNpb25EaWFsb2cobmV3VmVyc2lvblVwbG9hZGVyRGlhbG9nRGF0YSwgeyB3aWR0aDogJzYzMHB4Jywgcm9sZTogJ2RpYWxvZycgfSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChuZXdWZXJzaW9uVXBsb2FkZXJEYXRhOiBOZXdWZXJzaW9uVXBsb2FkZXJEYXRhKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKG5ld1ZlcnNpb25VcGxvYWRlckRhdGEuYWN0aW9uKSB7XG4gICAgICAgICAgICAgIGNhc2UgTmV3VmVyc2lvblVwbG9hZGVyRGF0YUFjdGlvbi5yZWZyZXNoOlxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJlbG9hZERvY3VtZW50TGlzdEFjdGlvbigpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBOZXdWZXJzaW9uVXBsb2FkZXJEYXRhQWN0aW9uLnZpZXc6XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgIG5ldyBWaWV3Tm9kZVZlcnNpb25BY3Rpb24obm9kZS5pZCwgbmV3VmVyc2lvblVwbG9hZGVyRGF0YS52ZXJzaW9uSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IHRoaXMucm91dGVyLnVybFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oJ0FQUC5NRVNTQUdFUy5FUlJPUlMuUEVSTUlTU0lPTicpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9wZW5Bc3BlY3RMaXN0RGlhbG9nKG5vZGU6IGFueSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpIHtcbiAgICAvLyB3b3JrYXJvdW5kIFNoYXJlZFxuICAgIGlmIChub2RlLmlzRmlsZSB8fCBub2RlLmlkKSB7XG4gICAgICB0aGlzLm5vZGVBc3BlY3RTZXJ2aWNlLnVwZGF0ZU5vZGVBc3BlY3RzKG5vZGUuaWQsIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5QRVJNSVNTSU9OJykpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5kb01vdmVOb2Rlcyhtb3ZlUmVzcG9uc2UsIHNlbGVjdGlvblBhcmVudElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtb3ZlZE5vZGVzID0gbW92ZVJlc3BvbnNlICYmIG1vdmVSZXNwb25zZVsnc3VjY2VlZGVkJ10gPyBtb3ZlUmVzcG9uc2VbJ3N1Y2NlZWRlZCddIDogW107XG4gICAgY29uc3QgcGFydGlhbGx5TW92ZWROb2RlcyA9IG1vdmVSZXNwb25zZSAmJiBtb3ZlUmVzcG9uc2VbJ3BhcnRpYWxseVN1Y2NlZWRlZCddID8gbW92ZVJlc3BvbnNlWydwYXJ0aWFsbHlTdWNjZWVkZWQnXSA6IFtdO1xuXG4gICAgY29uc3QgcmVzdG9yZURlbGV0ZWROb2Rlc0JhdGNoID0gdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UubW92ZURlbGV0ZWRFbnRyaWVzLm1hcCgoZm9sZGVyRW50cnkpID0+XG4gICAgICB0aGlzLmNvbnRlbnRBcGkucmVzdG9yZU5vZGUoZm9sZGVyRW50cnkubm9kZUlkIHx8IGZvbGRlckVudHJ5LmlkKS5waXBlKG1hcCgobm9kZSkgPT4gbm9kZS5lbnRyeSkpXG4gICAgKTtcblxuICAgIHppcCguLi5yZXN0b3JlRGVsZXRlZE5vZGVzQmF0Y2gsIG9mKG51bGwpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1lcmdlTWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBub2Rlc1RvQmVNb3ZlZEJhY2sgPSBbLi4ucGFydGlhbGx5TW92ZWROb2RlcywgLi4ubW92ZWROb2Rlc107XG5cbiAgICAgICAgICBjb25zdCByZXZlcnRNb3ZlQmF0Y2ggPSB0aGlzLm5vZGVBY3Rpb25zU2VydmljZVxuICAgICAgICAgICAgLmZsYXR0ZW4obm9kZXNUb0JlTW92ZWRCYWNrKVxuICAgICAgICAgICAgLmZpbHRlcigobm9kZSkgPT4gbm9kZS5lbnRyeSB8fCAobm9kZS5pdGVtTW92ZWQgJiYgbm9kZS5pdGVtTW92ZWQuZW50cnkpKVxuICAgICAgICAgICAgLm1hcCgobm9kZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAobm9kZS5pdGVtTW92ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UubW92ZU5vZGVBY3Rpb24obm9kZS5pdGVtTW92ZWQuZW50cnksIG5vZGUuaW5pdGlhbFBhcmVudElkKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UubW92ZU5vZGVBY3Rpb24obm9kZS5lbnRyeSwgc2VsZWN0aW9uUGFyZW50SWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB6aXAoLi4ucmV2ZXJ0TW92ZUJhdGNoLCBvZihudWxsKSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUmVsb2FkRG9jdW1lbnRMaXN0QWN0aW9uKCkpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBsZXQgbWVzc2FnZSA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLkdFTkVSSUMnO1xuXG4gICAgICAgICAgbGV0IGVycm9ySnNvbiA9IG51bGw7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVycm9ySnNvbiA9IEpTT04ucGFyc2UoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICAgICAgaWYgKGVycm9ySnNvbiAmJiBlcnJvckpzb24uZXJyb3IgJiYgZXJyb3JKc29uLmVycm9yLnN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICAgICAgbWVzc2FnZSA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLlBFUk1JU1NJT04nO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24obWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgZGVsZXRlTm9kZXMoaXRlbXM6IE1pbmltYWxOb2RlRW50aXR5W10pOiB2b2lkIHtcbiAgICBjb25zdCBiYXRjaDogT2JzZXJ2YWJsZTxEZWxldGVkTm9kZUluZm8+W10gPSBbXTtcblxuICAgIGl0ZW1zLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgIGJhdGNoLnB1c2godGhpcy5kZWxldGVOb2RlKG5vZGUpKTtcbiAgICB9KTtcblxuICAgIGZvcmtKb2luKC4uLmJhdGNoKS5zdWJzY3JpYmUoKGRhdGE6IERlbGV0ZWROb2RlSW5mb1tdKSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLnByb2Nlc3NTdGF0dXMoZGF0YSk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5nZXREZWxldGVNZXNzYWdlKHN0YXR1cyk7XG5cbiAgICAgIGlmIChtZXNzYWdlICYmIHN0YXR1cy5zb21lU3VjY2VlZGVkKSB7XG4gICAgICAgIG1lc3NhZ2UudXNlckFjdGlvbiA9IG5ldyBTbmFja2JhclVzZXJBY3Rpb24oJ0FQUC5BQ1RJT05TLlVORE8nLCBuZXcgVW5kb0RlbGV0ZU5vZGVzQWN0aW9uKFsuLi5zdGF0dXMuc3VjY2Vzc10pKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChtZXNzYWdlKTtcblxuICAgICAgaWYgKHN0YXR1cy5zb21lU3VjY2VlZGVkKSB7XG4gICAgICAgIHRoaXMuYXBwSG9va1NlcnZpY2Uubm9kZXNEZWxldGVkLm5leHQoKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUmVsb2FkRG9jdW1lbnRMaXN0QWN0aW9uKCkpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgU2hvd0xvYWRlckFjdGlvbihmYWxzZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgdW5kb0RlbGV0ZU5vZGVzKGl0ZW1zOiBEZWxldGVkTm9kZUluZm9bXSk6IHZvaWQge1xuICAgIGNvbnN0IGJhdGNoOiBPYnNlcnZhYmxlPERlbGV0ZWROb2RlSW5mbz5bXSA9IFtdO1xuXG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgYmF0Y2gucHVzaCh0aGlzLnVuZG9EZWxldGVOb2RlKGl0ZW0pKTtcbiAgICB9KTtcblxuICAgIGZvcmtKb2luKC4uLmJhdGNoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IHByb2Nlc3NlZERhdGEgPSB0aGlzLnByb2Nlc3NTdGF0dXMoZGF0YSk7XG5cbiAgICAgIGlmIChwcm9jZXNzZWREYXRhLmZhaWwubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmdldFVuZG9EZWxldGVNZXNzYWdlKHByb2Nlc3NlZERhdGEpO1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG1lc3NhZ2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzc2VkRGF0YS5zb21lU3VjY2VlZGVkKSB7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJlbG9hZERvY3VtZW50TGlzdEFjdGlvbigpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdW5kb0RlbGV0ZU5vZGUoaXRlbTogRGVsZXRlZE5vZGVJbmZvKTogT2JzZXJ2YWJsZTxEZWxldGVkTm9kZUluZm8+IHtcbiAgICBjb25zdCB7IGlkLCBuYW1lIH0gPSBpdGVtO1xuXG4gICAgcmV0dXJuIHRoaXMuY29udGVudEFwaS5yZXN0b3JlTm9kZShpZCkucGlwZShcbiAgICAgIG1hcCgoKSA9PiAoe1xuICAgICAgICBpZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc3RhdHVzOiAxXG4gICAgICB9KSksXG4gICAgICBjYXRjaEVycm9yKCgpID0+XG4gICAgICAgIG9mKHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHN0YXR1czogMFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFVuZG9EZWxldGVNZXNzYWdlKHN0YXR1czogRGVsZXRlU3RhdHVzKTogU25hY2tiYXJBY3Rpb24ge1xuICAgIGlmIChzdGF0dXMuc29tZUZhaWxlZCAmJiAhc3RhdHVzLm9uZUZhaWxlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckVycm9yQWN0aW9uKCdBUFAuTUVTU0FHRVMuRVJST1JTLk5PREVfUkVTVE9SRV9QTFVSQUwnLCB7IG51bWJlcjogc3RhdHVzLmZhaWwubGVuZ3RoIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMub25lRmFpbGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oJ0FQUC5NRVNTQUdFUy5FUlJPUlMuTk9ERV9SRVNUT1JFJywge1xuICAgICAgICBuYW1lOiBzdGF0dXMuZmFpbFswXS5uYW1lXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZU5vZGUobm9kZTogTWluaW1hbE5vZGVFbnRpdHkpOiBPYnNlcnZhYmxlPFJlc3RvcmVkTm9kZT4ge1xuICAgIGNvbnN0IHsgZW50cnkgfSA9IG5vZGU7XG5cbiAgICByZXR1cm4gdGhpcy5jb250ZW50QXBpLnJlc3RvcmVOb2RlKGVudHJ5LmlkKS5waXBlKFxuICAgICAgbWFwKCgpID0+ICh7XG4gICAgICAgIHN0YXR1czogMSxcbiAgICAgICAgZW50cnlcbiAgICAgIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzQ29kZSB9ID0gSlNPTi5wYXJzZShlcnJvci5tZXNzYWdlKS5lcnJvcjtcblxuICAgICAgICByZXR1cm4gb2Yoe1xuICAgICAgICAgIHN0YXR1czogMCxcbiAgICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICAgIGVudHJ5XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBwdXJnZU5vZGVzKHNlbGVjdGlvbjogTm9kZUluZm9bXSA9IFtdKSB7XG4gICAgaWYgKCFzZWxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYmF0Y2ggPSBzZWxlY3Rpb24ubWFwKChub2RlKSA9PiB0aGlzLnB1cmdlRGVsZXRlZE5vZGUobm9kZSkpO1xuXG4gICAgZm9ya0pvaW4oYmF0Y2gpLnN1YnNjcmliZSgocHVyZ2VkTm9kZXMpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMucHJvY2Vzc1N0YXR1cyhwdXJnZWROb2Rlcyk7XG5cbiAgICAgIGlmIChzdGF0dXMuc3VjY2Vzcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUmVsb2FkRG9jdW1lbnRMaXN0QWN0aW9uKCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuZ2V0UHVyZ2VNZXNzYWdlKHN0YXR1cyk7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwdXJnZURlbGV0ZWROb2RlKG5vZGU6IE5vZGVJbmZvKTogT2JzZXJ2YWJsZTxEZWxldGVkTm9kZUluZm8+IHtcbiAgICBjb25zdCB7IGlkLCBuYW1lIH0gPSBub2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuY29udGVudEFwaS5wdXJnZURlbGV0ZWROb2RlKGlkKS5waXBlKFxuICAgICAgbWFwKCgpID0+ICh7XG4gICAgICAgIHN0YXR1czogMSxcbiAgICAgICAgaWQsXG4gICAgICAgIG5hbWVcbiAgICAgIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT5cbiAgICAgICAgb2Yoe1xuICAgICAgICAgIHN0YXR1czogMCxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBuYW1lXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1N0YXR1cyhkYXRhOiBBcnJheTx7IHN0YXR1czogbnVtYmVyIH0+ID0gW10pOiBEZWxldGVTdGF0dXMge1xuICAgIGNvbnN0IHN0YXR1cyA9IHtcbiAgICAgIGZhaWw6IFtdLFxuICAgICAgc3VjY2VzczogW10sXG4gICAgICBnZXQgc29tZUZhaWxlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5mYWlsLmxlbmd0aDtcbiAgICAgIH0sXG4gICAgICBnZXQgc29tZVN1Y2NlZWRlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5zdWNjZXNzLmxlbmd0aDtcbiAgICAgIH0sXG4gICAgICBnZXQgb25lRmFpbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mYWlsLmxlbmd0aCA9PT0gMTtcbiAgICAgIH0sXG4gICAgICBnZXQgb25lU3VjY2VlZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWNjZXNzLmxlbmd0aCA9PT0gMTtcbiAgICAgIH0sXG4gICAgICBnZXQgYWxsU3VjY2VlZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb21lU3VjY2VlZGVkICYmICF0aGlzLnNvbWVGYWlsZWQ7XG4gICAgICB9LFxuICAgICAgZ2V0IGFsbEZhaWxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29tZUZhaWxlZCAmJiAhdGhpcy5zb21lU3VjY2VlZGVkO1xuICAgICAgfSxcbiAgICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmZhaWwgPSBbXTtcbiAgICAgICAgdGhpcy5zdWNjZXNzID0gW107XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBkYXRhLnJlZHVjZSgoYWNjLCBub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZS5zdGF0dXMpIHtcbiAgICAgICAgYWNjLnN1Y2Nlc3MucHVzaChub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjYy5mYWlsLnB1c2gobm9kZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgc3RhdHVzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHVyZ2VNZXNzYWdlKHN0YXR1czogRGVsZXRlU3RhdHVzKTogU25hY2tiYXJBY3Rpb24ge1xuICAgIGlmIChzdGF0dXMub25lU3VjY2VlZGVkICYmIHN0YXR1cy5zb21lRmFpbGVkICYmICFzdGF0dXMub25lRmFpbGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFyV2FybmluZ0FjdGlvbignQVBQLk1FU1NBR0VTLklORk8uVFJBU0guTk9ERVNfUFVSR0UuUEFSVElBTF9TSU5HVUxBUicsIHtcbiAgICAgICAgbmFtZTogc3RhdHVzLnN1Y2Nlc3NbMF0ubmFtZSxcbiAgICAgICAgZmFpbGVkOiBzdGF0dXMuZmFpbC5sZW5ndGhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMuc29tZVN1Y2NlZWRlZCAmJiAhc3RhdHVzLm9uZVN1Y2NlZWRlZCAmJiBzdGF0dXMuc29tZUZhaWxlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2Jhcldhcm5pbmdBY3Rpb24oJ0FQUC5NRVNTQUdFUy5JTkZPLlRSQVNILk5PREVTX1BVUkdFLlBBUlRJQUxfUExVUkFMJywge1xuICAgICAgICBudW1iZXI6IHN0YXR1cy5zdWNjZXNzLmxlbmd0aCxcbiAgICAgICAgZmFpbGVkOiBzdGF0dXMuZmFpbC5sZW5ndGhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMub25lU3VjY2VlZGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFySW5mb0FjdGlvbignQVBQLk1FU1NBR0VTLklORk8uVFJBU0guTk9ERVNfUFVSR0UuU0lOR1VMQVInLCB7IG5hbWU6IHN0YXR1cy5zdWNjZXNzWzBdLm5hbWUgfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5vbmVGYWlsZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5UUkFTSC5OT0RFU19QVVJHRS5TSU5HVUxBUicsIHsgbmFtZTogc3RhdHVzLmZhaWxbMF0ubmFtZSB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLmFsbFN1Y2NlZWRlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckluZm9BY3Rpb24oJ0FQUC5NRVNTQUdFUy5JTkZPLlRSQVNILk5PREVTX1BVUkdFLlBMVVJBTCcsIHsgbnVtYmVyOiBzdGF0dXMuc3VjY2Vzcy5sZW5ndGggfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5hbGxGYWlsZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5UUkFTSC5OT0RFU19QVVJHRS5QTFVSQUwnLCB7IG51bWJlcjogc3RhdHVzLmZhaWwubGVuZ3RoIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93UmVzdG9yZU5vdGlmaWNhdGlvbihzdGF0dXM6IERlbGV0ZVN0YXR1cyk6IHZvaWQge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmdldFJlc3RvcmVNZXNzYWdlKHN0YXR1cyk7XG5cbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgaWYgKHN0YXR1cy5vbmVTdWNjZWVkZWQgJiYgIXN0YXR1cy5zb21lRmFpbGVkKSB7XG4gICAgICAgIGNvbnN0IGlzU2l0ZSA9IHRoaXMuaXNTaXRlKHN0YXR1cy5zdWNjZXNzWzBdLmVudHJ5KTtcbiAgICAgICAgY29uc3QgcGF0aDogUGF0aEluZm9FbnRpdHkgPSBzdGF0dXMuc3VjY2Vzc1swXS5lbnRyeS5wYXRoO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmVsZW1lbnRzW3BhdGguZWxlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IHJvdXRlID0gaXNTaXRlID8gWycvbGlicmFyaWVzJywgcGFyZW50LmlkXSA6IFsnL3BlcnNvbmFsLWZpbGVzJywgcGFyZW50LmlkXTtcblxuICAgICAgICBsZXQgbmF2aWdhdGU7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNMaWJyYXJ5Q29udGVudChwYXRoKSkge1xuICAgICAgICAgIG5hdmlnYXRlID0gbmV3IE5hdmlnYXRlVG9QYXJlbnRGb2xkZXIoc3RhdHVzLnN1Y2Nlc3NbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5hdmlnYXRlID0gbmV3IE5hdmlnYXRlUm91dGVBY3Rpb24ocm91dGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVzc2FnZS51c2VyQWN0aW9uID0gbmV3IFNuYWNrYmFyVXNlckFjdGlvbignQVBQLkFDVElPTlMuVklFVycsIG5hdmlnYXRlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzU2l0ZShlbnRyeTogTWluaW1hbE5vZGVFbnRyeUVudGl0eSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlbnRyeS5ub2RlVHlwZSA9PT0gJ3N0OnNpdGUnO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xpYnJhcnlDb250ZW50KHBhdGg6IFBhdGhJbmZvRW50aXR5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBhdGggJiYgcGF0aC5lbGVtZW50cy5sZW5ndGggPj0gMiAmJiBwYXRoLmVsZW1lbnRzWzFdLm5hbWUgPT09ICdTaXRlcyc7XG4gIH1cblxuICBwcml2YXRlIGdldFJlc3RvcmVNZXNzYWdlKHN0YXR1czogRGVsZXRlU3RhdHVzKTogU25hY2tiYXJBY3Rpb24ge1xuICAgIGlmIChzdGF0dXMuc29tZUZhaWxlZCAmJiAhc3RhdHVzLm9uZUZhaWxlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckVycm9yQWN0aW9uKCdBUFAuTUVTU0FHRVMuRVJST1JTLlRSQVNILk5PREVTX1JFU1RPUkUuUEFSVElBTF9QTFVSQUwnLCB7XG4gICAgICAgIG51bWJlcjogc3RhdHVzLmZhaWwubGVuZ3RoXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLm9uZUZhaWxlZCAmJiBzdGF0dXMuZmFpbFswXS5zdGF0dXNDb2RlKSB7XG4gICAgICBpZiAoc3RhdHVzLmZhaWxbMF0uc3RhdHVzQ29kZSA9PT0gNDA5KSB7XG4gICAgICAgIHJldHVybiBuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5UUkFTSC5OT0RFU19SRVNUT1JFLk5PREVfRVhJU1RTJywge1xuICAgICAgICAgIG5hbWU6IHN0YXR1cy5mYWlsWzBdLmVudHJ5Lm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oJ0FQUC5NRVNTQUdFUy5FUlJPUlMuVFJBU0guTk9ERVNfUkVTVE9SRS5HRU5FUklDJywge1xuICAgICAgICAgIG5hbWU6IHN0YXR1cy5mYWlsWzBdLmVudHJ5Lm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5vbmVGYWlsZWQgJiYgIXN0YXR1cy5mYWlsWzBdLnN0YXR1c0NvZGUpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5UUkFTSC5OT0RFU19SRVNUT1JFLkxPQ0FUSU9OX01JU1NJTkcnLCB7XG4gICAgICAgIG5hbWU6IHN0YXR1cy5mYWlsWzBdLmVudHJ5Lm5hbWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMuYWxsU3VjY2VlZGVkICYmICFzdGF0dXMub25lU3VjY2VlZGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFySW5mb0FjdGlvbignQVBQLk1FU1NBR0VTLklORk8uVFJBU0guTk9ERVNfUkVTVE9SRS5QTFVSQUwnKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLmFsbFN1Y2NlZWRlZCAmJiBzdGF0dXMub25lU3VjY2VlZGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFySW5mb0FjdGlvbignQVBQLk1FU1NBR0VTLklORk8uVFJBU0guTk9ERVNfUkVTVE9SRS5TSU5HVUxBUicsIHtcbiAgICAgICAgbmFtZTogc3RhdHVzLnN1Y2Nlc3NbMF0uZW50cnkubmFtZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGRpZmYoc2VsZWN0aW9uOiBhbnlbXSwgbGlzdDogYW55W10sIGZyb21MaXN0ID0gdHJ1ZSk6IGFueSB7XG4gICAgY29uc3QgaWRzID0gc2VsZWN0aW9uLm1hcCgoaXRlbSkgPT4gaXRlbS5lbnRyeS5pZCk7XG5cbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgIGlmIChmcm9tTGlzdCkge1xuICAgICAgICByZXR1cm4gaWRzLmluY2x1ZGVzKGl0ZW0uZW50cnkuaWQpID8gaXRlbSA6IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gIWlkcy5pbmNsdWRlcyhpdGVtLmVudHJ5LmlkKSA/IGl0ZW0gOiBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxldGVOb2RlKG5vZGU6IGFueSk6IE9ic2VydmFibGU8RGVsZXRlZE5vZGVJbmZvPiB7XG4gICAgY29uc3QgeyBuYW1lIH0gPSBub2RlLmVudHJ5O1xuICAgIGNvbnN0IGlkID0gbm9kZS5lbnRyeS5ub2RlSWQgfHwgbm9kZS5lbnRyeS5pZDtcblxuICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkuZGVsZXRlTm9kZShpZCkucGlwZShcbiAgICAgIG1hcCgoKSA9PiAoe1xuICAgICAgICBpZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc3RhdHVzOiAxXG4gICAgICB9KSksXG4gICAgICBjYXRjaEVycm9yKCgpID0+XG4gICAgICAgIG9mKHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHN0YXR1czogMFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldERlbGV0ZU1lc3NhZ2Uoc3RhdHVzOiBEZWxldGVTdGF0dXMpOiBTbmFja2JhckFjdGlvbiB7XG4gICAgaWYgKHN0YXR1cy5hbGxGYWlsZWQgJiYgIXN0YXR1cy5vbmVGYWlsZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5OT0RFX0RFTEVUSU9OX1BMVVJBTCcsIHsgbnVtYmVyOiBzdGF0dXMuZmFpbC5sZW5ndGggfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5hbGxTdWNjZWVkZWQgJiYgIXN0YXR1cy5vbmVTdWNjZWVkZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJJbmZvQWN0aW9uKCdBUFAuTUVTU0FHRVMuSU5GTy5OT0RFX0RFTEVUSU9OLlBMVVJBTCcsIHtcbiAgICAgICAgbnVtYmVyOiBzdGF0dXMuc3VjY2Vzcy5sZW5ndGhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMuc29tZUZhaWxlZCAmJiBzdGF0dXMuc29tZVN1Y2NlZWRlZCAmJiAhc3RhdHVzLm9uZVN1Y2NlZWRlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2Jhcldhcm5pbmdBY3Rpb24oJ0FQUC5NRVNTQUdFUy5JTkZPLk5PREVfREVMRVRJT04uUEFSVElBTF9QTFVSQUwnLCB7XG4gICAgICAgIHN1Y2Nlc3M6IHN0YXR1cy5zdWNjZXNzLmxlbmd0aCxcbiAgICAgICAgZmFpbGVkOiBzdGF0dXMuZmFpbC5sZW5ndGhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMuc29tZUZhaWxlZCAmJiBzdGF0dXMub25lU3VjY2VlZGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFyV2FybmluZ0FjdGlvbignQVBQLk1FU1NBR0VTLklORk8uTk9ERV9ERUxFVElPTi5QQVJUSUFMX1NJTkdVTEFSJywge1xuICAgICAgICBzdWNjZXNzOiBzdGF0dXMuc3VjY2Vzcy5sZW5ndGgsXG4gICAgICAgIGZhaWxlZDogc3RhdHVzLmZhaWwubGVuZ3RoXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLm9uZUZhaWxlZCAmJiAhc3RhdHVzLnNvbWVTdWNjZWVkZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5OT0RFX0RFTEVUSU9OJywge1xuICAgICAgICBuYW1lOiBzdGF0dXMuZmFpbFswXS5uYW1lXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLm9uZVN1Y2NlZWRlZCAmJiAhc3RhdHVzLnNvbWVGYWlsZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJJbmZvQWN0aW9uKCdBUFAuTUVTU0FHRVMuSU5GTy5OT0RFX0RFTEVUSU9OLlNJTkdVTEFSJywgeyBuYW1lOiBzdGF0dXMuc3VjY2Vzc1swXS5uYW1lIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93TW92ZU1lc3NhZ2Uobm9kZXM6IEFycmF5PE1pbmltYWxOb2RlRW50aXR5PiwgaW5mbzogYW55LCBtb3ZlUmVzcG9uc2U/OiBhbnkpIHtcbiAgICBjb25zdCBzdWNjZWVkZWQgPSBtb3ZlUmVzcG9uc2UgJiYgbW92ZVJlc3BvbnNlWydzdWNjZWVkZWQnXSA/IG1vdmVSZXNwb25zZVsnc3VjY2VlZGVkJ10ubGVuZ3RoIDogMDtcbiAgICBjb25zdCBwYXJ0aWFsbHlTdWNjZWVkZWQgPSBtb3ZlUmVzcG9uc2UgJiYgbW92ZVJlc3BvbnNlWydwYXJ0aWFsbHlTdWNjZWVkZWQnXSA/IG1vdmVSZXNwb25zZVsncGFydGlhbGx5U3VjY2VlZGVkJ10ubGVuZ3RoIDogMDtcbiAgICBjb25zdCBmYWlsdXJlcyA9IG1vdmVSZXNwb25zZSAmJiBtb3ZlUmVzcG9uc2VbJ2ZhaWxlZCddID8gbW92ZVJlc3BvbnNlWydmYWlsZWQnXS5sZW5ndGggOiAwO1xuXG4gICAgbGV0IHN1Y2Nlc3NNZXNzYWdlID0gJyc7XG4gICAgbGV0IHBhcnRpYWxTdWNjZXNzTWVzc2FnZSA9ICcnO1xuICAgIGxldCBmYWlsZWRNZXNzYWdlID0gJyc7XG4gICAgbGV0IGVycm9yTWVzc2FnZSA9ICcnO1xuXG4gICAgaWYgKHR5cGVvZiBpbmZvID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gaW4gY2FzZSBvZiBzdWNjZXNzXG4gICAgICBpZiAoaW5mby50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3N1Y2NlcycpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuSU5GTy5OT0RFX01PVkUuJztcbiAgICAgICAgbGV0IGkxOE1lc3NhZ2VTdWZmaXggPSAnJztcblxuICAgICAgICBpZiAoc3VjY2VlZGVkKSB7XG4gICAgICAgICAgaTE4TWVzc2FnZVN1ZmZpeCA9IHN1Y2NlZWRlZCA9PT0gMSA/ICdTSU5HVUxBUicgOiAnUExVUkFMJztcbiAgICAgICAgICBzdWNjZXNzTWVzc2FnZSA9IGAke2kxOG5NZXNzYWdlU3RyaW5nfSR7aTE4TWVzc2FnZVN1ZmZpeH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnRpYWxseVN1Y2NlZWRlZCkge1xuICAgICAgICAgIGkxOE1lc3NhZ2VTdWZmaXggPSBwYXJ0aWFsbHlTdWNjZWVkZWQgPT09IDEgPyAnUEFSVElBTC5TSU5HVUxBUicgOiAnUEFSVElBTC5QTFVSQUwnO1xuICAgICAgICAgIHBhcnRpYWxTdWNjZXNzTWVzc2FnZSA9IGAke2kxOG5NZXNzYWdlU3RyaW5nfSR7aTE4TWVzc2FnZVN1ZmZpeH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZhaWx1cmVzKSB7XG4gICAgICAgICAgLy8gaWYgbW92aW5nIGZhaWxlZCBmb3IgQUxMIG5vZGVzLCBlbWl0IGVycm9yXG4gICAgICAgICAgaWYgKGZhaWx1cmVzID09PSBub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlLmZsYXR0ZW4obW92ZVJlc3BvbnNlWydmYWlsZWQnXSk7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSB0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvcnNbMF0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpMThNZXNzYWdlU3VmZml4ID0gJ1BBUlRJQUwuRkFJTCc7XG4gICAgICAgICAgICBmYWlsZWRNZXNzYWdlID0gYCR7aTE4bk1lc3NhZ2VTdHJpbmd9JHtpMThNZXNzYWdlU3VmZml4fWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSAnQVBQLk1FU1NBR0VTLkVSUk9SUy5HRU5FUklDJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3JNZXNzYWdlID0gdGhpcy5nZXRFcnJvck1lc3NhZ2UoaW5mbyk7XG4gICAgfVxuXG4gICAgY29uc3QgdW5kbyA9IHN1Y2NlZWRlZCArIHBhcnRpYWxseVN1Y2NlZWRlZCA+IDAgPyB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoJ0FQUC5BQ1RJT05TLlVORE8nKSA6ICcnO1xuICAgIGZhaWxlZE1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UgPyBlcnJvck1lc3NhZ2UgOiBmYWlsZWRNZXNzYWdlO1xuXG4gICAgY29uc3QgYmVmb3JlUGFydGlhbFN1Y2Nlc3NNZXNzYWdlID0gc3VjY2Vzc01lc3NhZ2UgJiYgcGFydGlhbFN1Y2Nlc3NNZXNzYWdlID8gJyAnIDogJyc7XG4gICAgY29uc3QgYmVmb3JlRmFpbGVkTWVzc2FnZSA9IChzdWNjZXNzTWVzc2FnZSB8fCBwYXJ0aWFsU3VjY2Vzc01lc3NhZ2UpICYmIGZhaWxlZE1lc3NhZ2UgPyAnICcgOiAnJztcblxuICAgIGNvbnN0IGluaXRpYWxQYXJlbnRJZCA9IHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlLmdldEVudHJ5UGFyZW50SWQobm9kZXNbMF0uZW50cnkpO1xuXG4gICAgY29uc3QgbWVzc2FnZXMgPSB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoW3N1Y2Nlc3NNZXNzYWdlLCBwYXJ0aWFsU3VjY2Vzc01lc3NhZ2UsIGZhaWxlZE1lc3NhZ2VdLCB7XG4gICAgICBzdWNjZXNzOiBzdWNjZWVkZWQsXG4gICAgICBmYWlsZWQ6IGZhaWx1cmVzLFxuICAgICAgcGFydGlhbGx5OiBwYXJ0aWFsbHlTdWNjZWVkZWRcbiAgICB9KTtcblxuICAgIC8vIFRPRE86IHJldmlldyBpbiB0ZXJtcyBvZiBpMThuXG4gICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlXG4gICAgICAub3BlblNuYWNrTWVzc2FnZUFjdGlvbihcbiAgICAgICAgbWVzc2FnZXNbc3VjY2Vzc01lc3NhZ2VdICsgYmVmb3JlUGFydGlhbFN1Y2Nlc3NNZXNzYWdlICsgbWVzc2FnZXNbcGFydGlhbFN1Y2Nlc3NNZXNzYWdlXSArIGJlZm9yZUZhaWxlZE1lc3NhZ2UgKyBtZXNzYWdlc1tmYWlsZWRNZXNzYWdlXSxcbiAgICAgICAgdW5kbyxcbiAgICAgICAge1xuICAgICAgICAgIHBhbmVsQ2xhc3M6ICdpbmZvLXNuYWNrYmFyJ1xuICAgICAgICB9XG4gICAgICApXG4gICAgICAub25BY3Rpb24oKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVuZG9Nb3ZlTm9kZXMobW92ZVJlc3BvbnNlLCBpbml0aWFsUGFyZW50SWQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNBZnRlckNsb3NlKGZvY3VzZWRFbGVtZW50U2VsZWN0b3I6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChmb2N1c2VkRWxlbWVudFNlbGVjdG9yKSB7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50Pihmb2N1c2VkRWxlbWVudFNlbGVjdG9yKT8uZm9jdXMoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==