@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,609 @@
|
|
|
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 { Injectable } from '@angular/core';
|
|
25
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
26
|
+
import { Subject, of, zip, from } from 'rxjs';
|
|
27
|
+
import { ThumbnailService, TranslationService } from '@alfresco/adf-core';
|
|
28
|
+
import { AlfrescoApiService, DocumentListService, ContentNodeSelectorComponent, ContentNodeDialogService, NodeAction, ContentService } from '@alfresco/adf-content-services';
|
|
29
|
+
import { SitePaging, NodesApi } from '@alfresco/js-api';
|
|
30
|
+
import { ContentApiService } from '@alfresco/aca-shared';
|
|
31
|
+
import { catchError, map, mergeMap } from 'rxjs/operators';
|
|
32
|
+
import * as i0 from "@angular/core";
|
|
33
|
+
import * as i1 from "@alfresco/adf-content-services";
|
|
34
|
+
import * as i2 from "@alfresco/aca-shared";
|
|
35
|
+
import * as i3 from "@angular/material/dialog";
|
|
36
|
+
import * as i4 from "@alfresco/adf-core";
|
|
37
|
+
class NodeActionsService {
|
|
38
|
+
contentService;
|
|
39
|
+
contentApi;
|
|
40
|
+
dialog;
|
|
41
|
+
documentListService;
|
|
42
|
+
apiService;
|
|
43
|
+
translation;
|
|
44
|
+
thumbnailService;
|
|
45
|
+
contentCopied = new Subject();
|
|
46
|
+
contentMoved = new Subject();
|
|
47
|
+
moveDeletedEntries = [];
|
|
48
|
+
isSitesDestinationAvailable = false;
|
|
49
|
+
_nodesApi;
|
|
50
|
+
get nodesApi() {
|
|
51
|
+
this._nodesApi = this._nodesApi ?? new NodesApi(this.apiService.getInstance());
|
|
52
|
+
return this._nodesApi;
|
|
53
|
+
}
|
|
54
|
+
constructor(contentService, contentApi, dialog, documentListService, apiService, translation, thumbnailService) {
|
|
55
|
+
this.contentService = contentService;
|
|
56
|
+
this.contentApi = contentApi;
|
|
57
|
+
this.dialog = dialog;
|
|
58
|
+
this.documentListService = documentListService;
|
|
59
|
+
this.apiService = apiService;
|
|
60
|
+
this.translation = translation;
|
|
61
|
+
this.thumbnailService = thumbnailService;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Copy node list
|
|
65
|
+
*
|
|
66
|
+
* @param contentEntities nodes to copy
|
|
67
|
+
* @param permission permission which is needed to apply the action
|
|
68
|
+
* @param focusedElementOnCloseSelector element's selector which should be autofocused after closing modal
|
|
69
|
+
*/
|
|
70
|
+
copyNodes(contentEntities, permission, focusedElementOnCloseSelector) {
|
|
71
|
+
return this.doBatchOperation(NodeAction.COPY, contentEntities, permission, focusedElementOnCloseSelector);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Move node list
|
|
75
|
+
*
|
|
76
|
+
* @param contentEntities nodes to move
|
|
77
|
+
* @param permission permission which is needed to apply the action
|
|
78
|
+
* @param focusedElementOnCloseSelector element's selector which should be autofocused after closing modal
|
|
79
|
+
*/
|
|
80
|
+
moveNodes(contentEntities, permission, focusedElementOnCloseSelector) {
|
|
81
|
+
return this.doBatchOperation(NodeAction.MOVE, contentEntities, permission, focusedElementOnCloseSelector);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* General method for performing the given operation (copy|move) to multiple nodes
|
|
85
|
+
*
|
|
86
|
+
* @param action the action to perform (copy|move)
|
|
87
|
+
* @param contentEntities the contentEntities which have to have the action performed on
|
|
88
|
+
* @param permission permission which is needed to apply the action
|
|
89
|
+
* @param focusedElementOnCloseSelector element's selector which should be autofocused after closing modal
|
|
90
|
+
*/
|
|
91
|
+
doBatchOperation(action, contentEntities, permission, focusedElementOnCloseSelector) {
|
|
92
|
+
const observable = new Subject();
|
|
93
|
+
if (!this.isEntryEntitiesArray(contentEntities)) {
|
|
94
|
+
observable.error(new Error(JSON.stringify({ error: { statusCode: 400 } })));
|
|
95
|
+
}
|
|
96
|
+
else if (this.checkPermission(action, contentEntities, permission)) {
|
|
97
|
+
const destinationSelection = this.getContentNodeSelection(action, contentEntities, focusedElementOnCloseSelector);
|
|
98
|
+
destinationSelection.subscribe((selections) => {
|
|
99
|
+
const contentEntry = contentEntities[0].entry;
|
|
100
|
+
// Check if there's nodeId for Shared Files
|
|
101
|
+
const contentEntryId = contentEntry.nodeId || contentEntry.id;
|
|
102
|
+
const type = contentEntry.isFolder ? 'folder' : 'content';
|
|
103
|
+
const batch = [];
|
|
104
|
+
// consider only first item in the selection
|
|
105
|
+
const selection = selections[0];
|
|
106
|
+
let action$;
|
|
107
|
+
if (action === NodeAction.MOVE && contentEntities.length === 1 && type === 'content') {
|
|
108
|
+
action$ = this.documentListService.moveNode(contentEntryId, selection.id);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
contentEntities.forEach((node) => {
|
|
112
|
+
// batch.push(this.copyNodeAction(node.entry, selection.id));
|
|
113
|
+
batch.push(this[`${action.toLowerCase()}NodeAction`](node.entry, selection.id));
|
|
114
|
+
});
|
|
115
|
+
action$ = zip(...batch);
|
|
116
|
+
}
|
|
117
|
+
action$.subscribe((newContent) => {
|
|
118
|
+
observable.next(`OPERATION.SUCCESS.${type.toUpperCase()}.${action.toUpperCase()}`);
|
|
119
|
+
const processedData = this.processResponse(newContent);
|
|
120
|
+
if (action === NodeAction.COPY) {
|
|
121
|
+
this.contentCopied.next(processedData.succeeded);
|
|
122
|
+
}
|
|
123
|
+
else if (action === NodeAction.MOVE) {
|
|
124
|
+
this.contentMoved.next(processedData);
|
|
125
|
+
}
|
|
126
|
+
}, observable.error.bind(observable));
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
observable.error(new Error(JSON.stringify({ error: { statusCode: 403 } })));
|
|
131
|
+
}
|
|
132
|
+
return observable;
|
|
133
|
+
}
|
|
134
|
+
isEntryEntitiesArray(contentEntities) {
|
|
135
|
+
if (contentEntities?.length) {
|
|
136
|
+
const nonEntryNode = contentEntities.find((node) => !(node?.entry?.nodeId || node?.entry?.id));
|
|
137
|
+
return !nonEntryNode;
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
checkPermission(action, contentEntities, permission) {
|
|
142
|
+
const notAllowedNode = contentEntities.find((node) => !this.isActionAllowed(action, node.entry, permission));
|
|
143
|
+
return !notAllowedNode;
|
|
144
|
+
}
|
|
145
|
+
getEntryParentId(nodeEntry) {
|
|
146
|
+
let entryParentId = '';
|
|
147
|
+
if (nodeEntry.parentId) {
|
|
148
|
+
entryParentId = nodeEntry.parentId;
|
|
149
|
+
}
|
|
150
|
+
else if (nodeEntry.path?.elements?.length) {
|
|
151
|
+
entryParentId = nodeEntry.path.elements[nodeEntry.path.elements.length - 1].id;
|
|
152
|
+
}
|
|
153
|
+
return entryParentId;
|
|
154
|
+
}
|
|
155
|
+
getContentNodeSelection(action, contentEntities, focusedElementOnCloseSelector) {
|
|
156
|
+
const currentParentFolderId = this.getEntryParentId(contentEntities[0].entry);
|
|
157
|
+
const customDropdown = new SitePaging({
|
|
158
|
+
list: {
|
|
159
|
+
entries: [
|
|
160
|
+
{
|
|
161
|
+
entry: {
|
|
162
|
+
guid: '-my-',
|
|
163
|
+
title: this.translation.instant('APP.BROWSE.PERSONAL.SIDENAV_LINK.LABEL')
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
entry: {
|
|
168
|
+
guid: '-mysites-',
|
|
169
|
+
title: this.translation.instant('APP.BROWSE.LIBRARIES.MENU.MY_LIBRARIES.SIDENAV_LINK.LABEL')
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
]
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
const title = this.getTitleTranslation(action, contentEntities);
|
|
176
|
+
this.isSitesDestinationAvailable = false;
|
|
177
|
+
const data = {
|
|
178
|
+
selectionMode: 'single',
|
|
179
|
+
title,
|
|
180
|
+
currentFolderId: currentParentFolderId,
|
|
181
|
+
actionName: action,
|
|
182
|
+
dropdownHideMyFiles: true,
|
|
183
|
+
dropdownSiteList: customDropdown,
|
|
184
|
+
rowFilter: this.rowFilter.bind(this),
|
|
185
|
+
imageResolver: this.imageResolver.bind(this),
|
|
186
|
+
isSelectionValid: this.canCopyMoveInsideIt.bind(this),
|
|
187
|
+
breadcrumbTransform: this.customizeBreadcrumb.bind(this),
|
|
188
|
+
select: new Subject(),
|
|
189
|
+
excludeSiteContent: ContentNodeDialogService.nonDocumentSiteContent
|
|
190
|
+
};
|
|
191
|
+
this.dialog
|
|
192
|
+
.open(ContentNodeSelectorComponent, {
|
|
193
|
+
data,
|
|
194
|
+
panelClass: 'adf-content-node-selector-dialog',
|
|
195
|
+
width: '630px',
|
|
196
|
+
role: 'dialog'
|
|
197
|
+
})
|
|
198
|
+
.afterClosed()
|
|
199
|
+
.subscribe(() => this.focusAfterClose(focusedElementOnCloseSelector));
|
|
200
|
+
data.select.subscribe({
|
|
201
|
+
complete: this.close.bind(this)
|
|
202
|
+
});
|
|
203
|
+
return data.select;
|
|
204
|
+
}
|
|
205
|
+
getTitleTranslation(action, nodes = []) {
|
|
206
|
+
let keyPrefix = 'ITEMS';
|
|
207
|
+
let name = '';
|
|
208
|
+
if (nodes.length === 1 && nodes[0].entry.name) {
|
|
209
|
+
name = nodes[0].entry.name;
|
|
210
|
+
keyPrefix = 'ITEM';
|
|
211
|
+
}
|
|
212
|
+
const number = nodes.length;
|
|
213
|
+
return this.translation.instant(`NODE_SELECTOR.${action.toUpperCase()}_${keyPrefix}`, { name, number });
|
|
214
|
+
}
|
|
215
|
+
canCopyMoveInsideIt(entry) {
|
|
216
|
+
return this.hasEntityCreatePermission(entry) && !this.isSite(entry);
|
|
217
|
+
}
|
|
218
|
+
hasEntityCreatePermission(entry) {
|
|
219
|
+
return this.contentService.hasAllowableOperations(entry, 'create');
|
|
220
|
+
}
|
|
221
|
+
isSite(entry) {
|
|
222
|
+
return !!entry.guid || entry.nodeType === 'st:site' || entry.nodeType === 'st:sites';
|
|
223
|
+
}
|
|
224
|
+
close() {
|
|
225
|
+
this.dialog.closeAll();
|
|
226
|
+
}
|
|
227
|
+
// todo: review this approach once 5.2.3 is out
|
|
228
|
+
customizeBreadcrumb(node) {
|
|
229
|
+
if (node?.path?.elements) {
|
|
230
|
+
const elements = node.path.elements;
|
|
231
|
+
if (elements.length > 1) {
|
|
232
|
+
if (elements[1].name === 'User Homes') {
|
|
233
|
+
elements.splice(0, 2);
|
|
234
|
+
// make sure first item is 'Personal Files'
|
|
235
|
+
if (elements[0]) {
|
|
236
|
+
elements[0].name = this.translation.instant('APP.BROWSE.PERSONAL.TITLE');
|
|
237
|
+
elements[0].id = '-my-';
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
node.name = this.translation.instant('APP.BROWSE.PERSONAL.TITLE');
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
else if (elements[1].name === 'Sites') {
|
|
244
|
+
this.normalizeSitePath(node);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
else if (elements.length === 1) {
|
|
248
|
+
if (node.name === 'Sites') {
|
|
249
|
+
node.name = this.translation.instant('APP.BROWSE.LIBRARIES.MENU.MY_LIBRARIES.TITLE');
|
|
250
|
+
elements.splice(0, 1);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
else if (node === null && this.isSitesDestinationAvailable) {
|
|
255
|
+
node = {
|
|
256
|
+
name: this.translation.instant('APP.BROWSE.LIBRARIES.MENU.MY_LIBRARIES.TITLE'),
|
|
257
|
+
path: { elements: [] }
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
return node;
|
|
261
|
+
}
|
|
262
|
+
// todo: review this approach once 5.2.3 is out
|
|
263
|
+
normalizeSitePath(node) {
|
|
264
|
+
const elements = node.path.elements;
|
|
265
|
+
// remove 'Company Home'
|
|
266
|
+
elements.splice(0, 1);
|
|
267
|
+
// replace first item with 'File Libraries'
|
|
268
|
+
elements[0].name = this.translation.instant('APP.BROWSE.LIBRARIES.MENU.MY_LIBRARIES.TITLE');
|
|
269
|
+
elements[0].id = '-mysites-';
|
|
270
|
+
if (this.isSiteContainer(node)) {
|
|
271
|
+
// rename 'documentLibrary' entry to the target site display name
|
|
272
|
+
// clicking on the breadcrumb entry loads the site content
|
|
273
|
+
node.name = elements[1].name;
|
|
274
|
+
// remove the site entry
|
|
275
|
+
elements.splice(1, 1);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
// remove 'documentLibrary' in the middle of the path
|
|
279
|
+
const docLib = elements.findIndex((el) => el.name === 'documentLibrary');
|
|
280
|
+
if (docLib > -1) {
|
|
281
|
+
elements.splice(docLib, 1);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
isSiteContainer(node) {
|
|
286
|
+
if (node?.aspectNames?.length > 0) {
|
|
287
|
+
return node.aspectNames.indexOf('st:siteContainer') >= 0;
|
|
288
|
+
}
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
copyNodeAction(nodeEntry, selectionId) {
|
|
292
|
+
if (nodeEntry.isFolder) {
|
|
293
|
+
return this.copyFolderAction(nodeEntry, selectionId);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
// any other type is treated as 'content'
|
|
297
|
+
return this.copyContentAction(nodeEntry, selectionId);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
copyContentAction(contentEntry, selectionId, oldName) {
|
|
301
|
+
const _oldName = oldName || contentEntry.name;
|
|
302
|
+
// Check if there's nodeId for Shared Files
|
|
303
|
+
const contentEntryId = contentEntry.nodeId || contentEntry.id;
|
|
304
|
+
// use local method until new name parameter is added on ADF copyNode
|
|
305
|
+
return this.copyNode(contentEntryId, selectionId, _oldName).pipe(catchError((err) => {
|
|
306
|
+
let errStatusCode;
|
|
307
|
+
try {
|
|
308
|
+
const { error: { statusCode } } = JSON.parse(err.message);
|
|
309
|
+
errStatusCode = statusCode;
|
|
310
|
+
}
|
|
311
|
+
catch (e) {
|
|
312
|
+
//
|
|
313
|
+
}
|
|
314
|
+
if (errStatusCode && errStatusCode === 409) {
|
|
315
|
+
return this.copyContentAction(contentEntry, selectionId, this.getNewNameFrom(_oldName, contentEntry.name));
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
// do not throw error, to be able to show message in case of partial copy of files
|
|
319
|
+
return of(err || 'Server error');
|
|
320
|
+
}
|
|
321
|
+
}));
|
|
322
|
+
}
|
|
323
|
+
copyFolderAction(contentEntry, selectionId) {
|
|
324
|
+
// Check if there's nodeId for Shared Files
|
|
325
|
+
const contentEntryId = contentEntry.nodeId || contentEntry.id;
|
|
326
|
+
let $destinationFolder;
|
|
327
|
+
let $childrenToCopy;
|
|
328
|
+
let newDestinationFolder;
|
|
329
|
+
return this.copyNode(contentEntryId, selectionId, contentEntry.name).pipe(catchError((err) => {
|
|
330
|
+
let errStatusCode;
|
|
331
|
+
try {
|
|
332
|
+
const { error: { statusCode } } = JSON.parse(err.message);
|
|
333
|
+
errStatusCode = statusCode;
|
|
334
|
+
}
|
|
335
|
+
catch { }
|
|
336
|
+
if (errStatusCode && errStatusCode === 409) {
|
|
337
|
+
$destinationFolder = this.getChildByName(selectionId, contentEntry.name);
|
|
338
|
+
$childrenToCopy = this.getNodeChildren(contentEntryId);
|
|
339
|
+
return $destinationFolder.pipe(mergeMap((destination) => {
|
|
340
|
+
newDestinationFolder = destination;
|
|
341
|
+
return $childrenToCopy;
|
|
342
|
+
}), mergeMap((nodesToCopy) => {
|
|
343
|
+
const batch = [];
|
|
344
|
+
nodesToCopy.list.entries.forEach((node) => {
|
|
345
|
+
if (node.entry.isFolder) {
|
|
346
|
+
batch.push(this.copyFolderAction(node.entry, newDestinationFolder.entry.id));
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
batch.push(this.copyContentAction(node.entry, newDestinationFolder.entry.id));
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
if (!batch.length) {
|
|
353
|
+
return of({});
|
|
354
|
+
}
|
|
355
|
+
return zip(...batch);
|
|
356
|
+
}));
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
// do not throw error, to be able to show message in case of partial copy of files
|
|
360
|
+
return of(err || 'Server error');
|
|
361
|
+
}
|
|
362
|
+
}));
|
|
363
|
+
}
|
|
364
|
+
moveNodeAction(nodeEntry, selectionId) {
|
|
365
|
+
this.moveDeletedEntries = [];
|
|
366
|
+
if (nodeEntry.isFolder) {
|
|
367
|
+
const initialParentId = nodeEntry.parentId;
|
|
368
|
+
return this.moveFolderAction(nodeEntry, selectionId).pipe(mergeMap((newContent) => {
|
|
369
|
+
// take no extra action, if folder is moved to the same location
|
|
370
|
+
if (initialParentId === selectionId) {
|
|
371
|
+
return of(newContent);
|
|
372
|
+
}
|
|
373
|
+
const flattenResponse = this.flatten(newContent);
|
|
374
|
+
const processedData = this.processResponse(flattenResponse);
|
|
375
|
+
// else, check if moving this nodeEntry succeeded for ALL of its nodes
|
|
376
|
+
if (processedData.failed.length === 0) {
|
|
377
|
+
// check if folder still exists on location
|
|
378
|
+
return this.getChildByName(initialParentId, nodeEntry.name).pipe(mergeMap((folderOnInitialLocation) => {
|
|
379
|
+
if (folderOnInitialLocation) {
|
|
380
|
+
// Check if there's nodeId for Shared Files
|
|
381
|
+
const nodeEntryId = nodeEntry.nodeId || nodeEntry.id;
|
|
382
|
+
// delete it from location
|
|
383
|
+
return this.contentApi.deleteNode(nodeEntryId).pipe(mergeMap(() => {
|
|
384
|
+
this.moveDeletedEntries.push(nodeEntry);
|
|
385
|
+
return of(newContent);
|
|
386
|
+
}));
|
|
387
|
+
}
|
|
388
|
+
return of(newContent);
|
|
389
|
+
}));
|
|
390
|
+
}
|
|
391
|
+
return of(newContent);
|
|
392
|
+
}));
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
// any other type is treated as 'content'
|
|
396
|
+
return this.moveContentAction(nodeEntry, selectionId);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
moveFolderAction(contentEntry, selectionId) {
|
|
400
|
+
// Check if there's nodeId for Shared Files
|
|
401
|
+
const contentEntryId = contentEntry.nodeId || contentEntry.id;
|
|
402
|
+
const initialParentId = this.getEntryParentId(contentEntry);
|
|
403
|
+
let $destinationFolder;
|
|
404
|
+
let $childrenToMove;
|
|
405
|
+
let newDestinationFolder;
|
|
406
|
+
return this.documentListService.moveNode(contentEntryId, selectionId).pipe(map((itemMoved) => ({ itemMoved, initialParentId })), catchError((err) => {
|
|
407
|
+
let errStatusCode;
|
|
408
|
+
try {
|
|
409
|
+
const { error: { statusCode } } = JSON.parse(err.message);
|
|
410
|
+
errStatusCode = statusCode;
|
|
411
|
+
}
|
|
412
|
+
catch (e) {
|
|
413
|
+
//
|
|
414
|
+
}
|
|
415
|
+
if (errStatusCode && errStatusCode === 409) {
|
|
416
|
+
$destinationFolder = this.getChildByName(selectionId, contentEntry.name);
|
|
417
|
+
$childrenToMove = this.getNodeChildren(contentEntryId);
|
|
418
|
+
return $destinationFolder.pipe(mergeMap((destination) => {
|
|
419
|
+
newDestinationFolder = destination;
|
|
420
|
+
return $childrenToMove;
|
|
421
|
+
}), mergeMap((childrenToMove) => {
|
|
422
|
+
const batch = [];
|
|
423
|
+
childrenToMove.list.entries.forEach((node) => {
|
|
424
|
+
if (node.entry.isFolder) {
|
|
425
|
+
batch.push(this.moveFolderAction(node.entry, newDestinationFolder.entry.id));
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
batch.push(this.moveContentAction(node.entry, newDestinationFolder.entry.id));
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
if (!batch.length) {
|
|
432
|
+
return of(batch);
|
|
433
|
+
}
|
|
434
|
+
return zip(...batch);
|
|
435
|
+
}));
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
// do not throw error, to be able to show message in case of partial move of files
|
|
439
|
+
return of(err);
|
|
440
|
+
}
|
|
441
|
+
}));
|
|
442
|
+
}
|
|
443
|
+
moveContentAction(contentEntry, selectionId) {
|
|
444
|
+
// Check if there's nodeId for Shared Files
|
|
445
|
+
const contentEntryId = contentEntry.nodeId || contentEntry.id;
|
|
446
|
+
const initialParentId = this.getEntryParentId(contentEntry);
|
|
447
|
+
return this.documentListService.moveNode(contentEntryId, selectionId).pipe(map((itemMoved) => ({ itemMoved, initialParentId })), catchError((err) =>
|
|
448
|
+
// do not throw error, to be able to show message in case of partial move of files
|
|
449
|
+
of(err)));
|
|
450
|
+
}
|
|
451
|
+
getChildByName(parentId, name) {
|
|
452
|
+
const matchedNodes = new Subject();
|
|
453
|
+
this.getNodeChildren(parentId).subscribe((childrenNodes) => {
|
|
454
|
+
const result = childrenNodes.list.entries.find((node) => node.entry.name === name);
|
|
455
|
+
if (result) {
|
|
456
|
+
matchedNodes.next(result);
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
matchedNodes.next(null);
|
|
460
|
+
}
|
|
461
|
+
}, (err) => matchedNodes.error(err));
|
|
462
|
+
return matchedNodes;
|
|
463
|
+
}
|
|
464
|
+
isActionAllowed(action, node, permission) {
|
|
465
|
+
if (action === NodeAction.COPY) {
|
|
466
|
+
return true;
|
|
467
|
+
}
|
|
468
|
+
return this.contentService.hasAllowableOperations(node, permission);
|
|
469
|
+
}
|
|
470
|
+
rowFilter(row) {
|
|
471
|
+
const node = row.node.entry;
|
|
472
|
+
this.isSitesDestinationAvailable = !!node['guid'];
|
|
473
|
+
return !node.isFile && node.nodeType !== 'app:folderlink';
|
|
474
|
+
}
|
|
475
|
+
imageResolver(row) {
|
|
476
|
+
const entry = row.node.entry;
|
|
477
|
+
if (!this.contentService.hasAllowableOperations(entry, 'update')) {
|
|
478
|
+
return this.thumbnailService.getMimeTypeIcon('disable/folder');
|
|
479
|
+
}
|
|
480
|
+
return null;
|
|
481
|
+
}
|
|
482
|
+
getNewNameFrom(name, baseName) {
|
|
483
|
+
const extensionMatch = name.match(/\.[^/.]+$/);
|
|
484
|
+
// remove extension in case there is one
|
|
485
|
+
const fileExtension = extensionMatch ? extensionMatch[0] : '';
|
|
486
|
+
let extensionFree = extensionMatch ? name.slice(0, extensionMatch.index) : name;
|
|
487
|
+
let prefixNumber = 1;
|
|
488
|
+
let baseExtensionFree;
|
|
489
|
+
if (baseName) {
|
|
490
|
+
const baseExtensionMatch = baseName.match(/\.[^/.]+$/);
|
|
491
|
+
// remove extension in case there is one
|
|
492
|
+
baseExtensionFree = baseExtensionMatch ? baseName.slice(0, baseExtensionMatch.index) : baseName;
|
|
493
|
+
}
|
|
494
|
+
if (!baseExtensionFree || baseExtensionFree !== extensionFree) {
|
|
495
|
+
// check if name already has integer appended on end:
|
|
496
|
+
const oldPrefix = extensionFree.match('-[0-9]+$');
|
|
497
|
+
if (oldPrefix) {
|
|
498
|
+
// if so, try to get the number at the end
|
|
499
|
+
const oldPrefixNumber = parseInt(oldPrefix[0].slice(1), 10);
|
|
500
|
+
if (oldPrefixNumber.toString() === oldPrefix[0].slice(1)) {
|
|
501
|
+
extensionFree = extensionFree.slice(0, oldPrefix.index);
|
|
502
|
+
prefixNumber = oldPrefixNumber + 1;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
return extensionFree + '-' + prefixNumber + fileExtension;
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Get children nodes of given parent node
|
|
510
|
+
*
|
|
511
|
+
* @param nodeId The id of the parent node
|
|
512
|
+
* @param params optional parameters
|
|
513
|
+
*/
|
|
514
|
+
getNodeChildren(nodeId, params) {
|
|
515
|
+
return from(this.nodesApi.listNodeChildren(nodeId, params));
|
|
516
|
+
}
|
|
517
|
+
// Copied from ADF document-list.service, and added the name parameter
|
|
518
|
+
/**
|
|
519
|
+
* Copy a node to destination node
|
|
520
|
+
*
|
|
521
|
+
* @param nodeId The id of the node to be copied
|
|
522
|
+
* @param targetParentId The id of the folder-node where the node have to be copied to
|
|
523
|
+
* @param name The new name for the copy that would be added on the destination folder
|
|
524
|
+
*/
|
|
525
|
+
copyNode(nodeId, targetParentId, name) {
|
|
526
|
+
return from(this.nodesApi.copyNode(nodeId, { targetParentId, name }));
|
|
527
|
+
}
|
|
528
|
+
flatten(nDimArray) {
|
|
529
|
+
if (!Array.isArray(nDimArray)) {
|
|
530
|
+
return nDimArray;
|
|
531
|
+
}
|
|
532
|
+
const nodeQueue = nDimArray.slice(0);
|
|
533
|
+
const resultingArray = [];
|
|
534
|
+
do {
|
|
535
|
+
nodeQueue.forEach((node) => {
|
|
536
|
+
if (Array.isArray(node)) {
|
|
537
|
+
nodeQueue.push(...node);
|
|
538
|
+
}
|
|
539
|
+
else {
|
|
540
|
+
resultingArray.push(node);
|
|
541
|
+
}
|
|
542
|
+
const nodeIndex = nodeQueue.indexOf(node);
|
|
543
|
+
nodeQueue.splice(nodeIndex, 1);
|
|
544
|
+
});
|
|
545
|
+
} while (nodeQueue.length);
|
|
546
|
+
return resultingArray;
|
|
547
|
+
}
|
|
548
|
+
processResponse(data) {
|
|
549
|
+
const moveStatus = {
|
|
550
|
+
succeeded: [],
|
|
551
|
+
failed: [],
|
|
552
|
+
partiallySucceeded: []
|
|
553
|
+
};
|
|
554
|
+
if (Array.isArray(data)) {
|
|
555
|
+
return data.reduce((acc, next) => {
|
|
556
|
+
if (next instanceof Error) {
|
|
557
|
+
acc.failed.push(next);
|
|
558
|
+
}
|
|
559
|
+
else if (Array.isArray(next)) {
|
|
560
|
+
// if content of a folder was moved
|
|
561
|
+
const folderMoveResponseData = this.flatten(next);
|
|
562
|
+
const foundError = folderMoveResponseData.find((node) => node instanceof Error);
|
|
563
|
+
// data might contain also items of form: { itemMoved, initialParentId }
|
|
564
|
+
const foundEntry = folderMoveResponseData.find((node) => node.itemMoved?.entry || node?.entry);
|
|
565
|
+
if (!foundError) {
|
|
566
|
+
// consider success if NONE of the items from the folder move response is an error
|
|
567
|
+
acc.succeeded.push(next);
|
|
568
|
+
}
|
|
569
|
+
else if (!foundEntry) {
|
|
570
|
+
// consider failed if NONE of the items has an entry
|
|
571
|
+
acc.failed.push(next);
|
|
572
|
+
}
|
|
573
|
+
else {
|
|
574
|
+
// partially move folder
|
|
575
|
+
acc.partiallySucceeded.push(next);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
else {
|
|
579
|
+
acc.succeeded.push(next);
|
|
580
|
+
}
|
|
581
|
+
return acc;
|
|
582
|
+
}, moveStatus);
|
|
583
|
+
}
|
|
584
|
+
else {
|
|
585
|
+
if (data.itemMoved?.entry || data?.entry) {
|
|
586
|
+
moveStatus.succeeded.push(data);
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
moveStatus.failed.push(data);
|
|
590
|
+
}
|
|
591
|
+
return moveStatus;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
focusAfterClose(focusedElementSelector) {
|
|
595
|
+
if (focusedElementSelector) {
|
|
596
|
+
document.querySelector(focusedElementSelector)?.focus();
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: NodeActionsService, deps: [{ token: i1.ContentService }, { token: i2.ContentApiService }, { token: i3.MatDialog }, { token: i1.DocumentListService }, { token: i1.AlfrescoApiService }, { token: i4.TranslationService }, { token: i4.ThumbnailService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
600
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: NodeActionsService, providedIn: 'root' });
|
|
601
|
+
}
|
|
602
|
+
export { NodeActionsService };
|
|
603
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: NodeActionsService, decorators: [{
|
|
604
|
+
type: Injectable,
|
|
605
|
+
args: [{
|
|
606
|
+
providedIn: 'root'
|
|
607
|
+
}]
|
|
608
|
+
}], ctorParameters: function () { return [{ type: i1.ContentService }, { type: i2.ContentApiService }, { type: i3.MatDialog }, { type: i1.DocumentListService }, { type: i1.AlfrescoApiService }, { type: i4.TranslationService }, { type: i4.ThumbnailService }]; } });
|
|
609
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1hY3Rpb25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY2EtY29udGVudC9zcmMvbGliL3NlcnZpY2VzL25vZGUtYWN0aW9ucy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFjLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQiw0QkFBNEIsRUFFNUIsd0JBQXdCLEVBRXhCLFVBQVUsRUFDVixjQUFjLEVBQ2YsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQW1CLFVBQVUsRUFBeUQsUUFBUSxFQUF3QixNQUFNLGtCQUFrQixDQUFDO0FBQ3RKLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFJM0QsTUFHYSxrQkFBa0I7SUFhbkI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFsQlYsYUFBYSxHQUF5QixJQUFJLE9BQU8sRUFBZSxDQUFDO0lBQ2pFLFlBQVksR0FBaUIsSUFBSSxPQUFPLEVBQU8sQ0FBQztJQUNoRCxrQkFBa0IsR0FBVSxFQUFFLENBQUM7SUFDL0IsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0lBRXBDLFNBQVMsQ0FBVztJQUNw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dEU7SUFDSCxDQUFDO3VHQXZvQlUsa0JBQWtCOzJHQUFsQixrQkFBa0IsY0FGakIsTUFBTTs7U0FFUCxrQkFBa0I7MkZBQWxCLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjQgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBBbGZyZXNjbyBFeGFtcGxlIENvbnRlbnQgQXBwbGljYXRpb25cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uLlxuICogSWYgdGhlIHNvZnR3YXJlIHdhcyBwdXJjaGFzZWQgdW5kZXIgYSBwYWlkIEFsZnJlc2NvIGxpY2Vuc2UsIHRoZSB0ZXJtcyBvZlxuICogdGhlIHBhaWQgbGljZW5zZSBhZ3JlZW1lbnQgd2lsbCBwcmV2YWlsLiBPdGhlcndpc2UsIHRoZSBzb2Z0d2FyZSBpc1xuICogcHJvdmlkZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBvcGVuIHNvdXJjZSBsaWNlbnNlIHRlcm1zOlxuICpcbiAqIFRoZSBBbGZyZXNjbyBFeGFtcGxlIENvbnRlbnQgQXBwbGljYXRpb24gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGUgQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGZyb20gSHlsYW5kIFNvZnR3YXJlLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIG9mLCB6aXAsIGZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRodW1ibmFpbFNlcnZpY2UsIFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQge1xuICBBbGZyZXNjb0FwaVNlcnZpY2UsXG4gIERvY3VtZW50TGlzdFNlcnZpY2UsXG4gIENvbnRlbnROb2RlU2VsZWN0b3JDb21wb25lbnQsXG4gIENvbnRlbnROb2RlU2VsZWN0b3JDb21wb25lbnREYXRhLFxuICBDb250ZW50Tm9kZURpYWxvZ1NlcnZpY2UsXG4gIFNoYXJlRGF0YVJvdyxcbiAgTm9kZUFjdGlvbixcbiAgQ29udGVudFNlcnZpY2Vcbn0gZnJvbSAnQGFsZnJlc2NvL2FkZi1jb250ZW50LXNlcnZpY2VzJztcbmltcG9ydCB7IE5vZGVFbnRyeSwgTm9kZSwgU2l0ZVBhZ2luZywgTm9kZUNoaWxkQXNzb2NpYXRpb25QYWdpbmcsIE5vZGVDaGlsZEFzc29jaWF0aW9uRW50cnksIE5vZGVzQXBpLCBTaXRlLCBTaXRlUGFnaW5nTGlzdCB9IGZyb20gJ0BhbGZyZXNjby9qcy1hcGknO1xuaW1wb3J0IHsgQ29udGVudEFwaVNlcnZpY2UgfSBmcm9tICdAYWxmcmVzY28vYWNhLXNoYXJlZCc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIG1lcmdlTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG50eXBlIEJhdGNoT3BlcmF0aW9uVHlwZSA9IEV4dHJhY3Q8Tm9kZUFjdGlvbiwgTm9kZUFjdGlvbi5DT1BZIHwgTm9kZUFjdGlvbi5NT1ZFPjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTm9kZUFjdGlvbnNTZXJ2aWNlIHtcbiAgY29udGVudENvcGllZDogU3ViamVjdDxOb2RlRW50cnlbXT4gPSBuZXcgU3ViamVjdDxOb2RlRW50cnlbXT4oKTtcbiAgY29udGVudE1vdmVkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIG1vdmVEZWxldGVkRW50cmllczogYW55W10gPSBbXTtcbiAgaXNTaXRlc0Rlc3RpbmF0aW9uQXZhaWxhYmxlID0gZmFsc2U7XG5cbiAgX25vZGVzQXBpOiBOb2Rlc0FwaTtcbiAgZ2V0IG5vZGVzQXBpKCk6IE5vZGVzQXBpIHtcbiAgICB0aGlzLl9ub2Rlc0FwaSA9IHRoaXMuX25vZGVzQXBpID8/IG5ldyBOb2Rlc0FwaSh0aGlzLmFwaVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XG4gICAgcmV0dXJuIHRoaXMuX25vZGVzQXBpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb250ZW50U2VydmljZTogQ29udGVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZW50QXBpOiBDb250ZW50QXBpU2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgZG9jdW1lbnRMaXN0U2VydmljZTogRG9jdW1lbnRMaXN0U2VydmljZSxcbiAgICBwcml2YXRlIGFwaVNlcnZpY2U6IEFsZnJlc2NvQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0aHVtYm5haWxTZXJ2aWNlOiBUaHVtYm5haWxTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogQ29weSBub2RlIGxpc3RcbiAgICpcbiAgICogQHBhcmFtIGNvbnRlbnRFbnRpdGllcyBub2RlcyB0byBjb3B5XG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uIHBlcm1pc3Npb24gd2hpY2ggaXMgbmVlZGVkIHRvIGFwcGx5IHRoZSBhY3Rpb25cbiAgICogQHBhcmFtIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yIGVsZW1lbnQncyBzZWxlY3RvciB3aGljaCBzaG91bGQgYmUgYXV0b2ZvY3VzZWQgYWZ0ZXIgY2xvc2luZyBtb2RhbFxuICAgKi9cbiAgY29weU5vZGVzKGNvbnRlbnRFbnRpdGllczogYW55W10sIHBlcm1pc3Npb24/OiBzdHJpbmcsIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKTogU3ViamVjdDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5kb0JhdGNoT3BlcmF0aW9uKE5vZGVBY3Rpb24uQ09QWSwgY29udGVudEVudGl0aWVzLCBwZXJtaXNzaW9uLCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBub2RlIGxpc3RcbiAgICpcbiAgICogQHBhcmFtIGNvbnRlbnRFbnRpdGllcyBub2RlcyB0byBtb3ZlXG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uIHBlcm1pc3Npb24gd2hpY2ggaXMgbmVlZGVkIHRvIGFwcGx5IHRoZSBhY3Rpb25cbiAgICogQHBhcmFtIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yIGVsZW1lbnQncyBzZWxlY3RvciB3aGljaCBzaG91bGQgYmUgYXV0b2ZvY3VzZWQgYWZ0ZXIgY2xvc2luZyBtb2RhbFxuICAgKi9cbiAgbW92ZU5vZGVzKGNvbnRlbnRFbnRpdGllczogYW55W10sIHBlcm1pc3Npb24/OiBzdHJpbmcsIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKTogU3ViamVjdDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5kb0JhdGNoT3BlcmF0aW9uKE5vZGVBY3Rpb24uTU9WRSwgY29udGVudEVudGl0aWVzLCBwZXJtaXNzaW9uLCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhbCBtZXRob2QgZm9yIHBlcmZvcm1pbmcgdGhlIGdpdmVuIG9wZXJhdGlvbiAoY29weXxtb3ZlKSB0byBtdWx0aXBsZSBub2Rlc1xuICAgKlxuICAgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gdG8gcGVyZm9ybSAoY29weXxtb3ZlKVxuICAgKiBAcGFyYW0gY29udGVudEVudGl0aWVzIHRoZSBjb250ZW50RW50aXRpZXMgd2hpY2ggaGF2ZSB0byBoYXZlIHRoZSBhY3Rpb24gcGVyZm9ybWVkIG9uXG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uIHBlcm1pc3Npb24gd2hpY2ggaXMgbmVlZGVkIHRvIGFwcGx5IHRoZSBhY3Rpb25cbiAgICogQHBhcmFtIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yIGVsZW1lbnQncyBzZWxlY3RvciB3aGljaCBzaG91bGQgYmUgYXV0b2ZvY3VzZWQgYWZ0ZXIgY2xvc2luZyBtb2RhbFxuICAgKi9cbiAgZG9CYXRjaE9wZXJhdGlvbihhY3Rpb246IEJhdGNoT3BlcmF0aW9uVHlwZSwgY29udGVudEVudGl0aWVzOiBhbnlbXSwgcGVybWlzc2lvbj86IHN0cmluZywgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpOiBTdWJqZWN0PHN0cmluZz4ge1xuICAgIGNvbnN0IG9ic2VydmFibGU6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAgIGlmICghdGhpcy5pc0VudHJ5RW50aXRpZXNBcnJheShjb250ZW50RW50aXRpZXMpKSB7XG4gICAgICBvYnNlcnZhYmxlLmVycm9yKG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7IGVycm9yOiB7IHN0YXR1c0NvZGU6IDQwMCB9IH0pKSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrUGVybWlzc2lvbihhY3Rpb24sIGNvbnRlbnRFbnRpdGllcywgcGVybWlzc2lvbikpIHtcbiAgICAgIGNvbnN0IGRlc3RpbmF0aW9uU2VsZWN0aW9uID0gdGhpcy5nZXRDb250ZW50Tm9kZVNlbGVjdGlvbihhY3Rpb24sIGNvbnRlbnRFbnRpdGllcywgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgICAgZGVzdGluYXRpb25TZWxlY3Rpb24uc3Vic2NyaWJlKChzZWxlY3Rpb25zOiBOb2RlW10pID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudEVudHJ5ID0gY29udGVudEVudGl0aWVzWzBdLmVudHJ5O1xuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIG5vZGVJZCBmb3IgU2hhcmVkIEZpbGVzXG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbnRyeUlkID0gY29udGVudEVudHJ5Lm5vZGVJZCB8fCBjb250ZW50RW50cnkuaWQ7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBjb250ZW50RW50cnkuaXNGb2xkZXIgPyAnZm9sZGVyJyA6ICdjb250ZW50JztcbiAgICAgICAgY29uc3QgYmF0Y2g6IGFueVtdID0gW107XG5cbiAgICAgICAgLy8gY29uc2lkZXIgb25seSBmaXJzdCBpdGVtIGluIHRoZSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0aW9uc1swXTtcbiAgICAgICAgbGV0IGFjdGlvbiQ6IE9ic2VydmFibGU8YW55PjtcblxuICAgICAgICBpZiAoYWN0aW9uID09PSBOb2RlQWN0aW9uLk1PVkUgJiYgY29udGVudEVudGl0aWVzLmxlbmd0aCA9PT0gMSAmJiB0eXBlID09PSAnY29udGVudCcpIHtcbiAgICAgICAgICBhY3Rpb24kID0gdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLm1vdmVOb2RlKGNvbnRlbnRFbnRyeUlkLCBzZWxlY3Rpb24uaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRlbnRFbnRpdGllcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgICAgICAvLyBiYXRjaC5wdXNoKHRoaXMuY29weU5vZGVBY3Rpb24obm9kZS5lbnRyeSwgc2VsZWN0aW9uLmlkKSk7XG4gICAgICAgICAgICBiYXRjaC5wdXNoKHRoaXNbYCR7YWN0aW9uLnRvTG93ZXJDYXNlKCl9Tm9kZUFjdGlvbmBdKG5vZGUuZW50cnksIHNlbGVjdGlvbi5pZCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGFjdGlvbiQgPSB6aXAoLi4uYmF0Y2gpO1xuICAgICAgICB9XG5cbiAgICAgICAgYWN0aW9uJC5zdWJzY3JpYmUoKG5ld0NvbnRlbnQpID0+IHtcbiAgICAgICAgICBvYnNlcnZhYmxlLm5leHQoYE9QRVJBVElPTi5TVUNDRVNTLiR7dHlwZS50b1VwcGVyQ2FzZSgpfS4ke2FjdGlvbi50b1VwcGVyQ2FzZSgpfWApO1xuXG4gICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHRoaXMucHJvY2Vzc1Jlc3BvbnNlKG5ld0NvbnRlbnQpO1xuICAgICAgICAgIGlmIChhY3Rpb24gPT09IE5vZGVBY3Rpb24uQ09QWSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50Q29waWVkLm5leHQocHJvY2Vzc2VkRGF0YS5zdWNjZWVkZWQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSBOb2RlQWN0aW9uLk1PVkUpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudE1vdmVkLm5leHQocHJvY2Vzc2VkRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBvYnNlcnZhYmxlLmVycm9yLmJpbmQob2JzZXJ2YWJsZSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ic2VydmFibGUuZXJyb3IobmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6IHsgc3RhdHVzQ29kZTogNDAzIH0gfSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgfVxuXG4gIGlzRW50cnlFbnRpdGllc0FycmF5KGNvbnRlbnRFbnRpdGllczogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoY29udGVudEVudGl0aWVzPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5vbkVudHJ5Tm9kZSA9IGNvbnRlbnRFbnRpdGllcy5maW5kKChub2RlKSA9PiAhKG5vZGU/LmVudHJ5Py5ub2RlSWQgfHwgbm9kZT8uZW50cnk/LmlkKSk7XG4gICAgICByZXR1cm4gIW5vbkVudHJ5Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2hlY2tQZXJtaXNzaW9uKGFjdGlvbjogQmF0Y2hPcGVyYXRpb25UeXBlLCBjb250ZW50RW50aXRpZXM6IGFueVtdLCBwZXJtaXNzaW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3Qgbm90QWxsb3dlZE5vZGUgPSBjb250ZW50RW50aXRpZXMuZmluZCgobm9kZSkgPT4gIXRoaXMuaXNBY3Rpb25BbGxvd2VkKGFjdGlvbiwgbm9kZS5lbnRyeSwgcGVybWlzc2lvbikpO1xuICAgIHJldHVybiAhbm90QWxsb3dlZE5vZGU7XG4gIH1cblxuICBnZXRFbnRyeVBhcmVudElkKG5vZGVFbnRyeTogTm9kZSkge1xuICAgIGxldCBlbnRyeVBhcmVudElkID0gJyc7XG5cbiAgICBpZiAobm9kZUVudHJ5LnBhcmVudElkKSB7XG4gICAgICBlbnRyeVBhcmVudElkID0gbm9kZUVudHJ5LnBhcmVudElkO1xuICAgIH0gZWxzZSBpZiAobm9kZUVudHJ5LnBhdGg/LmVsZW1lbnRzPy5sZW5ndGgpIHtcbiAgICAgIGVudHJ5UGFyZW50SWQgPSBub2RlRW50cnkucGF0aC5lbGVtZW50c1tub2RlRW50cnkucGF0aC5lbGVtZW50cy5sZW5ndGggLSAxXS5pZDtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cnlQYXJlbnRJZDtcbiAgfVxuXG4gIGdldENvbnRlbnROb2RlU2VsZWN0aW9uKGFjdGlvbjogTm9kZUFjdGlvbiwgY29udGVudEVudGl0aWVzOiBOb2RlRW50cnlbXSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpOiBTdWJqZWN0PE5vZGVbXT4ge1xuICAgIGNvbnN0IGN1cnJlbnRQYXJlbnRGb2xkZXJJZCA9IHRoaXMuZ2V0RW50cnlQYXJlbnRJZChjb250ZW50RW50aXRpZXNbMF0uZW50cnkpO1xuXG4gICAgY29uc3QgY3VzdG9tRHJvcGRvd24gPSBuZXcgU2l0ZVBhZ2luZyh7XG4gICAgICBsaXN0OiB7XG4gICAgICAgIGVudHJpZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbnRyeToge1xuICAgICAgICAgICAgICBndWlkOiAnLW15LScsXG4gICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoJ0FQUC5CUk9XU0UuUEVSU09OQUwuU0lERU5BVl9MSU5LLkxBQkVMJylcbiAgICAgICAgICAgIH0gYXMgU2l0ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50cnk6IHtcbiAgICAgICAgICAgICAgZ3VpZDogJy1teXNpdGVzLScsXG4gICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoJ0FQUC5CUk9XU0UuTElCUkFSSUVTLk1FTlUuTVlfTElCUkFSSUVTLlNJREVOQVZfTElOSy5MQUJFTCcpXG4gICAgICAgICAgICB9IGFzIFNpdGVcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0gYXMgU2l0ZVBhZ2luZ0xpc3RcbiAgICB9KTtcblxuICAgIGNvbnN0IHRpdGxlID0gdGhpcy5nZXRUaXRsZVRyYW5zbGF0aW9uKGFjdGlvbiwgY29udGVudEVudGl0aWVzKTtcblxuICAgIHRoaXMuaXNTaXRlc0Rlc3RpbmF0aW9uQXZhaWxhYmxlID0gZmFsc2U7XG4gICAgY29uc3QgZGF0YTogQ29udGVudE5vZGVTZWxlY3RvckNvbXBvbmVudERhdGEgPSB7XG4gICAgICBzZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyxcbiAgICAgIHRpdGxlLFxuICAgICAgY3VycmVudEZvbGRlcklkOiBjdXJyZW50UGFyZW50Rm9sZGVySWQsXG4gICAgICBhY3Rpb25OYW1lOiBhY3Rpb24sXG4gICAgICBkcm9wZG93bkhpZGVNeUZpbGVzOiB0cnVlLFxuICAgICAgZHJvcGRvd25TaXRlTGlzdDogY3VzdG9tRHJvcGRvd24sXG4gICAgICByb3dGaWx0ZXI6IHRoaXMucm93RmlsdGVyLmJpbmQodGhpcyksXG4gICAgICBpbWFnZVJlc29sdmVyOiB0aGlzLmltYWdlUmVzb2x2ZXIuYmluZCh0aGlzKSxcbiAgICAgIGlzU2VsZWN0aW9uVmFsaWQ6IHRoaXMuY2FuQ29weU1vdmVJbnNpZGVJdC5iaW5kKHRoaXMpLFxuICAgICAgYnJlYWRjcnVtYlRyYW5zZm9ybTogdGhpcy5jdXN0b21pemVCcmVhZGNydW1iLmJpbmQodGhpcyksXG4gICAgICBzZWxlY3Q6IG5ldyBTdWJqZWN0PE5vZGVbXT4oKSxcbiAgICAgIGV4Y2x1ZGVTaXRlQ29udGVudDogQ29udGVudE5vZGVEaWFsb2dTZXJ2aWNlLm5vbkRvY3VtZW50U2l0ZUNvbnRlbnRcbiAgICB9O1xuXG4gICAgdGhpcy5kaWFsb2dcbiAgICAgIC5vcGVuKENvbnRlbnROb2RlU2VsZWN0b3JDb21wb25lbnQsIHtcbiAgICAgICAgZGF0YSxcbiAgICAgICAgcGFuZWxDbGFzczogJ2FkZi1jb250ZW50LW5vZGUtc2VsZWN0b3ItZGlhbG9nJyxcbiAgICAgICAgd2lkdGg6ICc2MzBweCcsXG4gICAgICAgIHJvbGU6ICdkaWFsb2cnXG4gICAgICB9KVxuICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5mb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpKTtcblxuICAgIGRhdGEuc2VsZWN0LnN1YnNjcmliZSh7XG4gICAgICBjb21wbGV0ZTogdGhpcy5jbG9zZS5iaW5kKHRoaXMpXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGF0YS5zZWxlY3Q7XG4gIH1cblxuICBnZXRUaXRsZVRyYW5zbGF0aW9uKGFjdGlvbjogc3RyaW5nLCBub2RlczogTm9kZUVudHJ5W10gPSBbXSk6IHN0cmluZyB7XG4gICAgbGV0IGtleVByZWZpeCA9ICdJVEVNUyc7XG4gICAgbGV0IG5hbWUgPSAnJztcblxuICAgIGlmIChub2Rlcy5sZW5ndGggPT09IDEgJiYgbm9kZXNbMF0uZW50cnkubmFtZSkge1xuICAgICAgbmFtZSA9IG5vZGVzWzBdLmVudHJ5Lm5hbWU7XG4gICAgICBrZXlQcmVmaXggPSAnSVRFTSc7XG4gICAgfVxuXG4gICAgY29uc3QgbnVtYmVyID0gbm9kZXMubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoYE5PREVfU0VMRUNUT1IuJHthY3Rpb24udG9VcHBlckNhc2UoKX1fJHtrZXlQcmVmaXh9YCwgeyBuYW1lLCBudW1iZXIgfSk7XG4gIH1cblxuICBwcml2YXRlIGNhbkNvcHlNb3ZlSW5zaWRlSXQoZW50cnk6IE5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNFbnRpdHlDcmVhdGVQZXJtaXNzaW9uKGVudHJ5KSAmJiAhdGhpcy5pc1NpdGUoZW50cnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNFbnRpdHlDcmVhdGVQZXJtaXNzaW9uKGVudHJ5OiBOb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudFNlcnZpY2UuaGFzQWxsb3dhYmxlT3BlcmF0aW9ucyhlbnRyeSwgJ2NyZWF0ZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NpdGUoZW50cnkpIHtcbiAgICByZXR1cm4gISFlbnRyeS5ndWlkIHx8IGVudHJ5Lm5vZGVUeXBlID09PSAnc3Q6c2l0ZScgfHwgZW50cnkubm9kZVR5cGUgPT09ICdzdDpzaXRlcyc7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLmRpYWxvZy5jbG9zZUFsbCgpO1xuICB9XG5cbiAgLy8gdG9kbzogcmV2aWV3IHRoaXMgYXBwcm9hY2ggb25jZSA1LjIuMyBpcyBvdXRcbiAgcHJpdmF0ZSBjdXN0b21pemVCcmVhZGNydW1iKG5vZGU6IE5vZGUpIHtcbiAgICBpZiAobm9kZT8ucGF0aD8uZWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gbm9kZS5wYXRoLmVsZW1lbnRzO1xuXG4gICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBpZiAoZWxlbWVudHNbMV0ubmFtZSA9PT0gJ1VzZXIgSG9tZXMnKSB7XG4gICAgICAgICAgZWxlbWVudHMuc3BsaWNlKDAsIDIpO1xuXG4gICAgICAgICAgLy8gbWFrZSBzdXJlIGZpcnN0IGl0ZW0gaXMgJ1BlcnNvbmFsIEZpbGVzJ1xuICAgICAgICAgIGlmIChlbGVtZW50c1swXSkge1xuICAgICAgICAgICAgZWxlbWVudHNbMF0ubmFtZSA9IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudCgnQVBQLkJST1dTRS5QRVJTT05BTC5USVRMRScpO1xuICAgICAgICAgICAgZWxlbWVudHNbMF0uaWQgPSAnLW15LSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUubmFtZSA9IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudCgnQVBQLkJST1dTRS5QRVJTT05BTC5USVRMRScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1sxXS5uYW1lID09PSAnU2l0ZXMnKSB7XG4gICAgICAgICAgdGhpcy5ub3JtYWxpemVTaXRlUGF0aChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgaWYgKG5vZGUubmFtZSA9PT0gJ1NpdGVzJykge1xuICAgICAgICAgIG5vZGUubmFtZSA9IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudCgnQVBQLkJST1dTRS5MSUJSQVJJRVMuTUVOVS5NWV9MSUJSQVJJRVMuVElUTEUnKTtcbiAgICAgICAgICBlbGVtZW50cy5zcGxpY2UoMCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUgPT09IG51bGwgJiYgdGhpcy5pc1NpdGVzRGVzdGluYXRpb25BdmFpbGFibGUpIHtcbiAgICAgIG5vZGUgPSB7XG4gICAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudCgnQVBQLkJST1dTRS5MSUJSQVJJRVMuTUVOVS5NWV9MSUJSQVJJRVMuVElUTEUnKSxcbiAgICAgICAgcGF0aDogeyBlbGVtZW50czogW10gfVxuICAgICAgfSBhcyBhbnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICAvLyB0b2RvOiByZXZpZXcgdGhpcyBhcHByb2FjaCBvbmNlIDUuMi4zIGlzIG91dFxuICBwcml2YXRlIG5vcm1hbGl6ZVNpdGVQYXRoKG5vZGU6IE5vZGUpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IG5vZGUucGF0aC5lbGVtZW50cztcblxuICAgIC8vIHJlbW92ZSAnQ29tcGFueSBIb21lJ1xuICAgIGVsZW1lbnRzLnNwbGljZSgwLCAxKTtcblxuICAgIC8vIHJlcGxhY2UgZmlyc3QgaXRlbSB3aXRoICdGaWxlIExpYnJhcmllcydcbiAgICBlbGVtZW50c1swXS5uYW1lID0gdGhpcy50cmFuc2xhdGlvbi5pbnN0YW50KCdBUFAuQlJPV1NFLkxJQlJBUklFUy5NRU5VLk1ZX0xJQlJBUklFUy5USVRMRScpO1xuICAgIGVsZW1lbnRzWzBdLmlkID0gJy1teXNpdGVzLSc7XG5cbiAgICBpZiAodGhpcy5pc1NpdGVDb250YWluZXIobm9kZSkpIHtcbiAgICAgIC8vIHJlbmFtZSAnZG9jdW1lbnRMaWJyYXJ5JyBlbnRyeSB0byB0aGUgdGFyZ2V0IHNpdGUgZGlzcGxheSBuYW1lXG4gICAgICAvLyBjbGlja2luZyBvbiB0aGUgYnJlYWRjcnVtYiBlbnRyeSBsb2FkcyB0aGUgc2l0ZSBjb250ZW50XG4gICAgICBub2RlLm5hbWUgPSBlbGVtZW50c1sxXS5uYW1lO1xuXG4gICAgICAvLyByZW1vdmUgdGhlIHNpdGUgZW50cnlcbiAgICAgIGVsZW1lbnRzLnNwbGljZSgxLCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVtb3ZlICdkb2N1bWVudExpYnJhcnknIGluIHRoZSBtaWRkbGUgb2YgdGhlIHBhdGhcbiAgICAgIGNvbnN0IGRvY0xpYiA9IGVsZW1lbnRzLmZpbmRJbmRleCgoZWwpID0+IGVsLm5hbWUgPT09ICdkb2N1bWVudExpYnJhcnknKTtcbiAgICAgIGlmIChkb2NMaWIgPiAtMSkge1xuICAgICAgICBlbGVtZW50cy5zcGxpY2UoZG9jTGliLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc1NpdGVDb250YWluZXIobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgIGlmIChub2RlPy5hc3BlY3ROYW1lcz8ubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIG5vZGUuYXNwZWN0TmFtZXMuaW5kZXhPZignc3Q6c2l0ZUNvbnRhaW5lcicpID49IDA7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvcHlOb2RlQWN0aW9uKG5vZGVFbnRyeTogYW55LCBzZWxlY3Rpb25JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAobm9kZUVudHJ5LmlzRm9sZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb3B5Rm9sZGVyQWN0aW9uKG5vZGVFbnRyeSwgc2VsZWN0aW9uSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhbnkgb3RoZXIgdHlwZSBpcyB0cmVhdGVkIGFzICdjb250ZW50J1xuICAgICAgcmV0dXJuIHRoaXMuY29weUNvbnRlbnRBY3Rpb24obm9kZUVudHJ5LCBzZWxlY3Rpb25JZCk7XG4gICAgfVxuICB9XG5cbiAgY29weUNvbnRlbnRBY3Rpb24oY29udGVudEVudHJ5OiBhbnksIHNlbGVjdGlvbklkOiBzdHJpbmcsIG9sZE5hbWU/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IF9vbGROYW1lID0gb2xkTmFtZSB8fCBjb250ZW50RW50cnkubmFtZTtcbiAgICAvLyBDaGVjayBpZiB0aGVyZSdzIG5vZGVJZCBmb3IgU2hhcmVkIEZpbGVzXG4gICAgY29uc3QgY29udGVudEVudHJ5SWQgPSBjb250ZW50RW50cnkubm9kZUlkIHx8IGNvbnRlbnRFbnRyeS5pZDtcblxuICAgIC8vIHVzZSBsb2NhbCBtZXRob2QgdW50aWwgbmV3IG5hbWUgcGFyYW1ldGVyIGlzIGFkZGVkIG9uIEFERiBjb3B5Tm9kZVxuICAgIHJldHVybiB0aGlzLmNvcHlOb2RlKGNvbnRlbnRFbnRyeUlkLCBzZWxlY3Rpb25JZCwgX29sZE5hbWUpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgbGV0IGVyclN0YXR1c0NvZGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZXJyb3I6IHsgc3RhdHVzQ29kZSB9XG4gICAgICAgICAgfSA9IEpTT04ucGFyc2UoZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgIGVyclN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJTdGF0dXNDb2RlICYmIGVyclN0YXR1c0NvZGUgPT09IDQwOSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvcHlDb250ZW50QWN0aW9uKGNvbnRlbnRFbnRyeSwgc2VsZWN0aW9uSWQsIHRoaXMuZ2V0TmV3TmFtZUZyb20oX29sZE5hbWUsIGNvbnRlbnRFbnRyeS5uYW1lKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZG8gbm90IHRocm93IGVycm9yLCB0byBiZSBhYmxlIHRvIHNob3cgbWVzc2FnZSBpbiBjYXNlIG9mIHBhcnRpYWwgY29weSBvZiBmaWxlc1xuICAgICAgICAgIHJldHVybiBvZihlcnIgfHwgJ1NlcnZlciBlcnJvcicpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjb3B5Rm9sZGVyQWN0aW9uKGNvbnRlbnRFbnRyeTogYW55LCBzZWxlY3Rpb25JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAvLyBDaGVjayBpZiB0aGVyZSdzIG5vZGVJZCBmb3IgU2hhcmVkIEZpbGVzXG4gICAgY29uc3QgY29udGVudEVudHJ5SWQgPSBjb250ZW50RW50cnkubm9kZUlkIHx8IGNvbnRlbnRFbnRyeS5pZDtcbiAgICBsZXQgJGRlc3RpbmF0aW9uRm9sZGVyOiBPYnNlcnZhYmxlPGFueT47XG4gICAgbGV0ICRjaGlsZHJlblRvQ29weTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIGxldCBuZXdEZXN0aW5hdGlvbkZvbGRlcjtcblxuICAgIHJldHVybiB0aGlzLmNvcHlOb2RlKGNvbnRlbnRFbnRyeUlkLCBzZWxlY3Rpb25JZCwgY29udGVudEVudHJ5Lm5hbWUpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgbGV0IGVyclN0YXR1c0NvZGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZXJyb3I6IHsgc3RhdHVzQ29kZSB9XG4gICAgICAgICAgfSA9IEpTT04ucGFyc2UoZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgIGVyclN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICAgICAgICB9IGNhdGNoIHt9XG5cbiAgICAgICAgaWYgKGVyclN0YXR1c0NvZGUgJiYgZXJyU3RhdHVzQ29kZSA9PT0gNDA5KSB7XG4gICAgICAgICAgJGRlc3RpbmF0aW9uRm9sZGVyID0gdGhpcy5nZXRDaGlsZEJ5TmFtZShzZWxlY3Rpb25JZCwgY29udGVudEVudHJ5Lm5hbWUpO1xuICAgICAgICAgICRjaGlsZHJlblRvQ29weSA9IHRoaXMuZ2V0Tm9kZUNoaWxkcmVuKGNvbnRlbnRFbnRyeUlkKTtcblxuICAgICAgICAgIHJldHVybiAkZGVzdGluYXRpb25Gb2xkZXIucGlwZShcbiAgICAgICAgICAgIG1lcmdlTWFwKChkZXN0aW5hdGlvbikgPT4ge1xuICAgICAgICAgICAgICBuZXdEZXN0aW5hdGlvbkZvbGRlciA9IGRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgICByZXR1cm4gJGNoaWxkcmVuVG9Db3B5O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtZXJnZU1hcCgobm9kZXNUb0NvcHkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSBbXTtcbiAgICAgICAgICAgICAgbm9kZXNUb0NvcHkubGlzdC5lbnRyaWVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5lbnRyeS5pc0ZvbGRlcikge1xuICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaCh0aGlzLmNvcHlGb2xkZXJBY3Rpb24obm9kZS5lbnRyeSwgbmV3RGVzdGluYXRpb25Gb2xkZXIuZW50cnkuaWQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaCh0aGlzLmNvcHlDb250ZW50QWN0aW9uKG5vZGUuZW50cnksIG5ld0Rlc3RpbmF0aW9uRm9sZGVyLmVudHJ5LmlkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBpZiAoIWJhdGNoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvZih7fSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHppcCguLi5iYXRjaCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZG8gbm90IHRocm93IGVycm9yLCB0byBiZSBhYmxlIHRvIHNob3cgbWVzc2FnZSBpbiBjYXNlIG9mIHBhcnRpYWwgY29weSBvZiBmaWxlc1xuICAgICAgICAgIHJldHVybiBvZihlcnIgfHwgJ1NlcnZlciBlcnJvcicpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBtb3ZlTm9kZUFjdGlvbihub2RlRW50cnksIHNlbGVjdGlvbklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHRoaXMubW92ZURlbGV0ZWRFbnRyaWVzID0gW107XG5cbiAgICBpZiAobm9kZUVudHJ5LmlzRm9sZGVyKSB7XG4gICAgICBjb25zdCBpbml0aWFsUGFyZW50SWQgPSBub2RlRW50cnkucGFyZW50SWQ7XG5cbiAgICAgIHJldHVybiB0aGlzLm1vdmVGb2xkZXJBY3Rpb24obm9kZUVudHJ5LCBzZWxlY3Rpb25JZCkucGlwZShcbiAgICAgICAgbWVyZ2VNYXAoKG5ld0NvbnRlbnQpID0+IHtcbiAgICAgICAgICAvLyB0YWtlIG5vIGV4dHJhIGFjdGlvbiwgaWYgZm9sZGVyIGlzIG1vdmVkIHRvIHRoZSBzYW1lIGxvY2F0aW9uXG4gICAgICAgICAgaWYgKGluaXRpYWxQYXJlbnRJZCA9PT0gc2VsZWN0aW9uSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvZihuZXdDb250ZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmbGF0dGVuUmVzcG9uc2UgPSB0aGlzLmZsYXR0ZW4obmV3Q29udGVudCk7XG4gICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHRoaXMucHJvY2Vzc1Jlc3BvbnNlKGZsYXR0ZW5SZXNwb25zZSk7XG5cbiAgICAgICAgICAvLyBlbHNlLCBjaGVjayBpZiBtb3ZpbmcgdGhpcyBub2RlRW50cnkgc3VjY2VlZGVkIGZvciBBTEwgb2YgaXRzIG5vZGVzXG4gICAgICAgICAgaWYgKHByb2Nlc3NlZERhdGEuZmFpbGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgZm9sZGVyIHN0aWxsIGV4aXN0cyBvbiBsb2NhdGlvblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGRCeU5hbWUoaW5pdGlhbFBhcmVudElkLCBub2RlRW50cnkubmFtZSkucGlwZShcbiAgICAgICAgICAgICAgbWVyZ2VNYXAoKGZvbGRlck9uSW5pdGlhbExvY2F0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZvbGRlck9uSW5pdGlhbExvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIG5vZGVJZCBmb3IgU2hhcmVkIEZpbGVzXG4gICAgICAgICAgICAgICAgICBjb25zdCBub2RlRW50cnlJZCA9IG5vZGVFbnRyeS5ub2RlSWQgfHwgbm9kZUVudHJ5LmlkO1xuICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlIGl0IGZyb20gbG9jYXRpb25cbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkuZGVsZXRlTm9kZShub2RlRW50cnlJZCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZURlbGV0ZWRFbnRyaWVzLnB1c2gobm9kZUVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YobmV3Q29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb2YobmV3Q29udGVudCk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2YobmV3Q29udGVudCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhbnkgb3RoZXIgdHlwZSBpcyB0cmVhdGVkIGFzICdjb250ZW50J1xuICAgICAgcmV0dXJuIHRoaXMubW92ZUNvbnRlbnRBY3Rpb24obm9kZUVudHJ5LCBzZWxlY3Rpb25JZCk7XG4gICAgfVxuICB9XG5cbiAgbW92ZUZvbGRlckFjdGlvbihjb250ZW50RW50cnksIHNlbGVjdGlvbklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIC8vIENoZWNrIGlmIHRoZXJlJ3Mgbm9kZUlkIGZvciBTaGFyZWQgRmlsZXNcbiAgICBjb25zdCBjb250ZW50RW50cnlJZCA9IGNvbnRlbnRFbnRyeS5ub2RlSWQgfHwgY29udGVudEVudHJ5LmlkO1xuICAgIGNvbnN0IGluaXRpYWxQYXJlbnRJZCA9IHRoaXMuZ2V0RW50cnlQYXJlbnRJZChjb250ZW50RW50cnkpO1xuICAgIGxldCAkZGVzdGluYXRpb25Gb2xkZXI6IE9ic2VydmFibGU8YW55PjtcbiAgICBsZXQgJGNoaWxkcmVuVG9Nb3ZlOiBPYnNlcnZhYmxlPGFueT47XG4gICAgbGV0IG5ld0Rlc3RpbmF0aW9uRm9sZGVyO1xuXG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZS5tb3ZlTm9kZShjb250ZW50RW50cnlJZCwgc2VsZWN0aW9uSWQpLnBpcGUoXG4gICAgICBtYXAoKGl0ZW1Nb3ZlZCkgPT4gKHsgaXRlbU1vdmVkLCBpbml0aWFsUGFyZW50SWQgfSkpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgIGxldCBlcnJTdGF0dXNDb2RlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGVycm9yOiB7IHN0YXR1c0NvZGUgfVxuICAgICAgICAgIH0gPSBKU09OLnBhcnNlKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICBlcnJTdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyU3RhdHVzQ29kZSAmJiBlcnJTdGF0dXNDb2RlID09PSA0MDkpIHtcbiAgICAgICAgICAkZGVzdGluYXRpb25Gb2xkZXIgPSB0aGlzLmdldENoaWxkQnlOYW1lKHNlbGVjdGlvbklkLCBjb250ZW50RW50cnkubmFtZSk7XG4gICAgICAgICAgJGNoaWxkcmVuVG9Nb3ZlID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4oY29udGVudEVudHJ5SWQpO1xuXG4gICAgICAgICAgcmV0dXJuICRkZXN0aW5hdGlvbkZvbGRlci5waXBlKFxuICAgICAgICAgICAgbWVyZ2VNYXAoKGRlc3RpbmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIG5ld0Rlc3RpbmF0aW9uRm9sZGVyID0gZGVzdGluYXRpb247XG4gICAgICAgICAgICAgIHJldHVybiAkY2hpbGRyZW5Ub01vdmU7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1lcmdlTWFwKChjaGlsZHJlblRvTW92ZSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBiYXRjaDogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgY2hpbGRyZW5Ub01vdmUubGlzdC5lbnRyaWVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5lbnRyeS5pc0ZvbGRlcikge1xuICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaCh0aGlzLm1vdmVGb2xkZXJBY3Rpb24obm9kZS5lbnRyeSwgbmV3RGVzdGluYXRpb25Gb2xkZXIuZW50cnkuaWQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaCh0aGlzLm1vdmVDb250ZW50QWN0aW9uKG5vZGUuZW50cnksIG5ld0Rlc3RpbmF0aW9uRm9sZGVyLmVudHJ5LmlkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBpZiAoIWJhdGNoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvZihiYXRjaCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHppcCguLi5iYXRjaCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZG8gbm90IHRocm93IGVycm9yLCB0byBiZSBhYmxlIHRvIHNob3cgbWVzc2FnZSBpbiBjYXNlIG9mIHBhcnRpYWwgbW92ZSBvZiBmaWxlc1xuICAgICAgICAgIHJldHVybiBvZihlcnIpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBtb3ZlQ29udGVudEFjdGlvbihjb250ZW50RW50cnk6IGFueSwgc2VsZWN0aW9uSWQ6IHN0cmluZykge1xuICAgIC8vIENoZWNrIGlmIHRoZXJlJ3Mgbm9kZUlkIGZvciBTaGFyZWQgRmlsZXNcbiAgICBjb25zdCBjb250ZW50RW50cnlJZCA9IGNvbnRlbnRFbnRyeS5ub2RlSWQgfHwgY29udGVudEVudHJ5LmlkO1xuICAgIGNvbnN0IGluaXRpYWxQYXJlbnRJZCA9IHRoaXMuZ2V0RW50cnlQYXJlbnRJZChjb250ZW50RW50cnkpO1xuXG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZS5tb3ZlTm9kZShjb250ZW50RW50cnlJZCwgc2VsZWN0aW9uSWQpLnBpcGUoXG4gICAgICBtYXAoKGl0ZW1Nb3ZlZCkgPT4gKHsgaXRlbU1vdmVkLCBpbml0aWFsUGFyZW50SWQgfSkpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PlxuICAgICAgICAvLyBkbyBub3QgdGhyb3cgZXJyb3IsIHRvIGJlIGFibGUgdG8gc2hvdyBtZXNzYWdlIGluIGNhc2Ugb2YgcGFydGlhbCBtb3ZlIG9mIGZpbGVzXG4gICAgICAgIG9mKGVycilcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgZ2V0Q2hpbGRCeU5hbWUocGFyZW50SWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogU3ViamVjdDxOb2RlQ2hpbGRBc3NvY2lhdGlvbkVudHJ5PiB7XG4gICAgY29uc3QgbWF0Y2hlZE5vZGVzID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gICAgdGhpcy5nZXROb2RlQ2hpbGRyZW4ocGFyZW50SWQpLnN1YnNjcmliZShcbiAgICAgIChjaGlsZHJlbk5vZGVzOiBOb2RlQ2hpbGRBc3NvY2lhdGlvblBhZ2luZykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjaGlsZHJlbk5vZGVzLmxpc3QuZW50cmllcy5maW5kKChub2RlKSA9PiBub2RlLmVudHJ5Lm5hbWUgPT09IG5hbWUpO1xuXG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBtYXRjaGVkTm9kZXMubmV4dChyZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hdGNoZWROb2Rlcy5uZXh0KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKGVycikgPT4gbWF0Y2hlZE5vZGVzLmVycm9yKGVycilcbiAgICApO1xuICAgIHJldHVybiBtYXRjaGVkTm9kZXM7XG4gIH1cblxuICBwcml2YXRlIGlzQWN0aW9uQWxsb3dlZChhY3Rpb246IEJhdGNoT3BlcmF0aW9uVHlwZSwgbm9kZTogTm9kZSwgcGVybWlzc2lvbj86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChhY3Rpb24gPT09IE5vZGVBY3Rpb24uQ09QWSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRlbnRTZXJ2aWNlLmhhc0FsbG93YWJsZU9wZXJhdGlvbnMobm9kZSwgcGVybWlzc2lvbik7XG4gIH1cblxuICBwcml2YXRlIHJvd0ZpbHRlcihyb3c6IFNoYXJlRGF0YVJvdyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vZGU6IE5vZGUgPSByb3cubm9kZS5lbnRyeTtcblxuICAgIHRoaXMuaXNTaXRlc0Rlc3RpbmF0aW9uQXZhaWxhYmxlID0gISFub2RlWydndWlkJ107XG4gICAgcmV0dXJuICFub2RlLmlzRmlsZSAmJiBub2RlLm5vZGVUeXBlICE9PSAnYXBwOmZvbGRlcmxpbmsnO1xuICB9XG5cbiAgcHJpdmF0ZSBpbWFnZVJlc29sdmVyKHJvdzogU2hhcmVEYXRhUm93KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgZW50cnk6IE5vZGUgPSByb3cubm9kZS5lbnRyeTtcbiAgICBpZiAoIXRoaXMuY29udGVudFNlcnZpY2UuaGFzQWxsb3dhYmxlT3BlcmF0aW9ucyhlbnRyeSwgJ3VwZGF0ZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy50aHVtYm5haWxTZXJ2aWNlLmdldE1pbWVUeXBlSWNvbignZGlzYWJsZS9mb2xkZXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXROZXdOYW1lRnJvbShuYW1lOiBzdHJpbmcsIGJhc2VOYW1lPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uTWF0Y2ggPSBuYW1lLm1hdGNoKC9cXC5bXi8uXSskLyk7XG5cbiAgICAvLyByZW1vdmUgZXh0ZW5zaW9uIGluIGNhc2UgdGhlcmUgaXMgb25lXG4gICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IGV4dGVuc2lvbk1hdGNoID8gZXh0ZW5zaW9uTWF0Y2hbMF0gOiAnJztcbiAgICBsZXQgZXh0ZW5zaW9uRnJlZSA9IGV4dGVuc2lvbk1hdGNoID8gbmFtZS5zbGljZSgwLCBleHRlbnNpb25NYXRjaC5pbmRleCkgOiBuYW1lO1xuXG4gICAgbGV0IHByZWZpeE51bWJlciA9IDE7XG4gICAgbGV0IGJhc2VFeHRlbnNpb25GcmVlO1xuXG4gICAgaWYgKGJhc2VOYW1lKSB7XG4gICAgICBjb25zdCBiYXNlRXh0ZW5zaW9uTWF0Y2ggPSBiYXNlTmFtZS5tYXRjaCgvXFwuW14vLl0rJC8pO1xuXG4gICAgICAvLyByZW1vdmUgZXh0ZW5zaW9uIGluIGNhc2UgdGhlcmUgaXMgb25lXG4gICAgICBiYXNlRXh0ZW5zaW9uRnJlZSA9IGJhc2VFeHRlbnNpb25NYXRjaCA/IGJhc2VOYW1lLnNsaWNlKDAsIGJhc2VFeHRlbnNpb25NYXRjaC5pbmRleCkgOiBiYXNlTmFtZTtcbiAgICB9XG5cbiAgICBpZiAoIWJhc2VFeHRlbnNpb25GcmVlIHx8IGJhc2VFeHRlbnNpb25GcmVlICE9PSBleHRlbnNpb25GcmVlKSB7XG4gICAgICAvLyBjaGVjayBpZiBuYW1lIGFscmVhZHkgaGFzIGludGVnZXIgYXBwZW5kZWQgb24gZW5kOlxuICAgICAgY29uc3Qgb2xkUHJlZml4ID0gZXh0ZW5zaW9uRnJlZS5tYXRjaCgnLVswLTldKyQnKTtcbiAgICAgIGlmIChvbGRQcmVmaXgpIHtcbiAgICAgICAgLy8gaWYgc28sIHRyeSB0byBnZXQgdGhlIG51bWJlciBhdCB0aGUgZW5kXG4gICAgICAgIGNvbnN0IG9sZFByZWZpeE51bWJlciA9IHBhcnNlSW50KG9sZFByZWZpeFswXS5zbGljZSgxKSwgMTApO1xuICAgICAgICBpZiAob2xkUHJlZml4TnVtYmVyLnRvU3RyaW5nKCkgPT09IG9sZFByZWZpeFswXS5zbGljZSgxKSkge1xuICAgICAgICAgIGV4dGVuc2lvbkZyZWUgPSBleHRlbnNpb25GcmVlLnNsaWNlKDAsIG9sZFByZWZpeC5pbmRleCk7XG4gICAgICAgICAgcHJlZml4TnVtYmVyID0gb2xkUHJlZml4TnVtYmVyICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXh0ZW5zaW9uRnJlZSArICctJyArIHByZWZpeE51bWJlciArIGZpbGVFeHRlbnNpb247XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNoaWxkcmVuIG5vZGVzIG9mIGdpdmVuIHBhcmVudCBub2RlXG4gICAqXG4gICAqIEBwYXJhbSBub2RlSWQgVGhlIGlkIG9mIHRoZSBwYXJlbnQgbm9kZVxuICAgKiBAcGFyYW0gcGFyYW1zIG9wdGlvbmFsIHBhcmFtZXRlcnNcbiAgICovXG4gIGdldE5vZGVDaGlsZHJlbihub2RlSWQ6IHN0cmluZywgcGFyYW1zPzogYW55KTogT2JzZXJ2YWJsZTxOb2RlQ2hpbGRBc3NvY2lhdGlvblBhZ2luZz4ge1xuICAgIHJldHVybiBmcm9tKHRoaXMubm9kZXNBcGkubGlzdE5vZGVDaGlsZHJlbihub2RlSWQsIHBhcmFtcykpO1xuICB9XG5cbiAgLy8gQ29waWVkIGZyb20gQURGIGRvY3VtZW50LWxpc3Quc2VydmljZSwgYW5kIGFkZGVkIHRoZSBuYW1lIHBhcmFtZXRlclxuICAvKipcbiAgICogQ29weSBhIG5vZGUgdG8gZGVzdGluYXRpb24gbm9kZVxuICAgKlxuICAgKiBAcGFyYW0gbm9kZUlkIFRoZSBpZCBvZiB0aGUgbm9kZSB0byBiZSBjb3BpZWRcbiAgICogQHBhcmFtIHRhcmdldFBhcmVudElkIFRoZSBpZCBvZiB0aGUgZm9sZGVyLW5vZGUgd2hlcmUgdGhlIG5vZGUgaGF2ZSB0byBiZSBjb3BpZWQgdG9cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5ldyBuYW1lIGZvciB0aGUgY29weSB0aGF0IHdvdWxkIGJlIGFkZGVkIG9uIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXJcbiAgICovXG4gIGNvcHlOb2RlKG5vZGVJZDogc3RyaW5nLCB0YXJnZXRQYXJlbnRJZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZyb20odGhpcy5ub2Rlc0FwaS5jb3B5Tm9kZShub2RlSWQsIHsgdGFyZ2V0UGFyZW50SWQsIG5hbWUgfSkpO1xuICB9XG5cbiAgcHVibGljIGZsYXR0ZW4obkRpbUFycmF5OiBhbnlbXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShuRGltQXJyYXkpKSB7XG4gICAgICByZXR1cm4gbkRpbUFycmF5O1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVRdWV1ZSA9IG5EaW1BcnJheS5zbGljZSgwKTtcbiAgICBjb25zdCByZXN1bHRpbmdBcnJheTogYW55W10gPSBbXTtcblxuICAgIGRvIHtcbiAgICAgIG5vZGVRdWV1ZS5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICAgICAgbm9kZVF1ZXVlLnB1c2goLi4ubm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0aW5nQXJyYXkucHVzaChub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vZGVJbmRleCA9IG5vZGVRdWV1ZS5pbmRleE9mKG5vZGUpO1xuICAgICAgICBub2RlUXVldWUuc3BsaWNlKG5vZGVJbmRleCwgMSk7XG4gICAgICB9KTtcbiAgICB9IHdoaWxlIChub2RlUXVldWUubGVuZ3RoKTtcblxuICAgIHJldHVybiByZXN1bHRpbmdBcnJheTtcbiAgfVxuXG4gIHByb2Nlc3NSZXNwb25zZShkYXRhOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IG1vdmVTdGF0dXMgPSB7XG4gICAgICBzdWNjZWVkZWQ6IFtdLFxuICAgICAgZmFpbGVkOiBbXSxcbiAgICAgIHBhcnRpYWxseVN1Y2NlZWRlZDogW11cbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLnJlZHVjZSgoYWNjLCBuZXh0KSA9PiB7XG4gICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBhY2MuZmFpbGVkLnB1c2gobmV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShuZXh0KSkge1xuICAgICAgICAgIC8vIGlmIGNvbnRlbnQgb2YgYSBmb2xkZXIgd2FzIG1vdmVkXG5cbiAgICAgICAgICBjb25zdCBmb2xkZXJNb3ZlUmVzcG9uc2VEYXRhID0gdGhpcy5mbGF0dGVuKG5leHQpO1xuICAgICAgICAgIGNvbnN0IGZvdW5kRXJyb3IgPSBmb2xkZXJNb3ZlUmVzcG9uc2VEYXRhLmZpbmQoKG5vZGUpID0+IG5vZGUgaW5zdGFuY2VvZiBFcnJvcik7XG4gICAgICAgICAgLy8gZGF0YSBtaWdodCBjb250YWluIGFsc28gaXRlbXMgb2YgZm9ybTogeyBpdGVtTW92ZWQsIGluaXRpYWxQYXJlbnRJZCB9XG4gICAgICAgICAgY29uc3QgZm91bmRFbnRyeSA9IGZvbGRlck1vdmVSZXNwb25zZURhdGEuZmluZCgobm9kZSkgPT4gbm9kZS5pdGVtTW92ZWQ/LmVudHJ5IHx8IG5vZGU/LmVudHJ5KTtcblxuICAgICAgICAgIGlmICghZm91bmRFcnJvcikge1xuICAgICAgICAgICAgLy8gY29uc2lkZXIgc3VjY2VzcyBpZiBOT05FIG9mIHRoZSBpdGVtcyBmcm9tIHRoZSBmb2xkZXIgbW92ZSByZXNwb25zZSBpcyBhbiBlcnJvclxuICAgICAgICAgICAgYWNjLnN1Y2NlZWRlZC5wdXNoKG5leHQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWZvdW5kRW50cnkpIHtcbiAgICAgICAgICAgIC8vIGNvbnNpZGVyIGZhaWxlZCBpZiBOT05FIG9mIHRoZSBpdGVtcyBoYXMgYW4gZW50cnlcbiAgICAgICAgICAgIGFjYy5mYWlsZWQucHVzaChuZXh0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFydGlhbGx5IG1vdmUgZm9sZGVyXG4gICAgICAgICAgICBhY2MucGFydGlhbGx5U3VjY2VlZGVkLnB1c2gobmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjYy5zdWNjZWVkZWQucHVzaChuZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBtb3ZlU3RhdHVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRhdGEuaXRlbU1vdmVkPy5lbnRyeSB8fCBkYXRhPy5lbnRyeSkge1xuICAgICAgICBtb3ZlU3RhdHVzLnN1Y2NlZWRlZC5wdXNoKGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW92ZVN0YXR1cy5mYWlsZWQucHVzaChkYXRhKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1vdmVTdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRTZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGZvY3VzZWRFbGVtZW50U2VsZWN0b3IpIHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGZvY3VzZWRFbGVtZW50U2VsZWN0b3IpPy5mb2N1cygpO1xuICAgIH1cbiAgfVxufVxuIl19
|