@sumaris-net/ngx-components 2.18.0-beta9 → 2.21.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 +3 -0
- package/doc/build.md +14 -14
- package/doc/changelog.md +1386 -88
- package/doc/feed/feed-en.json +26 -0
- package/doc/feed/feed-fr.json +28 -0
- package/fesm2022/sumaris-net.ngx-components.mjs +32423 -22727
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +42 -39
- package/src/assets/environments/environment-test.json +2 -2
- package/src/assets/i18n/en-US.json +143 -45
- package/src/assets/i18n/en.json +142 -43
- package/src/assets/i18n/fr.json +147 -47
- 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/_markdown.scss +1 -1
- package/src/theme/_material.globals.scss +4 -1
- package/src/theme/_material.scss +60 -17
- package/src/theme/_mixins.scss +39 -4
- package/src/theme/_ngx-components.forms.scss +115 -89
- package/src/theme/_ngx-components.globals.scss +4 -1
- package/src/theme/_ngx-components.scss +162 -110
- package/src/theme/_ngx-components.table.scss +105 -44
- package/src/theme/_ngx-components.tabs.scss +46 -14
- package/src/theme/_responsive.scss +15 -0
- package/src/theme/_roboto.scss +3 -0
- package/src/theme/_theme.scss +11 -14
- package/src/theme/_theme.variables.scss +7 -3
- 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 -358
- 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/services/filter/person.filter.mjs +0 -69
- package/esm2022/src/app/admin/services/person.service.mjs +0 -174
- package/esm2022/src/app/admin/services/validator/person.validator.mjs +0 -72
- package/esm2022/src/app/admin/users/users.mjs +0 -267
- package/esm2022/src/app/admin/users/users.module.mjs +0 -56
- package/esm2022/src/app/core/about/about.modal.mjs +0 -84
- package/esm2022/src/app/core/about/about.module.mjs +0 -21
- package/esm2022/src/app/core/account/account.module.mjs +0 -68
- package/esm2022/src/app/core/account/account.page.mjs +0 -351
- package/esm2022/src/app/core/account/new-token.modal.mjs +0 -132
- package/esm2022/src/app/core/account/password/change-password.form.mjs +0 -60
- 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 -144
- package/esm2022/src/app/core/account/token.table.mjs +0 -152
- 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 -77
- package/esm2022/src/app/core/core.module.mjs +0 -151
- package/esm2022/src/app/core/core.testing.module.mjs +0 -107
- package/esm2022/src/app/core/form/array/form-array.mjs +0 -325
- 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 -94
- package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -108
- 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 -265
- 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 -731
- package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +0 -24
- package/esm2022/src/app/core/form/entity/entity.module.mjs +0 -32
- package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +0 -194
- package/esm2022/src/app/core/form/form-container.class.mjs +0 -327
- package/esm2022/src/app/core/form/form.class.mjs +0 -336
- package/esm2022/src/app/core/form/form.module.mjs +0 -70
- package/esm2022/src/app/core/form/form.utils.mjs +0 -197
- package/esm2022/src/app/core/form/list/list.form.mjs +0 -235
- package/esm2022/src/app/core/form/list/list.module.mjs +0 -31
- package/esm2022/src/app/core/form/properties/properties.form.mjs +0 -225
- package/esm2022/src/app/core/form/properties/properties.module.mjs +0 -37
- package/esm2022/src/app/core/form/properties/properties.table.mjs +0 -268
- package/esm2022/src/app/core/form/properties/properties.utils.mjs +0 -60
- package/esm2022/src/app/core/form/properties/property.validator.mjs +0 -38
- package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +0 -95
- package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +0 -23
- 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 -30
- package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +0 -152
- package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +0 -31
- package/esm2022/src/app/core/form/username/username.form.mjs +0 -52
- 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 -783
- package/esm2022/src/app/core/graphql/graphql.utils.mjs +0 -119
- package/esm2022/src/app/core/home/home.mjs +0 -311
- package/esm2022/src/app/core/home/home.module.mjs +0 -42
- 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 -354
- package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +0 -31
- package/esm2022/src/app/core/menu/menu.component.mjs +0 -263
- package/esm2022/src/app/core/menu/menu.model.mjs +0 -272
- package/esm2022/src/app/core/menu/menu.module.mjs +0 -47
- package/esm2022/src/app/core/menu/menu.service.mjs +0 -655
- package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +0 -109
- package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +0 -49
- package/esm2022/src/app/core/menu/testing/menu.testing.mjs +0 -157
- 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 -203
- package/esm2022/src/app/core/peer/select-peer.module.mjs +0 -30
- package/esm2022/src/app/core/register/register-confirm.page.mjs +0 -90
- package/esm2022/src/app/core/register/register.form.mjs +0 -194
- 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 -1346
- package/esm2022/src/app/core/services/auth-guard.service.mjs +0 -74
- package/esm2022/src/app/core/services/base-entity-service.class.mjs +0 -473
- package/esm2022/src/app/core/services/base-graphql-service.class.mjs +0 -230
- package/esm2022/src/app/core/services/base58.mjs +0 -83
- package/esm2022/src/app/core/services/config/core.config.mjs +0 -233
- 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 -52
- package/esm2022/src/app/core/services/local-settings.service.mjs +0 -482
- package/esm2022/src/app/core/services/model/account.model.mjs +0 -150
- package/esm2022/src/app/core/services/model/config.model.mjs +0 -107
- 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 -224
- package/esm2022/src/app/core/services/model/filter.model.mjs +0 -93
- 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/peer.model.mjs +0 -93
- package/esm2022/src/app/core/services/model/person.model.mjs +0 -114
- package/esm2022/src/app/core/services/model/referential.model.mjs +0 -202
- package/esm2022/src/app/core/services/model/settings.model.mjs +0 -4
- package/esm2022/src/app/core/services/model/token.model.mjs +0 -56
- package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +0 -195
- package/esm2022/src/app/core/services/network.service.mjs +0 -631
- package/esm2022/src/app/core/services/network.types.mjs +0 -20
- package/esm2022/src/app/core/services/network.utils.mjs +0 -15
- 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 -54
- package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +0 -21
- package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +0 -37
- package/esm2022/src/app/core/services/platform.service.mjs +0 -583
- 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 -449
- 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 -45
- 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 -81
- 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 -22
- package/esm2022/src/app/core/settings/settings.page.mjs +0 -341
- package/esm2022/src/app/core/table/async-table.class.mjs +0 -1753
- package/esm2022/src/app/core/table/column/actions-column.component.mjs +0 -127
- package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +0 -117
- 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 -384
- package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +0 -401
- 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 -1816
- package/esm2022/src/app/core/table/table.model.mjs +0 -16
- package/esm2022/src/app/core/table/table.module.mjs +0 -51
- package/esm2022/src/app/core/table/table.pipes.mjs +0 -77
- package/esm2022/src/app/core/table/table.utils.mjs +0 -31
- package/esm2022/src/app/core/table/testing/table-validator.service.mjs +0 -32
- package/esm2022/src/app/core/table/testing/table.testing.mjs +0 -329
- package/esm2022/src/app/core/table/testing/table.testing.module.mjs +0 -25
- package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +0 -25
- package/esm2022/src/app/core/table/testing/table2.testing.mjs +0 -273
- package/esm2022/src/app/shared/alerts.mjs +0 -243
- package/esm2022/src/app/shared/audio/audio.mjs +0 -249
- 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/capacitor/keyboard.mjs +0 -42
- package/esm2022/src/app/shared/capacitor/plugins.mjs +0 -9
- package/esm2022/src/app/shared/constants.mjs +0 -16
- package/esm2022/src/app/shared/dates.mjs +0 -151
- package/esm2022/src/app/shared/debug/debug-service.class.mjs +0 -3
- package/esm2022/src/app/shared/debug/debug.component.mjs +0 -40
- 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/autotitle.directive.mjs +0 -32
- package/esm2022/src/app/shared/directives/directives.module.mjs +0 -22
- 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 -45
- package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +0 -17
- package/esm2022/src/app/shared/events.mjs +0 -63
- package/esm2022/src/app/shared/file/csv.utils.mjs +0 -92
- package/esm2022/src/app/shared/file/file.service.mjs +0 -118
- package/esm2022/src/app/shared/file/file.utils.mjs +0 -115
- 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 -24
- package/esm2022/src/app/shared/focusable.mjs +0 -6
- package/esm2022/src/app/shared/form/field.component.mjs +0 -379
- package/esm2022/src/app/shared/form/field.model.mjs +0 -25
- package/esm2022/src/app/shared/form/loading-spinner.mjs +0 -35
- package/esm2022/src/app/shared/forms.mjs +0 -480
- package/esm2022/src/app/shared/functions.mjs +0 -551
- package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +0 -82
- 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 -60
- package/esm2022/src/app/shared/graph/graph-colors.mjs +0 -213
- package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +0 -59
- package/esm2022/src/app/shared/help/help.modal.mjs +0 -63
- package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
- package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +0 -112
- package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +0 -24
- package/esm2022/src/app/shared/http/http.utils.mjs +0 -56
- package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +0 -388
- 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 -87
- 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 -106
- package/esm2022/src/app/shared/inputs.mjs +0 -263
- 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/material/autocomplete/material.autocomplete.config.mjs +0 -46
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -1071
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -79
- 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 -231
- 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 -71
- package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +0 -376
- package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +0 -61
- package/esm2022/src/app/shared/material/chips/chips.module.mjs +0 -75
- package/esm2022/src/app/shared/material/chips/material.chips.mjs +0 -779
- package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +0 -147
- package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +0 -76
- package/esm2022/src/app/shared/material/datetime/material.date.mjs +0 -471
- package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +0 -457
- package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +0 -681
- package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -136
- 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 -65
- package/esm2022/src/app/shared/material/duration/duration.utils.mjs +0 -33
- package/esm2022/src/app/shared/material/duration/material.duration.mjs +0 -274
- package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +0 -80
- package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +0 -313
- package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +0 -381
- package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +0 -67
- package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -118
- package/esm2022/src/app/shared/material/material.animations.mjs +0 -143
- package/esm2022/src/app/shared/material/material.config.mjs +0 -3
- package/esm2022/src/app/shared/material/material.module.mjs +0 -229
- 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 -375
- 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/testing/common.test.mjs +0 -111
- package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +0 -42
- package/esm2022/src/app/shared/material/text/text-form.component.mjs +0 -204
- package/esm2022/src/app/shared/material/text/text-form.module.mjs +0 -63
- package/esm2022/src/app/shared/modules.mjs +0 -12
- package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -303
- 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 -100
- package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +0 -156
- package/esm2022/src/app/shared/pipes/badge.pipes.mjs +0 -24
- package/esm2022/src/app/shared/pipes/colors.pipe.mjs +0 -29
- package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -49
- 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/duration.pipe.mjs +0 -36
- 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 -48
- package/esm2022/src/app/shared/pipes/html.pipes.mjs +0 -52
- package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +0 -42
- package/esm2022/src/app/shared/pipes/maps.pipe.mjs +0 -63
- package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +0 -67
- package/esm2022/src/app/shared/pipes/math.pipes.mjs +0 -59
- package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +0 -19
- package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +0 -30
- package/esm2022/src/app/shared/pipes/pipes.module.mjs +0 -236
- package/esm2022/src/app/shared/pipes/property.pipes.mjs +0 -136
- package/esm2022/src/app/shared/pipes/selection.pipes.mjs +0 -180
- package/esm2022/src/app/shared/pipes/string.pipes.mjs +0 -136
- 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/platforms.mjs +0 -45
- package/esm2022/src/app/shared/rx-state.module.mjs +0 -19
- package/esm2022/src/app/shared/services/entity-service.class.mjs +0 -7
- package/esm2022/src/app/shared/services/job.utils.mjs +0 -92
- package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +0 -349
- package/esm2022/src/app/shared/services/progress-bar.service.mjs +0 -31
- package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +0 -118
- package/esm2022/src/app/shared/services/startable-service.class.mjs +0 -107
- 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 -62
- package/esm2022/src/app/shared/shared-routing.module.mjs +0 -72
- package/esm2022/src/app/shared/shared.module.mjs +0 -234
- package/esm2022/src/app/shared/shared.testing.module.mjs +0 -100
- package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +0 -279
- 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 -52
- package/esm2022/src/app/shared/toast/toast.testing.module.mjs +0 -30
- package/esm2022/src/app/shared/toast/toasts.mjs +0 -144
- package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +0 -62
- package/esm2022/src/app/shared/toolbar/toolbar.mjs +0 -263
- 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 -106
- package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +0 -213
- 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 -114
- package/esm2022/src/app/shared/validator/validators.mjs +0 -601
- package/esm2022/src/app/shared/version/versions.mjs +0 -81
- package/esm2022/src/app/social/job/job.module.mjs +0 -23
- package/esm2022/src/app/social/job/progression/job-progression.component.mjs +0 -35
- package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +0 -235
- package/esm2022/src/app/social/job/progression/job-progression.list.mjs +0 -47
- 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 -140
- package/esm2022/src/app/social/message/message.modal.mjs +0 -110
- package/esm2022/src/app/social/message/message.model.mjs +0 -75
- package/esm2022/src/app/social/message/message.module.mjs +0 -22
- package/esm2022/src/app/social/message/message.service.mjs +0 -110
- package/esm2022/src/app/social/social.errors.mjs +0 -10
- package/esm2022/src/app/social/social.module.mjs +0 -22
- package/esm2022/src/app/social/social.testing.module.mjs +0 -40
- package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -127
- package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -260
- package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +0 -257
- 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 -23
- package/esm2022/src/app/social/user-event/user-event.service.mjs +0 -509
- package/esm2022/src/environments/environment.class.mjs +0 -57
- package/esm2022/src/environments/environment.loader.mjs +0 -77
- package/esm2022/src/environments/environment.mjs +0 -105
- package/esm2022/sumaris-net.ngx-components.mjs +0 -5
- package/index.d.ts +0 -5
- package/public_api.d.ts +0 -322
- 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/services/filter/person.filter.d.ts +0 -21
- package/src/app/admin/services/person.service.d.ts +0 -49
- package/src/app/admin/services/validator/person.validator.d.ts +0 -23
- package/src/app/admin/users/users.d.ts +0 -45
- package/src/app/admin/users/users.module.d.ts +0 -14
- package/src/app/core/about/about.modal.d.ts +0 -32
- package/src/app/core/about/about.module.d.ts +0 -10
- package/src/app/core/account/account.module.d.ts +0 -16
- package/src/app/core/account/account.page.d.ts +0 -80
- package/src/app/core/account/new-token.modal.d.ts +0 -41
- 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 -27
- 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 -26
- package/src/app/core/core.module.d.ts +0 -28
- package/src/app/core/core.testing.module.d.ts +0 -15
- package/src/app/core/form/array/form-array.d.ts +0 -136
- 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 -26
- package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +0 -37
- 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 -83
- 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 -204
- package/src/app/core/form/entity/entity-metadata.component.d.ts +0 -13
- package/src/app/core/form/entity/entity.module.d.ts +0 -10
- package/src/app/core/form/entity/tab-editor.class.d.ts +0 -70
- package/src/app/core/form/form-container.class.d.ts +0 -126
- package/src/app/core/form/form.class.d.ts +0 -144
- package/src/app/core/form/form.module.d.ts +0 -14
- package/src/app/core/form/form.utils.d.ts +0 -251
- package/src/app/core/form/list/list.form.d.ts +0 -81
- package/src/app/core/form/list/list.module.d.ts +0 -9
- package/src/app/core/form/properties/properties.form.d.ts +0 -66
- package/src/app/core/form/properties/properties.module.d.ts +0 -11
- package/src/app/core/form/properties/properties.table.d.ts +0 -78
- package/src/app/core/form/properties/properties.utils.d.ts +0 -27
- package/src/app/core/form/properties/property.validator.d.ts +0 -19
- package/src/app/core/form/properties/testing/properties-form.test.d.ts +0 -19
- package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +0 -12
- 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 -71
- package/src/app/core/form/text-popover/text-popover.module.d.ts +0 -9
- 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 -147
- package/src/app/core/graphql/graphql.utils.d.ts +0 -42
- package/src/app/core/home/home.d.ts +0 -94
- package/src/app/core/home/home.module.d.ts +0 -13
- 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 -64
- 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 -144
- package/src/app/core/menu/menu.module.d.ts +0 -12
- package/src/app/core/menu/menu.service.d.ts +0 -94
- 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 -51
- 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 -60
- package/src/app/core/peer/select-peer.module.d.ts +0 -10
- 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 -205
- package/src/app/core/services/auth-guard.service.d.ts +0 -17
- package/src/app/core/services/base-entity-service.class.d.ts +0 -123
- 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 -41
- 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 -63
- package/src/app/core/services/local-settings.service.d.ts +0 -95
- package/src/app/core/services/model/account.model.d.ts +0 -41
- package/src/app/core/services/model/config.model.d.ts +0 -36
- 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 -87
- 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/peer.model.d.ts +0 -30
- package/src/app/core/services/model/person.model.d.ts +0 -37
- package/src/app/core/services/model/referential.model.d.ts +0 -83
- package/src/app/core/services/model/settings.model.d.ts +0 -28
- 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 -53
- package/src/app/core/services/network.service.d.ts +0 -151
- package/src/app/core/services/network.types.d.ts +0 -5
- package/src/app/core/services/network.utils.d.ts +0 -31
- 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 -13
- package/src/app/core/services/pipes/usage-mode.pipes.d.ts +0 -15
- package/src/app/core/services/platform.service.d.ts +0 -100
- 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 -22
- 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 -11
- package/src/app/core/settings/settings.page.d.ts +0 -81
- package/src/app/core/table/async-table.class.d.ts +0 -389
- package/src/app/core/table/column/actions-column.component.d.ts +0 -59
- package/src/app/core/table/column/nav-actions-column.component.d.ts +0 -46
- package/src/app/core/table/column/row-field.component.d.ts +0 -40
- package/src/app/core/table/entities-async-table-datasource.class.d.ts +0 -81
- package/src/app/core/table/entities-table-datasource.class.d.ts +0 -95
- 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 -394
- package/src/app/core/table/table.model.d.ts +0 -26
- package/src/app/core/table/table.module.d.ts +0 -14
- package/src/app/core/table/table.pipes.d.ts +0 -28
- package/src/app/core/table/table.utils.d.ts +0 -11
- package/src/app/core/table/testing/table-validator.service.d.ts +0 -17
- package/src/app/core/table/testing/table.testing.d.ts +0 -54
- package/src/app/core/table/testing/table.testing.module.d.ts +0 -14
- package/src/app/core/table/testing/table2-validator.service.d.ts +0 -15
- package/src/app/core/table/testing/table2.testing.d.ts +0 -48
- package/src/app/shared/alerts.d.ts +0 -55
- package/src/app/shared/audio/audio.d.ts +0 -44
- 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/capacitor/keyboard.d.ts +0 -16
- package/src/app/shared/capacitor/plugins.d.ts +0 -7
- package/src/app/shared/constants.d.ts +0 -13
- package/src/app/shared/dates.d.ts +0 -48
- package/src/app/shared/debug/debug-service.class.d.ts +0 -5
- package/src/app/shared/debug/debug.component.d.ts +0 -13
- 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/autotitle.directive.d.ts +0 -10
- package/src/app/shared/directives/directives.module.d.ts +0 -12
- 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 -12
- package/src/app/shared/directives/resizable/resizable.module.d.ts +0 -8
- package/src/app/shared/events.d.ts +0 -28
- package/src/app/shared/file/csv.utils.d.ts +0 -24
- 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/focusable.d.ts +0 -4
- package/src/app/shared/form/field.component.d.ts +0 -74
- package/src/app/shared/form/field.model.d.ts +0 -39
- package/src/app/shared/form/loading-spinner.d.ts +0 -8
- package/src/app/shared/forms.d.ts +0 -118
- package/src/app/shared/functions.d.ts +0 -152
- package/src/app/shared/geolocation/geolocation.utils.d.ts +0 -19
- 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 -17
- 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/help/help.modal.d.ts +0 -33
- package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +0 -8
- package/src/app/shared/hotkeys/hotkeys.service.d.ts +0 -42
- package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +0 -11
- package/src/app/shared/http/http.utils.d.ts +0 -28
- package/src/app/shared/image/gallery/image-gallery.component.d.ts +0 -98
- 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 -5
- package/src/app/shared/image/image.module.d.ts +0 -8
- package/src/app/shared/image/image.service.d.ts +0 -32
- package/src/app/shared/inputs.d.ts +0 -34
- 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/material/autocomplete/material.autocomplete.config.d.ts +0 -55
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +0 -180
- package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +0 -22
- 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 -46
- 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 -93
- package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +0 -22
- package/src/app/shared/material/chips/chips.module.d.ts +0 -22
- package/src/app/shared/material/chips/material.chips.d.ts +0 -150
- package/src/app/shared/material/chips/testing/chips.test.d.ts +0 -32
- package/src/app/shared/material/datetime/datetime.module.d.ts +0 -24
- 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 -121
- package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +0 -37
- 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 -19
- package/src/app/shared/material/duration/duration.utils.d.ts +0 -3
- package/src/app/shared/material/duration/material.duration.d.ts +0 -58
- package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +0 -22
- package/src/app/shared/material/latlong/latlong.utils.d.ts +0 -21
- package/src/app/shared/material/latlong/material.latlong.d.ts +0 -70
- package/src/app/shared/material/latlong/material.latlong.module.d.ts +0 -20
- package/src/app/shared/material/latlong/testing/latlong.test.d.ts +0 -27
- package/src/app/shared/material/material.animations.d.ts +0 -6
- package/src/app/shared/material/material.config.d.ts +0 -3
- package/src/app/shared/material/material.module.d.ts +0 -45
- 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 -90
- 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/testing/common.test.d.ts +0 -25
- package/src/app/shared/material/text/testing/text-form.testing.d.ts +0 -19
- package/src/app/shared/material/text/text-form.component.d.ts +0 -66
- package/src/app/shared/material/text/text-form.module.d.ts +0 -16
- package/src/app/shared/modules.d.ts +0 -9
- package/src/app/shared/named-filter/named-filter-selector.component.d.ts +0 -60
- 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 -30
- package/src/app/shared/pipes/arrays.pipe.d.ts +0 -59
- 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 -23
- package/src/app/shared/pipes/date-format.pipe.d.ts +0 -35
- package/src/app/shared/pipes/date-from-now.pipe.d.ts +0 -12
- package/src/app/shared/pipes/duration.pipe.d.ts +0 -13
- 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 -15
- package/src/app/shared/pipes/latlong-format.pipe.d.ts +0 -20
- package/src/app/shared/pipes/maps.pipe.d.ts +0 -22
- package/src/app/shared/pipes/maskito.pipe.d.ts +0 -14
- package/src/app/shared/pipes/math.pipes.d.ts +0 -20
- package/src/app/shared/pipes/ng-init.pipe.d.ts +0 -8
- package/src/app/shared/pipes/number-format.pipe.d.ts +0 -10
- package/src/app/shared/pipes/pipes.module.d.ts +0 -31
- package/src/app/shared/pipes/property.pipes.d.ts +0 -47
- package/src/app/shared/pipes/selection.pipes.d.ts +0 -62
- package/src/app/shared/pipes/string.pipes.d.ts +0 -53
- 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/platforms.d.ts +0 -8
- package/src/app/shared/rx-state.module.d.ts +0 -10
- package/src/app/shared/services/entity-service.class.d.ts +0 -71
- package/src/app/shared/services/job.utils.d.ts +0 -20
- package/src/app/shared/services/memory-entity-service.class.d.ts +0 -78
- package/src/app/shared/services/progress-bar.service.d.ts +0 -20
- package/src/app/shared/services/startable-observable-service.class.d.ts +0 -36
- package/src/app/shared/services/startable-service.class.d.ts +0 -37
- 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 -10
- package/src/app/shared/shared-routing.module.d.ts +0 -23
- package/src/app/shared/shared.module.d.ts +0 -34
- package/src/app/shared/shared.testing.module.d.ts +0 -19
- package/src/app/shared/storage/storage-explorer.component.d.ts +0 -59
- 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 -11
- package/src/app/shared/toast/toasts.d.ts +0 -17
- package/src/app/shared/toolbar/modal-toolbar.d.ts +0 -21
- package/src/app/shared/toolbar/toolbar.d.ts +0 -68
- package/src/app/shared/toolbar/toolbar.module.d.ts +0 -16
- package/src/app/shared/types.d.ts +0 -31
- 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 -39
- package/src/app/shared/upload-file/upload-file.component.d.ts +0 -49
- 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 -130
- package/src/app/shared/version/versions.d.ts +0 -26
- package/src/app/social/job/job.module.d.ts +0 -12
- package/src/app/social/job/progression/job-progression.component.d.ts +0 -23
- package/src/app/social/job/progression/job-progression.icon.d.ts +0 -62
- package/src/app/social/job/progression/job-progression.list.d.ts +0 -19
- 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 -43
- package/src/app/social/message/message.model.d.ts +0 -33
- package/src/app/social/message/message.module.d.ts +0 -12
- package/src/app/social/message/message.service.d.ts +0 -32
- package/src/app/social/social.errors.d.ts +0 -9
- package/src/app/social/social.module.d.ts +0 -20
- package/src/app/social/social.testing.module.d.ts +0 -13
- package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +0 -32
- package/src/app/social/user-event/notification/user-event-notification.list.d.ts +0 -71
- package/src/app/social/user-event/testing/user-event.testing.d.ts +0 -35
- 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 -42
- 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 -13
- package/src/app/social/user-event/user-event.service.d.ts +0 -129
- package/src/environments/environment.class.d.ts +0 -68
- 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,783 +0,0 @@
|
|
|
1
|
-
import { firstValueFrom, of, Subject } from 'rxjs';
|
|
2
|
-
import { ApolloClient, ApolloLink, InMemoryCache, NetworkStatus, } from '@apollo/client/core';
|
|
3
|
-
import { ErrorCodes, ServerErrorCodes } from '../services/errors';
|
|
4
|
-
import { catchError, distinctUntilChanged, filter, first, map, mergeMap, takeUntil, throttleTime } from 'rxjs/operators';
|
|
5
|
-
import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';
|
|
6
|
-
import { AppWebSocket, createTrackerLink, isMutationOperation, isSubscriptionOperation, restoreTrackedQueries, StorageServiceWrapper, } from './graphql.utils';
|
|
7
|
-
import { RetryLink } from '@apollo/client/link/retry';
|
|
8
|
-
import queueLinkImported from 'apollo-link-queue';
|
|
9
|
-
import serializingLinkImported from 'apollo-link-serialize';
|
|
10
|
-
import loggerLinkImported from 'apollo-link-logger';
|
|
11
|
-
import { EntityUtils } from '../services/model/entity.model';
|
|
12
|
-
import { isNil, isNotEmptyArray, isNotNil, toNumber } from '../../shared/functions';
|
|
13
|
-
import { HttpHeaders } from '@angular/common/http';
|
|
14
|
-
import { persistCache } from 'apollo3-cache-persist';
|
|
15
|
-
import { ENVIRONMENT } from '../../../environments/environment.class';
|
|
16
|
-
import { StartableService } from '../../shared/services/startable-service.class';
|
|
17
|
-
import { isMobile } from '../../shared/platforms';
|
|
18
|
-
import { GraphQLWsLink } from '@apollo/client/link/subscriptions';
|
|
19
|
-
import { createClient } from 'graphql-ws';
|
|
20
|
-
import { unwrapESModule } from '../../shared/modules';
|
|
21
|
-
import { createFragmentRegistry } from '@apollo/client/cache/inmemory/fragmentRegistry';
|
|
22
|
-
import * as i0 from "@angular/core";
|
|
23
|
-
import * as i1 from "@ionic/angular";
|
|
24
|
-
import * as i2 from "apollo-angular";
|
|
25
|
-
import * as i3 from "apollo-angular/http";
|
|
26
|
-
import * as i4 from "../services/network.service";
|
|
27
|
-
import * as i5 from "../../shared/storage/storage.service";
|
|
28
|
-
import * as i6 from "../../../environments/environment.class";
|
|
29
|
-
// Workaround for issue https://github.com/ng-packagr/ng-packagr/issues/2215
|
|
30
|
-
const QueueLink = unwrapESModule(queueLinkImported);
|
|
31
|
-
const SerializingLink = unwrapESModule(serializingLinkImported);
|
|
32
|
-
const loggerLink = unwrapESModule(loggerLinkImported);
|
|
33
|
-
export const APP_GRAPHQL_TYPE_POLICIES = new InjectionToken('graphqlTypePolicies');
|
|
34
|
-
export const APP_GRAPHQL_FRAGMENTS = new InjectionToken('graphqlFragments');
|
|
35
|
-
export class GraphqlService extends StartableService {
|
|
36
|
-
platform;
|
|
37
|
-
apollo;
|
|
38
|
-
httpLink;
|
|
39
|
-
network;
|
|
40
|
-
storage;
|
|
41
|
-
environment;
|
|
42
|
-
typePolicies;
|
|
43
|
-
fragments;
|
|
44
|
-
_networkStatusChanged$;
|
|
45
|
-
httpParams;
|
|
46
|
-
wsParams;
|
|
47
|
-
connectionParams = {};
|
|
48
|
-
_defaultFetchPolicy;
|
|
49
|
-
onNetworkError = new Subject();
|
|
50
|
-
customErrors = {};
|
|
51
|
-
onResetAuth = new Subject();
|
|
52
|
-
get client() {
|
|
53
|
-
return this._data;
|
|
54
|
-
}
|
|
55
|
-
get cache() {
|
|
56
|
-
return this.apollo.client.cache;
|
|
57
|
-
}
|
|
58
|
-
get defaultFetchPolicy() {
|
|
59
|
-
return this._defaultFetchPolicy;
|
|
60
|
-
}
|
|
61
|
-
constructor(platform, apollo, httpLink, network, storage, environment, typePolicies, fragments) {
|
|
62
|
-
super(platform); // Wait platform
|
|
63
|
-
this.platform = platform;
|
|
64
|
-
this.apollo = apollo;
|
|
65
|
-
this.httpLink = httpLink;
|
|
66
|
-
this.network = network;
|
|
67
|
-
this.storage = storage;
|
|
68
|
-
this.environment = environment;
|
|
69
|
-
this.typePolicies = typePolicies;
|
|
70
|
-
this.fragments = fragments;
|
|
71
|
-
this._debug = !environment.production;
|
|
72
|
-
this._defaultFetchPolicy = environment.apolloFetchPolicy;
|
|
73
|
-
// Listen network status
|
|
74
|
-
this._networkStatusChanged$ = network.onNetworkStatusChanges.pipe(filter(isNotNil), distinctUntilChanged());
|
|
75
|
-
// When getting network error: try to ping peer, and toggle to offline
|
|
76
|
-
this.onNetworkError
|
|
77
|
-
.pipe(throttleTime(300), filter(() => this.network.online), mergeMap(() => this.network.checkPeerAlive()), filter((alive) => !alive))
|
|
78
|
-
.subscribe(() => this.network.setForceOffline(true, { showToast: true }));
|
|
79
|
-
}
|
|
80
|
-
async setAuthToken(token) {
|
|
81
|
-
if (token) {
|
|
82
|
-
console.debug('[graphql] Apply token authentication to headers');
|
|
83
|
-
this.connectionParams.authToken = token;
|
|
84
|
-
}
|
|
85
|
-
// Clean auth token
|
|
86
|
-
else if (this.connectionParams.authToken) {
|
|
87
|
-
console.debug('[graphql] Remove token authentication from headers');
|
|
88
|
-
delete this.connectionParams.authToken;
|
|
89
|
-
await this.clearCache();
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
async setAuthBasic(basic) {
|
|
93
|
-
if (basic) {
|
|
94
|
-
console.debug('[graphql] Apply basic authentication to headers');
|
|
95
|
-
this.connectionParams.authBasic = basic;
|
|
96
|
-
}
|
|
97
|
-
// Clean auth basic
|
|
98
|
-
else if (this.connectionParams.authBasic) {
|
|
99
|
-
console.debug('[graphql] Remove basic authentication from headers');
|
|
100
|
-
delete this.connectionParams.authBasic;
|
|
101
|
-
await this.clearCache();
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Allow to add a field resolver
|
|
106
|
-
* (see doc: https://www.apollographql.com/docs/react/data/local-state/#handling-client-fields-with-resolvers)
|
|
107
|
-
*
|
|
108
|
-
* @param resolvers
|
|
109
|
-
*/
|
|
110
|
-
async addResolver(resolvers) {
|
|
111
|
-
if (!this.started)
|
|
112
|
-
await this.ready();
|
|
113
|
-
this.apollo.client.addResolvers(resolvers);
|
|
114
|
-
}
|
|
115
|
-
async query(opts) {
|
|
116
|
-
if (!this.started)
|
|
117
|
-
await this.ready();
|
|
118
|
-
let res;
|
|
119
|
-
try {
|
|
120
|
-
res = await this.client.query({
|
|
121
|
-
query: opts.query,
|
|
122
|
-
variables: opts.variables,
|
|
123
|
-
fetchPolicy: opts.fetchPolicy || this._defaultFetchPolicy || undefined,
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
catch (err) {
|
|
127
|
-
res = this.toApolloError(err, opts.error);
|
|
128
|
-
}
|
|
129
|
-
if (res.errors) {
|
|
130
|
-
throw res.errors[0];
|
|
131
|
-
}
|
|
132
|
-
return res.data;
|
|
133
|
-
}
|
|
134
|
-
watchQueryRef(opts) {
|
|
135
|
-
return this.apollo.watchQuery({
|
|
136
|
-
query: opts.query,
|
|
137
|
-
variables: opts.variables,
|
|
138
|
-
fetchPolicy: opts.fetchPolicy || this._defaultFetchPolicy || undefined,
|
|
139
|
-
notifyOnNetworkStatusChange: true,
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
queryRefValuesChanges(queryRef, opts) {
|
|
143
|
-
return queryRef.valueChanges.pipe(catchError((error) => this.onApolloError(error, opts.error)), filter((value) => value.networkStatus === NetworkStatus.ready || value.networkStatus === NetworkStatus.error), map(({ data, errors }) => {
|
|
144
|
-
if (errors) {
|
|
145
|
-
throw errors[0];
|
|
146
|
-
}
|
|
147
|
-
return data;
|
|
148
|
-
}));
|
|
149
|
-
}
|
|
150
|
-
watchQuery(opts) {
|
|
151
|
-
const queryRef = this.watchQueryRef(opts);
|
|
152
|
-
return this.queryRefValuesChanges(queryRef, opts);
|
|
153
|
-
}
|
|
154
|
-
async mutate(opts) {
|
|
155
|
-
// If offline, compute an optimistic response for tracked queries
|
|
156
|
-
if ((opts.forceOffline || this.network.offline) && opts.offlineResponse) {
|
|
157
|
-
if (typeof opts.offlineResponse === 'function') {
|
|
158
|
-
opts.context = opts.context || {};
|
|
159
|
-
const optimisticResponseFn = opts.offlineResponse;
|
|
160
|
-
opts.optimisticResponse = await optimisticResponseFn(opts.context);
|
|
161
|
-
if (this._debug)
|
|
162
|
-
console.debug('[graphql] [offline] Using an optimistic response: ', opts.optimisticResponse);
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
opts.optimisticResponse = opts.offlineResponse;
|
|
166
|
-
}
|
|
167
|
-
if (opts.forceOffline) {
|
|
168
|
-
const res = { data: opts.optimisticResponse };
|
|
169
|
-
if (opts.update) {
|
|
170
|
-
opts.update(this.apollo.client.cache, res);
|
|
171
|
-
}
|
|
172
|
-
return res.data;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
const res = await firstValueFrom(this.apollo
|
|
176
|
-
.mutate({
|
|
177
|
-
mutation: opts.mutation,
|
|
178
|
-
variables: opts.variables,
|
|
179
|
-
context: opts.context,
|
|
180
|
-
optimisticResponse: opts.optimisticResponse,
|
|
181
|
-
update: opts.update,
|
|
182
|
-
})
|
|
183
|
-
.pipe(catchError((error) => this.onApolloError(error, opts.error)), first()
|
|
184
|
-
// To debug, if need:
|
|
185
|
-
//tap((res) => (!res) && console.error('[graphql] Unknown error during mutation. Check errors in console (may be an invalid generated cache id ?)'))
|
|
186
|
-
));
|
|
187
|
-
if (Array.isArray(res.errors)) {
|
|
188
|
-
throw res.errors[0];
|
|
189
|
-
}
|
|
190
|
-
return res.data;
|
|
191
|
-
}
|
|
192
|
-
subscribe(opts, extra) {
|
|
193
|
-
return this.apollo
|
|
194
|
-
.subscribe({
|
|
195
|
-
query: opts.query,
|
|
196
|
-
fetchPolicy: (opts && opts.fetchPolicy) || 'network-only',
|
|
197
|
-
errorPolicy: (opts && opts.errorPolicy) || undefined,
|
|
198
|
-
variables: opts.variables,
|
|
199
|
-
}, {
|
|
200
|
-
useZone: true,
|
|
201
|
-
...extra,
|
|
202
|
-
})
|
|
203
|
-
.pipe(catchError((error) => this.onApolloError(error, opts.error)), map(({ data, errors }) => {
|
|
204
|
-
if (errors) {
|
|
205
|
-
throw errors[0];
|
|
206
|
-
}
|
|
207
|
-
return data;
|
|
208
|
-
}));
|
|
209
|
-
}
|
|
210
|
-
insertIntoQueryCache(cache, opts) {
|
|
211
|
-
cache = cache || this.apollo.client.cache;
|
|
212
|
-
opts.arrayFieldName = opts.arrayFieldName || 'data';
|
|
213
|
-
try {
|
|
214
|
-
let data = cache.readQuery({ query: opts.query, variables: opts.variables });
|
|
215
|
-
if (!data)
|
|
216
|
-
return; // Skip: nothing in cache
|
|
217
|
-
if (data[opts.arrayFieldName]) {
|
|
218
|
-
// Copy because immutable
|
|
219
|
-
data = { ...data };
|
|
220
|
-
// Append to result array
|
|
221
|
-
data[opts.arrayFieldName] = [...data[opts.arrayFieldName], { ...opts.data }];
|
|
222
|
-
// Resort, if need
|
|
223
|
-
if (opts.sortFn) {
|
|
224
|
-
data[opts.arrayFieldName].sort(opts.sortFn);
|
|
225
|
-
}
|
|
226
|
-
// Exclude if exceed max size
|
|
227
|
-
const size = toNumber(opts.variables && opts.variables['size'], -1);
|
|
228
|
-
if (size > 0 && data[opts.arrayFieldName].length > size) {
|
|
229
|
-
data[opts.arrayFieldName].splice(size, data[opts.arrayFieldName].length - size);
|
|
230
|
-
}
|
|
231
|
-
// Increment total
|
|
232
|
-
if (isNotNil(opts.totalFieldName)) {
|
|
233
|
-
if (isNotNil(data[opts.totalFieldName])) {
|
|
234
|
-
data[opts.totalFieldName] += 1;
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
237
|
-
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.totalFieldName);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
cache.writeQuery({
|
|
241
|
-
query: opts.query,
|
|
242
|
-
variables: opts.variables,
|
|
243
|
-
data,
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
else {
|
|
247
|
-
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.arrayFieldName);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
catch (err) {
|
|
251
|
-
// continue
|
|
252
|
-
// read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940
|
|
253
|
-
if (this._debug)
|
|
254
|
-
console.error('[graphql] Error while updating cache: ', err);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
addManyToQueryCache(cache, opts) {
|
|
258
|
-
if (!opts.data || !opts.data.length)
|
|
259
|
-
return; // nothing to process
|
|
260
|
-
cache = cache || this.apollo.client.cache;
|
|
261
|
-
opts.arrayFieldName = opts.arrayFieldName || 'data';
|
|
262
|
-
try {
|
|
263
|
-
let data = cache.readQuery({ query: opts.query, variables: opts.variables });
|
|
264
|
-
if (!data)
|
|
265
|
-
return 0; // skip
|
|
266
|
-
if (data[opts.arrayFieldName]) {
|
|
267
|
-
// Copy because immutable
|
|
268
|
-
data = { ...data };
|
|
269
|
-
// Keep only not existing res
|
|
270
|
-
const equalsFn = opts.equalsFn || ((d1, d2) => d1['id'] === d2['id'] && d1['entityName'] === d2['entityName']);
|
|
271
|
-
const newItems = opts.data.filter((inputValue) => data[opts.arrayFieldName].findIndex((existingValue) => equalsFn(inputValue, existingValue)) === -1);
|
|
272
|
-
if (!newItems.length)
|
|
273
|
-
return; // No new value
|
|
274
|
-
// Append to array
|
|
275
|
-
data[opts.arrayFieldName] = [...data[opts.arrayFieldName], ...newItems];
|
|
276
|
-
// Resort, if need
|
|
277
|
-
if (opts.sortFn) {
|
|
278
|
-
data[opts.arrayFieldName].sort(opts.sortFn);
|
|
279
|
-
}
|
|
280
|
-
// Exclude if exceed max size
|
|
281
|
-
const size = toNumber(opts.variables && opts.variables['size'], -1);
|
|
282
|
-
if (size > 0 && data[opts.arrayFieldName].length > size) {
|
|
283
|
-
data[opts.arrayFieldName].splice(size, data[opts.arrayFieldName].length - size);
|
|
284
|
-
}
|
|
285
|
-
// Increment the total
|
|
286
|
-
if (isNotNil(opts.totalFieldName)) {
|
|
287
|
-
if (isNotNil(data[opts.totalFieldName])) {
|
|
288
|
-
data[opts.arrayFieldName] += newItems.length;
|
|
289
|
-
}
|
|
290
|
-
else {
|
|
291
|
-
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.totalFieldName);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
// Write to cache
|
|
295
|
-
cache.writeQuery({
|
|
296
|
-
query: opts.query,
|
|
297
|
-
variables: opts.variables,
|
|
298
|
-
data,
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
else {
|
|
302
|
-
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.arrayFieldName);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
catch (err) {
|
|
306
|
-
// continue
|
|
307
|
-
// read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940
|
|
308
|
-
if (this._debug)
|
|
309
|
-
console.warn('[graphql] Error while updating cache: ', err);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* Remove from cache, and return if removed or not
|
|
314
|
-
*
|
|
315
|
-
* @param cache
|
|
316
|
-
* @param opts
|
|
317
|
-
*/
|
|
318
|
-
removeFromCachedQueryById(cache, opts) {
|
|
319
|
-
cache = cache || this.apollo.client.cache;
|
|
320
|
-
opts.arrayFieldName = opts.arrayFieldName || 'data';
|
|
321
|
-
try {
|
|
322
|
-
let data = cache.readQuery({ query: opts.query, variables: opts.variables });
|
|
323
|
-
if (data && data[opts.arrayFieldName]) {
|
|
324
|
-
// Copy because immutable
|
|
325
|
-
data = { ...data };
|
|
326
|
-
const index = data[opts.arrayFieldName].findIndex((item) => item['id'] === opts.ids);
|
|
327
|
-
if (index === -1)
|
|
328
|
-
return false; // Skip (nothing removed)
|
|
329
|
-
// Copy, then remove deleted item
|
|
330
|
-
data[opts.arrayFieldName] = data[opts.arrayFieldName].slice();
|
|
331
|
-
const deletedItem = data[opts.arrayFieldName].splice(index, 1)[0];
|
|
332
|
-
cache.evict({ id: cache.identify(deletedItem) });
|
|
333
|
-
// Decrement the total
|
|
334
|
-
if (isNotNil(opts.totalFieldName)) {
|
|
335
|
-
if (isNotNil(data[opts.totalFieldName])) {
|
|
336
|
-
data[opts.totalFieldName] -= 1;
|
|
337
|
-
}
|
|
338
|
-
else {
|
|
339
|
-
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.totalFieldName);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
// Write to cache
|
|
343
|
-
cache.writeQuery({
|
|
344
|
-
query: opts.query,
|
|
345
|
-
variables: opts.variables,
|
|
346
|
-
data,
|
|
347
|
-
});
|
|
348
|
-
return true;
|
|
349
|
-
}
|
|
350
|
-
else {
|
|
351
|
-
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.arrayFieldName);
|
|
352
|
-
return false;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
catch (err) {
|
|
356
|
-
// continue
|
|
357
|
-
// read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940
|
|
358
|
-
if (this._debug)
|
|
359
|
-
console.warn('[graphql] Error while removing from cache: ', err);
|
|
360
|
-
return false;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* Remove ids from cache, and return the number of items removed
|
|
365
|
-
*
|
|
366
|
-
* @param cache
|
|
367
|
-
* @param opts
|
|
368
|
-
*/
|
|
369
|
-
removeFromCachedQueryByIds(cache, opts) {
|
|
370
|
-
cache = cache || this.apollo.client.cache;
|
|
371
|
-
opts.arrayFieldName = opts.arrayFieldName || 'data';
|
|
372
|
-
try {
|
|
373
|
-
let data = cache.readQuery(opts);
|
|
374
|
-
if (data && data[opts.arrayFieldName]) {
|
|
375
|
-
// Copy because immutable
|
|
376
|
-
data = { ...data };
|
|
377
|
-
const deletedIndexes = data[opts.arrayFieldName].reduce((res, item, index) => (opts.ids.includes(item['id']) ? res.concat(index) : res), []);
|
|
378
|
-
if (deletedIndexes.length <= 0)
|
|
379
|
-
return 0; // Skip (nothing removed)
|
|
380
|
-
// Query has NO total
|
|
381
|
-
if (isNil(opts.totalFieldName)) {
|
|
382
|
-
// Evict each object
|
|
383
|
-
deletedIndexes
|
|
384
|
-
.map((index) => data[opts.arrayFieldName][index])
|
|
385
|
-
.map((item) => cache.identify(item))
|
|
386
|
-
.forEach((id) => cache.evict({ id }));
|
|
387
|
-
}
|
|
388
|
-
// Query has a total
|
|
389
|
-
else {
|
|
390
|
-
// Copy the array
|
|
391
|
-
data[opts.arrayFieldName] = data[opts.arrayFieldName].slice();
|
|
392
|
-
// remove from array, then evict
|
|
393
|
-
deletedIndexes
|
|
394
|
-
// Reverse: to keep valid index
|
|
395
|
-
.reverse()
|
|
396
|
-
// Remove from the array
|
|
397
|
-
.map((index) => data[opts.arrayFieldName].splice(index, 1)[0])
|
|
398
|
-
// Evict from cache
|
|
399
|
-
.map((item) => cache.identify(item))
|
|
400
|
-
.forEach((id) => cache.evict({ id }));
|
|
401
|
-
if (isNotNil(data[opts.totalFieldName])) {
|
|
402
|
-
data[opts.totalFieldName] -= deletedIndexes.length; // Remove deletion count
|
|
403
|
-
}
|
|
404
|
-
else {
|
|
405
|
-
console.warn('[graphql] Unable to update the total in cached query. Unknown result part: ' + opts.totalFieldName);
|
|
406
|
-
}
|
|
407
|
-
cache.writeQuery({
|
|
408
|
-
query: opts.query,
|
|
409
|
-
variables: opts.variables,
|
|
410
|
-
data,
|
|
411
|
-
});
|
|
412
|
-
return deletedIndexes.length;
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
else {
|
|
416
|
-
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.arrayFieldName);
|
|
417
|
-
return 0;
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
catch (err) {
|
|
421
|
-
// continue
|
|
422
|
-
// read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940
|
|
423
|
-
if (this._debug)
|
|
424
|
-
console.warn('[graphql] Error while removing from cache: ', err);
|
|
425
|
-
return 0;
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
updateToQueryCache(cache, opts) {
|
|
429
|
-
cache = cache || this.apollo.client.cache;
|
|
430
|
-
opts.arrayFieldName = opts.arrayFieldName || 'data';
|
|
431
|
-
try {
|
|
432
|
-
let data = cache.readQuery(opts);
|
|
433
|
-
if (data && data[opts.arrayFieldName]) {
|
|
434
|
-
// Copy because immutable
|
|
435
|
-
data = { ...data };
|
|
436
|
-
const equalsFn = opts.equalsFn || ((d1, d2) => EntityUtils.equals(d1, d2, 'id'));
|
|
437
|
-
// Update if exists, or insert
|
|
438
|
-
const index = data[opts.arrayFieldName].findIndex((v) => equalsFn(opts.data, v));
|
|
439
|
-
if (index !== -1) {
|
|
440
|
-
data[opts.arrayFieldName] = data[opts.arrayFieldName].slice().splice(index, 1, opts.data);
|
|
441
|
-
}
|
|
442
|
-
else {
|
|
443
|
-
data[opts.arrayFieldName] = [...data[opts.arrayFieldName], opts.data];
|
|
444
|
-
}
|
|
445
|
-
// Increment total (if changed)
|
|
446
|
-
if (isNotNil(opts.totalFieldName) && index === -1) {
|
|
447
|
-
if (isNotNil(data[opts.totalFieldName])) {
|
|
448
|
-
data[opts.totalFieldName] += 1;
|
|
449
|
-
}
|
|
450
|
-
else {
|
|
451
|
-
console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.totalFieldName);
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
cache.writeQuery({
|
|
455
|
-
query: opts.query,
|
|
456
|
-
variables: opts.variables,
|
|
457
|
-
data,
|
|
458
|
-
});
|
|
459
|
-
return; // OK: stop here
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
catch (err) {
|
|
463
|
-
// continue
|
|
464
|
-
// read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940
|
|
465
|
-
if (this._debug)
|
|
466
|
-
console.warn('[graphql] Error while updating cache: ', err);
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
async clearCache(client) {
|
|
470
|
-
client = (client || this.client);
|
|
471
|
-
if (client) {
|
|
472
|
-
console.info('[graphql] Cleaning cache... ');
|
|
473
|
-
const now = this._debug && Date.now();
|
|
474
|
-
// Clearing the cache
|
|
475
|
-
await client.cache.reset();
|
|
476
|
-
if (this._debug)
|
|
477
|
-
console.debug(`[graphql] Cleaning cache [OK] in ${Date.now() - now}ms`);
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
registerCustomError(error) {
|
|
481
|
-
this.customErrors = { ...this.customErrors, ...error };
|
|
482
|
-
}
|
|
483
|
-
/* -- protected methods -- */
|
|
484
|
-
async ngOnStart() {
|
|
485
|
-
// Wait network and storage
|
|
486
|
-
await Promise.all([this.storage.ready(), this.network.ready()]);
|
|
487
|
-
console.info('[graphql] Starting graphql...');
|
|
488
|
-
const mobile = isMobile(window);
|
|
489
|
-
const enableTrackMutationQueries = !mobile;
|
|
490
|
-
const peer = this.network.peer;
|
|
491
|
-
if (!peer)
|
|
492
|
-
throw Error('[graphql] Missing peer. Unable to start graphql service');
|
|
493
|
-
const uri = peer.url + '/graphql';
|
|
494
|
-
const wsUrl = uri.replace(/^http(s)?:/, 'ws$1:') + '/websocket';
|
|
495
|
-
console.info('[graphql] Base uri: ' + uri);
|
|
496
|
-
console.info('[graphql] Subscription uri: ' + wsUrl);
|
|
497
|
-
this.httpParams = this.httpParams || {};
|
|
498
|
-
this.httpParams.uri = uri;
|
|
499
|
-
this.wsParams = {
|
|
500
|
-
...this.wsParams,
|
|
501
|
-
lazy: true,
|
|
502
|
-
connectionParams: this.connectionParams,
|
|
503
|
-
webSocketImpl: AppWebSocket,
|
|
504
|
-
url: wsUrl,
|
|
505
|
-
shouldRetry: (errOrCloseEvent) => {
|
|
506
|
-
// If WS URL changed, then do not retry
|
|
507
|
-
if (wsUrl !== this.wsParams.url) {
|
|
508
|
-
return false;
|
|
509
|
-
}
|
|
510
|
-
console.warn('[graphql-service] [WS] Trying to reconnect...', errOrCloseEvent);
|
|
511
|
-
return true;
|
|
512
|
-
},
|
|
513
|
-
retryAttempts: 10,
|
|
514
|
-
};
|
|
515
|
-
// Create a storage configuration
|
|
516
|
-
const storage = new StorageServiceWrapper(this.storage);
|
|
517
|
-
let client;
|
|
518
|
-
try {
|
|
519
|
-
client = this.apollo.client;
|
|
520
|
-
}
|
|
521
|
-
catch (err) {
|
|
522
|
-
// Since apollo-angular 7, missing client throw an exception
|
|
523
|
-
// Continue (client not exists)
|
|
524
|
-
}
|
|
525
|
-
if (!client) {
|
|
526
|
-
console.debug('[graphql] Creating Apollo GraphQL client...');
|
|
527
|
-
// Websocket link
|
|
528
|
-
const wsLink = new GraphQLWsLink(createClient(this.wsParams));
|
|
529
|
-
this.onResetAuth.pipe(takeUntil(this.stopSubject)).subscribe(() => {
|
|
530
|
-
console.info('[graphql] Closing websocket client, to force unauth');
|
|
531
|
-
wsLink.client.dispose();
|
|
532
|
-
});
|
|
533
|
-
// Retry when failed link
|
|
534
|
-
const retryLink = new RetryLink();
|
|
535
|
-
const authLink = new ApolloLink((operation, forward) => {
|
|
536
|
-
const authorization = [];
|
|
537
|
-
if (this.connectionParams.authToken) {
|
|
538
|
-
authorization.push(`token ${this.connectionParams.authToken}`);
|
|
539
|
-
}
|
|
540
|
-
if (this.connectionParams.authBasic) {
|
|
541
|
-
authorization.push(`Basic ${this.connectionParams.authBasic}`);
|
|
542
|
-
}
|
|
543
|
-
const headers = new HttpHeaders().append('Authorization', authorization);
|
|
544
|
-
// Use the setContext method to set the HTTP headers.
|
|
545
|
-
operation.setContext({
|
|
546
|
-
...operation.getContext(),
|
|
547
|
-
...{ headers },
|
|
548
|
-
});
|
|
549
|
-
// Call the next link in the middleware chain.
|
|
550
|
-
return forward(operation);
|
|
551
|
-
});
|
|
552
|
-
// Http link
|
|
553
|
-
const httpLink = this.httpLink.create(this.httpParams);
|
|
554
|
-
// Cache
|
|
555
|
-
const cache = new InMemoryCache({
|
|
556
|
-
typePolicies: this.typePolicies,
|
|
557
|
-
fragments: isNotEmptyArray(this.fragments) ? createFragmentRegistry(...this.fragments) : undefined,
|
|
558
|
-
});
|
|
559
|
-
// Add cache persistence
|
|
560
|
-
if (this.environment.persistCache) {
|
|
561
|
-
console.debug('[graphql] Starting persistence cache...');
|
|
562
|
-
await persistCache({
|
|
563
|
-
cache,
|
|
564
|
-
storage,
|
|
565
|
-
trigger: this.platform.is('android') ? 'background' : 'write',
|
|
566
|
-
debounce: 1000,
|
|
567
|
-
debug: true,
|
|
568
|
-
});
|
|
569
|
-
}
|
|
570
|
-
let mutationLinks;
|
|
571
|
-
// Add queue to store tracked queries, when offline
|
|
572
|
-
if (enableTrackMutationQueries) {
|
|
573
|
-
const serializingLink = new SerializingLink();
|
|
574
|
-
const trackerLink = createTrackerLink({
|
|
575
|
-
storage,
|
|
576
|
-
onNetworkStatusChange: this._networkStatusChanged$,
|
|
577
|
-
debounce: 1000,
|
|
578
|
-
debug: true,
|
|
579
|
-
});
|
|
580
|
-
// Creating a mutation queue
|
|
581
|
-
const queueLink = new QueueLink();
|
|
582
|
-
this.registerSubscription(this._networkStatusChanged$.subscribe((type) => {
|
|
583
|
-
// Network is offline: start buffering into queue
|
|
584
|
-
if (type === 'none') {
|
|
585
|
-
console.info('[graphql] offline mode: enable mutations buffer');
|
|
586
|
-
queueLink.close();
|
|
587
|
-
}
|
|
588
|
-
// Network is online
|
|
589
|
-
else {
|
|
590
|
-
console.info('[graphql] online mode: disable mutations buffer');
|
|
591
|
-
queueLink.open();
|
|
592
|
-
}
|
|
593
|
-
}));
|
|
594
|
-
mutationLinks = [loggerLink, queueLink, trackerLink, queueLink, serializingLink, retryLink, authLink, httpLink];
|
|
595
|
-
}
|
|
596
|
-
else {
|
|
597
|
-
mutationLinks = [retryLink, authLink, httpLink];
|
|
598
|
-
}
|
|
599
|
-
// create Apollo
|
|
600
|
-
client = new ApolloClient({
|
|
601
|
-
cache,
|
|
602
|
-
link: ApolloLink.split(
|
|
603
|
-
// Handle mutations
|
|
604
|
-
isMutationOperation, ApolloLink.from(mutationLinks), ApolloLink.split(
|
|
605
|
-
// Handle subscriptions
|
|
606
|
-
isSubscriptionOperation, wsLink,
|
|
607
|
-
// Handle queries
|
|
608
|
-
ApolloLink.from([retryLink, authLink, httpLink]))),
|
|
609
|
-
// For @apollo/client < 3.11
|
|
610
|
-
connectToDevTools: !this.environment.production,
|
|
611
|
-
// For @apollo/client 3.11+
|
|
612
|
-
devtools: {
|
|
613
|
-
enabled: !this.environment.production,
|
|
614
|
-
name: 'GraphqlService Client',
|
|
615
|
-
},
|
|
616
|
-
});
|
|
617
|
-
this.apollo.client = client;
|
|
618
|
-
}
|
|
619
|
-
// Enable tracked queries persistence
|
|
620
|
-
if (enableTrackMutationQueries && this.environment.persistCache) {
|
|
621
|
-
try {
|
|
622
|
-
await restoreTrackedQueries({
|
|
623
|
-
apolloClient: client,
|
|
624
|
-
storage,
|
|
625
|
-
debug: true,
|
|
626
|
-
});
|
|
627
|
-
}
|
|
628
|
-
catch (err) {
|
|
629
|
-
console.error('[graphql] Failed to restore tracked queries from storage: ' + ((err && err.message) || err), err);
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
// Listen for network restart
|
|
633
|
-
this.registerSubscription(this.network.on('start', () => this.restart()));
|
|
634
|
-
// Listen for clear cache request, from network
|
|
635
|
-
this.registerSubscription(this.network.on('resetCache', () => this.clearCache()));
|
|
636
|
-
console.info('[graphql] Starting graphql [OK]');
|
|
637
|
-
return client;
|
|
638
|
-
}
|
|
639
|
-
async ngOnStop() {
|
|
640
|
-
console.info('[graphql] Stopping graphql service...');
|
|
641
|
-
await this.resetClient();
|
|
642
|
-
}
|
|
643
|
-
async resetClient(client) {
|
|
644
|
-
try {
|
|
645
|
-
client = (client || this.apollo.client);
|
|
646
|
-
}
|
|
647
|
-
catch (err) {
|
|
648
|
-
// Since apollo-angular 7, missing client throw an exception
|
|
649
|
-
// Continue (client not exists)
|
|
650
|
-
}
|
|
651
|
-
if (!client)
|
|
652
|
-
return;
|
|
653
|
-
console.info('[graphql] Resetting Apollo client...');
|
|
654
|
-
client.stop();
|
|
655
|
-
this.onResetAuth.next();
|
|
656
|
-
await Promise.all([client.clearStore(), this.clearCache(client)]);
|
|
657
|
-
}
|
|
658
|
-
onApolloError(err, defaultError) {
|
|
659
|
-
return of(this.toApolloError(err, defaultError));
|
|
660
|
-
}
|
|
661
|
-
toApolloError(err, defaultError) {
|
|
662
|
-
let error =
|
|
663
|
-
// If network error: try to convert to App (read as JSON), or create an UNKNOWN_NETWORK_ERROR
|
|
664
|
-
(err.networkError &&
|
|
665
|
-
((err.networkError.error && this.toAppError(err.networkError.error)) ||
|
|
666
|
-
this.toAppError(err.networkError) ||
|
|
667
|
-
(err.networkError.error && this.createAppErrorByCode(err.networkError.error.status)) ||
|
|
668
|
-
this.createAppErrorByCode(ErrorCodes.UNKNOWN_NETWORK_ERROR))) ||
|
|
669
|
-
// If graphQL: try to convert the first error found
|
|
670
|
-
(err.graphQLErrors && err.graphQLErrors.length && this.toAppError(err.graphQLErrors[0])) ||
|
|
671
|
-
this.toAppError(err) ||
|
|
672
|
-
this.toAppError(err.originalError) ||
|
|
673
|
-
(err.graphQLErrors && err.graphQLErrors[0]) ||
|
|
674
|
-
err;
|
|
675
|
-
console.error('[graphql] ' + ((error && error.message) || error), error.stack || '');
|
|
676
|
-
if (error?.code === ErrorCodes.UNKNOWN_NETWORK_ERROR && err.networkError?.message) {
|
|
677
|
-
console.error('[graphql] original error: ' + err.networkError.message);
|
|
678
|
-
this.onNetworkError.next(error);
|
|
679
|
-
}
|
|
680
|
-
// Apply default error, and store original error into error's details
|
|
681
|
-
if ((!error || !error.code || error.code === ErrorCodes.INTERNAL_SERVER_ERROR) && defaultError) {
|
|
682
|
-
error = { ...defaultError, details: error, stack: err.stack };
|
|
683
|
-
if (defaultError.message) {
|
|
684
|
-
error.message = defaultError.message;
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
return {
|
|
688
|
-
data: null,
|
|
689
|
-
errors: [error],
|
|
690
|
-
loading: false,
|
|
691
|
-
networkStatus: NetworkStatus.error,
|
|
692
|
-
};
|
|
693
|
-
}
|
|
694
|
-
createAppErrorByCode(errorCode) {
|
|
695
|
-
const message = this.getI18nErrorMessageByCode(errorCode);
|
|
696
|
-
if (message) {
|
|
697
|
-
return {
|
|
698
|
-
code: errorCode,
|
|
699
|
-
message,
|
|
700
|
-
};
|
|
701
|
-
}
|
|
702
|
-
return undefined;
|
|
703
|
-
}
|
|
704
|
-
getI18nErrorMessageByCode(errorCode) {
|
|
705
|
-
// look in registered error codes
|
|
706
|
-
const customErrorMessage = this.customErrors[errorCode];
|
|
707
|
-
if (customErrorMessage) {
|
|
708
|
-
return customErrorMessage;
|
|
709
|
-
}
|
|
710
|
-
// Default, switch on error code
|
|
711
|
-
switch (errorCode) {
|
|
712
|
-
case ServerErrorCodes.UNAUTHORIZED:
|
|
713
|
-
return 'ERROR.UNAUTHORIZED';
|
|
714
|
-
case ServerErrorCodes.FORBIDDEN:
|
|
715
|
-
return 'ERROR.FORBIDDEN';
|
|
716
|
-
case ErrorCodes.UNKNOWN_NETWORK_ERROR:
|
|
717
|
-
return 'ERROR.UNKNOWN_NETWORK_ERROR';
|
|
718
|
-
case ServerErrorCodes.BAD_UPDATE_DATE:
|
|
719
|
-
return 'ERROR.BAD_UPDATE_DATE';
|
|
720
|
-
case ServerErrorCodes.DATA_LOCKED:
|
|
721
|
-
return 'ERROR.DATA_LOCKED';
|
|
722
|
-
case ServerErrorCodes.BAD_APP_VERSION:
|
|
723
|
-
return 'ERROR.BAD_APP_VERSION';
|
|
724
|
-
case ServerErrorCodes.DATA_NOT_UNIQUE:
|
|
725
|
-
return 'ERROR.DATA_NOT_UNIQUE';
|
|
726
|
-
}
|
|
727
|
-
return undefined;
|
|
728
|
-
}
|
|
729
|
-
toAppError(err) {
|
|
730
|
-
let error = err;
|
|
731
|
-
let message = (err && err.message) || err;
|
|
732
|
-
// parse message if JSON
|
|
733
|
-
if (typeof message === 'string' && message.trim().indexOf('{"code":') === 0) {
|
|
734
|
-
try {
|
|
735
|
-
error = JSON.parse(message
|
|
736
|
-
// Remove special characters before parsing (e.g. SQL errors from an Oracle database)
|
|
737
|
-
.replace(/\n\r?/g, ' ')
|
|
738
|
-
.replace(/\r/g, ''));
|
|
739
|
-
message = error.message || message;
|
|
740
|
-
}
|
|
741
|
-
catch (parseError) {
|
|
742
|
-
console.error('Unable to parse error as JSON: ', parseError);
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
if (error && error.code) {
|
|
746
|
-
const appError = {
|
|
747
|
-
code: error.code,
|
|
748
|
-
message: typeof message === 'string' ? message : error.message,
|
|
749
|
-
...this.createAppErrorByCode(error.code),
|
|
750
|
-
};
|
|
751
|
-
if (appError.code !== error.code || appError.message !== error.message) {
|
|
752
|
-
// Store original error in details
|
|
753
|
-
appError.details = error;
|
|
754
|
-
return appError;
|
|
755
|
-
}
|
|
756
|
-
// Keep error (with details, if any)
|
|
757
|
-
return error;
|
|
758
|
-
}
|
|
759
|
-
return undefined;
|
|
760
|
-
}
|
|
761
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: GraphqlService, deps: [{ token: i1.Platform }, { token: i2.Apollo }, { token: i3.HttpLink }, { token: i4.NetworkService }, { token: i5.StorageService }, { token: ENVIRONMENT }, { token: APP_GRAPHQL_TYPE_POLICIES, optional: true }, { token: APP_GRAPHQL_FRAGMENTS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
762
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: GraphqlService, providedIn: 'root' });
|
|
763
|
-
}
|
|
764
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: GraphqlService, decorators: [{
|
|
765
|
-
type: Injectable,
|
|
766
|
-
args: [{
|
|
767
|
-
providedIn: 'root',
|
|
768
|
-
}]
|
|
769
|
-
}], ctorParameters: () => [{ type: i1.Platform }, { type: i2.Apollo }, { type: i3.HttpLink }, { type: i4.NetworkService }, { type: i5.StorageService }, { type: i6.Environment, decorators: [{
|
|
770
|
-
type: Inject,
|
|
771
|
-
args: [ENVIRONMENT]
|
|
772
|
-
}] }, { type: undefined, decorators: [{
|
|
773
|
-
type: Optional
|
|
774
|
-
}, {
|
|
775
|
-
type: Inject,
|
|
776
|
-
args: [APP_GRAPHQL_TYPE_POLICIES]
|
|
777
|
-
}] }, { type: undefined, decorators: [{
|
|
778
|
-
type: Optional
|
|
779
|
-
}, {
|
|
780
|
-
type: Inject,
|
|
781
|
-
args: [APP_GRAPHQL_FRAGMENTS]
|
|
782
|
-
}] }] });
|
|
783
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2dyYXBocWwvZ3JhcGhxbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvRCxPQUFPLEVBRUwsWUFBWSxFQUNaLFVBQVUsRUFHVixhQUFhLEVBRWIsYUFBYSxHQUlkLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBZ0IsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRixPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekgsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc3RSxPQUFPLEVBQ0wsWUFBWSxFQUNaLGlCQUFpQixFQUVqQixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixxQkFBcUIsR0FDdEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxpQkFBaUIsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLHVCQUF1QixNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sa0JBQWtCLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsT0FBTyxFQUFFLFdBQVcsRUFBVyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztB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Z0JBQ2hCLE9BQU8sRUFBRSxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU87Z0JBQzlELEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDekMsQ0FBQztZQUNGLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN2RSxrQ0FBa0M7Z0JBQ2xDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUN6QixPQUFPLFFBQVEsQ0FBQztZQUNsQixDQUFDO1lBQ0Qsb0NBQW9DO1lBQ3BDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7dUdBbjJCVSxjQUFjLG9KQTZCZixXQUFXLGFBQ0MseUJBQXlCLDZCQUN6QixxQkFBcUI7MkdBL0JoQyxjQUFjLGNBRmIsTUFBTTs7MkZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQThCSSxNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLHlCQUF5Qjs7MEJBQzVDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBcG9sbG8sIEV4dHJhU3Vic2NyaXB0aW9uT3B0aW9ucywgUXVlcnlSZWYgfSBmcm9tICdhcG9sbG8tYW5ndWxhcic7XG5pbXBvcnQge1xuICBBcG9sbG9DYWNoZSxcbiAgQXBvbGxvQ2xpZW50LFxuICBBcG9sbG9MaW5rLFxuICBBcG9sbG9RdWVyeVJlc3VsdCxcbiAgRmV0Y2hQb2xpY3ksXG4gIEluTWVtb3J5Q2FjaGUsXG4gIE11dGF0aW9uVXBkYXRlckZuLFxuICBOZXR3b3JrU3RhdHVzLFxuICBPcGVyYXRpb25WYXJpYWJsZXMsXG4gIFR5cGVQb2xpY2llcyxcbiAgV2F0Y2hRdWVyeUZldGNoUG9saWN5LFxufSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFNlcnZlckVycm9yQ29kZXMsIFNlcnZpY2VFcnJvciB9IGZyb20gJy4uL3NlcnZpY2VzL2Vycm9ycyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBmaXJzdCwgbWFwLCBtZXJnZU1hcCwgdGFrZVVudGlsLCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZXR3b3JrU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uVHlwZSB9IGZyb20gJy4uL3NlcnZpY2VzL25ldHdvcmsudHlwZXMnO1xuaW1wb3J0IHtcbiAgQXBwV2ViU29ja2V0LFxuICBjcmVhdGVUcmFja2VyTGluayxcbiAgRW1wdHlPYmplY3QsXG4gIGlzTXV0YXRpb25PcGVyYXRpb24sXG4gIGlzU3Vic2NyaXB0aW9uT3BlcmF0aW9uLFxuICByZXN0b3JlVHJhY2tlZFF1ZXJpZXMsXG4gIFN0b3JhZ2VTZXJ2aWNlV3JhcHBlcixcbn0gZnJvbSAnLi9ncmFwaHFsLnV0aWxzJztcbmltcG9ydCB7IFJldHJ5TGluayB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2xpbmsvcmV0cnknO1xuaW1wb3J0IHF1ZXVlTGlua0ltcG9ydGVkIGZyb20gJ2Fwb2xsby1saW5rLXF1ZXVlJztcbmltcG9ydCBzZXJpYWxpemluZ0xpbmtJbXBvcnRlZCBmcm9tICdhcG9sbG8tbGluay1zZXJpYWxpemUnO1xuaW1wb3J0IGxvZ2dlckxpbmtJbXBvcnRlZCBmcm9tICdhcG9sbG8tbGluay1sb2dnZXInO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBFbnRpdHlVdGlscywgSUVudGl0eSB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBpc05pbCwgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbCwgdG9OdW1iZXIgfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IFJlc29sdmVycyB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBIdHRwTGluaywgT3B0aW9ucyB9IGZyb20gJ2Fwb2xsby1hbmd1bGFyL2h0dHAnO1xuaW1wb3J0IHsgcGVyc2lzdENhY2hlLCBQZXJzaXN0ZW50U3RvcmFnZSB9IGZyb20gJ2Fwb2xsbzMtY2FjaGUtcGVyc2lzdCc7XG5pbXBvcnQgeyBFcnJvclBvbGljeSwgTXV0YXRpb25CYXNlT3B0aW9ucyB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUvd2F0Y2hRdWVyeU9wdGlvbnMnO1xuaW1wb3J0IHsgQ2FjaGUgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9jYWNoZS9jb3JlL3R5cGVzL0NhY2hlJztcbmltcG9ydCB7IEVudmlyb25tZW50LCBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBQcm9wZXJ0aWVzTWFwIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3R5cGVzJztcbmltcG9ydCB7IFN0YXJ0YWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RhcnRhYmxlLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgaXNNb2JpbGUgfSBmcm9tICcuLi8uLi9zaGFyZWQvcGxhdGZvcm1zJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3N0b3JhZ2Uvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEdyYXBoUUxXc0xpbmsgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9saW5rL3N1YnNjcmlwdGlvbnMnO1xuaW1wb3J0IHsgQ2xpZW50T3B0aW9ucywgY3JlYXRlQ2xpZW50IH0gZnJvbSAnZ3JhcGhxbC13cyc7XG5pbXBvcnQgeyB1bndyYXBFU01vZHVsZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2R1bGVzJztcbmltcG9ydCB7IGNyZWF0ZUZyYWdtZW50UmVnaXN0cnkgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9jYWNoZS9pbm1lbW9yeS9mcmFnbWVudFJlZ2lzdHJ5JztcbmltcG9ydCB7IERvY3VtZW50Tm9kZSB9IGZyb20gJ2dyYXBocWwnO1xuXG4vLyBXb3JrYXJvdW5kIGZvciBpc3N1ZSBodHRwczovL2dpdGh1Yi5jb20vbmctcGFja2Fnci9uZy1wYWNrYWdyL2lzc3Vlcy8yMjE1XG5jb25zdCBRdWV1ZUxpbmsgPSB1bndyYXBFU01vZHVsZShxdWV1ZUxpbmtJbXBvcnRlZCk7XG5jb25zdCBTZXJpYWxpemluZ0xpbmsgPSB1bndyYXBFU01vZHVsZShzZXJpYWxpemluZ0xpbmtJbXBvcnRlZCk7XG5jb25zdCBsb2dnZXJMaW5rID0gdW53cmFwRVNNb2R1bGUobG9nZ2VyTGlua0ltcG9ydGVkKTtcblxuZXhwb3J0IGludGVyZmFjZSBXYXRjaFF1ZXJ5T3B0aW9uczxWPiB7XG4gIHF1ZXJ5OiBhbnk7XG4gIHZhcmlhYmxlcz86IFY7XG4gIGVycm9yPzogU2VydmljZUVycm9yO1xuICBmZXRjaFBvbGljeT86IFdhdGNoUXVlcnlGZXRjaFBvbGljeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNdXRhdGVRdWVyeU9wdGlvbnM8VCwgViA9IE9wZXJhdGlvblZhcmlhYmxlcz4gZXh0ZW5kcyBNdXRhdGlvbkJhc2VPcHRpb25zPFQsIFY+IHtcbiAgbXV0YXRpb246IGFueTtcbiAgdmFyaWFibGVzPzogVjtcbiAgZXJyb3I/OiBTZXJ2aWNlRXJyb3I7XG4gIGNvbnRleHQ/OiB7XG4gICAgc2VyaWFsaXphdGlvbktleT86IHN0cmluZztcbiAgICB0cmFja2VkPzogYm9vbGVhbjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICB9O1xuICBvcHRpbWlzdGljUmVzcG9uc2U/OiBUO1xuICBvZmZsaW5lUmVzcG9uc2U/OiBUIHwgKChjb250ZXh0OiBhbnkpID0+IFByb21pc2U8VD4pO1xuICB1cGRhdGU/OiBNdXRhdGlvblVwZGF0ZXJGbjxUPjtcbiAgZm9yY2VPZmZsaW5lPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEFQUF9HUkFQSFFMX1RZUEVfUE9MSUNJRVMgPSBuZXcgSW5qZWN0aW9uVG9rZW48VHlwZVBvbGljaWVzPignZ3JhcGhxbFR5cGVQb2xpY2llcycpO1xuXG5leHBvcnQgY29uc3QgQVBQX0dSQVBIUUxfRlJBR01FTlRTID0gbmV3IEluamVjdGlvblRva2VuPERvY3VtZW50Tm9kZVtdPignZ3JhcGhxbEZyYWdtZW50cycpO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb25QYXJhbXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgYXV0aFRva2VuPzogc3RyaW5nO1xuICBhdXRoQmFzaWM/OiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBHcmFwaHFsU2VydmljZSBleHRlbmRzIFN0YXJ0YWJsZVNlcnZpY2U8QXBvbGxvQ2xpZW50PGFueT4+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfbmV0d29ya1N0YXR1c0NoYW5nZWQkOiBPYnNlcnZhYmxlPENvbm5lY3Rpb25UeXBlPjtcblxuICBwcml2YXRlIGh0dHBQYXJhbXM6IE9wdGlvbnM7XG4gIHByaXZhdGUgd3NQYXJhbXM6IENsaWVudE9wdGlvbnM8Q29ubmVjdGlvblBhcmFtcz47XG4gIHByaXZhdGUgY29ubmVjdGlvblBhcmFtczogQ29ubmVjdGlvblBhcmFtcyA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0RmV0Y2hQb2xpY3k6IFdhdGNoUXVlcnlGZXRjaFBvbGljeTtcbiAgcHJpdmF0ZSBvbk5ldHdvcmtFcnJvciA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgcHJpdmF0ZSBjdXN0b21FcnJvcnM6IFByb3BlcnRpZXNNYXAgPSB7fTtcbiAgcHJpdmF0ZSBvblJlc2V0QXV0aCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgZ2V0IGNsaWVudCgpOiBBcG9sbG9DbGllbnQ8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBnZXQgY2FjaGUoKTogQXBvbGxvQ2FjaGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYXBvbGxvLmNsaWVudC5jYWNoZTtcbiAgfVxuXG4gIGdldCBkZWZhdWx0RmV0Y2hQb2xpY3koKTogV2F0Y2hRdWVyeUZldGNoUG9saWN5IHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdEZldGNoUG9saWN5O1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJpdmF0ZSBhcG9sbG86IEFwb2xsbyxcbiAgICBwcml2YXRlIGh0dHBMaW5rOiBIdHRwTGluayxcbiAgICBwcml2YXRlIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9HUkFQSFFMX1RZUEVfUE9MSUNJRVMpIHByaXZhdGUgdHlwZVBvbGljaWVzOiBUeXBlUG9saWNpZXMsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfR1JBUEhRTF9GUkFHTUVOVFMpIHByaXZhdGUgZnJhZ21lbnRzOiBEb2N1bWVudE5vZGVbXVxuICApIHtcbiAgICBzdXBlcihwbGF0Zm9ybSk7IC8vIFdhaXQgcGxhdGZvcm1cblxuICAgIHRoaXMuX2RlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gICAgdGhpcy5fZGVmYXVsdEZldGNoUG9saWN5ID0gZW52aXJvbm1lbnQuYXBvbGxvRmV0Y2hQb2xpY3k7XG5cbiAgICAvLyBMaXN0ZW4gbmV0d29yayBzdGF0dXNcbiAgICB0aGlzLl9uZXR3b3JrU3RhdHVzQ2hhbmdlZCQgPSBuZXR3b3JrLm9uTmV0d29ya1N0YXR1c0NoYW5nZXMucGlwZShmaWx0ZXIoaXNOb3ROaWwpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcblxuICAgIC8vIFdoZW4gZ2V0dGluZyBuZXR3b3JrIGVycm9yOiB0cnkgdG8gcGluZyBwZWVyLCBhbmQgdG9nZ2xlIHRvIG9mZmxpbmVcbiAgICB0aGlzLm9uTmV0d29ya0Vycm9yXG4gICAgICAucGlwZShcbiAgICAgICAgdGhyb3R0bGVUaW1lKDMwMCksXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLm5ldHdvcmsub25saW5lKSxcbiAgICAgICAgbWVyZ2VNYXAoKCkgPT4gdGhpcy5uZXR3b3JrLmNoZWNrUGVlckFsaXZlKCkpLFxuICAgICAgICBmaWx0ZXIoKGFsaXZlKSA9PiAhYWxpdmUpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMubmV0d29yay5zZXRGb3JjZU9mZmxpbmUodHJ1ZSwgeyBzaG93VG9hc3Q6IHRydWUgfSkpO1xuICB9XG5cbiAgYXN5bmMgc2V0QXV0aFRva2VuKHRva2VuOiBzdHJpbmcpIHtcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tncmFwaHFsXSBBcHBseSB0b2tlbiBhdXRoZW50aWNhdGlvbiB0byBoZWFkZXJzJyk7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25QYXJhbXMuYXV0aFRva2VuID0gdG9rZW47XG4gICAgfVxuICAgIC8vIENsZWFuIGF1dGggdG9rZW5cbiAgICBlbHNlIGlmICh0aGlzLmNvbm5lY3Rpb25QYXJhbXMuYXV0aFRva2VuKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbZ3JhcGhxbF0gUmVtb3ZlIHRva2VuIGF1dGhlbnRpY2F0aW9uIGZyb20gaGVhZGVycycpO1xuICAgICAgZGVsZXRlIHRoaXMuY29ubmVjdGlvblBhcmFtcy5hdXRoVG9rZW47XG5cbiAgICAgIGF3YWl0IHRoaXMuY2xlYXJDYWNoZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNldEF1dGhCYXNpYyhiYXNpYzogc3RyaW5nKSB7XG4gICAgaWYgKGJhc2ljKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbZ3JhcGhxbF0gQXBwbHkgYmFzaWMgYXV0aGVudGljYXRpb24gdG8gaGVhZGVycycpO1xuICAgICAgdGhpcy5jb25uZWN0aW9uUGFyYW1zLmF1dGhCYXNpYyA9IGJhc2ljO1xuICAgIH1cbiAgICAvLyBDbGVhbiBhdXRoIGJhc2ljXG4gICAgZWxzZSBpZiAodGhpcy5jb25uZWN0aW9uUGFyYW1zLmF1dGhCYXNpYykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2dyYXBocWxdIFJlbW92ZSBiYXNpYyBhdXRoZW50aWNhdGlvbiBmcm9tIGhlYWRlcnMnKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmNvbm5lY3Rpb25QYXJhbXMuYXV0aEJhc2ljO1xuXG4gICAgICBhd2FpdCB0aGlzLmNsZWFyQ2FjaGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgdG8gYWRkIGEgZmllbGQgcmVzb2x2ZXJcbiAgICogIChzZWUgZG9jOiBodHRwczovL3d3dy5hcG9sbG9ncmFwaHFsLmNvbS9kb2NzL3JlYWN0L2RhdGEvbG9jYWwtc3RhdGUvI2hhbmRsaW5nLWNsaWVudC1maWVsZHMtd2l0aC1yZXNvbHZlcnMpXG4gICAqXG4gICAqIEBwYXJhbSByZXNvbHZlcnNcbiAgICovXG4gIGFzeW5jIGFkZFJlc29sdmVyKHJlc29sdmVyczogUmVzb2x2ZXJzIHwgUmVzb2x2ZXJzW10pIHtcbiAgICBpZiAoIXRoaXMuc3RhcnRlZCkgYXdhaXQgdGhpcy5yZWFkeSgpO1xuICAgIHRoaXMuYXBvbGxvLmNsaWVudC5hZGRSZXNvbHZlcnMocmVzb2x2ZXJzKTtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5PFQsIFYgPSBFbXB0eU9iamVjdD4ob3B0czogeyBxdWVyeTogYW55OyB2YXJpYWJsZXM/OiBWOyBlcnJvcj86IFNlcnZpY2VFcnJvcjsgZmV0Y2hQb2xpY3k/OiBGZXRjaFBvbGljeSB9KTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIGF3YWl0IHRoaXMucmVhZHkoKTtcbiAgICBsZXQgcmVzOiBBcG9sbG9RdWVyeVJlc3VsdDxUPjtcbiAgICB0cnkge1xuICAgICAgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQucXVlcnk8VCwgVj4oe1xuICAgICAgICBxdWVyeTogb3B0cy5xdWVyeSxcbiAgICAgICAgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlcyxcbiAgICAgICAgZmV0Y2hQb2xpY3k6IG9wdHMuZmV0Y2hQb2xpY3kgfHwgKHRoaXMuX2RlZmF1bHRGZXRjaFBvbGljeSBhcyBGZXRjaFBvbGljeSkgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXMgPSB0aGlzLnRvQXBvbGxvRXJyb3I8VD4oZXJyLCBvcHRzLmVycm9yKTtcbiAgICB9XG4gICAgaWYgKHJlcy5lcnJvcnMpIHtcbiAgICAgIHRocm93IHJlcy5lcnJvcnNbMF07XG4gICAgfVxuICAgIHJldHVybiByZXMuZGF0YTtcbiAgfVxuXG4gIHdhdGNoUXVlcnlSZWY8VCwgViA9IEVtcHR5T2JqZWN0PihvcHRzOiBXYXRjaFF1ZXJ5T3B0aW9uczxWPik6IFF1ZXJ5UmVmPFQsIFY+IHtcbiAgICByZXR1cm4gdGhpcy5hcG9sbG8ud2F0Y2hRdWVyeTxULCBWPih7XG4gICAgICBxdWVyeTogb3B0cy5xdWVyeSxcbiAgICAgIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXMsXG4gICAgICBmZXRjaFBvbGljeTogb3B0cy5mZXRjaFBvbGljeSB8fCAodGhpcy5fZGVmYXVsdEZldGNoUG9saWN5IGFzIEZldGNoUG9saWN5KSB8fCB1bmRlZmluZWQsXG4gICAgICBub3RpZnlPbk5ldHdvcmtTdGF0dXNDaGFuZ2U6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBxdWVyeVJlZlZhbHVlc0NoYW5nZXM8VCwgViA9IEVtcHR5T2JqZWN0PihxdWVyeVJlZjogUXVlcnlSZWY8VCwgVj4sIG9wdHM6IFdhdGNoUXVlcnlPcHRpb25zPFY+KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHF1ZXJ5UmVmLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHRoaXMub25BcG9sbG9FcnJvcjxUPihlcnJvciwgb3B0cy5lcnJvcikpLFxuICAgICAgZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUubmV0d29ya1N0YXR1cyA9PT0gTmV0d29ya1N0YXR1cy5yZWFkeSB8fCB2YWx1ZS5uZXR3b3JrU3RhdHVzID09PSBOZXR3b3JrU3RhdHVzLmVycm9yKSxcbiAgICAgIG1hcCgoeyBkYXRhLCBlcnJvcnMgfSkgPT4ge1xuICAgICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3JzWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgd2F0Y2hRdWVyeTxULCBWID0gRW1wdHlPYmplY3Q+KG9wdHM6IFdhdGNoUXVlcnlPcHRpb25zPFY+KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgY29uc3QgcXVlcnlSZWY6IFF1ZXJ5UmVmPFQsIFY+ID0gdGhpcy53YXRjaFF1ZXJ5UmVmKG9wdHMpO1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5UmVmVmFsdWVzQ2hhbmdlcyhxdWVyeVJlZiwgb3B0cyk7XG4gIH1cblxuICBhc3luYyBtdXRhdGU8VCwgViA9IEVtcHR5T2JqZWN0PihvcHRzOiBNdXRhdGVRdWVyeU9wdGlvbnM8VCwgVj4pOiBQcm9taXNlPFQ+IHtcbiAgICAvLyBJZiBvZmZsaW5lLCBjb21wdXRlIGFuIG9wdGltaXN0aWMgcmVzcG9uc2UgZm9yIHRyYWNrZWQgcXVlcmllc1xuICAgIGlmICgob3B0cy5mb3JjZU9mZmxpbmUgfHwgdGhpcy5uZXR3b3JrLm9mZmxpbmUpICYmIG9wdHMub2ZmbGluZVJlc3BvbnNlKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMub2ZmbGluZVJlc3BvbnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdHMuY29udGV4dCA9IG9wdHMuY29udGV4dCB8fCB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW1pc3RpY1Jlc3BvbnNlRm4gPSBvcHRzLm9mZmxpbmVSZXNwb25zZSBhcyAoY29udGV4dDogYW55KSA9PiBQcm9taXNlPFQ+O1xuICAgICAgICBvcHRzLm9wdGltaXN0aWNSZXNwb25zZSA9IGF3YWl0IG9wdGltaXN0aWNSZXNwb25zZUZuKG9wdHMuY29udGV4dCk7XG4gICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2dyYXBocWxdIFtvZmZsaW5lXSBVc2luZyBhbiBvcHRpbWlzdGljIHJlc3BvbnNlOiAnLCBvcHRzLm9wdGltaXN0aWNSZXNwb25zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRzLm9wdGltaXN0aWNSZXNwb25zZSA9IG9wdHMub2ZmbGluZVJlc3BvbnNlIGFzIFQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5mb3JjZU9mZmxpbmUpIHtcbiAgICAgICAgY29uc3QgcmVzID0geyBkYXRhOiBvcHRzLm9wdGltaXN0aWNSZXNwb25zZSB9O1xuICAgICAgICBpZiAob3B0cy51cGRhdGUpIHtcbiAgICAgICAgICBvcHRzLnVwZGF0ZSh0aGlzLmFwb2xsby5jbGllbnQuY2FjaGUsIHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcy5kYXRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy5hcG9sbG9cbiAgICAgICAgLm11dGF0ZTxBcG9sbG9RdWVyeVJlc3VsdDxUPiwgVj4oe1xuICAgICAgICAgIG11dGF0aW9uOiBvcHRzLm11dGF0aW9uLFxuICAgICAgICAgIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXMsXG4gICAgICAgICAgY29udGV4dDogb3B0cy5jb250ZXh0LFxuICAgICAgICAgIG9wdGltaXN0aWNSZXNwb25zZTogb3B0cy5vcHRpbWlzdGljUmVzcG9uc2UgYXMgYW55LFxuICAgICAgICAgIHVwZGF0ZTogb3B0cy51cGRhdGUgYXMgYW55LFxuICAgICAgICB9KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4gdGhpcy5vbkFwb2xsb0Vycm9yPFQ+KGVycm9yLCBvcHRzLmVycm9yKSksXG4gICAgICAgICAgZmlyc3QoKVxuICAgICAgICAgIC8vIFRvIGRlYnVnLCBpZiBuZWVkOlxuICAgICAgICAgIC8vdGFwKChyZXMpID0+ICghcmVzKSAmJiBjb25zb2xlLmVycm9yKCdbZ3JhcGhxbF0gVW5rbm93biBlcnJvciBkdXJpbmcgbXV0YXRpb24uIENoZWNrIGVycm9ycyBpbiBjb25zb2xlIChtYXkgYmUgYW4gaW52YWxpZCBnZW5lcmF0ZWQgY2FjaGUgaWQgPyknKSlcbiAgICAgICAgKVxuICAgICk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzLmVycm9ycykpIHtcbiAgICAgIHRocm93IHJlcy5lcnJvcnNbMF07XG4gICAgfVxuICAgIHJldHVybiByZXMuZGF0YSBhcyBUO1xuICB9XG5cbiAgc3Vic2NyaWJlPFQsIFYgPSBFbXB0eU9iamVjdD4oXG4gICAgb3B0czoge1xuICAgICAgcXVlcnk6IGFueTtcbiAgICAgIHZhcmlhYmxlczogVjtcbiAgICAgIGZldGNoUG9saWN5PzogRmV0Y2hQb2xpY3k7XG4gICAgICBlcnJvclBvbGljeT86IEVycm9yUG9saWN5O1xuICAgICAgZXJyb3I/OiBTZXJ2aWNlRXJyb3I7XG4gICAgfSxcbiAgICBleHRyYT86IEV4dHJhU3Vic2NyaXB0aW9uT3B0aW9uc1xuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5hcG9sbG9cbiAgICAgIC5zdWJzY3JpYmU8VD4oXG4gICAgICAgIHtcbiAgICAgICAgICBxdWVyeTogb3B0cy5xdWVyeSxcbiAgICAgICAgICBmZXRjaFBvbGljeTogKG9wdHMgJiYgb3B0cy5mZXRjaFBvbGljeSkgfHwgJ25ldHdvcmstb25seScsXG4gICAgICAgICAgZXJyb3JQb2xpY3k6IChvcHRzICYmIG9wdHMuZXJyb3JQb2xpY3kpIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdXNlWm9uZTogdHJ1ZSxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB0aGlzLm9uQXBvbGxvRXJyb3I8VD4oZXJyb3IsIG9wdHMuZXJyb3IpKSxcbiAgICAgICAgbWFwKCh7IGRhdGEsIGVycm9ycyB9KSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3JzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBpbnNlcnRJbnRvUXVlcnlDYWNoZTxULCBWID0gRW1wdHlPYmplY3Q+KFxuICAgIGNhY2hlOiBBcG9sbG9DYWNoZTxhbnk+LFxuICAgIG9wdHM6IENhY2hlLlJlYWRRdWVyeU9wdGlvbnM8ViwgYW55PiAmIHtcbiAgICAgIGFycmF5RmllbGROYW1lOiBzdHJpbmc7XG4gICAgICB0b3RhbEZpZWxkTmFtZT86IHN0cmluZztcbiAgICAgIGRhdGE6IFQ7XG4gICAgICBzb3J0Rm4/OiAoZDE6IFQsIGQyOiBUKSA9PiBudW1iZXI7XG4gICAgICBzaXplPzogbnVtYmVyO1xuICAgIH1cbiAgKSB7XG4gICAgY2FjaGUgPSBjYWNoZSB8fCB0aGlzLmFwb2xsby5jbGllbnQuY2FjaGU7XG4gICAgb3B0cy5hcnJheUZpZWxkTmFtZSA9IG9wdHMuYXJyYXlGaWVsZE5hbWUgfHwgJ2RhdGEnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBkYXRhID0gY2FjaGUucmVhZFF1ZXJ5PGFueSwgVj4oeyBxdWVyeTogb3B0cy5xdWVyeSwgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlcyB9KTtcblxuICAgICAgaWYgKCFkYXRhKSByZXR1cm47IC8vIFNraXA6IG5vdGhpbmcgaW4gY2FjaGVcblxuICAgICAgaWYgKGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0pIHtcbiAgICAgICAgLy8gQ29weSBiZWNhdXNlIGltbXV0YWJsZVxuICAgICAgICBkYXRhID0geyAuLi5kYXRhIH07XG5cbiAgICAgICAgLy8gQXBwZW5kIHRvIHJlc3VsdCBhcnJheVxuICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdID0gWy4uLmRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0sIHsgLi4ub3B0cy5kYXRhIH1dO1xuXG4gICAgICAgIC8vIFJlc29ydCwgaWYgbmVlZFxuICAgICAgICBpZiAob3B0cy5zb3J0Rm4pIHtcbiAgICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLnNvcnQob3B0cy5zb3J0Rm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXhjbHVkZSBpZiBleGNlZWQgbWF4IHNpemVcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRvTnVtYmVyKG9wdHMudmFyaWFibGVzICYmIG9wdHMudmFyaWFibGVzWydzaXplJ10sIC0xKTtcbiAgICAgICAgaWYgKHNpemUgPiAwICYmIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0ubGVuZ3RoID4gc2l6ZSkge1xuICAgICAgICAgIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc3BsaWNlKHNpemUsIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0ubGVuZ3RoIC0gc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNyZW1lbnQgdG90YWxcbiAgICAgICAgaWYgKGlzTm90TmlsKG9wdHMudG90YWxGaWVsZE5hbWUpKSB7XG4gICAgICAgICAgaWYgKGlzTm90TmlsKGRhdGFbb3B0cy50b3RhbEZpZWxkTmFtZV0pKSB7XG4gICAgICAgICAgICBkYXRhW29wdHMudG90YWxGaWVsZE5hbWVdICs9IDE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW2dyYXBocWxdIFVuYWJsZSB0byB1cGRhdGUgY2FjaGVkIHF1ZXJ5LiBVbmtub3duIHJlc3VsdCBwYXJ0OiAnICsgb3B0cy50b3RhbEZpZWxkTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2FjaGUud3JpdGVRdWVyeSh7XG4gICAgICAgICAgcXVlcnk6IG9wdHMucXVlcnksXG4gICAgICAgICAgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlcyxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2dyYXBocWxdIFVuYWJsZSB0byB1cGRhdGUgY2FjaGVkIHF1ZXJ5LiBVbmtub3duIHJlc3VsdCBwYXJ0OiAnICsgb3B0cy5hcnJheUZpZWxkTmFtZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBjb250aW51ZVxuICAgICAgLy8gcmVhZCBpbiBjYWNoZSBpcyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYSByZXN1bHQuIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9yZWFjdC1hcG9sbG8vaXNzdWVzLzE3NzYjaXNzdWVjb21tZW50LTM3MjIzNzk0MFxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmVycm9yKCdbZ3JhcGhxbF0gRXJyb3Igd2hpbGUgdXBkYXRpbmcgY2FjaGU6ICcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgYWRkTWFueVRvUXVlcnlDYWNoZTxUID0gYW55LCBWID0gRW1wdHlPYmplY3Q+KFxuICAgIGNhY2hlOiBBcG9sbG9DYWNoZTxhbnk+LFxuICAgIG9wdHM6IENhY2hlLlJlYWRRdWVyeU9wdGlvbnM8ViwgYW55PiAmIHtcbiAgICAgIGFycmF5RmllbGROYW1lOiBzdHJpbmc7XG4gICAgICB0b3RhbEZpZWxkTmFtZT86IHN0cmluZztcbiAgICAgIGRhdGE6IFRbXTtcbiAgICAgIGVxdWFsc0ZuPzogKGQxOiBULCBkMjogVCkgPT4gYm9vbGVhbjtcbiAgICAgIHNvcnRGbj86IChkMTogVCwgZDI6IFQpID0+IG51bWJlcjtcbiAgICB9XG4gICkge1xuICAgIGlmICghb3B0cy5kYXRhIHx8ICFvcHRzLmRhdGEubGVuZ3RoKSByZXR1cm47IC8vIG5vdGhpbmcgdG8gcHJvY2Vzc1xuXG4gICAgY2FjaGUgPSBjYWNoZSB8fCB0aGlzLmFwb2xsby5jbGllbnQuY2FjaGU7XG4gICAgb3B0cy5hcnJheUZpZWxkTmFtZSA9IG9wdHMuYXJyYXlGaWVsZE5hbWUgfHwgJ2RhdGEnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBkYXRhID0gY2FjaGUucmVhZFF1ZXJ5PGFueSwgVj4oeyBxdWVyeTogb3B0cy5xdWVyeSwgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlcyB9KTtcbiAgICAgIGlmICghZGF0YSkgcmV0dXJuIDA7IC8vIHNraXBcblxuICAgICAgaWYgKGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0pIHtcbiAgICAgICAgLy8gQ29weSBiZWNhdXNlIGltbXV0YWJsZVxuICAgICAgICBkYXRhID0geyAuLi5kYXRhIH07XG5cbiAgICAgICAgLy8gS2VlcCBvbmx5IG5vdCBleGlzdGluZyByZXNcbiAgICAgICAgY29uc3QgZXF1YWxzRm4gPSBvcHRzLmVxdWFsc0ZuIHx8ICgoZDEsIGQyKSA9PiBkMVsnaWQnXSA9PT0gZDJbJ2lkJ10gJiYgZDFbJ2VudGl0eU5hbWUnXSA9PT0gZDJbJ2VudGl0eU5hbWUnXSk7XG4gICAgICAgIGNvbnN0IG5ld0l0ZW1zID0gb3B0cy5kYXRhLmZpbHRlcihcbiAgICAgICAgICAoaW5wdXRWYWx1ZSkgPT4gZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5maW5kSW5kZXgoKGV4aXN0aW5nVmFsdWUpID0+IGVxdWFsc0ZuKGlucHV0VmFsdWUsIGV4aXN0aW5nVmFsdWUpKSA9PT0gLTFcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIW5ld0l0ZW1zLmxlbmd0aCkgcmV0dXJuOyAvLyBObyBuZXcgdmFsdWVcblxuICAgICAgICAvLyBBcHBlbmQgdG8gYXJyYXlcbiAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSA9IFsuLi5kYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLCAuLi5uZXdJdGVtc107XG5cbiAgICAgICAgLy8gUmVzb3J0LCBpZiBuZWVkXG4gICAgICAgIGlmIChvcHRzLnNvcnRGbikge1xuICAgICAgICAgIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc29ydChvcHRzLnNvcnRGbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeGNsdWRlIGlmIGV4Y2VlZCBtYXggc2l6ZVxuICAgICAgICBjb25zdCBzaXplID0gdG9OdW1iZXIob3B0cy52YXJpYWJsZXMgJiYgb3B0cy52YXJpYWJsZXNbJ3NpemUnXSwgLTEpO1xuICAgICAgICBpZiAoc2l6ZSA+IDAgJiYgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5sZW5ndGggPiBzaXplKSB7XG4gICAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5zcGxpY2Uoc2l6ZSwgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5sZW5ndGggLSBzaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluY3JlbWVudCB0aGUgdG90YWxcbiAgICAgICAgaWYgKGlzTm90TmlsKG9wdHMudG90YWxGaWVsZE5hbWUpKSB7XG4gICAgICAgICAgaWYgKGlzTm90TmlsKGRhdGFbb3B0cy50b3RhbEZpZWxkTmFtZV0pKSB7XG4gICAgICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdICs9IG5ld0l0ZW1zLmxlbmd0aDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gVW5hYmxlIHRvIHVwZGF0ZSBjYWNoZWQgcXVlcnkuIFVua25vd24gcmVzdWx0IHBhcnQ6ICcgKyBvcHRzLnRvdGFsRmllbGROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSB0byBjYWNoZVxuICAgICAgICBjYWNoZS53cml0ZVF1ZXJ5KHtcbiAgICAgICAgICBxdWVyeTogb3B0cy5xdWVyeSxcbiAgICAgICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gVW5hYmxlIHRvIHVwZGF0ZSBjYWNoZWQgcXVlcnkuIFVua25vd24gcmVzdWx0IHBhcnQ6ICcgKyBvcHRzLmFycmF5RmllbGROYW1lKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgICAvLyByZWFkIGluIGNhY2hlIGlzIG5vdCBndWFyYW50ZWVkIHRvIHJldHVybiBhIHJlc3VsdC4gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL3JlYWN0LWFwb2xsby9pc3N1ZXMvMTc3NiNpc3N1ZWNvbW1lbnQtMzcyMjM3OTQwXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUud2FybignW2dyYXBocWxdIEVycm9yIHdoaWxlIHVwZGF0aW5nIGNhY2hlOiAnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZnJvbSBjYWNoZSwgYW5kIHJldHVybiBpZiByZW1vdmVkIG9yIG5vdFxuICAgKlxuICAgKiBAcGFyYW0gY2FjaGVcbiAgICogQHBhcmFtIG9wdHNcbiAgICovXG4gIHJlbW92ZUZyb21DYWNoZWRRdWVyeUJ5SWQ8ViA9IEVtcHR5T2JqZWN0LCBJRCA9IG51bWJlcj4oXG4gICAgY2FjaGU6IEFwb2xsb0NhY2hlPGFueT4sXG4gICAgb3B0czogQ2FjaGUuUmVhZFF1ZXJ5T3B0aW9uczxWLCBhbnk+ICYge1xuICAgICAgYXJyYXlGaWVsZE5hbWU6IHN0cmluZztcbiAgICAgIHRvdGFsRmllbGROYW1lPzogc3RyaW5nO1xuICAgICAgaWRzOiBJRDsgLy8gRG8gTk9UIHVzZSAnaWQnLCBhcyBhbHJlYWR5IHVzZWQgYnkgdGhlIEFwb2xsbyBBUElcbiAgICB9XG4gICk6IGJvb2xlYW4ge1xuICAgIGNhY2hlID0gY2FjaGUgfHwgdGhpcy5hcG9sbG8uY2xpZW50LmNhY2hlO1xuICAgIG9wdHMuYXJyYXlGaWVsZE5hbWUgPSBvcHRzLmFycmF5RmllbGROYW1lIHx8ICdkYXRhJztcblxuICAgIHRyeSB7XG4gICAgICBsZXQgZGF0YSA9IGNhY2hlLnJlYWRRdWVyeTxhbnksIFY+KHsgcXVlcnk6IG9wdHMucXVlcnksIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXMgfSk7XG5cbiAgICAgIGlmIChkYXRhICYmIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0pIHtcbiAgICAgICAgLy8gQ29weSBiZWNhdXNlIGltbXV0YWJsZVxuICAgICAgICBkYXRhID0geyAuLi5kYXRhIH07XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbVsnaWQnXSA9PT0gb3B0cy5pZHMpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gZmFsc2U7IC8vIFNraXAgKG5vdGhpbmcgcmVtb3ZlZClcblxuICAgICAgICAvLyBDb3B5LCB0aGVuIHJlbW92ZSBkZWxldGVkIGl0ZW1cbiAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSA9IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc2xpY2UoKTtcbiAgICAgICAgY29uc3QgZGVsZXRlZEl0ZW0gPSBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLnNwbGljZShpbmRleCwgMSlbMF07XG4gICAgICAgIGNhY2hlLmV2aWN0KHsgaWQ6IGNhY2hlLmlkZW50aWZ5KGRlbGV0ZWRJdGVtKSB9KTtcblxuICAgICAgICAvLyBEZWNyZW1lbnQgdGhlIHRvdGFsXG4gICAgICAgIGlmIChpc05vdE5pbChvcHRzLnRvdGFsRmllbGROYW1lKSkge1xuICAgICAgICAgIGlmIChpc05vdE5pbChkYXRhW29wdHMudG90YWxGaWVsZE5hbWVdKSkge1xuICAgICAgICAgICAgZGF0YVtvcHRzLnRvdGFsRmllbGROYW1lXSAtPSAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBVbmFibGUgdG8gdXBkYXRlIGNhY2hlZCBxdWVyeS4gVW5rbm93biByZXN1bHQgcGFydDogJyArIG9wdHMudG90YWxGaWVsZE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIHRvIGNhY2hlXG4gICAgICAgIGNhY2hlLndyaXRlUXVlcnkoe1xuICAgICAgICAgIHF1ZXJ5OiBvcHRzLnF1ZXJ5LFxuICAgICAgICAgIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXMsXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gVW5hYmxlIHRvIHVwZGF0ZSBjYWNoZWQgcXVlcnkuIFVua25vd24gcmVzdWx0IHBhcnQ6ICcgKyBvcHRzLmFycmF5RmllbGROYW1lKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gY29udGludWVcbiAgICAgIC8vIHJlYWQgaW4gY2FjaGUgaXMgbm90IGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgcmVzdWx0LiBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvcmVhY3QtYXBvbGxvL2lzc3Vlcy8xNzc2I2lzc3VlY29tbWVudC0zNzIyMzc5NDBcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gRXJyb3Igd2hpbGUgcmVtb3ZpbmcgZnJvbSBjYWNoZTogJywgZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGlkcyBmcm9tIGNhY2hlLCBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgcmVtb3ZlZFxuICAgKlxuICAgKiBAcGFyYW0gY2FjaGVcbiAgICogQHBhcmFtIG9wdHNcbiAgICovXG4gIHJlbW92ZUZyb21DYWNoZWRRdWVyeUJ5SWRzPFYgPSBFbXB0eU9iamVjdCwgSUQgPSBudW1iZXI+KFxuICAgIGNhY2hlOiBBcG9sbG9DYWNoZTxhbnk+LFxuICAgIG9wdHM6IENhY2hlLlJlYWRRdWVyeU9wdGlvbnM8ViwgYW55PiAmIHtcbiAgICAgIGFycmF5RmllbGROYW1lOiBzdHJpbmc7XG4gICAgICB0b3RhbEZpZWxkTmFtZT86IHN0cmluZztcbiAgICAgIGlkczogSURbXTtcbiAgICB9XG4gICk6IG51bWJlciB7XG4gICAgY2FjaGUgPSBjYWNoZSB8fCB0aGlzLmFwb2xsby5jbGllbnQuY2FjaGU7XG4gICAgb3B0cy5hcnJheUZpZWxkTmFtZSA9IG9wdHMuYXJyYXlGaWVsZE5hbWUgfHwgJ2RhdGEnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBkYXRhID0gY2FjaGUucmVhZFF1ZXJ5KG9wdHMpO1xuXG4gICAgICBpZiAoZGF0YSAmJiBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdKSB7XG4gICAgICAgIC8vIENvcHkgYmVjYXVzZSBpbW11dGFibGVcbiAgICAgICAgZGF0YSA9IHsgLi4uZGF0YSB9O1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZWRJbmRleGVzID0gZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5yZWR1Y2UoKHJlcywgaXRlbSwgaW5kZXgpID0+IChvcHRzLmlkcy5pbmNsdWRlcyhpdGVtWydpZCddKSA/IHJlcy5jb25jYXQoaW5kZXgpIDogcmVzKSwgW10pO1xuXG4gICAgICAgIGlmIChkZWxldGVkSW5kZXhlcy5sZW5ndGggPD0gMCkgcmV0dXJuIDA7IC8vIFNraXAgKG5vdGhpbmcgcmVtb3ZlZClcblxuICAgICAgICAvLyBRdWVyeSBoYXMgTk8gdG90YWxcbiAgICAgICAgaWYgKGlzTmlsKG9wdHMudG90YWxGaWVsZE5hbWUpKSB7XG4gICAgICAgICAgLy8gRXZpY3QgZWFjaCBvYmplY3RcbiAgICAgICAgICBkZWxldGVkSW5kZXhlc1xuICAgICAgICAgICAgLm1hcCgoaW5kZXgpID0+IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV1baW5kZXhdKVxuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gY2FjaGUuaWRlbnRpZnkoaXRlbSkpXG4gICAgICAgICAgICAuZm9yRWFjaCgoaWQpID0+IGNhY2hlLmV2aWN0KHsgaWQgfSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFF1ZXJ5IGhhcyBhIHRvdGFsXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIC8vIENvcHkgdGhlIGFycmF5XG4gICAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSA9IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc2xpY2UoKTtcblxuICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGFycmF5LCB0aGVuIGV2aWN0XG4gICAgICAgICAgZGVsZXRlZEluZGV4ZXNcbiAgICAgICAgICAgIC8vIFJldmVyc2U6IHRvIGtlZXAgdmFsaWQgaW5kZXhcbiAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgIC8vIFJlbW92ZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgLm1hcCgoaW5kZXgpID0+IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc3BsaWNlKGluZGV4LCAxKVswXSlcbiAgICAgICAgICAgIC8vIEV2aWN0IGZyb20gY2FjaGVcbiAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGNhY2hlLmlkZW50aWZ5KGl0ZW0pKVxuICAgICAgICAgICAgLmZvckVhY2goKGlkKSA9PiBjYWNoZS5ldmljdCh7IGlkIH0pKTtcblxuICAgICAgICAgIGlmIChpc05vdE5pbChkYXRhW29wdHMudG90YWxGaWVsZE5hbWVdKSkge1xuICAgICAgICAgICAgZGF0YVtvcHRzLnRvdGFsRmllbGROYW1lXSAtPSBkZWxldGVkSW5kZXhlcy5sZW5ndGg7IC8vIFJlbW92ZSBkZWxldGlvbiBjb3VudFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBVbmFibGUgdG8gdXBkYXRlIHRoZSB0b3RhbCBpbiBjYWNoZWQgcXVlcnkuIFVua25vd24gcmVzdWx0IHBhcnQ6ICcgKyBvcHRzLnRvdGFsRmllbGROYW1lKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYWNoZS53cml0ZVF1ZXJ5KHtcbiAgICAgICAgICAgIHF1ZXJ5OiBvcHRzLnF1ZXJ5LFxuICAgICAgICAgICAgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlcyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gZGVsZXRlZEluZGV4ZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBVbmFibGUgdG8gdXBkYXRlIGNhY2hlZCBxdWVyeS4gVW5rbm93biByZXN1bHQgcGFydDogJyArIG9wdHMuYXJyYXlGaWVsZE5hbWUpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgICAvLyByZWFkIGluIGNhY2hlIGlzIG5vdCBndWFyYW50ZWVkIHRvIHJldHVybiBhIHJlc3VsdC4gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL3JlYWN0LWFwb2xsby9pc3N1ZXMvMTc3NiNpc3N1ZWNvbW1lbnQtMzcyMjM3OTQwXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUud2FybignW2dyYXBocWxdIEVycm9yIHdoaWxlIHJlbW92aW5nIGZyb20gY2FjaGU6ICcsIGVycik7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVUb1F1ZXJ5Q2FjaGU8VCBleHRlbmRzIElFbnRpdHk8YW55PiwgViA9IEVtcHR5T2JqZWN0PihcbiAgICBjYWNoZTogQXBvbGxvQ2FjaGU8YW55PixcbiAgICBvcHRzOiBDYWNoZS5SZWFkUXVlcnlPcHRpb25zPFYsIGFueT4gJiB7XG4gICAgICBhcnJheUZpZWxkTmFtZTogc3RyaW5nO1xuICAgICAgdG90YWxGaWVsZE5hbWU/OiBzdHJpbmc7XG4gICAgICBkYXRhOiBUO1xuICAgICAgZXF1YWxzRm4/OiAoZDE6IFQsIGQyOiBUKSA9PiBib29sZWFuO1xuICAgIH1cbiAgKSB7XG4gICAgY2FjaGUgPSBjYWNoZSB8fCB0aGlzLmFwb2xsby5jbGllbnQuY2FjaGU7XG4gICAgb3B0cy5hcnJheUZpZWxkTmFtZSA9IG9wdHMuYXJyYXlGaWVsZE5hbWUgfHwgJ2RhdGEnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBkYXRhOiBhbnkgPSBjYWNoZS5yZWFkUXVlcnkob3B0cyk7XG5cbiAgICAgIGlmIChkYXRhICYmIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0pIHtcbiAgICAgICAgLy8gQ29weSBiZWNhdXNlIGltbXV0YWJsZVxuICAgICAgICBkYXRhID0geyAuLi5kYXRhIH07XG5cbiAgICAgICAgY29uc3QgZXF1YWxzRm4gPSBvcHRzLmVxdWFsc0ZuIHx8ICgoZDEsIGQyKSA9PiBFbnRpdHlVdGlscy5lcXVhbHMoZDEsIGQyLCAnaWQnKSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGlmIGV4aXN0cywgb3IgaW5zZXJ0XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5maW5kSW5kZXgoKHYpID0+IGVxdWFsc0ZuKG9wdHMuZGF0YSwgdikpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSA9IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc2xpY2UoKS5zcGxpY2UoaW5kZXgsIDEsIG9wdHMuZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSA9IFsuLi5kYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLCBvcHRzLmRhdGFdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jcmVtZW50IHRvdGFsIChpZiBjaGFuZ2VkKVxuICAgICAgICBpZiAoaXNOb3ROaWwob3B0cy50b3RhbEZpZWxkTmFtZSkgJiYgaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgaWYgKGlzTm90TmlsKGRhdGFbb3B0cy50b3RhbEZpZWxkTmFtZV0pKSB7XG4gICAgICAgICAgICBkYXRhW29wdHMudG90YWxGaWVsZE5hbWVdICs9IDE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW2dyYXBocWxdIFVuYWJsZSB0byB1cGRhdGUgY2FjaGVkIHF1ZXJ5LiBVbmtub3duIHJlc3VsdCBwYXJ0OiAnICsgb3B0cy50b3RhbEZpZWxkTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2FjaGUud3JpdGVRdWVyeSh7XG4gICAgICAgICAgcXVlcnk6IG9wdHMucXVlcnksXG4gICAgICAgICAgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlcyxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuOyAvLyBPSzogc3RvcCBoZXJlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBjb250aW51ZVxuICAgICAgLy8gcmVhZCBpbiBjYWNoZSBpcyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYSByZXN1bHQuIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9yZWFjdC1hcG9sbG8vaXNzdWVzLzE3NzYjaXNzdWVjb21tZW50LTM3MjIzNzk0MFxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBFcnJvciB3aGlsZSB1cGRhdGluZyBjYWNoZTogJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjbGVhckNhY2hlKGNsaWVudD86IEFwb2xsb0NsaWVudDxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY2xpZW50ID0gKGNsaWVudCB8fCB0aGlzLmNsaWVudCkgYXMgQXBvbGxvQ2xpZW50PGFueT47XG4gICAgaWYgKGNsaWVudCkge1xuICAgICAgY29uc29sZS5pbmZvKCdbZ3JhcGhxbF0gQ2xlYW5pbmcgY2FjaGUuLi4gJyk7XG4gICAgICBjb25zdCBub3cgPSB0aGlzLl9kZWJ1ZyAmJiBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDbGVhcmluZyB0aGUgY2FjaGVcbiAgICAgIGF3YWl0IGNsaWVudC5jYWNoZS5yZXNldCgpO1xuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFtncmFwaHFsXSBDbGVhbmluZyBjYWNoZSBbT0tdIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyQ3VzdG9tRXJyb3IoZXJyb3I6IFByb3BlcnRpZXNNYXApIHtcbiAgICB0aGlzLmN1c3RvbUVycm9ycyA9IHsgLi4udGhpcy5jdXN0b21FcnJvcnMsIC4uLmVycm9yIH07XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBhc3luYyBuZ09uU3RhcnQoKTogUHJvbWlzZTxBcG9sbG9DbGllbnQ8YW55Pj4ge1xuICAgIC8vIFdhaXQgbmV0d29yayBhbmQgc3RvcmFnZVxuICAgIGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnN0b3JhZ2UucmVhZHkoKSwgdGhpcy5uZXR3b3JrLnJlYWR5KCldKTtcblxuICAgIGNvbnNvbGUuaW5mbygnW2dyYXBocWxdIFN0YXJ0aW5nIGdyYXBocWwuLi4nKTtcbiAgICBjb25zdCBtb2JpbGUgPSBpc01vYmlsZSh3aW5kb3cpO1xuICAgIGNvbnN0IGVuYWJsZVRyYWNrTXV0YXRpb25RdWVyaWVzID0gIW1vYmlsZTtcblxuICAgIGNvbnN0IHBlZXIgPSB0aGlzLm5ldHdvcmsucGVlcjtcbiAgICBpZiAoIXBlZXIpIHRocm93IEVycm9yKCdbZ3JhcGhxbF0gTWlzc2luZyBwZWVyLiBVbmFibGUgdG8gc3RhcnQgZ3JhcGhxbCBzZXJ2aWNlJyk7XG5cbiAgICBjb25zdCB1cmkgPSBwZWVyLnVybCArICcvZ3JhcGhxbCc7XG4gICAgY29uc3Qgd3NVcmwgPSB1cmkucmVwbGFjZSgvXmh0dHAocyk/Oi8sICd3cyQxOicpICsgJy93ZWJzb2NrZXQnO1xuICAgIGNvbnNvbGUuaW5mbygnW2dyYXBocWxdIEJhc2UgdXJpOiAnICsgdXJpKTtcbiAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBTdWJzY3JpcHRpb24gdXJpOiAnICsgd3NVcmwpO1xuXG4gICAgdGhpcy5odHRwUGFyYW1zID0gdGhpcy5odHRwUGFyYW1zIHx8IHt9O1xuICAgIHRoaXMuaHR0cFBhcmFtcy51cmkgPSB1cmk7XG5cbiAgICB0aGlzLndzUGFyYW1zID0ge1xuICAgICAgLi4udGhpcy53c1BhcmFtcyxcbiAgICAgIGxhenk6IHRydWUsXG4gICAgICBjb25uZWN0aW9uUGFyYW1zOiB0aGlzLmNvbm5lY3Rpb25QYXJhbXMsXG4gICAgICB3ZWJTb2NrZXRJbXBsOiBBcHBXZWJTb2NrZXQsXG4gICAgICB1cmw6IHdzVXJsLFxuICAgICAgc2hvdWxkUmV0cnk6IChlcnJPckNsb3NlRXZlbnQpID0+IHtcbiAgICAgICAgLy8gSWYgV1MgVVJMIGNoYW5nZWQsIHRoZW4gZG8gbm90IHJldHJ5XG4gICAgICAgIGlmICh3c1VybCAhPT0gdGhpcy53c1BhcmFtcy51cmwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKCdbZ3JhcGhxbC1zZXJ2aWNlXSBbV1NdIFRyeWluZyB0byByZWNvbm5lY3QuLi4nLCBlcnJPckNsb3NlRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICByZXRyeUF0dGVtcHRzOiAxMCxcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIGEgc3RvcmFnZSBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qgc3RvcmFnZTogUGVyc2lzdGVudFN0b3JhZ2U8c3RyaW5nPiA9IG5ldyBTdG9yYWdlU2VydmljZVdyYXBwZXIodGhpcy5zdG9yYWdlKTtcblxuICAgIGxldCBjbGllbnQ6IEFwb2xsb0NsaWVudDxhbnk+O1xuICAgIHRyeSB7XG4gICAgICBjbGllbnQgPSB0aGlzLmFwb2xsby5jbGllbnQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBTaW5jZSBhcG9sbG8tYW5ndWxhciA3LCBtaXNzaW5nIGNsaWVudCB0aHJvdyBhbiBleGNlcHRpb25cbiAgICAgIC8vIENvbnRpbnVlIChjbGllbnQgbm90IGV4aXN0cylcbiAgICB9XG5cbiAgICBpZiAoIWNsaWVudCkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2dyYXBocWxdIENyZWF0aW5nIEFwb2xsbyBHcmFwaFFMIGNsaWVudC4uLicpO1xuXG4gICAgICAvLyBXZWJzb2NrZXQgbGlua1xuICAgICAgY29uc3Qgd3NMaW5rID0gbmV3IEdyYXBoUUxXc0xpbmsoY3JlYXRlQ2xpZW50KHRoaXMud3NQYXJhbXMpKTtcbiAgICAgIHRoaXMub25SZXNldEF1dGgucGlwZSh0YWtlVW50aWwodGhpcy5zdG9wU3ViamVjdCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnW2dyYXBocWxdIENsb3Npbmcgd2Vic29ja2V0IGNsaWVudCwgdG8gZm9yY2UgdW5hdXRoJyk7XG4gICAgICAgIHdzTGluay5jbGllbnQuZGlzcG9zZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFJldHJ5IHdoZW4gZmFpbGVkIGxpbmtcbiAgICAgIGNvbnN0IHJldHJ5TGluayA9IG5ldyBSZXRyeUxpbmsoKTtcbiAgICAgIGNvbnN0IGF1dGhMaW5rID0gbmV3IEFwb2xsb0xpbmsoKG9wZXJhdGlvbiwgZm9yd2FyZCkgPT4ge1xuICAgICAgICBjb25zdCBhdXRob3JpemF0aW9uID0gW107XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25QYXJhbXMuYXV0aFRva2VuKSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbi5wdXNoKGB0b2tlbiAke3RoaXMuY29ubmVjdGlvblBhcmFtcy5hdXRoVG9rZW59YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblBhcmFtcy5hdXRoQmFzaWMpIHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uLnB1c2goYEJhc2ljICR7dGhpcy5jb25uZWN0aW9uUGFyYW1zLmF1dGhCYXNpY31gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCkuYXBwZW5kKCdBdXRob3JpemF0aW9uJywgYXV0aG9yaXphdGlvbik7XG5cbiAgICAgICAgLy8gVXNlIHRoZSBzZXRDb250ZXh0IG1ldGhvZCB0byBzZXQgdGhlIEhUVFAgaGVhZGVycy5cbiAgICAgICAgb3BlcmF0aW9uLnNldENvbnRleHQoe1xuICAgICAgICAgIC4uLm9wZXJhdGlvbi5nZXRDb250ZXh0KCksXG4gICAgICAgICAgLi4ueyBoZWFkZXJzIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENhbGwgdGhlIG5leHQgbGluayBpbiB0aGUgbWlkZGxld2FyZSBjaGFpbi5cbiAgICAgICAgcmV0dXJuIGZvcndhcmQob3BlcmF0aW9uKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBIdHRwIGxpbmtcbiAgICAgIGNvbnN0IGh0dHBMaW5rID0gdGhpcy5odHRwTGluay5jcmVhdGUodGhpcy5odHRwUGFyYW1zKTtcblxuICAgICAgLy8gQ2FjaGVcbiAgICAgIGNvbnN0IGNhY2hlID0gbmV3IEluTWVtb3J5Q2FjaGUoe1xuICAgICAgICB0eXBlUG9saWNpZXM6IHRoaXMudHlwZVBvbGljaWVzLFxuICAgICAgICBmcmFnbWVudHM6IGlzTm90RW1wdHlBcnJheSh0aGlzLmZyYWdtZW50cykgPyBjcmVhdGVGcmFnbWVudFJlZ2lzdHJ5KC4uLnRoaXMuZnJhZ21lbnRzKSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgY2FjaGUgcGVyc2lzdGVuY2VcbiAgICAgIGlmICh0aGlzLmVudmlyb25tZW50LnBlcnNpc3RDYWNoZSkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbZ3JhcGhxbF0gU3RhcnRpbmcgcGVyc2lzdGVuY2UgY2FjaGUuLi4nKTtcbiAgICAgICAgYXdhaXQgcGVyc2lzdENhY2hlKHtcbiAgICAgICAgICBjYWNoZSxcbiAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgIHRyaWdnZXI6IHRoaXMucGxhdGZvcm0uaXMoJ2FuZHJvaWQnKSA/ICdiYWNrZ3JvdW5kJyA6ICd3cml0ZScsXG4gICAgICAgICAgZGVib3VuY2U6IDEwMDAsXG4gICAgICAgICAgZGVidWc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgbXV0YXRpb25MaW5rczogQXJyYXk8QXBvbGxvTGluaz47XG5cbiAgICAgIC8vIEFkZCBxdWV1ZSB0byBzdG9yZSB0cmFja2VkIHF1ZXJpZXMsIHdoZW4gb2ZmbGluZVxuICAgICAgaWYgKGVuYWJsZVRyYWNrTXV0YXRpb25RdWVyaWVzKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6aW5nTGluayA9IG5ldyBTZXJpYWxpemluZ0xpbmsoKTtcbiAgICAgICAgY29uc3QgdHJhY2tlckxpbmsgPSBjcmVhdGVUcmFja2VyTGluayh7XG4gICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICBvbk5ldHdvcmtTdGF0dXNDaGFuZ2U6IHRoaXMuX25ldHdvcmtTdGF0dXNDaGFuZ2VkJCxcbiAgICAgICAgICBkZWJvdW5jZTogMTAwMCxcbiAgICAgICAgICBkZWJ1ZzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIENyZWF0aW5nIGEgbXV0YXRpb24gcXVldWVcbiAgICAgICAgY29uc3QgcXVldWVMaW5rID0gbmV3IFF1ZXVlTGluaygpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgICAgIHRoaXMuX25ldHdvcmtTdGF0dXNDaGFuZ2VkJC5zdWJzY3JpYmUoKHR5cGUpID0+IHtcbiAgICAgICAgICAgIC8vIE5ldHdvcmsgaXMgb2ZmbGluZTogc3RhcnQgYnVmZmVyaW5nIGludG8gcXVldWVcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdbZ3JhcGhxbF0gb2ZmbGluZSBtb2RlOiBlbmFibGUgbXV0YXRpb25zIGJ1ZmZlcicpO1xuICAgICAgICAgICAgICBxdWV1ZUxpbmsuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5ldHdvcmsgaXMgb25saW5lXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdbZ3JhcGhxbF0gb25saW5lIG1vZGU6IGRpc2FibGUgbXV0YXRpb25zIGJ1ZmZlcicpO1xuICAgICAgICAgICAgICBxdWV1ZUxpbmsub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIG11dGF0aW9uTGlua3MgPSBbbG9nZ2VyTGluaywgcXVldWVMaW5rLCB0cmFja2VyTGluaywgcXVldWVMaW5rLCBzZXJpYWxpemluZ0xpbmssIHJldHJ5TGluaywgYXV0aExpbmssIGh0dHBMaW5rXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11dGF0aW9uTGlua3MgPSBbcmV0cnlMaW5rLCBhdXRoTGluaywgaHR0cExpbmtdO1xuICAgICAgfVxuXG4gICAgICAvLyBjcmVhdGUgQXBvbGxvXG4gICAgICBjbGllbnQgPSBuZXcgQXBvbGxvQ2xpZW50KHtcbiAgICAgICAgY2FjaGUsXG4gICAgICAgIGxpbms6IEFwb2xsb0xpbmsuc3BsaXQoXG4gICAgICAgICAgLy8gSGFuZGxlIG11dGF0aW9uc1xuICAgICAgICAgIGlzTXV0YXRpb25PcGVyYXRpb24sXG4gICAgICAgICAgQXBvbGxvTGluay5mcm9tKG11dGF0aW9uTGlua3MpLFxuXG4gICAgICAgICAgQXBvbGxvTGluay5zcGxpdChcbiAgICAgICAgICAgIC8vIEhhbmRsZSBzdWJzY3JpcHRpb25zXG4gICAgICAgICAgICBpc1N1YnNjcmlwdGlvbk9wZXJhdGlvbixcbiAgICAgICAgICAgIHdzTGluayxcblxuICAgICAgICAgICAgLy8gSGFuZGxlIHF1ZXJpZXNcbiAgICAgICAgICAgIEFwb2xsb0xpbmsuZnJvbShbcmV0cnlMaW5rLCBhdXRoTGluaywgaHR0cExpbmtdKVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgLy8gRm9yIEBhcG9sbG8vY2xpZW50IDwgMy4xMVxuICAgICAgICBjb25uZWN0VG9EZXZUb29sczogIXRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbixcbiAgICAgICAgLy8gRm9yIEBhcG9sbG8vY2xpZW50IDMuMTErXG4gICAgICAgIGRldnRvb2xzOiB7XG4gICAgICAgICAgZW5hYmxlZDogIXRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbixcbiAgICAgICAgICBuYW1lOiAnR3JhcGhxbFNlcnZpY2UgQ2xpZW50JyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmFwb2xsby5jbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuXG4gICAgLy8gRW5hYmxlIHRyYWNrZWQgcXVlcmllcyBwZXJzaXN0ZW5jZVxuICAgIGlmIChlbmFibGVUcmFja011dGF0aW9uUXVlcmllcyAmJiB0aGlzLmVudmlyb25tZW50LnBlcnNpc3RDYWNoZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVzdG9yZVRyYWNrZWRRdWVyaWVzKHtcbiAgICAgICAgICBhcG9sbG9DbGllbnQ6IGNsaWVudCxcbiAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgIGRlYnVnOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbZ3JhcGhxbF0gRmFpbGVkIHRvIHJlc3RvcmUgdHJhY2tlZCBxdWVyaWVzIGZyb20gc3RvcmFnZTogJyArICgoZXJyICYmIGVyci5tZXNzYWdlKSB8fCBlcnIpLCBlcnIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExpc3RlbiBmb3IgbmV0d29yayByZXN0YXJ0XG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLm5ldHdvcmsub24oJ3N0YXJ0JywgKCkgPT4gdGhpcy5yZXN0YXJ0KCkpKTtcblxuICAgIC8vIExpc3RlbiBmb3IgY2xlYXIgY2FjaGUgcmVxdWVzdCwgZnJvbSBuZXR3b3JrXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLm5ldHdvcmsub24oJ3Jlc2V0Q2FjaGUnLCAoKSA9PiB0aGlzLmNsZWFyQ2FjaGUoKSkpO1xuXG4gICAgY29uc29sZS5pbmZvKCdbZ3JhcGhxbF0gU3RhcnRpbmcgZ3JhcGhxbCBbT0tdJyk7XG4gICAgcmV0dXJuIGNsaWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBuZ09uU3RvcCgpIHtcbiAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBTdG9wcGluZyBncmFwaHFsIHNlcnZpY2UuLi4nKTtcbiAgICBhd2FpdCB0aGlzLnJlc2V0Q2xpZW50KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVzZXRDbGllbnQoY2xpZW50PzogQXBvbGxvQ2xpZW50PGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgY2xpZW50ID0gKGNsaWVudCB8fCB0aGlzLmFwb2xsby5jbGllbnQpIGFzIEFwb2xsb0NsaWVudDxhbnk+O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gU2luY2UgYXBvbGxvLWFuZ3VsYXIgNywgbWlzc2luZyBjbGllbnQgdGhyb3cgYW4gZXhjZXB0aW9uXG4gICAgICAvLyBDb250aW51ZSAoY2xpZW50IG5vdCBleGlzdHMpXG4gICAgfVxuICAgIGlmICghY2xpZW50KSByZXR1cm47XG5cbiAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBSZXNldHRpbmcgQXBvbGxvIGNsaWVudC4uLicpO1xuICAgIGNsaWVudC5zdG9wKCk7XG5cbiAgICB0aGlzLm9uUmVzZXRBdXRoLm5leHQoKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtjbGllbnQuY2xlYXJTdG9yZSgpLCB0aGlzLmNsZWFyQ2FjaGUoY2xpZW50KV0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkFwb2xsb0Vycm9yPFQ+KGVycjogYW55LCBkZWZhdWx0RXJyb3I/OiBhbnkpOiBPYnNlcnZhYmxlPEFwb2xsb1F1ZXJ5UmVzdWx0PFQ+PiB7XG4gICAgcmV0dXJuIG9mKHRoaXMudG9BcG9sbG9FcnJvcjxUPihlcnIsIGRlZmF1bHRFcnJvcikpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0Fwb2xsb0Vycm9yPFQ+KGVycjogYW55LCBkZWZhdWx0RXJyb3I/OiBhbnkpOiBBcG9sbG9RdWVyeVJlc3VsdDxUPiB7XG4gICAgbGV0IGVycm9yID1cbiAgICAgIC8vIElmIG5ldHdvcmsgZXJyb3I6IHRyeSB0byBjb252ZXJ0IHRvIEFwcCAocmVhZCBhcyBKU09OKSwgb3IgY3JlYXRlIGFuIFVOS05PV05fTkVUV09SS19FUlJPUlxuICAgICAgKGVyci5uZXR3b3JrRXJyb3IgJiZcbiAgICAgICAgKChlcnIubmV0d29ya0Vycm9yLmVycm9yICYmIHRoaXMudG9BcHBFcnJvcihlcnIubmV0d29ya0Vycm9yLmVycm9yKSkgfHxcbiAgICAgICAgICB0aGlzLnRvQXBwRXJyb3IoZXJyLm5ldHdvcmtFcnJvcikgfHxcbiAgICAgICAgICAoZXJyLm5ldHdvcmtFcnJvci5lcnJvciAmJiB0aGlzLmNyZWF0ZUFwcEVycm9yQnlDb2RlKGVyci5uZXR3b3JrRXJyb3IuZXJyb3Iuc3RhdHVzKSkgfHxcbiAgICAgICAgICB0aGlzLmNyZWF0ZUFwcEVycm9yQnlDb2RlKEVycm9yQ29kZXMuVU5LTk9XTl9ORVRXT1JLX0VSUk9SKSkpIHx8XG4gICAgICAvLyBJZiBncmFwaFFMOiB0cnkgdG8gY29udmVydCB0aGUgZmlyc3QgZXJyb3IgZm91bmRcbiAgICAgIChlcnIuZ3JhcGhRTEVycm9ycyAmJiBlcnIuZ3JhcGhRTEVycm9ycy5sZW5ndGggJiYgdGhpcy50b0FwcEVycm9yKGVyci5ncmFwaFFMRXJyb3JzWzBdKSkgfHxcbiAgICAgIHRoaXMudG9BcHBFcnJvcihlcnIpIHx8XG4gICAgICB0aGlzLnRvQXBwRXJyb3IoZXJyLm9yaWdpbmFsRXJyb3IpIHx8XG4gICAgICAoZXJyLmdyYXBoUUxFcnJvcnMgJiYgZXJyLmdyYXBoUUxFcnJvcnNbMF0pIHx8XG4gICAgICBlcnI7XG4gICAgY29uc29sZS5lcnJvcignW2dyYXBocWxdICcgKyAoKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpIHx8IGVycm9yKSwgZXJyb3Iuc3RhY2sgfHwgJycpO1xuICAgIGlmIChlcnJvcj8uY29kZSA9PT0gRXJyb3JDb2Rlcy5VTktOT1dOX05FVFdPUktfRVJST1IgJiYgZXJyLm5ldHdvcmtFcnJvcj8ubWVzc2FnZSkge1xuICAgICAgY29uc29sZS5lcnJvcignW2dyYXBocWxdIG9yaWdpbmFsIGVycm9yOiAnICsgZXJyLm5ldHdvcmtFcnJvci5tZXNzYWdlKTtcbiAgICAgIHRoaXMub25OZXR3b3JrRXJyb3IubmV4dChlcnJvcik7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZGVmYXVsdCBlcnJvciwgYW5kIHN0b3JlIG9yaWdpbmFsIGVycm9yIGludG8gZXJyb3IncyBkZXRhaWxzXG4gICAgaWYgKCghZXJyb3IgfHwgIWVycm9yLmNvZGUgfHwgZXJyb3IuY29kZSA9PT0gRXJyb3JDb2Rlcy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpICYmIGRlZmF1bHRFcnJvcikge1xuICAgICAgZXJyb3IgPSB7IC4uLmRlZmF1bHRFcnJvciwgZGV0YWlsczogZXJyb3IsIHN0YWNrOiBlcnIuc3RhY2sgfTtcbiAgICAgIGlmIChkZWZhdWx0RXJyb3IubWVzc2FnZSkge1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gZGVmYXVsdEVycm9yLm1lc3NhZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IG51bGwsXG4gICAgICBlcnJvcnM6IFtlcnJvcl0sXG4gICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgIG5ldHdvcmtTdGF0dXM6IE5ldHdvcmtTdGF0dXMuZXJyb3IsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXBwRXJyb3JCeUNvZGUoZXJyb3JDb2RlOiBudW1iZXIpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmdldEkxOG5FcnJvck1lc3NhZ2VCeUNvZGUoZXJyb3JDb2RlKTtcbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogZXJyb3JDb2RlLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0STE4bkVycm9yTWVzc2FnZUJ5Q29kZShlcnJvckNvZGU6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gbG9vayBpbiByZWdpc3RlcmVkIGVycm9yIGNvZGVzXG4gICAgY29uc3QgY3VzdG9tRXJyb3JNZXNzYWdlID0gdGhpcy5jdXN0b21FcnJvcnNbZXJyb3JDb2RlXTtcbiAgICBpZiAoY3VzdG9tRXJyb3JNZXNzYWdlKSB7XG4gICAgICByZXR1cm4gY3VzdG9tRXJyb3JNZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQsIHN3aXRjaCBvbiBlcnJvciBjb2RlXG4gICAgc3dpdGNoIChlcnJvckNvZGUpIHtcbiAgICAgIGNhc2UgU2VydmVyRXJyb3JDb2Rlcy5VTkFVVEhPUklaRUQ6XG4gICAgICAgIHJldHVybiAnRVJST1IuVU5BVVRIT1JJWkVEJztcbiAgICAgIGNhc2UgU2VydmVyRXJyb3JDb2Rlcy5GT1JCSURERU46XG4gICAgICAgIHJldHVybiAnRVJST1IuRk9SQklEREVOJztcbiAgICAgIGNhc2UgRXJyb3JDb2Rlcy5VTktOT1dOX05FVFdPUktfRVJST1I6XG4gICAgICAgIHJldHVybiAnRVJST1IuVU5LTk9XTl9ORVRXT1JLX0VSUk9SJztcbiAgICAgIGNhc2UgU2VydmVyRXJyb3JDb2Rlcy5CQURfVVBEQVRFX0RBVEU6XG4gICAgICAgIHJldHVybiAnRVJST1IuQkFEX1VQREFURV9EQVRFJztcbiAgICAgIGNhc2UgU2VydmVyRXJyb3JDb2Rlcy5EQVRBX0xPQ0tFRDpcbiAgICAgICAgcmV0dXJuICdFUlJPUi5EQVRBX0xPQ0tFRCc7XG4gICAgICBjYXNlIFNlcnZlckVycm9yQ29kZXMuQkFEX0FQUF9WRVJTSU9OOlxuICAgICAgICByZXR1cm4gJ0VSUk9SLkJBRF9BUFBfVkVSU0lPTic7XG4gICAgICBjYXNlIFNlcnZlckVycm9yQ29kZXMuREFUQV9OT1RfVU5JUVVFOlxuICAgICAgICByZXR1cm4gJ0VSUk9SLkRBVEFfTk9UX1VOSVFVRSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgdG9BcHBFcnJvcihlcnI6IGFueSk6IGFueSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGVycm9yID0gZXJyO1xuICAgIGxldCBtZXNzYWdlID0gKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgZXJyO1xuICAgIC8vIHBhcnNlIG1lc3NhZ2UgaWYgSlNPTlxuICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgbWVzc2FnZS50cmltKCkuaW5kZXhPZigne1wiY29kZVwiOicpID09PSAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlcnJvciA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgbWVzc2FnZVxuICAgICAgICAgICAgLy8gUmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVycyBiZWZvcmUgcGFyc2luZyAoZS5nLiBTUUwgZXJyb3JzIGZyb20gYW4gT3JhY2xlIGRhdGFiYXNlKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcblxccj8vZywgJyAnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcci9nLCAnJylcbiAgICAgICAgKTtcbiAgICAgICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2UgfHwgbWVzc2FnZTtcbiAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5hYmxlIHRvIHBhcnNlIGVycm9yIGFzIEpTT046ICcsIHBhcnNlRXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3IgJiYgZXJyb3IuY29kZSkge1xuICAgICAgY29uc3QgYXBwRXJyb3IgPSB7XG4gICAgICAgIGNvZGU6IGVycm9yLmNvZGUsXG4gICAgICAgIG1lc3NhZ2U6IHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyA/IG1lc3NhZ2UgOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAuLi50aGlzLmNyZWF0ZUFwcEVycm9yQnlDb2RlKGVycm9yLmNvZGUpLFxuICAgICAgfTtcbiAgICAgIGlmIChhcHBFcnJvci5jb2RlICE9PSBlcnJvci5jb2RlIHx8IGFwcEVycm9yLm1lc3NhZ2UgIT09IGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgLy8gU3RvcmUgb3JpZ2luYWwgZXJyb3IgaW4gZGV0YWlsc1xuICAgICAgICBhcHBFcnJvci5kZXRhaWxzID0gZXJyb3I7XG4gICAgICAgIHJldHVybiBhcHBFcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIEtlZXAgZXJyb3IgKHdpdGggZGV0YWlscywgaWYgYW55KVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
|