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