@sumaris-net/ngx-components 2.6.4-alpha5 → 2.6.4-alpha6
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/esm2020/public_api.mjs +313 -0
- package/esm2020/src/app/admin/admin-routing.module.mjs +41 -0
- package/esm2020/src/app/admin/admin.module.mjs +34 -0
- package/esm2020/src/app/admin/services/filter/person.filter.mjs +59 -0
- package/esm2020/src/app/admin/services/person.service.mjs +161 -0
- package/esm2020/src/app/admin/services/validator/person.validator.mjs +34 -0
- package/esm2020/src/app/admin/users/users.mjs +234 -0
- package/esm2020/src/app/admin/users/users.module.mjs +54 -0
- package/esm2020/src/app/core/about/about.modal.mjs +71 -0
- package/esm2020/src/app/core/about/about.module.mjs +34 -0
- package/esm2020/src/app/core/account/account.module.mjs +61 -0
- package/esm2020/src/app/core/account/account.page.mjs +316 -0
- package/esm2020/src/app/core/account/new-token.modal.mjs +115 -0
- package/esm2020/src/app/core/account/token.table.mjs +137 -0
- package/esm2020/src/app/core/auth/auth.form.mjs +131 -0
- package/esm2020/src/app/core/auth/auth.modal.mjs +72 -0
- package/esm2020/src/app/core/auth/auth.module.mjs +47 -0
- package/esm2020/src/app/core/core.module.mjs +184 -0
- package/esm2020/src/app/core/core.testing.module.mjs +86 -0
- package/esm2020/src/app/core/form/buttons/form-buttons-bar.component.mjs +71 -0
- package/esm2020/src/app/core/form/buttons/form-buttons-bar.module.mjs +35 -0
- package/esm2020/src/app/core/form/entity/editor.class.mjs +679 -0
- package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +421 -0
- package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +687 -0
- package/esm2020/src/app/core/form/entity/entity-metadata.component.mjs +25 -0
- package/esm2020/src/app/core/form/entity/entity.module.mjs +38 -0
- package/esm2020/src/app/core/form/form.class.mjs +340 -0
- package/esm2020/src/app/core/form/form.module.mjs +66 -0
- package/esm2020/src/app/core/form/form.utils.mjs +473 -0
- package/esm2020/src/app/core/form/list/list.form.mjs +222 -0
- package/esm2020/src/app/core/form/list/list.module.mjs +35 -0
- package/esm2020/src/app/core/form/properties/properties.form.mjs +132 -0
- package/esm2020/src/app/core/form/properties/properties.module.mjs +43 -0
- package/esm2020/src/app/core/form/properties/properties.table.mjs +264 -0
- package/esm2020/src/app/core/form/properties/property.validator.mjs +23 -0
- package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +90 -0
- package/esm2020/src/app/core/form/properties/testing/properties-form.testing.module.mjs +39 -0
- package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.mjs +70 -0
- package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +45 -0
- package/esm2020/src/app/core/form/text-popover/text-form.component.mjs +89 -0
- package/esm2020/src/app/core/form/text-popover/text-popover.component.mjs +146 -0
- package/esm2020/src/app/core/form/text-popover/text-popover.module.mjs +40 -0
- package/esm2020/src/app/core/graphql/graphql.module.mjs +22 -0
- package/esm2020/src/app/core/graphql/graphql.service.mjs +762 -0
- package/esm2020/src/app/core/graphql/graphql.utils.mjs +117 -0
- package/esm2020/src/app/core/home/home.mjs +257 -0
- package/esm2020/src/app/core/home/home.module.mjs +48 -0
- package/esm2020/src/app/core/icon/icon.component.mjs +41 -0
- package/esm2020/src/app/core/icon/icon.module.mjs +29 -0
- package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +343 -0
- package/esm2020/src/app/core/install/install-upgrade-card.module.mjs +35 -0
- package/esm2020/src/app/core/menu/menu.component.mjs +329 -0
- package/esm2020/src/app/core/menu/menu.model.mjs +35 -0
- package/esm2020/src/app/core/menu/menu.module.mjs +44 -0
- package/esm2020/src/app/core/menu/menu.service.mjs +55 -0
- package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +27 -0
- package/esm2020/src/app/core/offline/update-offline-mode-card.module.mjs +35 -0
- package/esm2020/src/app/core/peer/select-peer.modal.mjs +182 -0
- package/esm2020/src/app/core/peer/select-peer.module.mjs +42 -0
- package/esm2020/src/app/core/register/register-confirm.page.mjs +81 -0
- package/esm2020/src/app/core/register/register.form.mjs +181 -0
- package/esm2020/src/app/core/register/register.modal.mjs +52 -0
- package/esm2020/src/app/core/register/register.module.mjs +44 -0
- package/esm2020/src/app/core/services/account.service.mjs +1212 -0
- package/esm2020/src/app/core/services/auth-guard.service.mjs +71 -0
- package/esm2020/src/app/core/services/base-entity-service.class.mjs +444 -0
- package/esm2020/src/app/core/services/base-graphql-service.class.mjs +219 -0
- package/esm2020/src/app/core/services/base58.mjs +78 -0
- package/esm2020/src/app/core/services/config/core.config.mjs +175 -0
- package/esm2020/src/app/core/services/config.service.mjs +354 -0
- package/esm2020/src/app/core/services/crypto.service.mjs +114 -0
- package/esm2020/src/app/core/services/errors.mjs +50 -0
- package/esm2020/src/app/core/services/local-settings.service.mjs +449 -0
- package/esm2020/src/app/core/services/model/account.model.mjs +122 -0
- package/esm2020/src/app/core/services/model/config.model.mjs +92 -0
- package/esm2020/src/app/core/services/model/department.model.mjs +30 -0
- package/esm2020/src/app/core/services/model/entity.decorators.mjs +97 -0
- package/esm2020/src/app/core/services/model/entity.model.mjs +240 -0
- package/esm2020/src/app/core/services/model/filter.model.mjs +94 -0
- package/esm2020/src/app/core/services/model/history.model.mjs +2 -0
- package/esm2020/src/app/core/services/model/model.enum.mjs +11 -0
- package/esm2020/src/app/core/services/model/peer.model.mjs +68 -0
- package/esm2020/src/app/core/services/model/person.model.mjs +83 -0
- package/esm2020/src/app/core/services/model/referential.model.mjs +164 -0
- package/esm2020/src/app/core/services/model/settings.model.mjs +3 -0
- package/esm2020/src/app/core/services/model/token.model.mjs +48 -0
- package/esm2020/src/app/core/services/network.service.mjs +589 -0
- package/esm2020/src/app/core/services/network.types.mjs +20 -0
- package/esm2020/src/app/core/services/network.utils.mjs +15 -0
- package/esm2020/src/app/core/services/pipes/account.pipes.mjs +38 -0
- package/esm2020/src/app/core/services/pipes/department-to-string.pipe.mjs +23 -0
- package/esm2020/src/app/core/services/pipes/person-to-string.pipe.mjs +23 -0
- package/esm2020/src/app/core/services/pipes/usage-mode.pipes.mjs +37 -0
- package/esm2020/src/app/core/services/platform.service.mjs +525 -0
- package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +428 -0
- package/esm2020/src/app/core/services/storage/entity-store.class.mjs +449 -0
- package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +23 -0
- package/esm2020/src/app/core/services/testing/referential.validator.mjs +45 -0
- package/esm2020/src/app/core/services/validator/account.validator.mjs +56 -0
- package/esm2020/src/app/core/services/validator/base.validator.class.mjs +47 -0
- package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +66 -0
- package/esm2020/src/app/core/services/validator/user-settings.validator.mjs +27 -0
- package/esm2020/src/app/core/services/validator/user-token.validator.mjs +52 -0
- package/esm2020/src/app/core/settings/settings.module.mjs +34 -0
- package/esm2020/src/app/core/settings/settings.page.mjs +312 -0
- package/esm2020/src/app/core/table/actions-column.component.mjs +102 -0
- package/esm2020/src/app/core/table/async-table.class.mjs +1697 -0
- package/esm2020/src/app/core/table/entities-async-table-datasource.class.mjs +384 -0
- package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +399 -0
- package/esm2020/src/app/core/table/memory-table.class.mjs +53 -0
- package/esm2020/src/app/core/table/table-select-columns.component.mjs +43 -0
- package/esm2020/src/app/core/table/table.class.mjs +1728 -0
- package/esm2020/src/app/core/table/table.model.mjs +12 -0
- package/esm2020/src/app/core/table/table.module.mjs +40 -0
- package/esm2020/src/app/core/table/table.utils.mjs +30 -0
- package/esm2020/src/app/core/table/testing/table-validator.service.mjs +27 -0
- package/esm2020/src/app/core/table/testing/table.testing.mjs +280 -0
- package/esm2020/src/app/core/table/testing/table.testing.module.mjs +38 -0
- package/esm2020/src/app/shared/alerts.mjs +239 -0
- package/esm2020/src/app/shared/audio/audio.mjs +248 -0
- package/esm2020/src/app/shared/audio/audio.testing.mjs +31 -0
- package/esm2020/src/app/shared/audio/audio.testing.module.mjs +45 -0
- package/esm2020/src/app/shared/capacitor/keyboard.mjs +40 -0
- package/esm2020/src/app/shared/capacitor/plugins.mjs +9 -0
- package/esm2020/src/app/shared/constants.mjs +10 -0
- package/esm2020/src/app/shared/dates.mjs +147 -0
- package/esm2020/src/app/shared/debug/debug-service.class.mjs +3 -0
- package/esm2020/src/app/shared/debug/debug.component.mjs +39 -0
- package/esm2020/src/app/shared/debug/debug.module.mjs +44 -0
- package/esm2020/src/app/shared/directives/autofocus.directive.mjs +92 -0
- package/esm2020/src/app/shared/directives/autotitle.directive.mjs +30 -0
- package/esm2020/src/app/shared/directives/directives.module.mjs +43 -0
- package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +53 -0
- package/esm2020/src/app/shared/directives/ng-var.directive.mjs +31 -0
- package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +59 -0
- package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +40 -0
- package/esm2020/src/app/shared/directives/resizable/resizable.module.mjs +17 -0
- package/esm2020/src/app/shared/events.mjs +64 -0
- package/esm2020/src/app/shared/file/csv.utils.mjs +74 -0
- package/esm2020/src/app/shared/file/file.service.mjs +117 -0
- package/esm2020/src/app/shared/file/file.utils.mjs +113 -0
- package/esm2020/src/app/shared/file/images.utils.mjs +161 -0
- package/esm2020/src/app/shared/file/json.utils.mjs +51 -0
- package/esm2020/src/app/shared/file/uri.utils.mjs +23 -0
- package/esm2020/src/app/shared/focusable.mjs +6 -0
- package/esm2020/src/app/shared/form/field.component.mjs +307 -0
- package/esm2020/src/app/shared/form/field.model.mjs +25 -0
- package/esm2020/src/app/shared/form/loading-spinner.mjs +36 -0
- package/esm2020/src/app/shared/forms.mjs +391 -0
- package/esm2020/src/app/shared/functions.mjs +477 -0
- package/esm2020/src/app/shared/geolocation/geolocation.utils.mjs +80 -0
- package/esm2020/src/app/shared/gesture/gesture-config.mjs +49 -0
- package/esm2020/src/app/shared/gesture/hammer.utils.mjs +2 -0
- package/esm2020/src/app/shared/graph/colors.utils.mjs +64 -0
- package/esm2020/src/app/shared/graph/graph-colors.mjs +212 -0
- package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +57 -0
- package/esm2020/src/app/shared/help/help.modal.mjs +53 -0
- package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +23 -0
- package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +84 -0
- package/esm2020/src/app/shared/hotkeys/shared-hotkeys.module.mjs +42 -0
- package/esm2020/src/app/shared/http/http.utils.mjs +52 -0
- package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +365 -0
- package/esm2020/src/app/shared/image/gallery/image-gallery.module.mjs +59 -0
- package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +27 -0
- package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +90 -0
- package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +39 -0
- package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +56 -0
- package/esm2020/src/app/shared/image/image.model.mjs +2 -0
- package/esm2020/src/app/shared/image/image.module.mjs +29 -0
- package/esm2020/src/app/shared/image/image.service.mjs +98 -0
- package/esm2020/src/app/shared/inputs.mjs +231 -0
- package/esm2020/src/app/shared/interceptors/progess.interceptor.mjs +27 -0
- package/esm2020/src/app/shared/logging/log-level.model.mjs +48 -0
- package/esm2020/src/app/shared/logging/logger.model.mjs +47 -0
- package/esm2020/src/app/shared/logging/logging-service.class.mjs +121 -0
- package/esm2020/src/app/shared/logging/logging-service.config.mjs +2 -0
- package/esm2020/src/app/shared/logging/logging-service.module.mjs +30 -0
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +47 -0
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +916 -0
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +78 -0
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +19 -0
- package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +209 -0
- package/esm2020/src/app/shared/material/badge/badge.directive.mjs +194 -0
- package/esm2020/src/app/shared/material/badge/badge.module.mjs +32 -0
- package/esm2020/src/app/shared/material/badge/badge.test.mjs +41 -0
- package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +68 -0
- package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +253 -0
- package/esm2020/src/app/shared/material/chips/chips.module.mjs +76 -0
- package/esm2020/src/app/shared/material/chips/material.chips.mjs +697 -0
- package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +143 -0
- package/esm2020/src/app/shared/material/datetime/datetime.module.mjs +91 -0
- package/esm2020/src/app/shared/material/datetime/material.date.mjs +376 -0
- package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +385 -0
- package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +499 -0
- package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +108 -0
- package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +110 -0
- package/esm2020/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +103 -0
- package/esm2020/src/app/shared/material/duration/duration.module.mjs +67 -0
- package/esm2020/src/app/shared/material/duration/duration.utils.mjs +36 -0
- package/esm2020/src/app/shared/material/duration/material.duration.mjs +257 -0
- package/esm2020/src/app/shared/material/latlong/latlong.utils.mjs +266 -0
- package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +381 -0
- package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +67 -0
- package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +102 -0
- package/esm2020/src/app/shared/material/material.animations.mjs +104 -0
- package/esm2020/src/app/shared/material/material.module.mjs +224 -0
- package/esm2020/src/app/shared/material/material.testing.module.mjs +168 -0
- package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +98 -0
- package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +80 -0
- package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +190 -0
- package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +17 -0
- package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +162 -0
- package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +37 -0
- package/esm2020/src/app/shared/material/numpad/numpad.model.mjs +15 -0
- package/esm2020/src/app/shared/material/numpad/numpad.module.mjs +60 -0
- package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +46 -0
- package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +46 -0
- package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +22 -0
- package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +344 -0
- package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +52 -0
- package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +64 -0
- package/esm2020/src/app/shared/modules.mjs +11 -0
- package/esm2020/src/app/shared/observables.mjs +103 -0
- package/esm2020/src/app/shared/pipes/arrays.pipe.mjs +141 -0
- package/esm2020/src/app/shared/pipes/colors.pipe.mjs +23 -0
- package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +48 -0
- package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +66 -0
- package/esm2020/src/app/shared/pipes/date-from-now.pipe.mjs +27 -0
- package/esm2020/src/app/shared/pipes/duration.pipe.mjs +34 -0
- package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +62 -0
- package/esm2020/src/app/shared/pipes/form.pipes.mjs +187 -0
- package/esm2020/src/app/shared/pipes/highlight.pipe.mjs +48 -0
- package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +46 -0
- package/esm2020/src/app/shared/pipes/maps.pipe.mjs +63 -0
- package/esm2020/src/app/shared/pipes/math.pipes.mjs +59 -0
- package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +21 -0
- package/esm2020/src/app/shared/pipes/number-format.pipe.mjs +30 -0
- package/esm2020/src/app/shared/pipes/pipes.module.mjs +239 -0
- package/esm2020/src/app/shared/pipes/property.pipes.mjs +93 -0
- package/esm2020/src/app/shared/pipes/string.pipes.mjs +121 -0
- package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +43 -0
- package/esm2020/src/app/shared/pipes/types.pipes.mjs +45 -0
- package/esm2020/src/app/shared/platforms.mjs +43 -0
- package/esm2020/src/app/shared/services/entity-service.class.mjs +7 -0
- package/esm2020/src/app/shared/services/job.utils.mjs +92 -0
- package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +337 -0
- package/esm2020/src/app/shared/services/progress-bar.service.mjs +33 -0
- package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +119 -0
- package/esm2020/src/app/shared/services/startable-service.class.mjs +110 -0
- package/esm2020/src/app/shared/services/translate-context.service.mjs +105 -0
- package/esm2020/src/app/shared/services/validator-service.class.mjs +2 -0
- package/esm2020/src/app/shared/services.mjs +62 -0
- package/esm2020/src/app/shared/shared-routing.module.mjs +70 -0
- package/esm2020/src/app/shared/shared.module.mjs +208 -0
- package/esm2020/src/app/shared/shared.testing.module.mjs +84 -0
- package/esm2020/src/app/shared/storage/storage-explorer.component.mjs +268 -0
- package/esm2020/src/app/shared/storage/storage-explorer.module.mjs +60 -0
- package/esm2020/src/app/shared/storage/storage.service.mjs +132 -0
- package/esm2020/src/app/shared/storage/storage.utils.mjs +13 -0
- package/esm2020/src/app/shared/testing/observable.test.mjs +95 -0
- package/esm2020/src/app/shared/testing/tests.page.mjs +33 -0
- package/esm2020/src/app/shared/toast/toast.testing.mjs +51 -0
- package/esm2020/src/app/shared/toast/toast.testing.module.mjs +45 -0
- package/esm2020/src/app/shared/toast/toasts.mjs +144 -0
- package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +58 -0
- package/esm2020/src/app/shared/toolbar/toolbar.mjs +251 -0
- package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +53 -0
- package/esm2020/src/app/shared/types.mjs +2 -0
- package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +57 -0
- package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +45 -0
- package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +97 -0
- package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +204 -0
- package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +20 -0
- package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +104 -0
- package/esm2020/src/app/shared/validator/validators.mjs +573 -0
- package/esm2020/src/app/shared/version/versions.mjs +81 -0
- package/esm2020/src/app/social/job/job.module.mjs +42 -0
- package/esm2020/src/app/social/job/progression/job-progression.component.mjs +20 -0
- package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +216 -0
- package/esm2020/src/app/social/job/progression/job-progression.list.mjs +43 -0
- package/esm2020/src/app/social/job/progression/job-progression.model.mjs +23 -0
- package/esm2020/src/app/social/job/progression/job-progression.service.mjs +71 -0
- package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +52 -0
- package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +55 -0
- package/esm2020/src/app/social/job/testing/job.testing.module.mjs +35 -0
- package/esm2020/src/app/social/message/message.form.mjs +81 -0
- package/esm2020/src/app/social/message/message.modal.mjs +93 -0
- package/esm2020/src/app/social/message/message.model.mjs +65 -0
- package/esm2020/src/app/social/message/message.module.mjs +35 -0
- package/esm2020/src/app/social/message/message.service.mjs +84 -0
- package/esm2020/src/app/social/social.errors.mjs +10 -0
- package/esm2020/src/app/social/social.module.mjs +47 -0
- package/esm2020/src/app/social/social.testing.module.mjs +51 -0
- package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +114 -0
- package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +246 -0
- package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +227 -0
- package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +112 -0
- package/esm2020/src/app/social/user-event/testing/user-event.testing.module.mjs +35 -0
- package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +111 -0
- package/esm2020/src/app/social/user-event/user-event.model.mjs +2 -0
- package/esm2020/src/app/social/user-event/user-event.module.mjs +39 -0
- package/esm2020/src/app/social/user-event/user-event.service.mjs +487 -0
- package/esm2020/src/environments/environment.class.mjs +5 -0
- package/esm2020/src/environments/environment.mjs +94 -0
- package/esm2020/sumaris-net.ngx-components.mjs +5 -0
- package/fesm2015/sumaris-net.ngx-components.mjs +38842 -0
- package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -0
- package/fesm2020/sumaris-net.ngx-components.mjs +37941 -0
- package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +23 -137
- package/public_api.d.ts +286 -0
- package/src/app/admin/admin-routing.module.d.ts +9 -0
- package/src/app/admin/admin.module.d.ts +10 -0
- package/src/app/admin/services/filter/person.filter.d.ts +21 -0
- package/src/app/admin/services/person.service.d.ts +44 -0
- package/src/app/admin/services/validator/person.validator.d.ts +14 -0
- package/src/app/admin/users/users.d.ts +44 -0
- package/src/app/admin/users/users.module.d.ts +13 -0
- package/src/app/core/about/about.modal.d.ts +32 -0
- package/src/app/core/about/about.module.d.ts +10 -0
- package/src/app/core/account/account.module.d.ts +15 -0
- package/src/app/core/account/account.page.d.ts +68 -0
- package/src/app/core/account/new-token.modal.d.ts +41 -0
- package/src/app/core/account/token.table.d.ts +25 -0
- package/src/app/core/auth/auth.form.d.ts +36 -0
- package/src/app/core/auth/auth.modal.d.ts +24 -0
- package/src/app/core/auth/auth.module.d.ts +11 -0
- package/src/app/core/core.module.d.ts +31 -0
- package/src/app/core/core.testing.module.d.ts +14 -0
- package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +26 -0
- package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +9 -0
- package/src/app/core/form/entity/editor.class.d.ts +243 -0
- package/src/app/core/form/entity/entity-editor-modal.class.d.ts +128 -0
- package/src/app/core/form/entity/entity-editor.class.d.ts +205 -0
- package/src/app/core/form/entity/entity-metadata.component.d.ts +13 -0
- package/src/app/core/form/entity/entity.module.d.ts +10 -0
- package/src/app/core/form/form.class.d.ts +155 -0
- package/src/app/core/form/form.module.d.ts +13 -0
- package/src/app/core/form/form.utils.d.ts +336 -0
- package/src/app/core/form/list/list.form.d.ts +81 -0
- package/src/app/core/form/list/list.module.d.ts +9 -0
- package/src/app/core/form/properties/properties.form.d.ts +44 -0
- package/src/app/core/form/properties/properties.module.d.ts +11 -0
- package/src/app/core/form/properties/properties.table.d.ts +78 -0
- package/src/app/core/form/properties/property.validator.d.ts +13 -0
- package/src/app/core/form/properties/testing/properties-form.test.d.ts +19 -0
- package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +12 -0
- package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +14 -0
- package/src/app/core/form/text-popover/testing/text-popover.testing.module.d.ts +11 -0
- package/src/app/core/form/text-popover/text-form.component.d.ts +32 -0
- package/src/app/core/form/text-popover/text-popover.component.d.ts +70 -0
- package/src/app/core/form/text-popover/text-popover.module.d.ts +10 -0
- package/src/app/core/graphql/graphql.module.d.ts +8 -0
- package/src/app/core/graphql/graphql.service.d.ts +148 -0
- package/src/app/core/graphql/graphql.utils.d.ts +42 -0
- package/src/app/core/home/home.d.ts +74 -0
- package/src/app/core/home/home.module.d.ts +12 -0
- package/src/app/core/icon/icon.component.d.ts +13 -0
- package/src/app/core/icon/icon.module.d.ts +9 -0
- package/src/app/core/install/install-upgrade-card.component.d.ts +63 -0
- package/src/app/core/install/install-upgrade-card.module.d.ts +9 -0
- package/src/app/core/menu/menu.component.d.ts +62 -0
- package/src/app/core/menu/menu.model.d.ts +28 -0
- package/src/app/core/menu/menu.module.d.ts +10 -0
- package/src/app/core/menu/menu.service.d.ts +21 -0
- package/src/app/core/offline/update-offline-mode-card.component.d.ts +11 -0
- package/src/app/core/offline/update-offline-mode-card.module.d.ts +9 -0
- package/src/app/core/peer/select-peer.modal.d.ts +53 -0
- package/src/app/core/peer/select-peer.module.d.ts +11 -0
- package/src/app/core/register/register-confirm.page.d.ts +24 -0
- package/src/app/core/register/register.form.d.ts +48 -0
- package/src/app/core/register/register.modal.d.ts +14 -0
- package/src/app/core/register/register.module.d.ts +12 -0
- package/src/app/core/services/account.service.d.ts +191 -0
- package/src/app/core/services/auth-guard.service.d.ts +17 -0
- package/src/app/core/services/base-entity-service.class.d.ts +104 -0
- package/src/app/core/services/base-graphql-service.class.d.ts +77 -0
- package/src/app/core/services/base58.d.ts +7 -0
- package/src/app/core/services/config/core.config.d.ts +29 -0
- package/src/app/core/services/config.service.d.ts +60 -0
- package/src/app/core/services/crypto.service.d.ts +44 -0
- package/src/app/core/services/errors.d.ts +51 -0
- package/src/app/core/services/local-settings.service.d.ts +90 -0
- package/src/app/core/services/model/account.model.d.ts +35 -0
- package/src/app/core/services/model/config.model.d.ts +36 -0
- package/src/app/core/services/model/department.model.d.ts +11 -0
- package/src/app/core/services/model/entity.decorators.d.ts +17 -0
- package/src/app/core/services/model/entity.model.d.ts +89 -0
- package/src/app/core/services/model/filter.model.d.ts +43 -0
- package/src/app/core/services/model/history.model.d.ts +20 -0
- package/src/app/core/services/model/model.enum.d.ts +7 -0
- package/src/app/core/services/model/peer.model.d.ts +29 -0
- package/src/app/core/services/model/person.model.d.ts +31 -0
- package/src/app/core/services/model/referential.model.d.ts +77 -0
- package/src/app/core/services/model/settings.model.d.ts +26 -0
- package/src/app/core/services/model/token.model.d.ts +21 -0
- package/src/app/core/services/network.service.d.ts +149 -0
- package/src/app/core/services/network.types.d.ts +5 -0
- package/src/app/core/services/network.utils.d.ts +31 -0
- package/src/app/core/services/pipes/account.pipes.d.ts +15 -0
- package/src/app/core/services/pipes/department-to-string.pipe.d.ts +9 -0
- package/src/app/core/services/pipes/person-to-string.pipe.d.ts +9 -0
- package/src/app/core/services/pipes/usage-mode.pipes.d.ts +15 -0
- package/src/app/core/services/platform.service.d.ts +96 -0
- package/src/app/core/services/storage/entities-storage.service.d.ts +108 -0
- package/src/app/core/services/storage/entity-store.class.d.ts +113 -0
- package/src/app/core/services/testing/referential-filter.model.d.ts +9 -0
- package/src/app/core/services/testing/referential.validator.d.ts +22 -0
- package/src/app/core/services/validator/account.validator.d.ts +17 -0
- package/src/app/core/services/validator/base.validator.class.d.ts +21 -0
- package/src/app/core/services/validator/local-settings.validator.d.ts +18 -0
- package/src/app/core/services/validator/user-settings.validator.d.ts +10 -0
- package/src/app/core/services/validator/user-token.validator.d.ts +13 -0
- package/src/app/core/settings/settings.module.d.ts +10 -0
- package/src/app/core/settings/settings.page.d.ts +68 -0
- package/src/app/core/table/actions-column.component.d.ts +48 -0
- package/src/app/core/table/async-table.class.d.ts +383 -0
- package/src/app/core/table/entities-async-table-datasource.class.d.ts +80 -0
- package/src/app/core/table/entities-table-datasource.class.d.ts +94 -0
- package/src/app/core/table/memory-table.class.d.ts +25 -0
- package/src/app/core/table/table-select-columns.component.d.ts +22 -0
- package/src/app/core/table/table.class.d.ts +386 -0
- package/src/app/core/table/table.model.d.ts +26 -0
- package/src/app/core/table/table.module.d.ts +10 -0
- package/src/app/core/table/table.utils.d.ts +11 -0
- package/src/app/core/table/testing/table-validator.service.d.ts +17 -0
- package/src/app/core/table/testing/table.testing.d.ts +53 -0
- package/src/app/core/table/testing/table.testing.module.d.ts +11 -0
- package/src/app/shared/alerts.d.ts +53 -0
- package/src/app/shared/audio/audio.d.ts +44 -0
- package/src/app/shared/audio/audio.testing.d.ts +13 -0
- package/src/app/shared/audio/audio.testing.module.d.ts +11 -0
- package/src/app/shared/capacitor/keyboard.d.ts +16 -0
- package/src/app/shared/capacitor/plugins.d.ts +7 -0
- package/src/app/shared/constants.d.ts +7 -0
- package/src/app/shared/dates.d.ts +39 -0
- package/src/app/shared/debug/debug-service.class.d.ts +5 -0
- package/src/app/shared/debug/debug.component.d.ts +13 -0
- package/src/app/shared/debug/debug.module.d.ts +12 -0
- package/src/app/shared/directives/autofocus.directive.d.ts +19 -0
- package/src/app/shared/directives/autotitle.directive.d.ts +10 -0
- package/src/app/shared/directives/directives.module.d.ts +12 -0
- package/src/app/shared/directives/drag-and-drop.directive.d.ts +17 -0
- package/src/app/shared/directives/ng-var.directive.d.ts +12 -0
- package/src/app/shared/directives/resizable/resizable.component.d.ts +21 -0
- package/src/app/shared/directives/resizable/resizable.directive.d.ts +12 -0
- package/src/app/shared/directives/resizable/resizable.module.d.ts +8 -0
- package/src/app/shared/events.d.ts +27 -0
- package/src/app/shared/file/csv.utils.d.ts +19 -0
- package/src/app/shared/file/file.service.d.ts +23 -0
- package/src/app/shared/file/file.utils.d.ts +20 -0
- package/src/app/shared/file/images.utils.d.ts +19 -0
- package/src/app/shared/file/json.utils.d.ts +16 -0
- package/src/app/shared/file/uri.utils.d.ts +7 -0
- package/src/app/shared/focusable.d.ts +4 -0
- package/src/app/shared/form/field.component.d.ts +71 -0
- package/src/app/shared/form/field.model.d.ts +37 -0
- package/src/app/shared/form/loading-spinner.d.ts +8 -0
- package/src/app/shared/forms.d.ts +89 -0
- package/src/app/shared/functions.d.ts +132 -0
- package/src/app/shared/geolocation/geolocation.utils.d.ts +19 -0
- package/src/app/shared/gesture/gesture-config.d.ts +15 -0
- package/src/app/shared/gesture/hammer.utils.d.ts +16 -0
- package/src/app/shared/graph/colors.utils.d.ts +17 -0
- package/src/app/shared/graph/graph-colors.d.ts +63 -0
- package/src/app/shared/guard/component-dirty.guard.d.ts +19 -0
- package/src/app/shared/help/help.modal.d.ts +33 -0
- package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +10 -0
- package/src/app/shared/hotkeys/hotkeys.service.d.ts +28 -0
- package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +11 -0
- package/src/app/shared/http/http.utils.d.ts +27 -0
- package/src/app/shared/image/gallery/image-gallery.component.d.ts +98 -0
- package/src/app/shared/image/gallery/image-gallery.module.d.ts +14 -0
- package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +12 -0
- package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +33 -0
- package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +16 -0
- package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +12 -0
- package/src/app/shared/image/image.model.d.ts +5 -0
- package/src/app/shared/image/image.module.d.ts +8 -0
- package/src/app/shared/image/image.service.d.ts +32 -0
- package/src/app/shared/inputs.d.ts +32 -0
- package/src/app/shared/interceptors/progess.interceptor.d.ts +8 -0
- package/src/app/shared/logging/log-level.model.d.ts +38 -0
- package/src/app/shared/logging/logger.model.d.ts +68 -0
- package/src/app/shared/logging/logging-service.class.d.ts +39 -0
- package/src/app/shared/logging/logging-service.config.d.ts +25 -0
- package/src/app/shared/logging/logging-service.module.d.ts +9 -0
- package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +36 -0
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +138 -0
- package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +21 -0
- package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +4 -0
- package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +45 -0
- package/src/app/shared/material/badge/badge.directive.d.ts +37 -0
- package/src/app/shared/material/badge/badge.module.d.ts +10 -0
- package/src/app/shared/material/badge/badge.test.d.ts +21 -0
- package/src/app/shared/material/boolean/boolean.module.d.ts +19 -0
- package/src/app/shared/material/boolean/material.boolean.d.ts +66 -0
- package/src/app/shared/material/chips/chips.module.d.ts +21 -0
- package/src/app/shared/material/chips/material.chips.d.ts +126 -0
- package/src/app/shared/material/chips/testing/chips.test.d.ts +31 -0
- package/src/app/shared/material/datetime/datetime.module.d.ts +24 -0
- package/src/app/shared/material/datetime/material.date.d.ts +74 -0
- package/src/app/shared/material/datetime/material.dateshort.d.ts +75 -0
- package/src/app/shared/material/datetime/material.datetime.d.ts +100 -0
- package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +31 -0
- package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +30 -0
- package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +29 -0
- package/src/app/shared/material/duration/duration.module.d.ts +18 -0
- package/src/app/shared/material/duration/duration.utils.d.ts +3 -0
- package/src/app/shared/material/duration/material.duration.d.ts +57 -0
- package/src/app/shared/material/latlong/latlong.utils.d.ts +13 -0
- package/src/app/shared/material/latlong/material.latlong.d.ts +65 -0
- package/src/app/shared/material/latlong/material.latlong.module.d.ts +19 -0
- package/src/app/shared/material/latlong/testing/latlong.test.d.ts +21 -0
- package/src/app/shared/material/material.animations.d.ts +4 -0
- package/src/app/shared/material/material.module.d.ts +45 -0
- package/src/app/shared/material/material.testing.module.d.ts +25 -0
- package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +22 -0
- package/src/app/shared/material/numpad/numpad.component.d.ts +26 -0
- package/src/app/shared/material/numpad/numpad.container.d.ts +40 -0
- package/src/app/shared/material/numpad/numpad.content.d.ts +7 -0
- package/src/app/shared/material/numpad/numpad.directive.d.ts +35 -0
- package/src/app/shared/material/numpad/numpad.dom-service.d.ts +16 -0
- package/src/app/shared/material/numpad/numpad.model.d.ts +30 -0
- package/src/app/shared/material/numpad/numpad.module.d.ts +16 -0
- package/src/app/shared/material/numpad/testing/numpad.test.d.ts +13 -0
- package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +15 -0
- package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +10 -0
- package/src/app/shared/material/swipe/material.swipe.d.ts +89 -0
- package/src/app/shared/material/swipe/swipe.module.d.ts +15 -0
- package/src/app/shared/material/swipe/testing/swipe.test.d.ts +22 -0
- package/src/app/shared/modules.d.ts +8 -0
- package/src/app/shared/observables.d.ts +29 -0
- package/src/app/shared/pipes/arrays.pipe.d.ts +54 -0
- package/src/app/shared/pipes/colors.pipe.d.ts +9 -0
- package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +23 -0
- package/src/app/shared/pipes/date-format.pipe.d.ts +34 -0
- package/src/app/shared/pipes/date-from-now.pipe.d.ts +12 -0
- package/src/app/shared/pipes/duration.pipe.d.ts +13 -0
- package/src/app/shared/pipes/file-size.pipe.d.ts +30 -0
- package/src/app/shared/pipes/form.pipes.d.ts +59 -0
- package/src/app/shared/pipes/highlight.pipe.d.ts +11 -0
- package/src/app/shared/pipes/latlong-format.pipe.d.ts +20 -0
- package/src/app/shared/pipes/maps.pipe.d.ts +22 -0
- package/src/app/shared/pipes/math.pipes.d.ts +20 -0
- package/src/app/shared/pipes/ng-init.pipe.d.ts +8 -0
- package/src/app/shared/pipes/number-format.pipe.d.ts +10 -0
- package/src/app/shared/pipes/pipes.module.d.ts +27 -0
- package/src/app/shared/pipes/property.pipes.d.ts +26 -0
- package/src/app/shared/pipes/string.pipes.d.ts +47 -0
- package/src/app/shared/pipes/translate-context.pipe.d.ts +17 -0
- package/src/app/shared/pipes/types.pipes.d.ts +18 -0
- package/src/app/shared/platforms.d.ts +8 -0
- package/src/app/shared/services/entity-service.class.d.ts +73 -0
- package/src/app/shared/services/job.utils.d.ts +20 -0
- package/src/app/shared/services/memory-entity-service.class.d.ts +71 -0
- package/src/app/shared/services/progress-bar.service.d.ts +20 -0
- package/src/app/shared/services/startable-observable-service.class.d.ts +33 -0
- package/src/app/shared/services/startable-service.class.d.ts +34 -0
- package/src/app/shared/services/translate-context.service.d.ts +29 -0
- package/src/app/shared/services/validator-service.class.d.ts +10 -0
- package/src/app/shared/services.d.ts +9 -0
- package/src/app/shared/shared-routing.module.d.ts +22 -0
- package/src/app/shared/shared.module.d.ts +31 -0
- package/src/app/shared/shared.testing.module.d.ts +17 -0
- package/src/app/shared/storage/storage-explorer.component.d.ts +58 -0
- package/src/app/shared/storage/storage-explorer.module.d.ts +16 -0
- package/src/app/shared/storage/storage.service.d.ts +23 -0
- package/src/app/shared/storage/storage.utils.d.ts +19 -0
- package/src/app/shared/testing/observable.test.d.ts +25 -0
- package/src/app/shared/testing/tests.page.d.ts +20 -0
- package/src/app/shared/toast/toast.testing.d.ts +15 -0
- package/src/app/shared/toast/toast.testing.module.d.ts +11 -0
- package/src/app/shared/toast/toasts.d.ts +17 -0
- package/src/app/shared/toolbar/modal-toolbar.d.ts +21 -0
- package/src/app/shared/toolbar/toolbar.d.ts +63 -0
- package/src/app/shared/toolbar/toolbar.module.d.ts +15 -0
- package/src/app/shared/types.d.ts +26 -0
- package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +20 -0
- package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +11 -0
- package/src/app/shared/upload-file/upload-file-popover.component.d.ts +39 -0
- package/src/app/shared/upload-file/upload-file.component.d.ts +48 -0
- package/src/app/shared/upload-file/upload-file.model.d.ts +30 -0
- package/src/app/shared/validator/form-error-adapter.class.d.ts +27 -0
- package/src/app/shared/validator/validators.d.ts +115 -0
- package/src/app/shared/version/versions.d.ts +26 -0
- package/src/app/social/job/job.module.d.ts +12 -0
- package/src/app/social/job/progression/job-progression.component.d.ts +9 -0
- package/src/app/social/job/progression/job-progression.icon.d.ts +49 -0
- package/src/app/social/job/progression/job-progression.list.d.ts +21 -0
- package/src/app/social/job/progression/job-progression.model.d.ts +11 -0
- package/src/app/social/job/progression/job-progression.service.d.ts +34 -0
- package/src/app/social/job/testing/job-progression.testing.d.ts +17 -0
- package/src/app/social/job/testing/job-progression.testing.service.d.ts +17 -0
- package/src/app/social/job/testing/job.testing.module.d.ts +11 -0
- package/src/app/social/message/message.form.d.ts +30 -0
- package/src/app/social/message/message.modal.d.ts +39 -0
- package/src/app/social/message/message.model.d.ts +31 -0
- package/src/app/social/message/message.module.d.ts +11 -0
- package/src/app/social/message/message.service.d.ts +27 -0
- package/src/app/social/social.errors.d.ts +9 -0
- package/src/app/social/social.module.d.ts +20 -0
- package/src/app/social/social.testing.module.d.ts +13 -0
- package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +31 -0
- package/src/app/social/user-event/notification/user-event-notification.list.d.ts +71 -0
- package/src/app/social/user-event/testing/user-event.testing.d.ts +34 -0
- package/src/app/social/user-event/testing/user-event.testing.model.d.ts +44 -0
- package/src/app/social/user-event/testing/user-event.testing.module.d.ts +11 -0
- package/src/app/social/user-event/testing/user-event.testing.service.d.ts +41 -0
- package/src/app/social/user-event/user-event.model.d.ts +45 -0
- package/src/app/social/user-event/user-event.module.d.ts +12 -0
- package/src/app/social/user-event/user-event.service.d.ts +124 -0
- package/src/environments/environment.class.d.ts +57 -0
- package/src/environments/environment.d.ts +3 -0
- package/.editorconfig +0 -24
- package/.eslintrc.json +0 -74
- package/.gitattribute +0 -1
- package/.github/CONTRIBUTING.md +0 -10
- package/.github/ISSUE_TEMPLATE.md +0 -6
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
- package/.github/github_disclaimer.md +0 -14
- package/.gitlab-ci.yml +0 -46
- package/.graphqlconfig +0 -15
- package/angular.json +0 -230
- package/capacitor.config.json +0 -9
- package/ionic.config.json +0 -7
- package/karma.conf.js +0 -32
- package/ng-package.json +0 -19
- package/ngcc.config.js +0 -14
- package/public_api.ts +0 -343
- package/resources/android/build/tools/android-accept-licenses.sh +0 -14
- package/resources/android/icon/drawable-hdpi-icon.png +0 -0
- package/resources/android/icon/drawable-ldpi-icon.png +0 -0
- package/resources/android/icon/drawable-mdpi-icon.png +0 -0
- package/resources/android/icon/drawable-xhdpi-icon.png +0 -0
- package/resources/android/icon/drawable-xxhdpi-icon.png +0 -0
- package/resources/android/icon/drawable-xxxhdpi-icon.png +0 -0
- package/resources/android/splash/drawable-land-hdpi-screen.png +0 -0
- package/resources/android/splash/drawable-land-ldpi-screen.png +0 -0
- package/resources/android/splash/drawable-land-mdpi-screen.png +0 -0
- package/resources/android/splash/drawable-land-xhdpi-screen.png +0 -0
- package/resources/android/splash/drawable-land-xxhdpi-screen.png +0 -0
- package/resources/android/splash/drawable-land-xxxhdpi-screen.png +0 -0
- package/resources/android/splash/drawable-port-hdpi-screen.png +0 -0
- package/resources/android/splash/drawable-port-ldpi-screen.png +0 -0
- package/resources/android/splash/drawable-port-mdpi-screen.png +0 -0
- package/resources/android/splash/drawable-port-xhdpi-screen.png +0 -0
- package/resources/android/splash/drawable-port-xxhdpi-screen.png +0 -0
- package/resources/android/splash/drawable-port-xxxhdpi-screen.png +0 -0
- package/resources/android/splash/drawable-xxxhdpi-screen.png +0 -0
- package/resources/icon/TODO.md +0 -11
- package/resources/icon.png +0 -0
- package/resources/icon.png.md5 +0 -1
- package/resources/icon.xcf +0 -0
- package/resources/ios/icon/icon-1024.png +0 -0
- package/resources/ios/icon/icon-108@2x.png +0 -0
- package/resources/ios/icon/icon-20.png +0 -0
- package/resources/ios/icon/icon-20@2x.png +0 -0
- package/resources/ios/icon/icon-20@3x.png +0 -0
- package/resources/ios/icon/icon-24@2x.png +0 -0
- package/resources/ios/icon/icon-27.5@2x.png +0 -0
- package/resources/ios/icon/icon-29.png +0 -0
- package/resources/ios/icon/icon-29@2x.png +0 -0
- package/resources/ios/icon/icon-29@3x.png +0 -0
- package/resources/ios/icon/icon-40.png +0 -0
- package/resources/ios/icon/icon-40@2x.png +0 -0
- package/resources/ios/icon/icon-40@3x.png +0 -0
- package/resources/ios/icon/icon-44@2x.png +0 -0
- package/resources/ios/icon/icon-50.png +0 -0
- package/resources/ios/icon/icon-50@2x.png +0 -0
- package/resources/ios/icon/icon-60.png +0 -0
- package/resources/ios/icon/icon-60@2x.png +0 -0
- package/resources/ios/icon/icon-60@3x.png +0 -0
- package/resources/ios/icon/icon-72.png +0 -0
- package/resources/ios/icon/icon-72@2x.png +0 -0
- package/resources/ios/icon/icon-76.png +0 -0
- package/resources/ios/icon/icon-76@2x.png +0 -0
- package/resources/ios/icon/icon-83.5@2x.png +0 -0
- package/resources/ios/icon/icon-86@2x.png +0 -0
- package/resources/ios/icon/icon-98@2x.png +0 -0
- package/resources/ios/icon/icon-small.png +0 -0
- package/resources/ios/icon/icon-small@2x.png +0 -0
- package/resources/ios/icon/icon-small@3x.png +0 -0
- package/resources/ios/icon/icon.png +0 -0
- package/resources/ios/icon/icon@2x.png +0 -0
- package/resources/ios/splash/Default-1792h~iphone.png +0 -0
- package/resources/ios/splash/Default-2436h.png +0 -0
- package/resources/ios/splash/Default-2688h~iphone.png +0 -0
- package/resources/ios/splash/Default-568h@2x~iphone.png +0 -0
- package/resources/ios/splash/Default-667h.png +0 -0
- package/resources/ios/splash/Default-736h.png +0 -0
- package/resources/ios/splash/Default-Landscape-1792h~iphone.png +0 -0
- package/resources/ios/splash/Default-Landscape-2436h.png +0 -0
- package/resources/ios/splash/Default-Landscape-2688h~iphone.png +0 -0
- package/resources/ios/splash/Default-Landscape-736h.png +0 -0
- package/resources/ios/splash/Default-Landscape@2x~ipad.png +0 -0
- package/resources/ios/splash/Default-Landscape@~ipadpro.png +0 -0
- package/resources/ios/splash/Default-Landscape~ipad.png +0 -0
- package/resources/ios/splash/Default-Portrait@2x~ipad.png +0 -0
- package/resources/ios/splash/Default-Portrait@~ipadpro.png +0 -0
- package/resources/ios/splash/Default-Portrait~ipad.png +0 -0
- package/resources/ios/splash/Default@2x~iphone.png +0 -0
- package/resources/ios/splash/Default@2x~universal~anyany.png +0 -0
- package/resources/ios/splash/Default~iphone.png +0 -0
- package/resources/splash.png +0 -0
- package/resources/splash.png.md5 +0 -1
- package/scripts/build-android.sh +0 -18
- package/scripts/build-i18n.js +0 -24
- package/scripts/docker-start.sh +0 -6
- package/scripts/emulate-android.sh +0 -17
- package/scripts/env-android.sh +0 -83
- package/scripts/env-clean.sh +0 -23
- package/scripts/env-global.sh +0 -156
- package/scripts/install-android-sdk-tools.sh +0 -73
- package/scripts/ionic-update.sh +0 -24
- package/scripts/node/playground.ts +0 -9
- package/scripts/node/resources.js +0 -90
- package/scripts/release.sh +0 -149
- package/scripts/run-android.sh +0 -59
- package/scripts/test.sh +0 -19
- package/src/app/admin/admin-routing.module.ts +0 -30
- package/src/app/admin/admin.module.ts +0 -23
- package/src/app/admin/services/filter/person.filter.ts +0 -77
- package/src/app/admin/services/person.service.ts +0 -212
- package/src/app/admin/services/validator/person.validator.ts +0 -37
- package/src/app/admin/users/users.html +0 -427
- package/src/app/admin/users/users.module.ts +0 -34
- package/src/app/admin/users/users.scss +0 -59
- package/src/app/admin/users/users.ts +0 -257
- package/src/app/app-routing.module.ts +0 -126
- package/src/app/app.component.html +0 -12
- package/src/app/app.component.scss +0 -4
- package/src/app/app.component.ts +0 -205
- package/src/app/app.module.ts +0 -326
- package/src/app/core/about/about.modal.html +0 -140
- package/src/app/core/about/about.modal.scss +0 -23
- package/src/app/core/about/about.modal.ts +0 -71
- package/src/app/core/about/about.module.ts +0 -24
- package/src/app/core/account/account.module.ts +0 -38
- package/src/app/core/account/account.page.html +0 -241
- package/src/app/core/account/account.page.scss +0 -21
- package/src/app/core/account/account.page.ts +0 -366
- package/src/app/core/account/new-token.modal.html +0 -120
- package/src/app/core/account/new-token.modal.ts +0 -138
- package/src/app/core/account/token.table.html +0 -177
- package/src/app/core/account/token.table.scss +0 -7
- package/src/app/core/account/token.table.ts +0 -141
- package/src/app/core/auth/auth.form.html +0 -77
- package/src/app/core/auth/auth.form.scss +0 -1
- package/src/app/core/auth/auth.form.ts +0 -145
- package/src/app/core/auth/auth.modal.html +0 -57
- package/src/app/core/auth/auth.modal.scss +0 -1
- package/src/app/core/auth/auth.modal.ts +0 -80
- package/src/app/core/auth/auth.module.ts +0 -33
- package/src/app/core/core.module.ts +0 -100
- package/src/app/core/core.testing.module.ts +0 -64
- package/src/app/core/form/buttons/form-buttons-bar.component.html +0 -59
- package/src/app/core/form/buttons/form-buttons-bar.component.scss +0 -14
- package/src/app/core/form/buttons/form-buttons-bar.component.ts +0 -70
- package/src/app/core/form/buttons/form-buttons-bar.module.ts +0 -24
- package/src/app/core/form/entity/editor.class.ts +0 -803
- package/src/app/core/form/entity/entity-editor-modal.class.ts +0 -537
- package/src/app/core/form/entity/entity-editor.class.ts +0 -885
- package/src/app/core/form/entity/entity-metadata.component.html +0 -53
- package/src/app/core/form/entity/entity-metadata.component.scss +0 -28
- package/src/app/core/form/entity/entity-metadata.component.ts +0 -19
- package/src/app/core/form/entity/entity.module.ts +0 -25
- package/src/app/core/form/form.class.ts +0 -401
- package/src/app/core/form/form.module.ts +0 -37
- package/src/app/core/form/form.utils.ts +0 -639
- package/src/app/core/form/list/list.form.html +0 -67
- package/src/app/core/form/list/list.form.scss +0 -40
- package/src/app/core/form/list/list.form.ts +0 -278
- package/src/app/core/form/list/list.module.ts +0 -25
- package/src/app/core/form/properties/properties.form.html +0 -129
- package/src/app/core/form/properties/properties.form.ts +0 -147
- package/src/app/core/form/properties/properties.module.ts +0 -30
- package/src/app/core/form/properties/properties.table.html +0 -219
- package/src/app/core/form/properties/properties.table.scss +0 -0
- package/src/app/core/form/properties/properties.table.ts +0 -291
- package/src/app/core/form/properties/property.validator.ts +0 -22
- package/src/app/core/form/properties/testing/properties-form.test.html +0 -21
- package/src/app/core/form/properties/testing/properties-form.test.ts +0 -102
- package/src/app/core/form/properties/testing/properties-form.testing.module.ts +0 -25
- package/src/app/core/form/text-popover/testing/text-popover.testing.html +0 -45
- package/src/app/core/form/text-popover/testing/text-popover.testing.module.ts +0 -32
- package/src/app/core/form/text-popover/testing/text-popover.testing.ts +0 -77
- package/src/app/core/form/text-popover/text-form.component.html +0 -44
- package/src/app/core/form/text-popover/text-form.component.scss +0 -8
- package/src/app/core/form/text-popover/text-form.component.ts +0 -65
- package/src/app/core/form/text-popover/text-popover.component.html +0 -86
- package/src/app/core/form/text-popover/text-popover.component.scss +0 -7
- package/src/app/core/form/text-popover/text-popover.component.ts +0 -165
- package/src/app/core/form/text-popover/text-popover.module.ts +0 -27
- package/src/app/core/graphql/graphql.module.ts +0 -17
- package/src/app/core/graphql/graphql.service.ts +0 -969
- package/src/app/core/graphql/graphql.utils.ts +0 -167
- package/src/app/core/home/home.html +0 -211
- package/src/app/core/home/home.module.ts +0 -32
- package/src/app/core/home/home.scss +0 -242
- package/src/app/core/home/home.ts +0 -298
- package/src/app/core/icon/icon.component.html +0 -15
- package/src/app/core/icon/icon.component.ts +0 -23
- package/src/app/core/icon/icon.module.ts +0 -22
- package/src/app/core/install/install-upgrade-card.component.html +0 -144
- package/src/app/core/install/install-upgrade-card.component.scss +0 -4
- package/src/app/core/install/install-upgrade-card.component.ts +0 -412
- package/src/app/core/install/install-upgrade-card.module.ts +0 -23
- package/src/app/core/menu/menu.component.html +0 -135
- package/src/app/core/menu/menu.component.scss +0 -225
- package/src/app/core/menu/menu.component.ts +0 -352
- package/src/app/core/menu/menu.model.ts +0 -64
- package/src/app/core/menu/menu.module.ts +0 -27
- package/src/app/core/menu/menu.service.ts +0 -62
- package/src/app/core/offline/update-offline-mode-card.component.html +0 -45
- package/src/app/core/offline/update-offline-mode-card.component.scss +0 -4
- package/src/app/core/offline/update-offline-mode-card.component.ts +0 -28
- package/src/app/core/offline/update-offline-mode-card.module.ts +0 -24
- package/src/app/core/peer/select-peer.modal.html +0 -123
- package/src/app/core/peer/select-peer.modal.scss +0 -20
- package/src/app/core/peer/select-peer.modal.ts +0 -197
- package/src/app/core/peer/select-peer.module.ts +0 -28
- package/src/app/core/register/register-confirm.page.html +0 -55
- package/src/app/core/register/register-confirm.page.scss +0 -121
- package/src/app/core/register/register-confirm.page.ts +0 -94
- package/src/app/core/register/register.form.html +0 -125
- package/src/app/core/register/register.form.scss +0 -10
- package/src/app/core/register/register.form.ts +0 -213
- package/src/app/core/register/register.modal.html +0 -70
- package/src/app/core/register/register.modal.ts +0 -52
- package/src/app/core/register/register.module.ts +0 -31
- package/src/app/core/services/account.service.ts +0 -1431
- package/src/app/core/services/auth-guard.service.ts +0 -70
- package/src/app/core/services/base-entity-service.class.ts +0 -598
- package/src/app/core/services/base-graphql-service.class.ts +0 -298
- package/src/app/core/services/base58.ts +0 -83
- package/src/app/core/services/config/account.config.ts +0 -35
- package/src/app/core/services/config/core.config.ts +0 -180
- package/src/app/core/services/config.service.ts +0 -414
- package/src/app/core/services/crypto.service.ts +0 -126
- package/src/app/core/services/errors.ts +0 -67
- package/src/app/core/services/local-settings.service.spec.ts +0 -32
- package/src/app/core/services/local-settings.service.ts +0 -548
- package/src/app/core/services/model/account.model.ts +0 -141
- package/src/app/core/services/model/config.model.ts +0 -122
- package/src/app/core/services/model/department.model.ts +0 -34
- package/src/app/core/services/model/entity.decorators.ts +0 -112
- package/src/app/core/services/model/entity.model.ts +0 -326
- package/src/app/core/services/model/filter.model.ts +0 -139
- package/src/app/core/services/model/history.model.ts +0 -25
- package/src/app/core/services/model/model.enum.ts +0 -11
- package/src/app/core/services/model/peer.model.ts +0 -86
- package/src/app/core/services/model/person.model.ts +0 -112
- package/src/app/core/services/model/referential.model.ts +0 -244
- package/src/app/core/services/model/settings.model.ts +0 -32
- package/src/app/core/services/model/token.model.ts +0 -54
- package/src/app/core/services/network.service.spec.ts +0 -49
- package/src/app/core/services/network.service.ts +0 -729
- package/src/app/core/services/network.types.ts +0 -26
- package/src/app/core/services/network.utils.ts +0 -57
- package/src/app/core/services/pipes/account.pipes.ts +0 -25
- package/src/app/core/services/pipes/department-to-string.pipe.ts +0 -15
- package/src/app/core/services/pipes/person-to-string.pipe.ts +0 -15
- package/src/app/core/services/pipes/usage-mode.pipes.ts +0 -26
- package/src/app/core/services/platform.service.spec.ts +0 -56
- package/src/app/core/services/platform.service.ts +0 -605
- package/src/app/core/services/storage/entities-storage.service.ts +0 -542
- package/src/app/core/services/storage/entity-store.class.ts +0 -598
- package/src/app/core/services/testing/referential-filter.model.ts +0 -28
- package/src/app/core/services/testing/referential.validator.ts +0 -57
- package/src/app/core/services/validator/account.validator.ts +0 -58
- package/src/app/core/services/validator/base.validator.class.ts +0 -54
- package/src/app/core/services/validator/local-settings.validator.ts +0 -72
- package/src/app/core/services/validator/user-settings.validator.ts +0 -25
- package/src/app/core/services/validator/user-token.validator.ts +0 -55
- package/src/app/core/settings/settings.module.ts +0 -24
- package/src/app/core/settings/settings.page.html +0 -264
- package/src/app/core/settings/settings.page.ts +0 -365
- package/src/app/core/table/actions-column.component.html +0 -91
- package/src/app/core/table/actions-column.component.ts +0 -70
- package/src/app/core/table/async-table.class.ts +0 -1934
- package/src/app/core/table/entities-async-table-datasource.class.ts +0 -482
- package/src/app/core/table/entities-table-datasource.class.ts +0 -496
- package/src/app/core/table/memory-table.class.ts +0 -65
- package/src/app/core/table/table-select-columns.component.html +0 -58
- package/src/app/core/table/table-select-columns.component.ts +0 -50
- package/src/app/core/table/table.class.ts +0 -1973
- package/src/app/core/table/table.model.ts +0 -35
- package/src/app/core/table/table.module.ts +0 -26
- package/src/app/core/table/table.utils.ts +0 -38
- package/src/app/core/table/testing/multi-table.testing.ts +0 -261
- package/src/app/core/table/testing/table-validator.service.ts +0 -25
- package/src/app/core/table/testing/table.testing.html +0 -396
- package/src/app/core/table/testing/table.testing.module.ts +0 -25
- package/src/app/core/table/testing/table.testing.scss +0 -23
- package/src/app/core/table/testing/table.testing.ts +0 -292
- package/src/app/shared/alerts.ts +0 -292
- package/src/app/shared/audio/audio.testing.html +0 -33
- package/src/app/shared/audio/audio.testing.module.ts +0 -32
- package/src/app/shared/audio/audio.testing.ts +0 -31
- package/src/app/shared/audio/audio.ts +0 -278
- package/src/app/shared/base64.utils.ts +0 -66
- package/src/app/shared/capacitor/keyboard.ts +0 -40
- package/src/app/shared/capacitor/plugins.ts +0 -12
- package/src/app/shared/constants.ts +0 -12
- package/src/app/shared/dates.ts +0 -163
- package/src/app/shared/debug/debug-service.class.ts +0 -8
- package/src/app/shared/debug/debug.component.html +0 -13
- package/src/app/shared/debug/debug.component.scss +0 -24
- package/src/app/shared/debug/debug.component.spec.ts +0 -25
- package/src/app/shared/debug/debug.component.ts +0 -27
- package/src/app/shared/debug/debug.module.ts +0 -28
- package/src/app/shared/directives/autofocus.directive.ts +0 -109
- package/src/app/shared/directives/autotitle.directive.ts +0 -24
- package/src/app/shared/directives/directives.module.ts +0 -29
- package/src/app/shared/directives/drag-and-drop.directive.ts +0 -47
- package/src/app/shared/directives/ng-var.directive.ts +0 -32
- package/src/app/shared/directives/resizable/resizable.component.ts +0 -47
- package/src/app/shared/directives/resizable/resizable.directive.ts +0 -43
- package/src/app/shared/directives/resizable/resizable.module.ts +0 -9
- package/src/app/shared/directives/resizable/resizable.style.scss +0 -44
- package/src/app/shared/directives/resizable/resizable.template.html +0 -6
- package/src/app/shared/events.ts +0 -96
- package/src/app/shared/file/csv.utils.ts +0 -94
- package/src/app/shared/file/file.service.ts +0 -132
- package/src/app/shared/file/file.utils.ts +0 -138
- package/src/app/shared/file/images.utils.ts +0 -198
- package/src/app/shared/file/json.utils.ts +0 -73
- package/src/app/shared/file/uri.utils.ts +0 -25
- package/src/app/shared/focusable.ts +0 -10
- package/src/app/shared/form/field.component.html +0 -261
- package/src/app/shared/form/field.component.scss +0 -7
- package/src/app/shared/form/field.component.ts +0 -318
- package/src/app/shared/form/field.model.ts +0 -64
- package/src/app/shared/form/loading-spinner.ts +0 -16
- package/src/app/shared/forms.ts +0 -458
- package/src/app/shared/functions.ts +0 -492
- package/src/app/shared/geolocation/geolocation.utils.ts +0 -101
- package/src/app/shared/gesture/gesture-config.ts +0 -45
- package/src/app/shared/gesture/hammer.utils.ts +0 -14
- package/src/app/shared/graph/colors.utils.ts +0 -74
- package/src/app/shared/graph/graph-colors.ts +0 -295
- package/src/app/shared/guard/component-dirty.guard.ts +0 -70
- package/src/app/shared/help/help.modal.html +0 -42
- package/src/app/shared/help/help.modal.ts +0 -61
- package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.html +0 -11
- package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.scss +0 -39
- package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.ts +0 -16
- package/src/app/shared/hotkeys/hotkeys.service.ts +0 -89
- package/src/app/shared/hotkeys/shared-hotkeys.module.ts +0 -27
- package/src/app/shared/http/http.utils.ts +0 -89
- package/src/app/shared/image/gallery/image-gallery.component.html +0 -231
- package/src/app/shared/image/gallery/image-gallery.component.scss +0 -196
- package/src/app/shared/image/gallery/image-gallery.component.ts +0 -389
- package/src/app/shared/image/gallery/image-gallery.module.ts +0 -34
- package/src/app/shared/image/gallery/testing/gallegry.model.testing.ts +0 -27
- package/src/app/shared/image/gallery/testing/gallery.service.testing.ts +0 -102
- package/src/app/shared/image/gallery/testing/gallery.testing.html +0 -15
- package/src/app/shared/image/gallery/testing/gallery.testing.module.ts +0 -39
- package/src/app/shared/image/gallery/testing/gallery.testing.ts +0 -38
- package/src/app/shared/image/image.model.ts +0 -6
- package/src/app/shared/image/image.module.ts +0 -16
- package/src/app/shared/image/image.service.ts +0 -94
- package/src/app/shared/image/image.testing.module.ts +0 -23
- package/src/app/shared/inputs.ts +0 -282
- package/src/app/shared/interceptors/progess.interceptor.ts +0 -25
- package/src/app/shared/logging/log-level.model.ts +0 -53
- package/src/app/shared/logging/logger.model.ts +0 -120
- package/src/app/shared/logging/logging-service.class.ts +0 -134
- package/src/app/shared/logging/logging-service.config.ts +0 -29
- package/src/app/shared/logging/logging-service.module.ts +0 -22
- package/src/app/shared/material/autocomplete/material.autocomplete.config.ts +0 -83
- package/src/app/shared/material/autocomplete/material.autocomplete.html +0 -262
- package/src/app/shared/material/autocomplete/material.autocomplete.module.ts +0 -45
- package/src/app/shared/material/autocomplete/material.autocomplete.scss +0 -21
- package/src/app/shared/material/autocomplete/material.autocomplete.ts +0 -1022
- package/src/app/shared/material/autocomplete/material.autocomplete.utils.ts +0 -20
- package/src/app/shared/material/autocomplete/testing/autocomplete.test.html +0 -876
- package/src/app/shared/material/autocomplete/testing/autocomplete.test.spec.ts +0 -38
- package/src/app/shared/material/autocomplete/testing/autocomplete.test.ts +0 -247
- package/src/app/shared/material/badge/badge.directive.ts +0 -164
- package/src/app/shared/material/badge/badge.module.ts +0 -22
- package/src/app/shared/material/badge/badge.test.html +0 -261
- package/src/app/shared/material/badge/badge.test.ts +0 -36
- package/src/app/shared/material/boolean/boolean.module.ts +0 -40
- package/src/app/shared/material/boolean/material.boolean.html +0 -155
- package/src/app/shared/material/boolean/material.boolean.scss +0 -34
- package/src/app/shared/material/boolean/material.boolean.ts +0 -239
- package/src/app/shared/material/chips/chips.module.ts +0 -44
- package/src/app/shared/material/chips/material.chips.html +0 -146
- package/src/app/shared/material/chips/material.chips.scss +0 -65
- package/src/app/shared/material/chips/material.chips.ts +0 -768
- package/src/app/shared/material/chips/testing/chips.test.html +0 -137
- package/src/app/shared/material/chips/testing/chips.test.ts +0 -175
- package/src/app/shared/material/datetime/datetime.module.ts +0 -52
- package/src/app/shared/material/datetime/material.date.html +0 -132
- package/src/app/shared/material/datetime/material.date.scss +0 -17
- package/src/app/shared/material/datetime/material.date.ts +0 -408
- package/src/app/shared/material/datetime/material.dateshort.html +0 -134
- package/src/app/shared/material/datetime/material.dateshort.scss +0 -23
- package/src/app/shared/material/datetime/material.dateshort.ts +0 -422
- package/src/app/shared/material/datetime/material.datetime.html +0 -224
- package/src/app/shared/material/datetime/material.datetime.scss +0 -90
- package/src/app/shared/material/datetime/material.datetime.ts +0 -575
- package/src/app/shared/material/datetime/testing/mat-date-time.test.html +0 -354
- package/src/app/shared/material/datetime/testing/mat-date-time.test.ts +0 -134
- package/src/app/shared/material/datetime/testing/mat-date.test.html +0 -418
- package/src/app/shared/material/datetime/testing/mat-date.test.ts +0 -135
- package/src/app/shared/material/datetime/testing/mat-dateshort.test.html +0 -370
- package/src/app/shared/material/datetime/testing/mat-dateshort.test.ts +0 -127
- package/src/app/shared/material/duration/duration.module.ts +0 -39
- package/src/app/shared/material/duration/duration.utils.ts +0 -41
- package/src/app/shared/material/duration/material.duration.html +0 -44
- package/src/app/shared/material/duration/material.duration.scss +0 -28
- package/src/app/shared/material/duration/material.duration.ts +0 -294
- package/src/app/shared/material/latlong/latlong.utils.ts +0 -300
- package/src/app/shared/material/latlong/material.latlong.html +0 -127
- package/src/app/shared/material/latlong/material.latlong.module.ts +0 -40
- package/src/app/shared/material/latlong/material.latlong.scss +0 -48
- package/src/app/shared/material/latlong/material.latlong.ts +0 -421
- package/src/app/shared/material/latlong/testing/latlong.test.html +0 -341
- package/src/app/shared/material/latlong/testing/latlong.test.ts +0 -121
- package/src/app/shared/material/material.animations.ts +0 -129
- package/src/app/shared/material/material.module.ts +0 -94
- package/src/app/shared/material/material.testing.module.ts +0 -135
- package/src/app/shared/material/memory/memory.utils.ts +0 -54
- package/src/app/shared/material/numpad/numpad.animation.ts +0 -1
- package/src/app/shared/material/numpad/numpad.append-to-input.directive.ts +0 -109
- package/src/app/shared/material/numpad/numpad.component.ts +0 -78
- package/src/app/shared/material/numpad/numpad.container.html +0 -32
- package/src/app/shared/material/numpad/numpad.container.scss +0 -50
- package/src/app/shared/material/numpad/numpad.container.ts +0 -176
- package/src/app/shared/material/numpad/numpad.content.html +0 -13
- package/src/app/shared/material/numpad/numpad.content.ts +0 -10
- package/src/app/shared/material/numpad/numpad.directive.ts +0 -173
- package/src/app/shared/material/numpad/numpad.dom-service.ts +0 -46
- package/src/app/shared/material/numpad/numpad.model.ts +0 -55
- package/src/app/shared/material/numpad/numpad.module.ts +0 -38
- package/src/app/shared/material/numpad/testing/numpad.test.html +0 -146
- package/src/app/shared/material/numpad/testing/numpad.test.ts +0 -55
- package/src/app/shared/material/paginator/material.paginator-i18n.ts +0 -49
- package/src/app/shared/material/stepper/material.stepper-i18n.ts +0 -18
- package/src/app/shared/material/swipe/material.swipe.html +0 -63
- package/src/app/shared/material/swipe/material.swipe.scss +0 -39
- package/src/app/shared/material/swipe/material.swipe.ts +0 -350
- package/src/app/shared/material/swipe/swipe.module.ts +0 -33
- package/src/app/shared/material/swipe/testing/swipe.test.html +0 -128
- package/src/app/shared/material/swipe/testing/swipe.test.ts +0 -81
- package/src/app/shared/modules.ts +0 -11
- package/src/app/shared/observables.ts +0 -132
- package/src/app/shared/pipes/arrays.pipe.ts +0 -111
- package/src/app/shared/pipes/colors.pipe.ts +0 -19
- package/src/app/shared/pipes/date-diff-duration.pipe.ts +0 -48
- package/src/app/shared/pipes/date-format.pipe.ts +0 -78
- package/src/app/shared/pipes/date-from-now.pipe.ts +0 -20
- package/src/app/shared/pipes/duration.pipe.spec.ts +0 -51
- package/src/app/shared/pipes/duration.pipe.ts +0 -34
- package/src/app/shared/pipes/file-size.pipe.ts +0 -58
- package/src/app/shared/pipes/form.pipes.ts +0 -204
- package/src/app/shared/pipes/highlight.pipe.ts +0 -37
- package/src/app/shared/pipes/latlong-format.pipe.ts +0 -30
- package/src/app/shared/pipes/maps.pipe.ts +0 -39
- package/src/app/shared/pipes/math.pipes.ts +0 -39
- package/src/app/shared/pipes/ng-init.pipe.ts +0 -14
- package/src/app/shared/pipes/number-format.pipe.ts +0 -21
- package/src/app/shared/pipes/pipes.module.ts +0 -134
- package/src/app/shared/pipes/property.pipes.ts +0 -87
- package/src/app/shared/pipes/string.pipes.ts +0 -85
- package/src/app/shared/pipes/translate-context.pipe.ts +0 -33
- package/src/app/shared/pipes/types.pipes.ts +0 -31
- package/src/app/shared/platforms.ts +0 -58
- package/src/app/shared/services/entity-service.class.ts +0 -127
- package/src/app/shared/services/job.utils.ts +0 -121
- package/src/app/shared/services/memory-entity-service.class.ts +0 -447
- package/src/app/shared/services/progress-bar.service.ts +0 -42
- package/src/app/shared/services/startable-observable-service.class.ts +0 -137
- package/src/app/shared/services/startable-service.class.ts +0 -131
- package/src/app/shared/services/storage.utils.ts +0 -47
- package/src/app/shared/services/translate-context.service.ts +0 -116
- package/src/app/shared/services/validator-service.class.ts +0 -14
- package/src/app/shared/services.ts +0 -91
- package/src/app/shared/shared-routing.module.ts +0 -66
- package/src/app/shared/shared.module.spec.ts +0 -13
- package/src/app/shared/shared.module.ts +0 -146
- package/src/app/shared/shared.testing.module.ts +0 -50
- package/src/app/shared/storage/storage-explorer.component.html +0 -175
- package/src/app/shared/storage/storage-explorer.component.scss +0 -39
- package/src/app/shared/storage/storage-explorer.component.spec.ts +0 -24
- package/src/app/shared/storage/storage-explorer.component.ts +0 -292
- package/src/app/shared/storage/storage-explorer.module.ts +0 -44
- package/src/app/shared/storage/storage.service.ts +0 -133
- package/src/app/shared/storage/storage.utils.ts +0 -25
- package/src/app/shared/testing/observable.test.html +0 -53
- package/src/app/shared/testing/observable.test.scss +0 -3
- package/src/app/shared/testing/observable.test.ts +0 -117
- package/src/app/shared/testing/tests.page.html +0 -30
- package/src/app/shared/testing/tests.page.ts +0 -34
- package/src/app/shared/toast/toast.testing.html +0 -42
- package/src/app/shared/toast/toast.testing.module.ts +0 -32
- package/src/app/shared/toast/toast.testing.ts +0 -58
- package/src/app/shared/toast/toasts.ts +0 -183
- package/src/app/shared/toolbar/modal-toolbar.html +0 -32
- package/src/app/shared/toolbar/modal-toolbar.scss +0 -0
- package/src/app/shared/toolbar/modal-toolbar.ts +0 -63
- package/src/app/shared/toolbar/toolbar.html +0 -71
- package/src/app/shared/toolbar/toolbar.module.ts +0 -35
- package/src/app/shared/toolbar/toolbar.scss +0 -0
- package/src/app/shared/toolbar/toolbar.ts +0 -254
- package/src/app/shared/types.ts +0 -31
- package/src/app/shared/upload-file/testing/upload-file.testing.html +0 -25
- package/src/app/shared/upload-file/testing/upload-file.testing.module.ts +0 -32
- package/src/app/shared/upload-file/testing/upload-file.testing.ts +0 -68
- package/src/app/shared/upload-file/upload-file-popover.component.html +0 -43
- package/src/app/shared/upload-file/upload-file-popover.component.scss +0 -6
- package/src/app/shared/upload-file/upload-file-popover.component.ts +0 -115
- package/src/app/shared/upload-file/upload-file.component.html +0 -46
- package/src/app/shared/upload-file/upload-file.component.scss +0 -130
- package/src/app/shared/upload-file/upload-file.component.ts +0 -218
- package/src/app/shared/upload-file/upload-file.model.ts +0 -41
- package/src/app/shared/validator/form-error-adapter.class.ts +0 -123
- package/src/app/shared/validator/validators.ts +0 -639
- package/src/app/shared/version/versions.ts +0 -91
- package/src/app/social/job/job.module.ts +0 -26
- package/src/app/social/job/progression/job-progression.component.html +0 -22
- package/src/app/social/job/progression/job-progression.component.scss +0 -15
- package/src/app/social/job/progression/job-progression.component.ts +0 -17
- package/src/app/social/job/progression/job-progression.icon.html +0 -28
- package/src/app/social/job/progression/job-progression.icon.scss +0 -5
- package/src/app/social/job/progression/job-progression.icon.ts +0 -238
- package/src/app/social/job/progression/job-progression.list.html +0 -21
- package/src/app/social/job/progression/job-progression.list.scss +0 -17
- package/src/app/social/job/progression/job-progression.list.ts +0 -49
- package/src/app/social/job/progression/job-progression.model.ts +0 -28
- package/src/app/social/job/progression/job-progression.service.ts +0 -86
- package/src/app/social/job/testing/job-progression.testing.html +0 -20
- package/src/app/social/job/testing/job-progression.testing.service.ts +0 -60
- package/src/app/social/job/testing/job-progression.testing.ts +0 -51
- package/src/app/social/job/testing/job.testing.module.ts +0 -22
- package/src/app/social/message/message.form.html +0 -60
- package/src/app/social/message/message.form.scss +0 -6
- package/src/app/social/message/message.form.ts +0 -79
- package/src/app/social/message/message.modal.html +0 -65
- package/src/app/social/message/message.modal.ts +0 -118
- package/src/app/social/message/message.model.ts +0 -81
- package/src/app/social/message/message.module.ts +0 -22
- package/src/app/social/message/message.service.ts +0 -88
- package/src/app/social/social.errors.ts +0 -11
- package/src/app/social/social.module.ts +0 -36
- package/src/app/social/social.testing.module.ts +0 -40
- package/src/app/social/user-event/notification/user-event-notification.icon.html +0 -16
- package/src/app/social/user-event/notification/user-event-notification.icon.ts +0 -108
- package/src/app/social/user-event/notification/user-event-notification.list.html +0 -135
- package/src/app/social/user-event/notification/user-event-notification.list.scss +0 -73
- package/src/app/social/user-event/notification/user-event-notification.list.ts +0 -287
- package/src/app/social/user-event/testing/user-event.testing.html +0 -27
- package/src/app/social/user-event/testing/user-event.testing.model.ts +0 -146
- package/src/app/social/user-event/testing/user-event.testing.module.ts +0 -22
- package/src/app/social/user-event/testing/user-event.testing.service.ts +0 -141
- package/src/app/social/user-event/testing/user-event.testing.ts +0 -253
- package/src/app/social/user-event/user-event.model.ts +0 -73
- package/src/app/social/user-event/user-event.module.ts +0 -25
- package/src/app/social/user-event/user-event.service.ts +0 -679
- package/src/browserslist +0 -9
- package/src/environments/environment.class.ts +0 -83
- package/src/environments/environment.prod.ts +0 -47
- package/src/environments/environment.test.ts +0 -90
- package/src/environments/environment.ts +0 -108
- package/src/favicon.ico +0 -0
- package/src/global.scss +0 -27
- package/src/index.html +0 -80
- package/src/main.ts +0 -17
- package/src/polyfills.ts +0 -68
- package/src/schema.graphql +0 -3112
- package/src/service-worker.js +0 -31
- package/src/zone-flags.ts +0 -31
- package/tsconfig.app.json +0 -15
- package/tsconfig.json +0 -47
- package/tsconfig.spec.json +0 -19
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Inject, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import { Person, PRIORITIZED_AUTHORITIES } from '../../core/services/model/person.model';
|
|
3
|
+
import { StatusById, StatusList } from '../../core/services/model/referential.model';
|
|
4
|
+
import { PersonValidatorService } from '../services/validator/person.validator';
|
|
5
|
+
import { AppTable } from '../../core/table/table.class';
|
|
6
|
+
import { ValidatorService } from '@e-is/ngx-material-table';
|
|
7
|
+
import { debounceTime, filter, tap } from 'rxjs/operators';
|
|
8
|
+
import { EntitiesTableDataSource } from '../../core/table/entities-table-datasource.class';
|
|
9
|
+
import { isNotNil } from '../../shared/functions';
|
|
10
|
+
import { ENVIRONMENT } from '../../../environments/environment.class';
|
|
11
|
+
import { PersonFilter } from '../services/filter/person.filter';
|
|
12
|
+
import { CORE_CONFIG_OPTIONS } from '../../core/services/config/core.config';
|
|
13
|
+
import { MatExpansionPanel } from '@angular/material/expansion';
|
|
14
|
+
import { slideUpDownAnimation } from '../../shared/material/material.animations';
|
|
15
|
+
import { MessageModal } from '../../social/message/message.modal';
|
|
16
|
+
import { Message } from '../../social/message/message.model';
|
|
17
|
+
import { RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, SETTINGS_FILTER } from '../../core/table/table.model';
|
|
18
|
+
import * as i0 from "@angular/core";
|
|
19
|
+
import * as i1 from "@angular/forms";
|
|
20
|
+
import * as i2 from "../../core/services/account.service";
|
|
21
|
+
import * as i3 from "@e-is/ngx-material-table";
|
|
22
|
+
import * as i4 from "../../core/services/config.service";
|
|
23
|
+
import * as i5 from "../services/person.service";
|
|
24
|
+
import * as i6 from "../../social/message/message.service";
|
|
25
|
+
import * as i7 from "ngx-jdenticon";
|
|
26
|
+
import * as i8 from "@ngx-translate/core";
|
|
27
|
+
import * as i9 from "@angular/common";
|
|
28
|
+
import * as i10 from "@ionic/angular";
|
|
29
|
+
import * as i11 from "@angular/material/table";
|
|
30
|
+
import * as i12 from "@angular/material/sort";
|
|
31
|
+
import * as i13 from "@angular/material/paginator";
|
|
32
|
+
import * as i14 from "@angular/material/form-field";
|
|
33
|
+
import * as i15 from "@angular/material/input";
|
|
34
|
+
import * as i16 from "@angular/material/checkbox";
|
|
35
|
+
import * as i17 from "@angular/material/expansion";
|
|
36
|
+
import * as i18 from "@angular/material/icon";
|
|
37
|
+
import * as i19 from "@angular/material/button";
|
|
38
|
+
import * as i20 from "@angular/material/select";
|
|
39
|
+
import * as i21 from "@angular/material/core";
|
|
40
|
+
import * as i22 from "@angular/material/badge";
|
|
41
|
+
import * as i23 from "@angular/cdk/a11y";
|
|
42
|
+
import * as i24 from "../../shared/directives/autofocus.directive";
|
|
43
|
+
import * as i25 from "../../shared/toolbar/toolbar";
|
|
44
|
+
import * as i26 from "../../shared/form/field.component";
|
|
45
|
+
import * as i27 from "../../core/form/buttons/form-buttons-bar.component";
|
|
46
|
+
import * as i28 from "../../core/table/actions-column.component";
|
|
47
|
+
import * as i29 from "../../shared/debug/debug.component";
|
|
48
|
+
import * as i30 from "../../shared/pipes/number-format.pipe";
|
|
49
|
+
export class UsersPage extends AppTable {
|
|
50
|
+
constructor(injector, formBuilder, accountService, validatorService, configService, dataService, messageService, cd, environment) {
|
|
51
|
+
super(injector, RESERVED_START_COLUMNS
|
|
52
|
+
.concat([
|
|
53
|
+
'avatar',
|
|
54
|
+
'lastName',
|
|
55
|
+
'firstName',
|
|
56
|
+
'email',
|
|
57
|
+
'profile',
|
|
58
|
+
'status',
|
|
59
|
+
'username',
|
|
60
|
+
'usernameExtranet',
|
|
61
|
+
'pubkey'
|
|
62
|
+
])
|
|
63
|
+
.concat(accountService.additionalFields.map(field => field.key))
|
|
64
|
+
.concat(RESERVED_END_COLUMNS), new EntitiesTableDataSource(Person, dataService, validatorService, {
|
|
65
|
+
prependNewElements: false,
|
|
66
|
+
suppressErrors: environment.production,
|
|
67
|
+
dataServiceOptions: {
|
|
68
|
+
saveOnlyDirtyRows: true
|
|
69
|
+
}
|
|
70
|
+
}), null);
|
|
71
|
+
this.accountService = accountService;
|
|
72
|
+
this.validatorService = validatorService;
|
|
73
|
+
this.configService = configService;
|
|
74
|
+
this.dataService = dataService;
|
|
75
|
+
this.messageService = messageService;
|
|
76
|
+
this.cd = cd;
|
|
77
|
+
this.profiles = [...PRIORITIZED_AUTHORITIES].reverse();
|
|
78
|
+
this.statusList = StatusList;
|
|
79
|
+
this.statusById = StatusById;
|
|
80
|
+
this.filterCriteriaCount = 0;
|
|
81
|
+
this.useSticky = false;
|
|
82
|
+
this.canEdit = accountService.isAdmin();
|
|
83
|
+
this.canSendMessage = this.canEdit;
|
|
84
|
+
this.inlineEdition = this.canEdit;
|
|
85
|
+
this.confirmBeforeDelete = true;
|
|
86
|
+
this.autoLoad = false; // Wait config loading
|
|
87
|
+
this.i18nColumnPrefix = 'USER.';
|
|
88
|
+
this.defaultSortBy = 'lastName';
|
|
89
|
+
this.defaultSortDirection = 'asc';
|
|
90
|
+
this.filterForm = formBuilder.group({
|
|
91
|
+
searchText: [null],
|
|
92
|
+
statusId: [null]
|
|
93
|
+
});
|
|
94
|
+
this.additionalFields = (this.accountService.additionalFields || [])
|
|
95
|
+
.filter(field => isNotNil(field.autocomplete))
|
|
96
|
+
.map(field => {
|
|
97
|
+
// Make sure to get the final autocomplete config (e.g. with a suggestFn function)
|
|
98
|
+
field.autocomplete = this.registerAutocompleteField(field.key, {
|
|
99
|
+
...field.autocomplete // Copy, to be sure the original config is unchanged
|
|
100
|
+
});
|
|
101
|
+
return field;
|
|
102
|
+
});
|
|
103
|
+
// For DEV only --
|
|
104
|
+
this.debug = !environment.production;
|
|
105
|
+
}
|
|
106
|
+
set showUsernameColumn(value) {
|
|
107
|
+
this.setShowColumn('username', value);
|
|
108
|
+
}
|
|
109
|
+
set showUsernameExtranetColumn(value) {
|
|
110
|
+
this.setShowColumn('usernameExtranet', value);
|
|
111
|
+
}
|
|
112
|
+
get firstUserColumn() {
|
|
113
|
+
const columnName = this.displayedColumns[RESERVED_START_COLUMNS.length];
|
|
114
|
+
// Skip avatar column, if present
|
|
115
|
+
return columnName === 'avatar' && this.displayedColumns[RESERVED_START_COLUMNS.length + 1] || columnName;
|
|
116
|
+
}
|
|
117
|
+
ngOnInit() {
|
|
118
|
+
super.ngOnInit();
|
|
119
|
+
this.registerSubscription(this.configService.config.subscribe(config => {
|
|
120
|
+
const authTokenType = config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE);
|
|
121
|
+
console.debug('[users] AuthTokenType=' + authTokenType);
|
|
122
|
+
switch (authTokenType) {
|
|
123
|
+
case "basic":
|
|
124
|
+
this.setShowColumn('pubkey', false, { emitEvent: false });
|
|
125
|
+
case "basic-and-token":
|
|
126
|
+
this.setShowColumn('username', true, { emitEvent: false });
|
|
127
|
+
this.setShowColumn('usernameExtranet', true, { emitEvent: false });
|
|
128
|
+
break;
|
|
129
|
+
case "token":
|
|
130
|
+
this.setShowColumn('pubkey', true, { emitEvent: false });
|
|
131
|
+
this.setShowColumn('username', false, { emitEvent: false });
|
|
132
|
+
this.setShowColumn('usernameExtranet', false, { emitEvent: false });
|
|
133
|
+
}
|
|
134
|
+
this.updateColumns();
|
|
135
|
+
this.onRefresh.emit();
|
|
136
|
+
}));
|
|
137
|
+
this.registerSubscription(this.onRefresh.subscribe(() => {
|
|
138
|
+
this.filterForm.markAsUntouched();
|
|
139
|
+
this.filterForm.markAsPristine();
|
|
140
|
+
}));
|
|
141
|
+
// Update filter when changes
|
|
142
|
+
this.registerSubscription(this.filterForm.valueChanges
|
|
143
|
+
.pipe(debounceTime(250), filter(() => this.filterForm.valid), tap(json => {
|
|
144
|
+
const filter = PersonFilter.fromObject(json);
|
|
145
|
+
this.filterCriteriaCount = filter.countNotEmptyCriteria();
|
|
146
|
+
this.markForCheck();
|
|
147
|
+
// Update the filter, without reloading the content
|
|
148
|
+
this.setFilter(filter, { emitEvent: false });
|
|
149
|
+
}),
|
|
150
|
+
// Save filter in settings (after a debounce time)
|
|
151
|
+
debounceTime(500), tap(json => this.settings.savePageSetting(this.settingsId, json, SETTINGS_FILTER)))
|
|
152
|
+
.subscribe());
|
|
153
|
+
// Restore filter from settings, or load all
|
|
154
|
+
this.restoreFilterOrLoad();
|
|
155
|
+
}
|
|
156
|
+
applyFilterAndClosePanel(event) {
|
|
157
|
+
this.onRefresh.emit(event);
|
|
158
|
+
this.filterExpansionPanel.close();
|
|
159
|
+
}
|
|
160
|
+
resetFilter(event) {
|
|
161
|
+
this.totalRowCount = undefined;
|
|
162
|
+
this.filterCriteriaCount = 0;
|
|
163
|
+
this.markAsLoading();
|
|
164
|
+
this.filterForm.reset();
|
|
165
|
+
this.setFilter(null);
|
|
166
|
+
}
|
|
167
|
+
async restoreFilterOrLoad() {
|
|
168
|
+
this.markAsLoading();
|
|
169
|
+
console.debug("[users] Restoring filter from settings...");
|
|
170
|
+
const json = this.settings.getPageSettings(this.settingsId, SETTINGS_FILTER) || {};
|
|
171
|
+
const filter = PersonFilter.fromObject(json);
|
|
172
|
+
this.filterForm.patchValue(json);
|
|
173
|
+
this.setFilter(filter, { emitEvent: true });
|
|
174
|
+
}
|
|
175
|
+
clearControlValue(event, formControl) {
|
|
176
|
+
if (event)
|
|
177
|
+
event.stopPropagation(); // Avoid to enter input the field
|
|
178
|
+
formControl.setValue(null);
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
async openComposeMessageModal(event) {
|
|
182
|
+
// Get recipients
|
|
183
|
+
const recipients = (this.selection.selected || [])
|
|
184
|
+
.map(row => row.currentData)
|
|
185
|
+
.map(Person.fromObject)
|
|
186
|
+
.map(p => {
|
|
187
|
+
const target = p.asObject({ minify: true });
|
|
188
|
+
target.department = p.department?.asObject();
|
|
189
|
+
return target;
|
|
190
|
+
});
|
|
191
|
+
const hasTopModal = !!(await this.modalCtrl.getTop());
|
|
192
|
+
const modal = await this.modalCtrl.create({
|
|
193
|
+
component: MessageModal,
|
|
194
|
+
componentProps: {
|
|
195
|
+
suggestFn: (value, filter, sortBy, sortDirection) => this.dataService.suggest(value, filter, sortBy, sortDirection),
|
|
196
|
+
data: {
|
|
197
|
+
recipients
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
cssClass: hasTopModal && 'stack-modal'
|
|
201
|
+
});
|
|
202
|
+
// Open the modal
|
|
203
|
+
await modal.present();
|
|
204
|
+
// On dismiss
|
|
205
|
+
const { data } = await modal.onDidDismiss();
|
|
206
|
+
if (!data || !(data instanceof Message))
|
|
207
|
+
return; // CANCELLED
|
|
208
|
+
console.info('[users] received message to send: ', data);
|
|
209
|
+
await this.messageService.send(data);
|
|
210
|
+
}
|
|
211
|
+
/* -- protected methods -- */
|
|
212
|
+
markForCheck() {
|
|
213
|
+
this.cd.markForCheck();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
UsersPage.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: UsersPage, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: i2.AccountService }, { token: i3.ValidatorService }, { token: i4.ConfigService }, { token: i5.PersonService }, { token: i6.MessageService }, { token: i0.ChangeDetectorRef }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Component });
|
|
217
|
+
UsersPage.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: UsersPage, selector: "app-users-table", inputs: { useSticky: "useSticky" }, providers: [
|
|
218
|
+
{ provide: ValidatorService, useExisting: PersonValidatorService }
|
|
219
|
+
], viewQueries: [{ propertyName: "filterExpansionPanel", first: true, predicate: MatExpansionPanel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<app-toolbar [title]=\"'USER.LIST.TITLE'|translate\"\n color=\"primary\"\n [canGoBack]=\"false\"\n [hasValidate]=\"!(loadingSubject|async) && dirty\"\n (onValidate)=\"save()\">\n <ion-buttons slot=\"end\">\n\n <!-- Compose message -->\n <button mat-icon-button *ngIf=\"canSendMessage\"\n [title]=\"'USER.LIST.BTN_SEND_MESSAGE'|translate\"\n (click)=\"openComposeMessageModal($event)\">\n <ion-icon name=\"mail\" slot=\"icon-only\"></ion-icon>\n </button>\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold;\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n </ng-container>\n\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button\n class=\"hidden-xs hidden-sm\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <!-- error -->\n <ion-item *ngIf=\"errorSubject|async ; let error\" lines=\"none\" @slideUpDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <!-- debug -->\n <app-debug *ngIf=\"debug\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n focusColumn: {{focusColumn}}<br/>\n </ion-col>\n </ion-row>\n </ion-grid>\n </app-debug>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"ion-no-padding filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding\" [formGroup]=\"filterForm\" (ngSubmit)=\"onRefresh.emit()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <input matInput [placeholder]=\"'USER.LIST.FILTER.SEARCH'|translate\" formControlName=\"searchText\">\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <!-- status -->\n <mat-form-field>\n <mat-select formControlName=\"statusId\" [placeholder]=\"'USER.STATUS'|translate\">\n <mat-option [value]=\"null\"><i><span translate>COMMON.EMPTY_OPTION</span></i></mat-option>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.statusId)\"\n [hidden]=\"filterForm.controls.statusId.disabled || !filterForm.controls.statusId.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- error -->\n <ion-item *ngIf=\"errorSubject|async ; let error\" visible-xs visible-sm visible-mobile lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"table-container\">\n <table #table mat-table matSort\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\" [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData.id }}</td>\n </ng-container>\n\n <!-- avatar Column -->\n <ng-container matColumnDef=\"avatar\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"avatar\" *ngIf=\"row.currentData.avatar; else generateIcon\"\n [ngStyle]=\"{'background-image':'url('+row.currentData.avatar+')'}\"></div>\n <ng-template #generateIcon>\n <div class=\"avatar\">\n <svg width=\"38\" width=\"38\" [data-jdenticon-value]=\"row.currentData.id\"></svg>\n </div>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- lastName -->\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.LAST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='lastName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['lastName']\"\n [placeholder]=\"'USER.LAST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='lastName'\">\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n </td>\n\n </ng-container>\n\n <!-- firstname -->\n <ng-container matColumnDef=\"firstName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.FIRST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='firstName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['firstName']\"\n [placeholder]=\"'USER.FIRST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='firstName'\">\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- email -->\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.EMAIL</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='email'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['email']\"\n [placeholder]=\"'USER.EMAIL'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='email'\">\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('email')\">\n <span translate>ERROR.FIELD_NOT_VALID_EMAIL</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- additional fields -->\n <ng-container *ngFor=\"let definition of additionalFields\" [matColumnDef]=\"definition.key\">\n <th mat-header-cell *matHeaderCellDef>\n <span>{{definition.label|translate}}</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn=definition.key\">\n <app-form-field floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"row.validator.controls[definition.key]\"\n [required]=\"definition.extra?.account?.required\"\n [autofocus]=\"row.editing && focusColumn===definition.key\">\n </app-form-field>\n </td>\n </ng-container>\n\n <!-- profile column -->\n <ng-container matColumnDef=\"profile\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.PROFILE</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='profile'\">\n <mat-form-field floatLabel=\"never\">\n <mat-select [formControl]=\"row.validator.controls['mainProfile']\"\n [placeholder]=\"'USER.PROFILE'|translate\">\n <mat-option *ngFor=\"let item of profiles\" [value]=\"item\">\n {{ ('USER.PROFILE_ENUM.' + item) | uppercase |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['mainProfile'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='status'\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value >=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\"\n [placeholder]=\"'REFERENTIAL.STATUS'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value >=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username -->\n <ng-container matColumnDef=\"username\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='username'\">\n <mat-form-field floatLabel=\"never\" >\n <input matInput [formControl]=\"row.validator.controls.username\"\n [placeholder]=\"'USER.USERNAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='username'\">\n <mat-error *ngIf=\"row.validator.controls.username.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username extranet -->\n <ng-container matColumnDef=\"usernameExtranet\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME_EXTRANET</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='usernameExtranet'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls.usernameExtranet\"\n [placeholder]=\"'USER.USERNAME_EXTRANET'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='usernameExtranet'\">\n <mat-error *ngIf=\"row.validator.controls.usernameExtranet.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- pubkey -->\n <ng-container matColumnDef=\"pubkey\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.PUBKEY</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [title]=\"row.validator.controls.pubkey.valueChanges|async\"\n (click)=\"focusColumn='pubkey'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['pubkey']\" [placeholder]=\"'USER.PUBKEY'|translate\"\n [readonly]=\"!row.editing\" autocomplete=\"off\">\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('pubkey')\">\n <span translate>ERROR.FIELD_NOT_VALID_PUBKEY</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmEditCreateClick)=\"confirmEditCreate($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\">\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-error]=\"row.validator.invalid\"\n [class.mat-row-dirty]=\"row.currentData.dirty\"\n [class.mat-row-disabled]=\"!row.editing\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"!row.validator?.valid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n\n<ion-footer>\n <mat-paginator class=\"mat-paginator-footer\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\"\n [pageSizeOptions]=\"defaultPageSizeOptions\" showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"!mobile && inlineEdition\"\n (onCancel)=\"onRefresh.emit()\" (onSave)=\"save()\" [disabled]=\"(loadingSubject|async) || !dirty\"></app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow()\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".mat-expansion-panel{margin-bottom:5px}.mat-expansion-panel .form-container mat-form-field{width:100%}.mat-expansion-panel mat-action-row ion-label{line-height:36px}.table-container{height:100%}.mat-table .mat-cell .avatar{height:40px;width:40px;margin:2px 0 0;background-size:cover;background-repeat:no-repeat;background-position:center}.mat-table .mat-column-id{width:30px}.mat-table .mat-column-avatar{width:50px}.mat-table .mat-column-avatar .avatar{border-radius:5px;border:solid 1px rgba(var(--ion-color-secondary-rgb),.5)}.mat-table .mat-column-lastName,.mat-table .mat-column-firstName{min-width:80px}.mat-table .mat-column-email,.mat-table .mat-column-pubkey,.mat-table .mat-column-department{min-width:180px}.mat-table .mat-column-profile{min-width:110px}.mat-table .mat-column-status{min-width:130px}\n"], dependencies: [{ kind: "directive", type: i7.SvgJdenticonDirective, selector: "svg[data-jdenticon-hash],svg[data-jdenticon-value]", inputs: ["data-jdenticon-hash", "data-jdenticon-value", "width", "height"] }, { kind: "directive", type: i8.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i10.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i10.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i10.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i10.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i10.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i10.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i10.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i10.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i10.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i10.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i10.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i10.IonRow, selector: "ion-row" }, { kind: "component", type: i10.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i10.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i11.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i11.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i11.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i11.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i11.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i11.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i11.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i11.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i11.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i12.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i12.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i13.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i14.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i14.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i14.MatPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i14.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i15.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i16.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i17.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "directive", type: i17.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i18.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i19.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i20.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "directive", type: i20.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i21.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i22.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i23.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i24.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i25.ToolbarComponent, selector: "app-toolbar", inputs: ["progressBarMode", "title", "color", "class", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }, { kind: "component", type: i26.AppFormField, selector: "app-form-field", inputs: ["definition", "required", "readonly", "disabled", "formControl", "formControlName", "placeholder", "compact", "floatLabel", "tabindex", "autofocus", "clearable", "chipColor", "debug", "class"], outputs: ["keyup.enter"] }, { kind: "component", type: i27.FormButtonsBarComponent, selector: "app-form-buttons-bar", inputs: ["disabled", "disabledCancel", "classList"], outputs: ["onCancel", "onSave", "onNext", "onBack"] }, { kind: "component", type: i28.ActionsColumnComponent, selector: "app-actions-column", inputs: ["stickyEnd", "canCancel", "canConfirm", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmEditCreateClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "component", type: i29.DebugComponent, selector: "app-debug", inputs: ["title", "enable", "expanded"] }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }, { kind: "pipe", type: i9.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i30.NumberFormatPipe, name: "numberFormat" }], animations: [slideUpDownAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
220
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: UsersPage, decorators: [{
|
|
221
|
+
type: Component,
|
|
222
|
+
args: [{ selector: 'app-users-table', providers: [
|
|
223
|
+
{ provide: ValidatorService, useExisting: PersonValidatorService }
|
|
224
|
+
], animations: [slideUpDownAnimation], changeDetection: ChangeDetectionStrategy.OnPush, template: "<app-toolbar [title]=\"'USER.LIST.TITLE'|translate\"\n color=\"primary\"\n [canGoBack]=\"false\"\n [hasValidate]=\"!(loadingSubject|async) && dirty\"\n (onValidate)=\"save()\">\n <ion-buttons slot=\"end\">\n\n <!-- Compose message -->\n <button mat-icon-button *ngIf=\"canSendMessage\"\n [title]=\"'USER.LIST.BTN_SEND_MESSAGE'|translate\"\n (click)=\"openComposeMessageModal($event)\">\n <ion-icon name=\"mail\" slot=\"icon-only\"></ion-icon>\n </button>\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold;\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n </ng-container>\n\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button\n class=\"hidden-xs hidden-sm\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <!-- error -->\n <ion-item *ngIf=\"errorSubject|async ; let error\" lines=\"none\" @slideUpDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <!-- debug -->\n <app-debug *ngIf=\"debug\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n focusColumn: {{focusColumn}}<br/>\n </ion-col>\n </ion-row>\n </ion-grid>\n </app-debug>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"ion-no-padding filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding\" [formGroup]=\"filterForm\" (ngSubmit)=\"onRefresh.emit()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <input matInput [placeholder]=\"'USER.LIST.FILTER.SEARCH'|translate\" formControlName=\"searchText\">\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <!-- status -->\n <mat-form-field>\n <mat-select formControlName=\"statusId\" [placeholder]=\"'USER.STATUS'|translate\">\n <mat-option [value]=\"null\"><i><span translate>COMMON.EMPTY_OPTION</span></i></mat-option>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.statusId)\"\n [hidden]=\"filterForm.controls.statusId.disabled || !filterForm.controls.statusId.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- error -->\n <ion-item *ngIf=\"errorSubject|async ; let error\" visible-xs visible-sm visible-mobile lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"table-container\">\n <table #table mat-table matSort\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\" [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData.id }}</td>\n </ng-container>\n\n <!-- avatar Column -->\n <ng-container matColumnDef=\"avatar\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"avatar\" *ngIf=\"row.currentData.avatar; else generateIcon\"\n [ngStyle]=\"{'background-image':'url('+row.currentData.avatar+')'}\"></div>\n <ng-template #generateIcon>\n <div class=\"avatar\">\n <svg width=\"38\" width=\"38\" [data-jdenticon-value]=\"row.currentData.id\"></svg>\n </div>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- lastName -->\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.LAST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='lastName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['lastName']\"\n [placeholder]=\"'USER.LAST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='lastName'\">\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n </td>\n\n </ng-container>\n\n <!-- firstname -->\n <ng-container matColumnDef=\"firstName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.FIRST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='firstName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['firstName']\"\n [placeholder]=\"'USER.FIRST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='firstName'\">\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- email -->\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.EMAIL</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='email'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['email']\"\n [placeholder]=\"'USER.EMAIL'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='email'\">\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('email')\">\n <span translate>ERROR.FIELD_NOT_VALID_EMAIL</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- additional fields -->\n <ng-container *ngFor=\"let definition of additionalFields\" [matColumnDef]=\"definition.key\">\n <th mat-header-cell *matHeaderCellDef>\n <span>{{definition.label|translate}}</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn=definition.key\">\n <app-form-field floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"row.validator.controls[definition.key]\"\n [required]=\"definition.extra?.account?.required\"\n [autofocus]=\"row.editing && focusColumn===definition.key\">\n </app-form-field>\n </td>\n </ng-container>\n\n <!-- profile column -->\n <ng-container matColumnDef=\"profile\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.PROFILE</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='profile'\">\n <mat-form-field floatLabel=\"never\">\n <mat-select [formControl]=\"row.validator.controls['mainProfile']\"\n [placeholder]=\"'USER.PROFILE'|translate\">\n <mat-option *ngFor=\"let item of profiles\" [value]=\"item\">\n {{ ('USER.PROFILE_ENUM.' + item) | uppercase |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['mainProfile'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='status'\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value >=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\"\n [placeholder]=\"'REFERENTIAL.STATUS'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value >=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username -->\n <ng-container matColumnDef=\"username\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='username'\">\n <mat-form-field floatLabel=\"never\" >\n <input matInput [formControl]=\"row.validator.controls.username\"\n [placeholder]=\"'USER.USERNAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='username'\">\n <mat-error *ngIf=\"row.validator.controls.username.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username extranet -->\n <ng-container matColumnDef=\"usernameExtranet\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME_EXTRANET</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='usernameExtranet'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls.usernameExtranet\"\n [placeholder]=\"'USER.USERNAME_EXTRANET'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='usernameExtranet'\">\n <mat-error *ngIf=\"row.validator.controls.usernameExtranet.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- pubkey -->\n <ng-container matColumnDef=\"pubkey\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.PUBKEY</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [title]=\"row.validator.controls.pubkey.valueChanges|async\"\n (click)=\"focusColumn='pubkey'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['pubkey']\" [placeholder]=\"'USER.PUBKEY'|translate\"\n [readonly]=\"!row.editing\" autocomplete=\"off\">\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('pubkey')\">\n <span translate>ERROR.FIELD_NOT_VALID_PUBKEY</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmEditCreateClick)=\"confirmEditCreate($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\">\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-error]=\"row.validator.invalid\"\n [class.mat-row-dirty]=\"row.currentData.dirty\"\n [class.mat-row-disabled]=\"!row.editing\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"!row.validator?.valid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n\n<ion-footer>\n <mat-paginator class=\"mat-paginator-footer\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\"\n [pageSizeOptions]=\"defaultPageSizeOptions\" showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"!mobile && inlineEdition\"\n (onCancel)=\"onRefresh.emit()\" (onSave)=\"save()\" [disabled]=\"(loadingSubject|async) || !dirty\"></app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow()\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".mat-expansion-panel{margin-bottom:5px}.mat-expansion-panel .form-container mat-form-field{width:100%}.mat-expansion-panel mat-action-row ion-label{line-height:36px}.table-container{height:100%}.mat-table .mat-cell .avatar{height:40px;width:40px;margin:2px 0 0;background-size:cover;background-repeat:no-repeat;background-position:center}.mat-table .mat-column-id{width:30px}.mat-table .mat-column-avatar{width:50px}.mat-table .mat-column-avatar .avatar{border-radius:5px;border:solid 1px rgba(var(--ion-color-secondary-rgb),.5)}.mat-table .mat-column-lastName,.mat-table .mat-column-firstName{min-width:80px}.mat-table .mat-column-email,.mat-table .mat-column-pubkey,.mat-table .mat-column-department{min-width:180px}.mat-table .mat-column-profile{min-width:110px}.mat-table .mat-column-status{min-width:130px}\n"] }]
|
|
225
|
+
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: i2.AccountService }, { type: i3.ValidatorService }, { type: i4.ConfigService }, { type: i5.PersonService }, { type: i6.MessageService }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
|
|
226
|
+
type: Inject,
|
|
227
|
+
args: [ENVIRONMENT]
|
|
228
|
+
}] }]; }, propDecorators: { useSticky: [{
|
|
229
|
+
type: Input
|
|
230
|
+
}], filterExpansionPanel: [{
|
|
231
|
+
type: ViewChild,
|
|
232
|
+
args: [MatExpansionPanel, { static: true }]
|
|
233
|
+
}] } });
|
|
234
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2FkbWluL3VzZXJzL3VzZXJzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9hZG1pbi91c2Vycy91c2Vycy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLE1BQU0sRUFBWSxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xJLE9BQU8sRUFBRSxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN6RixPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRXJGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBR2hGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUU3RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxF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QUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxzQkFBc0IsRUFBQztLQUNqRSxnRkEyRlUsaUJBQWlCLHFGQzFIOUIsaTNsQkEyYUEsMjlVRDNZYyxDQUFDLG9CQUFvQixDQUFDOzJGQUd2QixTQUFTO2tCQVZyQixTQUFTOytCQUNFLGlCQUFpQixhQUdoQjt3QkFDVCxFQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUM7cUJBQ2pFLGNBQ1csQ0FBQyxvQkFBb0IsQ0FBQyxtQkFDakIsdUJBQXVCLENBQUMsTUFBTTs7MEJBaUM1QyxNQUFNOzJCQUFDLFdBQVc7NENBWFosU0FBUztzQkFBakIsS0FBSztnQkFtRXdDLG9CQUFvQjtzQkFBakUsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5qZWN0LCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQZXJzb24sIFBSSU9SSVRJWkVEX0FVVEhPUklUSUVTIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9tb2RlbC9wZXJzb24ubW9kZWwnO1xuaW1wb3J0IHsgU3RhdHVzQnlJZCwgU3RhdHVzTGlzdCB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvcmVmZXJlbnRpYWwubW9kZWwnO1xuaW1wb3J0IHsgUGVyc29uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3BlcnNvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBlcnNvblZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy92YWxpZGF0b3IvcGVyc29uLnZhbGlkYXRvcic7XG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQXBwVGFibGUgfSBmcm9tICcuLi8uLi9jb3JlL3RhYmxlL3RhYmxlLmNsYXNzJztcbmltcG9ydCB7IFZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICdAZS1pcy9uZ3gtbWF0ZXJpYWwtdGFibGUnO1xuaW1wb3J0IHsgRm9ybUZpZWxkRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL2NvcmUvdGFibGUvZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZS5jbGFzcyc7XG5pbXBvcnQgeyBpc05vdE5pbCB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgRU5WSVJPTk1FTlQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgUGVyc29uRmlsdGVyIH0gZnJvbSAnLi4vc2VydmljZXMvZmlsdGVyL3BlcnNvbi5maWx0ZXInO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ09SRV9DT05GSUdfT1BUSU9OUyB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvY29uZmlnL2NvcmUuY29uZmlnJztcbmltcG9ydCB7IEF1dGhUb2tlblR5cGUgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL25ldHdvcmsudHlwZXMnO1xuaW1wb3J0IHsgTWF0RXhwYW5zaW9uUGFuZWwgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xuaW1wb3J0IHsgc2xpZGVVcERvd25BbmltYXRpb24gfSBmcm9tICcuLi8uLi9zaGFyZWQvbWF0ZXJpYWwvbWF0ZXJpYWwuYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBNZXNzYWdlTW9kYWwsIE1lc3NhZ2VNb2RhbE9wdGlvbnMgfSBmcm9tICcuLi8uLi9zb2NpYWwvbWVzc2FnZS9tZXNzYWdlLm1vZGFsJztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuLi8uLi9zb2NpYWwvbWVzc2FnZS9tZXNzYWdlLm1vZGVsJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc29jaWFsL21lc3NhZ2UvbWVzc2FnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJFU0VSVkVEX0VORF9DT0xVTU5TLCBSRVNFUlZFRF9TVEFSVF9DT0xVTU5TLCBTRVRUSU5HU19GSUxURVIgfSBmcm9tICcuLi8uLi9jb3JlL3RhYmxlL3RhYmxlLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXVzZXJzLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICd1c2Vycy5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXNlcnMuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7cHJvdmlkZTogVmFsaWRhdG9yU2VydmljZSwgdXNlRXhpc3Rpbmc6IFBlcnNvblZhbGlkYXRvclNlcnZpY2V9XG4gIF0sXG4gIGFuaW1hdGlvbnM6IFtzbGlkZVVwRG93bkFuaW1hdGlvbl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJzUGFnZSBleHRlbmRzIEFwcFRhYmxlPFBlcnNvbiwgUGVyc29uRmlsdGVyPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcmVhZG9ubHkgY2FuRWRpdDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2FuU2VuZE1lc3NhZ2U6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGZpbHRlckZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gIHJlYWRvbmx5IHByb2ZpbGVzID0gWy4uLlBSSU9SSVRJWkVEX0FVVEhPUklUSUVTXS5yZXZlcnNlKCk7XG4gIHJlYWRvbmx5IHN0YXR1c0xpc3QgPSBTdGF0dXNMaXN0O1xuICByZWFkb25seSBzdGF0dXNCeUlkID0gU3RhdHVzQnlJZDtcblxuICBhZGRpdGlvbmFsRmllbGRzOiBGb3JtRmllbGREZWZpbml0aW9uW107XG4gIGZpbHRlckNyaXRlcmlhQ291bnQgPSAwO1xuXG4gIHNldCBzaG93VXNlcm5hbWVDb2x1bW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFNob3dDb2x1bW4oJ3VzZXJuYW1lJywgdmFsdWUpO1xuICB9XG5cbiAgc2V0IHNob3dVc2VybmFtZUV4dHJhbmV0Q29sdW1uKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRTaG93Q29sdW1uKCd1c2VybmFtZUV4dHJhbmV0JywgdmFsdWUpO1xuICB9XG5cbiAgQElucHV0KCkgdXNlU3RpY2t5ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJvdGVjdGVkIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdG9yU2VydmljZTogVmFsaWRhdG9yU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZGF0YVNlcnZpY2U6IFBlcnNvblNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIGVudmlyb25tZW50XG4gICkge1xuICAgIHN1cGVyKGluamVjdG9yLFxuICAgICAgUkVTRVJWRURfU1RBUlRfQ09MVU1OU1xuICAgICAgICAuY29uY2F0KFtcbiAgICAgICAgICAnYXZhdGFyJyxcbiAgICAgICAgICAnbGFzdE5hbWUnLFxuICAgICAgICAgICdmaXJzdE5hbWUnLFxuICAgICAgICAgICdlbWFpbCcsXG4gICAgICAgICAgJ3Byb2ZpbGUnLFxuICAgICAgICAgICdzdGF0dXMnLFxuICAgICAgICAgICd1c2VybmFtZScsXG4gICAgICAgICAgJ3VzZXJuYW1lRXh0cmFuZXQnLFxuICAgICAgICAgICdwdWJrZXknXG4gICAgICAgIF0pXG4gICAgICAgIC5jb25jYXQoYWNjb3VudFNlcnZpY2UuYWRkaXRpb25hbEZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQua2V5KSlcbiAgICAgICAgLmNvbmNhdChSRVNFUlZFRF9FTkRfQ09MVU1OUyksXG4gICAgICBuZXcgRW50aXRpZXNUYWJsZURhdGFTb3VyY2UoUGVyc29uLCBkYXRhU2VydmljZSwgdmFsaWRhdG9yU2VydmljZSwge1xuICAgICAgICBwcmVwZW5kTmV3RWxlbWVudHM6IGZhbHNlLFxuICAgICAgICBzdXBwcmVzc0Vycm9yczogZW52aXJvbm1lbnQucHJvZHVjdGlvbixcbiAgICAgICAgZGF0YVNlcnZpY2VPcHRpb25zOiB7XG4gICAgICAgICAgc2F2ZU9ubHlEaXJ0eVJvd3M6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBudWxsXG4gICAgKTtcblxuXG4gICAgdGhpcy5jYW5FZGl0ID0gYWNjb3VudFNlcnZpY2UuaXNBZG1pbigpO1xuICAgIHRoaXMuY2FuU2VuZE1lc3NhZ2UgPSB0aGlzLmNhbkVkaXQ7XG4gICAgdGhpcy5pbmxpbmVFZGl0aW9uID0gdGhpcy5jYW5FZGl0O1xuICAgIHRoaXMuY29uZmlybUJlZm9yZURlbGV0ZSA9IHRydWU7XG4gICAgdGhpcy5hdXRvTG9hZCA9IGZhbHNlOyAvLyBXYWl0IGNvbmZpZyBsb2FkaW5nXG4gICAgdGhpcy5pMThuQ29sdW1uUHJlZml4ID0gJ1VTRVIuJztcbiAgICB0aGlzLmRlZmF1bHRTb3J0QnkgPSAnbGFzdE5hbWUnO1xuICAgIHRoaXMuZGVmYXVsdFNvcnREaXJlY3Rpb24gPSAnYXNjJztcblxuICAgIHRoaXMuZmlsdGVyRm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHNlYXJjaFRleHQ6IFtudWxsXSxcbiAgICAgIHN0YXR1c0lkOiBbbnVsbF1cbiAgICB9KTtcblxuICAgIHRoaXMuYWRkaXRpb25hbEZpZWxkcyA9ICh0aGlzLmFjY291bnRTZXJ2aWNlLmFkZGl0aW9uYWxGaWVsZHMgfHwgW10pXG4gICAgICAuZmlsdGVyKGZpZWxkID0+IGlzTm90TmlsKGZpZWxkLmF1dG9jb21wbGV0ZSkpXG4gICAgICAubWFwKGZpZWxkID0+IHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRvIGdldCB0aGUgZmluYWwgYXV0b2NvbXBsZXRlIGNvbmZpZyAoZS5nLiB3aXRoIGEgc3VnZ2VzdEZuIGZ1bmN0aW9uKVxuICAgICAgICBmaWVsZC5hdXRvY29tcGxldGUgPSB0aGlzLnJlZ2lzdGVyQXV0b2NvbXBsZXRlRmllbGQoZmllbGQua2V5LCB7XG4gICAgICAgICAgLi4uZmllbGQuYXV0b2NvbXBsZXRlIC8vIENvcHksIHRvIGJlIHN1cmUgdGhlIG9yaWdpbmFsIGNvbmZpZyBpcyB1bmNoYW5nZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH0pO1xuXG4gICAgLy8gRm9yIERFViBvbmx5IC0tXG4gICAgdGhpcy5kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICB9XG5cbiAgQFZpZXdDaGlsZChNYXRFeHBhbnNpb25QYW5lbCwge3N0YXRpYzogdHJ1ZX0pIGZpbHRlckV4cGFuc2lvblBhbmVsOiBNYXRFeHBhbnNpb25QYW5lbDtcblxuICBnZXQgZmlyc3RVc2VyQ29sdW1uKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29sdW1uTmFtZSA9IHRoaXMuZGlzcGxheWVkQ29sdW1uc1tSRVNFUlZFRF9TVEFSVF9DT0xVTU5TLmxlbmd0aF07XG4gICAgLy8gU2tpcCBhdmF0YXIgY29sdW1uLCBpZiBwcmVzZW50XG4gICAgcmV0dXJuIGNvbHVtbk5hbWUgPT09ICdhdmF0YXInICYmIHRoaXMuZGlzcGxheWVkQ29sdW1uc1tSRVNFUlZFRF9TVEFSVF9DT0xVTU5TLmxlbmd0aCsxXSB8fCBjb2x1bW5OYW1lO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YnNjcmliZShjb25maWcgPT4ge1xuICAgICAgICBjb25zdCBhdXRoVG9rZW5UeXBlID0gY29uZmlnLmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuQVVUSF9UT0tFTl9UWVBFKSBhcyBBdXRoVG9rZW5UeXBlO1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbdXNlcnNdIEF1dGhUb2tlblR5cGU9JyArIGF1dGhUb2tlblR5cGUpXG4gICAgICAgIHN3aXRjaCAoYXV0aFRva2VuVHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJiYXNpY1wiOlxuICAgICAgICAgICAgdGhpcy5zZXRTaG93Q29sdW1uKCdwdWJrZXknLCBmYWxzZSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICBjYXNlIFwiYmFzaWMtYW5kLXRva2VuXCI6XG4gICAgICAgICAgICB0aGlzLnNldFNob3dDb2x1bW4oJ3VzZXJuYW1lJywgdHJ1ZSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICAgIHRoaXMuc2V0U2hvd0NvbHVtbigndXNlcm5hbWVFeHRyYW5ldCcsIHRydWUsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwidG9rZW5cIjpcbiAgICAgICAgICAgIHRoaXMuc2V0U2hvd0NvbHVtbigncHVia2V5JywgdHJ1ZSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICAgIHRoaXMuc2V0U2hvd0NvbHVtbigndXNlcm5hbWUnLCBmYWxzZSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICAgIHRoaXMuc2V0U2hvd0NvbHVtbigndXNlcm5hbWVFeHRyYW5ldCcsIGZhbHNlLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucygpO1xuICAgICAgICB0aGlzLm9uUmVmcmVzaC5lbWl0KCk7XG4gICAgICB9KVxuICAgIClcblxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLm9uUmVmcmVzaC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmZpbHRlckZvcm0ubWFya0FzVW50b3VjaGVkKCk7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgfSkpO1xuXG4gICAgLy8gVXBkYXRlIGZpbHRlciB3aGVuIGNoYW5nZXNcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5maWx0ZXJGb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMjUwKSxcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5maWx0ZXJGb3JtLnZhbGlkKSxcbiAgICAgICAgICB0YXAoanNvbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBQZXJzb25GaWx0ZXIuZnJvbU9iamVjdChqc29uKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyQ3JpdGVyaWFDb3VudCA9IGZpbHRlci5jb3VudE5vdEVtcHR5Q3JpdGVyaWEoKTtcbiAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGZpbHRlciwgd2l0aG91dCByZWxvYWRpbmcgdGhlIGNvbnRlbnRcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyKGZpbHRlciwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAvLyBTYXZlIGZpbHRlciBpbiBzZXR0aW5ncyAoYWZ0ZXIgYSBkZWJvdW5jZSB0aW1lKVxuICAgICAgICAgIGRlYm91bmNlVGltZSg1MDApLFxuICAgICAgICAgIHRhcChqc29uID0+IHRoaXMuc2V0dGluZ3Muc2F2ZVBhZ2VTZXR0aW5nKHRoaXMuc2V0dGluZ3NJZCwganNvbiwgU0VUVElOR1NfRklMVEVSKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCkpO1xuXG4gICAgLy8gUmVzdG9yZSBmaWx0ZXIgZnJvbSBzZXR0aW5ncywgb3IgbG9hZCBhbGxcbiAgICB0aGlzLnJlc3RvcmVGaWx0ZXJPckxvYWQoKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyQW5kQ2xvc2VQYW5lbChldmVudD86IEV2ZW50KSB7XG4gICAgdGhpcy5vblJlZnJlc2guZW1pdChldmVudCk7XG4gICAgdGhpcy5maWx0ZXJFeHBhbnNpb25QYW5lbC5jbG9zZSgpO1xuICB9XG5cbiAgcmVzZXRGaWx0ZXIoZXZlbnQ/OiBFdmVudCkge1xuICAgIHRoaXMudG90YWxSb3dDb3VudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmZpbHRlckNyaXRlcmlhQ291bnQgPSAwO1xuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuICAgIHRoaXMuZmlsdGVyRm9ybS5yZXNldCgpO1xuICAgIHRoaXMuc2V0RmlsdGVyKG51bGwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlc3RvcmVGaWx0ZXJPckxvYWQoKSB7XG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICBjb25zb2xlLmRlYnVnKFwiW3VzZXJzXSBSZXN0b3JpbmcgZmlsdGVyIGZyb20gc2V0dGluZ3MuLi5cIik7XG5cbiAgICBjb25zdCBqc29uID0gdGhpcy5zZXR0aW5ncy5nZXRQYWdlU2V0dGluZ3ModGhpcy5zZXR0aW5nc0lkLCBTRVRUSU5HU19GSUxURVIpIHx8IHt9O1xuICAgIGNvbnN0IGZpbHRlciA9IFBlcnNvbkZpbHRlci5mcm9tT2JqZWN0KGpzb24pO1xuXG4gICAgdGhpcy5maWx0ZXJGb3JtLnBhdGNoVmFsdWUoanNvbik7XG4gICAgdGhpcy5zZXRGaWx0ZXIoZmlsdGVyLCB7ZW1pdEV2ZW50OiB0cnVlfSk7XG4gIH1cblxuICBjbGVhckNvbnRyb2xWYWx1ZShldmVudDogRXZlbnQsIGZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBBdm9pZCB0byBlbnRlciBpbnB1dCB0aGUgZmllbGRcbiAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZShudWxsKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyBvcGVuQ29tcG9zZU1lc3NhZ2VNb2RhbChldmVudD86IEV2ZW50KTogUHJvbWlzZTxhbnk+IHtcblxuICAgIC8vIEdldCByZWNpcGllbnRzXG4gICAgY29uc3QgcmVjaXBpZW50cyA9ICh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCB8fCBbXSlcbiAgICAgIC5tYXAocm93ID0+IHJvdy5jdXJyZW50RGF0YSlcbiAgICAgIC5tYXAoUGVyc29uLmZyb21PYmplY3QpXG4gICAgICAubWFwKHAgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBwLmFzT2JqZWN0KHttaW5pZnk6IHRydWV9KTtcbiAgICAgICAgdGFyZ2V0LmRlcGFydG1lbnQgPSBwLmRlcGFydG1lbnQ/LmFzT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IGhhc1RvcE1vZGFsID0gISEoYXdhaXQgdGhpcy5tb2RhbEN0cmwuZ2V0VG9wKCkpO1xuICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5tb2RhbEN0cmwuY3JlYXRlKHtcbiAgICAgIGNvbXBvbmVudDogTWVzc2FnZU1vZGFsLFxuICAgICAgY29tcG9uZW50UHJvcHM6IDxNZXNzYWdlTW9kYWxPcHRpb25zPntcbiAgICAgICAgc3VnZ2VzdEZuOiAodmFsdWUsIGZpbHRlciwgc29ydEJ5LCBzb3J0RGlyZWN0aW9uKSA9PiB0aGlzLmRhdGFTZXJ2aWNlLnN1Z2dlc3QodmFsdWUsIGZpbHRlciwgc29ydEJ5LCBzb3J0RGlyZWN0aW9uKSxcbiAgICAgICAgZGF0YTogPE1lc3NhZ2U+e1xuICAgICAgICAgIHJlY2lwaWVudHNcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNzc0NsYXNzOiBoYXNUb3BNb2RhbCAmJiAnc3RhY2stbW9kYWwnXG4gICAgfSk7XG5cbiAgICAvLyBPcGVuIHRoZSBtb2RhbFxuICAgIGF3YWl0IG1vZGFsLnByZXNlbnQoKTtcblxuICAgIC8vIE9uIGRpc21pc3NcbiAgICBjb25zdCB7ZGF0YX0gPSBhd2FpdCBtb2RhbC5vbkRpZERpc21pc3MoKTtcbiAgICBpZiAoIWRhdGEgfHwgIShkYXRhIGluc3RhbmNlb2YgTWVzc2FnZSkpIHJldHVybjsgLy8gQ0FOQ0VMTEVEXG5cbiAgICBjb25zb2xlLmluZm8oJ1t1c2Vyc10gcmVjZWl2ZWQgbWVzc2FnZSB0byBzZW5kOiAnLCBkYXRhKTtcbiAgICBhd2FpdCB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnNlbmQoZGF0YSk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG59XG5cbiIsIjxhcHAtdG9vbGJhciBbdGl0bGVdPVwiJ1VTRVIuTElTVC5USVRMRSd8dHJhbnNsYXRlXCJcbiAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgIFtjYW5Hb0JhY2tdPVwiZmFsc2VcIlxuICAgICAgICAgICAgIFtoYXNWYWxpZGF0ZV09XCIhKGxvYWRpbmdTdWJqZWN0fGFzeW5jKSAmJiBkaXJ0eVwiXG4gICAgICAgICAgICAgKG9uVmFsaWRhdGUpPVwic2F2ZSgpXCI+XG4gIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG5cbiAgICA8IS0tIENvbXBvc2UgbWVzc2FnZSAtLT5cbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cImNhblNlbmRNZXNzYWdlXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInVVNFUi5MSVNULkJUTl9TRU5EX01FU1NBR0UnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib3BlbkNvbXBvc2VNZXNzYWdlTW9kYWwoJGV2ZW50KVwiPlxuICAgICAgPGlvbi1pY29uIG5hbWU9XCJtYWlsXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNlbGVjdGlvbi5oYXNWYWx1ZSgpOyBlbHNlIGhhc1NlbGVjdGlvblwiPlxuICAgICAgPCEtLSBBZGQgLS0+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cImNhbkVkaXQgJiYgIW1vYmlsZVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9BREQnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGRSb3coKVwiPlxuICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8IS0tIFJlZnJlc2ggLS0+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cIiFtb2JpbGVcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fUkVGUkVTSCd8dHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVmcmVzaC5lbWl0KClcIj5cbiAgICAgICAgPG1hdC1pY29uPnJlZnJlc2g8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwhLS0gcmVzZXQgZmlsdGVyIC0tPlxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlc2V0RmlsdGVyKClcIlxuICAgICAgICAgICAgICAqbmdJZj1cImZpbHRlckNyaXRlcmlhQ291bnRcIj5cbiAgICAgICAgPG1hdC1pY29uIGNvbG9yPVwiYWNjZW50XCI+ZmlsdGVyX2xpc3RfYWx0PC9tYXQtaWNvbj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbi1zZWNvbmRhcnlcIiBzdHlsZT1cImxlZnQ6IDE2cHg7IHRvcDogNXB4OyBmb250LXdlaWdodDogYm9sZDtcIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPCEtLSBzaG93IGZpbHRlciAtLT5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJmaWx0ZXJFeHBhbnNpb25QYW5lbC50b2dnbGUoKVwiPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJmaWx0ZXJDcml0ZXJpYUNvdW50OyBlbHNlIGVtcHR5RmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgIFttYXRCYWRnZV09XCJmaWx0ZXJDcml0ZXJpYUNvdW50XCJcbiAgICAgICAgICAgICAgICAgIG1hdEJhZGdlQ29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgICAgICAgICAgbWF0QmFkZ2VTaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgbWF0QmFkZ2VQb3NpdGlvbj1cImFib3ZlIGFmdGVyXCI+ZmlsdGVyX2xpc3RfYWx0XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlGaWx0ZXI+XG4gICAgICAgICAgPG1hdC1pY29uPmZpbHRlcl9saXN0X2FsdDwvbWF0LWljb24+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjaGFzU2VsZWN0aW9uPlxuXG4gICAgICA8IS0tIGRlbGV0ZSAtLT5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiaGlkZGVuLXhzIGhpZGRlbi1zbVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9ERUxFVEUnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVTZWxlY3Rpb24oJGV2ZW50KVwiPlxuICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvaW9uLWJ1dHRvbnM+XG48L2FwcC10b29sYmFyPlxuXG48aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuXG4gIDwhLS0gZXJyb3IgLS0+XG4gIDxpb24taXRlbSAqbmdJZj1cImVycm9yU3ViamVjdHxhc3luYyA7IGxldCBlcnJvclwiIGxpbmVzPVwibm9uZVwiIEBzbGlkZVVwRG93bkFuaW1hdGlvbj5cbiAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICA8aW9uLWxhYmVsIGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckhUTUxdPVwiZXJyb3J8dHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gIDwvaW9uLWl0ZW0+XG5cbiAgPCEtLSBkZWJ1ZyAtLT5cbiAgPGFwcC1kZWJ1ZyAqbmdJZj1cImRlYnVnXCI+XG4gICAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgIDxpb24tcm93PlxuICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICBmb2N1c0NvbHVtbjoge3tmb2N1c0NvbHVtbn19PGJyLz5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgIDwvaW9uLWdyaWQ+XG4gIDwvYXBwLWRlYnVnPlxuXG4gIDwhLS0gc2VhcmNoIC0tPlxuICA8bWF0LWV4cGFuc2lvbi1wYW5lbCAjZmlsdGVyRXhwYW5zaW9uUGFuZWwgY2xhc3M9XCJpb24tbm8tcGFkZGluZyBmaWx0ZXItcGFuZWwgZmlsdGVyLXBhbmVsLWZsb2F0aW5nXCI+XG4gICAgPGZvcm0gY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBpb24tcGFkZGluZ1wiIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiIChuZ1N1Ym1pdCk9XCJvblJlZnJlc2guZW1pdCgpXCI+XG4gICAgICA8aW9uLWdyaWQ+XG4gICAgICAgIDxpb24tcm93PlxuICAgICAgICAgIDxpb24tY29sPlxuICAgICAgICAgICAgPCEtLSBzZWFyY2ggLS0+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1VTRVIuTElTVC5GSUxURVIuU0VBUkNIJ3x0cmFuc2xhdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hUZXh0XCI+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0U3VmZml4IHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckNvbnRyb2xWYWx1ZSgkZXZlbnQsIGZpbHRlckZvcm0uY29udHJvbHMuc2VhcmNoVGV4dClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiZmlsdGVyRm9ybS5jb250cm9scy5zZWFyY2hUZXh0LmRpc2FibGVkIHx8ICFmaWx0ZXJGb3JtLmNvbnRyb2xzLnNlYXJjaFRleHQudmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICA8IS0tIHN0YXR1cyAtLT5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwic3RhdHVzSWRcIiBbcGxhY2Vob2xkZXJdPVwiJ1VTRVIuU1RBVFVTJ3x0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwibnVsbFwiPjxpPjxzcGFuIHRyYW5zbGF0ZT5DT01NT04uRU1QVFlfT1BUSU9OPC9zcGFuPjwvaT48L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc3RhdHVzTGlzdFwiIFt2YWx1ZV09XCJpdGVtLmlkXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gW25hbWVdPVwiaXRlbS5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJDb250cm9sVmFsdWUoJGV2ZW50LCBmaWx0ZXJGb3JtLmNvbnRyb2xzLnN0YXR1c0lkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJmaWx0ZXJGb3JtLmNvbnRyb2xzLnN0YXR1c0lkLmRpc2FibGVkIHx8ICFmaWx0ZXJGb3JtLmNvbnRyb2xzLnN0YXR1c0lkLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgPC9pb24tZ3JpZD5cbiAgICA8L2Zvcm0+XG5cbiAgICA8bWF0LWFjdGlvbi1yb3c+XG4gICAgICA8IS0tIENvdW50ZXIgIC0tPlxuICAgICAgPGlvbi1sYWJlbCBbaGlkZGVuXT1cIihsb2FkaW5nU3ViamVjdHxhc3luYykgfHwgZmlsdGVyRm9ybS5kaXJ0eVwiXG4gICAgICAgICAgICAgICAgIFtjb2xvcl09XCJlbXB0eSAmJiAnZGFuZ2VyJ1wiXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgICAge3sgKHRvdGFsUm93Q291bnQgPyAnQ09NTU9OLlJFU1VMVF9DT1VOVCcgOiAnQ09NTU9OLk5PX1JFU1VMVCcpIHwgdHJhbnNsYXRlOiB7XG4gICAgICAgIGNvdW50OiAodG90YWxSb3dDb3VudCB8XG4gICAgICAgICAgbnVtYmVyRm9ybWF0KVxuICAgICAgfSB9fVxuICAgICAgPC9pb24tbGFiZWw+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXNwYWNlclwiPjwvZGl2PlxuXG4gICAgICA8IS0tIENsb3NlIHBhbmVsIC0tPlxuICAgICAgPGlvbi1idXR0b24gbWF0LWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpbHRlckV4cGFuc2lvblBhbmVsLmNsb3NlKClcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmdTdWJqZWN0fGFzeW5jXCI+XG4gICAgICAgIDxpb24tdGV4dCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9DTE9TRTwvaW9uLXRleHQ+XG4gICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgIDwhLS0gU2VhcmNoIGJ1dHRvbiAtLT5cbiAgICAgIDxpb24tYnV0dG9uIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJmaWx0ZXJGb3JtLmRpcnR5ID8gJ3RlcnRpYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgICAgICAgICBbZmlsbF09XCJmaWx0ZXJGb3JtLmRpcnR5ID8gJ3NvbGlkJyA6ICdjbGVhcidcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5RmlsdGVyQW5kQ2xvc2VQYW5lbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nU3ViamVjdHxhc3luY1wiPlxuICAgICAgICA8aW9uLXRleHQgdHJhbnNsYXRlPkNPTU1PTi5CVE5fQVBQTFk8L2lvbi10ZXh0PlxuICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgPC9tYXQtYWN0aW9uLXJvdz5cbiAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuXG4gIDwhLS0gZXJyb3IgLS0+XG4gIDxpb24taXRlbSAqbmdJZj1cImVycm9yU3ViamVjdHxhc3luYyA7IGxldCBlcnJvclwiIHZpc2libGUteHMgdmlzaWJsZS1zbSB2aXNpYmxlLW1vYmlsZSBsaW5lcz1cIm5vbmVcIj5cbiAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICA8aW9uLWxhYmVsIGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckhUTUxdPVwiZXJyb3J8dHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gIDwvaW9uLWl0ZW0+XG5cbiAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiPlxuICAgIDx0YWJsZSAjdGFibGUgbWF0LXRhYmxlIG1hdFNvcnRcbiAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgICAgICAgIFttYXRTb3J0QWN0aXZlXT1cImRlZmF1bHRTb3J0QnlcIiBbbWF0U29ydERpcmVjdGlvbl09XCJkZWZhdWx0U29ydERpcmVjdGlvblwiXG4gICAgICAgICAgIG1hdFNvcnREaXNhYmxlQ2xlYXIgW3RyYWNrQnldPVwidHJhY2tCeUZuXCI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCIgW3N0aWNreV09XCJ1c2VTdGlja3lcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCIhaW5saW5lRWRpdGlvblwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIiBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiBpc0FsbFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIWlubGluZUVkaXRpb25cIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cIiRldmVudCA/IHNlbGVjdGlvbi50b2dnbGUocm93KSA6IG51bGxcIiBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpXCI+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBJZCBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImlkXCIgW3N0aWNreV09XCJ1c2VTdGlja3lcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1sYWJlbD4jPC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj57eyByb3cuY3VycmVudERhdGEuaWQgfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gYXZhdGFyIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYXZhdGFyXCIgW3N0aWNreV09XCJ1c2VTdGlja3lcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhclwiICpuZ0lmPVwicm93LmN1cnJlbnREYXRhLmF2YXRhcjsgZWxzZSBnZW5lcmF0ZUljb25cIlxuICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWltYWdlJzondXJsKCcrcm93LmN1cnJlbnREYXRhLmF2YXRhcisnKSd9XCI+PC9kaXY+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNnZW5lcmF0ZUljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyXCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIzOFwiIHdpZHRoPVwiMzhcIiBbZGF0YS1qZGVudGljb24tdmFsdWVdPVwicm93LmN1cnJlbnREYXRhLmlkXCI+PC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gbGFzdE5hbWUgIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJsYXN0TmFtZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+VVNFUi5MQVNUX05BTUU8L3NwYW4+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiAoY2xpY2spPVwiZm9jdXNDb2x1bW49J2xhc3ROYW1lJ1wiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwibmV2ZXJcIj5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydsYXN0TmFtZSddXCJcbiAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1VTRVIuTEFTVF9OQU1FJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIhcm93LmVkaXRpbmdcIlxuICAgICAgICAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwicm93LmVkaXRpbmcgJiYgZm9jdXNDb2x1bW49PT0nbGFzdE5hbWUnXCI+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicm93LnZhbGlkYXRvci5jb250cm9sc1snbGFzdE5hbWUnXS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInJvdy52YWxpZGF0b3IuY29udHJvbHNbJ2xhc3ROYW1lJ10uaGFzRXJyb3IoJ21pbmxlbmd0aCcpXCI+XG4gICAgICAgICAgICAgIDxzcGFuPnt7J0VSUk9SLkZJRUxEX01JTl9MRU5HVEgnIHwgdHJhbnNsYXRlOiB7bWluTGVuZ3RoOiAyfSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvdGQ+XG5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIGZpcnN0bmFtZSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZmlyc3ROYW1lXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5VU0VSLkZJUlNUX05BTUU8L3NwYW4+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImZvY3VzQ29sdW1uPSdmaXJzdE5hbWUnXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XCJuZXZlclwiPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydmaXJzdE5hbWUnXVwiXG4gICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidVU0VSLkZJUlNUX05BTUUnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIiFyb3cuZWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgICAgW2FwcEF1dG9mb2N1c109XCJyb3cuZWRpdGluZyAmJiBmb2N1c0NvbHVtbj09PSdmaXJzdE5hbWUnXCI+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicm93LnZhbGlkYXRvci5jb250cm9sc1snZmlyc3ROYW1lJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydmaXJzdE5hbWUnXS5oYXNFcnJvcignbWlubGVuZ3RoJylcIj5cbiAgICAgICAgICAgICAgPHNwYW4+e3snRVJST1IuRklFTERfTUlOX0xFTkdUSCcgfCB0cmFuc2xhdGU6IHttaW5MZW5ndGg6IDJ9IH19PC9zcGFuPlxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIGVtYWlsICAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZW1haWxcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+XG4gICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlVTRVIuRU1BSUw8L3NwYW4+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiAoY2xpY2spPVwiZm9jdXNDb2x1bW49J2VtYWlsJ1wiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwibmV2ZXJcIj5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwicm93LnZhbGlkYXRvci5jb250cm9sc1snZW1haWwnXVwiXG4gICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidVU0VSLkVNQUlMJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIhcm93LmVkaXRpbmdcIlxuICAgICAgICAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwicm93LmVkaXRpbmcgJiYgZm9jdXNDb2x1bW49PT0nZW1haWwnXCI+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicm93LnZhbGlkYXRvci5jb250cm9sc1snZW1haWwnXS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInJvdy52YWxpZGF0b3IuY29udHJvbHNbJ2VtYWlsJ10uaGFzRXJyb3IoJ2VtYWlsJylcIj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkVSUk9SLkZJRUxEX05PVF9WQUxJRF9FTUFJTDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBhZGRpdGlvbmFsIGZpZWxkcyAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRlZmluaXRpb24gb2YgYWRkaXRpb25hbEZpZWxkc1wiIFttYXRDb2x1bW5EZWZdPVwiZGVmaW5pdGlvbi5rZXlcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICA8c3Bhbj57e2RlZmluaXRpb24ubGFiZWx8dHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImZvY3VzQ29sdW1uPWRlZmluaXRpb24ua2V5XCI+XG4gICAgICAgICAgPGFwcC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XCJuZXZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZpbml0aW9uXT1cImRlZmluaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicm93LnZhbGlkYXRvci5jb250cm9sc1tkZWZpbml0aW9uLmtleV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZGVmaW5pdGlvbi5leHRyYT8uYWNjb3VudD8ucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cInJvdy5lZGl0aW5nICYmIGZvY3VzQ29sdW1uPT09ZGVmaW5pdGlvbi5rZXlcIj5cbiAgICAgICAgICA8L2FwcC1mb3JtLWZpZWxkPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gcHJvZmlsZSBjb2x1bW4gIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwcm9maWxlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlVTRVIuUFJPRklMRTwvc3Bhbj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9jdXNDb2x1bW49J3Byb2ZpbGUnXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XCJuZXZlclwiPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cInJvdy52YWxpZGF0b3IuY29udHJvbHNbJ21haW5Qcm9maWxlJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidVU0VSLlBST0ZJTEUnfHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwcm9maWxlc1wiIFt2YWx1ZV09XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAge3sgKCdVU0VSLlBST0ZJTEVfRU5VTS4nICsgaXRlbSkgfCB1cHBlcmNhc2UgfHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicm93LnZhbGlkYXRvci5jb250cm9sc1snbWFpblByb2ZpbGUnXS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTdGF0dXMgY29sdW1uICAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic3RhdHVzXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlVTRVIuU1RBVFVTPC9zcGFuPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgICAgIChjbGljayk9XCJmb2N1c0NvbHVtbj0nc3RhdHVzJ1wiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwibmV2ZXJcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBtYXRQcmVmaXggKm5nSWY9XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydzdGF0dXNJZCddLnZhbHVlICZndDs9MFwiIFtuYW1lXT1cInN0YXR1c0J5SWRbcm93LnZhbGlkYXRvci5jb250cm9sc1snc3RhdHVzSWQnXS52YWx1ZV0/Lmljb25cIj48L2lvbi1pY29uPlxuXG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwicm93LnZhbGlkYXRvci5jb250cm9sc1snc3RhdHVzSWQnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1JFRkVSRU5USUFMLlNUQVRVUyd8dHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydzdGF0dXNJZCddLnZhbHVlICZndDs9MFwiPlxuICAgICAgICAgICAgICAgICAge3sgc3RhdHVzQnlJZFtyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydzdGF0dXNJZCddLnZhbHVlXT8ubGFiZWwgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIHN0YXR1c0xpc3RcIiBbdmFsdWVdPVwiaXRlbS5pZFwiPlxuICAgICAgICAgICAgICAgIDxpb24taWNvbiBbbmFtZV09XCJpdGVtLmljb25cIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicm93LnZhbGlkYXRvci5jb250cm9sc1snc3RhdHVzSWQnXS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSB1c2VybmFtZSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidXNlcm5hbWVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+XG4gICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlVTRVIuVVNFUk5BTUU8L3NwYW4+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImZvY3VzQ29sdW1uPSd1c2VybmFtZSdcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cIm5ldmVyXCIgPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzLnVzZXJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1VTRVIuVVNFUk5BTUUnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIiFyb3cuZWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgICAgW2FwcEF1dG9mb2N1c109XCJyb3cuZWRpdGluZyAmJiBmb2N1c0NvbHVtbj09PSd1c2VybmFtZSdcIj5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzLnVzZXJuYW1lLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIHVzZXJuYW1lIGV4dHJhbmV0IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ1c2VybmFtZUV4dHJhbmV0XCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5VU0VSLlVTRVJOQU1FX0VYVFJBTkVUPC9zcGFuPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgICAgIChjbGljayk9XCJmb2N1c0NvbHVtbj0ndXNlcm5hbWVFeHRyYW5ldCdcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cIm5ldmVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInJvdy52YWxpZGF0b3IuY29udHJvbHMudXNlcm5hbWVFeHRyYW5ldFwiXG4gICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidVU0VSLlVTRVJOQU1FX0VYVFJBTkVUJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIhcm93LmVkaXRpbmdcIlxuICAgICAgICAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwicm93LmVkaXRpbmcgJiYgZm9jdXNDb2x1bW49PT0ndXNlcm5hbWVFeHRyYW5ldCdcIj5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzLnVzZXJuYW1lRXh0cmFuZXQuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gcHVia2V5ICAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicHVia2V5XCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5VU0VSLlBVQktFWTwvc3Bhbj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICBbdGl0bGVdPVwicm93LnZhbGlkYXRvci5jb250cm9scy5wdWJrZXkudmFsdWVDaGFuZ2VzfGFzeW5jXCJcbiAgICAgICAgICAgIChjbGljayk9XCJmb2N1c0NvbHVtbj0ncHVia2V5J1wiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwibmV2ZXJcIj5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwicm93LnZhbGlkYXRvci5jb250cm9sc1sncHVia2V5J11cIiBbcGxhY2Vob2xkZXJdPVwiJ1VTRVIuUFVCS0VZJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIhcm93LmVkaXRpbmdcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzLnB1YmtleS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInJvdy52YWxpZGF0b3IuY29udHJvbHMucHVia2V5Lmhhc0Vycm9yKCdwdWJrZXknKVwiPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX1BVQktFWTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBBY3Rpb25zIGJ1dHRvbnMgY29sdW1uIC0tPlxuICAgICAgPGFwcC1hY3Rpb25zLWNvbHVtbiBbc3RpY2t5RW5kXT1cInVzZVN0aWNreVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zQ2xpY2spPVwib3BlblNlbGVjdENvbHVtbnNNb2RhbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbmNlbE9yRGVsZXRlQ2xpY2spPVwiY2FuY2VsT3JEZWxldGUoJGV2ZW50LmV2ZW50LCAkZXZlbnQucm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maXJtRWRpdENyZWF0ZUNsaWNrKT1cImNvbmZpcm1FZGl0Q3JlYXRlKCRldmVudC5ldmVudCwgJGV2ZW50LnJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlybUFuZEFkZENsaWNrKT1cImNvbmZpcm1BbmRBZGQoJGV2ZW50LmV2ZW50LCAkZXZlbnQucm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChiYWNrd2FyZCk9XCJjb25maXJtQW5kQmFja3dhcmQoJGV2ZW50LmV2ZW50LCAkZXZlbnQucm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChmb3J3YXJkKT1cImNvbmZpcm1BbmRGb3J3YXJkKCRldmVudC5ldmVudCwgJGV2ZW50LnJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuQ2FuY2VsXT1cImZhbHNlXCI+XG4gICAgICA8L2FwcC1hY3Rpb25zLWNvbHVtbj5cblxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnM7XCJcbiAgICAgICAgICBbY2xhc3MubWF0LXJvdy1lcnJvcl09XCJyb3cudmFsaWRhdG9yLmludmFsaWRcIlxuICAgICAgICAgIFtjbGFzcy5tYXQtcm93LWRpcnR5XT1cInJvdy5jdXJyZW50RGF0YS5kaXJ0eVwiXG4gICAgICAgICAgW2NsYXNzLm1hdC1yb3ctZGlzYWJsZWRdPVwiIXJvdy5lZGl0aW5nXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xpY2tSb3coJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwiZXNjYXBlRWRpdGluZ1JvdygkZXZlbnQpXCJcbiAgICAgICAgICBbY2RrVHJhcEZvY3VzXT1cIiFyb3cudmFsaWRhdG9yPy52YWxpZFwiPjwvdHI+XG4gICAgPC90YWJsZT5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nU3ViamVjdHxhc3luYzsgZWxzZSBub1Jlc3VsdFwiPlxuICAgICAgPGlvbi1pdGVtPlxuICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgYW5pbWF0ZWQ+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI25vUmVzdWx0PlxuICAgICAgPGlvbi1pdGVtICpuZ0lmPVwidG90YWxSb3dDb3VudCA9PT0gMFwiPlxuICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJkYW5nZXJcIiBjbGFzcz1cInRleHQtaXRhbGljXCIgdHJhbnNsYXRlPkNPTU1PTi5OT19SRVNVTFQ8L2lvbi10ZXh0PlxuICAgICAgPC9pb24taXRlbT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cbjwvaW9uLWNvbnRlbnQ+XG5cbjxpb24tZm9vdGVyPlxuICA8bWF0LXBhZ2luYXRvciBjbGFzcz1cIm1hdC1wYWdpbmF0b3ItZm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgW2xlbmd0aF09XCJ0b3RhbFJvd0NvdW50XCIgW3BhZ2VTaXplXT1cImRlZmF1bHRQYWdlU2l6ZVwiXG4gICAgICAgICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwiZGVmYXVsdFBhZ2VTaXplT3B0aW9uc1wiIHNob3dGaXJzdExhc3RCdXR0b25zPlxuICA8L21hdC1wYWdpbmF0b3I+XG5cbiAgPGFwcC1mb3JtLWJ1dHRvbnMtYmFyICpuZ0lmPVwiIW1vYmlsZSAmJiBpbmxpbmVFZGl0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkNhbmNlbCk9XCJvblJlZnJlc2guZW1pdCgpXCIgKG9uU2F2ZSk9XCJzYXZlKClcIiBbZGlzYWJsZWRdPVwiKGxvYWRpbmdTdWJqZWN0fGFzeW5jKSB8fCAhZGlydHlcIj48L2FwcC1mb3JtLWJ1dHRvbnMtYmFyPlxuPC9pb24tZm9vdGVyPlxuXG48aW9uLWZhYiBzbG90PVwiZml4ZWRcIiB2ZXJ0aWNhbD1cImJvdHRvbVwiIGhvcml6b250YWw9XCJlbmRcIiAqbmdJZj1cIm1vYmlsZVwiPlxuICA8aW9uLWZhYi1idXR0b24gY29sb3I9XCJ0ZXJ0aWFyeVwiIChjbGljayk9XCJhZGRSb3coKVwiPlxuICAgIDxpb24taWNvbiBuYW1lPVwiYWRkXCI+PC9pb24taWNvbj5cbiAgPC9pb24tZmFiLWJ1dHRvbj5cbjwvaW9uLWZhYj5cbiJdfQ==
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CoreModule } from '../../core/core.module';
|
|
3
|
+
import { UsersPage } from './users';
|
|
4
|
+
import { SocialModule } from '../../social/social.module';
|
|
5
|
+
import { NgxJdenticonModule } from 'ngx-jdenticon';
|
|
6
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
7
|
+
import { SharedMaterialModule } from '../../shared/material/material.module';
|
|
8
|
+
import { SharedDebugModule } from '../../shared/debug/debug.module';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@ngx-translate/core";
|
|
11
|
+
export class AdminUsersModule {
|
|
12
|
+
}
|
|
13
|
+
AdminUsersModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AdminUsersModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
14
|
+
AdminUsersModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: AdminUsersModule, declarations: [UsersPage], imports: [NgxJdenticonModule, i1.TranslateModule,
|
|
15
|
+
// App modules
|
|
16
|
+
CoreModule,
|
|
17
|
+
SocialModule,
|
|
18
|
+
SharedMaterialModule,
|
|
19
|
+
SharedDebugModule], exports: [SocialModule,
|
|
20
|
+
TranslateModule,
|
|
21
|
+
// Components
|
|
22
|
+
UsersPage] });
|
|
23
|
+
AdminUsersModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AdminUsersModule, imports: [NgxJdenticonModule,
|
|
24
|
+
TranslateModule.forChild(),
|
|
25
|
+
// App modules
|
|
26
|
+
CoreModule,
|
|
27
|
+
SocialModule,
|
|
28
|
+
SharedMaterialModule,
|
|
29
|
+
SharedDebugModule, SocialModule,
|
|
30
|
+
TranslateModule] });
|
|
31
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AdminUsersModule, decorators: [{
|
|
32
|
+
type: NgModule,
|
|
33
|
+
args: [{
|
|
34
|
+
imports: [
|
|
35
|
+
NgxJdenticonModule,
|
|
36
|
+
TranslateModule.forChild(),
|
|
37
|
+
// App modules
|
|
38
|
+
CoreModule,
|
|
39
|
+
SocialModule,
|
|
40
|
+
SharedMaterialModule,
|
|
41
|
+
SharedDebugModule
|
|
42
|
+
],
|
|
43
|
+
declarations: [
|
|
44
|
+
UsersPage
|
|
45
|
+
],
|
|
46
|
+
exports: [
|
|
47
|
+
SocialModule,
|
|
48
|
+
TranslateModule,
|
|
49
|
+
// Components
|
|
50
|
+
UsersPage
|
|
51
|
+
]
|
|
52
|
+
}]
|
|
53
|
+
}] });
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnMubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9hZG1pbi91c2Vycy91c2Vycy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV2QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDeEQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUMzRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQzs7O0FBd0JsRSxNQUFNLE9BQU8sZ0JBQWdCOzs2R0FBaEIsZ0JBQWdCOzhHQUFoQixnQkFBZ0IsaUJBVnpCLFNBQVMsYUFWVCxrQkFBa0I7UUFHbEIsY0FBYztRQUNkLFVBQVU7UUFDVixZQUFZO1FBQ1osb0JBQW9CO1FBQ3BCLGlCQUFpQixhQU1qQixZQUFZO1FBQ1osZUFBZTtRQUVmLGFBQWE7UUFDYixTQUFTOzhHQUdBLGdCQUFnQixZQXBCekIsa0JBQWtCO1FBQ2xCLGVBQWUsQ0FBQyxRQUFRLEVBQUU7UUFFMUIsY0FBYztRQUNkLFVBQVU7UUFDVixZQUFZO1FBQ1osb0JBQW9CO1FBQ3BCLGlCQUFpQixFQU1qQixZQUFZO1FBQ1osZUFBZTsyRkFNTixnQkFBZ0I7a0JBdEI1QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxrQkFBa0I7d0JBQ2xCLGVBQWUsQ0FBQyxRQUFRLEVBQUU7d0JBRTFCLGNBQWM7d0JBQ2QsVUFBVTt3QkFDVixZQUFZO3dCQUNaLG9CQUFvQjt3QkFDcEIsaUJBQWlCO3FCQUNsQjtvQkFDRCxZQUFZLEVBQUU7d0JBQ1osU0FBUztxQkFDVjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixlQUFlO3dCQUVmLGFBQWE7d0JBQ2IsU0FBUztxQkFDVjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TmdNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0NvcmVNb2R1bGV9IGZyb20gJy4uLy4uL2NvcmUvY29yZS5tb2R1bGUnO1xuaW1wb3J0IHtVc2Vyc1BhZ2V9IGZyb20gJy4vdXNlcnMnO1xuaW1wb3J0IHtTb2NpYWxNb2R1bGV9IGZyb20gJy4uLy4uL3NvY2lhbC9zb2NpYWwubW9kdWxlJztcbmltcG9ydCB7Tmd4SmRlbnRpY29uTW9kdWxlfSBmcm9tICduZ3gtamRlbnRpY29uJztcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7U2hhcmVkTWF0ZXJpYWxNb2R1bGV9IGZyb20gJy4uLy4uL3NoYXJlZC9tYXRlcmlhbC9tYXRlcmlhbC5tb2R1bGUnO1xuaW1wb3J0IHtTaGFyZWREZWJ1Z01vZHVsZX0gZnJvbSAnLi4vLi4vc2hhcmVkL2RlYnVnL2RlYnVnLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICBOZ3hKZGVudGljb25Nb2R1bGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLmZvckNoaWxkKCksXG5cbiAgICAvLyBBcHAgbW9kdWxlc1xuICAgIENvcmVNb2R1bGUsXG4gICAgU29jaWFsTW9kdWxlLFxuICAgIFNoYXJlZE1hdGVyaWFsTW9kdWxlLFxuICAgIFNoYXJlZERlYnVnTW9kdWxlXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFVzZXJzUGFnZVxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgU29jaWFsTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcblxuICAgIC8vIENvbXBvbmVudHNcbiAgICBVc2Vyc1BhZ2VcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBBZG1pblVzZXJzTW9kdWxlIHtcbn1cbiJdfQ==
|