@alfresco/aca-content 4.0.0-A.2-9984

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