@sumaris-net/ngx-components 18.23.63 → 21.0.0-rc1
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/README.md +2 -0
- package/doc/build.md +3 -5
- package/fesm2022/sumaris-net.ngx-components.mjs +2382 -2150
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +15 -15
- package/src/assets/environments/environment-test.json +2 -2
- package/src/assets/i18n/fr.json +6 -5
- package/src/assets/manifest.json +1 -1
- package/src/theme/_icons.scss +8 -12
- package/src/theme/_ionic.globals.scss +8 -1
- package/src/theme/_material.globals.scss +4 -1
- package/src/theme/_material.scss +16 -13
- package/src/theme/_mixins.scss +7 -1
- package/src/theme/_ngx-components.forms.scss +87 -84
- package/src/theme/_ngx-components.globals.scss +2 -0
- package/src/theme/_ngx-components.scss +19 -4
- package/src/theme/_ngx-components.table.scss +31 -26
- package/src/theme/_ngx-components.tabs.scss +16 -14
- package/src/theme/_responsive.scss +2 -0
- package/src/theme/_roboto.scss +3 -0
- package/src/theme/_theme.scss +11 -14
- package/src/theme/_theme.variables.scss +6 -1
- package/src/theme/ionic/ionic.functions.color.scss +13 -5
- package/src/theme/ionic/ionic.globals.scss +4 -4
- package/src/theme/ionic/ionic.theme.default.scss +2 -0
- package/types/sumaris-net.ngx-components.d.ts +14132 -0
- package/esm2022/public_api.mjs +0 -403
- package/esm2022/src/app/admin/admin-routing.module.mjs +0 -34
- package/esm2022/src/app/admin/admin.module.mjs +0 -32
- package/esm2022/src/app/admin/users/person.filter.mjs +0 -157
- package/esm2022/src/app/admin/users/person.service.mjs +0 -226
- package/esm2022/src/app/admin/users/person.validator.mjs +0 -78
- package/esm2022/src/app/admin/users/users-select.modal.mjs +0 -167
- package/esm2022/src/app/admin/users/users.mjs +0 -502
- package/esm2022/src/app/admin/users/users.module.mjs +0 -59
- package/esm2022/src/app/admin/users/users.utils.mjs +0 -29
- package/esm2022/src/app/core/about/about.modal.mjs +0 -119
- package/esm2022/src/app/core/about/about.module.mjs +0 -22
- package/esm2022/src/app/core/account/account.module.mjs +0 -75
- package/esm2022/src/app/core/account/account.page.mjs +0 -426
- package/esm2022/src/app/core/account/new-token.form.mjs +0 -109
- package/esm2022/src/app/core/account/new-token.modal.mjs +0 -66
- package/esm2022/src/app/core/account/password/change-password.form.mjs +0 -63
- package/esm2022/src/app/core/account/password/change-password.module.mjs +0 -22
- package/esm2022/src/app/core/account/password/change-password.page.mjs +0 -150
- package/esm2022/src/app/core/account/token.table.mjs +0 -160
- package/esm2022/src/app/core/auth/auth.form.mjs +0 -159
- package/esm2022/src/app/core/auth/auth.modal.mjs +0 -76
- package/esm2022/src/app/core/auth/auth.module.mjs +0 -56
- package/esm2022/src/app/core/auth/reset-password.modal.mjs +0 -89
- package/esm2022/src/app/core/core.module.mjs +0 -157
- package/esm2022/src/app/core/core.testing.module.mjs +0 -128
- package/esm2022/src/app/core/form/array/form-array.mjs +0 -328
- package/esm2022/src/app/core/form/array/testing/form-array-test.module.mjs +0 -23
- package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +0 -97
- package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -111
- package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +0 -31
- package/esm2022/src/app/core/form/entity/editor.class.mjs +0 -268
- package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -420
- package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +0 -748
- package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +0 -25
- package/esm2022/src/app/core/form/entity/entity.module.mjs +0 -33
- package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +0 -190
- package/esm2022/src/app/core/form/form-container.class.mjs +0 -347
- package/esm2022/src/app/core/form/form.class.mjs +0 -342
- package/esm2022/src/app/core/form/form.module.mjs +0 -77
- package/esm2022/src/app/core/form/form.utils.mjs +0 -238
- package/esm2022/src/app/core/form/list/list.form.mjs +0 -243
- package/esm2022/src/app/core/form/list/list.module.mjs +0 -31
- package/esm2022/src/app/core/form/properties/properties-file.service.mjs +0 -133
- package/esm2022/src/app/core/form/properties/properties.form.mjs +0 -397
- package/esm2022/src/app/core/form/properties/properties.module.mjs +0 -85
- package/esm2022/src/app/core/form/properties/properties.table.mjs +0 -267
- package/esm2022/src/app/core/form/properties/properties.utils.mjs +0 -304
- package/esm2022/src/app/core/form/properties/property.validator.mjs +0 -70
- package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +0 -103
- package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +0 -23
- package/esm2022/src/app/core/form/text/testing/text-form.testing.mjs +0 -42
- package/esm2022/src/app/core/form/text/testing/text-form.testing.module.mjs +0 -25
- package/esm2022/src/app/core/form/text/text-form.component.mjs +0 -205
- package/esm2022/src/app/core/form/text/text-form.module.mjs +0 -31
- package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -73
- package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +0 -22
- package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +0 -164
- package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +0 -32
- package/esm2022/src/app/core/form/username/username.form.mjs +0 -55
- package/esm2022/src/app/core/form/username/username.module.mjs +0 -20
- package/esm2022/src/app/core/graphql/graphql.module.mjs +0 -14
- package/esm2022/src/app/core/graphql/graphql.service.mjs +0 -781
- package/esm2022/src/app/core/graphql/graphql.utils.mjs +0 -119
- package/esm2022/src/app/core/home/home.mjs +0 -472
- package/esm2022/src/app/core/home/home.module.mjs +0 -54
- package/esm2022/src/app/core/icon/icon.component.mjs +0 -40
- package/esm2022/src/app/core/icon/icon.module.mjs +0 -20
- package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +0 -394
- package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +0 -31
- package/esm2022/src/app/core/menu/menu.component.mjs +0 -273
- package/esm2022/src/app/core/menu/menu.model.mjs +0 -328
- package/esm2022/src/app/core/menu/menu.module.mjs +0 -47
- package/esm2022/src/app/core/menu/menu.service.mjs +0 -666
- package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +0 -113
- package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +0 -51
- package/esm2022/src/app/core/menu/testing/menu.testing.mjs +0 -165
- package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +0 -60
- package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +0 -28
- package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +0 -31
- package/esm2022/src/app/core/peer/select-peer.modal.mjs +0 -350
- package/esm2022/src/app/core/peer/select-peer.module.mjs +0 -36
- package/esm2022/src/app/core/register/register-confirm.page.mjs +0 -90
- package/esm2022/src/app/core/register/register.form.mjs +0 -197
- package/esm2022/src/app/core/register/register.modal.mjs +0 -55
- package/esm2022/src/app/core/register/register.module.mjs +0 -23
- package/esm2022/src/app/core/services/account.service.mjs +0 -1403
- package/esm2022/src/app/core/services/auth-guard.service.mjs +0 -74
- package/esm2022/src/app/core/services/base-entity-service.class.mjs +0 -499
- package/esm2022/src/app/core/services/base-graphql-service.class.mjs +0 -224
- package/esm2022/src/app/core/services/base58.mjs +0 -83
- package/esm2022/src/app/core/services/config/core.config.mjs +0 -293
- package/esm2022/src/app/core/services/config.service.mjs +0 -384
- package/esm2022/src/app/core/services/crypto.service.mjs +0 -107
- package/esm2022/src/app/core/services/errors.mjs +0 -54
- package/esm2022/src/app/core/services/local-settings.service.mjs +0 -540
- package/esm2022/src/app/core/services/model/account.model.mjs +0 -192
- package/esm2022/src/app/core/services/model/config.model.mjs +0 -111
- package/esm2022/src/app/core/services/model/department.model.mjs +0 -35
- package/esm2022/src/app/core/services/model/entity.decorators.mjs +0 -97
- package/esm2022/src/app/core/services/model/entity.model.mjs +0 -347
- package/esm2022/src/app/core/services/model/filter.model.mjs +0 -169
- package/esm2022/src/app/core/services/model/history.model.mjs +0 -2
- package/esm2022/src/app/core/services/model/model.enum.mjs +0 -11
- package/esm2022/src/app/core/services/model/node-feature.model.mjs +0 -31
- package/esm2022/src/app/core/services/model/peer.model.mjs +0 -114
- package/esm2022/src/app/core/services/model/person.model.mjs +0 -118
- package/esm2022/src/app/core/services/model/referential.model.mjs +0 -207
- package/esm2022/src/app/core/services/model/settings.model.mjs +0 -6
- package/esm2022/src/app/core/services/model/token.model.mjs +0 -57
- package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +0 -234
- package/esm2022/src/app/core/services/network.service.mjs +0 -759
- package/esm2022/src/app/core/services/network.types.mjs +0 -2
- package/esm2022/src/app/core/services/network.utils.mjs +0 -35
- package/esm2022/src/app/core/services/pipes/account.pipes.mjs +0 -38
- package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +0 -23
- package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +0 -23
- package/esm2022/src/app/core/services/pipes/pipes.module.mjs +0 -58
- package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +0 -36
- package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +0 -37
- package/esm2022/src/app/core/services/platform.service.mjs +0 -780
- package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +0 -427
- package/esm2022/src/app/core/services/storage/entity-store.class.mjs +0 -450
- package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +0 -25
- package/esm2022/src/app/core/services/testing/referential.validator.mjs +0 -46
- package/esm2022/src/app/core/services/validator/account.validator.mjs +0 -46
- package/esm2022/src/app/core/services/validator/base.validator.class.mjs +0 -49
- package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +0 -57
- package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +0 -27
- package/esm2022/src/app/core/services/validator/user-token.validator.mjs +0 -55
- package/esm2022/src/app/core/settings/settings.module.mjs +0 -23
- package/esm2022/src/app/core/settings/settings.page.mjs +0 -406
- package/esm2022/src/app/core/table/async-table.class.mjs +0 -1882
- package/esm2022/src/app/core/table/column/actions-column.component.mjs +0 -137
- package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +0 -120
- package/esm2022/src/app/core/table/column/row-field.component.mjs +0 -116
- package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +0 -415
- package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +0 -407
- package/esm2022/src/app/core/table/memory-table.class.mjs +0 -57
- package/esm2022/src/app/core/table/table-select-columns.component.mjs +0 -46
- package/esm2022/src/app/core/table/table.class.mjs +0 -1918
- package/esm2022/src/app/core/table/table.model.mjs +0 -21
- package/esm2022/src/app/core/table/table.module.mjs +0 -51
- package/esm2022/src/app/core/table/table.pipes.mjs +0 -76
- package/esm2022/src/app/core/table/table.utils.mjs +0 -34
- package/esm2022/src/app/core/table/testing/nested-table.testing.mjs +0 -326
- package/esm2022/src/app/core/table/testing/table-validator.service.mjs +0 -32
- package/esm2022/src/app/core/table/testing/table.testing.mjs +0 -342
- package/esm2022/src/app/core/table/testing/table.testing.module.mjs +0 -47
- package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +0 -25
- package/esm2022/src/app/core/table/testing/table2.testing.mjs +0 -322
- package/esm2022/src/app/shared/alerts.mjs +0 -243
- package/esm2022/src/app/shared/audio/audio.mjs +0 -255
- package/esm2022/src/app/shared/audio/audio.testing.mjs +0 -32
- package/esm2022/src/app/shared/audio/audio.testing.module.mjs +0 -30
- package/esm2022/src/app/shared/base64.utils.mjs +0 -59
- package/esm2022/src/app/shared/capacitor/keyboard.mjs +0 -42
- package/esm2022/src/app/shared/capacitor/plugins.mjs +0 -10
- package/esm2022/src/app/shared/constants.mjs +0 -18
- package/esm2022/src/app/shared/dates.mjs +0 -212
- package/esm2022/src/app/shared/debug/debug-service.class.mjs +0 -3
- package/esm2022/src/app/shared/debug/debug.component.mjs +0 -44
- package/esm2022/src/app/shared/debug/debug.module.mjs +0 -23
- package/esm2022/src/app/shared/directives/autofocus.directive.mjs +0 -91
- package/esm2022/src/app/shared/directives/autoresize.directive.mjs +0 -75
- package/esm2022/src/app/shared/directives/autotitle.directive.mjs +0 -30
- package/esm2022/src/app/shared/directives/autotooltip.directive.mjs +0 -35
- package/esm2022/src/app/shared/directives/cell-selection/cell-identifier.directive.mjs +0 -55
- package/esm2022/src/app/shared/directives/cell-selection/cell-selection.directive.mjs +0 -206
- package/esm2022/src/app/shared/directives/cell-selection/cell-selection.service.mjs +0 -204
- package/esm2022/src/app/shared/directives/directives.module.mjs +0 -53
- package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +0 -52
- package/esm2022/src/app/shared/directives/ng-var.directive.mjs +0 -33
- package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +0 -62
- package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +0 -96
- package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +0 -17
- package/esm2022/src/app/shared/directives/throttled-click.directive.mjs +0 -43
- package/esm2022/src/app/shared/events.mjs +0 -64
- package/esm2022/src/app/shared/file/csv.utils.mjs +0 -97
- package/esm2022/src/app/shared/file/file.service.mjs +0 -118
- package/esm2022/src/app/shared/file/file.utils.mjs +0 -117
- package/esm2022/src/app/shared/file/images.utils.mjs +0 -186
- package/esm2022/src/app/shared/file/json.utils.mjs +0 -58
- package/esm2022/src/app/shared/file/uri.utils.mjs +0 -29
- package/esm2022/src/app/shared/file/url.utils.mjs +0 -213
- package/esm2022/src/app/shared/focusable.mjs +0 -6
- package/esm2022/src/app/shared/form/field.component.mjs +0 -388
- package/esm2022/src/app/shared/form/field.model.mjs +0 -100
- package/esm2022/src/app/shared/form/loading-spinner.mjs +0 -35
- package/esm2022/src/app/shared/forms.mjs +0 -593
- package/esm2022/src/app/shared/functions.mjs +0 -825
- package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +0 -94
- package/esm2022/src/app/shared/gesture/gesture-config.mjs +0 -46
- package/esm2022/src/app/shared/gesture/hammer.utils.mjs +0 -2
- package/esm2022/src/app/shared/graph/colors.utils.mjs +0 -85
- package/esm2022/src/app/shared/graph/graph-colors.mjs +0 -214
- package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +0 -68
- package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
- package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +0 -147
- package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +0 -24
- package/esm2022/src/app/shared/html.utils.mjs +0 -35
- package/esm2022/src/app/shared/http/http.utils.mjs +0 -56
- package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +0 -452
- package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +0 -62
- package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -26
- package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -92
- package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -37
- package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +0 -59
- package/esm2022/src/app/shared/image/image.model.mjs +0 -2
- package/esm2022/src/app/shared/image/image.module.mjs +0 -24
- package/esm2022/src/app/shared/image/image.service.mjs +0 -117
- package/esm2022/src/app/shared/inputs.mjs +0 -281
- package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
- package/esm2022/src/app/shared/logging/log-level.model.mjs +0 -48
- package/esm2022/src/app/shared/logging/logger.model.mjs +0 -47
- package/esm2022/src/app/shared/logging/logging-service.class.mjs +0 -125
- package/esm2022/src/app/shared/logging/logging-service.config.mjs +0 -2
- package/esm2022/src/app/shared/logging/logging-service.module.mjs +0 -30
- package/esm2022/src/app/shared/markdown/markdown.component.mjs +0 -321
- package/esm2022/src/app/shared/markdown/markdown.directive.mjs +0 -34
- package/esm2022/src/app/shared/markdown/markdown.modal.mjs +0 -99
- package/esm2022/src/app/shared/markdown/markdown.module.mjs +0 -87
- package/esm2022/src/app/shared/markdown/markdown.service.mjs +0 -204
- package/esm2022/src/app/shared/markdown/markdown.utils.mjs +0 -87
- package/esm2022/src/app/shared/markdown/testing/markdown.test.mjs +0 -55
- package/esm2022/src/app/shared/markdown/testing/markdown.testing.module.mjs +0 -30
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -46
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -1356
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -81
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -18
- package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -242
- package/esm2022/src/app/shared/material/badge/badge.directive.mjs +0 -251
- package/esm2022/src/app/shared/material/badge/badge.module.mjs +0 -20
- package/esm2022/src/app/shared/material/badge/badge.test.mjs +0 -42
- package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +0 -70
- package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +0 -374
- package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +0 -83
- package/esm2022/src/app/shared/material/chips/chips.module.mjs +0 -74
- package/esm2022/src/app/shared/material/chips/material.chips.mjs +0 -843
- package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +0 -151
- package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +0 -79
- package/esm2022/src/app/shared/material/datetime/material.date.mjs +0 -473
- package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +0 -457
- package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +0 -850
- package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -140
- package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -127
- package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -118
- package/esm2022/src/app/shared/material/duration/duration.module.mjs +0 -61
- package/esm2022/src/app/shared/material/duration/duration.utils.mjs +0 -16
- package/esm2022/src/app/shared/material/duration/material.duration.mjs +0 -283
- package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +0 -85
- package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +0 -319
- package/esm2022/src/app/shared/material/latlong/material.latlong-input.mjs +0 -471
- package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +0 -231
- package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +0 -68
- package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -138
- package/esm2022/src/app/shared/material/material.animations.mjs +0 -200
- package/esm2022/src/app/shared/material/material.config.mjs +0 -3
- package/esm2022/src/app/shared/material/material.module.mjs +0 -224
- package/esm2022/src/app/shared/material/material.testing.module.mjs +0 -234
- package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -51
- package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -23
- package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +0 -379
- package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +0 -52
- package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -67
- package/esm2022/src/app/shared/material/test/test-component.mjs +0 -264
- package/esm2022/src/app/shared/material/testing/common.test.mjs +0 -111
- package/esm2022/src/app/shared/modules.mjs +0 -12
- package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -306
- package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +0 -49
- package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +0 -24
- package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +0 -69
- package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +0 -74
- package/esm2022/src/app/shared/named-filter/testing/named-filter.testing.module.mjs +0 -28
- package/esm2022/src/app/shared/observables.mjs +0 -104
- package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +0 -251
- package/esm2022/src/app/shared/pipes/badge.pipes.mjs +0 -25
- package/esm2022/src/app/shared/pipes/colors.pipe.mjs +0 -29
- package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -50
- package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +0 -72
- package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +0 -28
- package/esm2022/src/app/shared/pipes/date-from.pipe.mjs +0 -29
- package/esm2022/src/app/shared/pipes/dates.pipe.mjs +0 -18
- package/esm2022/src/app/shared/pipes/display-with.pipe.mjs +0 -23
- package/esm2022/src/app/shared/pipes/duration.pipe.mjs +0 -34
- package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +0 -53
- package/esm2022/src/app/shared/pipes/form.pipes.mjs +0 -219
- package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +0 -50
- package/esm2022/src/app/shared/pipes/html.pipes.mjs +0 -102
- package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +0 -42
- package/esm2022/src/app/shared/pipes/maps.pipe.mjs +0 -65
- package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +0 -67
- package/esm2022/src/app/shared/pipes/math.pipes.mjs +0 -77
- package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +0 -19
- package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +0 -17
- package/esm2022/src/app/shared/pipes/observable.pipes.mjs +0 -63
- package/esm2022/src/app/shared/pipes/pipes.module.mjs +0 -304
- package/esm2022/src/app/shared/pipes/property.pipes.mjs +0 -148
- package/esm2022/src/app/shared/pipes/selection.pipes.mjs +0 -177
- package/esm2022/src/app/shared/pipes/string.pipes.mjs +0 -183
- package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +0 -44
- package/esm2022/src/app/shared/pipes/types.pipes.mjs +0 -74
- package/esm2022/src/app/shared/pipes/url.pipes.mjs +0 -35
- package/esm2022/src/app/shared/platforms.mjs +0 -81
- package/esm2022/src/app/shared/print/print.service.mjs +0 -305
- package/esm2022/src/app/shared/regexps.mjs +0 -103
- package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +0 -193
- package/esm2022/src/app/shared/rx-state/rx-state.module.mjs +0 -19
- package/esm2022/src/app/shared/rx-state/rx-state.types.mjs +0 -2
- package/esm2022/src/app/shared/services/entity-service.class.mjs +0 -44
- package/esm2022/src/app/shared/services/job.utils.mjs +0 -92
- package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +0 -362
- package/esm2022/src/app/shared/services/progress-bar.service.mjs +0 -31
- package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +0 -144
- package/esm2022/src/app/shared/services/startable-service.class.mjs +0 -118
- package/esm2022/src/app/shared/services/translate-context.service.mjs +0 -107
- package/esm2022/src/app/shared/services/validator-service.class.mjs +0 -2
- package/esm2022/src/app/shared/services.mjs +0 -85
- package/esm2022/src/app/shared/shared-routing.module.mjs +0 -72
- package/esm2022/src/app/shared/shared.module.mjs +0 -229
- package/esm2022/src/app/shared/shared.testing.module.mjs +0 -108
- package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +0 -281
- package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +0 -42
- package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +0 -27
- package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +0 -25
- package/esm2022/src/app/shared/storage/storage.service.mjs +0 -134
- package/esm2022/src/app/shared/storage/storage.utils.mjs +0 -13
- package/esm2022/src/app/shared/testing/maskito.test.mjs +0 -41
- package/esm2022/src/app/shared/testing/observable.test.mjs +0 -94
- package/esm2022/src/app/shared/testing/tests.page.mjs +0 -37
- package/esm2022/src/app/shared/toast/toast.testing.mjs +0 -54
- package/esm2022/src/app/shared/toast/toast.testing.module.mjs +0 -31
- package/esm2022/src/app/shared/toast/toasts.mjs +0 -134
- package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +0 -62
- package/esm2022/src/app/shared/toolbar/toolbar.mjs +0 -272
- package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +0 -26
- package/esm2022/src/app/shared/types.mjs +0 -2
- package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -59
- package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +0 -30
- package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -108
- package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +0 -216
- package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +0 -26
- package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +0 -122
- package/esm2022/src/app/shared/validator/validators.mjs +0 -658
- package/esm2022/src/app/shared/version/versions.mjs +0 -81
- package/esm2022/src/app/social/config/social.config.mjs +0 -9
- package/esm2022/src/app/social/feed/feed.component.mjs +0 -317
- package/esm2022/src/app/social/feed/feed.directive.mjs +0 -151
- package/esm2022/src/app/social/feed/feed.model.mjs +0 -60
- package/esm2022/src/app/social/feed/feed.module.mjs +0 -24
- package/esm2022/src/app/social/feed/feed.page.mjs +0 -67
- package/esm2022/src/app/social/feed/feed.service.mjs +0 -222
- package/esm2022/src/app/social/feed/testing/feed.testing.mjs +0 -66
- package/esm2022/src/app/social/feed/testing/feed.testing.module.mjs +0 -23
- package/esm2022/src/app/social/job/job.module.mjs +0 -23
- package/esm2022/src/app/social/job/progression/job-progression.component.mjs +0 -38
- package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +0 -241
- package/esm2022/src/app/social/job/progression/job-progression.list.mjs +0 -50
- package/esm2022/src/app/social/job/progression/job-progression.model.mjs +0 -29
- package/esm2022/src/app/social/job/progression/job-progression.service.mjs +0 -91
- package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +0 -38
- package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +0 -34
- package/esm2022/src/app/social/job/testing/job.testing.module.mjs +0 -22
- package/esm2022/src/app/social/message/message.form.mjs +0 -149
- package/esm2022/src/app/social/message/message.modal.mjs +0 -116
- package/esm2022/src/app/social/message/message.model.mjs +0 -86
- package/esm2022/src/app/social/message/message.module.mjs +0 -25
- package/esm2022/src/app/social/message/message.service.mjs +0 -198
- package/esm2022/src/app/social/social.errors.mjs +0 -11
- package/esm2022/src/app/social/social.module.mjs +0 -22
- package/esm2022/src/app/social/social.testing.module.mjs +0 -72
- package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -191
- package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -280
- package/esm2022/src/app/social/user-event/notification/user-event-notification.modal.mjs +0 -84
- package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +0 -273
- package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -129
- package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +0 -22
- package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -128
- package/esm2022/src/app/social/user-event/user-event.model.mjs +0 -2
- package/esm2022/src/app/social/user-event/user-event.module.mjs +0 -24
- package/esm2022/src/app/social/user-event/user-event.service.mjs +0 -512
- package/esm2022/src/environments/environment.class.mjs +0 -69
- package/esm2022/src/environments/environment.loader.mjs +0 -77
- package/esm2022/src/environments/environment.mjs +0 -133
- package/esm2022/sumaris-net.ngx-components.mjs +0 -5
- package/index.d.ts +0 -5
- package/public_api.d.ts +0 -364
- package/src/app/admin/admin-routing.module.d.ts +0 -9
- package/src/app/admin/admin.module.d.ts +0 -10
- package/src/app/admin/users/person.filter.d.ts +0 -37
- package/src/app/admin/users/person.service.d.ts +0 -61
- package/src/app/admin/users/person.validator.d.ts +0 -23
- package/src/app/admin/users/users-select.modal.d.ts +0 -73
- package/src/app/admin/users/users.d.ts +0 -89
- package/src/app/admin/users/users.module.d.ts +0 -15
- package/src/app/admin/users/users.utils.d.ts +0 -6
- package/src/app/core/about/about.modal.d.ts +0 -44
- package/src/app/core/about/about.module.d.ts +0 -11
- package/src/app/core/account/account.module.d.ts +0 -18
- package/src/app/core/account/account.page.d.ts +0 -93
- package/src/app/core/account/new-token.form.d.ts +0 -30
- package/src/app/core/account/new-token.modal.d.ts +0 -29
- package/src/app/core/account/password/change-password.form.d.ts +0 -19
- package/src/app/core/account/password/change-password.module.d.ts +0 -11
- package/src/app/core/account/password/change-password.page.d.ts +0 -36
- package/src/app/core/account/token.table.d.ts +0 -28
- package/src/app/core/auth/auth.form.d.ts +0 -38
- package/src/app/core/auth/auth.modal.d.ts +0 -24
- package/src/app/core/auth/auth.module.d.ts +0 -13
- package/src/app/core/auth/reset-password.modal.d.ts +0 -29
- package/src/app/core/core.module.d.ts +0 -28
- package/src/app/core/core.testing.module.d.ts +0 -16
- package/src/app/core/form/array/form-array.d.ts +0 -147
- package/src/app/core/form/array/testing/form-array-test.module.d.ts +0 -12
- package/src/app/core/form/array/testing/form-array.test.d.ts +0 -27
- package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +0 -38
- package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +0 -9
- package/src/app/core/form/entity/editor.class.d.ts +0 -85
- package/src/app/core/form/entity/entity-editor-modal.class.d.ts +0 -126
- package/src/app/core/form/entity/entity-editor.class.d.ts +0 -211
- package/src/app/core/form/entity/entity-metadata.component.d.ts +0 -13
- package/src/app/core/form/entity/entity.module.d.ts +0 -11
- package/src/app/core/form/entity/tab-editor.class.d.ts +0 -66
- package/src/app/core/form/form-container.class.d.ts +0 -131
- package/src/app/core/form/form.class.d.ts +0 -148
- package/src/app/core/form/form.module.d.ts +0 -15
- package/src/app/core/form/form.utils.d.ts +0 -301
- package/src/app/core/form/list/list.form.d.ts +0 -83
- package/src/app/core/form/list/list.module.d.ts +0 -9
- package/src/app/core/form/properties/properties-file.service.d.ts +0 -26
- package/src/app/core/form/properties/properties.form.d.ts +0 -109
- package/src/app/core/form/properties/properties.module.d.ts +0 -18
- package/src/app/core/form/properties/properties.table.d.ts +0 -73
- package/src/app/core/form/properties/properties.utils.d.ts +0 -59
- package/src/app/core/form/properties/property.validator.d.ts +0 -27
- package/src/app/core/form/properties/testing/properties-form.test.d.ts +0 -22
- package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +0 -12
- package/src/app/core/form/text/testing/text-form.testing.d.ts +0 -19
- package/src/app/core/form/text/testing/text-form.testing.module.d.ts +0 -14
- package/src/app/core/form/text/text-form.component.d.ts +0 -66
- package/src/app/core/form/text/text-form.module.d.ts +0 -9
- package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +0 -16
- package/src/app/core/form/text-popover/testing/text-popover.testing.module.d.ts +0 -11
- package/src/app/core/form/text-popover/text-popover.component.d.ts +0 -81
- package/src/app/core/form/text-popover/text-popover.module.d.ts +0 -10
- package/src/app/core/form/username/username.form.d.ts +0 -19
- package/src/app/core/form/username/username.module.d.ts +0 -9
- package/src/app/core/graphql/graphql.module.d.ts +0 -7
- package/src/app/core/graphql/graphql.service.d.ts +0 -138
- package/src/app/core/graphql/graphql.utils.d.ts +0 -47
- package/src/app/core/home/home.d.ts +0 -135
- package/src/app/core/home/home.module.d.ts +0 -16
- package/src/app/core/icon/icon.component.d.ts +0 -13
- package/src/app/core/icon/icon.module.d.ts +0 -9
- package/src/app/core/install/install-upgrade-card.component.d.ts +0 -63
- package/src/app/core/install/install-upgrade-card.module.d.ts +0 -9
- package/src/app/core/menu/menu.component.d.ts +0 -69
- package/src/app/core/menu/menu.model.d.ts +0 -163
- package/src/app/core/menu/menu.module.d.ts +0 -12
- package/src/app/core/menu/menu.service.d.ts +0 -93
- package/src/app/core/menu/sub-menu-tab.directive.d.ts +0 -29
- package/src/app/core/menu/testing/menu-other.testing.d.ts +0 -15
- package/src/app/core/menu/testing/menu.testing.d.ts +0 -53
- package/src/app/core/menu/testing/menu.testing.module.d.ts +0 -12
- package/src/app/core/offline/update-offline-mode-card.component.d.ts +0 -11
- package/src/app/core/offline/update-offline-mode-card.module.d.ts +0 -9
- package/src/app/core/peer/select-peer.modal.d.ts +0 -108
- package/src/app/core/peer/select-peer.module.d.ts +0 -12
- package/src/app/core/register/register-confirm.page.d.ts +0 -24
- package/src/app/core/register/register.form.d.ts +0 -49
- package/src/app/core/register/register.modal.d.ts +0 -14
- package/src/app/core/register/register.module.d.ts +0 -12
- package/src/app/core/services/account.service.d.ts +0 -236
- package/src/app/core/services/auth-guard.service.d.ts +0 -17
- package/src/app/core/services/base-entity-service.class.d.ts +0 -134
- package/src/app/core/services/base-graphql-service.class.d.ts +0 -77
- package/src/app/core/services/base58.d.ts +0 -7
- package/src/app/core/services/config/core.config.d.ts +0 -52
- package/src/app/core/services/config.service.d.ts +0 -63
- package/src/app/core/services/crypto.service.d.ts +0 -44
- package/src/app/core/services/errors.d.ts +0 -65
- package/src/app/core/services/local-settings.service.d.ts +0 -130
- package/src/app/core/services/model/account.model.d.ts +0 -66
- package/src/app/core/services/model/config.model.d.ts +0 -37
- package/src/app/core/services/model/department.model.d.ts +0 -11
- package/src/app/core/services/model/entity.decorators.d.ts +0 -17
- package/src/app/core/services/model/entity.model.d.ts +0 -133
- package/src/app/core/services/model/filter.model.d.ts +0 -37
- package/src/app/core/services/model/history.model.d.ts +0 -20
- package/src/app/core/services/model/model.enum.d.ts +0 -7
- package/src/app/core/services/model/node-feature.model.d.ts +0 -14
- package/src/app/core/services/model/peer.model.d.ts +0 -35
- package/src/app/core/services/model/person.model.d.ts +0 -39
- package/src/app/core/services/model/referential.model.d.ts +0 -85
- package/src/app/core/services/model/settings.model.d.ts +0 -29
- package/src/app/core/services/model/token.model.d.ts +0 -22
- package/src/app/core/services/model/tree-item-entity.model.d.ts +0 -62
- package/src/app/core/services/network.service.d.ts +0 -184
- package/src/app/core/services/network.types.d.ts +0 -4
- package/src/app/core/services/network.utils.d.ts +0 -39
- package/src/app/core/services/pipes/account.pipes.d.ts +0 -15
- package/src/app/core/services/pipes/department-to-string.pipe.d.ts +0 -9
- package/src/app/core/services/pipes/person-to-string.pipe.d.ts +0 -11
- package/src/app/core/services/pipes/pipes.module.d.ts +0 -11
- package/src/app/core/services/pipes/referential-to-string.pipe.d.ts +0 -23
- package/src/app/core/services/pipes/usage-mode.pipes.d.ts +0 -15
- package/src/app/core/services/platform.service.d.ts +0 -126
- package/src/app/core/services/storage/entities-storage.service.d.ts +0 -108
- package/src/app/core/services/storage/entity-store.class.d.ts +0 -113
- package/src/app/core/services/testing/referential-filter.model.d.ts +0 -9
- package/src/app/core/services/testing/referential.validator.d.ts +0 -22
- package/src/app/core/services/validator/account.validator.d.ts +0 -24
- package/src/app/core/services/validator/base.validator.class.d.ts +0 -21
- package/src/app/core/services/validator/local-settings.validator.d.ts +0 -18
- package/src/app/core/services/validator/user-settings.validator.d.ts +0 -10
- package/src/app/core/services/validator/user-token.validator.d.ts +0 -13
- package/src/app/core/settings/settings.module.d.ts +0 -12
- package/src/app/core/settings/settings.page.d.ts +0 -89
- package/src/app/core/table/async-table.class.d.ts +0 -443
- package/src/app/core/table/column/actions-column.component.d.ts +0 -65
- package/src/app/core/table/column/nav-actions-column.component.d.ts +0 -47
- package/src/app/core/table/column/row-field.component.d.ts +0 -41
- package/src/app/core/table/entities-async-table-datasource.class.d.ts +0 -103
- package/src/app/core/table/entities-table-datasource.class.d.ts +0 -102
- package/src/app/core/table/memory-table.class.d.ts +0 -25
- package/src/app/core/table/table-select-columns.component.d.ts +0 -22
- package/src/app/core/table/table.class.d.ts +0 -427
- package/src/app/core/table/table.model.d.ts +0 -31
- package/src/app/core/table/table.module.d.ts +0 -14
- package/src/app/core/table/table.pipes.d.ts +0 -30
- package/src/app/core/table/table.utils.d.ts +0 -13
- package/src/app/core/table/testing/nested-table.testing.d.ts +0 -54
- package/src/app/core/table/testing/table-validator.service.d.ts +0 -17
- package/src/app/core/table/testing/table.testing.d.ts +0 -55
- package/src/app/core/table/testing/table.testing.module.d.ts +0 -17
- package/src/app/core/table/testing/table2-validator.service.d.ts +0 -15
- package/src/app/core/table/testing/table2.testing.d.ts +0 -53
- package/src/app/shared/alerts.d.ts +0 -55
- package/src/app/shared/audio/audio.d.ts +0 -45
- package/src/app/shared/audio/audio.testing.d.ts +0 -13
- package/src/app/shared/audio/audio.testing.module.d.ts +0 -11
- package/src/app/shared/base64.utils.d.ts +0 -7
- package/src/app/shared/capacitor/keyboard.d.ts +0 -16
- package/src/app/shared/capacitor/plugins.d.ts +0 -8
- package/src/app/shared/constants.d.ts +0 -15
- package/src/app/shared/dates.d.ts +0 -85
- package/src/app/shared/debug/debug-service.class.d.ts +0 -5
- package/src/app/shared/debug/debug.component.d.ts +0 -14
- package/src/app/shared/debug/debug.module.d.ts +0 -12
- package/src/app/shared/directives/autofocus.directive.d.ts +0 -18
- package/src/app/shared/directives/autoresize.directive.d.ts +0 -20
- package/src/app/shared/directives/autotitle.directive.d.ts +0 -11
- package/src/app/shared/directives/autotooltip.directive.d.ts +0 -14
- package/src/app/shared/directives/cell-selection/cell-identifier.directive.d.ts +0 -17
- package/src/app/shared/directives/cell-selection/cell-selection.directive.d.ts +0 -29
- package/src/app/shared/directives/cell-selection/cell-selection.service.d.ts +0 -67
- package/src/app/shared/directives/directives.module.d.ts +0 -15
- package/src/app/shared/directives/drag-and-drop.directive.d.ts +0 -17
- package/src/app/shared/directives/ng-var.directive.d.ts +0 -12
- package/src/app/shared/directives/resizable/resizable.component.d.ts +0 -21
- package/src/app/shared/directives/resizable/resizable.directive.d.ts +0 -24
- package/src/app/shared/directives/resizable/resizable.module.d.ts +0 -8
- package/src/app/shared/directives/throttled-click.directive.d.ts +0 -16
- package/src/app/shared/events.d.ts +0 -29
- package/src/app/shared/file/csv.utils.d.ts +0 -30
- package/src/app/shared/file/file.service.d.ts +0 -23
- package/src/app/shared/file/file.utils.d.ts +0 -20
- package/src/app/shared/file/images.utils.d.ts +0 -36
- package/src/app/shared/file/json.utils.d.ts +0 -19
- package/src/app/shared/file/uri.utils.d.ts +0 -8
- package/src/app/shared/file/url.utils.d.ts +0 -108
- package/src/app/shared/focusable.d.ts +0 -4
- package/src/app/shared/form/field.component.d.ts +0 -83
- package/src/app/shared/form/field.model.d.ts +0 -88
- package/src/app/shared/form/loading-spinner.d.ts +0 -8
- package/src/app/shared/forms.d.ts +0 -170
- package/src/app/shared/functions.d.ts +0 -296
- package/src/app/shared/geolocation/geolocation.utils.d.ts +0 -25
- package/src/app/shared/gesture/gesture-config.d.ts +0 -15
- package/src/app/shared/gesture/hammer.utils.d.ts +0 -16
- package/src/app/shared/graph/colors.utils.d.ts +0 -34
- package/src/app/shared/graph/graph-colors.d.ts +0 -63
- package/src/app/shared/guard/component-dirty.guard.d.ts +0 -14
- package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +0 -8
- package/src/app/shared/hotkeys/hotkeys.service.d.ts +0 -48
- package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +0 -11
- package/src/app/shared/html.utils.d.ts +0 -17
- package/src/app/shared/http/http.utils.d.ts +0 -28
- package/src/app/shared/image/gallery/image-gallery.component.d.ts +0 -139
- package/src/app/shared/image/gallery/image-gallery.module.d.ts +0 -15
- package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +0 -12
- package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +0 -33
- package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +0 -16
- package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +0 -13
- package/src/app/shared/image/image.model.d.ts +0 -7
- package/src/app/shared/image/image.module.d.ts +0 -8
- package/src/app/shared/image/image.service.d.ts +0 -37
- package/src/app/shared/inputs.d.ts +0 -37
- package/src/app/shared/interceptors/progess.interceptor.d.ts +0 -8
- package/src/app/shared/logging/log-level.model.d.ts +0 -38
- package/src/app/shared/logging/logger.model.d.ts +0 -68
- package/src/app/shared/logging/logging-service.class.d.ts +0 -39
- package/src/app/shared/logging/logging-service.config.d.ts +0 -25
- package/src/app/shared/logging/logging-service.module.d.ts +0 -9
- package/src/app/shared/markdown/markdown.component.d.ts +0 -86
- package/src/app/shared/markdown/markdown.directive.d.ts +0 -13
- package/src/app/shared/markdown/markdown.modal.d.ts +0 -49
- package/src/app/shared/markdown/markdown.module.d.ts +0 -17
- package/src/app/shared/markdown/markdown.service.d.ts +0 -37
- package/src/app/shared/markdown/markdown.utils.d.ts +0 -26
- package/src/app/shared/markdown/testing/markdown.test.d.ts +0 -18
- package/src/app/shared/markdown/testing/markdown.testing.module.d.ts +0 -12
- package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +0 -74
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +0 -224
- package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +0 -23
- package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +0 -5
- package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +0 -48
- package/src/app/shared/material/badge/badge.directive.d.ts +0 -43
- package/src/app/shared/material/badge/badge.module.d.ts +0 -10
- package/src/app/shared/material/badge/badge.test.d.ts +0 -21
- package/src/app/shared/material/boolean/boolean.module.d.ts +0 -21
- package/src/app/shared/material/boolean/material.boolean.d.ts +0 -94
- package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +0 -31
- package/src/app/shared/material/chips/chips.module.d.ts +0 -22
- package/src/app/shared/material/chips/material.chips.d.ts +0 -167
- package/src/app/shared/material/chips/testing/chips.test.d.ts +0 -32
- package/src/app/shared/material/datetime/datetime.module.d.ts +0 -25
- package/src/app/shared/material/datetime/material.date.d.ts +0 -90
- package/src/app/shared/material/datetime/material.dateshort.d.ts +0 -89
- package/src/app/shared/material/datetime/material.datetime.d.ts +0 -136
- package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +0 -38
- package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +0 -32
- package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +0 -31
- package/src/app/shared/material/duration/duration.module.d.ts +0 -18
- package/src/app/shared/material/duration/duration.utils.d.ts +0 -2
- package/src/app/shared/material/duration/material.duration.d.ts +0 -64
- package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +0 -23
- package/src/app/shared/material/latlong/latlong.utils.d.ts +0 -59
- package/src/app/shared/material/latlong/material.latlong-input.d.ts +0 -93
- package/src/app/shared/material/latlong/material.latlong.d.ts +0 -90
- package/src/app/shared/material/latlong/material.latlong.module.d.ts +0 -21
- package/src/app/shared/material/latlong/testing/latlong.test.d.ts +0 -30
- package/src/app/shared/material/material.animations.d.ts +0 -8
- package/src/app/shared/material/material.config.d.ts +0 -3
- package/src/app/shared/material/material.module.d.ts +0 -44
- package/src/app/shared/material/material.testing.module.d.ts +0 -31
- package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +0 -12
- package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +0 -10
- package/src/app/shared/material/swipe/material.swipe.d.ts +0 -89
- package/src/app/shared/material/swipe/swipe.module.d.ts +0 -16
- package/src/app/shared/material/swipe/testing/swipe.test.d.ts +0 -22
- package/src/app/shared/material/test/test-component.d.ts +0 -75
- package/src/app/shared/material/testing/common.test.d.ts +0 -25
- package/src/app/shared/modules.d.ts +0 -9
- package/src/app/shared/named-filter/named-filter-selector.component.d.ts +0 -63
- package/src/app/shared/named-filter/named-filter.model.d.ts +0 -32
- package/src/app/shared/named-filter/named-filter.module.d.ts +0 -13
- package/src/app/shared/named-filter/named-filter.service.d.ts +0 -32
- package/src/app/shared/named-filter/testing/named-filter-selector.testing.d.ts +0 -34
- package/src/app/shared/named-filter/testing/named-filter.testing.module.d.ts +0 -10
- package/src/app/shared/observables.d.ts +0 -32
- package/src/app/shared/pipes/arrays.pipe.d.ts +0 -93
- package/src/app/shared/pipes/badge.pipes.d.ts +0 -7
- package/src/app/shared/pipes/colors.pipe.d.ts +0 -9
- package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +0 -25
- package/src/app/shared/pipes/date-format.pipe.d.ts +0 -35
- package/src/app/shared/pipes/date-from-now.pipe.d.ts +0 -14
- package/src/app/shared/pipes/date-from.pipe.d.ts +0 -14
- package/src/app/shared/pipes/dates.pipe.d.ts +0 -10
- package/src/app/shared/pipes/display-with.pipe.d.ts +0 -8
- package/src/app/shared/pipes/duration.pipe.d.ts +0 -23
- package/src/app/shared/pipes/file-size.pipe.d.ts +0 -30
- package/src/app/shared/pipes/form.pipes.d.ts +0 -69
- package/src/app/shared/pipes/highlight.pipe.d.ts +0 -11
- package/src/app/shared/pipes/html.pipes.d.ts +0 -50
- package/src/app/shared/pipes/latlong-format.pipe.d.ts +0 -20
- package/src/app/shared/pipes/maps.pipe.d.ts +0 -23
- package/src/app/shared/pipes/maskito.pipe.d.ts +0 -14
- package/src/app/shared/pipes/math.pipes.d.ts +0 -26
- package/src/app/shared/pipes/ng-init.pipe.d.ts +0 -8
- package/src/app/shared/pipes/number-format.pipe.d.ts +0 -9
- package/src/app/shared/pipes/observable.pipes.d.ts +0 -25
- package/src/app/shared/pipes/pipes.module.d.ts +0 -36
- package/src/app/shared/pipes/property.pipes.d.ts +0 -46
- package/src/app/shared/pipes/selection.pipes.d.ts +0 -62
- package/src/app/shared/pipes/string.pipes.d.ts +0 -67
- package/src/app/shared/pipes/translate-context.pipe.d.ts +0 -17
- package/src/app/shared/pipes/types.pipes.d.ts +0 -30
- package/src/app/shared/pipes/url.pipes.d.ts +0 -27
- package/src/app/shared/platforms.d.ts +0 -16
- package/src/app/shared/print/print.service.d.ts +0 -94
- package/src/app/shared/regexps.d.ts +0 -32
- package/src/app/shared/rx-state/rx-state.decorators.d.ts +0 -33
- package/src/app/shared/rx-state/rx-state.module.d.ts +0 -10
- package/src/app/shared/rx-state/rx-state.types.d.ts +0 -5
- package/src/app/shared/services/entity-service.class.d.ts +0 -117
- package/src/app/shared/services/job.utils.d.ts +0 -20
- package/src/app/shared/services/memory-entity-service.class.d.ts +0 -87
- package/src/app/shared/services/progress-bar.service.d.ts +0 -20
- package/src/app/shared/services/startable-observable-service.class.d.ts +0 -51
- package/src/app/shared/services/startable-service.class.d.ts +0 -38
- package/src/app/shared/services/translate-context.service.d.ts +0 -29
- package/src/app/shared/services/validator-service.class.d.ts +0 -11
- package/src/app/shared/services.d.ts +0 -17
- package/src/app/shared/shared-routing.module.d.ts +0 -23
- package/src/app/shared/shared.module.d.ts +0 -33
- package/src/app/shared/shared.testing.module.d.ts +0 -20
- package/src/app/shared/storage/storage-explorer.component.d.ts +0 -60
- package/src/app/shared/storage/storage-explorer.module.d.ts +0 -13
- package/src/app/shared/storage/storage-explorer.testing-routing.module.d.ts +0 -9
- package/src/app/shared/storage/storage-explorer.testing.module.d.ts +0 -10
- package/src/app/shared/storage/storage.service.d.ts +0 -22
- package/src/app/shared/storage/storage.utils.d.ts +0 -19
- package/src/app/shared/testing/maskito.test.d.ts +0 -10
- package/src/app/shared/testing/observable.test.d.ts +0 -25
- package/src/app/shared/testing/tests.page.d.ts +0 -20
- package/src/app/shared/toast/toast.testing.d.ts +0 -15
- package/src/app/shared/toast/toast.testing.module.d.ts +0 -12
- package/src/app/shared/toast/toasts.d.ts +0 -16
- package/src/app/shared/toolbar/modal-toolbar.d.ts +0 -21
- package/src/app/shared/toolbar/toolbar.d.ts +0 -70
- package/src/app/shared/toolbar/toolbar.module.d.ts +0 -16
- package/src/app/shared/types.d.ts +0 -45
- package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +0 -21
- package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +0 -11
- package/src/app/shared/upload-file/upload-file-popover.component.d.ts +0 -41
- package/src/app/shared/upload-file/upload-file.component.d.ts +0 -50
- package/src/app/shared/upload-file/upload-file.model.d.ts +0 -30
- package/src/app/shared/validator/form-error-adapter.class.d.ts +0 -33
- package/src/app/shared/validator/validators.d.ts +0 -145
- package/src/app/shared/version/versions.d.ts +0 -26
- package/src/app/social/config/social.config.d.ts +0 -4
- package/src/app/social/feed/feed.component.d.ts +0 -91
- package/src/app/social/feed/feed.directive.d.ts +0 -32
- package/src/app/social/feed/feed.model.d.ts +0 -69
- package/src/app/social/feed/feed.module.d.ts +0 -13
- package/src/app/social/feed/feed.page.d.ts +0 -24
- package/src/app/social/feed/feed.service.d.ts +0 -85
- package/src/app/social/feed/testing/feed.testing.d.ts +0 -23
- package/src/app/social/feed/testing/feed.testing.module.d.ts +0 -12
- package/src/app/social/job/job.module.d.ts +0 -12
- package/src/app/social/job/progression/job-progression.component.d.ts +0 -24
- package/src/app/social/job/progression/job-progression.icon.d.ts +0 -63
- package/src/app/social/job/progression/job-progression.list.d.ts +0 -20
- package/src/app/social/job/progression/job-progression.model.d.ts +0 -10
- package/src/app/social/job/progression/job-progression.service.d.ts +0 -33
- package/src/app/social/job/testing/job-progression.testing.d.ts +0 -13
- package/src/app/social/job/testing/job-progression.testing.service.d.ts +0 -9
- package/src/app/social/job/testing/job.testing.module.d.ts +0 -11
- package/src/app/social/message/message.form.d.ts +0 -36
- package/src/app/social/message/message.modal.d.ts +0 -47
- package/src/app/social/message/message.model.d.ts +0 -36
- package/src/app/social/message/message.module.d.ts +0 -14
- package/src/app/social/message/message.service.d.ts +0 -44
- package/src/app/social/social.errors.d.ts +0 -10
- package/src/app/social/social.module.d.ts +0 -20
- package/src/app/social/social.testing.module.d.ts +0 -14
- package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +0 -47
- package/src/app/social/user-event/notification/user-event-notification.list.d.ts +0 -77
- package/src/app/social/user-event/notification/user-event-notification.modal.d.ts +0 -37
- package/src/app/social/user-event/testing/user-event.testing.d.ts +0 -44
- package/src/app/social/user-event/testing/user-event.testing.model.d.ts +0 -42
- package/src/app/social/user-event/testing/user-event.testing.module.d.ts +0 -11
- package/src/app/social/user-event/testing/user-event.testing.service.d.ts +0 -41
- package/src/app/social/user-event/user-event.model.d.ts +0 -44
- package/src/app/social/user-event/user-event.module.d.ts +0 -14
- package/src/app/social/user-event/user-event.service.d.ts +0 -124
- package/src/environments/environment.class.d.ts +0 -86
- package/src/environments/environment.d.ts +0 -2
- package/src/environments/environment.loader.d.ts +0 -24
- package/src/theme/_globals.scss +0 -5
|
@@ -1,658 +0,0 @@
|
|
|
1
|
-
import { AbstractControl, } from '@angular/forms';
|
|
2
|
-
import { isMoment } from 'moment';
|
|
3
|
-
import { PUBKEY_REGEXP } from '../constants';
|
|
4
|
-
import { isEmptyArray, isNil, isNilOrBlank, isNotNil, isNotNilOrBlank, isNotNilOrNaN, toBoolean, toNumber } from '../functions';
|
|
5
|
-
import { DateUtils, fromDateISOString } from '../dates';
|
|
6
|
-
import { delay, from, isObservable, merge, of, Subject, Subscription } from 'rxjs';
|
|
7
|
-
import { catchError, first, switchMap, takeUntil, tap } from 'rxjs/operators';
|
|
8
|
-
// @dynamic
|
|
9
|
-
export class SharedValidators {
|
|
10
|
-
static _DOUBLE_REGEXP_CACHE = {
|
|
11
|
-
NO_LIMIT: /^-?\d+([.,]\d*)?$/,
|
|
12
|
-
1: /^-?\d+([.,]\d)?$/, // 1 decimal max
|
|
13
|
-
2: /^-?\d+([.,]\d{1,2})?$/, // 2 decimals max
|
|
14
|
-
3: /^-?\d+([.,]\d{1,3})?$/, // 3 decimals max
|
|
15
|
-
};
|
|
16
|
-
static getDoubleRegexp(maxDecimals) {
|
|
17
|
-
if (isNil(maxDecimals))
|
|
18
|
-
return this._DOUBLE_REGEXP_CACHE.NO_LIMIT;
|
|
19
|
-
if (maxDecimals < 0)
|
|
20
|
-
throw new Error(`Invalid maxDecimals value: ${maxDecimals}`);
|
|
21
|
-
const regexp = this._DOUBLE_REGEXP_CACHE[maxDecimals];
|
|
22
|
-
if (regexp)
|
|
23
|
-
return regexp;
|
|
24
|
-
// New: add to cache
|
|
25
|
-
this._DOUBLE_REGEXP_CACHE[maxDecimals] = new RegExp(`^-?\\d+([.,]\\d{1,${maxDecimals}})?$`);
|
|
26
|
-
return this._DOUBLE_REGEXP_CACHE[maxDecimals];
|
|
27
|
-
}
|
|
28
|
-
static equals(otherControlName) {
|
|
29
|
-
return (c) => {
|
|
30
|
-
const otherControl = c.parent?.get(otherControlName);
|
|
31
|
-
if (otherControl && c.value !== otherControl.value) {
|
|
32
|
-
return {
|
|
33
|
-
equals: true,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
return null;
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
static I18N_ERROR_KEYS = {
|
|
40
|
-
required: 'ERROR.FIELD_REQUIRED',
|
|
41
|
-
min: 'ERROR.FIELD_MIN',
|
|
42
|
-
max: 'ERROR.FIELD_MAX',
|
|
43
|
-
minlength: 'ERROR.FIELD_MIN_LENGTH',
|
|
44
|
-
maxlength: 'ERROR.FIELD_MAX_LENGTH',
|
|
45
|
-
pubkey: 'ERROR.FIELD_NOT_VALID_PUBKEY',
|
|
46
|
-
validDate: 'ERROR.FIELD_NOT_VALID_DATE',
|
|
47
|
-
dateIsAfter: 'ERROR.FIELD_NOT_VALID_DATE_AFTER',
|
|
48
|
-
dateIsBefore: 'ERROR.FIELD_NOT_VALID_DATE_BEFORE',
|
|
49
|
-
dateRange: 'ERROR.FIELD_NOT_VALID_DATE_RANGE',
|
|
50
|
-
dateMinDuration: 'ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION',
|
|
51
|
-
dateMaxDuration: 'ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION',
|
|
52
|
-
maxDecimals: 'ERROR.FIELD_MAXIMUM_DECIMALS',
|
|
53
|
-
decimal: 'ERROR.FIELD_NOT_VALID_DECIMAL',
|
|
54
|
-
integer: 'ERROR.FIELD_NOT_VALID_INTEGER',
|
|
55
|
-
precision: 'ERROR.FIELD_NOT_VALID_PRECISION',
|
|
56
|
-
email: 'ERROR.FIELD_NOT_VALID_EMAIL',
|
|
57
|
-
latitude: 'ERROR.FIELD_NOT_VALID_LATITUDE',
|
|
58
|
-
longitude: 'ERROR.FIELD_NOT_VALID_LONGITUDE',
|
|
59
|
-
pattern: 'ERROR.FIELD_NOT_VALID_PATTERN',
|
|
60
|
-
unique: 'ERROR.FIELD_NOT_UNIQUE',
|
|
61
|
-
entity: 'ERROR.FIELD_INVALID',
|
|
62
|
-
invalid: 'ERROR.FIELD_INVALID',
|
|
63
|
-
inconsistent: 'ERROR.FIELD_INCONSISTENT',
|
|
64
|
-
equals: 'ERROR.FIELD_NOT_EQUALS',
|
|
65
|
-
};
|
|
66
|
-
static latitude(control) {
|
|
67
|
-
const value = control.value;
|
|
68
|
-
if (isNotNil(value) && (value < -90 || value > 90)) {
|
|
69
|
-
return { latitude: true };
|
|
70
|
-
}
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
static longitude(control) {
|
|
74
|
-
const value = control.value;
|
|
75
|
-
if (isNotNil(value) && (value < -180 || value > 180)) {
|
|
76
|
-
return { longitude: true };
|
|
77
|
-
}
|
|
78
|
-
return null;
|
|
79
|
-
}
|
|
80
|
-
static object(control) {
|
|
81
|
-
const value = control.value;
|
|
82
|
-
if (value && typeof value !== 'object') {
|
|
83
|
-
return { object: true };
|
|
84
|
-
}
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
static entity(control) {
|
|
88
|
-
const value = control.value;
|
|
89
|
-
if (value && (typeof value !== 'object' || isNil(value.id))) {
|
|
90
|
-
return { entity: true };
|
|
91
|
-
}
|
|
92
|
-
return null;
|
|
93
|
-
}
|
|
94
|
-
static entities(control) {
|
|
95
|
-
const value = control.value;
|
|
96
|
-
if (value && (!Array.isArray(value) || value.every((e) => isNil(e?.id)))) {
|
|
97
|
-
return { entity: true };
|
|
98
|
-
}
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
static empty(control) {
|
|
102
|
-
if (isNotNilOrBlank(control.value)) {
|
|
103
|
-
return { empty: true };
|
|
104
|
-
}
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
static pubkey(control) {
|
|
108
|
-
const value = control.value;
|
|
109
|
-
if (value && (typeof value !== 'string' || !PUBKEY_REGEXP.test(value))) {
|
|
110
|
-
return { pubkey: true };
|
|
111
|
-
}
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
static integer(control) {
|
|
115
|
-
if (isNilOrBlank(control.value))
|
|
116
|
-
return null;
|
|
117
|
-
const value = parseFloat(control.value);
|
|
118
|
-
if (isNaN(value) || (value | 0) !== value) {
|
|
119
|
-
return { integer: true };
|
|
120
|
-
}
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
static decimal(opts) {
|
|
124
|
-
const regexp = this.getDoubleRegexp(opts?.maxDecimals);
|
|
125
|
-
return (control) => {
|
|
126
|
-
const value = control.value;
|
|
127
|
-
if (Number.isNaN(value)) {
|
|
128
|
-
// DEBUG
|
|
129
|
-
//console.debug("WARN: Getting a NaN value (decimal was expected) !");
|
|
130
|
-
return null;
|
|
131
|
-
}
|
|
132
|
-
if (isNotNil(value) && value !== '' && !regexp.test(value)) {
|
|
133
|
-
return isNotNil(opts?.maxDecimals) ? { maxDecimals: { maxDecimals: opts.maxDecimals } } : { decimal: true };
|
|
134
|
-
}
|
|
135
|
-
return null;
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Check precision. e.g. if precision=0.5 then value=0.6 is invalid, but 1.5 is valid
|
|
140
|
-
*
|
|
141
|
-
* @param precision
|
|
142
|
-
*/
|
|
143
|
-
static precision(precision) {
|
|
144
|
-
if (isNil(precision))
|
|
145
|
-
throw new Error('Required a not nil precision');
|
|
146
|
-
// WARN: we should define a multiplier, because modulo in javascript will only work on integer
|
|
147
|
-
// (e.g. "7 % 0.1" in javascript will NOT return zero (but 0.09999999999999962)
|
|
148
|
-
const precisionNbDecimals = (precision.toString().split('.')[1] || '').length;
|
|
149
|
-
const multiplier = Math.pow(10, precisionNbDecimals);
|
|
150
|
-
const multipliedPrecision = Math.round(multiplier * precision);
|
|
151
|
-
// The validator function
|
|
152
|
-
return (control) => {
|
|
153
|
-
const value = control.value;
|
|
154
|
-
if (isNilOrBlank(value) || Number.isNaN(value)) {
|
|
155
|
-
return null;
|
|
156
|
-
}
|
|
157
|
-
// WARN: Convert value into integer, before applying modulo operator
|
|
158
|
-
const mod = Math.round(+value * multiplier) % multipliedPrecision;
|
|
159
|
-
if (mod !== 0) {
|
|
160
|
-
// DEBUG
|
|
161
|
-
//console.debug(`WARN Getting a ${value} with an invalid precision (expected precision is: ${precision})`);
|
|
162
|
-
return { precision: { precision } };
|
|
163
|
-
}
|
|
164
|
-
return null;
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
static validDateTime(requiredTime = true) {
|
|
168
|
-
return (control) => {
|
|
169
|
-
const value = control.value;
|
|
170
|
-
const date = !value || isMoment(value) ? value : fromDateISOString(value, { strict: false, undefinedIfInvalid: false, requiredTime });
|
|
171
|
-
if (date && (!date.isValid() || date.year() < 1900 || (requiredTime && DateUtils.isNoTime(date)))) {
|
|
172
|
-
return { validDate: true };
|
|
173
|
-
}
|
|
174
|
-
return null;
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
static validDate = SharedValidators.validDateTime(true);
|
|
178
|
-
static validDateAllowNoTime = SharedValidators.validDateTime(false);
|
|
179
|
-
static dateIsAfter(previousValue, errorParam, granularity) {
|
|
180
|
-
return (control) => {
|
|
181
|
-
const value = fromDateISOString(control.value);
|
|
182
|
-
if (isNotNil(value) && isNotNil(previousValue) && value.isSameOrBefore(previousValue, granularity)) {
|
|
183
|
-
// Return the error
|
|
184
|
-
return { dateIsAfter: { minDate: errorParam } };
|
|
185
|
-
}
|
|
186
|
-
return null;
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
static dateIsBefore(maxValue, errorParam, granularity) {
|
|
190
|
-
return (control) => {
|
|
191
|
-
const value = fromDateISOString(control.value);
|
|
192
|
-
if (isNotNil(value) && isNotNil(maxValue) && value.isSameOrAfter(maxValue, granularity)) {
|
|
193
|
-
// Return the error
|
|
194
|
-
return { dateIsBefore: { maxDate: errorParam } };
|
|
195
|
-
}
|
|
196
|
-
return null;
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
static dateRangeEnd(startDateFieldName, msg) {
|
|
200
|
-
const errorCode = msg ? 'msg' : 'dateRange';
|
|
201
|
-
const error = msg ? { msg } : { dateRange: true };
|
|
202
|
-
return (control) => {
|
|
203
|
-
// Form group not created yet: skip
|
|
204
|
-
if (!control.parent)
|
|
205
|
-
return null;
|
|
206
|
-
const startControl = control.parent.get(startDateFieldName);
|
|
207
|
-
if (!startControl) {
|
|
208
|
-
console.warn(`Cannot find brother control '${startDateFieldName}' in the parent form`);
|
|
209
|
-
return null;
|
|
210
|
-
}
|
|
211
|
-
const startDate = fromDateISOString(startControl.value);
|
|
212
|
-
const endDate = fromDateISOString(control.value);
|
|
213
|
-
// Error if value <= beforeDate
|
|
214
|
-
if (isNotNil(endDate) && isNotNil(startDate) && endDate.isSameOrBefore(startDate)) {
|
|
215
|
-
return error;
|
|
216
|
-
}
|
|
217
|
-
// OK: clear existing errors
|
|
218
|
-
SharedValidators.clearError(control, errorCode);
|
|
219
|
-
return null;
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
static dateRangeStart(endDateFieldName, msg) {
|
|
223
|
-
const errorCode = msg ? 'msg' : 'dateRange';
|
|
224
|
-
const error = msg ? { msg } : { dateRange: true };
|
|
225
|
-
return (control) => {
|
|
226
|
-
// Form group not created yet: skip
|
|
227
|
-
if (!control.parent)
|
|
228
|
-
return null;
|
|
229
|
-
const endDateControl = control.parent.get(endDateFieldName);
|
|
230
|
-
if (!endDateControl) {
|
|
231
|
-
console.warn(`Cannot find control '${endDateFieldName}' in the parent form`);
|
|
232
|
-
return null;
|
|
233
|
-
}
|
|
234
|
-
const endDate = fromDateISOString(endDateControl.value);
|
|
235
|
-
const startDate = fromDateISOString(control.value);
|
|
236
|
-
// Error if value <= beforeDate
|
|
237
|
-
if (isNotNil(startDate) && isNotNil(endDate) && startDate.isSameOrAfter(endDate)) {
|
|
238
|
-
return error;
|
|
239
|
-
}
|
|
240
|
-
// OK: clear existing errors
|
|
241
|
-
SharedValidators.clearError(control, errorCode);
|
|
242
|
-
return null;
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
static copyParentErrors(errorNames) {
|
|
246
|
-
return (control) => {
|
|
247
|
-
// Skip if control already has some errors
|
|
248
|
-
if (control.errors)
|
|
249
|
-
return null;
|
|
250
|
-
// Skip if parent form group not created yet
|
|
251
|
-
if (!control.parent)
|
|
252
|
-
return null;
|
|
253
|
-
// Form group not created yet
|
|
254
|
-
if (!control.parent)
|
|
255
|
-
return null;
|
|
256
|
-
const errors = control.parent.errors;
|
|
257
|
-
// No errors, or copy all errors
|
|
258
|
-
if (!errors || isEmptyArray(errorNames))
|
|
259
|
-
return errors;
|
|
260
|
-
// Copy only expected errors
|
|
261
|
-
return Object.keys(errors).reduce((res, key) => {
|
|
262
|
-
if (errorNames.includes(key)) {
|
|
263
|
-
res[key] = errors[key];
|
|
264
|
-
}
|
|
265
|
-
return res;
|
|
266
|
-
}, {});
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
static clearError(control, errorCode) {
|
|
270
|
-
if (control.hasError(errorCode)) {
|
|
271
|
-
const errors = control.errors;
|
|
272
|
-
if (errors && errors[errorCode]) {
|
|
273
|
-
// Only one error: reset errors
|
|
274
|
-
if (Object.getOwnPropertyNames(errors).length === 1) {
|
|
275
|
-
control.setErrors(null);
|
|
276
|
-
}
|
|
277
|
-
// Other errors exists: just remove this error
|
|
278
|
-
else {
|
|
279
|
-
delete errors[errorCode];
|
|
280
|
-
control.setErrors(errors);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
static copyError(sourceControl, targetControl, errorCode) {
|
|
286
|
-
if (sourceControl.hasError(errorCode)) {
|
|
287
|
-
const errors = sourceControl.errors;
|
|
288
|
-
if (errors?.[errorCode]) {
|
|
289
|
-
targetControl.setErrors({
|
|
290
|
-
...targetControl.errors,
|
|
291
|
-
[errorCode]: errors[errorCode]
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
else {
|
|
296
|
-
SharedValidators.clearError(targetControl, errorCode);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
// @dynamic
|
|
301
|
-
export class SharedFormGroupValidators {
|
|
302
|
-
static dateRange(startDateField, endDateField, opts) {
|
|
303
|
-
const msg = typeof opts === 'string' ? opts : opts?.msg;
|
|
304
|
-
const fieldOnly = typeof opts === 'object' ? opts?.fieldOnly : undefined;
|
|
305
|
-
const skipIfNoTime = typeof opts === 'object' ? opts?.skipIfNoTime : undefined;
|
|
306
|
-
const errorCode = isNotNilOrBlank(msg) ? 'msg' : 'dateRange';
|
|
307
|
-
const rangeError = msg ? { msg } : { dateRange: true };
|
|
308
|
-
return (group) => {
|
|
309
|
-
const startDate = fromDateISOString(group.get(startDateField).value);
|
|
310
|
-
const endField = group.get(endDateField);
|
|
311
|
-
const endDate = fromDateISOString(endField.value);
|
|
312
|
-
const hasStartDate = isNotNil(startDate) && (!skipIfNoTime || DateUtils.isNoTime(startDate));
|
|
313
|
-
const hasEndDate = isNotNil(endDate) && (!skipIfNoTime || DateUtils.isNoTime(endDate));
|
|
314
|
-
if (hasStartDate && hasEndDate && startDate.isAfter(endDate)) {
|
|
315
|
-
// Update end field
|
|
316
|
-
endField.markAsPending();
|
|
317
|
-
endField.setErrors({
|
|
318
|
-
...endField.errors,
|
|
319
|
-
...rangeError,
|
|
320
|
-
});
|
|
321
|
-
// Return the error (should be applied to the parent form, by default)
|
|
322
|
-
return fieldOnly ? null : rangeError;
|
|
323
|
-
}
|
|
324
|
-
// OK: remove the existing on the end field
|
|
325
|
-
SharedValidators.clearError(endField, errorCode);
|
|
326
|
-
return null;
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
static dateMaxDuration(startDateField, endDateField, maxDuration, durationUnit, opts) {
|
|
330
|
-
const maxDurationError = { dateMaxDuration: true };
|
|
331
|
-
const skipIfNoTime = opts?.skipIfNoTime;
|
|
332
|
-
return (group) => {
|
|
333
|
-
const startDate = fromDateISOString(group.get(startDateField).value);
|
|
334
|
-
const endField = group.get(endDateField);
|
|
335
|
-
const endDate = fromDateISOString(endField.value);
|
|
336
|
-
const hasStartDate = isNotNil(startDate) && (!skipIfNoTime || DateUtils.isNoTime(startDate));
|
|
337
|
-
const hasEndDate = isNotNil(endDate) && (!skipIfNoTime || DateUtils.isNoTime(endDate));
|
|
338
|
-
if (hasStartDate && hasEndDate && Math.abs(startDate.diff(endDate, durationUnit)) > maxDuration) {
|
|
339
|
-
// Update end field
|
|
340
|
-
endField.markAsTouched({ onlySelf: true });
|
|
341
|
-
endField.markAsPending();
|
|
342
|
-
endField.setErrors({
|
|
343
|
-
...endField.errors,
|
|
344
|
-
...maxDurationError,
|
|
345
|
-
});
|
|
346
|
-
// Return the error (should be apply to the parent form)
|
|
347
|
-
return maxDurationError;
|
|
348
|
-
}
|
|
349
|
-
// OK: remove the existing on the end field
|
|
350
|
-
SharedValidators.clearError(endField, 'dateMaxDuration');
|
|
351
|
-
return null;
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
static dateMinDuration(startDateField, endDateField, minDuration, durationUnit) {
|
|
355
|
-
return (group) => {
|
|
356
|
-
const endField = group.get(endDateField);
|
|
357
|
-
const startDate = fromDateISOString(group.get(startDateField).value);
|
|
358
|
-
const endDate = fromDateISOString(endField.value);
|
|
359
|
-
if (isNotNil(startDate) && isNotNil(endDate) && Math.abs(startDate.diff(endDate, durationUnit)) < minDuration) {
|
|
360
|
-
// Update end field
|
|
361
|
-
const endFieldErrors = endField.errors || {};
|
|
362
|
-
endFieldErrors['dateMinDuration'] = true;
|
|
363
|
-
endField.setErrors(endFieldErrors);
|
|
364
|
-
endField.markAsTouched({ onlySelf: true });
|
|
365
|
-
// Return the error (should be apply to the parent form)
|
|
366
|
-
return { dateMinDuration: true };
|
|
367
|
-
}
|
|
368
|
-
// OK: remove the existing on the end field
|
|
369
|
-
else {
|
|
370
|
-
SharedValidators.clearError(endField, 'dateMinDuration');
|
|
371
|
-
}
|
|
372
|
-
return null;
|
|
373
|
-
};
|
|
374
|
-
}
|
|
375
|
-
static requiredIf(fieldName, anotherFieldToCheck, opts) {
|
|
376
|
-
const isEmpty = opts?.isEmpty || ((control) => isNilOrBlank(control?.value));
|
|
377
|
-
const predicate = opts?.predicate || ((control) => isNotNilOrBlank(control?.value));
|
|
378
|
-
return (group) => {
|
|
379
|
-
const control = group.get(fieldName);
|
|
380
|
-
if (!control)
|
|
381
|
-
throw new Error(`Unable to find control '${fieldName}' used by ShareFormGroupValidators.requiredIf validator!`);
|
|
382
|
-
const anotherControl = anotherFieldToCheck instanceof AbstractControl ? anotherFieldToCheck : group.get(anotherFieldToCheck);
|
|
383
|
-
if (!anotherControl)
|
|
384
|
-
throw new Error(`Unable to find control ${typeof anotherFieldToCheck === 'string' ? anotherFieldToCheck + ' ' : ''}used by ShareFormGroupValidators.requiredIf validator!`);
|
|
385
|
-
if (isEmpty(control) && predicate(anotherControl)) {
|
|
386
|
-
const error = { required: true };
|
|
387
|
-
control.setErrors(error);
|
|
388
|
-
control.markAsTouched({ onlySelf: true });
|
|
389
|
-
return opts?.fieldOnly ? null : error;
|
|
390
|
-
}
|
|
391
|
-
SharedValidators.clearError(control, 'required');
|
|
392
|
-
return null;
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
static requiredIfTrue(fieldName, anotherFieldToCheck, opts) {
|
|
396
|
-
const isEmpty = opts?.isEmpty || ((control) => isNilOrBlank(control.value));
|
|
397
|
-
return (group) => {
|
|
398
|
-
const control = group.get(fieldName);
|
|
399
|
-
const anotherControl = anotherFieldToCheck instanceof AbstractControl ? anotherFieldToCheck : group.get(anotherFieldToCheck);
|
|
400
|
-
if (!anotherControl)
|
|
401
|
-
throw new Error('Unable to find field to check!');
|
|
402
|
-
if (isEmpty(control) && toBoolean(anotherControl.value, false)) {
|
|
403
|
-
const error = { required: true };
|
|
404
|
-
control.setErrors(error);
|
|
405
|
-
control.markAsTouched({ onlySelf: true });
|
|
406
|
-
return opts?.fieldOnly ? null : error;
|
|
407
|
-
}
|
|
408
|
-
SharedValidators.clearError(control, 'required');
|
|
409
|
-
return null;
|
|
410
|
-
};
|
|
411
|
-
}
|
|
412
|
-
static requiredIfFalse(fieldName, anotherFieldToCheck, opts) {
|
|
413
|
-
const isEmpty = opts?.isEmpty || ((control) => isNilOrBlank(control.value));
|
|
414
|
-
return (group) => {
|
|
415
|
-
const control = group.get(fieldName);
|
|
416
|
-
const anotherControl = anotherFieldToCheck instanceof AbstractControl ? anotherFieldToCheck : group.get(anotherFieldToCheck);
|
|
417
|
-
if (!anotherControl)
|
|
418
|
-
throw new Error('Unable to find field to check!');
|
|
419
|
-
if (isEmpty(control) && !toBoolean(anotherControl.value, false)) {
|
|
420
|
-
const error = { required: true };
|
|
421
|
-
control.setErrors(error);
|
|
422
|
-
control.markAsTouched({ onlySelf: true });
|
|
423
|
-
return opts?.fieldOnly ? null : error;
|
|
424
|
-
}
|
|
425
|
-
SharedValidators.clearError(control, 'required');
|
|
426
|
-
return null;
|
|
427
|
-
};
|
|
428
|
-
}
|
|
429
|
-
static requiredIfEmpty(fieldName, anotherFieldToCheck, opts) {
|
|
430
|
-
const isEmpty = opts?.isEmpty || ((control) => isNilOrBlank(control.value));
|
|
431
|
-
return (group) => {
|
|
432
|
-
const control = group.get(fieldName);
|
|
433
|
-
if (isEmpty(control) && isNilOrBlank(group.get(anotherFieldToCheck).value)) {
|
|
434
|
-
const error = { required: true };
|
|
435
|
-
control.setErrors(error);
|
|
436
|
-
control.markAsTouched({ onlySelf: true });
|
|
437
|
-
return opts?.fieldOnly ? null : error;
|
|
438
|
-
}
|
|
439
|
-
SharedValidators.clearError(control, 'required');
|
|
440
|
-
return null;
|
|
441
|
-
};
|
|
442
|
-
}
|
|
443
|
-
static propagateIfDirty(fieldName, fieldNameToPropagate, valueToPropagate) {
|
|
444
|
-
return (group) => {
|
|
445
|
-
const control = group.get(fieldName);
|
|
446
|
-
const controlToPropagate = group.get(fieldNameToPropagate);
|
|
447
|
-
if (control.dirty && controlToPropagate.value !== valueToPropagate) {
|
|
448
|
-
controlToPropagate.setValue(valueToPropagate);
|
|
449
|
-
}
|
|
450
|
-
return null;
|
|
451
|
-
};
|
|
452
|
-
}
|
|
453
|
-
/**
|
|
454
|
-
* Same as compose, but keep only the first errors (instead of the union)
|
|
455
|
-
*
|
|
456
|
-
* @param validators
|
|
457
|
-
*/
|
|
458
|
-
first(validators) {
|
|
459
|
-
return (control) => validators
|
|
460
|
-
.filter(isNotNil)
|
|
461
|
-
.map((validator) => validator(control))
|
|
462
|
-
.find(isNotNil) || null;
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
// @dynamic
|
|
466
|
-
export class SharedFormArrayValidators {
|
|
467
|
-
/**
|
|
468
|
-
* Validate uniqueness of an entity in a FormArray
|
|
469
|
-
*
|
|
470
|
-
* @param controlName the name of the control in FormArray
|
|
471
|
-
*/
|
|
472
|
-
static uniqueEntity(controlName) {
|
|
473
|
-
return (array) => {
|
|
474
|
-
const controls = [];
|
|
475
|
-
if (array.length) {
|
|
476
|
-
// gather controls in array with valid entity
|
|
477
|
-
for (const control of array.controls) {
|
|
478
|
-
const fromGroup = control;
|
|
479
|
-
if (fromGroup.controls[controlName]) {
|
|
480
|
-
const value = fromGroup.controls[controlName].value;
|
|
481
|
-
if (!!value && !!value.id)
|
|
482
|
-
controls.push(fromGroup.controls[controlName]);
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
// get occurrences of entity by id
|
|
486
|
-
const occurrences = controls.reduce((acc, control) => {
|
|
487
|
-
const id = control.value.id;
|
|
488
|
-
if (acc[id])
|
|
489
|
-
acc[id]++;
|
|
490
|
-
else
|
|
491
|
-
acc[id] = 1;
|
|
492
|
-
return acc;
|
|
493
|
-
}, {});
|
|
494
|
-
// get controls with value occurrences > 1
|
|
495
|
-
const error = { uniqueEntity: true };
|
|
496
|
-
let returnError = false;
|
|
497
|
-
controls
|
|
498
|
-
.filter((control) => occurrences[control.value.id] > 1)
|
|
499
|
-
.forEach((control) => {
|
|
500
|
-
let errors = control.errors || {};
|
|
501
|
-
errors = { ...errors, ...error };
|
|
502
|
-
control.setErrors(errors);
|
|
503
|
-
control.markAsTouched({ onlySelf: true });
|
|
504
|
-
returnError = true;
|
|
505
|
-
});
|
|
506
|
-
if (returnError)
|
|
507
|
-
return error;
|
|
508
|
-
}
|
|
509
|
-
controls.forEach((control) => SharedValidators.clearError(control, 'uniqueEntity'));
|
|
510
|
-
return null;
|
|
511
|
-
};
|
|
512
|
-
}
|
|
513
|
-
static requiredArrayMinLength(minLength) {
|
|
514
|
-
minLength = minLength || 1;
|
|
515
|
-
return (array) => {
|
|
516
|
-
if (!array || array.length < minLength) {
|
|
517
|
-
return { required: true };
|
|
518
|
-
}
|
|
519
|
-
return null;
|
|
520
|
-
};
|
|
521
|
-
}
|
|
522
|
-
static arrayMaxLength(maxLength) {
|
|
523
|
-
maxLength = maxLength || 1;
|
|
524
|
-
return (array) => {
|
|
525
|
-
if (array && array.length > maxLength) {
|
|
526
|
-
return { maxLength: maxLength };
|
|
527
|
-
}
|
|
528
|
-
return null;
|
|
529
|
-
};
|
|
530
|
-
}
|
|
531
|
-
/**
|
|
532
|
-
* Validate the sum of control values in an FormArray not overflow the max value
|
|
533
|
-
*
|
|
534
|
-
* @param controlName the name of the control in FormArray
|
|
535
|
-
* @param max the maximum value
|
|
536
|
-
*/
|
|
537
|
-
static validSumMaxValue(controlName, max) {
|
|
538
|
-
return (array) => {
|
|
539
|
-
const controls = [];
|
|
540
|
-
if (array.length) {
|
|
541
|
-
for (const control of array.controls) {
|
|
542
|
-
const fromGroup = control;
|
|
543
|
-
if (fromGroup.controls[controlName] && isNotNilOrNaN(fromGroup.controls[controlName].value)) {
|
|
544
|
-
controls.push(fromGroup.controls[controlName]);
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
if (controls.reduce((sum, control) => sum + control.value, 0) > max) {
|
|
548
|
-
const error = { sumMaxValue: true };
|
|
549
|
-
controls.forEach((control) => {
|
|
550
|
-
let errors = control.errors || {};
|
|
551
|
-
errors = { ...errors, ...error };
|
|
552
|
-
control.setErrors(errors);
|
|
553
|
-
control.markAsTouched({ onlySelf: true });
|
|
554
|
-
});
|
|
555
|
-
return error;
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
controls.forEach((control) => SharedValidators.clearError(control, 'sumMaxValue'));
|
|
559
|
-
return null;
|
|
560
|
-
};
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
// @dynamic
|
|
564
|
-
export class SharedAsyncValidators {
|
|
565
|
-
static DEBOUNCE_TIME_VALIDATOR_ID = 0;
|
|
566
|
-
static get lastDebounceTimeId() {
|
|
567
|
-
return SharedAsyncValidators.DEBOUNCE_TIME_VALIDATOR_ID;
|
|
568
|
-
}
|
|
569
|
-
/**
|
|
570
|
-
* Add a debounce time to a validator.
|
|
571
|
-
*
|
|
572
|
-
* @param form
|
|
573
|
-
* @param validatorFn
|
|
574
|
-
* @param opts Use opts.stopSubject to stop the validator, before end
|
|
575
|
-
*/
|
|
576
|
-
static debounceTime(validatorFn, opts) {
|
|
577
|
-
// DEBUG only
|
|
578
|
-
const debug = opts?.debug || false;
|
|
579
|
-
const logPrefix = debug && `[debounceTime-validator] #${SharedAsyncValidators.DEBOUNCE_TIME_VALIDATOR_ID++} - `;
|
|
580
|
-
const debounceTime = toNumber(opts?.debounceTime, 250);
|
|
581
|
-
// DEBUG
|
|
582
|
-
if (debug)
|
|
583
|
-
console.debug(logPrefix + `New validator with a debounceTime at ${debounceTime}ms`);
|
|
584
|
-
const $disposeSubject = new Subject();
|
|
585
|
-
const disposeEvent$ = opts?.dispose ? merge($disposeSubject, opts?.dispose) : $disposeSubject;
|
|
586
|
-
// DEBUG
|
|
587
|
-
if (debug && opts?.dispose) {
|
|
588
|
-
opts?.dispose.pipe(first()).subscribe(() => {
|
|
589
|
-
console.debug(logPrefix + 'Stopping');
|
|
590
|
-
});
|
|
591
|
-
}
|
|
592
|
-
return (control) => {
|
|
593
|
-
if (debug)
|
|
594
|
-
console.debug(logPrefix + 'Form ask validation...');
|
|
595
|
-
// Stop previous observables
|
|
596
|
-
$disposeSubject.next();
|
|
597
|
-
let now;
|
|
598
|
-
return of(null).pipe(
|
|
599
|
-
// Add a delay before execution
|
|
600
|
-
delay(debounceTime),
|
|
601
|
-
// DEBUG
|
|
602
|
-
tap((_) => {
|
|
603
|
-
if (debug) {
|
|
604
|
-
console.debug(logPrefix + 'Executing...');
|
|
605
|
-
now = Date.now();
|
|
606
|
-
}
|
|
607
|
-
}), switchMap((_) => {
|
|
608
|
-
// Call the validator
|
|
609
|
-
const res = validatorFn(control);
|
|
610
|
-
// Make sure to return an Observable
|
|
611
|
-
if (isObservable(res))
|
|
612
|
-
return res;
|
|
613
|
-
if (res instanceof Promise)
|
|
614
|
-
return from(res);
|
|
615
|
-
return of(res);
|
|
616
|
-
}),
|
|
617
|
-
// DEBUG
|
|
618
|
-
tap((res) => debug && console.debug(logPrefix + `Finished in ${Date.now() - now}ms (${res ? 'with errors' : 'no error'})`, res)), catchError((error) => {
|
|
619
|
-
console.error(logPrefix + 'Error while executing validator. Stopping job', error);
|
|
620
|
-
$disposeSubject.next();
|
|
621
|
-
//throw error;
|
|
622
|
-
return null;
|
|
623
|
-
}),
|
|
624
|
-
// Refresh UI, after a successful execution
|
|
625
|
-
tap(() => opts?.markForCheck && opts?.markForCheck()),
|
|
626
|
-
// Make sure to stop, because of the switchMap
|
|
627
|
-
takeUntil(disposeEvent$));
|
|
628
|
-
};
|
|
629
|
-
}
|
|
630
|
-
/**
|
|
631
|
-
* Add an async validator, that can be disposed by the returned subscription
|
|
632
|
-
*
|
|
633
|
-
* @param form
|
|
634
|
-
* @param validatorFn the validator or job to execute
|
|
635
|
-
* @param opts
|
|
636
|
-
*/
|
|
637
|
-
static registerAsyncValidator(form, validatorFn, opts) {
|
|
638
|
-
if (form.asyncValidator)
|
|
639
|
-
throw Error('Form already have an async validator. Cannot configure job');
|
|
640
|
-
const debounceTime = toNumber(opts?.debounceTime, 250);
|
|
641
|
-
const $dispose = new Subject();
|
|
642
|
-
const asyncValidatorFn = SharedAsyncValidators.debounceTime(validatorFn, { ...opts, debounceTime, dispose: $dispose });
|
|
643
|
-
form.setAsyncValidators(asyncValidatorFn);
|
|
644
|
-
const subscription = new Subscription();
|
|
645
|
-
// When unsubscribing, remove async validator
|
|
646
|
-
subscription.add(() => {
|
|
647
|
-
// Clear added validator. Must be done NOW (without delay) because generally a new Job is given just after
|
|
648
|
-
form.clearAsyncValidators();
|
|
649
|
-
// Stop the job, with a delay to let the last execution finished
|
|
650
|
-
setTimeout(() => {
|
|
651
|
-
$dispose.next();
|
|
652
|
-
$dispose.unsubscribe();
|
|
653
|
-
}, debounceTime);
|
|
654
|
-
});
|
|
655
|
-
return subscription;
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL3ZhbGlkYXRvci92YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxlQUFlLEdBT2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFFBQVEsRUFBc0IsTUFBTSxRQUFRLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoSSxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5RSxXQUFXO0FBQ1gsTUFBTSxPQUFPLGdCQUFnQjtJQUNuQixNQUFNLENBQUMsb0JBQW9CLEdBQUc7UUFDcEMsUUFBUSxFQUFFLG1CQUFtQjtRQUM3QixDQUFDLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCO1FBQ3ZDLENBQUMsRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUI7UUFDN0MsQ0FBQyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQjtLQUM5QyxDQUFDO0lBRU0sTUFBTSxDQUFDLGVBQWUsQ0FBQyxXQUFtQjtRQUNoRCxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUM7WUFBRSxPQUFPLElBQUksQ0FB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RUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN2SCxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUxQyxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXhDLDZDQUE2QztRQUM3QyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNwQiwwR0FBMEc7WUFDMUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFFNUIsZ0VBQWdFO1lBQ2hFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNoQixRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQXN5bmNWYWxpZGF0b3JGbixcbiAgVW50eXBlZEZvcm1BcnJheSxcbiAgVW50eXBlZEZvcm1Db250cm9sLFxuICBVbnR5cGVkRm9ybUdyb3VwLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3JGbixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgaXNNb21lbnQsIE1vbWVudCwgdW5pdE9mVGltZSB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBQVUJLRVlfUkVHRVhQIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGlzRW1wdHlBcnJheSwgaXNOaWwsIGlzTmlsT3JCbGFuaywgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFuaywgaXNOb3ROaWxPck5hTiwgdG9Cb29sZWFuLCB0b051bWJlciB9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBEYXRlVXRpbHMsIGZyb21EYXRlSVNPU3RyaW5nIH0gZnJvbSAnLi4vZGF0ZXMnO1xuaW1wb3J0IHsgZGVsYXksIGZyb20sIGlzT2JzZXJ2YWJsZSwgbWVyZ2UsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpcnN0LCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vLyBAZHluYW1pY1xuZXhwb3J0IGNsYXNzIFNoYXJlZFZhbGlkYXRvcnMge1xuICBwcml2YXRlIHN0YXRpYyBfRE9VQkxFX1JFR0VYUF9DQUNIRSA9IHtcbiAgICBOT19MSU1JVDogL14tP1xcZCsoWy4sXVxcZCopPyQvLFxuICAgIDE6IC9eLT9cXGQrKFsuLF1cXGQpPyQvLCAvLyAxIGRlY2ltYWwgbWF4XG4gICAgMjogL14tP1xcZCsoWy4sXVxcZHsxLDJ9KT8kLywgLy8gMiBkZWNpbWFscyBtYXhcbiAgICAzOiAvXi0/XFxkKyhbLixdXFxkezEsM30pPyQvLCAvLyAzIGRlY2ltYWxzIG1heFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIGdldERvdWJsZVJlZ2V4cChtYXhEZWNpbWFsczogbnVtYmVyKTogUmVnRXhwIHtcbiAgICBpZiAoaXNOaWwobWF4RGVjaW1hbHMpKSByZXR1cm4gdGhpcy5fRE9VQkxFX1JFR0VYUF9DQUNIRS5OT19MSU1JVDtcblxuICAgIGlmIChtYXhEZWNpbWFscyA8IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtYXhEZWNpbWFscyB2YWx1ZTogJHttYXhEZWNpbWFsc31gKTtcbiAgICBjb25zdCByZWdleHAgPSB0aGlzLl9ET1VCTEVfUkVHRVhQX0NBQ0hFW21heERlY2ltYWxzXTtcbiAgICBpZiAocmVnZXhwKSByZXR1cm4gcmVnZXhwO1xuXG4gICAgLy8gTmV3OiBhZGQgdG8gY2FjaGVcbiAgICB0aGlzLl9ET1VCTEVfUkVHRVhQX0NBQ0hFW21heERlY2ltYWxzXSA9IG5ldyBSZWdFeHAoYF4tP1xcXFxkKyhbLixdXFxcXGR7MSwke21heERlY2ltYWxzfX0pPyRgKTtcbiAgICByZXR1cm4gdGhpcy5fRE9VQkxFX1JFR0VYUF9DQUNIRVttYXhEZWNpbWFsc107XG4gIH1cblxuICBzdGF0aWMgZXF1YWxzKG90aGVyQ29udHJvbE5hbWU6IHN0cmluZyk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGM6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IG90aGVyQ29udHJvbCA9IGMucGFyZW50Py5nZXQob3RoZXJDb250cm9sTmFtZSk7XG4gICAgICBpZiAob3RoZXJDb250cm9sICYmIGMudmFsdWUgIT09IG90aGVyQ29udHJvbC52YWx1ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVxdWFsczogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgcmVhZG9ubHkgSTE4Tl9FUlJPUl9LRVlTID0ge1xuICAgIHJlcXVpcmVkOiAnRVJST1IuRklFTERfUkVRVUlSRUQnLFxuICAgIG1pbjogJ0VSUk9SLkZJRUxEX01JTicsXG4gICAgbWF4OiAnRVJST1IuRklFTERfTUFYJyxcbiAgICBtaW5sZW5ndGg6ICdFUlJPUi5GSUVMRF9NSU5fTEVOR1RIJyxcbiAgICBtYXhsZW5ndGg6ICdFUlJPUi5GSUVMRF9NQVhfTEVOR1RIJyxcbiAgICBwdWJrZXk6ICdFUlJPUi5GSUVMRF9OT1RfVkFMSURfUFVCS0VZJyxcbiAgICB2YWxpZERhdGU6ICdFUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURScsXG4gICAgZGF0ZUlzQWZ0ZXI6ICdFUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9BRlRFUicsXG4gICAgZGF0ZUlzQmVmb3JlOiAnRVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfQkVGT1JFJyxcbiAgICBkYXRlUmFuZ2U6ICdFUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9SQU5HRScsXG4gICAgZGF0ZU1pbkR1cmF0aW9uOiAnRVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfTUlOX0RVUkFUSU9OJyxcbiAgICBkYXRlTWF4RHVyYXRpb246ICdFUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9NQVhfRFVSQVRJT04nLFxuICAgIG1heERlY2ltYWxzOiAnRVJST1IuRklFTERfTUFYSU1VTV9ERUNJTUFMUycsXG4gICAgZGVjaW1hbDogJ0VSUk9SLkZJRUxEX05PVF9WQUxJRF9ERUNJTUFMJyxcbiAgICBpbnRlZ2VyOiAnRVJST1IuRklFTERfTk9UX1ZBTElEX0lOVEVHRVInLFxuICAgIHByZWNpc2lvbjogJ0VSUk9SLkZJRUxEX05PVF9WQUxJRF9QUkVDSVNJT04nLFxuICAgIGVtYWlsOiAnRVJST1IuRklFTERfTk9UX1ZBTElEX0VNQUlMJyxcbiAgICBsYXRpdHVkZTogJ0VSUk9SLkZJRUxEX05PVF9WQUxJRF9MQVRJVFVERScsXG4gICAgbG9uZ2l0dWRlOiAnRVJST1IuRklFTERfTk9UX1ZBTElEX0xPTkdJVFVERScsXG4gICAgcGF0dGVybjogJ0VSUk9SLkZJRUxEX05PVF9WQUxJRF9QQVRURVJOJyxcbiAgICB1bmlxdWU6ICdFUlJPUi5GSUVMRF9OT1RfVU5JUVVFJyxcbiAgICBlbnRpdHk6ICdFUlJPUi5GSUVMRF9JTlZBTElEJyxcbiAgICBpbnZhbGlkOiAnRVJST1IuRklFTERfSU5WQUxJRCcsXG4gICAgaW5jb25zaXN0ZW50OiAnRVJST1IuRklFTERfSU5DT05TSVNURU5UJyxcbiAgICBlcXVhbHM6ICdFUlJPUi5GSUVMRF9OT1RfRVFVQUxTJyxcbiAgfTtcblxuICBzdGF0aWMgbGF0aXR1ZGUoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAoaXNOb3ROaWwodmFsdWUpICYmICh2YWx1ZSA8IC05MCB8fCB2YWx1ZSA+IDkwKSkge1xuICAgICAgcmV0dXJuIHsgbGF0aXR1ZGU6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdGF0aWMgbG9uZ2l0dWRlKGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgaWYgKGlzTm90TmlsKHZhbHVlKSAmJiAodmFsdWUgPCAtMTgwIHx8IHZhbHVlID4gMTgwKSkge1xuICAgICAgcmV0dXJuIHsgbG9uZ2l0dWRlOiB0cnVlIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIG9iamVjdChjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4geyBvYmplY3Q6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdGF0aWMgZW50aXR5KGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgaWYgKHZhbHVlICYmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IGlzTmlsKHZhbHVlLmlkKSkpIHtcbiAgICAgIHJldHVybiB7IGVudGl0eTogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBlbnRpdGllcyhjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICh2YWx1ZSAmJiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLmV2ZXJ5KChlKSA9PiBpc05pbChlPy5pZCkpKSkge1xuICAgICAgcmV0dXJuIHsgZW50aXR5OiB0cnVlIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIGVtcHR5KGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBpZiAoaXNOb3ROaWxPckJsYW5rKGNvbnRyb2wudmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBlbXB0eTogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBwdWJrZXkoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAodmFsdWUgJiYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgIVBVQktFWV9SRUdFWFAudGVzdCh2YWx1ZSkpKSB7XG4gICAgICByZXR1cm4geyBwdWJrZXk6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdGF0aWMgaW50ZWdlcihjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgaWYgKGlzTmlsT3JCbGFuayhjb250cm9sLnZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUZsb2F0KGNvbnRyb2wudmFsdWUpO1xuICAgIGlmIChpc05hTih2YWx1ZSkgfHwgKHZhbHVlIHwgMCkgIT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4geyBpbnRlZ2VyOiB0cnVlIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIGRlY2ltYWwob3B0cz86IHsgbWF4RGVjaW1hbHM/OiBudW1iZXIgfSk6IFZhbGlkYXRvckZuIHtcbiAgICBjb25zdCByZWdleHAgPSB0aGlzLmdldERvdWJsZVJlZ2V4cChvcHRzPy5tYXhEZWNpbWFscyk7XG4gICAgcmV0dXJuIChjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgICAvLyBERUJVR1xuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJXQVJOOiBHZXR0aW5nIGEgTmFOIHZhbHVlIChkZWNpbWFsIHdhcyBleHBlY3RlZCkgIVwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoaXNOb3ROaWwodmFsdWUpICYmIHZhbHVlICE9PSAnJyAmJiAhcmVnZXhwLnRlc3QodmFsdWUgYXMgc3RyaW5nKSkge1xuICAgICAgICByZXR1cm4gaXNOb3ROaWwob3B0cz8ubWF4RGVjaW1hbHMpID8geyBtYXhEZWNpbWFsczogeyBtYXhEZWNpbWFsczogb3B0cy5tYXhEZWNpbWFscyB9IH0gOiB7IGRlY2ltYWw6IHRydWUgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgcHJlY2lzaW9uLiBlLmcuIGlmIHByZWNpc2lvbj0wLjUgdGhlbiB2YWx1ZT0wLjYgaXMgaW52YWxpZCwgYnV0IDEuNSBpcyB2YWxpZFxuICAgKlxuICAgKiBAcGFyYW0gcHJlY2lzaW9uXG4gICAqL1xuICBzdGF0aWMgcHJlY2lzaW9uKHByZWNpc2lvbjogbnVtYmVyKTogVmFsaWRhdG9yRm4ge1xuICAgIGlmIChpc05pbChwcmVjaXNpb24pKSB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIGEgbm90IG5pbCBwcmVjaXNpb24nKTtcblxuICAgIC8vIFdBUk46IHdlIHNob3VsZCBkZWZpbmUgYSBtdWx0aXBsaWVyLCBiZWNhdXNlIG1vZHVsbyBpbiBqYXZhc2NyaXB0IHdpbGwgb25seSB3b3JrIG9uIGludGVnZXJcbiAgICAvLyAoZS5nLiBcIjcgJSAwLjFcIiBpbiBqYXZhc2NyaXB0IHdpbGwgTk9UIHJldHVybiB6ZXJvIChidXQgMC4wOTk5OTk5OTk5OTk5OTk2MilcbiAgICBjb25zdCBwcmVjaXNpb25OYkRlY2ltYWxzID0gKHByZWNpc2lvbi50b1N0cmluZygpLnNwbGl0KCcuJylbMV0gfHwgJycpLmxlbmd0aDtcbiAgICBjb25zdCBtdWx0aXBsaWVyID0gTWF0aC5wb3coMTAsIHByZWNpc2lvbk5iRGVjaW1hbHMpO1xuICAgIGNvbnN0IG11bHRpcGxpZWRQcmVjaXNpb24gPSBNYXRoLnJvdW5kKG11bHRpcGxpZXIgKiBwcmVjaXNpb24pO1xuXG4gICAgLy8gVGhlIHZhbGlkYXRvciBmdW5jdGlvblxuICAgIHJldHVybiAoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgaWYgKGlzTmlsT3JCbGFuayh2YWx1ZSkgfHwgTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIFdBUk46IENvbnZlcnQgdmFsdWUgaW50byBpbnRlZ2VyLCBiZWZvcmUgYXBwbHlpbmcgbW9kdWxvIG9wZXJhdG9yXG4gICAgICBjb25zdCBtb2QgPSBNYXRoLnJvdW5kKCt2YWx1ZSAqIG11bHRpcGxpZXIpICUgbXVsdGlwbGllZFByZWNpc2lvbjtcbiAgICAgIGlmIChtb2QgIT09IDApIHtcbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKGBXQVJOIEdldHRpbmcgYSAke3ZhbHVlfSB3aXRoIGFuIGludmFsaWQgcHJlY2lzaW9uIChleHBlY3RlZCBwcmVjaXNpb24gaXM6ICR7cHJlY2lzaW9ufSlgKTtcbiAgICAgICAgcmV0dXJuIHsgcHJlY2lzaW9uOiB7IHByZWNpc2lvbiB9IH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHZhbGlkRGF0ZVRpbWUocmVxdWlyZWRUaW1lID0gdHJ1ZSk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICAgIGNvbnN0IGRhdGUgPSAhdmFsdWUgfHwgaXNNb21lbnQodmFsdWUpID8gdmFsdWUgOiBmcm9tRGF0ZUlTT1N0cmluZyh2YWx1ZSwgeyBzdHJpY3Q6IGZhbHNlLCB1bmRlZmluZWRJZkludmFsaWQ6IGZhbHNlLCByZXF1aXJlZFRpbWUgfSk7XG4gICAgICBpZiAoZGF0ZSAmJiAoIWRhdGUuaXNWYWxpZCgpIHx8IGRhdGUueWVhcigpIDwgMTkwMCB8fCAocmVxdWlyZWRUaW1lICYmIERhdGVVdGlscy5pc05vVGltZShkYXRlKSkpKSB7XG4gICAgICAgIHJldHVybiB7IHZhbGlkRGF0ZTogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZERhdGUgPSBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZVRpbWUodHJ1ZSk7XG4gIHN0YXRpYyB2YWxpZERhdGVBbGxvd05vVGltZSA9IFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlVGltZShmYWxzZSk7XG5cbiAgc3RhdGljIGRhdGVJc0FmdGVyKHByZXZpb3VzVmFsdWU6IE1vbWVudCwgZXJyb3JQYXJhbTogc3RyaW5nLCBncmFudWxhcml0eT86IHVuaXRPZlRpbWUuU3RhcnRPZik6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZnJvbURhdGVJU09TdHJpbmcoY29udHJvbC52YWx1ZSk7XG4gICAgICBpZiAoaXNOb3ROaWwodmFsdWUpICYmIGlzTm90TmlsKHByZXZpb3VzVmFsdWUpICYmIHZhbHVlLmlzU2FtZU9yQmVmb3JlKHByZXZpb3VzVmFsdWUsIGdyYW51bGFyaXR5KSkge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIGVycm9yXG4gICAgICAgIHJldHVybiB7IGRhdGVJc0FmdGVyOiB7IG1pbkRhdGU6IGVycm9yUGFyYW0gfSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBkYXRlSXNCZWZvcmUobWF4VmFsdWU6IE1vbWVudCwgZXJyb3JQYXJhbTogc3RyaW5nLCBncmFudWxhcml0eT86IHVuaXRPZlRpbWUuU3RhcnRPZik6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZnJvbURhdGVJU09TdHJpbmcoY29udHJvbC52YWx1ZSk7XG4gICAgICBpZiAoaXNOb3ROaWwodmFsdWUpICYmIGlzTm90TmlsKG1heFZhbHVlKSAmJiB2YWx1ZS5pc1NhbWVPckFmdGVyKG1heFZhbHVlLCBncmFudWxhcml0eSkpIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBlcnJvclxuICAgICAgICByZXR1cm4geyBkYXRlSXNCZWZvcmU6IHsgbWF4RGF0ZTogZXJyb3JQYXJhbSB9IH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGRhdGVSYW5nZUVuZChzdGFydERhdGVGaWVsZE5hbWU6IHN0cmluZywgbXNnPzogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xuICAgIGNvbnN0IGVycm9yQ29kZSA9IG1zZyA/ICdtc2cnIDogJ2RhdGVSYW5nZSc7XG4gICAgY29uc3QgZXJyb3IgPSBtc2cgPyB7IG1zZyB9IDogeyBkYXRlUmFuZ2U6IHRydWUgfTtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIC8vIEZvcm0gZ3JvdXAgbm90IGNyZWF0ZWQgeWV0OiBza2lwXG4gICAgICBpZiAoIWNvbnRyb2wucGFyZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3Qgc3RhcnRDb250cm9sID0gY29udHJvbC5wYXJlbnQuZ2V0KHN0YXJ0RGF0ZUZpZWxkTmFtZSk7XG4gICAgICBpZiAoIXN0YXJ0Q29udHJvbCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYENhbm5vdCBmaW5kIGJyb3RoZXIgY29udHJvbCAnJHtzdGFydERhdGVGaWVsZE5hbWV9JyBpbiB0aGUgcGFyZW50IGZvcm1gKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGFydERhdGUgPSBmcm9tRGF0ZUlTT1N0cmluZyhzdGFydENvbnRyb2wudmFsdWUpO1xuICAgICAgY29uc3QgZW5kRGF0ZSA9IGZyb21EYXRlSVNPU3RyaW5nKGNvbnRyb2wudmFsdWUpO1xuICAgICAgLy8gRXJyb3IgaWYgdmFsdWUgPD0gYmVmb3JlRGF0ZVxuICAgICAgaWYgKGlzTm90TmlsKGVuZERhdGUpICYmIGlzTm90TmlsKHN0YXJ0RGF0ZSkgJiYgZW5kRGF0ZS5pc1NhbWVPckJlZm9yZShzdGFydERhdGUpKSB7XG4gICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIE9LOiBjbGVhciBleGlzdGluZyBlcnJvcnNcbiAgICAgIFNoYXJlZFZhbGlkYXRvcnMuY2xlYXJFcnJvcihjb250cm9sLCBlcnJvckNvZGUpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBkYXRlUmFuZ2VTdGFydChlbmREYXRlRmllbGROYW1lOiBzdHJpbmcsIG1zZz86IHN0cmluZyk6IFZhbGlkYXRvckZuIHtcbiAgICBjb25zdCBlcnJvckNvZGUgPSBtc2cgPyAnbXNnJyA6ICdkYXRlUmFuZ2UnO1xuICAgIGNvbnN0IGVycm9yID0gbXNnID8geyBtc2cgfSA6IHsgZGF0ZVJhbmdlOiB0cnVlIH07XG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAvLyBGb3JtIGdyb3VwIG5vdCBjcmVhdGVkIHlldDogc2tpcFxuICAgICAgaWYgKCFjb250cm9sLnBhcmVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IGVuZERhdGVDb250cm9sID0gY29udHJvbC5wYXJlbnQuZ2V0KGVuZERhdGVGaWVsZE5hbWUpO1xuICAgICAgaWYgKCFlbmREYXRlQ29udHJvbCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYENhbm5vdCBmaW5kIGNvbnRyb2wgJyR7ZW5kRGF0ZUZpZWxkTmFtZX0nIGluIHRoZSBwYXJlbnQgZm9ybWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVuZERhdGUgPSBmcm9tRGF0ZUlTT1N0cmluZyhlbmREYXRlQ29udHJvbC52YWx1ZSk7XG4gICAgICBjb25zdCBzdGFydERhdGUgPSBmcm9tRGF0ZUlTT1N0cmluZyhjb250cm9sLnZhbHVlKTtcbiAgICAgIC8vIEVycm9yIGlmIHZhbHVlIDw9IGJlZm9yZURhdGVcbiAgICAgIGlmIChpc05vdE5pbChzdGFydERhdGUpICYmIGlzTm90TmlsKGVuZERhdGUpICYmIHN0YXJ0RGF0ZS5pc1NhbWVPckFmdGVyKGVuZERhdGUpKSB7XG4gICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIE9LOiBjbGVhciBleGlzdGluZyBlcnJvcnNcbiAgICAgIFNoYXJlZFZhbGlkYXRvcnMuY2xlYXJFcnJvcihjb250cm9sLCBlcnJvckNvZGUpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBjb3B5UGFyZW50RXJyb3JzKGVycm9yTmFtZXM/OiBzdHJpbmdbXSk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIC8vIFNraXAgaWYgY29udHJvbCBhbHJlYWR5IGhhcyBzb21lIGVycm9yc1xuICAgICAgaWYgKGNvbnRyb2wuZXJyb3JzKSByZXR1cm4gbnVsbDtcbiAgICAgIC8vIFNraXAgaWYgcGFyZW50IGZvcm0gZ3JvdXAgbm90IGNyZWF0ZWQgeWV0XG4gICAgICBpZiAoIWNvbnRyb2wucGFyZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgLy8gRm9ybSBncm91cCBub3QgY3JlYXRlZCB5ZXRcbiAgICAgIGlmICghY29udHJvbC5wYXJlbnQpIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCBlcnJvcnMgPSBjb250cm9sLnBhcmVudC5lcnJvcnM7XG5cbiAgICAgIC8vIE5vIGVycm9ycywgb3IgY29weSBhbGwgZXJyb3JzXG4gICAgICBpZiAoIWVycm9ycyB8fCBpc0VtcHR5QXJyYXkoZXJyb3JOYW1lcykpIHJldHVybiBlcnJvcnM7XG5cbiAgICAgIC8vIENvcHkgb25seSBleHBlY3RlZCBlcnJvcnNcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlcnJvcnMpLnJlZHVjZSgocmVzLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGVycm9yTmFtZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHJlc1trZXldID0gZXJyb3JzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0sIHt9KTtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGNsZWFyRXJyb3IoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBlcnJvckNvZGU6IHN0cmluZykge1xuICAgIGlmIChjb250cm9sLmhhc0Vycm9yKGVycm9yQ29kZSkpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IGNvbnRyb2wuZXJyb3JzO1xuICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnNbZXJyb3JDb2RlXSkge1xuICAgICAgICAvLyBPbmx5IG9uZSBlcnJvcjogcmVzZXQgZXJyb3JzXG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlcnJvcnMpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyIGVycm9ycyBleGlzdHM6IGp1c3QgcmVtb3ZlIHRoaXMgZXJyb3JcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGVycm9yc1tlcnJvckNvZGVdO1xuICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKGVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY29weUVycm9yKHNvdXJjZUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgdGFyZ2V0Q29udHJvbDogQWJzdHJhY3RDb250cm9sLCBlcnJvckNvZGU6IHN0cmluZykge1xuICAgIGlmIChzb3VyY2VDb250cm9sLmhhc0Vycm9yKGVycm9yQ29kZSkpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHNvdXJjZUNvbnRyb2wuZXJyb3JzO1xuICAgICAgaWYgKGVycm9ycz8uW2Vycm9yQ29kZV0pIHtcbiAgICAgICAgdGFyZ2V0Q29udHJvbC5zZXRFcnJvcnMoe1xuICAgICAgICAgIC4uLnRhcmdldENvbnRyb2wuZXJyb3JzLFxuICAgICAgICAgIFtlcnJvckNvZGVdOiBlcnJvcnNbZXJyb3JDb2RlXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgU2hhcmVkVmFsaWRhdG9ycy5jbGVhckVycm9yKHRhcmdldENvbnRyb2wsIGVycm9yQ29kZSk7XG4gICAgfVxuICB9XG59XG5cbi8vIEBkeW5hbWljXG5leHBvcnQgY2xhc3MgU2hhcmVkRm9ybUdyb3VwVmFsaWRhdG9ycyB7XG4gIHN0YXRpYyBkYXRlUmFuZ2UoXG4gICAgc3RhcnREYXRlRmllbGQ6IHN0cmluZyxcbiAgICBlbmREYXRlRmllbGQ6IHN0cmluZyxcbiAgICBvcHRzPzogeyBtc2c/OiBzdHJpbmc7IGZpZWxkT25seT86IGJvb2xlYW47IHNraXBJZk5vVGltZT86IGJvb2xlYW4gfSB8IHN0cmluZ1xuICApOiBWYWxpZGF0b3JGbiB7XG4gICAgY29uc3QgbXNnID0gdHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnID8gb3B0cyA6IG9wdHM/Lm1zZztcbiAgICBjb25zdCBmaWVsZE9ubHkgPSB0eXBlb2Ygb3B0cyA9PT0gJ29iamVjdCcgPyBvcHRzPy5maWVsZE9ubHkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc2tpcElmTm9UaW1lID0gdHlwZW9mIG9wdHMgPT09ICdvYmplY3QnID8gb3B0cz8uc2tpcElmTm9UaW1lIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZXJyb3JDb2RlID0gaXNOb3ROaWxPckJsYW5rKG1zZykgPyAnbXNnJyA6ICdkYXRlUmFuZ2UnO1xuICAgIGNvbnN0IHJhbmdlRXJyb3IgPSBtc2cgPyB7IG1zZyB9IDogeyBkYXRlUmFuZ2U6IHRydWUgfTtcbiAgICByZXR1cm4gKGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3Qgc3RhcnREYXRlID0gZnJvbURhdGVJU09TdHJpbmcoZ3JvdXAuZ2V0KHN0YXJ0RGF0ZUZpZWxkKS52YWx1ZSk7XG4gICAgICBjb25zdCBlbmRGaWVsZCA9IGdyb3VwLmdldChlbmREYXRlRmllbGQpO1xuICAgICAgY29uc3QgZW5kRGF0ZSA9IGZyb21EYXRlSVNPU3RyaW5nKGVuZEZpZWxkLnZhbHVlKTtcblxuICAgICAgY29uc3QgaGFzU3RhcnREYXRlID0gaXNOb3ROaWwoc3RhcnREYXRlKSAmJiAoIXNraXBJZk5vVGltZSB8fCBEYXRlVXRpbHMuaXNOb1RpbWUoc3RhcnREYXRlKSk7XG4gICAgICBjb25zdCBoYXNFbmREYXRlID0gaXNOb3ROaWwoZW5kRGF0ZSkgJiYgKCFza2lwSWZOb1RpbWUgfHwgRGF0ZVV0aWxzLmlzTm9UaW1lKGVuZERhdGUpKTtcbiAgICAgIGlmIChoYXNTdGFydERhdGUgJiYgaGFzRW5kRGF0ZSAmJiBzdGFydERhdGUuaXNBZnRlcihlbmREYXRlKSkge1xuICAgICAgICAvLyBVcGRhdGUgZW5kIGZpZWxkXG4gICAgICAgIGVuZEZpZWxkLm1hcmtBc1BlbmRpbmcoKTtcbiAgICAgICAgZW5kRmllbGQuc2V0RXJyb3JzKHtcbiAgICAgICAgICAuLi5lbmRGaWVsZC5lcnJvcnMsXG4gICAgICAgICAgLi4ucmFuZ2VFcnJvcixcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFJldHVybiB0aGUgZXJyb3IgKHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBwYXJlbnQgZm9ybSwgYnkgZGVmYXVsdClcbiAgICAgICAgcmV0dXJuIGZpZWxkT25seSA/IG51bGwgOiByYW5nZUVycm9yO1xuICAgICAgfVxuICAgICAgLy8gT0s6IHJlbW92ZSB0aGUgZXhpc3Rpbmcgb24gdGhlIGVuZCBmaWVsZFxuICAgICAgU2hhcmVkVmFsaWRhdG9ycy5jbGVhckVycm9yKGVuZEZpZWxkLCBlcnJvckNvZGUpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBkYXRlTWF4RHVyYXRpb24oXG4gICAgc3RhcnREYXRlRmllbGQ6IHN0cmluZyxcbiAgICBlbmREYXRlRmllbGQ6IHN0cmluZyxcbiAgICBtYXhEdXJhdGlvbjogbnVtYmVyLFxuICAgIGR1cmF0aW9uVW5pdD86IG1vbWVudC51bml0T2ZUaW1lLkRpZmYsXG4gICAgb3B0cz86IHsgc2tpcElmTm9UaW1lPzogYm9vbGVhbiB9XG4gICk6IFZhbGlkYXRvckZuIHtcbiAgICBjb25zdCBtYXhEdXJhdGlvbkVycm9yID0geyBkYXRlTWF4RHVyYXRpb246IHRydWUgfTtcbiAgICBjb25zdCBza2lwSWZOb1RpbWUgPSBvcHRzPy5za2lwSWZOb1RpbWU7XG5cbiAgICByZXR1cm4gKGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3Qgc3RhcnREYXRlID0gZnJvbURhdGVJU09TdHJpbmcoZ3JvdXAuZ2V0KHN0YXJ0RGF0ZUZpZWxkKS52YWx1ZSk7XG4gICAgICBjb25zdCBlbmRGaWVsZCA9IGdyb3VwLmdldChlbmREYXRlRmllbGQpO1xuICAgICAgY29uc3QgZW5kRGF0ZSA9IGZyb21EYXRlSVNPU3RyaW5nKGVuZEZpZWxkLnZhbHVlKTtcblxuICAgICAgY29uc3QgaGFzU3RhcnREYXRlID0gaXNOb3ROaWwoc3RhcnREYXRlKSAmJiAoIXNraXBJZk5vVGltZSB8fCBEYXRlVXRpbHMuaXNOb1RpbWUoc3RhcnREYXRlKSk7XG4gICAgICBjb25zdCBoYXNFbmREYXRlID0gaXNOb3ROaWwoZW5kRGF0ZSkgJiYgKCFza2lwSWZOb1RpbWUgfHwgRGF0ZVV0aWxzLmlzTm9UaW1lKGVuZERhdGUpKTtcblxuICAgICAgaWYgKGhhc1N0YXJ0RGF0ZSAmJiBoYXNFbmREYXRlICYmIE1hdGguYWJzKHN0YXJ0RGF0ZS5kaWZmKGVuZERhdGUsIGR1cmF0aW9uVW5pdCkpID4gbWF4RHVyYXRpb24pIHtcbiAgICAgICAgLy8gVXBkYXRlIGVuZCBmaWVsZFxuICAgICAgICBlbmRGaWVsZC5tYXJrQXNUb3VjaGVkKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgIGVuZEZpZWxkLm1hcmtBc1BlbmRpbmcoKTtcbiAgICAgICAgZW5kRmllbGQuc2V0RXJyb3JzKHtcbiAgICAgICAgICAuLi5lbmRGaWVsZC5lcnJvcnMsXG4gICAgICAgICAgLi4ubWF4RHVyYXRpb25FcnJvcixcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFJldHVybiB0aGUgZXJyb3IgKHNob3VsZCBiZSBhcHBseSB0byB0aGUgcGFyZW50IGZvcm0pXG4gICAgICAgIHJldHVybiBtYXhEdXJhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgLy8gT0s6IHJlbW92ZSB0aGUgZXhpc3Rpbmcgb24gdGhlIGVuZCBmaWVsZFxuICAgICAgU2hhcmVkVmFsaWRhdG9ycy5jbGVhckVycm9yKGVuZEZpZWxkLCAnZGF0ZU1heER1cmF0aW9uJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGRhdGVNaW5EdXJhdGlvbihzdGFydERhdGVGaWVsZDogc3RyaW5nLCBlbmREYXRlRmllbGQ6IHN0cmluZywgbWluRHVyYXRpb246IG51bWJlciwgZHVyYXRpb25Vbml0PzogbW9tZW50LnVuaXRPZlRpbWUuRGlmZik6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgZW5kRmllbGQgPSBncm91cC5nZXQoZW5kRGF0ZUZpZWxkKTtcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGZyb21EYXRlSVNPU3RyaW5nKGdyb3VwLmdldChzdGFydERhdGVGaWVsZCkudmFsdWUpO1xuICAgICAgY29uc3QgZW5kRGF0ZSA9IGZyb21EYXRlSVNPU3RyaW5nKGVuZEZpZWxkLnZhbHVlKTtcbiAgICAgIGlmIChpc05vdE5pbChzdGFydERhdGUpICYmIGlzTm90TmlsKGVuZERhdGUpICYmIE1hdGguYWJzKHN0YXJ0RGF0ZS5kaWZmKGVuZERhdGUsIGR1cmF0aW9uVW5pdCkpIDwgbWluRHVyYXRpb24pIHtcbiAgICAgICAgLy8gVXBkYXRlIGVuZCBmaWVsZFxuICAgICAgICBjb25zdCBlbmRGaWVsZEVycm9yczogVmFsaWRhdGlvbkVycm9ycyA9IGVuZEZpZWxkLmVycm9ycyB8fCB7fTtcbiAgICAgICAgZW5kRmllbGRFcnJvcnNbJ2RhdGVNaW5EdXJhdGlvbiddID0gdHJ1ZTtcbiAgICAgICAgZW5kRmllbGQuc2V0RXJyb3JzKGVuZEZpZWxkRXJyb3JzKTtcbiAgICAgICAgZW5kRmllbGQubWFya0FzVG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICAvLyBSZXR1cm4gdGhlIGVycm9yIChzaG91bGQgYmUgYXBwbHkgdG8gdGhlIHBhcmVudCBmb3JtKVxuICAgICAgICByZXR1cm4geyBkYXRlTWluRHVyYXRpb246IHRydWUgfTtcbiAgICAgIH1cbiAgICAgIC8vIE9LOiByZW1vdmUgdGhlIGV4aXN0aW5nIG9uIHRoZSBlbmQgZmllbGRcbiAgICAgIGVsc2Uge1xuICAgICAgICBTaGFyZWRWYWxpZGF0b3JzLmNsZWFyRXJyb3IoZW5kRmllbGQsICdkYXRlTWluRHVyYXRpb24nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgcmVxdWlyZWRJZihcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBhbm90aGVyRmllbGRUb0NoZWNrOiBzdHJpbmcgfCBBYnN0cmFjdENvbnRyb2wsXG4gICAgb3B0cz86IHtcbiAgICAgIGZpZWxkT25seT86IGJvb2xlYW47XG4gICAgICBpc0VtcHR5PzogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbjtcbiAgICAgIHByZWRpY2F0ZT86IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGJvb2xlYW47XG4gICAgfVxuICApOiBWYWxpZGF0b3JGbiB7XG4gICAgY29uc3QgaXNFbXB0eSA9IG9wdHM/LmlzRW1wdHkgfHwgKChjb250cm9sKSA9PiBpc05pbE9yQmxhbmsoY29udHJvbD8udmFsdWUpKTtcbiAgICBjb25zdCBwcmVkaWNhdGUgPSBvcHRzPy5wcmVkaWNhdGUgfHwgKChjb250cm9sKSA9PiBpc05vdE5pbE9yQmxhbmsoY29udHJvbD8udmFsdWUpKTtcbiAgICByZXR1cm4gKGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IGdyb3VwLmdldChmaWVsZE5hbWUpO1xuICAgICAgaWYgKCFjb250cm9sKSB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIGNvbnRyb2wgJyR7ZmllbGROYW1lfScgdXNlZCBieSBTaGFyZUZvcm1Hcm91cFZhbGlkYXRvcnMucmVxdWlyZWRJZiB2YWxpZGF0b3IhYCk7XG4gICAgICBjb25zdCBhbm90aGVyQ29udHJvbCA9IGFub3RoZXJGaWVsZFRvQ2hlY2sgaW5zdGFuY2VvZiBBYnN0cmFjdENvbnRyb2wgPyBhbm90aGVyRmllbGRUb0NoZWNrIDogZ3JvdXAuZ2V0KGFub3RoZXJGaWVsZFRvQ2hlY2spO1xuICAgICAgaWYgKCFhbm90aGVyQ29udHJvbCkgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCBjb250cm9sICR7dHlwZW9mIGFub3RoZXJGaWVsZFRvQ2hlY2sgPT09ICdzdHJpbmcnID8gYW5vdGhlckZpZWxkVG9DaGVjayAgKyAnICcgOiAnJ311c2VkIGJ5IFNoYXJlRm9ybUdyb3VwVmFsaWRhdG9ycy5yZXF1aXJlZElmIHZhbGlkYXRvciFgKTtcbiAgICAgIGlmIChpc0VtcHR5KGNvbnRyb2wpICYmIHByZWRpY2F0ZShhbm90aGVyQ29udHJvbCkpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB7IHJlcXVpcmVkOiB0cnVlIH07XG4gICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKGVycm9yKTtcbiAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiBvcHRzPy5maWVsZE9ubHkgPyBudWxsIDogZXJyb3I7XG4gICAgICB9XG4gICAgICBTaGFyZWRWYWxpZGF0b3JzLmNsZWFyRXJyb3IoY29udHJvbCwgJ3JlcXVpcmVkJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHJlcXVpcmVkSWZUcnVlKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGFub3RoZXJGaWVsZFRvQ2hlY2s6IHN0cmluZyB8IEFic3RyYWN0Q29udHJvbCxcbiAgICBvcHRzPzoge1xuICAgICAgZmllbGRPbmx5PzogYm9vbGVhbjtcbiAgICAgIGlzRW1wdHk/OiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBib29sZWFuO1xuICAgIH1cbiAgKTogVmFsaWRhdG9yRm4ge1xuICAgIGNvbnN0IGlzRW1wdHkgPSBvcHRzPy5pc0VtcHR5IHx8ICgoY29udHJvbCkgPT4gaXNOaWxPckJsYW5rKGNvbnRyb2wudmFsdWUpKTtcbiAgICByZXR1cm4gKGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IGdyb3VwLmdldChmaWVsZE5hbWUpO1xuICAgICAgY29uc3QgYW5vdGhlckNvbnRyb2wgPSBhbm90aGVyRmllbGRUb0NoZWNrIGluc3RhbmNlb2YgQWJzdHJhY3RDb250cm9sID8gYW5vdGhlckZpZWxkVG9DaGVjayA6IGdyb3VwLmdldChhbm90aGVyRmllbGRUb0NoZWNrKTtcbiAgICAgIGlmICghYW5vdGhlckNvbnRyb2wpIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgZmllbGQgdG8gY2hlY2shJyk7XG4gICAgICBpZiAoaXNFbXB0eShjb250cm9sKSAmJiB0b0Jvb2xlYW4oYW5vdGhlckNvbnRyb2wudmFsdWUsIGZhbHNlKSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHsgcmVxdWlyZWQ6IHRydWUgfTtcbiAgICAgICAgY29udHJvbC5zZXRFcnJvcnMoZXJyb3IpO1xuICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIG9wdHM/LmZpZWxkT25seSA/IG51bGwgOiBlcnJvcjtcbiAgICAgIH1cbiAgICAgIFNoYXJlZFZhbGlkYXRvcnMuY2xlYXJFcnJvcihjb250cm9sLCAncmVxdWlyZWQnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgcmVxdWlyZWRJZkZhbHNlKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGFub3RoZXJGaWVsZFRvQ2hlY2s6IHN0cmluZyB8IEFic3RyYWN0Q29udHJvbCxcbiAgICBvcHRzPzoge1xuICAgICAgZmllbGRPbmx5PzogYm9vbGVhbjtcbiAgICAgIGlzRW1wdHk/OiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBib29sZWFuO1xuICAgIH1cbiAgKTogVmFsaWRhdG9yRm4ge1xuICAgIGNvbnN0IGlzRW1wdHkgPSBvcHRzPy5pc0VtcHR5IHx8ICgoY29udHJvbCkgPT4gaXNOaWxPckJsYW5rKGNvbnRyb2wudmFsdWUpKTtcbiAgICByZXR1cm4gKGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IGdyb3VwLmdldChmaWVsZE5hbWUpO1xuICAgICAgY29uc3QgYW5vdGhlckNvbnRyb2wgPSBhbm90aGVyRmllbGRUb0NoZWNrIGluc3RhbmNlb2YgQWJzdHJhY3RDb250cm9sID8gYW5vdGhlckZpZWxkVG9DaGVjayA6IGdyb3VwLmdldChhbm90aGVyRmllbGRUb0NoZWNrKTtcbiAgICAgIGlmICghYW5vdGhlckNvbnRyb2wpIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgZmllbGQgdG8gY2hlY2shJyk7XG4gICAgICBpZiAoaXNFbXB0eShjb250cm9sKSAmJiAhdG9Cb29sZWFuKGFub3RoZXJDb250cm9sLnZhbHVlLCBmYWxzZSkpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB7IHJlcXVpcmVkOiB0cnVlIH07XG4gICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKGVycm9yKTtcbiAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiBvcHRzPy5maWVsZE9ubHkgPyBudWxsIDogZXJyb3I7XG4gICAgICB9XG4gICAgICBTaGFyZWRWYWxpZGF0b3JzLmNsZWFyRXJyb3IoY29udHJvbCwgJ3JlcXVpcmVkJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHJlcXVpcmVkSWZFbXB0eShcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBhbm90aGVyRmllbGRUb0NoZWNrOiBzdHJpbmcsXG4gICAgb3B0cz86IHtcbiAgICAgIGZpZWxkT25seT86IGJvb2xlYW47XG4gICAgICBpc0VtcHR5PzogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbjtcbiAgICB9XG4gICk6IFZhbGlkYXRvckZuIHtcbiAgICBjb25zdCBpc0VtcHR5ID0gb3B0cz8uaXNFbXB0eSB8fCAoKGNvbnRyb2wpID0+IGlzTmlsT3JCbGFuayhjb250cm9sLnZhbHVlKSk7XG4gICAgcmV0dXJuIChncm91cDogVW50eXBlZEZvcm1Hcm91cCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBncm91cC5nZXQoZmllbGROYW1lKTtcbiAgICAgIGlmIChpc0VtcHR5KGNvbnRyb2wpICYmIGlzTmlsT3JCbGFuayhncm91cC5nZXQoYW5vdGhlckZpZWxkVG9DaGVjaykudmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0geyByZXF1aXJlZDogdHJ1ZSB9O1xuICAgICAgICBjb250cm9sLnNldEVycm9ycyhlcnJvcik7XG4gICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gb3B0cz8uZmllbGRPbmx5ID8gbnVsbCA6IGVycm9yO1xuICAgICAgfVxuICAgICAgU2hhcmVkVmFsaWRhdG9ycy5jbGVhckVycm9yKGNvbnRyb2wsICdyZXF1aXJlZCcpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBwcm9wYWdhdGVJZkRpcnR5KGZpZWxkTmFtZTogc3RyaW5nLCBmaWVsZE5hbWVUb1Byb3BhZ2F0ZTogc3RyaW5nLCB2YWx1ZVRvUHJvcGFnYXRlOiBhbnkpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChncm91cDogVW50eXBlZEZvcm1Hcm91cCk6IG51bGwgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IGdyb3VwLmdldChmaWVsZE5hbWUpO1xuICAgICAgY29uc3QgY29udHJvbFRvUHJvcGFnYXRlID0gZ3JvdXAuZ2V0KGZpZWxkTmFtZVRvUHJvcGFnYXRlKTtcbiAgICAgIGlmIChjb250cm9sLmRpcnR5ICYmIGNvbnRyb2xUb1Byb3BhZ2F0ZS52YWx1ZSAhPT0gdmFsdWVUb1Byb3BhZ2F0ZSkge1xuICAgICAgICBjb250cm9sVG9Qcm9wYWdhdGUuc2V0VmFsdWUodmFsdWVUb1Byb3BhZ2F0ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbWUgYXMgY29tcG9zZSwgYnV0IGtlZXAgb25seSB0aGUgZmlyc3QgZXJyb3JzIChpbnN0ZWFkIG9mIHRoZSB1bmlvbilcbiAgICpcbiAgICogQHBhcmFtIHZhbGlkYXRvcnNcbiAgICovXG4gIGZpcnN0KHZhbGlkYXRvcnM6IChWYWxpZGF0b3JGbiB8IG51bGwgfCB1bmRlZmluZWQpW10pOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgcmV0dXJuIChjb250cm9sKSA9PlxuICAgICAgdmFsaWRhdG9yc1xuICAgICAgICAuZmlsdGVyKGlzTm90TmlsKVxuICAgICAgICAubWFwKCh2YWxpZGF0b3IpID0+IHZhbGlkYXRvcihjb250cm9sKSlcbiAgICAgICAgLmZpbmQoaXNOb3ROaWwpIHx8IG51bGw7XG4gIH1cbn1cblxuLy8gQGR5bmFtaWNcbmV4cG9ydCBjbGFzcyBTaGFyZWRGb3JtQXJyYXlWYWxpZGF0b3JzIHtcbiAgLyoqXG4gICAqIFZhbGlkYXRlIHVuaXF1ZW5lc3Mgb2YgYW4gZW50aXR5IGluIGEgRm9ybUFycmF5XG4gICAqXG4gICAqIEBwYXJhbSBjb250cm9sTmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udHJvbCBpbiBGb3JtQXJyYXlcbiAgICovXG4gIHN0YXRpYyB1bmlxdWVFbnRpdHkoY29udHJvbE5hbWU6IHN0cmluZyk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGFycmF5OiBVbnR5cGVkRm9ybUFycmF5KTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgY29udHJvbHM6IEFic3RyYWN0Q29udHJvbFtdID0gW107XG4gICAgICBpZiAoYXJyYXkubGVuZ3RoKSB7XG4gICAgICAgIC8vIGdhdGhlciBjb250cm9scyBpbiBhcnJheSB3aXRoIHZhbGlkIGVudGl0eVxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgYXJyYXkuY29udHJvbHMpIHtcbiAgICAgICAgICBjb25zdCBmcm9tR3JvdXAgPSBjb250cm9sIGFzIFVudHlwZWRGb3JtR3JvdXA7XG4gICAgICAgICAgaWYgKGZyb21Hcm91cC5jb250cm9sc1tjb250cm9sTmFtZV0pIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZnJvbUdyb3VwLmNvbnRyb2xzW2NvbnRyb2xOYW1lXS52YWx1ZTtcbiAgICAgICAgICAgIGlmICghIXZhbHVlICYmICEhdmFsdWUuaWQpIGNvbnRyb2xzLnB1c2goZnJvbUdyb3VwLmNvbnRyb2xzW2NvbnRyb2xOYW1lXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGdldCBvY2N1cnJlbmNlcyBvZiBlbnRpdHkgYnkgaWRcbiAgICAgICAgY29uc3Qgb2NjdXJyZW5jZXMgPSBjb250cm9scy5yZWR1Y2UoKGFjYywgY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gY29udHJvbC52YWx1ZS5pZDtcbiAgICAgICAgICBpZiAoYWNjW2lkXSkgYWNjW2lkXSsrO1xuICAgICAgICAgIGVsc2UgYWNjW2lkXSA9IDE7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pO1xuICAgICAgICAvLyBnZXQgY29udHJvbHMgd2l0aCB2YWx1ZSBvY2N1cnJlbmNlcyA+IDFcbiAgICAgICAgY29uc3QgZXJyb3IgPSB7IHVuaXF1ZUVudGl0eTogdHJ1ZSB9O1xuICAgICAgICBsZXQgcmV0dXJuRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgY29udHJvbHNcbiAgICAgICAgICAuZmlsdGVyKChjb250cm9sKSA9PiBvY2N1cnJlbmNlc1tjb250cm9sLnZhbHVlLmlkXSA+IDEpXG4gICAgICAgICAgLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICAgIGxldCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgPSBjb250cm9sLmVycm9ycyB8fCB7fTtcbiAgICAgICAgICAgIGVycm9ycyA9IHsgLi4uZXJyb3JzLCAuLi5lcnJvciB9O1xuICAgICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMoZXJyb3JzKTtcbiAgICAgICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICBpZiAocmV0dXJuRXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IFNoYXJlZFZhbGlkYXRvcnMuY2xlYXJFcnJvcihjb250cm9sLCAndW5pcXVlRW50aXR5JykpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyByZXF1aXJlZEFycmF5TWluTGVuZ3RoKG1pbkxlbmd0aD86IG51bWJlcik6IFZhbGlkYXRvckZuIHtcbiAgICBtaW5MZW5ndGggPSBtaW5MZW5ndGggfHwgMTtcbiAgICByZXR1cm4gKGFycmF5OiBVbnR5cGVkRm9ybUFycmF5KTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgaWYgKCFhcnJheSB8fCBhcnJheS5sZW5ndGggPCBtaW5MZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHsgcmVxdWlyZWQ6IHRydWUgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgYXJyYXlNYXhMZW5ndGgobWF4TGVuZ3RoPzogbnVtYmVyKTogVmFsaWRhdG9yRm4ge1xuICAgIG1heExlbmd0aCA9IG1heExlbmd0aCB8fCAxO1xuICAgIHJldHVybiAoYXJyYXk6IFVudHlwZWRGb3JtQXJyYXkpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICBpZiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7IG1heExlbmd0aDogbWF4TGVuZ3RoIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBzdW0gb2YgY29udHJvbCB2YWx1ZXMgaW4gYW4gRm9ybUFycmF5IG5vdCBvdmVyZmxvdyB0aGUgbWF4IHZhbHVlXG4gICAqXG4gICAqIEBwYXJhbSBjb250cm9sTmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udHJvbCBpbiBGb3JtQXJyYXlcbiAgICogQHBhcmFtIG1heCB0aGUgbWF4aW11bSB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIHZhbGlkU3VtTWF4VmFsdWUoY29udHJvbE5hbWU6IHN0cmluZywgbWF4OiBudW1iZXIpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChhcnJheTogVW50eXBlZEZvcm1BcnJheSk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xzOiBBYnN0cmFjdENvbnRyb2xbXSA9IFtdO1xuICAgICAgaWYgKGFycmF5Lmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgYXJyYXkuY29udHJvbHMpIHtcbiAgICAgICAgICBjb25zdCBmcm9tR3JvdXAgPSBjb250cm9sIGFzIFVudHlwZWRGb3JtR3JvdXA7XG4gICAgICAgICAgaWYgKGZyb21Hcm91cC5jb250cm9sc1tjb250cm9sTmFtZV0gJiYgaXNOb3ROaWxPck5hTihmcm9tR3JvdXAuY29udHJvbHNbY29udHJvbE5hbWVdLnZhbHVlKSkge1xuICAgICAgICAgICAgY29udHJvbHMucHVzaChmcm9tR3JvdXAuY29udHJvbHNbY29udHJvbE5hbWVdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2xzLnJlZHVjZSgoc3VtLCBjb250cm9sKSA9PiBzdW0gKyBjb250cm9sLnZhbHVlLCAwKSA+IG1heCkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0geyBzdW1NYXhWYWx1ZTogdHJ1ZSB9O1xuICAgICAgICAgIGNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICAgIGxldCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgPSBjb250cm9sLmVycm9ycyB8fCB7fTtcbiAgICAgICAgICAgIGVycm9ycyA9IHsgLi4uZXJyb3JzLCAuLi5lcnJvciB9O1xuICAgICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMoZXJyb3JzKTtcbiAgICAgICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4gU2hhcmVkVmFsaWRhdG9ycy5jbGVhckVycm9yKGNvbnRyb2wsICdzdW1NYXhWYWx1ZScpKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgT2JzZXJ2YWJsZVZhbGlkYXRvckZuID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD47XG5leHBvcnQgdHlwZSBQcm9taXNlVmFsaWRhdG9yRm4gPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBQcm9taXNlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPjtcblxuLy8gQGR5bmFtaWNcbmV4cG9ydCBjbGFzcyBTaGFyZWRBc3luY1ZhbGlkYXRvcnMge1xuICBwcml2YXRlIHN0YXRpYyBERUJPVU5DRV9USU1FX1ZBTElEQVRPUl9JRCA9IDA7XG5cbiAgc3RhdGljIGdldCBsYXN0RGVib3VuY2VUaW1lSWQoKSB7XG4gICAgcmV0dXJuIFNoYXJlZEFzeW5jVmFsaWRhdG9ycy5ERUJPVU5DRV9USU1FX1ZBTElEQVRPUl9JRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBkZWJvdW5jZSB0aW1lIHRvIGEgdmFsaWRhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybVxuICAgKiBAcGFyYW0gdmFsaWRhdG9yRm5cbiAgICogQHBhcmFtIG9wdHMgVXNlIG9wdHMuc3RvcFN1YmplY3QgdG8gc3RvcCB0aGUgdmFsaWRhdG9yLCBiZWZvcmUgZW5kXG4gICAqL1xuICBzdGF0aWMgZGVib3VuY2VUaW1lKFxuICAgIHZhbGlkYXRvckZuOiBWYWxpZGF0b3JGbiB8IEFzeW5jVmFsaWRhdG9yRm4sXG4gICAgb3B0cz86IHtcbiAgICAgIGRpc3Bvc2U/OiBPYnNlcnZhYmxlPGFueT47XG4gICAgICBkZWJvdW5jZVRpbWU/OiBudW1iZXI7XG4gICAgICBtYXJrRm9yQ2hlY2s/OiAoKSA9PiB2b2lkO1xuICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgIH1cbiAgKTogT2JzZXJ2YWJsZVZhbGlkYXRvckZuIHtcbiAgICAvLyBERUJVRyBvbmx5XG4gICAgY29uc3QgZGVidWcgPSBvcHRzPy5kZWJ1ZyB8fCBmYWxzZTtcbiAgICBjb25zdCBsb2dQcmVmaXggPSBkZWJ1ZyAmJiBgW2RlYm91bmNlVGltZS12YWxpZGF0b3JdICMke1NoYXJlZEFzeW5jVmFsaWRhdG9ycy5ERUJPVU5DRV9USU1FX1ZBTElEQVRPUl9JRCsrfSAtIGA7XG4gICAgY29uc3QgZGVib3VuY2VUaW1lID0gdG9OdW1iZXIob3B0cz8uZGVib3VuY2VUaW1lLCAyNTApO1xuXG4gICAgLy8gREVCVUdcbiAgICBpZiAoZGVidWcpIGNvbnNvbGUuZGVidWcobG9nUHJlZml4ICsgYE5ldyB2YWxpZGF0b3Igd2l0aCBhIGRlYm91bmNlVGltZSBhdCAke2RlYm91bmNlVGltZX1tc2ApO1xuXG4gICAgY29uc3QgJGRpc3Bvc2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBjb25zdCBkaXNwb3NlRXZlbnQkID0gb3B0cz8uZGlzcG9zZSA/IG1lcmdlKCRkaXNwb3NlU3ViamVjdCwgb3B0cz8uZGlzcG9zZSkgOiAkZGlzcG9zZVN1YmplY3Q7XG5cbiAgICAvLyBERUJVR1xuICAgIGlmIChkZWJ1ZyAmJiBvcHRzPy5kaXNwb3NlKSB7XG4gICAgICBvcHRzPy5kaXNwb3NlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc29sZS5kZWJ1Zyhsb2dQcmVmaXggKyAnU3RvcHBpbmcnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoY29udHJvbCkgPT4ge1xuICAgICAgaWYgKGRlYnVnKSBjb25zb2xlLmRlYnVnKGxvZ1ByZWZpeCArICdGb3JtIGFzayB2YWxpZGF0aW9uLi4uJyk7XG5cbiAgICAgIC8vIFN0b3AgcHJldmlvdXMgb2JzZXJ2YWJsZXNcbiAgICAgICRkaXNwb3NlU3ViamVjdC5uZXh0KCk7XG4gICAgICBsZXQgbm93OiBudW1iZXI7XG5cbiAgICAgIHJldHVybiBvZihudWxsKS5waXBlKFxuICAgICAgICAvLyBBZGQgYSBkZWxheSBiZWZvcmUgZXhlY3V0aW9uXG4gICAgICAgIGRlbGF5KGRlYm91bmNlVGltZSksXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIHRhcCgoXykgPT4ge1xuICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1Zyhsb2dQcmVmaXggKyAnRXhlY3V0aW5nLi4uJyk7XG4gICAgICAgICAgICBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoXykgPT4ge1xuICAgICAgICAgIC8vIENhbGwgdGhlIHZhbGlkYXRvclxuICAgICAgICAgIGNvbnN0IHJlcyA9IHZhbGlkYXRvckZuKGNvbnRyb2wpO1xuICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0byByZXR1cm4gYW4gT2JzZXJ2YWJsZVxuICAgICAgICAgIGlmIChpc09ic2VydmFibGUocmVzKSkgcmV0dXJuIHJlcztcbiAgICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgUHJvbWlzZSkgcmV0dXJuIGZyb20ocmVzKTtcbiAgICAgICAgICByZXR1cm4gb2YocmVzKTtcbiAgICAgICAgfSksXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIHRhcCgocmVzKSA9PiBkZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKGxvZ1ByZWZpeCArIGBGaW5pc2hlZCBpbiAke0RhdGUubm93KCkgLSBub3d9bXMgKCR7cmVzID8gJ3dpdGggZXJyb3JzJyA6ICdubyBlcnJvcid9KWAsIHJlcykpLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IobG9nUHJlZml4ICsgJ0Vycm9yIHdoaWxlIGV4ZWN1dGluZyB2YWxpZGF0b3IuIFN0b3BwaW5nIGpvYicsIGVycm9yKTtcbiAgICAgICAgICAkZGlzcG9zZVN1YmplY3QubmV4dCgpO1xuICAgICAgICAgIC8vdGhyb3cgZXJyb3I7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pLFxuICAgICAgICAvLyBSZWZyZXNoIFVJLCBhZnRlciBhIHN1Y2Nlc3NmdWwgZXhlY3V0aW9uXG4gICAgICAgIHRhcCgoKSA9PiBvcHRzPy5tYXJrRm9yQ2hlY2sgJiYgb3B0cz8ubWFya0ZvckNoZWNrKCkpLFxuICAgICAgICAvLyBNYWtlIHN1cmUgdG8gc3RvcCwgYmVjYXVzZSBvZiB0aGUgc3dpdGNoTWFwXG4gICAgICAgIHRha2VVbnRpbChkaXNwb3NlRXZlbnQkKVxuICAgICAgKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBhc3luYyB2YWxpZGF0b3IsIHRoYXQgY2FuIGJlIGRpc3Bvc2VkIGJ5IHRoZSByZXR1cm5lZCBzdWJzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIGZvcm1cbiAgICogQHBhcmFtIHZhbGlkYXRvckZuIHRoZSB2YWxpZGF0b3Igb3Igam9iIHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIG9wdHNcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckFzeW5jVmFsaWRhdG9yKFxuICAgIGZvcm06IEFic3RyYWN0Q29udHJvbCxcbiAgICB2YWxpZGF0b3JGbjogVmFsaWRhdG9yRm4gfCBBc3luY1ZhbGlkYXRvckZuLFxuICAgIG9wdHM/OiB7XG4gICAgICBkZWJvdW5jZVRpbWU/OiBudW1iZXI7XG4gICAgICBtYXJrRm9yQ2hlY2s/OiAoKSA9PiB2b2lkO1xuICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgIH1cbiAgKTogU3Vic2NyaXB0aW9uIHtcbiAgICBpZiAoZm9ybS5hc3luY1ZhbGlkYXRvcikgdGhyb3cgRXJyb3IoJ0Zvcm0gYWxyZWFkeSBoYXZlIGFuIGFzeW5jIHZhbGlkYXRvci4gQ2Fubm90IGNvbmZpZ3VyZSBqb2InKTtcblxuICAgIGNvbnN0IGRlYm91bmNlVGltZSA9IHRvTnVtYmVyKG9wdHM/LmRlYm91bmNlVGltZSwgMjUwKTtcbiAgICBjb25zdCAkZGlzcG9zZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBjb25zdCBhc3luY1ZhbGlkYXRvckZuID0gU2hhcmVkQXN5bmNWYWxpZGF0b3JzLmRlYm91bmNlVGltZSh2YWxpZGF0b3JGbiwgeyAuLi5vcHRzLCBkZWJvdW5jZVRpbWUsIGRpc3Bvc2U6ICRkaXNwb3NlIH0pO1xuICAgIGZvcm0uc2V0QXN5bmNWYWxpZGF0b3JzKGFzeW5jVmFsaWRhdG9yRm4pO1xuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgLy8gV2hlbiB1bnN1YnNjcmliaW5nLCByZW1vdmUgYXN5bmMgdmFsaWRhdG9yXG4gICAgc3Vic2NyaXB0aW9uLmFkZCgoKSA9PiB7XG4gICAgICAvLyBDbGVhciBhZGRlZCB2YWxpZGF0b3IuIE11c3QgYmUgZG9uZSBOT1cgKHdpdGhvdXQgZGVsYXkpIGJlY2F1c2UgZ2VuZXJhbGx5IGEgbmV3IEpvYiBpcyBnaXZlbiBqdXN0IGFmdGVyXG4gICAgICBmb3JtLmNsZWFyQXN5bmNWYWxpZGF0b3JzKCk7XG5cbiAgICAgIC8vIFN0b3AgdGhlIGpvYiwgd2l0aCBhIGRlbGF5IHRvIGxldCB0aGUgbGFzdCBleGVjdXRpb24gZmluaXNoZWRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAkZGlzcG9zZS5uZXh0KCk7XG4gICAgICAgICRkaXNwb3NlLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9LCBkZWJvdW5jZVRpbWUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgfVxufVxuIl19
|