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