@alfresco/adf-content-services 8.1.0-15972188736 → 8.1.0-15979090800
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/esm2022/adf-content-services.mjs +5 -0
- package/esm2022/lib/agent/index.mjs +18 -0
- package/esm2022/lib/agent/public-api.mjs +18 -0
- package/esm2022/lib/agent/services/agent.service.mjs +60 -0
- package/esm2022/lib/alfresco-icon/alfresco-icon.component.mjs +27 -0
- package/esm2022/lib/api-factories/alfresco-api-no-auth.service.mjs +42 -0
- package/esm2022/lib/api-factories/alfresco-api-v2-loader.service.mjs +77 -0
- package/esm2022/lib/api-factories/index.mjs +18 -0
- package/esm2022/lib/api-factories/public-api.mjs +19 -0
- package/esm2022/lib/aspect-list/aspect-list-dialog-data.interface.mjs +18 -0
- package/esm2022/lib/aspect-list/aspect-list-dialog.component.mjs +77 -0
- package/esm2022/lib/aspect-list/aspect-list.component.mjs +139 -0
- package/esm2022/lib/aspect-list/aspect-list.module.mjs +35 -0
- package/esm2022/lib/aspect-list/index.mjs +18 -0
- package/esm2022/lib/aspect-list/public-api.mjs +24 -0
- package/esm2022/lib/aspect-list/services/aspect-list.service.mjs +83 -0
- package/esm2022/lib/aspect-list/services/dialog-aspect-list.service.mjs +86 -0
- package/esm2022/lib/aspect-list/services/node-aspect.service.mjs +52 -0
- package/esm2022/lib/auth-loader/content-auth-loader-factory.mjs +26 -0
- package/esm2022/lib/auth-loader/content-auth-loader.service.mjs +42 -0
- package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +166 -0
- package/esm2022/lib/breadcrumb/breadcrumb.module.mjs +35 -0
- package/esm2022/lib/breadcrumb/dropdown-breadcrumb.component.mjs +65 -0
- package/esm2022/lib/breadcrumb/index.mjs +18 -0
- package/esm2022/lib/breadcrumb/public-api.mjs +20 -0
- package/esm2022/lib/category/categories-management/categories-management-mode.mjs +22 -0
- package/esm2022/lib/category/categories-management/categories-management.component.mjs +308 -0
- package/esm2022/lib/category/category.module.mjs +33 -0
- package/esm2022/lib/category/index.mjs +18 -0
- package/esm2022/lib/category/models/category-node.interface.mjs +18 -0
- package/esm2022/lib/category/public-api.mjs +23 -0
- package/esm2022/lib/category/services/category-tree-datasource.service.mjs +80 -0
- package/esm2022/lib/category/services/category.service.mjs +159 -0
- package/esm2022/lib/common/events/file.event.mjs +46 -0
- package/esm2022/lib/common/index.mjs +18 -0
- package/esm2022/lib/common/interfaces/saved-search.interface.mjs +18 -0
- package/esm2022/lib/common/interfaces/search-configuration.interface.mjs +18 -0
- package/esm2022/lib/common/mocks/ecm-user.service.mock.mjs +37 -0
- package/esm2022/lib/common/models/allowable-operations.enum.mjs +30 -0
- package/esm2022/lib/common/models/ecm-company.model.mjs +19 -0
- package/esm2022/lib/common/models/ecm-user.model.mjs +45 -0
- package/esm2022/lib/common/models/file.model.mjs +53 -0
- package/esm2022/lib/common/models/node-metadata.model.mjs +23 -0
- package/esm2022/lib/common/models/permissions.enum.mjs +32 -0
- package/esm2022/lib/common/public-api.mjs +37 -0
- package/esm2022/lib/common/services/card-view-content-update.service.mjs +55 -0
- package/esm2022/lib/common/services/content.service.mjs +180 -0
- package/esm2022/lib/common/services/discovery-api.service.mjs +79 -0
- package/esm2022/lib/common/services/favorites-api.service.mjs +84 -0
- package/esm2022/lib/common/services/nodes-api.service.mjs +251 -0
- package/esm2022/lib/common/services/people-content.service.mjs +138 -0
- package/esm2022/lib/common/services/rendition.service.mjs +270 -0
- package/esm2022/lib/common/services/saved-searches.service.mjs +206 -0
- package/esm2022/lib/common/services/sites.service.mjs +243 -0
- package/esm2022/lib/common/services/upload.service.mjs +391 -0
- package/esm2022/lib/content-metadata/components/content-metadata/content-metadata-header.component.mjs +54 -0
- package/esm2022/lib/content-metadata/components/content-metadata/content-metadata.component.mjs +490 -0
- package/esm2022/lib/content-metadata/components/content-metadata-card/content-metadata-card.component.mjs +128 -0
- package/esm2022/lib/content-metadata/content-metadata.module.mjs +36 -0
- package/esm2022/lib/content-metadata/index.mjs +18 -0
- package/esm2022/lib/content-metadata/interfaces/aspect-oriented-config.interface.mjs +18 -0
- package/esm2022/lib/content-metadata/interfaces/card-view-group.interface.mjs +18 -0
- package/esm2022/lib/content-metadata/interfaces/content-metadata-config.interface.mjs +18 -0
- package/esm2022/lib/content-metadata/interfaces/content-metadata-custom-panel.interface.mjs +18 -0
- package/esm2022/lib/content-metadata/interfaces/content-metadata-panel.interface.mjs +18 -0
- package/esm2022/lib/content-metadata/interfaces/content-metadata.interfaces.mjs +28 -0
- package/esm2022/lib/content-metadata/interfaces/indifferent-config.interface.mjs +18 -0
- package/esm2022/lib/content-metadata/interfaces/layout-oriented-config.interface.mjs +18 -0
- package/esm2022/lib/content-metadata/interfaces/organised-property-group.interface.mjs +18 -0
- package/esm2022/lib/content-metadata/interfaces/preset-config.interface.mjs +18 -0
- package/esm2022/lib/content-metadata/interfaces/property-group.interface.mjs +18 -0
- package/esm2022/lib/content-metadata/interfaces/property.interface.mjs +18 -0
- package/esm2022/lib/content-metadata/public-api.mjs +31 -0
- package/esm2022/lib/content-metadata/services/basic-properties.service.mjs +107 -0
- package/esm2022/lib/content-metadata/services/config/aspect-oriented-config.service.mjs +106 -0
- package/esm2022/lib/content-metadata/services/config/content-metadata-config.factory.mjs +76 -0
- package/esm2022/lib/content-metadata/services/config/indifferent-config.service.mjs +40 -0
- package/esm2022/lib/content-metadata/services/config/layout-oriented-config.service.mjs +108 -0
- package/esm2022/lib/content-metadata/services/config/property-group-reader.mjs +33 -0
- package/esm2022/lib/content-metadata/services/content-metadata.service.mjs +99 -0
- package/esm2022/lib/content-metadata/services/content-type-property.service.mjs +134 -0
- package/esm2022/lib/content-metadata/services/property-descriptors.service.mjs +52 -0
- package/esm2022/lib/content-metadata/services/property-groups-translator.service.mjs +169 -0
- package/esm2022/lib/content-node-selector/content-node-dialog.service.mjs +256 -0
- package/esm2022/lib/content-node-selector/content-node-selector-panel/content-node-selector-panel.component.mjs +617 -0
- package/esm2022/lib/content-node-selector/content-node-selector-panel/content-node-selector-panel.service.mjs +66 -0
- package/esm2022/lib/content-node-selector/content-node-selector.component-data.interface.mjs +18 -0
- package/esm2022/lib/content-node-selector/content-node-selector.component.mjs +205 -0
- package/esm2022/lib/content-node-selector/content-node-selector.module.mjs +50 -0
- package/esm2022/lib/content-node-selector/index.mjs +18 -0
- package/esm2022/lib/content-node-selector/name-location-cell/name-location-cell.component.mjs +48 -0
- package/esm2022/lib/content-node-selector/public-api.mjs +25 -0
- package/esm2022/lib/content-node-selector/site-dropdown/sites-dropdown.component.mjs +168 -0
- package/esm2022/lib/content-node-share/content-node-share.dialog.mjs +287 -0
- package/esm2022/lib/content-node-share/content-node-share.directive.mjs +102 -0
- package/esm2022/lib/content-node-share/content-node-share.module.mjs +35 -0
- package/esm2022/lib/content-node-share/content-node-share.settings.mjs +18 -0
- package/esm2022/lib/content-node-share/index.mjs +18 -0
- package/esm2022/lib/content-node-share/public-api.mjs +22 -0
- package/esm2022/lib/content-node-share/services/shared-links-api.service.mjs +83 -0
- package/esm2022/lib/content-type/content-type-dialog.component.mjs +57 -0
- package/esm2022/lib/content-type/content-type-metadata.interface.mjs +18 -0
- package/esm2022/lib/content-type/content-type.service.mjs +52 -0
- package/esm2022/lib/content-type/index.mjs +20 -0
- package/esm2022/lib/content.module.mjs +277 -0
- package/esm2022/lib/dialogs/category-selector/category-selector.dialog.mjs +51 -0
- package/esm2022/lib/dialogs/dialog.module.mjs +52 -0
- package/esm2022/lib/dialogs/download-zip/download-zip.dialog.mjs +111 -0
- package/esm2022/lib/dialogs/download-zip/download-zip.dialog.module.mjs +38 -0
- package/esm2022/lib/dialogs/download-zip/services/download-zip.service.mjs +66 -0
- package/esm2022/lib/dialogs/folder/folder-name.validators.mjs +44 -0
- package/esm2022/lib/dialogs/folder/folder.dialog.mjs +146 -0
- package/esm2022/lib/dialogs/index.mjs +18 -0
- package/esm2022/lib/dialogs/library/library.dialog.mjs +224 -0
- package/esm2022/lib/dialogs/node-lock/node-lock.dialog.mjs +115 -0
- package/esm2022/lib/dialogs/public-api.mjs +25 -0
- package/esm2022/lib/directives/auto-focus.directive.mjs +38 -0
- package/esm2022/lib/directives/check-allowable-operation.directive.mjs +126 -0
- package/esm2022/lib/directives/content-directive.module.mjs +75 -0
- package/esm2022/lib/directives/index.mjs +18 -0
- package/esm2022/lib/directives/library-favorite.directive.mjs +119 -0
- package/esm2022/lib/directives/library-membership.directive.mjs +202 -0
- package/esm2022/lib/directives/node-counter.directive.mjs +59 -0
- package/esm2022/lib/directives/node-delete.directive.mjs +177 -0
- package/esm2022/lib/directives/node-download.directive.mjs +138 -0
- package/esm2022/lib/directives/node-favorite.directive.mjs +193 -0
- package/esm2022/lib/directives/node-lock.directive.mjs +57 -0
- package/esm2022/lib/directives/node-restore.directive.mjs +218 -0
- package/esm2022/lib/directives/public-api.mjs +28 -0
- package/esm2022/lib/document-list/components/content-action/content-action-list.component.mjs +60 -0
- package/esm2022/lib/document-list/components/content-action/content-action.component.mjs +196 -0
- package/esm2022/lib/document-list/components/document-list.component.mjs +963 -0
- package/esm2022/lib/document-list/components/document-list.token.mjs +21 -0
- package/esm2022/lib/document-list/components/file-auto-download/file-auto-download.component.mjs +42 -0
- package/esm2022/lib/document-list/components/filter-header/filter-header.component.mjs +107 -0
- package/esm2022/lib/document-list/components/library-name-column/library-name-column.component.mjs +131 -0
- package/esm2022/lib/document-list/components/library-role-column/library-role-column.component.mjs +91 -0
- package/esm2022/lib/document-list/components/library-status-column/library-status-column.component.mjs +86 -0
- package/esm2022/lib/document-list/components/name-column/name-column.component.mjs +118 -0
- package/esm2022/lib/document-list/components/node.event.mjs +30 -0
- package/esm2022/lib/document-list/components/trashcan-name-column/trashcan-name-column.component.mjs +83 -0
- package/esm2022/lib/document-list/data/image-resolver.model.mjs +18 -0
- package/esm2022/lib/document-list/data/row-filter.model.mjs +18 -0
- package/esm2022/lib/document-list/data/share-data-row.model.mjs +102 -0
- package/esm2022/lib/document-list/data/share-datatable-adapter.mjs +258 -0
- package/esm2022/lib/document-list/document-list.module.mjs +75 -0
- package/esm2022/lib/document-list/index.mjs +18 -0
- package/esm2022/lib/document-list/interfaces/document-list-loader.interface.mjs +18 -0
- package/esm2022/lib/document-list/models/content-action.model.mjs +59 -0
- package/esm2022/lib/document-list/models/document-folder.model.mjs +23 -0
- package/esm2022/lib/document-list/models/node-action.enum.mjs +27 -0
- package/esm2022/lib/document-list/models/permissions-style.model.mjs +27 -0
- package/esm2022/lib/document-list/models/permissions.model.mjs +26 -0
- package/esm2022/lib/document-list/models/preset.model.mjs +257 -0
- package/esm2022/lib/document-list/public-api.mjs +47 -0
- package/esm2022/lib/document-list/services/custom-resources.service.mjs +378 -0
- package/esm2022/lib/document-list/services/document-actions.service.mjs +142 -0
- package/esm2022/lib/document-list/services/document-list.service.mjs +175 -0
- package/esm2022/lib/document-list/services/folder-actions.service.mjs +137 -0
- package/esm2022/lib/document-list/services/lock.service.mjs +72 -0
- package/esm2022/lib/document-list/services/node-actions.service.mjs +122 -0
- package/esm2022/lib/group/index.mjs +18 -0
- package/esm2022/lib/group/public-api.mjs +18 -0
- package/esm2022/lib/group/services/group.service.mjs +84 -0
- package/esm2022/lib/infinite-scroll-datasource/index.mjs +18 -0
- package/esm2022/lib/infinite-scroll-datasource/infinite-scroll-datasource.mjs +69 -0
- package/esm2022/lib/infinite-scroll-datasource/public-api.mjs +18 -0
- package/esm2022/lib/interfaces/base-card-view-content-update.interface.mjs +18 -0
- package/esm2022/lib/interfaces/index.mjs +18 -0
- package/esm2022/lib/interfaces/library-entity.interface.mjs +18 -0
- package/esm2022/lib/interfaces/library-membership-error-event.interface.mjs +18 -0
- package/esm2022/lib/interfaces/library-membership-toggle-event.interface.mjs +18 -0
- package/esm2022/lib/interfaces/node-allowable-operation-subject.interface.mjs +18 -0
- package/esm2022/lib/interfaces/public-api.mjs +23 -0
- package/esm2022/lib/interfaces/restore-message-model.interface.mjs +19 -0
- package/esm2022/lib/legal-hold/index.mjs +18 -0
- package/esm2022/lib/legal-hold/public-api.mjs +18 -0
- package/esm2022/lib/legal-hold/services/legal-hold.service.mjs +136 -0
- package/esm2022/lib/material.module.mjs +183 -0
- package/esm2022/lib/mock/alfresco-api.service.mock.mjs +43 -0
- package/esm2022/lib/mock/date-range-search-filter.mock.mjs +65 -0
- package/esm2022/lib/mock/document-library.model.mock.mjs +84 -0
- package/esm2022/lib/mock/document-list.component.mock.mjs +364 -0
- package/esm2022/lib/mock/index.mjs +18 -0
- package/esm2022/lib/mock/new-version-uploader.service.mock.mjs +161 -0
- package/esm2022/lib/mock/public-api.mjs +27 -0
- package/esm2022/lib/mock/search-filter-mock.mjs +637 -0
- package/esm2022/lib/mock/search-query.mock.mjs +40 -0
- package/esm2022/lib/mock/search.component.mock.mjs +165 -0
- package/esm2022/lib/mock/search.service.mock.mjs +61 -0
- package/esm2022/lib/mock/sites-dropdown.component.mock.mjs +281 -0
- package/esm2022/lib/new-version-uploader/index.mjs +18 -0
- package/esm2022/lib/new-version-uploader/models/index.mjs +18 -0
- package/esm2022/lib/new-version-uploader/models/new-version-uploader.model.mjs +24 -0
- package/esm2022/lib/new-version-uploader/new-version-uploader.dialog.mjs +74 -0
- package/esm2022/lib/new-version-uploader/new-version-uploader.module.mjs +33 -0
- package/esm2022/lib/new-version-uploader/new-version-uploader.service.mjs +103 -0
- package/esm2022/lib/new-version-uploader/public-api.mjs +21 -0
- package/esm2022/lib/node-comments/index.mjs +18 -0
- package/esm2022/lib/node-comments/node-comments.component.mjs +44 -0
- package/esm2022/lib/node-comments/node-comments.module.mjs +33 -0
- package/esm2022/lib/node-comments/public-api.mjs +20 -0
- package/esm2022/lib/node-comments/services/node-comments.service.mjs +85 -0
- package/esm2022/lib/permission-manager/components/add-permission/add-permission-dialog-data.interface.mjs +18 -0
- package/esm2022/lib/permission-manager/components/add-permission/add-permission-dialog.component.mjs +123 -0
- package/esm2022/lib/permission-manager/components/add-permission/add-permission-panel.component.mjs +102 -0
- package/esm2022/lib/permission-manager/components/add-permission/add-permission.component.mjs +69 -0
- package/esm2022/lib/permission-manager/components/add-permission/search-config-permission.service.mjs +45 -0
- package/esm2022/lib/permission-manager/components/inherited-button.directive.mjs +67 -0
- package/esm2022/lib/permission-manager/components/node-path-column/node-path-column.component.mjs +56 -0
- package/esm2022/lib/permission-manager/components/permission-container/permission-container.component.mjs +102 -0
- package/esm2022/lib/permission-manager/components/permission-list/permission-list.component.mjs +87 -0
- package/esm2022/lib/permission-manager/components/permission-list/permission-list.service.mjs +219 -0
- package/esm2022/lib/permission-manager/components/pop-over.directive.mjs +134 -0
- package/esm2022/lib/permission-manager/components/user-icon-column/user-icon-column.component.mjs +88 -0
- package/esm2022/lib/permission-manager/components/user-name-column/user-name-column.component.mjs +82 -0
- package/esm2022/lib/permission-manager/components/user-role-column/user-role-column.component.mjs +111 -0
- package/esm2022/lib/permission-manager/index.mjs +18 -0
- package/esm2022/lib/permission-manager/models/member.model.mjs +59 -0
- package/esm2022/lib/permission-manager/models/permission.model.mjs +29 -0
- package/esm2022/lib/permission-manager/models/role.model.mjs +18 -0
- package/esm2022/lib/permission-manager/permission-manager.module.mjs +84 -0
- package/esm2022/lib/permission-manager/public-api.mjs +36 -0
- package/esm2022/lib/permission-manager/services/node-permission-dialog.service.mjs +78 -0
- package/esm2022/lib/permission-manager/services/node-permission.service.mjs +299 -0
- package/esm2022/lib/pipes/content-pipe.module.mjs +37 -0
- package/esm2022/lib/pipes/index.mjs +18 -0
- package/esm2022/lib/pipes/node-name-tooltip.pipe.mjs +69 -0
- package/esm2022/lib/pipes/public-api.mjs +19 -0
- package/esm2022/lib/prediction/index.mjs +18 -0
- package/esm2022/lib/prediction/public-api.mjs +18 -0
- package/esm2022/lib/prediction/services/index.mjs +18 -0
- package/esm2022/lib/prediction/services/prediction.service.mjs +57 -0
- package/esm2022/lib/search/components/empty-search-result.component.mjs +27 -0
- package/esm2022/lib/search/components/index.mjs +43 -0
- package/esm2022/lib/search/components/reset-search.directive.mjs +41 -0
- package/esm2022/lib/search/components/search-check-list/index.mjs +18 -0
- package/esm2022/lib/search/components/search-check-list/search-check-list.component.mjs +158 -0
- package/esm2022/lib/search/components/search-chip-autocomplete-input/index.mjs +18 -0
- package/esm2022/lib/search/components/search-chip-autocomplete-input/search-chip-autocomplete-input.component.mjs +169 -0
- package/esm2022/lib/search/components/search-chip-list/search-chip-list.component.mjs +46 -0
- package/esm2022/lib/search/components/search-control.component.mjs +180 -0
- package/esm2022/lib/search/components/search-date-range-tabbed/index.mjs +22 -0
- package/esm2022/lib/search/components/search-date-range-tabbed/search-date-range/date-range-type.mjs +23 -0
- package/esm2022/lib/search/components/search-date-range-tabbed/search-date-range/in-last-date-type.mjs +23 -0
- package/esm2022/lib/search/components/search-date-range-tabbed/search-date-range/search-date-range.component.mjs +196 -0
- package/esm2022/lib/search/components/search-date-range-tabbed/search-date-range/search-date-range.mjs +18 -0
- package/esm2022/lib/search/components/search-date-range-tabbed/search-date-range-tabbed.component.mjs +201 -0
- package/esm2022/lib/search/components/search-datetime-range/index.mjs +18 -0
- package/esm2022/lib/search/components/search-datetime-range/search-datetime-range.component.mjs +223 -0
- package/esm2022/lib/search/components/search-facet-field/index.mjs +18 -0
- package/esm2022/lib/search/components/search-facet-field/search-facet-field.component.mjs +132 -0
- package/esm2022/lib/search/components/search-filter/index.mjs +19 -0
- package/esm2022/lib/search/components/search-filter/search-filter-card/search-filter-card.component.mjs +45 -0
- package/esm2022/lib/search/components/search-filter/search-filter.component.mjs +80 -0
- package/esm2022/lib/search/components/search-filter-autocomplete-chips/index.mjs +18 -0
- package/esm2022/lib/search/components/search-filter-autocomplete-chips/search-filter-autocomplete-chips.component.mjs +154 -0
- package/esm2022/lib/search/components/search-filter-chips/index.mjs +23 -0
- package/esm2022/lib/search/components/search-filter-chips/search-facet-chip/search-facet-chip.component.mjs +104 -0
- package/esm2022/lib/search/components/search-filter-chips/search-facet-chip-tabbed/search-facet-chip-tabbed.component.mjs +109 -0
- package/esm2022/lib/search/components/search-filter-chips/search-facet-chip-tabbed/search-facet-tabbed-content.component.mjs +129 -0
- package/esm2022/lib/search/components/search-filter-chips/search-filter-chips.component.mjs +63 -0
- package/esm2022/lib/search/components/search-filter-chips/search-filter-menu-card/search-filter-menu-card.component.mjs +43 -0
- package/esm2022/lib/search/components/search-filter-chips/search-widget-chip/search-widget-chip.component.mjs +109 -0
- package/esm2022/lib/search/components/search-filter-container/index.mjs +18 -0
- package/esm2022/lib/search/components/search-filter-container/search-filter-container.component.mjs +122 -0
- package/esm2022/lib/search/components/search-filter-tabbed/index.mjs +19 -0
- package/esm2022/lib/search/components/search-filter-tabbed/search-filter-tab.directive.mjs +36 -0
- package/esm2022/lib/search/components/search-filter-tabbed/search-filter-tabbed.component.mjs +63 -0
- package/esm2022/lib/search/components/search-form/index.mjs +18 -0
- package/esm2022/lib/search/components/search-form/search-form.component.mjs +52 -0
- package/esm2022/lib/search/components/search-input/index.mjs +18 -0
- package/esm2022/lib/search/components/search-input/search-input.component.mjs +108 -0
- package/esm2022/lib/search/components/search-logical-filter/index.mjs +18 -0
- package/esm2022/lib/search/components/search-logical-filter/search-logical-filter.component.mjs +163 -0
- package/esm2022/lib/search/components/search-number-range/index.mjs +18 -0
- package/esm2022/lib/search/components/search-number-range/search-number-range.component.mjs +154 -0
- package/esm2022/lib/search/components/search-panel/index.mjs +18 -0
- package/esm2022/lib/search/components/search-panel/search-panel.component.mjs +44 -0
- package/esm2022/lib/search/components/search-properties/file-size-condition.mjs +18 -0
- package/esm2022/lib/search/components/search-properties/file-size-operator.enum.mjs +23 -0
- package/esm2022/lib/search/components/search-properties/file-size-unit.enum.mjs +26 -0
- package/esm2022/lib/search/components/search-properties/index.mjs +22 -0
- package/esm2022/lib/search/components/search-properties/search-properties.component.mjs +244 -0
- package/esm2022/lib/search/components/search-properties/search-properties.mjs +18 -0
- package/esm2022/lib/search/components/search-radio/index.mjs +18 -0
- package/esm2022/lib/search/components/search-radio/search-radio.component.mjs +145 -0
- package/esm2022/lib/search/components/search-slider/index.mjs +18 -0
- package/esm2022/lib/search/components/search-slider/search-slider.component.mjs +119 -0
- package/esm2022/lib/search/components/search-sorting-picker/index.mjs +18 -0
- package/esm2022/lib/search/components/search-sorting-picker/search-sorting-picker.component.mjs +77 -0
- package/esm2022/lib/search/components/search-text/index.mjs +18 -0
- package/esm2022/lib/search/components/search-text/search-text.component.mjs +134 -0
- package/esm2022/lib/search/components/search-widget-container/index.mjs +18 -0
- package/esm2022/lib/search/components/search-widget-container/search-widget-container.component.mjs +113 -0
- package/esm2022/lib/search/components/search.component.mjs +152 -0
- package/esm2022/lib/search/forms/index.mjs +19 -0
- package/esm2022/lib/search/forms/live-error-state-matcher.mjs +23 -0
- package/esm2022/lib/search/forms/search-term-validator.mjs +26 -0
- package/esm2022/lib/search/index.mjs +18 -0
- package/esm2022/lib/search/mocks/index.mjs +18 -0
- package/esm2022/lib/search/mocks/search.service.mock.mjs +56 -0
- package/esm2022/lib/search/models/autocomplete-option.interface.mjs +22 -0
- package/esm2022/lib/search/models/facet-field-bucket.interface.mjs +18 -0
- package/esm2022/lib/search/models/facet-field.interface.mjs +29 -0
- package/esm2022/lib/search/models/facet-query.interface.mjs +18 -0
- package/esm2022/lib/search/models/facet-widget.interface.mjs +18 -0
- package/esm2022/lib/search/models/filter-query.interface.mjs +18 -0
- package/esm2022/lib/search/models/filter-search.interface.mjs +18 -0
- package/esm2022/lib/search/models/index.mjs +34 -0
- package/esm2022/lib/search/models/response-facet-query-list.model.mjs +31 -0
- package/esm2022/lib/search/models/search-category.interface.mjs +18 -0
- package/esm2022/lib/search/models/search-configuration.interface.mjs +18 -0
- package/esm2022/lib/search/models/search-filter-list.model.mjs +148 -0
- package/esm2022/lib/search/models/search-form.interface.mjs +18 -0
- package/esm2022/lib/search/models/search-range.interface.mjs +18 -0
- package/esm2022/lib/search/models/search-sorting-definition.interface.mjs +18 -0
- package/esm2022/lib/search/models/search-widget-settings.interface.mjs +18 -0
- package/esm2022/lib/search/models/search-widget.interface.mjs +18 -0
- package/esm2022/lib/search/models/tabbed-facet-field.interface.mjs +18 -0
- package/esm2022/lib/search/public-api.mjs +24 -0
- package/esm2022/lib/search/search-configuration.token.mjs +19 -0
- package/esm2022/lib/search/search.module.mjs +192 -0
- package/esm2022/lib/search/services/base-query-builder.service.mjs +509 -0
- package/esm2022/lib/search/services/index.mjs +24 -0
- package/esm2022/lib/search/services/search-configuration.service.mjs +50 -0
- package/esm2022/lib/search/services/search-facet-filters.service.mjs +374 -0
- package/esm2022/lib/search/services/search-filter.service.mjs +56 -0
- package/esm2022/lib/search/services/search-header-query-builder.service.mjs +136 -0
- package/esm2022/lib/search/services/search-query-builder.service.mjs +48 -0
- package/esm2022/lib/search/services/search.service.mjs +89 -0
- package/esm2022/lib/search-ai/index.mjs +18 -0
- package/esm2022/lib/search-ai/models/search-ai-input-state.mjs +18 -0
- package/esm2022/lib/search-ai/public-api.mjs +19 -0
- package/esm2022/lib/search-ai/services/search-ai.service.mjs +103 -0
- package/esm2022/lib/security/index.mjs +18 -0
- package/esm2022/lib/security/public-api.mjs +18 -0
- package/esm2022/lib/security/services/models/security-controls-group-response.interface.mjs +18 -0
- package/esm2022/lib/security/services/models/security-controls-mark-response.interface.mjs +18 -0
- package/esm2022/lib/security/services/security-controls-groups-marks-security.service.mjs +274 -0
- package/esm2022/lib/security-options-loader/security-options-loader.service.mjs +43 -0
- package/esm2022/lib/services/alfresco-api.interface.mjs +18 -0
- package/esm2022/lib/services/alfresco-api.service.mjs +120 -0
- package/esm2022/lib/services/index.mjs +18 -0
- package/esm2022/lib/services/public-api.mjs +18 -0
- package/esm2022/lib/tag/index.mjs +18 -0
- package/esm2022/lib/tag/public-api.mjs +24 -0
- package/esm2022/lib/tag/services/tag.service.mjs +171 -0
- package/esm2022/lib/tag/tag-actions/tag-actions.component.mjs +114 -0
- package/esm2022/lib/tag/tag-list/tag-list.component.mjs +98 -0
- package/esm2022/lib/tag/tag-node-list/tag-node-list.component.mjs +80 -0
- package/esm2022/lib/tag/tag.module.mjs +37 -0
- package/esm2022/lib/tag/tags-creator/tags-creator-mode.mjs +27 -0
- package/esm2022/lib/tag/tags-creator/tags-creator.component.mjs +370 -0
- package/esm2022/lib/testing/content.testing.module.mjs +56 -0
- package/esm2022/lib/tree/components/tree.component.mjs +312 -0
- package/esm2022/lib/tree/index.mjs +18 -0
- package/esm2022/lib/tree/models/tree-context-menu-result.interface.mjs +18 -0
- package/esm2022/lib/tree/models/tree-node.interface.mjs +22 -0
- package/esm2022/lib/tree/models/tree-response.interface.mjs +18 -0
- package/esm2022/lib/tree/public-api.mjs +23 -0
- package/esm2022/lib/tree/services/tree.service.mjs +134 -0
- package/esm2022/lib/tree/tree.module.mjs +33 -0
- package/esm2022/lib/tree-view/components/tree-view.component.mjs +75 -0
- package/esm2022/lib/tree-view/data/tree-view-datasource.mjs +99 -0
- package/esm2022/lib/tree-view/index.mjs +18 -0
- package/esm2022/lib/tree-view/models/tree-view.model.mjs +28 -0
- package/esm2022/lib/tree-view/public-api.mjs +22 -0
- package/esm2022/lib/tree-view/services/tree-view.service.mjs +38 -0
- package/esm2022/lib/tree-view/tree-view.module.mjs +33 -0
- package/esm2022/lib/upload/components/base-upload/upload-base.mjs +176 -0
- package/esm2022/lib/upload/components/file-uploading-dialog.component.mjs +190 -0
- package/esm2022/lib/upload/components/file-uploading-list-row.component.mjs +92 -0
- package/esm2022/lib/upload/components/file-uploading-list.component.mjs +124 -0
- package/esm2022/lib/upload/components/upload-button.component.mjs +133 -0
- package/esm2022/lib/upload/components/upload-drag-area.component.mjs +112 -0
- package/esm2022/lib/upload/components/upload-files.event.mjs +41 -0
- package/esm2022/lib/upload/components/upload-version-button.component.mjs +54 -0
- package/esm2022/lib/upload/directives/file-draggable.directive.mjs +154 -0
- package/esm2022/lib/upload/directives/toggle-icon.directive.mjs +75 -0
- package/esm2022/lib/upload/index.mjs +18 -0
- package/esm2022/lib/upload/pipes/file-upload-error.pipe.mjs +39 -0
- package/esm2022/lib/upload/public-api.mjs +29 -0
- package/esm2022/lib/upload/upload.module.mjs +72 -0
- package/esm2022/lib/version-compatibility/index.mjs +18 -0
- package/esm2022/lib/version-compatibility/public-api.mjs +20 -0
- package/esm2022/lib/version-compatibility/version-compatibility-factory.mjs +26 -0
- package/esm2022/lib/version-compatibility/version-compatibility.directive.mjs +53 -0
- package/esm2022/lib/version-compatibility/version-compatibility.module.mjs +33 -0
- package/esm2022/lib/version-compatibility/version-compatibility.service.mjs +76 -0
- package/esm2022/lib/version-manager/content-version.service.mjs +53 -0
- package/esm2022/lib/version-manager/index.mjs +18 -0
- package/esm2022/lib/version-manager/public-api.mjs +23 -0
- package/esm2022/lib/version-manager/version-comparison.component.mjs +42 -0
- package/esm2022/lib/version-manager/version-list.component.mjs +215 -0
- package/esm2022/lib/version-manager/version-manager.component.mjs +145 -0
- package/esm2022/lib/version-manager/version-manager.module.mjs +48 -0
- package/esm2022/lib/version-manager/version-upload.component.mjs +154 -0
- package/esm2022/lib/viewer/alfresco-viewer.module.mjs +33 -0
- package/esm2022/lib/viewer/components/alfresco-viewer.component.mjs +408 -0
- package/esm2022/lib/viewer/index.mjs +18 -0
- package/esm2022/lib/viewer/public-api.mjs +19 -0
- package/esm2022/public-api.mjs +56 -0
- package/fesm2022/adf-content-services.mjs +761 -744
- package/fesm2022/adf-content-services.mjs.map +1 -1
- package/lib/new-version-uploader/new-version-uploader.dialog.scss +1 -1
- package/lib/upload/components/base-upload/upload-base.d.ts +1 -1
- package/package.json +5 -3
|
@@ -0,0 +1,963 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/* eslint-disable rxjs/no-subject-value */
|
|
18
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
19
|
+
import { AppConfigService, ColumnsSelectorComponent, CustomEmptyContentTemplateDirective, CustomLoadingContentTemplateDirective, CustomNoPermissionTemplateDirective, DataColumnListComponent, DataSorting, DataTableComponent, DataTableSchema, DataTableService, EmptyListComponent, LoadingContentTemplateDirective, MainMenuDataTableTemplateDirective, NoContentTemplateDirective, NoPermissionTemplateDirective, ShowHeaderMode, ThumbnailService, UserPreferencesService, UserPreferenceValues } from '@alfresco/adf-core';
|
|
20
|
+
import { NodePaging, NodesApi, Pagination } from '@alfresco/js-api';
|
|
21
|
+
import { Component, ContentChild, DestroyRef, ElementRef, EventEmitter, HostListener, inject, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
22
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
23
|
+
import { BehaviorSubject, of, Subject } from 'rxjs';
|
|
24
|
+
import { ContentService, NodesApiService } from '../../common';
|
|
25
|
+
import { ShareDataTableAdapter } from '../data/share-datatable-adapter';
|
|
26
|
+
import { ContentActionModel } from '../models/content-action.model';
|
|
27
|
+
import { presetsDefaultModel } from '../models/preset.model';
|
|
28
|
+
import { DocumentListService } from '../services/document-list.service';
|
|
29
|
+
import { LockService } from '../services/lock.service';
|
|
30
|
+
import { ADF_DOCUMENT_PARENT_COMPONENT } from './document-list.token';
|
|
31
|
+
import { FileAutoDownloadComponent } from './file-auto-download/file-auto-download.component';
|
|
32
|
+
import { NodeEntityEvent, NodeEntryEvent } from './node.event';
|
|
33
|
+
import { CommonModule } from '@angular/common';
|
|
34
|
+
import { FilterHeaderComponent } from './filter-header/filter-header.component';
|
|
35
|
+
import { TranslatePipe } from '@ngx-translate/core';
|
|
36
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
37
|
+
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
38
|
+
import { AlfrescoApiService } from '../../services/alfresco-api.service';
|
|
39
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
40
|
+
import * as i0 from "@angular/core";
|
|
41
|
+
import * as i1 from "../services/document-list.service";
|
|
42
|
+
import * as i2 from "@alfresco/adf-core";
|
|
43
|
+
import * as i3 from "../../common";
|
|
44
|
+
import * as i4 from "../../services/alfresco-api.service";
|
|
45
|
+
import * as i5 from "../services/lock.service";
|
|
46
|
+
import * as i6 from "@angular/material/dialog";
|
|
47
|
+
import * as i7 from "@angular/common";
|
|
48
|
+
import * as i8 from "@angular/material/icon";
|
|
49
|
+
import * as i9 from "@angular/material/progress-spinner";
|
|
50
|
+
const BYTES_TO_MB_CONVERSION_VALUE = 1048576;
|
|
51
|
+
export class DocumentListComponent extends DataTableSchema {
|
|
52
|
+
static { this.SINGLE_CLICK_NAVIGATION = 'click'; }
|
|
53
|
+
static { this.DOUBLE_CLICK_NAVIGATION = 'dblclick'; }
|
|
54
|
+
/**
|
|
55
|
+
* Custom function to choose whether to show or hide rows.
|
|
56
|
+
* See the [Row Filter Model](row-filter.model.md) page for
|
|
57
|
+
* more information.
|
|
58
|
+
*/
|
|
59
|
+
set rowFilter(rowFilter) {
|
|
60
|
+
this._rowFilter = rowFilter;
|
|
61
|
+
if (this.data) {
|
|
62
|
+
this.data.setFilter(this._rowFilter);
|
|
63
|
+
if (this.currentFolderId) {
|
|
64
|
+
this.reload();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
get rowFilter() {
|
|
69
|
+
return this._rowFilter;
|
|
70
|
+
}
|
|
71
|
+
/** Sets columns visibility for DataTableSchema */
|
|
72
|
+
set setColumnsVisibility(columnsVisibility) {
|
|
73
|
+
this.columnsVisibility = columnsVisibility;
|
|
74
|
+
}
|
|
75
|
+
/** Sets columns width for DataTableSchema */
|
|
76
|
+
set setColumnsWidths(columnsWidths) {
|
|
77
|
+
this.columnsWidths = columnsWidths;
|
|
78
|
+
}
|
|
79
|
+
/** Sets columns order for DataTableSchema */
|
|
80
|
+
set setColumnsOrder(columnsOrder) {
|
|
81
|
+
this.columnsOrder = columnsOrder;
|
|
82
|
+
}
|
|
83
|
+
get nodesApi() {
|
|
84
|
+
this._nodesApi = this._nodesApi ?? new NodesApi(this.alfrescoApiService.getInstance());
|
|
85
|
+
return this._nodesApi;
|
|
86
|
+
}
|
|
87
|
+
constructor(documentListService, elementRef, appConfig, userPreferencesService, contentService, thumbnailService, alfrescoApiService, nodeService, dataTableService, lockService, dialog) {
|
|
88
|
+
super(appConfig, 'default', presetsDefaultModel);
|
|
89
|
+
this.documentListService = documentListService;
|
|
90
|
+
this.elementRef = elementRef;
|
|
91
|
+
this.appConfig = appConfig;
|
|
92
|
+
this.userPreferencesService = userPreferencesService;
|
|
93
|
+
this.contentService = contentService;
|
|
94
|
+
this.thumbnailService = thumbnailService;
|
|
95
|
+
this.alfrescoApiService = alfrescoApiService;
|
|
96
|
+
this.nodeService = nodeService;
|
|
97
|
+
this.dataTableService = dataTableService;
|
|
98
|
+
this.lockService = lockService;
|
|
99
|
+
this.dialog = dialog;
|
|
100
|
+
this.DEFAULT_PAGINATION = new Pagination({
|
|
101
|
+
hasMoreItems: false,
|
|
102
|
+
skipCount: 0,
|
|
103
|
+
maxItems: 25,
|
|
104
|
+
totalItems: 0
|
|
105
|
+
});
|
|
106
|
+
this.DEFAULT_SORTING = [new DataSorting('name', 'asc'), new DataSorting('isFolder', 'desc')];
|
|
107
|
+
/**
|
|
108
|
+
* Define a set of CSS styles to apply depending on the permission
|
|
109
|
+
* of the user on that node. See the Permission Style model
|
|
110
|
+
* page for further details and examples.
|
|
111
|
+
*/
|
|
112
|
+
this.permissionsStyle = [];
|
|
113
|
+
/** The default route for all the location-based columns (if declared). */
|
|
114
|
+
this.locationFormat = '/';
|
|
115
|
+
/** Toggles navigation to folder content or file preview */
|
|
116
|
+
this.navigate = true;
|
|
117
|
+
/** Toggles the header */
|
|
118
|
+
this.showHeader = ShowHeaderMode.Data;
|
|
119
|
+
/**
|
|
120
|
+
* User interaction for folder navigation or file preview.
|
|
121
|
+
* Valid values are "click" and "dblclick". Default value: "dblclick"
|
|
122
|
+
*/
|
|
123
|
+
this.navigationMode = DocumentListComponent.DOUBLE_CLICK_NAVIGATION; // click|dblclick
|
|
124
|
+
/** Show document thumbnails rather than icons */
|
|
125
|
+
this.thumbnails = false;
|
|
126
|
+
/**
|
|
127
|
+
* Row selection mode. Can be null, `single` or `multiple`. For `multiple` mode,
|
|
128
|
+
* you can use Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for multiple rows.
|
|
129
|
+
*/
|
|
130
|
+
this.selectionMode = 'single'; // null|single|multiple
|
|
131
|
+
/** Toggles multiselect mode */
|
|
132
|
+
this.multiselect = false;
|
|
133
|
+
/** Toggles content actions for each row */
|
|
134
|
+
this.contentActions = false;
|
|
135
|
+
/** Position of the content actions dropdown menu. Can be set to "left" or "right". */
|
|
136
|
+
this.contentActionsPosition = 'right'; // left|right
|
|
137
|
+
/** Toggles context menus for each row */
|
|
138
|
+
this.contextMenuActions = false;
|
|
139
|
+
/** Custom image for empty folder. Default value: './assets/images/empty_doc_lib.svg' */
|
|
140
|
+
this.emptyFolderImageUrl = './assets/images/empty_doc_lib.svg';
|
|
141
|
+
/**
|
|
142
|
+
* When true, this enables you to drop files directly into subfolders shown
|
|
143
|
+
* as items in the list or into another file to trigger updating it's version.
|
|
144
|
+
* When false, the dropped file will be added to the
|
|
145
|
+
* current folder (ie, the one containing all the items shown in the list).
|
|
146
|
+
* See the Upload directive for further details about how the file drop is
|
|
147
|
+
* handled.
|
|
148
|
+
*/
|
|
149
|
+
this.allowDropFiles = false;
|
|
150
|
+
/**
|
|
151
|
+
* Defines default sorting. The format is an array of 2 strings `[key, direction]`
|
|
152
|
+
* i.e. `['name', 'desc']` or `['name', 'asc']`. Set this value only if you want to
|
|
153
|
+
* override the default sorting detected by the component based on columns.
|
|
154
|
+
*/
|
|
155
|
+
this.sorting = ['name', 'asc'];
|
|
156
|
+
/**
|
|
157
|
+
* Defines default sorting. The format is an array of strings `[key direction, otherKey otherDirection]`
|
|
158
|
+
* i.e. `['name desc', 'nodeType asc']` or `['name asc']`. Set this value if you want a base
|
|
159
|
+
* rule to be added to the sorting apart from the one driven by the header.
|
|
160
|
+
*/
|
|
161
|
+
this.additionalSorting = new DataSorting('isFolder', 'desc');
|
|
162
|
+
/**
|
|
163
|
+
* Defines sorting mode. Can be either `client` (items in the list
|
|
164
|
+
* are sorted client-side) or `server` (the ordering supplied by the
|
|
165
|
+
* server is used without further client-side sorting).
|
|
166
|
+
* Note that the `server` option *does not* request the server to sort the data
|
|
167
|
+
* before delivering it.
|
|
168
|
+
*/
|
|
169
|
+
this.sortingMode = 'server';
|
|
170
|
+
/**
|
|
171
|
+
* Toggles the loading state and animated spinners for the component. Used in
|
|
172
|
+
* combination with `navigate=false` to perform custom navigation and loading
|
|
173
|
+
* state indication.
|
|
174
|
+
*/
|
|
175
|
+
this.loading = false;
|
|
176
|
+
this._rowFilter = null;
|
|
177
|
+
/**
|
|
178
|
+
* Custom function to choose image file paths to show. See the
|
|
179
|
+
* [Image Resolver Model](image-resolver.model.md) page for
|
|
180
|
+
* more information.
|
|
181
|
+
*/
|
|
182
|
+
this.imageResolver = null;
|
|
183
|
+
/** Toggles the sticky header mode. */
|
|
184
|
+
this.stickyHeader = false;
|
|
185
|
+
/** Toggles the header filters mode. */
|
|
186
|
+
this.headerFilters = false;
|
|
187
|
+
/** The ID of the folder node to display or a reserved string alias for special sources */
|
|
188
|
+
this.currentFolderId = null;
|
|
189
|
+
/**
|
|
190
|
+
* Array of nodes to be pre-selected. All nodes in the
|
|
191
|
+
* array are pre-selected in multi selection mode, but only the first node
|
|
192
|
+
* is pre-selected in single selection mode.
|
|
193
|
+
*/
|
|
194
|
+
this.preselectNodes = [];
|
|
195
|
+
/** The Document list will show all the nodes contained in the NodePaging entity */
|
|
196
|
+
this.node = null;
|
|
197
|
+
/** Default value is stored in the user preference settings. Use this only if you are not using pagination. */
|
|
198
|
+
this.maxItems = this.DEFAULT_PAGINATION.maxItems;
|
|
199
|
+
/** Enables column resizing for datatable */
|
|
200
|
+
this.isResizingEnabled = false;
|
|
201
|
+
/** Enables blur when resizing datatable columns */
|
|
202
|
+
this.blurOnResize = true;
|
|
203
|
+
/** Display checkboxes in datatable rows on hover only */
|
|
204
|
+
this.displayCheckboxesOnHover = false;
|
|
205
|
+
/** Display drag and drop hint. */
|
|
206
|
+
this.displayDragAndDropHint = true;
|
|
207
|
+
/** Emitted when the user clicks a list node */
|
|
208
|
+
this.nodeClick = new EventEmitter();
|
|
209
|
+
/** Emitted when the user double-clicks a list node */
|
|
210
|
+
this.nodeDblClick = new EventEmitter();
|
|
211
|
+
/** Emitted when the current display folder changes */
|
|
212
|
+
this.folderChange = new EventEmitter();
|
|
213
|
+
/**
|
|
214
|
+
* Emitted when the user acts upon files with either single or double click
|
|
215
|
+
* (depends on `navigation-mode`). Useful for integration with the
|
|
216
|
+
* Viewer component.
|
|
217
|
+
*/
|
|
218
|
+
this.preview = new EventEmitter();
|
|
219
|
+
/** Emitted when the Document List has loaded all items and is ready for use */
|
|
220
|
+
this.ready = new EventEmitter();
|
|
221
|
+
/** Emitted when the API fails to get the Document List data */
|
|
222
|
+
this.error = new EventEmitter();
|
|
223
|
+
/** Emitted when the node selection change */
|
|
224
|
+
this.nodeSelected = new EventEmitter();
|
|
225
|
+
/** Emitted when a filter value is selected */
|
|
226
|
+
this.filterSelection = new EventEmitter();
|
|
227
|
+
/** Emitted when column widths change */
|
|
228
|
+
this.columnsWidthChanged = new EventEmitter();
|
|
229
|
+
/** Emitted when columns visibility change */
|
|
230
|
+
this.columnsVisibilityChanged = new EventEmitter();
|
|
231
|
+
/** Emitted when columns order change */
|
|
232
|
+
this.columnsOrderChanged = new EventEmitter();
|
|
233
|
+
/** Emitted when the selected row items count in the table changed. */
|
|
234
|
+
this.selectedItemsCountChanged = new EventEmitter();
|
|
235
|
+
this.actions = [];
|
|
236
|
+
this.contextActionHandler = new Subject();
|
|
237
|
+
this.noPermission = false;
|
|
238
|
+
this.selection = new Array();
|
|
239
|
+
this.$folderNode = new Subject();
|
|
240
|
+
this.allowFiltering = true;
|
|
241
|
+
this.orderBy = null;
|
|
242
|
+
this.preselectedRows = [];
|
|
243
|
+
this._pagination = this.DEFAULT_PAGINATION;
|
|
244
|
+
this.pagination = new BehaviorSubject(this.DEFAULT_PAGINATION);
|
|
245
|
+
this.sortingSubject = new BehaviorSubject(this.DEFAULT_SORTING);
|
|
246
|
+
this.rowMenuCache = {};
|
|
247
|
+
this.destroyRef = inject(DestroyRef);
|
|
248
|
+
this.nodeService.nodeUpdated.pipe(takeUntilDestroyed()).subscribe((node) => {
|
|
249
|
+
this.dataTableService.rowUpdate.next({ id: node.id, obj: { entry: node } });
|
|
250
|
+
});
|
|
251
|
+
this.userPreferencesService
|
|
252
|
+
.select(UserPreferenceValues.PaginationSize)
|
|
253
|
+
.pipe(takeUntilDestroyed())
|
|
254
|
+
.subscribe((pagSize) => {
|
|
255
|
+
this.maxItems = this._pagination.maxItems = pagSize;
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
getContextActions(node) {
|
|
259
|
+
if (node?.entry) {
|
|
260
|
+
const actions = this.getNodeActions(node);
|
|
261
|
+
if (actions && actions.length > 0) {
|
|
262
|
+
return actions.map((currentAction) => ({
|
|
263
|
+
model: currentAction,
|
|
264
|
+
node,
|
|
265
|
+
subject: this.contextActionHandler
|
|
266
|
+
}));
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
getDefaultSorting() {
|
|
272
|
+
let defaultSorting;
|
|
273
|
+
if (Array.isArray(this.sorting)) {
|
|
274
|
+
const [key, direction] = this.sorting;
|
|
275
|
+
defaultSorting = new DataSorting(key, direction);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
defaultSorting = new DataSorting(this.sorting.key, this.sorting.direction);
|
|
279
|
+
}
|
|
280
|
+
return defaultSorting;
|
|
281
|
+
}
|
|
282
|
+
isMobile() {
|
|
283
|
+
return !!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
|
284
|
+
}
|
|
285
|
+
isEmpty() {
|
|
286
|
+
return !this.data || this.data.getRows().length === 0;
|
|
287
|
+
}
|
|
288
|
+
ngOnInit() {
|
|
289
|
+
this.rowMenuCache = {};
|
|
290
|
+
this.loadLayoutPresets();
|
|
291
|
+
this.data = new ShareDataTableAdapter(this.thumbnailService, this.contentService, null, this.getDefaultSorting(), this.sortingMode, this.allowDropFiles);
|
|
292
|
+
this.data.thumbnails = this.thumbnails;
|
|
293
|
+
this.data.permissionsStyle = this.permissionsStyle;
|
|
294
|
+
if (this._rowFilter) {
|
|
295
|
+
this.data.setFilter(this._rowFilter);
|
|
296
|
+
}
|
|
297
|
+
if (this.imageResolver) {
|
|
298
|
+
this.data.setImageResolver(this.imageResolver);
|
|
299
|
+
}
|
|
300
|
+
this.contextActionHandler.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((val) => this.contextActionCallback(val));
|
|
301
|
+
this.enforceSingleClickNavigationForMobile();
|
|
302
|
+
if (this.filterValue && Object.keys(this.filterValue).length > 0) {
|
|
303
|
+
this.showHeader = ShowHeaderMode.Always;
|
|
304
|
+
}
|
|
305
|
+
if (this.columnsPresetKey) {
|
|
306
|
+
this.setPresetKey(this.columnsPresetKey);
|
|
307
|
+
}
|
|
308
|
+
this.documentListService.reload$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
309
|
+
this.resetSelection();
|
|
310
|
+
this.reload();
|
|
311
|
+
});
|
|
312
|
+
this.documentListService.resetSelection$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
313
|
+
this.resetSelection();
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
ngAfterContentInit() {
|
|
317
|
+
if (this.columnList) {
|
|
318
|
+
this.columnList.columns.changes.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
319
|
+
this.createColumns();
|
|
320
|
+
this.data.setColumns(this.columns);
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
this.createDatatableSchema();
|
|
324
|
+
this.data.setColumns(this.columns);
|
|
325
|
+
}
|
|
326
|
+
ngOnChanges(changes) {
|
|
327
|
+
if (!changes['preselectNodes']) {
|
|
328
|
+
this.resetSelection();
|
|
329
|
+
}
|
|
330
|
+
if (Array.isArray(this.sorting)) {
|
|
331
|
+
const [key, direction] = this.sorting;
|
|
332
|
+
this.orderBy = this.buildOrderByArray(key, direction);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
this.orderBy = this.buildOrderByArray(this.sorting.key, this.sorting.direction);
|
|
336
|
+
}
|
|
337
|
+
if (this.data) {
|
|
338
|
+
this.data.thumbnails = this.thumbnails;
|
|
339
|
+
}
|
|
340
|
+
if (changes.sortingMode && !changes.sortingMode.firstChange && this.data) {
|
|
341
|
+
this.data.sortingMode = changes.sortingMode.currentValue;
|
|
342
|
+
}
|
|
343
|
+
if (changes.sorting && !changes.sorting.firstChange && this.data) {
|
|
344
|
+
const newValue = changes.sorting.currentValue;
|
|
345
|
+
if (newValue && newValue.length > 0) {
|
|
346
|
+
const [key, direction] = newValue;
|
|
347
|
+
this.data.setSorting(new DataSorting(key, direction));
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
if (this.currentFolderId && changes['currentFolderId']?.currentValue !== changes['currentFolderId']?.previousValue) {
|
|
351
|
+
this.loadFolder();
|
|
352
|
+
}
|
|
353
|
+
if (this.data) {
|
|
354
|
+
if (changes.node?.currentValue) {
|
|
355
|
+
const merge = this._pagination ? this._pagination.merge : false;
|
|
356
|
+
this.data.loadPage(changes.node.currentValue, merge, null);
|
|
357
|
+
this.preserveExistingSelection();
|
|
358
|
+
this.onPreselectNodes();
|
|
359
|
+
this.onDataReady(changes.node.currentValue);
|
|
360
|
+
}
|
|
361
|
+
else if (changes.imageResolver) {
|
|
362
|
+
this.data.setImageResolver(changes.imageResolver.currentValue);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
reload(hideLoadingSpinner = false) {
|
|
367
|
+
this.resetSelection();
|
|
368
|
+
this.reloadWithoutResettingSelection(hideLoadingSpinner);
|
|
369
|
+
}
|
|
370
|
+
reloadWithoutResettingSelection(hideLoadingSpinner = false) {
|
|
371
|
+
if (this.node) {
|
|
372
|
+
if (this.data) {
|
|
373
|
+
this.data.loadPage(this.node, this._pagination.merge, null);
|
|
374
|
+
this.preserveExistingSelection();
|
|
375
|
+
}
|
|
376
|
+
this.onPreselectNodes();
|
|
377
|
+
this.syncPagination();
|
|
378
|
+
this.onDataReady(this.node);
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
this.loadFolder(hideLoadingSpinner);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
contextActionCallback(action) {
|
|
385
|
+
if (action) {
|
|
386
|
+
this.executeContentAction(action.node, action.model);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
getNodeActions(node) {
|
|
390
|
+
if (node?.entry) {
|
|
391
|
+
let target = null;
|
|
392
|
+
if (node.entry.isFile) {
|
|
393
|
+
target = 'document';
|
|
394
|
+
}
|
|
395
|
+
else if (node.entry.isFolder) {
|
|
396
|
+
target = 'folder';
|
|
397
|
+
}
|
|
398
|
+
if (target) {
|
|
399
|
+
const actions = this.rowMenuCache[node.entry.id];
|
|
400
|
+
if (actions) {
|
|
401
|
+
actions.forEach((action) => {
|
|
402
|
+
this.refreshAction(action, node);
|
|
403
|
+
});
|
|
404
|
+
return actions;
|
|
405
|
+
}
|
|
406
|
+
const actionsByTarget = this.actions
|
|
407
|
+
.filter((entry) => {
|
|
408
|
+
const isVisible = typeof entry.visible === 'function' ? entry.visible(node) : entry.visible;
|
|
409
|
+
return isVisible && entry.target.toLowerCase() === target;
|
|
410
|
+
})
|
|
411
|
+
.map((action) => new ContentActionModel(action));
|
|
412
|
+
actionsByTarget.forEach((action) => {
|
|
413
|
+
this.refreshAction(action, node);
|
|
414
|
+
});
|
|
415
|
+
this.rowMenuCache[node.entry.id] = actionsByTarget;
|
|
416
|
+
return actionsByTarget;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
return [];
|
|
420
|
+
}
|
|
421
|
+
refreshAction(action, node) {
|
|
422
|
+
action.disabled = this.isActionDisabled(action, node);
|
|
423
|
+
action.visible = this.isActionVisible(action, node);
|
|
424
|
+
}
|
|
425
|
+
isActionVisible(action, node) {
|
|
426
|
+
if (typeof action.visible === 'function') {
|
|
427
|
+
return action.visible(node);
|
|
428
|
+
}
|
|
429
|
+
return action.visible;
|
|
430
|
+
}
|
|
431
|
+
isActionDisabled(action, node) {
|
|
432
|
+
if (typeof action.disabled === 'function') {
|
|
433
|
+
return action.disabled(node);
|
|
434
|
+
}
|
|
435
|
+
if ((action.permission && action.disableWithNoPermission && !this.contentService.hasAllowableOperations(node.entry, action.permission)) ||
|
|
436
|
+
this.lockService.isLocked(node.entry)) {
|
|
437
|
+
return true;
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
return action.disabled;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
onShowContextMenu(e) {
|
|
444
|
+
if (e && this.contextMenuActions) {
|
|
445
|
+
e.preventDefault();
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
navigateTo(node) {
|
|
449
|
+
if (typeof node === 'string') {
|
|
450
|
+
this.resetNewFolderPagination();
|
|
451
|
+
this.currentFolderId = node;
|
|
452
|
+
this.folderChange.emit(new NodeEntryEvent({ id: node }));
|
|
453
|
+
this.reload();
|
|
454
|
+
return true;
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
if (this.canNavigateFolder(node)) {
|
|
458
|
+
this.resetNewFolderPagination();
|
|
459
|
+
this.currentFolderId = this.getNodeFolderDestinationId(node);
|
|
460
|
+
this.folderChange.emit(new NodeEntryEvent({ id: this.currentFolderId }));
|
|
461
|
+
this.reload();
|
|
462
|
+
return true;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
return false;
|
|
466
|
+
}
|
|
467
|
+
getNodeFolderDestinationId(node) {
|
|
468
|
+
return this.isLinkFolder(node) ? node.properties['cm:destination'] : node.id;
|
|
469
|
+
}
|
|
470
|
+
isLinkFolder(node) {
|
|
471
|
+
return node.nodeType === 'app:folderlink' && node.properties?.['cm:destination'];
|
|
472
|
+
}
|
|
473
|
+
updateCustomSourceData(nodeId) {
|
|
474
|
+
this.currentFolderId = nodeId;
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Invoked when executing content action for a document or folder.
|
|
478
|
+
*
|
|
479
|
+
* @param node Node to be the context of the execution.
|
|
480
|
+
* @param action Action to be executed against the context.
|
|
481
|
+
*/
|
|
482
|
+
executeContentAction(node, action) {
|
|
483
|
+
if (node?.entry && action) {
|
|
484
|
+
const handlerSub = typeof action.handler === 'function' ? action.handler(node, this, action.permission) : of(true);
|
|
485
|
+
if (typeof action.execute === 'function' && handlerSub) {
|
|
486
|
+
handlerSub.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => action.execute(node));
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
setLoadingState(value) {
|
|
491
|
+
if (this.data?.getRows().length > 0) {
|
|
492
|
+
if (value) {
|
|
493
|
+
clearTimeout(this.loadingTimeout);
|
|
494
|
+
this.loadingTimeout = setTimeout(() => {
|
|
495
|
+
this.loading = true;
|
|
496
|
+
}, 1000);
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
clearTimeout(this.loadingTimeout);
|
|
500
|
+
this.loading = false;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
clearTimeout(this.loadingTimeout);
|
|
505
|
+
this.loading = value;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
loadFolder(hideLoadingSpinner = false) {
|
|
509
|
+
if (!hideLoadingSpinner) {
|
|
510
|
+
this.setLoadingState(true);
|
|
511
|
+
}
|
|
512
|
+
if (this.documentListService.isCustomSourceService(this.currentFolderId)) {
|
|
513
|
+
this.updateCustomSourceData(this.currentFolderId);
|
|
514
|
+
}
|
|
515
|
+
this.documentListService.loadFolderByNodeId(this.currentFolderId, this._pagination, this.includeFields, this.where, this.orderBy).subscribe((documentNode) => {
|
|
516
|
+
if (documentNode.currentNode) {
|
|
517
|
+
this.folderNode = documentNode.currentNode.entry;
|
|
518
|
+
this.$folderNode.next(documentNode.currentNode.entry);
|
|
519
|
+
}
|
|
520
|
+
this.onPageLoaded(documentNode.children);
|
|
521
|
+
}, (err) => {
|
|
522
|
+
this.handleError(err);
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
resetSelection() {
|
|
526
|
+
this.dataTable.resetSelection();
|
|
527
|
+
this.selection = [];
|
|
528
|
+
this.noPermission = false;
|
|
529
|
+
}
|
|
530
|
+
onPageLoaded(nodePaging) {
|
|
531
|
+
if (nodePaging) {
|
|
532
|
+
if (this.data) {
|
|
533
|
+
this.data.loadPage(nodePaging, this._pagination.merge, this.allowDropFiles);
|
|
534
|
+
this.preserveExistingSelection();
|
|
535
|
+
}
|
|
536
|
+
this.onPreselectNodes();
|
|
537
|
+
this.setLoadingState(false);
|
|
538
|
+
this.onDataReady(nodePaging);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
onSortingChanged(event) {
|
|
542
|
+
this.orderBy = this.buildOrderByArray(event.detail.sortingKey, event.detail.direction);
|
|
543
|
+
this.sorting = [event.detail.sortingKey, event.detail.direction];
|
|
544
|
+
this.sortingSubject.next([this.additionalSorting, event.detail]);
|
|
545
|
+
if (this.sortingMode === 'server') {
|
|
546
|
+
this.reload();
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
buildOrderByArray(currentKey, currentDirection) {
|
|
550
|
+
return [`${this.additionalSorting.key} ${this.additionalSorting.direction}`, `${currentKey} ${currentDirection}`];
|
|
551
|
+
}
|
|
552
|
+
onPreviewFile(node) {
|
|
553
|
+
if (node) {
|
|
554
|
+
const sizeInMB = node.entry?.content?.sizeInBytes / BYTES_TO_MB_CONVERSION_VALUE;
|
|
555
|
+
const fileAutoDownloadFlag = this.appConfig.get('viewer.enableFileAutoDownload', true);
|
|
556
|
+
const sizeThreshold = this.appConfig.get('viewer.fileAutoDownloadSizeThresholdInMB', 15);
|
|
557
|
+
if (fileAutoDownloadFlag && sizeInMB && sizeInMB > sizeThreshold) {
|
|
558
|
+
this.dialog.open(FileAutoDownloadComponent, { disableClose: true, data: node });
|
|
559
|
+
}
|
|
560
|
+
else {
|
|
561
|
+
this.preview.emit(new NodeEntityEvent(node));
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
onColumnsVisibilityChange(columns) {
|
|
566
|
+
this.columnsVisibility = columns.reduce((visibleColumnsMap, column) => {
|
|
567
|
+
if (column.isHidden !== undefined) {
|
|
568
|
+
visibleColumnsMap[column.id] = !column.isHidden;
|
|
569
|
+
}
|
|
570
|
+
return visibleColumnsMap;
|
|
571
|
+
}, {});
|
|
572
|
+
this.createColumns();
|
|
573
|
+
this.data.setColumns(this.columns);
|
|
574
|
+
this.columnsVisibilityChanged.emit(this.columnsVisibility);
|
|
575
|
+
}
|
|
576
|
+
onColumnOrderChange(columnsWithNewOrder) {
|
|
577
|
+
this.columnsOrder = columnsWithNewOrder.map((column) => column.id);
|
|
578
|
+
this.createColumns();
|
|
579
|
+
this.columnsOrderChanged.emit(this.columnsOrder);
|
|
580
|
+
}
|
|
581
|
+
onColumnsWidthChange(columns) {
|
|
582
|
+
const newColumnsWidths = columns.reduce((widthsColumnsMap, column) => {
|
|
583
|
+
if (column.width) {
|
|
584
|
+
widthsColumnsMap[column.id] = Math.ceil(column.width);
|
|
585
|
+
}
|
|
586
|
+
return widthsColumnsMap;
|
|
587
|
+
}, {});
|
|
588
|
+
this.columnsWidths = { ...this.columnsWidths, ...newColumnsWidths };
|
|
589
|
+
this.createColumns();
|
|
590
|
+
this.columnsWidthChanged.emit(this.columnsWidths);
|
|
591
|
+
}
|
|
592
|
+
onSelectedItemsCountChanged(count) {
|
|
593
|
+
this.selectedItemsCountChanged.emit(count);
|
|
594
|
+
}
|
|
595
|
+
onNodeClick(nodeEntry) {
|
|
596
|
+
const domEvent = new CustomEvent('node-click', {
|
|
597
|
+
detail: {
|
|
598
|
+
sender: this,
|
|
599
|
+
node: nodeEntry
|
|
600
|
+
},
|
|
601
|
+
bubbles: true
|
|
602
|
+
});
|
|
603
|
+
this.elementRef.nativeElement.dispatchEvent(domEvent);
|
|
604
|
+
const event = new NodeEntityEvent(nodeEntry);
|
|
605
|
+
this.nodeClick.emit(event);
|
|
606
|
+
if (!event.defaultPrevented) {
|
|
607
|
+
if (this.navigate && this.navigationMode === DocumentListComponent.SINGLE_CLICK_NAVIGATION) {
|
|
608
|
+
this.executeActionClick(nodeEntry);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
onNodeDblClick(nodeEntry) {
|
|
613
|
+
const domEvent = new CustomEvent('node-dblclick', {
|
|
614
|
+
detail: {
|
|
615
|
+
sender: this,
|
|
616
|
+
node: nodeEntry
|
|
617
|
+
},
|
|
618
|
+
bubbles: true
|
|
619
|
+
});
|
|
620
|
+
this.elementRef.nativeElement.dispatchEvent(domEvent);
|
|
621
|
+
const event = new NodeEntityEvent(nodeEntry);
|
|
622
|
+
this.nodeDblClick.emit(event);
|
|
623
|
+
if (!event.defaultPrevented) {
|
|
624
|
+
if (this.navigate && this.navigationMode === DocumentListComponent.DOUBLE_CLICK_NAVIGATION) {
|
|
625
|
+
this.executeActionClick(nodeEntry);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
executeActionClick(nodeEntry) {
|
|
630
|
+
if (nodeEntry?.entry) {
|
|
631
|
+
if (nodeEntry.entry.isFile) {
|
|
632
|
+
this.onPreviewFile(nodeEntry);
|
|
633
|
+
}
|
|
634
|
+
if (nodeEntry.entry.isFolder) {
|
|
635
|
+
this.navigateTo(nodeEntry.entry);
|
|
636
|
+
}
|
|
637
|
+
if (nodeEntry.entry['guid']) {
|
|
638
|
+
const options = {
|
|
639
|
+
include: this.includeFields
|
|
640
|
+
};
|
|
641
|
+
this.nodesApi.getNode(nodeEntry.entry['guid'], options).then((node) => {
|
|
642
|
+
this.navigateTo(node.entry);
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
onNodeSelect(event) {
|
|
648
|
+
this.selection = event.selection.map((entry) => entry.node);
|
|
649
|
+
const domEvent = new CustomEvent('node-select', {
|
|
650
|
+
detail: {
|
|
651
|
+
node: event.row ? event.row.node : null,
|
|
652
|
+
selection: this.selection
|
|
653
|
+
},
|
|
654
|
+
bubbles: true
|
|
655
|
+
});
|
|
656
|
+
this.nodeSelected.emit(this.selection);
|
|
657
|
+
this.elementRef.nativeElement.dispatchEvent(domEvent);
|
|
658
|
+
}
|
|
659
|
+
onNodeUnselect(event) {
|
|
660
|
+
this.selection = event.selection.map((entry) => entry.node);
|
|
661
|
+
const domEvent = new CustomEvent('node-unselect', {
|
|
662
|
+
detail: {
|
|
663
|
+
node: event.row ? event.row.node : null,
|
|
664
|
+
selection: this.selection
|
|
665
|
+
},
|
|
666
|
+
bubbles: true
|
|
667
|
+
});
|
|
668
|
+
this.nodeSelected.emit(this.selection);
|
|
669
|
+
this.elementRef.nativeElement.dispatchEvent(domEvent);
|
|
670
|
+
}
|
|
671
|
+
onShowRowContextMenu(event) {
|
|
672
|
+
if (this.contextMenuActions) {
|
|
673
|
+
const args = event.value;
|
|
674
|
+
const node = args.row.node;
|
|
675
|
+
if (node) {
|
|
676
|
+
args.actions = this.getContextActions(node) || [];
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
onShowRowActionsMenu(event) {
|
|
681
|
+
if (this.contentActions) {
|
|
682
|
+
const args = event.value;
|
|
683
|
+
const node = args.row.node;
|
|
684
|
+
if (node) {
|
|
685
|
+
args.actions = this.getNodeActions(node) || [];
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
onExecuteRowAction(event) {
|
|
690
|
+
if (this.contentActions) {
|
|
691
|
+
const args = event.value;
|
|
692
|
+
const node = args.row.node;
|
|
693
|
+
const action = args.action;
|
|
694
|
+
this.executeContentAction(node, action);
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
enforceSingleClickNavigationForMobile() {
|
|
698
|
+
if (this.isMobile()) {
|
|
699
|
+
this.navigationMode = DocumentListComponent.SINGLE_CLICK_NAVIGATION;
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
canNavigateFolder(node) {
|
|
703
|
+
let canNavigateFolder = false;
|
|
704
|
+
if (node?.isFolder) {
|
|
705
|
+
canNavigateFolder = true;
|
|
706
|
+
}
|
|
707
|
+
return canNavigateFolder;
|
|
708
|
+
}
|
|
709
|
+
onDataReady(nodePaging) {
|
|
710
|
+
this.ready.emit(nodePaging);
|
|
711
|
+
this.pagination.next(nodePaging.list.pagination);
|
|
712
|
+
}
|
|
713
|
+
updatePagination(requestPaginationModel) {
|
|
714
|
+
this._pagination.maxItems = requestPaginationModel.maxItems;
|
|
715
|
+
this._pagination.skipCount = requestPaginationModel.skipCount;
|
|
716
|
+
this.reload(requestPaginationModel.merge);
|
|
717
|
+
}
|
|
718
|
+
syncPagination() {
|
|
719
|
+
this.node.list.pagination.maxItems = this._pagination.maxItems;
|
|
720
|
+
this.node.list.pagination.skipCount = this._pagination.skipCount;
|
|
721
|
+
}
|
|
722
|
+
onFilterSelectionChange(activeFilters) {
|
|
723
|
+
this.filterSelection.emit(activeFilters);
|
|
724
|
+
}
|
|
725
|
+
resetNewFolderPagination() {
|
|
726
|
+
this._pagination.skipCount = 0;
|
|
727
|
+
this._pagination.maxItems = this.maxItems;
|
|
728
|
+
}
|
|
729
|
+
handleError(err) {
|
|
730
|
+
if (err.message) {
|
|
731
|
+
try {
|
|
732
|
+
if (JSON.parse(err.message).error.statusCode === 403) {
|
|
733
|
+
this.noPermission = true;
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
catch (error) {
|
|
737
|
+
/* empty */
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
this.setLoadingState(false);
|
|
741
|
+
this.error.emit(err);
|
|
742
|
+
}
|
|
743
|
+
getPreselectedNodesBasedOnSelectionMode() {
|
|
744
|
+
return this.hasPreselectedNodes() ? (this.isSingleSelectionMode() ? [this.preselectNodes[0]] : this.preselectNodes) : [];
|
|
745
|
+
}
|
|
746
|
+
getPreselectedRowsBasedOnSelectionMode() {
|
|
747
|
+
return this.hasPreselectedRows() ? (this.isSingleSelectionMode() ? [this.preselectedRows[0]] : this.preselectedRows) : [];
|
|
748
|
+
}
|
|
749
|
+
getSelectionBasedOnSelectionMode() {
|
|
750
|
+
return this.hasPreselectedRows()
|
|
751
|
+
? this.isSingleSelectionMode()
|
|
752
|
+
? [this.preselectedRows[0]]
|
|
753
|
+
: this.data.getSelectedRows()
|
|
754
|
+
: this.data.getSelectedRows();
|
|
755
|
+
}
|
|
756
|
+
onPreselectNodes() {
|
|
757
|
+
if (this.hasPreselectedNodes()) {
|
|
758
|
+
this.preselectRowsOfPreselectedNodes();
|
|
759
|
+
const preselectedRows = this.getPreselectedRowsBasedOnSelectionMode();
|
|
760
|
+
const selection = this.data.getSelectedRows();
|
|
761
|
+
for (const node of preselectedRows) {
|
|
762
|
+
this.dataTable.selectRow(node, true);
|
|
763
|
+
}
|
|
764
|
+
this.onNodeSelect({ row: undefined, selection });
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
preserveExistingSelection() {
|
|
768
|
+
if (this.isMultipleSelectionMode()) {
|
|
769
|
+
for (const selection of this.selection) {
|
|
770
|
+
const rowOfSelection = this.data.getRowByNodeId(selection.entry.id);
|
|
771
|
+
if (rowOfSelection) {
|
|
772
|
+
rowOfSelection.isSelected = true;
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
preselectRowsOfPreselectedNodes() {
|
|
778
|
+
this.preselectedRows = [];
|
|
779
|
+
const preselectedNodes = this.getPreselectedNodesBasedOnSelectionMode();
|
|
780
|
+
preselectedNodes.forEach((preselectedNode) => {
|
|
781
|
+
const rowOfPreselectedNode = this.data.getRowByNodeId(preselectedNode.entry.id);
|
|
782
|
+
if (rowOfPreselectedNode) {
|
|
783
|
+
rowOfPreselectedNode.isSelected = true;
|
|
784
|
+
this.preselectedRows.push(rowOfPreselectedNode);
|
|
785
|
+
}
|
|
786
|
+
});
|
|
787
|
+
}
|
|
788
|
+
unselectRowFromNodeId(nodeId) {
|
|
789
|
+
const rowToUnselect = this.data.getRowByNodeId(nodeId);
|
|
790
|
+
if (rowToUnselect?.isSelected) {
|
|
791
|
+
rowToUnselect.isSelected = false;
|
|
792
|
+
this.dataTable.selectRow(rowToUnselect, false);
|
|
793
|
+
const selection = this.getSelectionBasedOnSelectionMode();
|
|
794
|
+
this.onNodeUnselect({ row: undefined, selection });
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
isSingleSelectionMode() {
|
|
798
|
+
return this.selectionMode === 'single';
|
|
799
|
+
}
|
|
800
|
+
isMultipleSelectionMode() {
|
|
801
|
+
return this.selectionMode === 'multiple';
|
|
802
|
+
}
|
|
803
|
+
hasPreselectedNodes() {
|
|
804
|
+
return this.preselectNodes?.length > 0;
|
|
805
|
+
}
|
|
806
|
+
hasPreselectedRows() {
|
|
807
|
+
return this.preselectedRows?.length > 0;
|
|
808
|
+
}
|
|
809
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentListComponent, deps: [{ token: i1.DocumentListService }, { token: i0.ElementRef }, { token: i2.AppConfigService }, { token: i2.UserPreferencesService }, { token: i3.ContentService }, { token: i2.ThumbnailService }, { token: i4.AlfrescoApiService }, { token: i3.NodesApiService }, { token: i2.DataTableService }, { token: i5.LockService }, { token: i6.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
810
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DocumentListComponent, isStandalone: true, selector: "adf-document-list", inputs: { includeFields: "includeFields", where: "where", permissionsStyle: "permissionsStyle", locationFormat: "locationFormat", navigate: "navigate", showHeader: "showHeader", navigationMode: "navigationMode", thumbnails: "thumbnails", selectionMode: "selectionMode", multiselect: "multiselect", contentActions: "contentActions", contentActionsPosition: "contentActionsPosition", contextMenuActions: "contextMenuActions", emptyFolderImageUrl: "emptyFolderImageUrl", allowDropFiles: "allowDropFiles", sorting: "sorting", additionalSorting: "additionalSorting", sortingMode: "sortingMode", rowStyle: "rowStyle", rowStyleClass: "rowStyleClass", loading: "loading", _rowFilter: "_rowFilter", rowFilter: "rowFilter", imageResolver: "imageResolver", stickyHeader: "stickyHeader", headerFilters: "headerFilters", filterValue: "filterValue", currentFolderId: "currentFolderId", preselectNodes: "preselectNodes", node: "node", maxItems: "maxItems", columnsPresetKey: "columnsPresetKey", setColumnsVisibility: "setColumnsVisibility", setColumnsWidths: "setColumnsWidths", setColumnsOrder: "setColumnsOrder", maxColumnsVisible: "maxColumnsVisible", isResizingEnabled: "isResizingEnabled", blurOnResize: "blurOnResize", displayCheckboxesOnHover: "displayCheckboxesOnHover", displayDragAndDropHint: "displayDragAndDropHint" }, outputs: { nodeClick: "nodeClick", nodeDblClick: "nodeDblClick", folderChange: "folderChange", preview: "preview", ready: "ready", error: "error", nodeSelected: "nodeSelected", filterSelection: "filterSelection", columnsWidthChanged: "columnsWidthChanged", columnsVisibilityChanged: "columnsVisibilityChanged", columnsOrderChanged: "columnsOrderChanged", selectedItemsCountChanged: "selectedItemsCountChanged" }, host: { listeners: { "contextmenu": "onShowContextMenu($event)" }, classAttribute: "adf-document-list" }, providers: [
|
|
811
|
+
{
|
|
812
|
+
provide: ADF_DOCUMENT_PARENT_COMPONENT,
|
|
813
|
+
useExisting: DocumentListComponent
|
|
814
|
+
},
|
|
815
|
+
DataTableService
|
|
816
|
+
], queries: [{ propertyName: "columnList", first: true, predicate: DataColumnListComponent, descendants: true }, { propertyName: "customLoadingContent", first: true, predicate: CustomLoadingContentTemplateDirective, descendants: true }, { propertyName: "customNoPermissionsTemplate", first: true, predicate: CustomNoPermissionTemplateDirective, descendants: true }, { propertyName: "customNoContentTemplate", first: true, predicate: CustomEmptyContentTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "dataTable", first: true, predicate: ["dataTable"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<adf-datatable\n #dataTable\n [selectionMode]=\"selectionMode\"\n [data]=\"data\"\n [actions]=\"contentActions\"\n [actionsPosition]=\"contentActionsPosition\"\n [multiselect]=\"multiselect\"\n [contextMenu]=\"contextMenuActions\"\n [rowStyle]=\"rowStyle\"\n [rowStyleClass]=\"rowStyleClass\"\n [showMainDatatableActions]=\"true\"\n [loading]=\"loading\"\n [noPermission]=\"noPermission\"\n [showHeader]=\"showHeader\"\n [rowMenuCacheEnabled]=\"false\"\n [stickyHeader]=\"stickyHeader\"\n [allowFiltering]=\"allowFiltering\"\n [isResizingEnabled]=\"isResizingEnabled\"\n [blurOnResize]=\"blurOnResize\"\n [displayCheckboxesOnHover]=\"displayCheckboxesOnHover\"\n (showRowContextMenu)=\"onShowRowContextMenu($event)\"\n (showRowActionsMenu)=\"onShowRowActionsMenu($event)\"\n (executeRowAction)=\"onExecuteRowAction($event)\"\n (columnsWidthChanged)=\"onColumnsWidthChange($event)\"\n (columnOrderChanged)=\"onColumnOrderChange($event)\"\n (selectedItemsCountChanged)=\"onSelectedItemsCountChanged($event)\"\n (rowClick)=\"onNodeClick($event.value?.node)\"\n (rowDblClick)=\"onNodeDblClick($event.value?.node)\"\n (row-select)=\"onNodeSelect($any($event).detail)\"\n (row-unselect)=\"onNodeUnselect($any($event).detail)\"\n (sorting-changed)=\"onSortingChanged($any($event))\"\n [class.adf-datatable-gallery-thumbnails]=\"data.thumbnails\">\n\n <div *ngIf=\"headerFilters\">\n <adf-filter-header\n [currentFolderId]=\"currentFolderId\"\n [value]=\"filterValue\"\n (filterSelection)=\"onFilterSelectionChange($event)\" />\n </div>\n\n <adf-no-content-template>\n <ng-template>\n <adf-empty-list *ngIf=\"!customNoContentTemplate\">\n <div class=\"adf-empty-list_template adf-empty-folder\">\n <div class=\"adf-empty-folder-this-space-is-empty\">{{'ADF-DOCUMENT-LIST.EMPTY.HEADER' | translate}}</div>\n <ng-container *ngIf=\"displayDragAndDropHint\">\n <div class=\"adf-empty-folder-drag-drop\">{{ 'ADF-DATATABLE.EMPTY.DRAG-AND-DROP.TITLE' | translate }}</div>\n <div class=\"adf-empty-folder-any-files-here-to-add\">{{ 'ADF-DATATABLE.EMPTY.DRAG-AND-DROP.SUBTITLE' | translate }}</div>\n </ng-container>\n <img [alt]=\"'ADF-DATATABLE.EMPTY.DRAG-AND-DROP.TITLE' | translate\" class=\"adf-empty-folder-image\" [src]=\"emptyFolderImageUrl\">\n </div>\n </adf-empty-list>\n <ng-content select=\"adf-custom-empty-content-template, empty-folder-content\" />\n </ng-template>\n </adf-no-content-template>\n\n <adf-no-permission-template>\n <ng-template>\n <div class=\"adf-no-permission__template\" *ngIf=\"!customNoPermissionsTemplate\">\n <mat-icon>error</mat-icon>\n <p class=\"adf-no-permission__template--text\">{{ 'ADF-DOCUMENT-LIST.NO_PERMISSION' | translate }}</p>\n </div>\n <ng-content select=\"adf-custom-no-permission-template, no-permission-content\" />\n </ng-template>\n </adf-no-permission-template>\n\n <adf-loading-content-template>\n <ng-template>\n <div class=\"adf-document-list-loading-container\" *ngIf=\"!customLoadingContent\">\n <mat-progress-spinner\n id=\"adf-document-list-loading\"\n class=\"adf-document-list-loading-margin\"\n [attr.aria-label]=\"'ADF-DOCUMENT-LIST.LOADER_LABEL' | translate\"\n [color]=\"'primary'\"\n [mode]=\"'indeterminate'\" />\n </div>\n <ng-content select=\"adf-custom-loading-content-template\" />\n </ng-template>\n </adf-loading-content-template>\n\n <adf-main-menu-datatable-template>\n <ng-template let-mainMenuTrigger>\n <adf-datatable-column-selector\n [columns]=\"columns\"\n [mainMenuTrigger]=\"mainMenuTrigger\"\n [columnsSorting]=\"false\"\n [maxColumnsVisible]=\"maxColumnsVisible\"\n (submitColumnsVisibility)=\"onColumnsVisibilityChange($event)\" />\n </ng-template>\n </adf-main-menu-datatable-template>\n\n</adf-datatable>\n", styles: [".adf-document-list{min-height:0;height:100%;background-color:var(--theme-background-color)}.adf-sticky-document-list{height:310px;overflow-y:auto}.adf-datatable-card .adf-datatable-selected>svg{fill:var(--theme-accent-color);width:30px;height:30px;position:absolute;top:10px}.adf-datatable-list .adf-datatable-selected{display:inline-table}.adf-datatable-list .adf-datatable-selected>svg{fill:var(--theme-accent-color);width:30px;height:30px}.adf-document-list_empty_template{text-align:center;margin-top:20px;margin-bottom:20px}.adf-no-permission__template{display:flex;align-items:center;justify-content:center;flex-direction:column;width:100%;height:100%;min-height:300px}.adf-no-permission__template mat-icon{font-size:52px;height:52px;width:52px}.adf-no-permission__template--text{color:var(--adf-theme-foreground-text-color);font-size:var(--theme-subheading-2-font-size)}.adf-document-list__this-space-is-empty{height:32px;opacity:.26;font-size:var(--theme-headline-font-size);line-height:1.33;letter-spacing:-1px;color:var(--adf-theme-foreground-text-color)}.adf-document-list__drag-drop{height:56px;opacity:.54;font-size:56px;line-height:1;letter-spacing:-2px;color:var(--adf-theme-foreground-text-color);margin-top:40px}.adf-document-list__any-files-here-to-add{height:24px;opacity:.54;font-size:var(--theme-subheading-2-font-size);line-height:1.5;letter-spacing:-.4px;color:var(--adf-theme-foreground-text-color);margin-top:17px}.adf-document-list__empty_doc_lib{width:565px;height:161px;object-fit:contain;margin-top:17px}.adf-document-list-loading-margin{margin:auto}.adf-document-list-loading-container{min-height:300px;display:flex;flex-direction:row;height:100%}.adf-empty-list-header{height:32px;opacity:.26;font-size:var(--theme-headline-font-size);line-height:1.33;letter-spacing:-1px;color:var(--adf-theme-foreground-text-color)}.adf-documentlist-pagination{color:var(--adf-theme-foreground-text-color)}.adf-documentlist-pagination .adf-pagination__block{border-right:none}.adf-empty-folder-this-space-is-empty{height:32px;font-size:var(--theme-headline-font-size);line-height:1.33;letter-spacing:-1px;color:var(--adf-theme-foreground-text-color-054)}.adf-empty-folder-drag-drop{min-height:56px;font-size:53px;line-height:1;letter-spacing:-2px;color:var(--adf-theme-foreground-text-color);margin-top:40px;word-break:break-all;white-space:pre-line}@media (max-width: 599.9px){.adf-empty-folder-drag-drop{font-size:48px}}.adf-empty-folder-any-files-here-to-add{min-height:24px;font-size:var(--theme-subheading-2-font-size);line-height:1.5;letter-spacing:-.4px;color:var(--adf-theme-foreground-text-color);margin-top:17px;word-break:break-all;white-space:pre-line}.adf-empty-folder-image{width:565px;max-width:100%;object-fit:contain;margin-top:17px}@media (max-width: 599.9px){.adf-empty-folder-image{width:250px}}@media (max-width: 959.9px){.adf-empty-folder-drag-drop,.adf-empty-folder-any-files-here-to-add{display:none}}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row){height:300px}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) img{height:130px}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) .adf-datatable-cell{overflow:visible}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) .adf-datatable-cell.adf-datatable-cell--image{flex:0 0 auto;display:flex;flex-direction:column-reverse;justify-content:space-between}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) .adf-datatable-cell.adf-datatable-cell--image .adf-cell-value{display:flex;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DataTableComponent, selector: "adf-datatable", inputs: ["data", "rows", "sorting", "columns", "selectionMode", "multiselect", "mainTableAction", "actions", "showMainDatatableActions", "showProvidedActions", "actionsPosition", "actionsVisibleOnHover", "fallbackThumbnail", "contextMenu", "rowStyle", "rowStyleClass", "showHeader", "stickyHeader", "loading", "noPermission", "rowMenuCacheEnabled", "resolverFn", "allowFiltering", "isResizingEnabled", "blurOnResize", "displayCheckboxesOnHover", "enableDragRows"], outputs: ["rowClick", "rowDblClick", "showRowContextMenu", "showRowActionsMenu", "executeRowAction", "columnOrderChanged", "columnsWidthChanged", "selectedItemsCountChanged", "dragDropped"] }, { kind: "component", type: FilterHeaderComponent, selector: "adf-filter-header", inputs: ["value", "currentFolderId"], outputs: ["filterSelection"] }, { kind: "directive", type: NoContentTemplateDirective, selector: "adf-no-content-template, no-content-template" }, { kind: "component", type: EmptyListComponent, selector: "adf-empty-list" }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "directive", type: NoPermissionTemplateDirective, selector: "adf-no-permission-template, no-permission-template" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: LoadingContentTemplateDirective, selector: "adf-loading-content-template, loading-content-template" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: MainMenuDataTableTemplateDirective, selector: "adf-main-menu-datatable-template" }, { kind: "component", type: ColumnsSelectorComponent, selector: "adf-datatable-column-selector", inputs: ["columns", "mainMenuTrigger", "columnsSorting", "maxColumnsVisible"], outputs: ["submitColumnsVisibility"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
817
|
+
}
|
|
818
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentListComponent, decorators: [{
|
|
819
|
+
type: Component,
|
|
820
|
+
args: [{ selector: 'adf-document-list', standalone: true, imports: [
|
|
821
|
+
CommonModule,
|
|
822
|
+
DataTableComponent,
|
|
823
|
+
FilterHeaderComponent,
|
|
824
|
+
NoContentTemplateDirective,
|
|
825
|
+
EmptyListComponent,
|
|
826
|
+
TranslatePipe,
|
|
827
|
+
NoPermissionTemplateDirective,
|
|
828
|
+
MatIconModule,
|
|
829
|
+
LoadingContentTemplateDirective,
|
|
830
|
+
MatProgressSpinnerModule,
|
|
831
|
+
MainMenuDataTableTemplateDirective,
|
|
832
|
+
ColumnsSelectorComponent
|
|
833
|
+
], providers: [
|
|
834
|
+
{
|
|
835
|
+
provide: ADF_DOCUMENT_PARENT_COMPONENT,
|
|
836
|
+
useExisting: DocumentListComponent
|
|
837
|
+
},
|
|
838
|
+
DataTableService
|
|
839
|
+
], encapsulation: ViewEncapsulation.None, host: { class: 'adf-document-list' }, template: "<adf-datatable\n #dataTable\n [selectionMode]=\"selectionMode\"\n [data]=\"data\"\n [actions]=\"contentActions\"\n [actionsPosition]=\"contentActionsPosition\"\n [multiselect]=\"multiselect\"\n [contextMenu]=\"contextMenuActions\"\n [rowStyle]=\"rowStyle\"\n [rowStyleClass]=\"rowStyleClass\"\n [showMainDatatableActions]=\"true\"\n [loading]=\"loading\"\n [noPermission]=\"noPermission\"\n [showHeader]=\"showHeader\"\n [rowMenuCacheEnabled]=\"false\"\n [stickyHeader]=\"stickyHeader\"\n [allowFiltering]=\"allowFiltering\"\n [isResizingEnabled]=\"isResizingEnabled\"\n [blurOnResize]=\"blurOnResize\"\n [displayCheckboxesOnHover]=\"displayCheckboxesOnHover\"\n (showRowContextMenu)=\"onShowRowContextMenu($event)\"\n (showRowActionsMenu)=\"onShowRowActionsMenu($event)\"\n (executeRowAction)=\"onExecuteRowAction($event)\"\n (columnsWidthChanged)=\"onColumnsWidthChange($event)\"\n (columnOrderChanged)=\"onColumnOrderChange($event)\"\n (selectedItemsCountChanged)=\"onSelectedItemsCountChanged($event)\"\n (rowClick)=\"onNodeClick($event.value?.node)\"\n (rowDblClick)=\"onNodeDblClick($event.value?.node)\"\n (row-select)=\"onNodeSelect($any($event).detail)\"\n (row-unselect)=\"onNodeUnselect($any($event).detail)\"\n (sorting-changed)=\"onSortingChanged($any($event))\"\n [class.adf-datatable-gallery-thumbnails]=\"data.thumbnails\">\n\n <div *ngIf=\"headerFilters\">\n <adf-filter-header\n [currentFolderId]=\"currentFolderId\"\n [value]=\"filterValue\"\n (filterSelection)=\"onFilterSelectionChange($event)\" />\n </div>\n\n <adf-no-content-template>\n <ng-template>\n <adf-empty-list *ngIf=\"!customNoContentTemplate\">\n <div class=\"adf-empty-list_template adf-empty-folder\">\n <div class=\"adf-empty-folder-this-space-is-empty\">{{'ADF-DOCUMENT-LIST.EMPTY.HEADER' | translate}}</div>\n <ng-container *ngIf=\"displayDragAndDropHint\">\n <div class=\"adf-empty-folder-drag-drop\">{{ 'ADF-DATATABLE.EMPTY.DRAG-AND-DROP.TITLE' | translate }}</div>\n <div class=\"adf-empty-folder-any-files-here-to-add\">{{ 'ADF-DATATABLE.EMPTY.DRAG-AND-DROP.SUBTITLE' | translate }}</div>\n </ng-container>\n <img [alt]=\"'ADF-DATATABLE.EMPTY.DRAG-AND-DROP.TITLE' | translate\" class=\"adf-empty-folder-image\" [src]=\"emptyFolderImageUrl\">\n </div>\n </adf-empty-list>\n <ng-content select=\"adf-custom-empty-content-template, empty-folder-content\" />\n </ng-template>\n </adf-no-content-template>\n\n <adf-no-permission-template>\n <ng-template>\n <div class=\"adf-no-permission__template\" *ngIf=\"!customNoPermissionsTemplate\">\n <mat-icon>error</mat-icon>\n <p class=\"adf-no-permission__template--text\">{{ 'ADF-DOCUMENT-LIST.NO_PERMISSION' | translate }}</p>\n </div>\n <ng-content select=\"adf-custom-no-permission-template, no-permission-content\" />\n </ng-template>\n </adf-no-permission-template>\n\n <adf-loading-content-template>\n <ng-template>\n <div class=\"adf-document-list-loading-container\" *ngIf=\"!customLoadingContent\">\n <mat-progress-spinner\n id=\"adf-document-list-loading\"\n class=\"adf-document-list-loading-margin\"\n [attr.aria-label]=\"'ADF-DOCUMENT-LIST.LOADER_LABEL' | translate\"\n [color]=\"'primary'\"\n [mode]=\"'indeterminate'\" />\n </div>\n <ng-content select=\"adf-custom-loading-content-template\" />\n </ng-template>\n </adf-loading-content-template>\n\n <adf-main-menu-datatable-template>\n <ng-template let-mainMenuTrigger>\n <adf-datatable-column-selector\n [columns]=\"columns\"\n [mainMenuTrigger]=\"mainMenuTrigger\"\n [columnsSorting]=\"false\"\n [maxColumnsVisible]=\"maxColumnsVisible\"\n (submitColumnsVisibility)=\"onColumnsVisibilityChange($event)\" />\n </ng-template>\n </adf-main-menu-datatable-template>\n\n</adf-datatable>\n", styles: [".adf-document-list{min-height:0;height:100%;background-color:var(--theme-background-color)}.adf-sticky-document-list{height:310px;overflow-y:auto}.adf-datatable-card .adf-datatable-selected>svg{fill:var(--theme-accent-color);width:30px;height:30px;position:absolute;top:10px}.adf-datatable-list .adf-datatable-selected{display:inline-table}.adf-datatable-list .adf-datatable-selected>svg{fill:var(--theme-accent-color);width:30px;height:30px}.adf-document-list_empty_template{text-align:center;margin-top:20px;margin-bottom:20px}.adf-no-permission__template{display:flex;align-items:center;justify-content:center;flex-direction:column;width:100%;height:100%;min-height:300px}.adf-no-permission__template mat-icon{font-size:52px;height:52px;width:52px}.adf-no-permission__template--text{color:var(--adf-theme-foreground-text-color);font-size:var(--theme-subheading-2-font-size)}.adf-document-list__this-space-is-empty{height:32px;opacity:.26;font-size:var(--theme-headline-font-size);line-height:1.33;letter-spacing:-1px;color:var(--adf-theme-foreground-text-color)}.adf-document-list__drag-drop{height:56px;opacity:.54;font-size:56px;line-height:1;letter-spacing:-2px;color:var(--adf-theme-foreground-text-color);margin-top:40px}.adf-document-list__any-files-here-to-add{height:24px;opacity:.54;font-size:var(--theme-subheading-2-font-size);line-height:1.5;letter-spacing:-.4px;color:var(--adf-theme-foreground-text-color);margin-top:17px}.adf-document-list__empty_doc_lib{width:565px;height:161px;object-fit:contain;margin-top:17px}.adf-document-list-loading-margin{margin:auto}.adf-document-list-loading-container{min-height:300px;display:flex;flex-direction:row;height:100%}.adf-empty-list-header{height:32px;opacity:.26;font-size:var(--theme-headline-font-size);line-height:1.33;letter-spacing:-1px;color:var(--adf-theme-foreground-text-color)}.adf-documentlist-pagination{color:var(--adf-theme-foreground-text-color)}.adf-documentlist-pagination .adf-pagination__block{border-right:none}.adf-empty-folder-this-space-is-empty{height:32px;font-size:var(--theme-headline-font-size);line-height:1.33;letter-spacing:-1px;color:var(--adf-theme-foreground-text-color-054)}.adf-empty-folder-drag-drop{min-height:56px;font-size:53px;line-height:1;letter-spacing:-2px;color:var(--adf-theme-foreground-text-color);margin-top:40px;word-break:break-all;white-space:pre-line}@media (max-width: 599.9px){.adf-empty-folder-drag-drop{font-size:48px}}.adf-empty-folder-any-files-here-to-add{min-height:24px;font-size:var(--theme-subheading-2-font-size);line-height:1.5;letter-spacing:-.4px;color:var(--adf-theme-foreground-text-color);margin-top:17px;word-break:break-all;white-space:pre-line}.adf-empty-folder-image{width:565px;max-width:100%;object-fit:contain;margin-top:17px}@media (max-width: 599.9px){.adf-empty-folder-image{width:250px}}@media (max-width: 959.9px){.adf-empty-folder-drag-drop,.adf-empty-folder-any-files-here-to-add{display:none}}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row){height:300px}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) img{height:130px}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) .adf-datatable-cell{overflow:visible}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) .adf-datatable-cell.adf-datatable-cell--image{flex:0 0 auto;display:flex;flex-direction:column-reverse;justify-content:space-between}.adf-datatable-gallery-thumbnails .adf-datatable-card .adf-datatable-row:is(adf-datatable-row) .adf-datatable-cell.adf-datatable-cell--image .adf-cell-value{display:flex;justify-content:center}\n"] }]
|
|
840
|
+
}], ctorParameters: () => [{ type: i1.DocumentListService }, { type: i0.ElementRef }, { type: i2.AppConfigService }, { type: i2.UserPreferencesService }, { type: i3.ContentService }, { type: i2.ThumbnailService }, { type: i4.AlfrescoApiService }, { type: i3.NodesApiService }, { type: i2.DataTableService }, { type: i5.LockService }, { type: i6.MatDialog }], propDecorators: { columnList: [{
|
|
841
|
+
type: ContentChild,
|
|
842
|
+
args: [DataColumnListComponent]
|
|
843
|
+
}], customLoadingContent: [{
|
|
844
|
+
type: ContentChild,
|
|
845
|
+
args: [CustomLoadingContentTemplateDirective]
|
|
846
|
+
}], customNoPermissionsTemplate: [{
|
|
847
|
+
type: ContentChild,
|
|
848
|
+
args: [CustomNoPermissionTemplateDirective]
|
|
849
|
+
}], customNoContentTemplate: [{
|
|
850
|
+
type: ContentChild,
|
|
851
|
+
args: [CustomEmptyContentTemplateDirective]
|
|
852
|
+
}], includeFields: [{
|
|
853
|
+
type: Input
|
|
854
|
+
}], where: [{
|
|
855
|
+
type: Input
|
|
856
|
+
}], permissionsStyle: [{
|
|
857
|
+
type: Input
|
|
858
|
+
}], locationFormat: [{
|
|
859
|
+
type: Input
|
|
860
|
+
}], navigate: [{
|
|
861
|
+
type: Input
|
|
862
|
+
}], showHeader: [{
|
|
863
|
+
type: Input
|
|
864
|
+
}], navigationMode: [{
|
|
865
|
+
type: Input
|
|
866
|
+
}], thumbnails: [{
|
|
867
|
+
type: Input
|
|
868
|
+
}], selectionMode: [{
|
|
869
|
+
type: Input
|
|
870
|
+
}], multiselect: [{
|
|
871
|
+
type: Input
|
|
872
|
+
}], contentActions: [{
|
|
873
|
+
type: Input
|
|
874
|
+
}], contentActionsPosition: [{
|
|
875
|
+
type: Input
|
|
876
|
+
}], contextMenuActions: [{
|
|
877
|
+
type: Input
|
|
878
|
+
}], emptyFolderImageUrl: [{
|
|
879
|
+
type: Input
|
|
880
|
+
}], allowDropFiles: [{
|
|
881
|
+
type: Input
|
|
882
|
+
}], sorting: [{
|
|
883
|
+
type: Input
|
|
884
|
+
}], additionalSorting: [{
|
|
885
|
+
type: Input
|
|
886
|
+
}], sortingMode: [{
|
|
887
|
+
type: Input
|
|
888
|
+
}], rowStyle: [{
|
|
889
|
+
type: Input
|
|
890
|
+
}], rowStyleClass: [{
|
|
891
|
+
type: Input
|
|
892
|
+
}], loading: [{
|
|
893
|
+
type: Input
|
|
894
|
+
}], _rowFilter: [{
|
|
895
|
+
type: Input
|
|
896
|
+
}], rowFilter: [{
|
|
897
|
+
type: Input
|
|
898
|
+
}], imageResolver: [{
|
|
899
|
+
type: Input
|
|
900
|
+
}], stickyHeader: [{
|
|
901
|
+
type: Input
|
|
902
|
+
}], headerFilters: [{
|
|
903
|
+
type: Input
|
|
904
|
+
}], filterValue: [{
|
|
905
|
+
type: Input
|
|
906
|
+
}], currentFolderId: [{
|
|
907
|
+
type: Input
|
|
908
|
+
}], preselectNodes: [{
|
|
909
|
+
type: Input
|
|
910
|
+
}], node: [{
|
|
911
|
+
type: Input
|
|
912
|
+
}], maxItems: [{
|
|
913
|
+
type: Input
|
|
914
|
+
}], columnsPresetKey: [{
|
|
915
|
+
type: Input
|
|
916
|
+
}], setColumnsVisibility: [{
|
|
917
|
+
type: Input
|
|
918
|
+
}], setColumnsWidths: [{
|
|
919
|
+
type: Input
|
|
920
|
+
}], setColumnsOrder: [{
|
|
921
|
+
type: Input
|
|
922
|
+
}], maxColumnsVisible: [{
|
|
923
|
+
type: Input
|
|
924
|
+
}], isResizingEnabled: [{
|
|
925
|
+
type: Input
|
|
926
|
+
}], blurOnResize: [{
|
|
927
|
+
type: Input
|
|
928
|
+
}], displayCheckboxesOnHover: [{
|
|
929
|
+
type: Input
|
|
930
|
+
}], displayDragAndDropHint: [{
|
|
931
|
+
type: Input
|
|
932
|
+
}], nodeClick: [{
|
|
933
|
+
type: Output
|
|
934
|
+
}], nodeDblClick: [{
|
|
935
|
+
type: Output
|
|
936
|
+
}], folderChange: [{
|
|
937
|
+
type: Output
|
|
938
|
+
}], preview: [{
|
|
939
|
+
type: Output
|
|
940
|
+
}], ready: [{
|
|
941
|
+
type: Output
|
|
942
|
+
}], error: [{
|
|
943
|
+
type: Output
|
|
944
|
+
}], nodeSelected: [{
|
|
945
|
+
type: Output
|
|
946
|
+
}], filterSelection: [{
|
|
947
|
+
type: Output
|
|
948
|
+
}], columnsWidthChanged: [{
|
|
949
|
+
type: Output
|
|
950
|
+
}], columnsVisibilityChanged: [{
|
|
951
|
+
type: Output
|
|
952
|
+
}], columnsOrderChanged: [{
|
|
953
|
+
type: Output
|
|
954
|
+
}], selectedItemsCountChanged: [{
|
|
955
|
+
type: Output
|
|
956
|
+
}], dataTable: [{
|
|
957
|
+
type: ViewChild,
|
|
958
|
+
args: ['dataTable', { static: true }]
|
|
959
|
+
}], onShowContextMenu: [{
|
|
960
|
+
type: HostListener,
|
|
961
|
+
args: ['contextmenu', ['$event']]
|
|
962
|
+
}] } });
|
|
963
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL2RvY3VtZW50LWxpc3QvY29tcG9uZW50cy9kb2N1bWVudC1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvZG9jdW1lbnQtbGlzdC9jb21wb25lbnRzL2RvY3VtZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsMENBQTBDO0FBQzFDLHlEQUF5RDtBQUV6RCxPQUFPLEVBQ0gsZ0JBQWdCLEVBQ2hCLHdCQUF3QixFQUN4QixtQ0FBbUMsRUFDbkMscUNBQXFDLEVBQ3JDLG1DQUFtQyxFQUduQyx1QkFBdUIsRUFHdkIsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQiwrQkFBK0IsRUFDL0Isa0NBQWtDLEVBQ2xDLDBCQUEwQixFQUMxQiw2QkFBNkIsRUFJN0IsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3ZCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFtQixVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JGLE9BQU8sRUFFSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFB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c0JBRGIsS0FBSztnQkFLTixJQUFJO3NCQURILEtBQUs7Z0JBS04sUUFBUTtzQkFEUCxLQUFLO2dCQUtOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUtGLG9CQUFvQjtzQkFEdkIsS0FBSztnQkFPRixnQkFBZ0I7c0JBRG5CLEtBQUs7Z0JBT0YsZUFBZTtzQkFEbEIsS0FBSztnQkFPTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBS04saUJBQWlCO3NCQURoQixLQUFLO2dCQUtOLFlBQVk7c0JBRFgsS0FBSztnQkFLTix3QkFBd0I7c0JBRHZCLEtBQUs7Z0JBS04sc0JBQXNCO3NCQURyQixLQUFLO2dCQUtOLFNBQVM7c0JBRFIsTUFBTTtnQkFLUCxZQUFZO3NCQURYLE1BQU07Z0JBS1AsWUFBWTtzQkFEWCxNQUFNO2dCQVNQLE9BQU87c0JBRE4sTUFBTTtnQkFLUCxLQUFLO3NCQURKLE1BQU07Z0JBS1AsS0FBSztzQkFESixNQUFNO2dCQUtQLFlBQVk7c0JBRFgsTUFBTTtnQkFLUCxlQUFlO3NCQURkLE1BQU07Z0JBS1AsbUJBQW1CO3NCQURsQixNQUFNO2dCQUtQLHdCQUF3QjtzQkFEdkIsTUFBTTtnQkFLUCxtQkFBbUI7c0JBRGxCLE1BQU07Z0JBS1AseUJBQXlCO3NCQUR4QixNQUFNO2dCQUlQLFNBQVM7c0JBRFIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQTBSeEMsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgcnhqcy9uby1zdWJqZWN0LXZhbHVlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cblxuaW1wb3J0IHtcbiAgICBBcHBDb25maWdTZXJ2aWNlLFxuICAgIENvbHVtbnNTZWxlY3RvckNvbXBvbmVudCxcbiAgICBDdXN0b21FbXB0eUNvbnRlbnRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBDdXN0b21Mb2FkaW5nQ29udGVudFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIEN1c3RvbU5vUGVybWlzc2lvblRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIERhdGFDZWxsRXZlbnQsXG4gICAgRGF0YUNvbHVtbixcbiAgICBEYXRhQ29sdW1uTGlzdENvbXBvbmVudCxcbiAgICBEYXRhUm93LFxuICAgIERhdGFSb3dBY3Rpb25FdmVudCxcbiAgICBEYXRhU29ydGluZyxcbiAgICBEYXRhVGFibGVDb21wb25lbnQsXG4gICAgRGF0YVRhYmxlU2NoZW1hLFxuICAgIERhdGFUYWJsZVNlcnZpY2UsXG4gICAgRW1wdHlMaXN0Q29tcG9uZW50LFxuICAgIExvYWRpbmdDb250ZW50VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgTWFpbk1lbnVEYXRhVGFibGVUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBOb0NvbnRlbnRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBOb1Blcm1pc3Npb25UZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBQYWdpbmF0ZWRDb21wb25lbnQsXG4gICAgUGFnaW5hdGlvbk1vZGVsLFxuICAgIFJlcXVlc3RQYWdpbmF0aW9uTW9kZWwsXG4gICAgU2hvd0hlYWRlck1vZGUsXG4gICAgVGh1bWJuYWlsU2VydmljZSxcbiAgICBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlLFxuICAgIFVzZXJQcmVmZXJlbmNlVmFsdWVzXG59IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQgeyBOb2RlLCBOb2RlRW50cnksIE5vZGVQYWdpbmcsIE5vZGVzQXBpLCBQYWdpbmF0aW9uIH0gZnJvbSAnQGFsZnJlc2NvL2pzLWFwaSc7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBEZXN0cm95UmVmLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29udGVudFNlcnZpY2UsIE5vZGVzQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbic7XG5pbXBvcnQgeyBGaWx0ZXJTZWFyY2ggfSBmcm9tICcuLi8uLi9zZWFyY2gnO1xuaW1wb3J0IHsgUm93RmlsdGVyIH0gZnJvbSAnLi4vZGF0YS9yb3ctZmlsdGVyLm1vZGVsJztcbmltcG9ydCB7IFNoYXJlRGF0YVJvdyB9IGZyb20gJy4uL2RhdGEvc2hhcmUtZGF0YS1yb3cubW9kZWwnO1xuaW1wb3J0IHsgU2hhcmVEYXRhVGFibGVBZGFwdGVyIH0gZnJvbSAnLi4vZGF0YS9zaGFyZS1kYXRhdGFibGUtYWRhcHRlcic7XG5pbXBvcnQgeyBDb250ZW50QWN0aW9uTW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvY29udGVudC1hY3Rpb24ubW9kZWwnO1xuaW1wb3J0IHsgRG9jdW1lbnRMb2FkZXJOb2RlIH0gZnJvbSAnLi4vbW9kZWxzL2RvY3VtZW50LWZvbGRlci5tb2RlbCc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uU3R5bGVNb2RlbCB9IGZyb20gJy4uL21vZGVscy9wZXJtaXNzaW9ucy1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBwcmVzZXRzRGVmYXVsdE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL3ByZXNldC5tb2RlbCc7XG5pbXBvcnQgeyBEb2N1bWVudExpc3RTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZG9jdW1lbnQtbGlzdC5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2tTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbG9jay5zZXJ2aWNlJztcbmltcG9ydCB7IEFERl9ET0NVTUVOVF9QQVJFTlRfQ09NUE9ORU5UIH0gZnJvbSAnLi9kb2N1bWVudC1saXN0LnRva2VuJztcbmltcG9ydCB7IEZpbGVBdXRvRG93bmxvYWRDb21wb25lbnQgfSBmcm9tICcuL2ZpbGUtYXV0by1kb3dubG9hZC9maWxlLWF1dG8tZG93bmxvYWQuY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVFbnRpdHlFdmVudCwgTm9kZUVudHJ5RXZlbnQgfSBmcm9tICcuL25vZGUuZXZlbnQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZpbHRlckhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4vZmlsdGVyLWhlYWRlci9maWx0ZXItaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7IEFsZnJlc2NvQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FsZnJlc2NvLWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuY29uc3QgQllURVNfVE9fTUJfQ09OVkVSU0lPTl9WQUxVRSA9IDEwNDg1NzY7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYWRmLWRvY3VtZW50LWxpc3QnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIERhdGFUYWJsZUNvbXBvbmVudCxcbiAgICAgICAgRmlsdGVySGVhZGVyQ29tcG9uZW50LFxuICAgICAgICBOb0NvbnRlbnRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICAgICAgRW1wdHlMaXN0Q29tcG9uZW50LFxuICAgICAgICBUcmFuc2xhdGVQaXBlLFxuICAgICAgICBOb1Blcm1pc3Npb25UZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICAgICAgTWF0SWNvbk1vZHVsZSxcbiAgICAgICAgTG9hZGluZ0NvbnRlbnRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICAgICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLFxuICAgICAgICBNYWluTWVudURhdGFUYWJsZVRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICBDb2x1bW5zU2VsZWN0b3JDb21wb25lbnRcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kb2N1bWVudC1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9kb2N1bWVudC1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEFERl9ET0NVTUVOVF9QQVJFTlRfQ09NUE9ORU5ULFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IERvY3VtZW50TGlzdENvbXBvbmVudFxuICAgICAgICB9LFxuICAgICAgICBEYXRhVGFibGVTZXJ2aWNlXG4gICAgXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGhvc3Q6IHsgY2xhc3M6ICdhZGYtZG9jdW1lbnQtbGlzdCcgfVxufSlcbmV4cG9ydCBjbGFzcyBEb2N1bWVudExpc3RDb21wb25lbnQgZXh0ZW5kcyBEYXRhVGFibGVTY2hlbWEgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCwgUGFnaW5hdGVkQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgU0lOR0xFX0NMSUNLX05BVklHQVRJT046IHN0cmluZyA9ICdjbGljayc7XG4gICAgc3RhdGljIERPVUJMRV9DTElDS19OQVZJR0FUSU9OOiBzdHJpbmcgPSAnZGJsY2xpY2snO1xuXG4gICAgREVGQVVMVF9QQUdJTkFUSU9OOiBQYWdpbmF0aW9uID0gbmV3IFBhZ2luYXRpb24oe1xuICAgICAgICBoYXNNb3JlSXRlbXM6IGZhbHNlLFxuICAgICAgICBza2lwQ291bnQ6IDAsXG4gICAgICAgIG1heEl0ZW1zOiAyNSxcbiAgICAgICAgdG90YWxJdGVtczogMFxuICAgIH0pO1xuXG4gICAgREVGQVVMVF9TT1JUSU5HOiBEYXRhU29ydGluZ1tdID0gW25ldyBEYXRhU29ydGluZygnbmFtZScsICdhc2MnKSwgbmV3IERhdGFTb3J0aW5nKCdpc0ZvbGRlcicsICdkZXNjJyldO1xuXG4gICAgQENvbnRlbnRDaGlsZChEYXRhQ29sdW1uTGlzdENvbXBvbmVudClcbiAgICBjb2x1bW5MaXN0OiBEYXRhQ29sdW1uTGlzdENvbXBvbmVudDtcblxuICAgIEBDb250ZW50Q2hpbGQoQ3VzdG9tTG9hZGluZ0NvbnRlbnRUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgICBjdXN0b21Mb2FkaW5nQ29udGVudDogQ3VzdG9tTG9hZGluZ0NvbnRlbnRUZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIEBDb250ZW50Q2hpbGQoQ3VzdG9tTm9QZXJtaXNzaW9uVGVtcGxhdGVEaXJlY3RpdmUpXG4gICAgY3VzdG9tTm9QZXJtaXNzaW9uc1RlbXBsYXRlOiBDdXN0b21Ob1Blcm1pc3Npb25UZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIEBDb250ZW50Q2hpbGQoQ3VzdG9tRW1wdHlDb250ZW50VGVtcGxhdGVEaXJlY3RpdmUpXG4gICAgY3VzdG9tTm9Db250ZW50VGVtcGxhdGU6IEN1c3RvbUVtcHR5Q29udGVudFRlbXBsYXRlRGlyZWN0aXZlO1xuXG4gICAgLyoqIEluY2x1ZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbm9kZSBpbiB0aGUgc2VydmVyIHJlcXVlc3QuIEZvciBleGFtcGxlOiBhc3NvY2lhdGlvbiwgaXNMaW5rLCBpc0xvY2tlZCBhbmQgb3RoZXJzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgaW5jbHVkZUZpZWxkczogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIHRoZSBOb2RlIGxpc3QgdXNpbmcgdGhlICp3aGVyZSogY29uZGl0aW9uIG9mIHRoZSBSRVNUIEFQSVxuICAgICAqIChmb3IgZXhhbXBsZSwgaXNGb2xkZXI9dHJ1ZSkuIFNlZSB0aGUgUkVTVCBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHdoZXJlOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgYSBzZXQgb2YgQ1NTIHN0eWxlcyB0byBhcHBseSBkZXBlbmRpbmcgb24gdGhlIHBlcm1pc3Npb25cbiAgICAgKiBvZiB0aGUgdXNlciBvbiB0aGF0IG5vZGUuIFNlZSB0aGUgUGVybWlzc2lvbiBTdHlsZSBtb2RlbFxuICAgICAqIHBhZ2UgZm9yIGZ1cnRoZXIgZGV0YWlscyBhbmQgZXhhbXBsZXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwZXJtaXNzaW9uc1N0eWxlOiBQZXJtaXNzaW9uU3R5bGVNb2RlbFtdID0gW107XG5cbiAgICAvKiogVGhlIGRlZmF1bHQgcm91dGUgZm9yIGFsbCB0aGUgbG9jYXRpb24tYmFzZWQgY29sdW1ucyAoaWYgZGVjbGFyZWQpLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbG9jYXRpb25Gb3JtYXQ6IHN0cmluZyA9ICcvJztcblxuICAgIC8qKiBUb2dnbGVzIG5hdmlnYXRpb24gdG8gZm9sZGVyIGNvbnRlbnQgb3IgZmlsZSBwcmV2aWV3ICovXG4gICAgQElucHV0KClcbiAgICBuYXZpZ2F0ZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogVG9nZ2xlcyB0aGUgaGVhZGVyICovXG4gICAgQElucHV0KClcbiAgICBzaG93SGVhZGVyID0gU2hvd0hlYWRlck1vZGUuRGF0YTtcblxuICAgIC8qKlxuICAgICAqIFVzZXIgaW50ZXJhY3Rpb24gZm9yIGZvbGRlciBuYXZpZ2F0aW9uIG9yIGZpbGUgcHJldmlldy5cbiAgICAgKiBWYWxpZCB2YWx1ZXMgYXJlIFwiY2xpY2tcIiBhbmQgXCJkYmxjbGlja1wiLiBEZWZhdWx0IHZhbHVlOiBcImRibGNsaWNrXCJcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIG5hdmlnYXRpb25Nb2RlOiBzdHJpbmcgPSBEb2N1bWVudExpc3RDb21wb25lbnQuRE9VQkxFX0NMSUNLX05BVklHQVRJT047IC8vIGNsaWNrfGRibGNsaWNrXG5cbiAgICAvKiogU2hvdyBkb2N1bWVudCB0aHVtYm5haWxzIHJhdGhlciB0aGFuIGljb25zICovXG4gICAgQElucHV0KClcbiAgICB0aHVtYm5haWxzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBSb3cgc2VsZWN0aW9uIG1vZGUuIENhbiBiZSBudWxsLCBgc2luZ2xlYCBvciBgbXVsdGlwbGVgLiBGb3IgYG11bHRpcGxlYCBtb2RlLFxuICAgICAqIHlvdSBjYW4gdXNlIENtZCAobWFjT1MpIG9yIEN0cmwgKFdpbikgbW9kaWZpZXIga2V5IHRvIHRvZ2dsZSBzZWxlY3Rpb24gZm9yIG11bHRpcGxlIHJvd3MuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3Rpb25Nb2RlOiBzdHJpbmcgPSAnc2luZ2xlJzsgLy8gbnVsbHxzaW5nbGV8bXVsdGlwbGVcblxuICAgIC8qKiBUb2dnbGVzIG11bHRpc2VsZWN0IG1vZGUgKi9cbiAgICBASW5wdXQoKVxuICAgIG11bHRpc2VsZWN0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogVG9nZ2xlcyBjb250ZW50IGFjdGlvbnMgZm9yIGVhY2ggcm93ICovXG4gICAgQElucHV0KClcbiAgICBjb250ZW50QWN0aW9uczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFBvc2l0aW9uIG9mIHRoZSBjb250ZW50IGFjdGlvbnMgZHJvcGRvd24gbWVudS4gQ2FuIGJlIHNldCB0byBcImxlZnRcIiBvciBcInJpZ2h0XCIuICovXG4gICAgQElucHV0KClcbiAgICBjb250ZW50QWN0aW9uc1Bvc2l0aW9uOiBzdHJpbmcgPSAncmlnaHQnOyAvLyBsZWZ0fHJpZ2h0XG5cbiAgICAvKiogVG9nZ2xlcyBjb250ZXh0IG1lbnVzIGZvciBlYWNoIHJvdyAqL1xuICAgIEBJbnB1dCgpXG4gICAgY29udGV4dE1lbnVBY3Rpb25zOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogQ3VzdG9tIGltYWdlIGZvciBlbXB0eSBmb2xkZXIuIERlZmF1bHQgdmFsdWU6ICcuL2Fzc2V0cy9pbWFnZXMvZW1wdHlfZG9jX2xpYi5zdmcnICovXG4gICAgQElucHV0KClcbiAgICBlbXB0eUZvbGRlckltYWdlVXJsOiBzdHJpbmcgPSAnLi9hc3NldHMvaW1hZ2VzL2VtcHR5X2RvY19saWIuc3ZnJztcblxuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgdGhpcyBlbmFibGVzIHlvdSB0byBkcm9wIGZpbGVzIGRpcmVjdGx5IGludG8gc3ViZm9sZGVycyBzaG93blxuICAgICAqIGFzIGl0ZW1zIGluIHRoZSBsaXN0IG9yIGludG8gYW5vdGhlciBmaWxlIHRvIHRyaWdnZXIgdXBkYXRpbmcgaXQncyB2ZXJzaW9uLlxuICAgICAqIFdoZW4gZmFsc2UsIHRoZSBkcm9wcGVkIGZpbGUgd2lsbCBiZSBhZGRlZCB0byB0aGVcbiAgICAgKiBjdXJyZW50IGZvbGRlciAoaWUsIHRoZSBvbmUgY29udGFpbmluZyBhbGwgdGhlIGl0ZW1zIHNob3duIGluIHRoZSBsaXN0KS5cbiAgICAgKiBTZWUgdGhlIFVwbG9hZCBkaXJlY3RpdmUgZm9yIGZ1cnRoZXIgZGV0YWlscyBhYm91dCBob3cgdGhlIGZpbGUgZHJvcCBpc1xuICAgICAqIGhhbmRsZWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBhbGxvd0Ryb3BGaWxlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBkZWZhdWx0IHNvcnRpbmcuIFRoZSBmb3JtYXQgaXMgYW4gYXJyYXkgb2YgMiBzdHJpbmdzIGBba2V5LCBkaXJlY3Rpb25dYFxuICAgICAqIGkuZS4gYFsnbmFtZScsICdkZXNjJ11gIG9yIGBbJ25hbWUnLCAnYXNjJ11gLiBTZXQgdGhpcyB2YWx1ZSBvbmx5IGlmIHlvdSB3YW50IHRvXG4gICAgICogb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc29ydGluZyBkZXRlY3RlZCBieSB0aGUgY29tcG9uZW50IGJhc2VkIG9uIGNvbHVtbnMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzb3J0aW5nOiBzdHJpbmdbXSB8IERhdGFTb3J0aW5nID0gWyduYW1lJywgJ2FzYyddO1xuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBkZWZhdWx0IHNvcnRpbmcuIFRoZSBmb3JtYXQgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyBgW2tleSBkaXJlY3Rpb24sIG90aGVyS2V5IG90aGVyRGlyZWN0aW9uXWBcbiAgICAgKiBpLmUuIGBbJ25hbWUgZGVzYycsICdub2RlVHlwZSBhc2MnXWAgb3IgYFsnbmFtZSBhc2MnXWAuIFNldCB0aGlzIHZhbHVlIGlmIHlvdSB3YW50IGEgYmFzZVxuICAgICAqIHJ1bGUgdG8gYmUgYWRkZWQgdG8gdGhlIHNvcnRpbmcgYXBhcnQgZnJvbSB0aGUgb25lIGRyaXZlbiBieSB0aGUgaGVhZGVyLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgYWRkaXRpb25hbFNvcnRpbmc6IERhdGFTb3J0aW5nID0gbmV3IERhdGFTb3J0aW5nKCdpc0ZvbGRlcicsICdkZXNjJyk7XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHNvcnRpbmcgbW9kZS4gQ2FuIGJlIGVpdGhlciBgY2xpZW50YCAoaXRlbXMgaW4gdGhlIGxpc3RcbiAgICAgKiBhcmUgc29ydGVkIGNsaWVudC1zaWRlKSBvciBgc2VydmVyYCAodGhlIG9yZGVyaW5nIHN1cHBsaWVkIGJ5IHRoZVxuICAgICAqIHNlcnZlciBpcyB1c2VkIHdpdGhvdXQgZnVydGhlciBjbGllbnQtc2lkZSBzb3J0aW5nKS5cbiAgICAgKiBOb3RlIHRoYXQgdGhlIGBzZXJ2ZXJgIG9wdGlvbiAqZG9lcyBub3QqIHJlcXVlc3QgdGhlIHNlcnZlciB0byBzb3J0IHRoZSBkYXRhXG4gICAgICogYmVmb3JlIGRlbGl2ZXJpbmcgaXQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzb3J0aW5nTW9kZTogJ3NlcnZlcicgfCAnY2xpZW50JyA9ICdzZXJ2ZXInO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlubGluZSBzdHlsZSB0byBhcHBseSB0byBldmVyeSByb3cuIFNlZVxuICAgICAqIHRoZSBBbmd1bGFyIE5nU3R5bGVcbiAgICAgKiBkb2NzIGZvciBtb3JlIGRldGFpbHMgYW5kIHVzYWdlIGV4YW1wbGVzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcm93U3R5bGU6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgICAvKiogVGhlIENTUyBjbGFzcyB0byBhcHBseSB0byBldmVyeSByb3cgKi9cbiAgICBASW5wdXQoKVxuICAgIHJvd1N0eWxlQ2xhc3M6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIGxvYWRpbmcgc3RhdGUgYW5kIGFuaW1hdGVkIHNwaW5uZXJzIGZvciB0aGUgY29tcG9uZW50LiBVc2VkIGluXG4gICAgICogY29tYmluYXRpb24gd2l0aCBgbmF2aWdhdGU9ZmFsc2VgIHRvIHBlcmZvcm0gY3VzdG9tIG5hdmlnYXRpb24gYW5kIGxvYWRpbmdcbiAgICAgKiBzdGF0ZSBpbmRpY2F0aW9uLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBfcm93RmlsdGVyOiBSb3dGaWx0ZXIgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBmdW5jdGlvbiB0byBjaG9vc2Ugd2hldGhlciB0byBzaG93IG9yIGhpZGUgcm93cy5cbiAgICAgKiBTZWUgdGhlIFtSb3cgRmlsdGVyIE1vZGVsXShyb3ctZmlsdGVyLm1vZGVsLm1kKSBwYWdlIGZvclxuICAgICAqIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZXQgcm93RmlsdGVyKHJvd0ZpbHRlcjogUm93RmlsdGVyKSB7XG4gICAgICAgIHRoaXMuX3Jvd0ZpbHRlciA9IHJvd0ZpbHRlcjtcbiAgICAgICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnNldEZpbHRlcih0aGlzLl9yb3dGaWx0ZXIpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvbGRlcklkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCByb3dGaWx0ZXIoKTogUm93RmlsdGVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0ZpbHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gZnVuY3Rpb24gdG8gY2hvb3NlIGltYWdlIGZpbGUgcGF0aHMgdG8gc2hvdy4gU2VlIHRoZVxuICAgICAqIFtJbWFnZSBSZXNvbHZlciBNb2RlbF0oaW1hZ2UtcmVzb2x2ZXIubW9kZWwubWQpIHBhZ2UgZm9yXG4gICAgICogbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGltYWdlUmVzb2x2ZXI6IGFueSB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIFRvZ2dsZXMgdGhlIHN0aWNreSBoZWFkZXIgbW9kZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIHN0aWNreUhlYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFRvZ2dsZXMgdGhlIGhlYWRlciBmaWx0ZXJzIG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBoZWFkZXJGaWx0ZXJzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogSW5pdGlhbCB2YWx1ZSBmb3IgZmlsdGVyLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZmlsdGVyVmFsdWU6IGFueTtcblxuICAgIC8qKiBUaGUgSUQgb2YgdGhlIGZvbGRlciBub2RlIHRvIGRpc3BsYXkgb3IgYSByZXNlcnZlZCBzdHJpbmcgYWxpYXMgZm9yIHNwZWNpYWwgc291cmNlcyAqL1xuICAgIEBJbnB1dCgpXG4gICAgY3VycmVudEZvbGRlcklkOiBzdHJpbmcgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQXJyYXkgb2Ygbm9kZXMgdG8gYmUgcHJlLXNlbGVjdGVkLiBBbGwgbm9kZXMgaW4gdGhlXG4gICAgICogYXJyYXkgYXJlIHByZS1zZWxlY3RlZCBpbiBtdWx0aSBzZWxlY3Rpb24gbW9kZSwgYnV0IG9ubHkgdGhlIGZpcnN0IG5vZGVcbiAgICAgKiBpcyBwcmUtc2VsZWN0ZWQgaW4gc2luZ2xlIHNlbGVjdGlvbiBtb2RlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHJlc2VsZWN0Tm9kZXM6IE5vZGVFbnRyeVtdID0gW107XG5cbiAgICAvKiogVGhlIERvY3VtZW50IGxpc3Qgd2lsbCBzaG93IGFsbCB0aGUgbm9kZXMgY29udGFpbmVkIGluIHRoZSBOb2RlUGFnaW5nIGVudGl0eSAqL1xuICAgIEBJbnB1dCgpXG4gICAgbm9kZTogTm9kZVBhZ2luZyA9IG51bGw7XG5cbiAgICAvKiogRGVmYXVsdCB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlIHVzZXIgcHJlZmVyZW5jZSBzZXR0aW5ncy4gVXNlIHRoaXMgb25seSBpZiB5b3UgYXJlIG5vdCB1c2luZyBwYWdpbmF0aW9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWF4SXRlbXM6IG51bWJlciA9IHRoaXMuREVGQVVMVF9QQUdJTkFUSU9OLm1heEl0ZW1zO1xuXG4gICAgLyoqIEtleSBvZiBjb2x1bW5zIHByZXNldCBzZXQgaW4gZXh0ZW5zaW9uLmpzb24gICovXG4gICAgQElucHV0KClcbiAgICBjb2x1bW5zUHJlc2V0S2V5Pzogc3RyaW5nO1xuXG4gICAgLyoqIFNldHMgY29sdW1ucyB2aXNpYmlsaXR5IGZvciBEYXRhVGFibGVTY2hlbWEgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBzZXRDb2x1bW5zVmlzaWJpbGl0eShjb2x1bW5zVmlzaWJpbGl0eTogeyBbY29sdW1uSWQ6IHN0cmluZ106IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNvbHVtbnNWaXNpYmlsaXR5ID0gY29sdW1uc1Zpc2liaWxpdHk7XG4gICAgfVxuXG4gICAgLyoqIFNldHMgY29sdW1ucyB3aWR0aCBmb3IgRGF0YVRhYmxlU2NoZW1hICovXG4gICAgQElucHV0KClcbiAgICBzZXQgc2V0Q29sdW1uc1dpZHRocyhjb2x1bW5zV2lkdGhzOiB7IFtjb2x1bW5JZDogc3RyaW5nXTogbnVtYmVyIH0gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zV2lkdGhzID0gY29sdW1uc1dpZHRocztcbiAgICB9XG5cbiAgICAvKiogU2V0cyBjb2x1bW5zIG9yZGVyIGZvciBEYXRhVGFibGVTY2hlbWEgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBzZXRDb2x1bW5zT3JkZXIoY29sdW1uc09yZGVyOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNvbHVtbnNPcmRlciA9IGNvbHVtbnNPcmRlcjtcbiAgICB9XG5cbiAgICAvKiogTGltaXQgb2YgcG9zc2libGUgdmlzaWJsZSBjb2x1bW5zLCBpbmNsdWRpbmcgXCIkdGh1bWJuYWlsXCIgY29sdW1uIGlmIHByb3ZpZGVkICovXG4gICAgQElucHV0KClcbiAgICBtYXhDb2x1bW5zVmlzaWJsZT86IG51bWJlcjtcblxuICAgIC8qKiBFbmFibGVzIGNvbHVtbiByZXNpemluZyBmb3IgZGF0YXRhYmxlICovXG4gICAgQElucHV0KClcbiAgICBpc1Jlc2l6aW5nRW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqIEVuYWJsZXMgYmx1ciB3aGVuIHJlc2l6aW5nIGRhdGF0YWJsZSBjb2x1bW5zICovXG4gICAgQElucHV0KClcbiAgICBibHVyT25SZXNpemUgPSB0cnVlO1xuXG4gICAgLyoqIERpc3BsYXkgY2hlY2tib3hlcyBpbiBkYXRhdGFibGUgcm93cyBvbiBob3ZlciBvbmx5ICovXG4gICAgQElucHV0KClcbiAgICBkaXNwbGF5Q2hlY2tib3hlc09uSG92ZXIgPSBmYWxzZTtcblxuICAgIC8qKiBEaXNwbGF5IGRyYWcgYW5kIGRyb3AgaGludC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc3BsYXlEcmFnQW5kRHJvcEhpbnQgPSB0cnVlO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgYSBsaXN0IG5vZGUgKi9cbiAgICBAT3V0cHV0KClcbiAgICBub2RlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPE5vZGVFbnRpdHlFdmVudD4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgZG91YmxlLWNsaWNrcyBhIGxpc3Qgbm9kZSAqL1xuICAgIEBPdXRwdXQoKVxuICAgIG5vZGVEYmxDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8Tm9kZUVudGl0eUV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgY3VycmVudCBkaXNwbGF5IGZvbGRlciBjaGFuZ2VzICovXG4gICAgQE91dHB1dCgpXG4gICAgZm9sZGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOb2RlRW50cnlFdmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBhY3RzIHVwb24gZmlsZXMgd2l0aCBlaXRoZXIgc2luZ2xlIG9yIGRvdWJsZSBjbGlja1xuICAgICAqIChkZXBlbmRzIG9uIGBuYXZpZ2F0aW9uLW1vZGVgKS4gVXNlZnVsIGZvciBpbnRlZ3JhdGlvbiB3aXRoIHRoZVxuICAgICAqIFZpZXdlciBjb21wb25lbnQuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHJldmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8Tm9kZUVudGl0eUV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgRG9jdW1lbnQgTGlzdCBoYXMgbG9hZGVkIGFsbCBpdGVtcyBhbmQgaXMgcmVhZHkgZm9yIHVzZSAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxOb2RlUGFnaW5nPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgQVBJIGZhaWxzIHRvIGdldCB0aGUgRG9jdW1lbnQgTGlzdCBkYXRhICovXG4gICAgQE91dHB1dCgpXG4gICAgZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gdGhlIG5vZGUgc2VsZWN0aW9uIGNoYW5nZSAqL1xuICAgIEBPdXRwdXQoKVxuICAgIG5vZGVTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Tm9kZUVudHJ5W10+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGEgZmlsdGVyIHZhbHVlIGlzIHNlbGVjdGVkICovXG4gICAgQE91dHB1dCgpXG4gICAgZmlsdGVyU2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJTZWFyY2hbXT4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gY29sdW1uIHdpZHRocyBjaGFuZ2UgKi9cbiAgICBAT3V0cHV0KClcbiAgICBjb2x1bW5zV2lkdGhDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjx7IFtjb2x1bW5JZDogc3RyaW5nXTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGNvbHVtbnMgdmlzaWJpbGl0eSBjaGFuZ2UgKi9cbiAgICBAT3V0cHV0KClcbiAgICBjb2x1bW5zVmlzaWJpbGl0eUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgW2NvbHVtbklkOiBzdHJpbmddOiBib29sZWFuIH0gfCB1bmRlZmluZWQ+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGNvbHVtbnMgb3JkZXIgY2hhbmdlICovXG4gICAgQE91dHB1dCgpXG4gICAgY29sdW1uc09yZGVyQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10gfCB1bmRlZmluZWQ+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBzZWxlY3RlZCByb3cgaXRlbXMgY291bnQgaW4gdGhlIHRhYmxlIGNoYW5nZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgc2VsZWN0ZWRJdGVtc0NvdW50Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgdW5kZWZpbmVkPigpO1xuXG4gICAgQFZpZXdDaGlsZCgnZGF0YVRhYmxlJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBkYXRhVGFibGU6IERhdGFUYWJsZUNvbXBvbmVudDtcblxuICAgIGFjdGlvbnM6IENvbnRlbnRBY3Rpb25Nb2RlbFtdID0gW107XG4gICAgY29udGV4dEFjdGlvbkhhbmRsZXI6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgZGF0YTogU2hhcmVEYXRhVGFibGVBZGFwdGVyO1xuICAgIG5vUGVybWlzc2lvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHNlbGVjdGlvbiA9IG5ldyBBcnJheTxOb2RlRW50cnk+KCk7XG4gICAgJGZvbGRlck5vZGU6IFN1YmplY3Q8Tm9kZT4gPSBuZXcgU3ViamVjdDxOb2RlPigpO1xuICAgIGFsbG93RmlsdGVyaW5nOiBib29sZWFuID0gdHJ1ZTtcbiAgICBvcmRlckJ5OiBzdHJpbmdbXSA9IG51bGw7XG4gICAgcHJlc2VsZWN0ZWRSb3dzOiBEYXRhUm93W10gPSBbXTtcblxuICAgIC8vIEBkZXByZWNhdGVkIDMuMC4wXG4gICAgZm9sZGVyTm9kZTogTm9kZTtcblxuICAgIHByaXZhdGUgX3BhZ2luYXRpb246IFBhZ2luYXRpb25Nb2RlbCA9IHRoaXMuREVGQVVMVF9QQUdJTkFUSU9OO1xuICAgIHBhZ2luYXRpb246IEJlaGF2aW9yU3ViamVjdDxQYWdpbmF0aW9uTW9kZWw+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQYWdpbmF0aW9uTW9kZWw+KHRoaXMuREVGQVVMVF9QQUdJTkFUSU9OKTtcbiAgICBzb3J0aW5nU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PERhdGFTb3J0aW5nW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhU29ydGluZ1tdPih0aGlzLkRFRkFVTFRfU09SVElORyk7XG5cbiAgICBwcml2YXRlIHJvd01lbnVDYWNoZTogeyBba2V5OiBzdHJpbmddOiBDb250ZW50QWN0aW9uTW9kZWxbXSB9ID0ge307XG4gICAgcHJpdmF0ZSBsb2FkaW5nVGltZW91dDogYW55O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgcHJpdmF0ZSBfbm9kZXNBcGk6IE5vZGVzQXBpO1xuICAgIGdldCBub2Rlc0FwaSgpOiBOb2Rlc0FwaSB7XG4gICAgICAgIHRoaXMuX25vZGVzQXBpID0gdGhpcy5fbm9kZXNBcGkgPz8gbmV3IE5vZGVzQXBpKHRoaXMuYWxmcmVzY29BcGlTZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fbm9kZXNBcGk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZG9jdW1lbnRMaXN0U2VydmljZTogRG9jdW1lbnRMaXN0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIGFwcENvbmZpZzogQXBwQ29uZmlnU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB1c2VyUHJlZmVyZW5jZXNTZXJ2aWNlOiBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbnRlbnRTZXJ2aWNlOiBDb250ZW50U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0aHVtYm5haWxTZXJ2aWNlOiBUaHVtYm5haWxTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFsZnJlc2NvQXBpU2VydmljZTogQWxmcmVzY29BcGlTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG5vZGVTZXJ2aWNlOiBOb2Rlc0FwaVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZGF0YVRhYmxlU2VydmljZTogRGF0YVRhYmxlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBsb2NrU2VydmljZTogTG9ja1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2dcbiAgICApIHtcbiAgICAgICAgc3VwZXIoYXBwQ29uZmlnLCAnZGVmYXVsdCcsIHByZXNldHNEZWZhdWx0TW9kZWwpO1xuICAgICAgICB0aGlzLm5vZGVTZXJ2aWNlLm5vZGVVcGRhdGVkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSgobm9kZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVTZXJ2aWNlLnJvd1VwZGF0ZS5uZXh0KHsgaWQ6IG5vZGUuaWQsIG9iajogeyBlbnRyeTogbm9kZSB9IH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnVzZXJQcmVmZXJlbmNlc1NlcnZpY2VcbiAgICAgICAgICAgIC5zZWxlY3QoVXNlclByZWZlcmVuY2VWYWx1ZXMuUGFnaW5hdGlvblNpemUpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHBhZ1NpemUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1heEl0ZW1zID0gdGhpcy5fcGFnaW5hdGlvbi5tYXhJdGVtcyA9IHBhZ1NpemU7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRDb250ZXh0QWN0aW9ucyhub2RlOiBOb2RlRW50cnkpIHtcbiAgICAgICAgaWYgKG5vZGU/LmVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5nZXROb2RlQWN0aW9ucyhub2RlKTtcbiAgICAgICAgICAgIGlmIChhY3Rpb25zICYmIGFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb25zLm1hcCgoY3VycmVudEFjdGlvbjogQ29udGVudEFjdGlvbk1vZGVsKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBtb2RlbDogY3VycmVudEFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgc3ViamVjdDogdGhpcy5jb250ZXh0QWN0aW9uSGFuZGxlclxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlZmF1bHRTb3J0aW5nKCk6IERhdGFTb3J0aW5nIHtcbiAgICAgICAgbGV0IGRlZmF1bHRTb3J0aW5nOiBEYXRhU29ydGluZztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zb3J0aW5nKSkge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgZGlyZWN0aW9uXSA9IHRoaXMuc29ydGluZztcbiAgICAgICAgICAgIGRlZmF1bHRTb3J0aW5nID0gbmV3IERhdGFTb3J0aW5nKGtleSwgZGlyZWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlZmF1bHRTb3J0aW5nID0gbmV3IERhdGFTb3J0aW5nKHRoaXMuc29ydGluZy5rZXksIHRoaXMuc29ydGluZy5kaXJlY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRTb3J0aW5nO1xuICAgIH1cblxuICAgIGlzTW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISEvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhLmdldFJvd3MoKS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucm93TWVudUNhY2hlID0ge307XG4gICAgICAgIHRoaXMubG9hZExheW91dFByZXNldHMoKTtcbiAgICAgICAgdGhpcy5kYXRhID0gbmV3IFNoYXJlRGF0YVRhYmxlQWRhcHRlcihcbiAgICAgICAgICAgIHRoaXMudGh1bWJuYWlsU2VydmljZSxcbiAgICAgICAgICAgIHRoaXMuY29udGVudFNlcnZpY2UsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgdGhpcy5nZXREZWZhdWx0U29ydGluZygpLFxuICAgICAgICAgICAgdGhpcy5zb3J0aW5nTW9kZSxcbiAgICAgICAgICAgIHRoaXMuYWxsb3dEcm9wRmlsZXNcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5kYXRhLnRodW1ibmFpbHMgPSB0aGlzLnRodW1ibmFpbHM7XG4gICAgICAgIHRoaXMuZGF0YS5wZXJtaXNzaW9uc1N0eWxlID0gdGhpcy5wZXJtaXNzaW9uc1N0eWxlO1xuXG4gICAgICAgIGlmICh0aGlzLl9yb3dGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXRGaWx0ZXIodGhpcy5fcm93RmlsdGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmltYWdlUmVzb2x2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXRJbWFnZVJlc29sdmVyKHRoaXMuaW1hZ2VSZXNvbHZlcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRleHRBY3Rpb25IYW5kbGVyLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgodmFsKSA9PiB0aGlzLmNvbnRleHRBY3Rpb25DYWxsYmFjayh2YWwpKTtcblxuICAgICAgICB0aGlzLmVuZm9yY2VTaW5nbGVDbGlja05hdmlnYXRpb25Gb3JNb2JpbGUoKTtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyVmFsdWUgJiYgT2JqZWN0LmtleXModGhpcy5maWx0ZXJWYWx1ZSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zaG93SGVhZGVyID0gU2hvd0hlYWRlck1vZGUuQWx3YXlzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnNQcmVzZXRLZXkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UHJlc2V0S2V5KHRoaXMuY29sdW1uc1ByZXNldEtleSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRvY3VtZW50TGlzdFNlcnZpY2UucmVsb2FkJC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLnJlc2V0U2VsZWN0aW9uJC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGlvbigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbkxpc3QpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTGlzdC5jb2x1bW5zLmNoYW5nZXMucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUNvbHVtbnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2V0Q29sdW1ucyh0aGlzLmNvbHVtbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVEYXRhdGFibGVTY2hlbWEoKTtcbiAgICAgICAgdGhpcy5kYXRhLnNldENvbHVtbnModGhpcy5jb2x1bW5zKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmICghY2hhbmdlc1sncHJlc2VsZWN0Tm9kZXMnXSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGlvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zb3J0aW5nKSkge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgZGlyZWN0aW9uXSA9IHRoaXMuc29ydGluZztcbiAgICAgICAgICAgIHRoaXMub3JkZXJCeSA9IHRoaXMuYnVpbGRPcmRlckJ5QXJyYXkoa2V5LCBkaXJlY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcmRlckJ5ID0gdGhpcy5idWlsZE9yZGVyQnlBcnJheSh0aGlzLnNvcnRpbmcua2V5LCB0aGlzLnNvcnRpbmcuZGlyZWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS50aHVtYm5haWxzID0gdGhpcy50aHVtYm5haWxzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuc29ydGluZ01vZGUgJiYgIWNoYW5nZXMuc29ydGluZ01vZGUuZmlyc3RDaGFuZ2UgJiYgdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEuc29ydGluZ01vZGUgPSBjaGFuZ2VzLnNvcnRpbmdNb2RlLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzLnNvcnRpbmcgJiYgIWNoYW5nZXMuc29ydGluZy5maXJzdENoYW5nZSAmJiB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gY2hhbmdlcy5zb3J0aW5nLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAmJiBuZXdWYWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2tleSwgZGlyZWN0aW9uXSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZXRTb3J0aW5nKG5ldyBEYXRhU29ydGluZyhrZXksIGRpcmVjdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvbGRlcklkICYmIGNoYW5nZXNbJ2N1cnJlbnRGb2xkZXJJZCddPy5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXNbJ2N1cnJlbnRGb2xkZXJJZCddPy5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRGb2xkZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLm5vZGU/LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlID0gdGhpcy5fcGFnaW5hdGlvbiA/IHRoaXMuX3BhZ2luYXRpb24ubWVyZ2UgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEubG9hZFBhZ2UoY2hhbmdlcy5ub2RlLmN1cnJlbnRWYWx1ZSwgbWVyZ2UsIG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMucHJlc2VydmVFeGlzdGluZ1NlbGVjdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMub25QcmVzZWxlY3ROb2RlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMub25EYXRhUmVhZHkoY2hhbmdlcy5ub2RlLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZXMuaW1hZ2VSZXNvbHZlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZXRJbWFnZVJlc29sdmVyKGNoYW5nZXMuaW1hZ2VSZXNvbHZlci5jdXJyZW50VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVsb2FkKGhpZGVMb2FkaW5nU3Bpbm5lciA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucmVzZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5yZWxvYWRXaXRob3V0UmVzZXR0aW5nU2VsZWN0aW9uKGhpZGVMb2FkaW5nU3Bpbm5lcik7XG4gICAgfVxuXG4gICAgcmVsb2FkV2l0aG91dFJlc2V0dGluZ1NlbGVjdGlvbihoaWRlTG9hZGluZ1NwaW5uZXIgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5ub2RlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLmxvYWRQYWdlKHRoaXMubm9kZSwgdGhpcy5fcGFnaW5hdGlvbi5tZXJnZSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVzZXJ2ZUV4aXN0aW5nU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uUHJlc2VsZWN0Tm9kZXMoKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1BhZ2luYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMub25EYXRhUmVhZHkodGhpcy5ub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9hZEZvbGRlcihoaWRlTG9hZGluZ1NwaW5uZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29udGV4dEFjdGlvbkNhbGxiYWNrKGFjdGlvbikge1xuICAgICAgICBpZiAoYWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVDb250ZW50QWN0aW9uKGFjdGlvbi5ub2RlLCBhY3Rpb24ubW9kZWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Tm9kZUFjdGlvbnMobm9kZTogTm9kZUVudHJ5IHwgYW55KTogQ29udGVudEFjdGlvbk1vZGVsW10ge1xuICAgICAgICBpZiAobm9kZT8uZW50cnkpIHtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAobm9kZS5lbnRyeS5pc0ZpbGUpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSAnZG9jdW1lbnQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmVudHJ5LmlzRm9sZGVyKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gJ2ZvbGRlcic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5yb3dNZW51Q2FjaGVbbm9kZS5lbnRyeS5pZF07XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5mb3JFYWNoKChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaEFjdGlvbihhY3Rpb24sIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnM7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uc0J5VGFyZ2V0ID0gdGhpcy5hY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1Zpc2libGUgPSB0eXBlb2YgZW50cnkudmlzaWJsZSA9PT0gJ2Z1bmN0aW9uJyA/IGVudHJ5LnZpc2libGUobm9kZSkgOiBlbnRyeS52aXNpYmxlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNWaXNpYmxlICYmIGVudHJ5LnRhcmdldC50b0xvd2VyQ2FzZSgpID09PSB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGFjdGlvbikgPT4gbmV3IENvbnRlbnRBY3Rpb25Nb2RlbChhY3Rpb24pKTtcblxuICAgICAgICAgICAgICAgIGFjdGlvbnNCeVRhcmdldC5mb3JFYWNoKChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQWN0aW9uKGFjdGlvbiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJvd01lbnVDYWNoZVtub2RlLmVudHJ5LmlkXSA9IGFjdGlvbnNCeVRhcmdldDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uc0J5VGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVmcmVzaEFjdGlvbihhY3Rpb246IENvbnRlbnRBY3Rpb25Nb2RlbCwgbm9kZTogTm9kZUVudHJ5KSB7XG4gICAgICAgIGFjdGlvbi5kaXNhYmxlZCA9IHRoaXMuaXNBY3Rpb25EaXNhYmxlZChhY3Rpb24sIG5vZGUpO1xuICAgICAgICBhY3Rpb24udmlzaWJsZSA9IHRoaXMuaXNBY3Rpb25WaXNpYmxlKGFjdGlvbiwgbm9kZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0FjdGlvblZpc2libGUoYWN0aW9uOiBDb250ZW50QWN0aW9uTW9kZWwsIG5vZGU6IE5vZGVFbnRyeSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbi52aXNpYmxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnZpc2libGUobm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWN0aW9uLnZpc2libGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0FjdGlvbkRpc2FibGVkKGFjdGlvbjogQ29udGVudEFjdGlvbk1vZGVsLCBub2RlOiBOb2RlRW50cnkpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uZGlzYWJsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24uZGlzYWJsZWQobm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAoYWN0aW9uLnBlcm1pc3Npb24gJiYgYWN0aW9uLmRpc2FibGVXaXRoTm9QZXJtaXNzaW9uICYmICF0aGlzLmNvbnRlbnRTZXJ2aWNlLmhhc0FsbG93YWJsZU9wZXJhdGlvbnMobm9kZS5lbnRyeSwgYWN0aW9uLnBlcm1pc3Npb24pKSB8fFxuICAgICAgICAgICAgdGhpcy5sb2NrU2VydmljZS5pc0xvY2tlZChub2RlLmVudHJ5KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5kaXNhYmxlZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgWyckZXZlbnQnXSlcbiAgICBvblNob3dDb250ZXh0TWVudShlPzogRXZlbnQpIHtcbiAgICAgICAgaWYgKGUgJiYgdGhpcy5jb250ZXh0TWVudUFjdGlvbnMpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5hdmlnYXRlVG8obm9kZTogTm9kZSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0TmV3Rm9sZGVyUGFnaW5hdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9sZGVySWQgPSBub2RlO1xuICAgICAgICAgICAgdGhpcy5mb2xkZXJDaGFuZ2UuZW1pdChuZXcgTm9kZUVudHJ5RXZlbnQoeyBpZDogbm9kZSB9IGFzIE5vZGUpKTtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbk5hdmlnYXRlRm9sZGVyKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldE5ld0ZvbGRlclBhZ2luYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb2xkZXJJZCA9IHRoaXMuZ2V0Tm9kZUZvbGRlckRlc3RpbmF0aW9uSWQobm9kZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2xkZXJDaGFuZ2UuZW1pdChuZXcgTm9kZUVudHJ5RXZlbnQoeyBpZDogdGhpcy5jdXJyZW50Rm9sZGVySWQgfSBhcyBOb2RlKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROb2RlRm9sZGVyRGVzdGluYXRpb25JZChub2RlOiBOb2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlua0ZvbGRlcihub2RlKSA/IG5vZGUucHJvcGVydGllc1snY206ZGVzdGluYXRpb24nXSA6IG5vZGUuaWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0xpbmtGb2xkZXIobm9kZTogTm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gJ2FwcDpmb2xkZXJsaW5rJyAmJiBub2RlLnByb3BlcnRpZXM/LlsnY206ZGVzdGluYXRpb24nXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUN1c3RvbVNvdXJjZURhdGEobm9kZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9sZGVySWQgPSBub2RlSWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIGV4ZWN1dGluZyBjb250ZW50IGFjdGlvbiBmb3IgYSBkb2N1bWVudCBvciBmb2xkZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSBOb2RlIHRvIGJlIHRoZSBjb250ZXh0IG9mIHRoZSBleGVjdXRpb24uXG4gICAgICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY29udGV4dC5cbiAgICAgKi9cbiAgICBleGVjdXRlQ29udGVudEFjdGlvbihub2RlOiBOb2RlRW50cnksIGFjdGlvbjogQ29udGVudEFjdGlvbk1vZGVsKSB7XG4gICAgICAgIGlmIChub2RlPy5lbnRyeSAmJiBhY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJTdWIgPSB0eXBlb2YgYWN0aW9uLmhhbmRsZXIgPT09ICdmdW5jdGlvbicgPyBhY3Rpb24uaGFuZGxlcihub2RlLCB0aGlzLCBhY3Rpb24ucGVybWlzc2lvbikgOiBvZih0cnVlKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uZXhlY3V0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBoYW5kbGVyU3ViKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlclN1Yi5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKCkgPT4gYWN0aW9uLmV4ZWN1dGUobm9kZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRMb2FkaW5nU3RhdGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YT8uZ2V0Um93cygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRpbmdUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRpbmdUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRpbmdUaW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZEZvbGRlcihoaWRlTG9hZGluZ1NwaW5uZXIgPSBmYWxzZSkge1xuICAgICAgICBpZiAoIWhpZGVMb2FkaW5nU3Bpbm5lcikge1xuICAgICAgICAgICAgdGhpcy5zZXRMb2FkaW5nU3RhdGUodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLmlzQ3VzdG9tU291cmNlU2VydmljZSh0aGlzLmN1cnJlbnRGb2xkZXJJZCkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3VzdG9tU291cmNlRGF0YSh0aGlzLmN1cnJlbnRGb2xkZXJJZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRvY3VtZW50TGlzdFNlcnZpY2UubG9hZEZvbGRlckJ5Tm9kZUlkKHRoaXMuY3VycmVudEZvbGRlcklkLCB0aGlzLl9wYWdpbmF0aW9uLCB0aGlzLmluY2x1ZGVGaWVsZHMsIHRoaXMud2hlcmUsIHRoaXMub3JkZXJCeSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgKGRvY3VtZW50Tm9kZTogRG9jdW1lbnRMb2FkZXJOb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50Tm9kZS5jdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvbGRlck5vZGUgPSBkb2N1bWVudE5vZGUuY3VycmVudE5vZGUuZW50cnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGZvbGRlck5vZGUubmV4dChkb2N1bWVudE5vZGUuY3VycmVudE5vZGUuZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm9uUGFnZUxvYWRlZChkb2N1bWVudE5vZGUuY2hpbGRyZW4pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVzZXRTZWxlY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLnJlc2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gW107XG4gICAgICAgIHRoaXMubm9QZXJtaXNzaW9uID0gZmFsc2U7XG4gICAgfVxuXG4gICAgb25QYWdlTG9hZGVkKG5vZGVQYWdpbmc6IE5vZGVQYWdpbmcpIHtcbiAgICAgICAgaWYgKG5vZGVQYWdpbmcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEubG9hZFBhZ2Uobm9kZVBhZ2luZywgdGhpcy5fcGFnaW5hdGlvbi5tZXJnZSwgdGhpcy5hbGxvd0Ryb3BGaWxlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVzZXJ2ZUV4aXN0aW5nU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uUHJlc2VsZWN0Tm9kZXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0TG9hZGluZ1N0YXRlKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMub25EYXRhUmVhZHkobm9kZVBhZ2luZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblNvcnRpbmdDaGFuZ2VkKGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgICAgICB0aGlzLm9yZGVyQnkgPSB0aGlzLmJ1aWxkT3JkZXJCeUFycmF5KGV2ZW50LmRldGFpbC5zb3J0aW5nS2V5LCBldmVudC5kZXRhaWwuZGlyZWN0aW9uKTtcbiAgICAgICAgdGhpcy5zb3J0aW5nID0gW2V2ZW50LmRldGFpbC5zb3J0aW5nS2V5LCBldmVudC5kZXRhaWwuZGlyZWN0aW9uXTtcbiAgICAgICAgdGhpcy5zb3J0aW5nU3ViamVjdC5uZXh0KFt0aGlzLmFkZGl0aW9uYWxTb3J0aW5nLCBldmVudC5kZXRhaWxdKTtcblxuICAgICAgICBpZiAodGhpcy5zb3J0aW5nTW9kZSA9PT0gJ3NlcnZlcicpIHtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkT3JkZXJCeUFycmF5KGN1cnJlbnRLZXk6IHN0cmluZywgY3VycmVudERpcmVjdGlvbjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gW2Ake3RoaXMuYWRkaXRpb25hbFNvcnRpbmcua2V5fSAke3RoaXMuYWRkaXRpb25hbFNvcnRpbmcuZGlyZWN0aW9ufWAsIGAke2N1cnJlbnRLZXl9ICR7Y3VycmVudERpcmVjdGlvbn1gXTtcbiAgICB9XG5cbiAgICBvblByZXZpZXdGaWxlKG5vZGU6IE5vZGVFbnRyeSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZUluTUIgPSBub2RlLmVudHJ5Py5jb250ZW50Py5zaXplSW5CeXRlcyAvIEJZVEVTX1RPX01CX0NPTlZFUlNJT05fVkFMVUU7XG4gICAgICAgICAgICBjb25zdCBmaWxlQXV0b0Rvd25sb2FkRmxhZzogYm9vbGVhbiA9IHRoaXMuYXBwQ29uZmlnLmdldCgndmlld2VyLmVuYWJsZUZpbGVBdXRvRG93bmxvYWQnLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IHNpemVUaHJlc2hvbGQ6IG51bWJlciA9IHRoaXMuYXBwQ29uZmlnLmdldCgndmlld2VyLmZpbGVBdXRvRG93bmxvYWRTaXplVGhyZXNob2xkSW5NQicsIDE1KTtcblxuICAgICAgICAgICAgaWYgKGZpbGVBdXRvRG93bmxvYWRGbGFnICYmIHNpemVJbk1CICYmIHNpemVJbk1CID4gc2l6ZVRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oRmlsZUF1dG9Eb3dubG9hZENvbXBvbmVudCwgeyBkaXNhYmxlQ2xvc2U6IHRydWUsIGRhdGE6IG5vZGUgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmlldy5lbWl0KG5ldyBOb2RlRW50aXR5RXZlbnQobm9kZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Db2x1bW5zVmlzaWJpbGl0eUNoYW5nZShjb2x1bW5zOiBEYXRhQ29sdW1uW10pIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zVmlzaWJpbGl0eSA9IGNvbHVtbnMucmVkdWNlKCh2aXNpYmxlQ29sdW1uc01hcCwgY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLmlzSGlkZGVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2aXNpYmxlQ29sdW1uc01hcFtjb2x1bW4uaWRdID0gIWNvbHVtbi5pc0hpZGRlbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHZpc2libGVDb2x1bW5zTWFwO1xuICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgdGhpcy5jcmVhdGVDb2x1bW5zKCk7XG4gICAgICAgIHRoaXMuZGF0YS5zZXRDb2x1bW5zKHRoaXMuY29sdW1ucyk7XG4gICAgICAgIHRoaXMuY29sdW1uc1Zpc2liaWxpdHlDaGFuZ2VkLmVtaXQodGhpcy5jb2x1bW5zVmlzaWJpbGl0eSk7XG4gICAgfVxuXG4gICAgb25Db2x1bW5PcmRlckNoYW5nZShjb2x1bW5zV2l0aE5ld09yZGVyOiBEYXRhQ29sdW1uW10pIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zT3JkZXIgPSBjb2x1bW5zV2l0aE5ld09yZGVyLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uaWQpO1xuICAgICAgICB0aGlzLmNyZWF0ZUNvbHVtbnMoKTtcbiAgICAgICAgdGhpcy5jb2x1bW5zT3JkZXJDaGFuZ2VkLmVtaXQodGhpcy5jb2x1bW5zT3JkZXIpO1xuICAgIH1cblxuICAgIG9uQ29sdW1uc1dpZHRoQ2hhbmdlKGNvbHVtbnM6IERhdGFDb2x1bW5bXSkge1xuICAgICAgICBjb25zdCBuZXdDb2x1bW5zV2lkdGhzID0gY29sdW1ucy5yZWR1Y2UoKHdpZHRoc0NvbHVtbnNNYXAsIGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbi53aWR0aCkge1xuICAgICAgICAgICAgICAgIHdpZHRoc0NvbHVtbnNNYXBbY29sdW1uLmlkXSA9IE1hdGguY2VpbChjb2x1bW4ud2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdpZHRoc0NvbHVtbnNNYXA7XG4gICAgICAgIH0sIHt9KTtcblxuICAgICAgICB0aGlzLmNvbHVtbnNXaWR0aHMgPSB7IC4uLnRoaXMuY29sdW1uc1dpZHRocywgLi4ubmV3Q29sdW1uc1dpZHRocyB9O1xuICAgICAgICB0aGlzLmNyZWF0ZUNvbHVtbnMoKTtcbiAgICAgICAgdGhpcy5jb2x1bW5zV2lkdGhDaGFuZ2VkLmVtaXQodGhpcy5jb2x1bW5zV2lkdGhzKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdGVkSXRlbXNDb3VudENoYW5nZWQoY291bnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDb3VudENoYW5nZWQuZW1pdChjb3VudCk7XG4gICAgfVxuXG4gICAgb25Ob2RlQ2xpY2sobm9kZUVudHJ5OiBOb2RlRW50cnkpIHtcbiAgICAgICAgY29uc3QgZG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ25vZGUtY2xpY2snLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICBzZW5kZXI6IHRoaXMsXG4gICAgICAgICAgICAgICAgbm9kZTogbm9kZUVudHJ5XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KGRvbUV2ZW50KTtcblxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBOb2RlRW50aXR5RXZlbnQobm9kZUVudHJ5KTtcbiAgICAgICAgdGhpcy5ub2RlQ2xpY2suZW1pdChldmVudCk7XG5cbiAgICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5uYXZpZ2F0ZSAmJiB0aGlzLm5hdmlnYXRpb25Nb2RlID09PSBEb2N1bWVudExpc3RDb21wb25lbnQuU0lOR0xFX0NMSUNLX05BVklHQVRJT04pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVBY3Rpb25DbGljayhub2RlRW50cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Ob2RlRGJsQ2xpY2sobm9kZUVudHJ5OiBOb2RlRW50cnkpIHtcbiAgICAgICAgY29uc3QgZG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ25vZGUtZGJsY2xpY2snLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICBzZW5kZXI6IHRoaXMsXG4gICAgICAgICAgICAgICAgbm9kZTogbm9kZUVudHJ5XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChkb21FdmVudCk7XG5cbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgTm9kZUVudGl0eUV2ZW50KG5vZGVFbnRyeSk7XG4gICAgICAgIHRoaXMubm9kZURibENsaWNrLmVtaXQoZXZlbnQpO1xuXG4gICAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmF2aWdhdGUgJiYgdGhpcy5uYXZpZ2F0aW9uTW9kZSA9PT0gRG9jdW1lbnRMaXN0Q29tcG9uZW50LkRPVUJMRV9DTElDS19OQVZJR0FUSU9OKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQWN0aW9uQ2xpY2sobm9kZUVudHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWN1dGVBY3Rpb25DbGljayhub2RlRW50cnk6IE5vZGVFbnRyeSkge1xuICAgICAgICBpZiAobm9kZUVudHJ5Py5lbnRyeSkge1xuICAgICAgICAgICAgaWYgKG5vZGVFbnRyeS5lbnRyeS5pc0ZpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUHJldmlld0ZpbGUobm9kZUVudHJ5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5vZGVFbnRyeS5lbnRyeS5pc0ZvbGRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUbyhub2RlRW50cnkuZW50cnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9kZUVudHJ5LmVudHJ5WydndWlkJ10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBpbmNsdWRlOiB0aGlzLmluY2x1ZGVGaWVsZHNcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlc0FwaS5nZXROb2RlKG5vZGVFbnRyeS5lbnRyeVsnZ3VpZCddLCBvcHRpb25zKS50aGVuKChub2RlOiBOb2RlRW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvKG5vZGUuZW50cnkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Ob2RlU2VsZWN0KGV2ZW50OiB7IHJvdzogU2hhcmVEYXRhUm93OyBzZWxlY3Rpb246IEFycmF5PFNoYXJlRGF0YVJvdz4gfSkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGV2ZW50LnNlbGVjdGlvbi5tYXAoKGVudHJ5KSA9PiBlbnRyeS5ub2RlKTtcbiAgICAgICAgY29uc3QgZG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ25vZGUtc2VsZWN0Jywge1xuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgbm9kZTogZXZlbnQucm93ID8gZXZlbnQucm93Lm5vZGUgOiBudWxsLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogdGhpcy5zZWxlY3Rpb25cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBidWJibGVzOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5vZGVTZWxlY3RlZC5lbWl0KHRoaXMuc2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChkb21FdmVudCk7XG4gICAgfVxuXG4gICAgb25Ob2RlVW5zZWxlY3QoZXZlbnQ6IHsgcm93OiBTaGFyZURhdGFSb3c7IHNlbGVjdGlvbjogQXJyYXk8U2hhcmVEYXRhUm93PiB9KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gZXZlbnQuc2VsZWN0aW9uLm1hcCgoZW50cnkpID0+IGVudHJ5Lm5vZGUpO1xuICAgICAgICBjb25zdCBkb21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnbm9kZS11bnNlbGVjdCcsIHtcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgIG5vZGU6IGV2ZW50LnJvdyA/IGV2ZW50LnJvdy5ub2RlIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHRoaXMuc2VsZWN0aW9uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ub2RlU2VsZWN0ZWQuZW1pdCh0aGlzLnNlbGVjdGlvbik7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQoZG9tRXZlbnQpO1xuICAgIH1cblxuICAgIG9uU2hvd1Jvd0NvbnRleHRNZW51KGV2ZW50OiBEYXRhQ2VsbEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51QWN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGV2ZW50LnZhbHVlO1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGFyZ3Mucm93Lm5vZGU7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGFyZ3MuYWN0aW9ucyA9IHRoaXMuZ2V0Q29udGV4dEFjdGlvbnMobm9kZSkgfHwgW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblNob3dSb3dBY3Rpb25zTWVudShldmVudDogRGF0YUNlbGxFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50QWN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGV2ZW50LnZhbHVlO1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGFyZ3Mucm93Lm5vZGU7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGFyZ3MuYWN0aW9ucyA9IHRoaXMuZ2V0Tm9kZUFjdGlvbnMobm9kZSkgfHwgW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkV4ZWN1dGVSb3dBY3Rpb24oZXZlbnQ6IERhdGFSb3dBY3Rpb25FdmVudCkge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50QWN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGV2ZW50LnZhbHVlO1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGFyZ3Mucm93Lm5vZGU7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb24gPSBhcmdzLmFjdGlvbjtcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNvbnRlbnRBY3Rpb24obm9kZSwgYWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZW5mb3JjZVNpbmdsZUNsaWNrTmF2aWdhdGlvbkZvck1vYmlsZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uTW9kZSA9IERvY3VtZW50TGlzdENvbXBvbmVudC5TSU5HTEVfQ0xJQ0tfTkFWSUdBVElPTjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNhbk5hdmlnYXRlRm9sZGVyKG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGNhbk5hdmlnYXRlRm9sZGVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKG5vZGU/LmlzRm9sZGVyKSB7XG4gICAgICAgICAgICBjYW5OYXZpZ2F0ZUZvbGRlciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FuTmF2aWdhdGVGb2xkZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkRhdGFSZWFkeShub2RlUGFnaW5nOiBOb2RlUGFnaW5nKSB7XG4gICAgICAgIHRoaXMucmVhZHkuZW1pdChub2RlUGFnaW5nKTtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uLm5leHQobm9kZVBhZ2luZy5saXN0LnBhZ2luYXRpb24pO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhZ2luYXRpb24ocmVxdWVzdFBhZ2luYXRpb25Nb2RlbDogUmVxdWVzdFBhZ2luYXRpb25Nb2RlbCkge1xuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uLm1heEl0ZW1zID0gcmVxdWVzdFBhZ2luYXRpb25Nb2RlbC5tYXhJdGVtcztcbiAgICAgICAgdGhpcy5fcGFnaW5hdGlvbi5za2lwQ291bnQgPSByZXF1ZXN0UGFnaW5hdGlvbk1vZGVsLnNraXBDb3VudDtcbiAgICAgICAgdGhpcy5yZWxvYWQocmVxdWVzdFBhZ2luYXRpb25Nb2RlbC5tZXJnZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzeW5jUGFnaW5hdGlvbigpIHtcbiAgICAgICAgdGhpcy5ub2RlLmxpc3QucGFnaW5hdGlvbi5tYXhJdGVtcyA9IHRoaXMuX3BhZ2luYXRpb24ubWF4SXRlbXM7XG4gICAgICAgIHRoaXMubm9kZS5saXN0LnBhZ2luYXRpb24uc2tpcENvdW50ID0gdGhpcy5fcGFnaW5hdGlvbi5za2lwQ291bnQ7XG4gICAgfVxuXG4gICAgb25GaWx0ZXJTZWxlY3Rpb25DaGFuZ2UoYWN0aXZlRmlsdGVyczogRmlsdGVyU2VhcmNoW10pIHtcbiAgICAgICAgdGhpcy5maWx0ZXJTZWxlY3Rpb24uZW1pdChhY3RpdmVGaWx0ZXJzKTtcbiAgICB9XG5cbiAgICByZXNldE5ld0ZvbGRlclBhZ2luYXRpb24oKSB7XG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb24uc2tpcENvdW50ID0gMDtcbiAgICAgICAgdGhpcy5fcGFnaW5hdGlvbi5tYXhJdGVtcyA9IHRoaXMubWF4SXRlbXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVFcnJvcihlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKEpTT04ucGFyc2UoZXJyLm1lc3NhZ2UpLmVycm9yLnN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vUGVybWlzc2lvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvKiBlbXB0eSAqL1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0TG9hZGluZ1N0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5lcnJvci5lbWl0KGVycik7XG4gICAgfVxuXG4gICAgZ2V0UHJlc2VsZWN0ZWROb2Rlc0Jhc2VkT25TZWxlY3Rpb25Nb2RlKCk6IE5vZGVFbnRyeVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUHJlc2VsZWN0ZWROb2RlcygpID8gKHRoaXMuaXNTaW5nbGVTZWxlY3Rpb25Nb2RlKCkgPyBbdGhpcy5wcmVzZWxlY3ROb2Rlc1swXV0gOiB0aGlzLnByZXNlbGVjdE5vZGVzKSA6IFtdO1xuICAgIH1cblxuICAgIGdldFByZXNlbGVjdGVkUm93c0Jhc2VkT25TZWxlY3Rpb25Nb2RlKCk6IERhdGFSb3dbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1ByZXNlbGVjdGVkUm93cygpID8gKHRoaXMuaXNTaW5nbGVTZWxlY3Rpb25Nb2RlKCkgPyBbdGhpcy5wcmVzZWxlY3RlZFJvd3NbMF1dIDogdGhpcy5wcmVzZWxlY3RlZFJvd3MpIDogW107XG4gICAgfVxuXG4gICAgZ2V0U2VsZWN0aW9uQmFzZWRPblNlbGVjdGlvbk1vZGUoKTogRGF0YVJvd1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUHJlc2VsZWN0ZWRSb3dzKClcbiAgICAgICAgICAgID8gdGhpcy5pc1NpbmdsZVNlbGVjdGlvbk1vZGUoKVxuICAgICAgICAgICAgICAgID8gW3RoaXMucHJlc2VsZWN0ZWRSb3dzWzBdXVxuICAgICAgICAgICAgICAgIDogdGhpcy5kYXRhLmdldFNlbGVjdGVkUm93cygpXG4gICAgICAgICAgICA6IHRoaXMuZGF0YS5nZXRTZWxlY3RlZFJvd3MoKTtcbiAgICB9XG5cbiAgICBvblByZXNlbGVjdE5vZGVzKCkge1xuICAgICAgICBpZiAodGhpcy5oYXNQcmVzZWxlY3RlZE5vZGVzKCkpIHtcbiAgICAgICAgICAgIHRoaXMucHJlc2VsZWN0Um93c09mUHJlc2VsZWN0ZWROb2RlcygpO1xuICAgICAgICAgICAgY29uc3QgcHJlc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRQcmVzZWxlY3RlZFJvd3NCYXNlZE9uU2VsZWN0aW9uTW9kZSgpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5kYXRhLmdldFNlbGVjdGVkUm93cygpIGFzIFNoYXJlRGF0YVJvd1tdO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgcHJlc2VsZWN0ZWRSb3dzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhVGFibGUuc2VsZWN0Um93KG5vZGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbk5vZGVTZWxlY3QoeyByb3c6IHVuZGVmaW5lZCwgc2VsZWN0aW9uIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVzZXJ2ZUV4aXN0aW5nU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlU2VsZWN0aW9uTW9kZSgpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlbGVjdGlvbiBvZiB0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd09mU2VsZWN0aW9uID0gdGhpcy5kYXRhLmdldFJvd0J5Tm9kZUlkKHNlbGVjdGlvbi5lbnRyeS5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKHJvd09mU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd09mU2VsZWN0aW9uLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByZXNlbGVjdFJvd3NPZlByZXNlbGVjdGVkTm9kZXMoKSB7XG4gICAgICAgIHRoaXMucHJlc2VsZWN0ZWRSb3dzID0gW107XG4gICAgICAgIGNvbnN0IHByZXNlbGVjdGVkTm9kZXMgPSB0aGlzLmdldFByZXNlbGVjdGVkTm9kZXNCYXNlZE9uU2VsZWN0aW9uTW9kZSgpO1xuXG4gICAgICAgIHByZXNlbGVjdGVkTm9kZXMuZm9yRWFjaCgocHJlc2VsZWN0ZWROb2RlOiBOb2RlRW50cnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJvd09mUHJlc2VsZWN0ZWROb2RlID0gdGhpcy5kYXRhLmdldFJvd0J5Tm9kZUlkKHByZXNlbGVjdGVkTm9kZS5lbnRyeS5pZCk7XG4gICAgICAgICAgICBpZiAocm93T2ZQcmVzZWxlY3RlZE5vZGUpIHtcbiAgICAgICAgICAgICAgICByb3dPZlByZXNlbGVjdGVkTm9kZS5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXNlbGVjdGVkUm93cy5wdXNoKHJvd09mUHJlc2VsZWN0ZWROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdW5zZWxlY3RSb3dGcm9tTm9kZUlkKG5vZGVJZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHJvd1RvVW5zZWxlY3QgPSB0aGlzLmRhdGEuZ2V0Um93QnlOb2RlSWQobm9kZUlkKTtcbiAgICAgICAgaWYgKHJvd1RvVW5zZWxlY3Q/LmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHJvd1RvVW5zZWxlY3QuaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5kYXRhVGFibGUuc2VsZWN0Um93KHJvd1RvVW5zZWxlY3QsIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0aW9uQmFzZWRPblNlbGVjdGlvbk1vZGUoKSBhcyBTaGFyZURhdGFSb3dbXTtcbiAgICAgICAgICAgIHRoaXMub25Ob2RlVW5zZWxlY3QoeyByb3c6IHVuZGVmaW5lZCwgc2VsZWN0aW9uIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1NpbmdsZVNlbGVjdGlvbk1vZGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNdWx0aXBsZVNlbGVjdGlvbk1vZGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZSc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNQcmVzZWxlY3RlZE5vZGVzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVzZWxlY3ROb2Rlcz8ubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc1ByZXNlbGVjdGVkUm93cygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlc2VsZWN0ZWRSb3dzPy5sZW5ndGggPiAwO1xuICAgIH1cbn1cbiIsIjxhZGYtZGF0YXRhYmxlXG4gICAgI2RhdGFUYWJsZVxuICAgIFtzZWxlY3Rpb25Nb2RlXT1cInNlbGVjdGlvbk1vZGVcIlxuICAgIFtkYXRhXT1cImRhdGFcIlxuICAgIFthY3Rpb25zXT1cImNvbnRlbnRBY3Rpb25zXCJcbiAgICBbYWN0aW9uc1Bvc2l0aW9uXT1cImNvbnRlbnRBY3Rpb25zUG9zaXRpb25cIlxuICAgIFttdWx0aXNlbGVjdF09XCJtdWx0aXNlbGVjdFwiXG4gICAgW2NvbnRleHRNZW51XT1cImNvbnRleHRNZW51QWN0aW9uc1wiXG4gICAgW3Jvd1N0eWxlXT1cInJvd1N0eWxlXCJcbiAgICBbcm93U3R5bGVDbGFzc109XCJyb3dTdHlsZUNsYXNzXCJcbiAgICBbc2hvd01haW5EYXRhdGFibGVBY3Rpb25zXT1cInRydWVcIlxuICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgIFtub1Blcm1pc3Npb25dPVwibm9QZXJtaXNzaW9uXCJcbiAgICBbc2hvd0hlYWRlcl09XCJzaG93SGVhZGVyXCJcbiAgICBbcm93TWVudUNhY2hlRW5hYmxlZF09XCJmYWxzZVwiXG4gICAgW3N0aWNreUhlYWRlcl09XCJzdGlja3lIZWFkZXJcIlxuICAgIFthbGxvd0ZpbHRlcmluZ109XCJhbGxvd0ZpbHRlcmluZ1wiXG4gICAgW2lzUmVzaXppbmdFbmFibGVkXT1cImlzUmVzaXppbmdFbmFibGVkXCJcbiAgICBbYmx1ck9uUmVzaXplXT1cImJsdXJPblJlc2l6ZVwiXG4gICAgW2Rpc3BsYXlDaGVja2JveGVzT25Ib3Zlcl09XCJkaXNwbGF5Q2hlY2tib3hlc09uSG92ZXJcIlxuICAgIChzaG93Um93Q29udGV4dE1lbnUpPVwib25TaG93Um93Q29udGV4dE1lbnUoJGV2ZW50KVwiXG4gICAgKHNob3dSb3dBY3Rpb25zTWVudSk9XCJvblNob3dSb3dBY3Rpb25zTWVudSgkZXZlbnQpXCJcbiAgICAoZXhlY3V0ZVJvd0FjdGlvbik9XCJvbkV4ZWN1dGVSb3dBY3Rpb24oJGV2ZW50KVwiXG4gICAgKGNvbHVtbnNXaWR0aENoYW5nZWQpPVwib25Db2x1bW5zV2lkdGhDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKGNvbHVtbk9yZGVyQ2hhbmdlZCk9XCJvbkNvbHVtbk9yZGVyQ2hhbmdlKCRldmVudClcIlxuICAgIChzZWxlY3RlZEl0ZW1zQ291bnRDaGFuZ2VkKT1cIm9uU2VsZWN0ZWRJdGVtc0NvdW50Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAocm93Q2xpY2spPVwib25Ob2RlQ2xpY2soJGV2ZW50LnZhbHVlPy5ub2RlKVwiXG4gICAgKHJvd0RibENsaWNrKT1cIm9uTm9kZURibENsaWNrKCRldmVudC52YWx1ZT8ubm9kZSlcIlxuICAgIChyb3ctc2VsZWN0KT1cIm9uTm9kZVNlbGVjdCgkYW55KCRldmVudCkuZGV0YWlsKVwiXG4gICAgKHJvdy11bnNlbGVjdCk9XCJvbk5vZGVVbnNlbGVjdCgkYW55KCRldmVudCkuZGV0YWlsKVwiXG4gICAgKHNvcnRpbmctY2hhbmdlZCk9XCJvblNvcnRpbmdDaGFuZ2VkKCRhbnkoJGV2ZW50KSlcIlxuICAgIFtjbGFzcy5hZGYtZGF0YXRhYmxlLWdhbGxlcnktdGh1bWJuYWlsc109XCJkYXRhLnRodW1ibmFpbHNcIj5cblxuICAgIDxkaXYgKm5nSWY9XCJoZWFkZXJGaWx0ZXJzXCI+XG4gICAgICAgIDxhZGYtZmlsdGVyLWhlYWRlclxuICAgICAgICAgICAgW2N1cnJlbnRGb2xkZXJJZF09XCJjdXJyZW50Rm9sZGVySWRcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImZpbHRlclZhbHVlXCJcbiAgICAgICAgICAgIChmaWx0ZXJTZWxlY3Rpb24pPVwib25GaWx0ZXJTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiIC8+XG4gICAgPC9kaXY+XG5cbiAgICA8YWRmLW5vLWNvbnRlbnQtdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxhZGYtZW1wdHktbGlzdCAqbmdJZj1cIiFjdXN0b21Ob0NvbnRlbnRUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtZW1wdHktbGlzdF90ZW1wbGF0ZSBhZGYtZW1wdHktZm9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtZW1wdHktZm9sZGVyLXRoaXMtc3BhY2UtaXMtZW1wdHlcIj57eydBREYtRE9DVU1FTlQtTElTVC5FTVBUWS5IRUFERVInIHwgdHJhbnNsYXRlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlEcmFnQW5kRHJvcEhpbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtZW1wdHktZm9sZGVyLWRyYWctZHJvcFwiPnt7ICdBREYtREFUQVRBQkxFLkVNUFRZLkRSQUctQU5ELURST1AuVElUTEUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLWVtcHR5LWZvbGRlci1hbnktZmlsZXMtaGVyZS10by1hZGRcIj57eyAnQURGLURBVEFUQUJMRS5FTVBUWS5EUkFHLUFORC1EUk9QLlNVQlRJVExFJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBbYWx0XT1cIidBREYtREFUQVRBQkxFLkVNUFRZLkRSQUctQU5ELURST1AuVElUTEUnIHwgdHJhbnNsYXRlXCIgY2xhc3M9XCJhZGYtZW1wdHktZm9sZGVyLWltYWdlXCIgW3NyY109XCJlbXB0eUZvbGRlckltYWdlVXJsXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2FkZi1lbXB0eS1saXN0PlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiYWRmLWN1c3RvbS1lbXB0eS1jb250ZW50LXRlbXBsYXRlLCBlbXB0eS1mb2xkZXItY29udGVudFwiIC8+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9hZGYtbm8tY29udGVudC10ZW1wbGF0ZT5cblxuICAgIDxhZGYtbm8tcGVybWlzc2lvbi10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZi1uby1wZXJtaXNzaW9uX190ZW1wbGF0ZVwiICpuZ0lmPVwiIWN1c3RvbU5vUGVybWlzc2lvbnNUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhZGYtbm8tcGVybWlzc2lvbl9fdGVtcGxhdGUtLXRleHRcIj57eyAnQURGLURPQ1VNRU5ULUxJU1QuTk9fUEVSTUlTU0lPTicgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImFkZi1jdXN0b20tbm8tcGVybWlzc2lvbi10ZW1wbGF0ZSwgbm8tcGVybWlzc2lvbi1jb250ZW50XCIgLz5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2FkZi1uby1wZXJtaXNzaW9uLXRlbXBsYXRlPlxuXG4gICAgPGFkZi1sb2FkaW5nLWNvbnRlbnQtdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtZG9jdW1lbnQtbGlzdC1sb2FkaW5nLWNvbnRhaW5lclwiICpuZ0lmPVwiIWN1c3RvbUxvYWRpbmdDb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiYWRmLWRvY3VtZW50LWxpc3QtbG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWRmLWRvY3VtZW50LWxpc3QtbG9hZGluZy1tYXJnaW5cIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidBREYtRE9DVU1FTlQtTElTVC5MT0FERVJfTEFCRUwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cIidwcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgICAgIFttb2RlXT1cIidpbmRldGVybWluYXRlJ1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImFkZi1jdXN0b20tbG9hZGluZy1jb250ZW50LXRlbXBsYXRlXCIgLz5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2FkZi1sb2FkaW5nLWNvbnRlbnQtdGVtcGxhdGU+XG5cbiAgICA8YWRmLW1haW4tbWVudS1kYXRhdGFibGUtdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtbWFpbk1lbnVUcmlnZ2VyPlxuICAgICAgICAgICAgPGFkZi1kYXRhdGFibGUtY29sdW1uLXNlbGVjdG9yXG4gICAgICAgICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgICAgICAgICAgICBbbWFpbk1lbnVUcmlnZ2VyXT1cIm1haW5NZW51VHJpZ2dlclwiXG4gICAgICAgICAgICAgIFtjb2x1bW5zU29ydGluZ109XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFttYXhDb2x1bW5zVmlzaWJsZV09XCJtYXhDb2x1bW5zVmlzaWJsZVwiXG4gICAgICAgICAgICAgIChzdWJtaXRDb2x1bW5zVmlzaWJpbGl0eSk9XCJvbkNvbHVtbnNWaXNpYmlsaXR5Q2hhbmdlKCRldmVudClcIiAvPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvYWRmLW1haW4tbWVudS1kYXRhdGFibGUtdGVtcGxhdGU+XG5cbjwvYWRmLWRhdGF0YWJsZT5cbiJdfQ==
|